@alfadocs/ui-kit-debug 1.50.1 → 1.51.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 (513) hide show
  1. package/dist/_chunks/{actions-cell-renderer-DMittsR3.js → actions-cell-renderer-DBI33cMp.js} +4 -4
  2. package/dist/_chunks/{actions-cell-renderer-DMittsR3.js.map → actions-cell-renderer-DBI33cMp.js.map} +1 -1
  3. package/dist/_chunks/{agenda-tray-BhZASyJm.js → agenda-tray-CGhEEnFE.js} +3 -3
  4. package/dist/_chunks/{agenda-tray-BhZASyJm.js.map → agenda-tray-CGhEEnFE.js.map} +1 -1
  5. package/dist/_chunks/{ai-credits-notice-C-kz_RrY.js → ai-credits-notice-C9K_ley1.js} +3 -3
  6. package/dist/_chunks/{ai-credits-notice-C-kz_RrY.js.map → ai-credits-notice-C9K_ley1.js.map} +1 -1
  7. package/dist/_chunks/{ai-permission-notice-BRZeS3mT.js → ai-permission-notice-DMG1o4Qa.js} +2 -2
  8. package/dist/_chunks/{ai-permission-notice-BRZeS3mT.js.map → ai-permission-notice-DMG1o4Qa.js.map} +1 -1
  9. package/dist/_chunks/{ai-prompt-input-CxvnXsAs.js → ai-prompt-input-ucwO-z8g.js} +2 -2
  10. package/dist/_chunks/{ai-prompt-input-CxvnXsAs.js.map → ai-prompt-input-ucwO-z8g.js.map} +1 -1
  11. package/dist/_chunks/{alia-sidebar-Dx-oeOV2.js → alia-sidebar-K3gaNH94.js} +7 -7
  12. package/dist/_chunks/{alia-sidebar-Dx-oeOV2.js.map → alia-sidebar-K3gaNH94.js.map} +1 -1
  13. package/dist/_chunks/{anamnesis-card-D8Si-2GV.js → anamnesis-card-CPjry4ur.js} +2 -2
  14. package/dist/_chunks/{anamnesis-card-D8Si-2GV.js.map → anamnesis-card-CPjry4ur.js.map} +1 -1
  15. package/dist/_chunks/{anamnesis-summary-rows-CZirLRuv.js → anamnesis-summary-rows-D9LZZHLw.js} +9 -9
  16. package/dist/_chunks/{anamnesis-summary-rows-CZirLRuv.js.map → anamnesis-summary-rows-D9LZZHLw.js.map} +1 -1
  17. package/dist/_chunks/{appointment-card-BgLpE6T5.js → appointment-card-DETaIfBb.js} +2 -2
  18. package/dist/_chunks/{appointment-card-BgLpE6T5.js.map → appointment-card-DETaIfBb.js.map} +1 -1
  19. package/dist/_chunks/{appointment-peek-Dk11UOVW.js → appointment-peek-B79v56Zc.js} +4 -4
  20. package/dist/_chunks/{appointment-peek-Dk11UOVW.js.map → appointment-peek-B79v56Zc.js.map} +1 -1
  21. package/dist/_chunks/{appointment-timeline-wQ-PdkFV.js → appointment-timeline-tyJJPgVU.js} +5 -5
  22. package/dist/_chunks/{appointment-timeline-wQ-PdkFV.js.map → appointment-timeline-tyJJPgVU.js.map} +1 -1
  23. package/dist/_chunks/{appointment-tray-D7Gt6m8x.js → appointment-tray-Dq4zto_L.js} +4 -4
  24. package/dist/_chunks/{appointment-tray-D7Gt6m8x.js.map → appointment-tray-Dq4zto_L.js.map} +1 -1
  25. package/dist/_chunks/{audio-recorder-DZBtAvLH.js → audio-recorder-Ddlp5rVg.js} +3 -3
  26. package/dist/_chunks/{audio-recorder-DZBtAvLH.js.map → audio-recorder-Ddlp5rVg.js.map} +1 -1
  27. package/dist/_chunks/{balance-badge-cell-klaxFNL_.js → balance-badge-cell-BCEsdEOe.js} +4 -4
  28. package/dist/_chunks/{balance-badge-cell-klaxFNL_.js.map → balance-badge-cell-BCEsdEOe.js.map} +1 -1
  29. package/dist/_chunks/{bishop-score-BMLRvXYF.js → bishop-score-1NAiZh0K.js} +2 -2
  30. package/dist/_chunks/{bishop-score-BMLRvXYF.js.map → bishop-score-1NAiZh0K.js.map} +1 -1
  31. package/dist/_chunks/{bmi-calculator-DUhRyyrA.js → bmi-calculator-ZzzPZhhI.js} +2 -2
  32. package/dist/_chunks/{bmi-calculator-DUhRyyrA.js.map → bmi-calculator-ZzzPZhhI.js.map} +1 -1
  33. package/dist/_chunks/{booking-Cdzd8kyY.js → booking-DmyX24Ls.js} +5 -5
  34. package/dist/_chunks/{booking-Cdzd8kyY.js.map → booking-DmyX24Ls.js.map} +1 -1
  35. package/dist/_chunks/{button-18oBsI3n.js → button-CYPx2xFq.js} +38 -36
  36. package/dist/_chunks/button-CYPx2xFq.js.map +1 -0
  37. package/dist/_chunks/{button-group-BSDqso_C.js → button-group-t9RrsCS6.js} +3 -3
  38. package/dist/_chunks/{button-group-BSDqso_C.js.map → button-group-t9RrsCS6.js.map} +1 -1
  39. package/dist/_chunks/{calendar-E6Yu4lzC.js → calendar-aqzmITxw.js} +542 -510
  40. package/dist/_chunks/calendar-aqzmITxw.js.map +1 -0
  41. package/dist/_chunks/calendar-workspace-BqoPkCUp.js +10597 -0
  42. package/dist/_chunks/calendar-workspace-BqoPkCUp.js.map +1 -0
  43. package/dist/_chunks/{care-plan-card-ciBaaguw.js → care-plan-card-amX33mMF.js} +2 -2
  44. package/dist/_chunks/{care-plan-card-ciBaaguw.js.map → care-plan-card-amX33mMF.js.map} +1 -1
  45. package/dist/_chunks/{care-plan-entry-card-D7A0whiZ.js → care-plan-entry-card-DNkEucjN.js} +2 -2
  46. package/dist/_chunks/{care-plan-entry-card-D7A0whiZ.js.map → care-plan-entry-card-DNkEucjN.js.map} +1 -1
  47. package/dist/_chunks/{care-plan-header-DKV1gLqv.js → care-plan-header-CJi853Rf.js} +2 -2
  48. package/dist/_chunks/{care-plan-header-DKV1gLqv.js.map → care-plan-header-CJi853Rf.js.map} +1 -1
  49. package/dist/_chunks/{carousel.agent-DqDGR2yH.js → carousel.agent-2EhJsAtl.js} +2 -2
  50. package/dist/_chunks/{carousel.agent-DqDGR2yH.js.map → carousel.agent-2EhJsAtl.js.map} +1 -1
  51. package/dist/_chunks/{chart-VjuXDXOZ.js → chart-B2HnwMP5.js} +3 -3
  52. package/dist/_chunks/{chart-VjuXDXOZ.js.map → chart-B2HnwMP5.js.map} +1 -1
  53. package/dist/_chunks/{chat-input-BVho_SqP.js → chat-input-CHUsUFOD.js} +2 -2
  54. package/dist/_chunks/{chat-input-BVho_SqP.js.map → chat-input-CHUsUFOD.js.map} +1 -1
  55. package/dist/_chunks/{chat-message-B4ihjNy3.js → chat-message-DTcRGhNo.js} +3 -3
  56. package/dist/_chunks/{chat-message-B4ihjNy3.js.map → chat-message-DTcRGhNo.js.map} +1 -1
  57. package/dist/_chunks/{code-block-C_eNHWaa.js → code-block-BrwcZNPq.js} +2 -2
  58. package/dist/_chunks/{code-block-C_eNHWaa.js.map → code-block-BrwcZNPq.js.map} +1 -1
  59. package/dist/_chunks/{connection-status-Cfux3TvH.js → connection-status-DMheLE65.js} +3 -3
  60. package/dist/_chunks/{connection-status-Cfux3TvH.js.map → connection-status-DMheLE65.js.map} +1 -1
  61. package/dist/_chunks/{contact-profile-card-Dj4NgBL-.js → contact-profile-card-zQLGGFKG.js} +2 -2
  62. package/dist/_chunks/{contact-profile-card-Dj4NgBL-.js.map → contact-profile-card-zQLGGFKG.js.map} +1 -1
  63. package/dist/_chunks/{control-room-rail-DAO0qfOI.js → control-room-rail-5iuM3jcm.js} +3 -3
  64. package/dist/_chunks/{control-room-rail-DAO0qfOI.js.map → control-room-rail-5iuM3jcm.js.map} +1 -1
  65. package/dist/_chunks/{copy-field-Cm4y5Bff.js → copy-field-C-KvrgOG.js} +2 -2
  66. package/dist/_chunks/{copy-field-Cm4y5Bff.js.map → copy-field-C-KvrgOG.js.map} +1 -1
  67. package/dist/_chunks/{cycle-calculator-B9lBRNiZ.js → cycle-calculator-DQMCeEzn.js} +2 -2
  68. package/dist/_chunks/{cycle-calculator-B9lBRNiZ.js.map → cycle-calculator-DQMCeEzn.js.map} +1 -1
  69. package/dist/_chunks/{dashboard-grid-uX7x1ePj.js → dashboard-grid-H7uph3HO.js} +2 -2
  70. package/dist/_chunks/{dashboard-grid-uX7x1ePj.js.map → dashboard-grid-H7uph3HO.js.map} +1 -1
  71. package/dist/_chunks/{data-table-CrI3_bjH.js → data-table-C4yPR89K.js} +7 -7
  72. package/dist/_chunks/{data-table-CrI3_bjH.js.map → data-table-C4yPR89K.js.map} +1 -1
  73. package/dist/_chunks/{data-table-tabs-CzYYKp2_.js → data-table-tabs-Dd_O1nPY.js} +3 -3
  74. package/dist/_chunks/{data-table-tabs-CzYYKp2_.js.map → data-table-tabs-Dd_O1nPY.js.map} +1 -1
  75. package/dist/_chunks/{description-list-1A2DEbE6.js → description-list-DOPu69Jg.js} +2 -2
  76. package/dist/_chunks/{description-list-1A2DEbE6.js.map → description-list-DOPu69Jg.js.map} +1 -1
  77. package/dist/_chunks/{document-preview-Od2Hz4z5.js → document-preview-Dzh1YAz8.js} +3 -3
  78. package/dist/_chunks/{document-preview-Od2Hz4z5.js.map → document-preview-Dzh1YAz8.js.map} +1 -1
  79. package/dist/_chunks/{document-scanner-p0aGlzCy.js → document-scanner-BSVwMR4V.js} +2 -2
  80. package/dist/_chunks/{document-scanner-p0aGlzCy.js.map → document-scanner-BSVwMR4V.js.map} +1 -1
  81. package/dist/_chunks/dropdown-menu-DIzxr_lp.js +594 -0
  82. package/dist/_chunks/dropdown-menu-DIzxr_lp.js.map +1 -0
  83. package/dist/_chunks/{due-date-calculator-BVqJaxzd.js → due-date-calculator-DUjw4w5O.js} +2 -2
  84. package/dist/_chunks/{due-date-calculator-BVqJaxzd.js.map → due-date-calculator-DUjw4w5O.js.map} +1 -1
  85. package/dist/_chunks/{editable-currency-cell-renderer-D_G2Ap61.js → editable-currency-cell-renderer-Cch3RIJL.js} +3 -3
  86. package/dist/_chunks/{editable-currency-cell-renderer-D_G2Ap61.js.map → editable-currency-cell-renderer-Cch3RIJL.js.map} +1 -1
  87. package/dist/_chunks/{editable-description-B4NVdjvd.js → editable-description-CRQib91p.js} +3 -3
  88. package/dist/_chunks/{editable-description-B4NVdjvd.js.map → editable-description-CRQib91p.js.map} +1 -1
  89. package/dist/_chunks/{editor-overlay-BDiBvQmL.js → editor-overlay-DsA7vR5C.js} +2 -2
  90. package/dist/_chunks/{editor-overlay-BDiBvQmL.js.map → editor-overlay-DsA7vR5C.js.map} +1 -1
  91. package/dist/_chunks/{empty-state-DTBZ1ENT.js → empty-state-Ck1wVWdN.js} +2 -2
  92. package/dist/_chunks/{empty-state-DTBZ1ENT.js.map → empty-state-Ck1wVWdN.js.map} +1 -1
  93. package/dist/_chunks/{entity-summary-CFJfBdVP.js → entity-summary-Cvs21xPr.js} +3 -3
  94. package/dist/_chunks/{entity-summary-CFJfBdVP.js.map → entity-summary-Cvs21xPr.js.map} +1 -1
  95. package/dist/_chunks/{error-boundary-BxTqEXqj.js → error-boundary-C_HAzVLO.js} +2 -2
  96. package/dist/_chunks/{error-boundary-BxTqEXqj.js.map → error-boundary-C_HAzVLO.js.map} +1 -1
  97. package/dist/_chunks/{face-scheme-fku-RShg.js → face-scheme-DVZZTuXT.js} +5 -5
  98. package/dist/_chunks/{face-scheme-fku-RShg.js.map → face-scheme-DVZZTuXT.js.map} +1 -1
  99. package/dist/_chunks/{fetal-weight-B69yOS9W.js → fetal-weight-B-lO-948.js} +2 -2
  100. package/dist/_chunks/{fetal-weight-B69yOS9W.js.map → fetal-weight-B-lO-948.js.map} +1 -1
  101. package/dist/_chunks/{field-array-lIXrFWS0.js → field-array-B3IDOct8.js} +3 -3
  102. package/dist/_chunks/{field-array-lIXrFWS0.js.map → field-array-B3IDOct8.js.map} +1 -1
  103. package/dist/_chunks/{file-manager-C6QQPQV5.js → file-manager-COUb-w8j.js} +7 -7
  104. package/dist/_chunks/{file-manager-C6QQPQV5.js.map → file-manager-COUb-w8j.js.map} +1 -1
  105. package/dist/_chunks/{finished-terminal-B2oqXO0Y.js → finished-terminal-BrAWwfOw.js} +2 -2
  106. package/dist/_chunks/{finished-terminal-B2oqXO0Y.js.map → finished-terminal-BrAWwfOw.js.map} +1 -1
  107. package/dist/_chunks/{fiscal-code-input-BEF8eKIG.js → fiscal-code-input-CwUwhUZy.js} +2 -2
  108. package/dist/_chunks/{fiscal-code-input-BEF8eKIG.js.map → fiscal-code-input-CwUwhUZy.js.map} +1 -1
  109. package/dist/_chunks/floating-action-button-pojvb9gG.js.map +1 -1
  110. package/dist/_chunks/{freemium-paywall-B6JITu4l.js → freemium-paywall-DiPJrL18.js} +2 -2
  111. package/dist/_chunks/{freemium-paywall-B6JITu4l.js.map → freemium-paywall-DiPJrL18.js.map} +1 -1
  112. package/dist/_chunks/{gestational-age-calculator-DsGN6_HS.js → gestational-age-calculator-BVPtrWKf.js} +2 -2
  113. package/dist/_chunks/{gestational-age-calculator-DsGN6_HS.js.map → gestational-age-calculator-BVPtrWKf.js.map} +1 -1
  114. package/dist/_chunks/{hcg-doubling-D2SH-e7t.js → hcg-doubling-CPktiA3H.js} +2 -2
  115. package/dist/_chunks/{hcg-doubling-D2SH-e7t.js.map → hcg-doubling-CPktiA3H.js.map} +1 -1
  116. package/dist/_chunks/{header-CCjp5GvE.js → header-C8NbLgVq.js} +2 -2
  117. package/dist/_chunks/{header-CCjp5GvE.js.map → header-C8NbLgVq.js.map} +1 -1
  118. package/dist/_chunks/header-settings-D0M3WNTS.js +305 -0
  119. package/dist/_chunks/header-settings-D0M3WNTS.js.map +1 -0
  120. package/dist/_chunks/{help-me-write-templates-DQtT1qs_.js → help-me-write-templates-CYAKuXZ3.js} +5 -5
  121. package/dist/_chunks/{help-me-write-templates-DQtT1qs_.js.map → help-me-write-templates-CYAKuXZ3.js.map} +1 -1
  122. package/dist/_chunks/{hover-card-BplP5SzQ.js → hover-card-BM0vNmq4.js} +2 -2
  123. package/dist/_chunks/{hover-card-BplP5SzQ.js.map → hover-card-BM0vNmq4.js.map} +1 -1
  124. package/dist/_chunks/{icon-button-CY7GU_Se.js → icon-button-JAXAkqWC.js} +2 -2
  125. package/dist/_chunks/icon-button-JAXAkqWC.js.map +1 -0
  126. package/dist/_chunks/{icon-button-group-B_426QN_.js → icon-button-group-ud2BLmxe.js} +3 -3
  127. package/dist/_chunks/{icon-button-group-B_426QN_.js.map → icon-button-group-ud2BLmxe.js.map} +1 -1
  128. package/dist/_chunks/{icon-picker-ZLebyB0U.js → icon-picker-B1PwkUHy.js} +3 -3
  129. package/dist/_chunks/{icon-picker-ZLebyB0U.js.map → icon-picker-B1PwkUHy.js.map} +1 -1
  130. package/dist/_chunks/{image-cropper-_HiNN79d.js → image-cropper-DM6hpXUw.js} +2 -2
  131. package/dist/_chunks/{image-cropper-_HiNN79d.js.map → image-cropper-DM6hpXUw.js.map} +1 -1
  132. package/dist/_chunks/{info-tip-laBxZhKu.js → info-tip-CywkQ1NX.js} +2 -2
  133. package/dist/_chunks/{info-tip-laBxZhKu.js.map → info-tip-CywkQ1NX.js.map} +1 -1
  134. package/dist/_chunks/{insert-result-CSuPQyKL.js → insert-result-Fu9AHxR6.js} +2 -2
  135. package/dist/_chunks/{insert-result-CSuPQyKL.js.map → insert-result-Fu9AHxR6.js.map} +1 -1
  136. package/dist/_chunks/{key-value-pair-Dcdl3Gni.js → key-value-pair-BL1J3_Km.js} +2 -2
  137. package/dist/_chunks/{key-value-pair-Dcdl3Gni.js.map → key-value-pair-BL1J3_Km.js.map} +1 -1
  138. package/dist/_chunks/{kit-extensions-BTJSnM_H.js → kit-extensions-B9Qn6VIc.js} +6 -6
  139. package/dist/_chunks/{kit-extensions-BTJSnM_H.js.map → kit-extensions-B9Qn6VIc.js.map} +1 -1
  140. package/dist/_chunks/{link-cell-renderer-CkNbUsBM.js → link-cell-renderer-BcW3F1j9.js} +2 -2
  141. package/dist/_chunks/{link-cell-renderer-CkNbUsBM.js.map → link-cell-renderer-BcW3F1j9.js.map} +1 -1
  142. package/dist/_chunks/{locale-picker-DGkQmhV9.js → locale-picker-Z42P8T-i.js} +218 -213
  143. package/dist/_chunks/locale-picker-Z42P8T-i.js.map +1 -0
  144. package/dist/_chunks/{map-view-Bb7ClKSF.js → map-view-DxYPJjM9.js} +2 -2
  145. package/dist/_chunks/{map-view-Bb7ClKSF.js.map → map-view-DxYPJjM9.js.map} +1 -1
  146. package/dist/_chunks/{marketplace-app-shell-1uKqs4gD.js → marketplace-app-shell-rTTvWRrE.js} +6 -6
  147. package/dist/_chunks/{marketplace-app-shell-1uKqs4gD.js.map → marketplace-app-shell-rTTvWRrE.js.map} +1 -1
  148. package/dist/_chunks/{message-card-C2zsvyj0.js → message-card-CUBPPn4Z.js} +3 -3
  149. package/dist/_chunks/{message-card-C2zsvyj0.js.map → message-card-CUBPPn4Z.js.map} +1 -1
  150. package/dist/_chunks/{message-tray-CMlmxdH2.js → message-tray-uy3DAIbn.js} +4 -4
  151. package/dist/_chunks/{message-tray-CMlmxdH2.js.map → message-tray-uy3DAIbn.js.map} +1 -1
  152. package/dist/_chunks/{muscle-scheme-Co0NIgbU.js → muscle-scheme-CH-vQ7Ch.js} +2 -2
  153. package/dist/_chunks/{muscle-scheme-Co0NIgbU.js.map → muscle-scheme-CH-vQ7Ch.js.map} +1 -1
  154. package/dist/_chunks/{notes-panel-xxpFt-I1.js → notes-panel-Dka4Z2M7.js} +4 -4
  155. package/dist/_chunks/{notes-panel-xxpFt-I1.js.map → notes-panel-Dka4Z2M7.js.map} +1 -1
  156. package/dist/_chunks/{notification-card-DDzBCi8l.js → notification-card-Hy8w3UWx.js} +3 -3
  157. package/dist/_chunks/{notification-card-DDzBCi8l.js.map → notification-card-Hy8w3UWx.js.map} +1 -1
  158. package/dist/_chunks/{notification-tray-PnH2PBlZ.js → notification-tray-VuV3XXB8.js} +4 -4
  159. package/dist/_chunks/{notification-tray-PnH2PBlZ.js.map → notification-tray-VuV3XXB8.js.map} +1 -1
  160. package/dist/_chunks/{optical-prescription-DUufWXfZ.js → optical-prescription-C2n6d0HO.js} +2 -2
  161. package/dist/_chunks/{optical-prescription-DUufWXfZ.js.map → optical-prescription-C2n6d0HO.js.map} +1 -1
  162. package/dist/_chunks/{panel-subview-CzHutkA8.js → panel-subview-DAY-ToM3.js} +2 -2
  163. package/dist/_chunks/{panel-subview-CzHutkA8.js.map → panel-subview-DAY-ToM3.js.map} +1 -1
  164. package/dist/_chunks/{patient-details-tTlvrJSU.js → patient-details-D9sAM3qh.js} +3 -3
  165. package/dist/_chunks/{patient-details-tTlvrJSU.js.map → patient-details-D9sAM3qh.js.map} +1 -1
  166. package/dist/_chunks/{patient-field-row-DElFbpKc.js → patient-field-row-CT04C_lZ.js} +277 -257
  167. package/dist/_chunks/patient-field-row-CT04C_lZ.js.map +1 -0
  168. package/dist/_chunks/{patient-search-DgXdGkhK.js → patient-search-DkIukAMQ.js} +3 -3
  169. package/dist/_chunks/{patient-search-DgXdGkhK.js.map → patient-search-DkIukAMQ.js.map} +1 -1
  170. package/dist/_chunks/{patient-summary-card-DQ__6DR-.js → patient-summary-card-DI0BH-Fe.js} +5 -5
  171. package/dist/_chunks/{patient-summary-card-DQ__6DR-.js.map → patient-summary-card-DI0BH-Fe.js.map} +1 -1
  172. package/dist/_chunks/{payment-automation-upsell-ugi4np1l.js → payment-automation-upsell-vQBIyUky.js} +2 -2
  173. package/dist/_chunks/{payment-automation-upsell-ugi4np1l.js.map → payment-automation-upsell-vQBIyUky.js.map} +1 -1
  174. package/dist/_chunks/{payment-request-card-DMJB57Tv.js → payment-request-card-BSaJzhxz.js} +3 -3
  175. package/dist/_chunks/{payment-request-card-DMJB57Tv.js.map → payment-request-card-BSaJzhxz.js.map} +1 -1
  176. package/dist/_chunks/{periodontal-chart-DbGzKDj7.js → periodontal-chart-BcTcOc79.js} +2 -2
  177. package/dist/_chunks/{periodontal-chart-DbGzKDj7.js.map → periodontal-chart-BcTcOc79.js.map} +1 -1
  178. package/dist/_chunks/{periodontal-chart-card-DvHyP47v.js → periodontal-chart-card-NS_nToBf.js} +2 -2
  179. package/dist/_chunks/{periodontal-chart-card-DvHyP47v.js.map → periodontal-chart-card-NS_nToBf.js.map} +1 -1
  180. package/dist/_chunks/{popover-Dvb40vPH.js → popover-SASSeAdY.js} +2 -2
  181. package/dist/_chunks/{popover-Dvb40vPH.js.map → popover-SASSeAdY.js.map} +1 -1
  182. package/dist/_chunks/{practice-results-EKRiqWtQ.js → practice-results-C3ifcObw.js} +6 -6
  183. package/dist/_chunks/{practice-results-EKRiqWtQ.js.map → practice-results-C3ifcObw.js.map} +1 -1
  184. package/dist/_chunks/{pregnancy-dating-lfjjZVZH.js → pregnancy-dating-CpJ3iYvD.js} +2 -2
  185. package/dist/_chunks/{pregnancy-dating-lfjjZVZH.js.map → pregnancy-dating-CpJ3iYvD.js.map} +1 -1
  186. package/dist/_chunks/{pregnancy-weight-gain-WpNt-S0q.js → pregnancy-weight-gain-kDOhA2vZ.js} +2 -2
  187. package/dist/_chunks/{pregnancy-weight-gain-WpNt-S0q.js.map → pregnancy-weight-gain-kDOhA2vZ.js.map} +1 -1
  188. package/dist/_chunks/{privacy-lock-D6gq0GDg.js → privacy-lock-CEyvNpC8.js} +3 -3
  189. package/dist/_chunks/{privacy-lock-D6gq0GDg.js.map → privacy-lock-CEyvNpC8.js.map} +1 -1
  190. package/dist/_chunks/{privacy-mask-BC5lw2zB.js → privacy-mask-TzMlEu3Q.js} +2 -2
  191. package/dist/_chunks/{privacy-mask-BC5lw2zB.js.map → privacy-mask-TzMlEu3Q.js.map} +1 -1
  192. package/dist/_chunks/{product-hub-panel-CKeSCSeE.js → product-hub-panel-b70i9Hi1.js} +3 -3
  193. package/dist/_chunks/{product-hub-panel-CKeSCSeE.js.map → product-hub-panel-b70i9Hi1.js.map} +1 -1
  194. package/dist/_chunks/{public-header.agent-B9wDmUeB.js → public-header.agent-D0ApOrmx.js} +3 -3
  195. package/dist/_chunks/{public-header.agent-B9wDmUeB.js.map → public-header.agent-D0ApOrmx.js.map} +1 -1
  196. package/dist/_chunks/{radiograph-panel.agent-TmyIvTOa.js → radiograph-panel.agent-jhwaIW8U.js} +4 -4
  197. package/dist/_chunks/{radiograph-panel.agent-TmyIvTOa.js.map → radiograph-panel.agent-jhwaIW8U.js.map} +1 -1
  198. package/dist/_chunks/resource-chip-DQeCJzJf.js +143 -0
  199. package/dist/_chunks/resource-chip-DQeCJzJf.js.map +1 -0
  200. package/dist/_chunks/{reviews-panel-BdwFp_0c.js → reviews-panel-B5QC4FIp.js} +4 -4
  201. package/dist/_chunks/{reviews-panel-BdwFp_0c.js.map → reviews-panel-B5QC4FIp.js.map} +1 -1
  202. package/dist/_chunks/{rich-text-editor-y6ML0KeV.js → rich-text-editor-DoBXdwmx.js} +930 -943
  203. package/dist/_chunks/rich-text-editor-DoBXdwmx.js.map +1 -0
  204. package/dist/_chunks/{session-countdown-ACJyTXH2.js → session-countdown-26XB5u38.js} +2 -2
  205. package/dist/_chunks/{session-countdown-ACJyTXH2.js.map → session-countdown-26XB5u38.js.map} +1 -1
  206. package/dist/_chunks/{sheet-D0Lh0KR2.js → sheet-CwhNzxbr.js} +2 -2
  207. package/dist/_chunks/{sheet-D0Lh0KR2.js.map → sheet-CwhNzxbr.js.map} +1 -1
  208. package/dist/_chunks/{sign-in-with-alfadocs-button-CDyJAIzW.js → sign-in-with-alfadocs-button-jxbze77L.js} +2 -2
  209. package/dist/_chunks/{sign-in-with-alfadocs-button-CDyJAIzW.js.map → sign-in-with-alfadocs-button-jxbze77L.js.map} +1 -1
  210. package/dist/_chunks/{signature-request-BUGeG8oD.js → signature-request-BorHf3CY.js} +4 -4
  211. package/dist/_chunks/{signature-request-BUGeG8oD.js.map → signature-request-BorHf3CY.js.map} +1 -1
  212. package/dist/_chunks/{slot-grid-4fWH3Euk.js → slot-grid-xgf2UKLS.js} +4 -4
  213. package/dist/_chunks/{slot-grid-4fWH3Euk.js.map → slot-grid-xgf2UKLS.js.map} +1 -1
  214. package/dist/_chunks/social-sign-in-button-dlpPI5l7.js.map +1 -1
  215. package/dist/_chunks/{streaming-text-eRiizArc.js → streaming-text-Cos2fVTw.js} +2 -2
  216. package/dist/_chunks/{streaming-text-eRiizArc.js.map → streaming-text-Cos2fVTw.js.map} +1 -1
  217. package/dist/_chunks/{tab-bar-BHFf6knq.js → tab-bar-BrkMUW0c.js} +2 -2
  218. package/dist/_chunks/{tab-bar-BHFf6knq.js.map → tab-bar-BrkMUW0c.js.map} +1 -1
  219. package/dist/_chunks/tabs-tK22Mz7r.js +413 -0
  220. package/dist/_chunks/tabs-tK22Mz7r.js.map +1 -0
  221. package/dist/_chunks/{task-card-jaOhnj_q.js → task-card-CLpHmqEY.js} +2 -2
  222. package/dist/_chunks/{task-card-jaOhnj_q.js.map → task-card-CLpHmqEY.js.map} +1 -1
  223. package/dist/_chunks/{task-editor-DlvTwAfv.js → task-editor-B4UGsU7l.js} +6 -6
  224. package/dist/_chunks/{task-editor-DlvTwAfv.js.map → task-editor-B4UGsU7l.js.map} +1 -1
  225. package/dist/_chunks/{task-tray-HHyxi9ga.js → task-tray-dsmYgjVb.js} +4 -4
  226. package/dist/_chunks/{task-tray-HHyxi9ga.js.map → task-tray-dsmYgjVb.js.map} +1 -1
  227. package/dist/_chunks/{tasks-panel-DbSjq_mz.js → tasks-panel-CwwVw491.js} +6 -6
  228. package/dist/_chunks/{tasks-panel-DbSjq_mz.js.map → tasks-panel-CwwVw491.js.map} +1 -1
  229. package/dist/_chunks/{theme-toggle-LUBxlNDm.js → theme-toggle-jyoyhbJL.js} +4 -4
  230. package/dist/_chunks/{theme-toggle-LUBxlNDm.js.map → theme-toggle-jyoyhbJL.js.map} +1 -1
  231. package/dist/_chunks/{toast-CT8hjr9r.js → toast-FijDyPnv.js} +2 -2
  232. package/dist/_chunks/{toast-CT8hjr9r.js.map → toast-FijDyPnv.js.map} +1 -1
  233. package/dist/_chunks/{token-insert-menu-klwbxVKh.js → token-insert-menu-Cjf99IdN.js} +3 -3
  234. package/dist/_chunks/{token-insert-menu-klwbxVKh.js.map → token-insert-menu-Cjf99IdN.js.map} +1 -1
  235. package/dist/_chunks/{tool-rail-DEeX4PdN.js → tool-rail-DphMl1hX.js} +2 -2
  236. package/dist/_chunks/{tool-rail-DEeX4PdN.js.map → tool-rail-DphMl1hX.js.map} +1 -1
  237. package/dist/_chunks/{tooth-scheme-BkjhkI8g.js → tooth-scheme-BaCJnyg9.js} +663 -718
  238. package/dist/_chunks/tooth-scheme-BaCJnyg9.js.map +1 -0
  239. package/dist/_chunks/{unit-converter-Dp_KDxE6.js → unit-converter-CGpOgarU.js} +2 -2
  240. package/dist/_chunks/{unit-converter-Dp_KDxE6.js.map → unit-converter-CGpOgarU.js.map} +1 -1
  241. package/dist/_chunks/{use-appointment-details-read-5-hV-2xA.js → use-appointment-details-read-uEnJLVfA.js} +14 -14
  242. package/dist/_chunks/{use-appointment-details-read-5-hV-2xA.js.map → use-appointment-details-read-uEnJLVfA.js.map} +1 -1
  243. package/dist/_chunks/wallet-pay-button--dnR6NfJ.js.map +1 -1
  244. package/dist/_chunks/{warning-stack-CEgYkI1z.js → warning-stack-7Hffm7K1.js} +3 -3
  245. package/dist/_chunks/{warning-stack-CEgYkI1z.js.map → warning-stack-7Hffm7K1.js.map} +1 -1
  246. package/dist/_chunks/{workflow-map-qGkQTNvS.js → workflow-map-Jfe9L9Wt.js} +6 -6
  247. package/dist/_chunks/{workflow-map-qGkQTNvS.js.map → workflow-map-Jfe9L9Wt.js.map} +1 -1
  248. package/dist/_chunks/{workflow-status-ClHfz4Kr.js → workflow-status-jHfsIDzi.js} +2 -2
  249. package/dist/_chunks/{workflow-status-ClHfz4Kr.js.map → workflow-status-jHfsIDzi.js.map} +1 -1
  250. package/dist/agent-catalog.json +103 -38
  251. package/dist/agent-i18n/en.json +7 -4
  252. package/dist/components/_shared/entity-card/entity-card.d.ts +1 -1
  253. package/dist/components/_shared/field-visibility-cog.d.ts.map +1 -1
  254. package/dist/components/agenda-tray/index.js +1 -1
  255. package/dist/components/ai-credits-notice/index.js +1 -1
  256. package/dist/components/ai-permission-notice/index.js +1 -1
  257. package/dist/components/ai-prompt-input/index.js +1 -1
  258. package/dist/components/anamnesis-card/index.js +1 -1
  259. package/dist/components/anamnesis-summary-card/anamnesis-summary-card.d.ts +1 -1
  260. package/dist/components/appointment-card/index.js +2 -2
  261. package/dist/components/appointment-details-panel/index.js +1 -1
  262. package/dist/components/appointment-peek/index.js +1 -1
  263. package/dist/components/appointment-timeline/index.js +1 -1
  264. package/dist/components/audio-recorder/index.js +1 -1
  265. package/dist/components/bishop-score/index.js +1 -1
  266. package/dist/components/bmi-calculator/index.js +1 -1
  267. package/dist/components/booking/index.js +1 -1
  268. package/dist/components/button/button.d.ts +11 -0
  269. package/dist/components/button/button.d.ts.map +1 -1
  270. package/dist/components/button/icon-button.d.ts +4 -0
  271. package/dist/components/button/icon-button.d.ts.map +1 -1
  272. package/dist/components/button/index.js +2 -2
  273. package/dist/components/button-group/index.js +1 -1
  274. package/dist/components/calendar/calendar.d.ts +5 -3
  275. package/dist/components/calendar/calendar.d.ts.map +1 -1
  276. package/dist/components/calendar/index.js +1 -1
  277. package/dist/components/care-plan-card/index.js +1 -1
  278. package/dist/components/care-plan-entry-card/index.js +1 -1
  279. package/dist/components/care-plan-header/index.js +1 -1
  280. package/dist/components/carousel/index.js +1 -1
  281. package/dist/components/chart/chart.d.ts +1 -1
  282. package/dist/components/chart/index.js +1 -1
  283. package/dist/components/chat-input/index.js +1 -1
  284. package/dist/components/chat-message/index.js +1 -1
  285. package/dist/components/connection-status/index.js +1 -1
  286. package/dist/components/contact-profile-card/index.js +1 -1
  287. package/dist/components/control-room-rail/index.js +1 -1
  288. package/dist/components/copy-field/index.js +1 -1
  289. package/dist/components/cycle-calculator/index.js +1 -1
  290. package/dist/components/dashboard-grid/index.js +1 -1
  291. package/dist/components/data-table/index.js +4 -4
  292. package/dist/components/data-table-tabs/index.js +1 -1
  293. package/dist/components/description-list/index.js +1 -1
  294. package/dist/components/document-preview/index.js +1 -1
  295. package/dist/components/document-scanner/index.js +1 -1
  296. package/dist/components/dropdown-menu/dropdown-menu.agent.d.ts.map +1 -1
  297. package/dist/components/dropdown-menu/dropdown-menu.d.ts +52 -2
  298. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
  299. package/dist/components/dropdown-menu/index.d.ts +1 -1
  300. package/dist/components/dropdown-menu/index.d.ts.map +1 -1
  301. package/dist/components/dropdown-menu/index.js +1 -1
  302. package/dist/components/due-date-calculator/index.js +1 -1
  303. package/dist/components/editable-description/index.js +1 -1
  304. package/dist/components/editor-overlay/index.js +1 -1
  305. package/dist/components/empty-state/index.js +1 -1
  306. package/dist/components/entity-summary/index.js +1 -1
  307. package/dist/components/error-boundary/index.js +1 -1
  308. package/dist/components/face-scheme/index.js +1 -1
  309. package/dist/components/fetal-weight/index.js +1 -1
  310. package/dist/components/field-array/index.js +1 -1
  311. package/dist/components/file-manager/index.js +1 -1
  312. package/dist/components/finished-terminal/index.js +1 -1
  313. package/dist/components/fiscal-code-input/index.js +1 -1
  314. package/dist/components/floating-action-button/floating-action-button.d.ts.map +1 -1
  315. package/dist/components/freemium-paywall/index.js +1 -1
  316. package/dist/components/gestational-age-calculator/index.js +1 -1
  317. package/dist/components/hcg-doubling/index.js +1 -1
  318. package/dist/components/header/index.js +1 -1
  319. package/dist/components/header-settings/header-settings.d.ts +3 -3
  320. package/dist/components/header-settings/header-settings.d.ts.map +1 -1
  321. package/dist/components/header-settings/index.js +1 -1
  322. package/dist/components/hover-card/index.js +1 -1
  323. package/dist/components/icon-button/index.js +1 -1
  324. package/dist/components/icon-button-group/index.js +1 -1
  325. package/dist/components/icon-picker/index.js +1 -1
  326. package/dist/components/image-cropper/index.js +1 -1
  327. package/dist/components/info-tip/index.js +1 -1
  328. package/dist/components/key-value-pair/index.js +1 -1
  329. package/dist/components/locale-picker/index.js +1 -1
  330. package/dist/components/locale-picker/locale-picker.d.ts +7 -0
  331. package/dist/components/locale-picker/locale-picker.d.ts.map +1 -1
  332. package/dist/components/map-view/index.js +1 -1
  333. package/dist/components/message-card/index.js +1 -1
  334. package/dist/components/message-tray/index.js +1 -1
  335. package/dist/components/muscle-scheme/index.js +1 -1
  336. package/dist/components/notes-panel/index.js +1 -1
  337. package/dist/components/notification-card/index.js +1 -1
  338. package/dist/components/notification-tray/index.js +1 -1
  339. package/dist/components/operator-hero/operator-hero.d.ts +1 -1
  340. package/dist/components/optical-prescription/index.js +1 -1
  341. package/dist/components/panel-subview/index.js +1 -1
  342. package/dist/components/patient-details/index.js +1 -1
  343. package/dist/components/patient-details/patient-details.d.ts +1 -1
  344. package/dist/components/patient-search/index.js +1 -1
  345. package/dist/components/patient-summary-card/index.js +1 -1
  346. package/dist/components/patient-summary-card/patient-summary-card.d.ts +1 -1
  347. package/dist/components/patient-table/index.js +1 -1
  348. package/dist/components/payment-card/index.js +1 -1
  349. package/dist/components/periodontal-chart/index.js +1 -1
  350. package/dist/components/periodontal-chart-card/index.js +1 -1
  351. package/dist/components/popover/index.js +1 -1
  352. package/dist/components/practice-results/index.js +1 -1
  353. package/dist/components/pregnancy-dating/index.js +1 -1
  354. package/dist/components/pregnancy-weight-gain/index.js +1 -1
  355. package/dist/components/privacy-lock/index.js +1 -1
  356. package/dist/components/product-hub-tray/index.js +1 -1
  357. package/dist/components/public-header/index.js +1 -1
  358. package/dist/components/radiograph-panel/index.js +1 -1
  359. package/dist/components/resource-chip/index.d.ts +1 -1
  360. package/dist/components/resource-chip/index.d.ts.map +1 -1
  361. package/dist/components/resource-chip/index.js +3 -2
  362. package/dist/components/resource-chip/resource-chip.d.ts +20 -0
  363. package/dist/components/resource-chip/resource-chip.d.ts.map +1 -1
  364. package/dist/components/reviews-panel/index.js +1 -1
  365. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  366. package/dist/components/rich-text-editor/index.js +2 -2
  367. package/dist/components/session-countdown/index.js +1 -1
  368. package/dist/components/sheet/index.js +1 -1
  369. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  370. package/dist/components/skeleton-scheme/index.js +1 -1
  371. package/dist/components/slot-grid/index.js +1 -1
  372. package/dist/components/social-sign-in-button/social-sign-in-button.d.ts.map +1 -1
  373. package/dist/components/streaming-text/index.js +1 -1
  374. package/dist/components/tab-bar/index.js +1 -1
  375. package/dist/components/tabs/index.js +1 -1
  376. package/dist/components/tabs/tabs.d.ts.map +1 -1
  377. package/dist/components/task-card/index.js +1 -1
  378. package/dist/components/task-editor/index.js +1 -1
  379. package/dist/components/task-tray/index.js +1 -1
  380. package/dist/components/tasks-panel/index.js +1 -1
  381. package/dist/components/theme-toggle/index.js +1 -1
  382. package/dist/components/toast/index.js +1 -1
  383. package/dist/components/token-insert-menu/index.js +1 -1
  384. package/dist/components/tool-rail/index.js +1 -1
  385. package/dist/components/tooth-scheme/index.js +1 -1
  386. package/dist/components/tooth-scheme/tooth-scheme.d.ts +2 -2
  387. package/dist/components/tooth-scheme/tooth-scheme.d.ts.map +1 -1
  388. package/dist/components/unit-converter/index.js +1 -1
  389. package/dist/components/wallet-pay-button/wallet-pay-button.d.ts.map +1 -1
  390. package/dist/components/warning-stack/index.js +1 -1
  391. package/dist/components/workflow/index.js +1 -1
  392. package/dist/components/workflow/workflow-card.d.ts +1 -1
  393. package/dist/components/workflow-status/index.js +1 -1
  394. package/dist/i18n/locales/ar.d.ts +5 -0
  395. package/dist/i18n/locales/ar.d.ts.map +1 -1
  396. package/dist/i18n/locales/ar.js +5 -0
  397. package/dist/i18n/locales/ar.js.map +1 -1
  398. package/dist/i18n/locales/de.d.ts +5 -0
  399. package/dist/i18n/locales/de.d.ts.map +1 -1
  400. package/dist/i18n/locales/de.js +5 -0
  401. package/dist/i18n/locales/de.js.map +1 -1
  402. package/dist/i18n/locales/el.d.ts +5 -0
  403. package/dist/i18n/locales/el.d.ts.map +1 -1
  404. package/dist/i18n/locales/el.js +5 -0
  405. package/dist/i18n/locales/el.js.map +1 -1
  406. package/dist/i18n/locales/en.d.ts +5 -0
  407. package/dist/i18n/locales/en.d.ts.map +1 -1
  408. package/dist/i18n/locales/en.js +5 -0
  409. package/dist/i18n/locales/en.js.map +1 -1
  410. package/dist/i18n/locales/es.d.ts +5 -0
  411. package/dist/i18n/locales/es.d.ts.map +1 -1
  412. package/dist/i18n/locales/es.js +5 -0
  413. package/dist/i18n/locales/es.js.map +1 -1
  414. package/dist/i18n/locales/fr.d.ts +5 -0
  415. package/dist/i18n/locales/fr.d.ts.map +1 -1
  416. package/dist/i18n/locales/fr.js +5 -0
  417. package/dist/i18n/locales/fr.js.map +1 -1
  418. package/dist/i18n/locales/hi.d.ts +5 -0
  419. package/dist/i18n/locales/hi.d.ts.map +1 -1
  420. package/dist/i18n/locales/hi.js +5 -0
  421. package/dist/i18n/locales/hi.js.map +1 -1
  422. package/dist/i18n/locales/it.d.ts +5 -0
  423. package/dist/i18n/locales/it.d.ts.map +1 -1
  424. package/dist/i18n/locales/it.js +5 -0
  425. package/dist/i18n/locales/it.js.map +1 -1
  426. package/dist/i18n/locales/ja.d.ts +5 -0
  427. package/dist/i18n/locales/ja.d.ts.map +1 -1
  428. package/dist/i18n/locales/ja.js +5 -0
  429. package/dist/i18n/locales/ja.js.map +1 -1
  430. package/dist/i18n/locales/nl.d.ts +5 -0
  431. package/dist/i18n/locales/nl.d.ts.map +1 -1
  432. package/dist/i18n/locales/nl.js +5 -0
  433. package/dist/i18n/locales/nl.js.map +1 -1
  434. package/dist/i18n/locales/pl.d.ts +5 -0
  435. package/dist/i18n/locales/pl.d.ts.map +1 -1
  436. package/dist/i18n/locales/pl.js +5 -0
  437. package/dist/i18n/locales/pl.js.map +1 -1
  438. package/dist/i18n/locales/pt.d.ts +5 -0
  439. package/dist/i18n/locales/pt.d.ts.map +1 -1
  440. package/dist/i18n/locales/pt.js +5 -0
  441. package/dist/i18n/locales/pt.js.map +1 -1
  442. package/dist/i18n/locales/ro.d.ts +5 -0
  443. package/dist/i18n/locales/ro.d.ts.map +1 -1
  444. package/dist/i18n/locales/ro.js +5 -0
  445. package/dist/i18n/locales/ro.js.map +1 -1
  446. package/dist/i18n/locales/ru.d.ts +5 -0
  447. package/dist/i18n/locales/ru.d.ts.map +1 -1
  448. package/dist/i18n/locales/ru.js +5 -0
  449. package/dist/i18n/locales/ru.js.map +1 -1
  450. package/dist/i18n/locales/sq.d.ts +5 -0
  451. package/dist/i18n/locales/sq.d.ts.map +1 -1
  452. package/dist/i18n/locales/sq.js +5 -0
  453. package/dist/i18n/locales/sq.js.map +1 -1
  454. package/dist/i18n/locales/sv.d.ts +5 -0
  455. package/dist/i18n/locales/sv.d.ts.map +1 -1
  456. package/dist/i18n/locales/sv.js +5 -0
  457. package/dist/i18n/locales/sv.js.map +1 -1
  458. package/dist/i18n/locales/tr.d.ts +5 -0
  459. package/dist/i18n/locales/tr.d.ts.map +1 -1
  460. package/dist/i18n/locales/tr.js +5 -0
  461. package/dist/i18n/locales/tr.js.map +1 -1
  462. package/dist/i18n/locales/zh.d.ts +5 -0
  463. package/dist/i18n/locales/zh.d.ts.map +1 -1
  464. package/dist/i18n/locales/zh.js +5 -0
  465. package/dist/i18n/locales/zh.js.map +1 -1
  466. package/dist/index.js +477 -476
  467. package/dist/locales/ar.json +5 -0
  468. package/dist/locales/de.json +5 -0
  469. package/dist/locales/el.json +5 -0
  470. package/dist/locales/en.json +5 -0
  471. package/dist/locales/es.json +5 -0
  472. package/dist/locales/fr.json +5 -0
  473. package/dist/locales/hi.json +5 -0
  474. package/dist/locales/it.json +5 -0
  475. package/dist/locales/ja.json +5 -0
  476. package/dist/locales/nl.json +5 -0
  477. package/dist/locales/pl.json +5 -0
  478. package/dist/locales/pt.json +5 -0
  479. package/dist/locales/ro.json +5 -0
  480. package/dist/locales/ru.json +5 -0
  481. package/dist/locales/sq.json +5 -0
  482. package/dist/locales/sv.json +5 -0
  483. package/dist/locales/tr.json +5 -0
  484. package/dist/locales/zh.json +5 -0
  485. package/dist/patterns/alia-assistant/index.js +1 -1
  486. package/dist/patterns/anamnesis/index.js +1 -1
  487. package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
  488. package/dist/patterns/calendar/calendar.surface.d.ts +4 -1
  489. package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
  490. package/dist/patterns/calendar/index.js +1 -1
  491. package/dist/patterns/help-me-write-templates/index.js +1 -1
  492. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  493. package/dist/patterns/payment-automation-upsell/index.js +1 -1
  494. package/dist/patterns/signature-request/index.js +1 -1
  495. package/dist/tokens.css +2 -1
  496. package/package.json +1 -1
  497. package/dist/_chunks/button-18oBsI3n.js.map +0 -1
  498. package/dist/_chunks/calendar-E6Yu4lzC.js.map +0 -1
  499. package/dist/_chunks/calendar-workspace-DjbGFjg1.js +0 -10584
  500. package/dist/_chunks/calendar-workspace-DjbGFjg1.js.map +0 -1
  501. package/dist/_chunks/dropdown-menu-C8PaW3lR.js +0 -369
  502. package/dist/_chunks/dropdown-menu-C8PaW3lR.js.map +0 -1
  503. package/dist/_chunks/header-settings-ZXa6hXuu.js +0 -335
  504. package/dist/_chunks/header-settings-ZXa6hXuu.js.map +0 -1
  505. package/dist/_chunks/icon-button-CY7GU_Se.js.map +0 -1
  506. package/dist/_chunks/locale-picker-DGkQmhV9.js.map +0 -1
  507. package/dist/_chunks/patient-field-row-DElFbpKc.js.map +0 -1
  508. package/dist/_chunks/resource-chip-DYTG0IQQ.js +0 -83
  509. package/dist/_chunks/resource-chip-DYTG0IQQ.js.map +0 -1
  510. package/dist/_chunks/rich-text-editor-y6ML0KeV.js.map +0 -1
  511. package/dist/_chunks/tabs-CFsuMQ5H.js +0 -409
  512. package/dist/_chunks/tabs-CFsuMQ5H.js.map +0 -1
  513. package/dist/_chunks/tooth-scheme-BkjhkI8g.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"editable-currency-cell-renderer-D_G2Ap61.js","sources":["../../src/components/data-table/hooks/use-total-row.ts","../../src/components/data-table/cell-renderers/tooth-cell-renderer.tsx","../../src/components/data-table/cell-renderers/currency-cell-renderer.tsx","../../src/components/data-table/cell-renderers/reorder-cell-renderer.tsx","../../src/components/data-table/cell-renderers/toggle-cell-renderer.tsx","../../src/components/data-table/cell-renderers/color-dot-cell-renderer.tsx","../../src/components/data-table/cell-renderers/balance-cell-renderer.tsx","../../src/components/data-table/cell-renderers/editable-text-cell-renderer.tsx","../../src/components/data-table/cell-renderers/editable-currency-cell-renderer.tsx"],"sourcesContent":["import { useMemo } from 'react';\n\n/**\n * Compute a pinned total row from a dataset and a list of numeric fields.\n *\n * The returned object is structurally a `TData` with non-summed fields left\n * `undefined` — plug it into `pinnedBottomRowData={[totalRow]}`. Cell renderers\n * in the non-summed columns receive `undefined`, so they should render nothing\n * (all of the DS cell renderers short-circuit on `null`/`undefined`).\n *\n * Pass an optional `labelField` + `labelValue` to show a static caption such\n * as \"Total\" in the first column of the pinned row.\n */\nexport function useTotalRow<TData>(\n rowData: TData[] | undefined,\n sumFields: Array<keyof TData & string>,\n options?: {\n labelField?: keyof TData & string;\n labelValue?: string;\n },\n): TData {\n return useMemo(() => {\n const row: Record<string, unknown> = {};\n\n for (const field of sumFields) {\n let total = 0;\n for (const r of rowData ?? []) {\n const raw = (r as Record<string, unknown>)[field];\n const n = typeof raw === 'number' ? raw : Number(raw);\n if (Number.isFinite(n)) total += n;\n }\n row[field] = total;\n }\n\n if (options?.labelField && options.labelValue !== undefined) {\n row[options.labelField] = options.labelValue;\n }\n\n return row as TData;\n }, [rowData, sumFields, options?.labelField, options?.labelValue]);\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { Tag } from '../../tag/tag';\n\n// Tooth glyph — lucide ships no dental icon, so this is a small inline tooth\n// (a crown narrowing to two roots) tinted with `currentColor`, so it inherits\n// the Tag's text colour. Decorative; the FDI numbers are the accessible label.\nfunction ToothIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-3.5\"\n >\n <path d=\"M12 5.5c-1.074 -1.426 -2.45 -2.2 -4 -2c-2.5 .323 -3.7 2.5 -3.5 5c.1 1.5 .5 3 .5 4.5c0 1.5 .5 3.5 1 5c.3 .9 .5 2 1.5 2s1.3 -1.5 1.5 -2.5c.2 -1 .5 -2 1.5 -2s1.3 1 1.5 2c.2 1 .5 2.5 1.5 2.5s1.2 -1.1 1.5 -2c.5 -1.5 1 -3.5 1 -5c0 -1.5 .4 -3 .5 -4.5c.2 -2.5 -1 -4.677 -3.5 -5c-1.55 -.2 -2.926 .574 -4 2z\" />\n </svg>\n );\n}\n\nexport interface ToothCellRendererParams {\n /** Max inline size of the chip before its label truncates (with a tooltip). */\n maxInlineSize?: string;\n}\n\n/**\n * Renders an array of tooth ids (FDI notation) as a single outlined Tag — the\n * teeth comma-separated and prefixed with a tooth glyph, so dentition reads at\n * a glance instead of as bare numbers.\n */\nexport function ToothCellRenderer(\n props: CustomCellRendererProps<unknown, string[]> & ToothCellRendererParams,\n) {\n const { value, maxInlineSize = '8rem' } = props;\n if (!Array.isArray(value) || value.length === 0) return null;\n\n return (\n <Tag\n label={value.join(', ')}\n size=\"sm\"\n fill=\"outline\"\n leading={<ToothIcon />}\n maxInlineSize={maxInlineSize}\n />\n );\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\n\nexport interface CurrencyCellRendererParams {\n /** ISO 4217 currency code. Default `'EUR'`. */\n currency?: string;\n /** Apply a destructive color token to negative amounts. */\n colorNegative?: boolean;\n /** Render the value with strikethrough — used for written-off balances. */\n strikethrough?: boolean;\n /** `Intl.NumberFormat` escape hatch. Merged on top of currency defaults. */\n options?: Intl.NumberFormatOptions;\n}\n\nfunction toNumber(value: unknown): number | null {\n if (value == null || value === '') return null;\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\nexport function CurrencyCellRenderer(\n props: CustomCellRendererProps & CurrencyCellRendererParams,\n) {\n const {\n value,\n currency = 'EUR',\n colorNegative,\n strikethrough,\n options,\n } = props;\n const { i18n } = useTranslation();\n const n = toNumber(value);\n if (n === null) return null;\n\n const locale = i18n.language || 'en';\n const formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...options,\n }).format(n);\n\n const classNames = ['ds:tabular-nums'];\n if (colorNegative && n < 0)\n classNames.push('ds:text-[color:var(--destructive)]');\n if (strikethrough) classNames.push('line-through');\n\n return <span className={classNames.join(' ')}>{formatted}</span>;\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport { ArrowUp, ArrowDown } from 'lucide-react';\nimport { IconButton } from '../../button/icon-button';\nimport { IconButtonGroup } from '../../icon-button-group';\n\n/**\n * Keyboard-accessible row-reorder cell. AG Grid's native row dragging is\n * mouse/touch only; this renderer adds move-up / move-down buttons so the order\n * is reachable by keyboard too (the missing accessible half of the\n * \"drag-sortable column\" primitive). The consumer owns `rowData` order and\n * reorders it in `onMove` — the same controlled contract as the editable cells.\n */\nexport interface ReorderCellRendererParams<TData = unknown> {\n /** Move the row one step in the given direction (consumer reorders rowData). */\n onMove: (data: TData, direction: 'up' | 'down') => void;\n /** Accessible name for the move-up button (defaults to a kit string). */\n moveUpLabel?: string;\n /** Accessible name for the move-down button (defaults to a kit string). */\n moveDownLabel?: string;\n /** Button intent (default `ghost`). */\n intent?: 'ghost' | 'outline';\n /** Render the two buttons as a connected `IconButtonGroup` (default true). */\n group?: boolean;\n /**\n * Disable move-up on the first displayed row and move-down on the last\n * (default true). Turn off when the grid is filtered/sorted and the ends are\n * not meaningful.\n */\n disableAtEnds?: boolean;\n}\n\n/**\n * Pixel width a reorder column needs for the two `sm` IconButtons (32px each)\n * plus the data-table cell's inline padding so the controls never clip. Mirrors\n * {@link actionsColumnWidth}.\n */\nexport function reorderColumnWidth(): number {\n const SM_BUTTON = 32;\n const CELL_INSET = 26;\n return SM_BUTTON * 2 + CELL_INSET;\n}\n\nexport function ReorderCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ReorderCellRendererParams<TData>,\n) {\n const {\n data,\n node,\n api,\n onMove,\n moveUpLabel,\n moveDownLabel,\n intent = 'ghost',\n group = true,\n disableAtEnds = true,\n } = props;\n const { t } = useTranslation();\n if (!data) return null;\n\n const rowIndex = node.rowIndex ?? -1;\n const lastIndex = api.getDisplayedRowCount() - 1;\n const atFirst = disableAtEnds && rowIndex <= 0;\n const atLast = disableAtEnds && rowIndex >= lastIndex;\n\n const upLabel = moveUpLabel ?? t('dataTable.moveUp', 'Move up');\n const downLabel = moveDownLabel ?? t('dataTable.moveDown', 'Move down');\n\n // An ARRAY of IconButtons (not a Fragment): IconButtonGroup inspects its\n // direct children and rejects anything that isn't a DS IconButton.\n const buttons = [\n <IconButton\n key=\"up\"\n size=\"sm\"\n intent={intent}\n icon={<ArrowUp aria-hidden className=\"ds:size-4\" />}\n tooltip={upLabel}\n aria-label={upLabel}\n disabled={atFirst}\n onClick={(event) => {\n event.stopPropagation();\n onMove(data, 'up');\n }}\n />,\n <IconButton\n key=\"down\"\n size=\"sm\"\n intent={intent}\n icon={<ArrowDown aria-hidden className=\"ds:size-4\" />}\n tooltip={downLabel}\n aria-label={downLabel}\n disabled={atLast}\n onClick={(event) => {\n event.stopPropagation();\n onMove(data, 'down');\n }}\n />,\n ];\n\n return group ? (\n <IconButtonGroup\n aria-label={t('dataTable.reorder', 'Reorder row')}\n size=\"sm\"\n >\n {buttons}\n </IconButtonGroup>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {buttons}\n </span>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { SquareCheckBig, Square } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\n\nexport interface ToggleCellRendererParams<TData = unknown> {\n /**\n * Fires with the row and the new target value. May return a `Promise` —\n * if it rejects, the consumer is expected to revert the underlying value\n * and flash the row with `data-table-row-error` (return that row class\n * from `getRowClass`). Use `onError` below to be notified inside this\n * renderer.\n */\n onToggle: (data: TData, newValue: boolean) => void | Promise<void>;\n /**\n * Optional reject hook. Fires when the `onToggle` promise rejects, with\n * the row and the error. The button auto-disables during the in-flight\n * promise and re-enables on either settle.\n */\n onError?: (data: TData, error: unknown) => void;\n /** Icon shown when the current value is truthy. */\n trueIcon?: ReactNode;\n /** Icon shown when the current value is falsy. */\n falseIcon?: ReactNode;\n /** Extra classes applied to the \"on\" icon — defaults to success token. */\n trueClass?: string;\n /** Extra classes applied to the \"off\" icon. */\n falseClass?: string;\n /** Accessible label. Falls back to the default on/off announcements. */\n label?: string;\n}\n\nexport function ToggleCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData, boolean> &\n ToggleCellRendererParams<TData>,\n) {\n const {\n value,\n data,\n onToggle,\n onError,\n trueIcon,\n falseIcon,\n trueClass = 'ds:text-[color:var(--success)]',\n falseClass = 'ds:text-[color:var(--muted-foreground)]',\n label,\n } = props;\n const { t } = useTranslation();\n const [pending, setPending] = useState(false);\n if (!data) return null;\n\n const isOn = Boolean(value);\n const icon = isOn\n ? (trueIcon ?? <SquareCheckBig aria-hidden className=\"ds:size-4\" />)\n : (falseIcon ?? <Square aria-hidden className=\"ds:size-4\" />);\n const stateClass = isOn ? trueClass : falseClass;\n const resolvedLabel =\n label ?? (isOn ? t('inputs.switch.on') : t('inputs.switch.off'));\n\n async function handleClick(event: React.MouseEvent) {\n event.stopPropagation();\n if (pending || !data) return;\n const next = !isOn;\n const result = onToggle(data, next);\n if (result && typeof (result as Promise<void>).then === 'function') {\n setPending(true);\n try {\n await result;\n } catch (err) {\n onError?.(data, err);\n } finally {\n setPending(false);\n }\n }\n }\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n aria-busy={pending}\n aria-label={resolvedLabel}\n disabled={pending}\n onClick={handleClick}\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:appearance-none ds:bg-transparent ds:p-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-50',\n stateClass,\n ].join(' ')}\n >\n {icon}\n </button>\n );\n}\n","import { useRef } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useIsomorphicLayoutEffect } from '../../../hooks/use-isomorphic-layout-effect';\n\nexport interface ColorDotCellRendererParams {\n /** Field name on the row whose value holds the hex color. */\n colorField: string;\n /** Visual size of the dot. */\n size?: 'sm' | 'md' | 'lg';\n /** Optional label shown next to the dot. */\n labelField?: string;\n}\n\nconst SIZE_CLASS: Record<\n NonNullable<ColorDotCellRendererParams['size']>,\n string\n> = {\n sm: 'ds:size-[var(--icon-size-sm)]',\n md: 'ds:size-[var(--icon-size-md)]',\n lg: 'ds:size-[var(--icon-size-lg)]',\n};\n\nfunction readField(row: unknown, field: string): string | undefined {\n if (!row || typeof row !== 'object') return undefined;\n const value = (row as Record<string, unknown>)[field];\n return typeof value === 'string' ? value : undefined;\n}\n\n// Only accept trusted CSS color forms. Anything outside this allow-list\n// (including smuggled `url()` or extra declarations) is dropped so the\n// CSS custom-property writer can't be used to inject styles.\nconst HEX_RE = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst RGB_RE = /^rgba?\\(\\s*[\\d.\\s,%/]+\\)$/i;\nconst HSL_RE = /^hsla?\\(\\s*[\\d.\\s,%/]+\\)$/i;\nconst CSS_VAR_RE = /^var\\(--[a-z0-9-]+(?:,\\s*[^)]+)?\\)$/i;\n\nfunction sanitizeColor(raw: string | undefined): string | undefined {\n if (!raw) return undefined;\n const v = raw.trim();\n if (\n HEX_RE.test(v) ||\n RGB_RE.test(v) ||\n HSL_RE.test(v) ||\n CSS_VAR_RE.test(v)\n ) {\n return v;\n }\n return undefined;\n}\n\nexport function ColorDotCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ColorDotCellRendererParams,\n) {\n const { data, colorField, size = 'md', labelField } = props;\n const dotRef = useRef<HTMLSpanElement | null>(null);\n const rawColor = data ? readField(data, colorField) : undefined;\n const color = sanitizeColor(rawColor);\n const label = data && labelField ? readField(data, labelField) : undefined;\n\n // Apply the dynamic color via a CSS custom property on the element.\n // Keeps hex/rgb literals out of JSX (constraint #2 and #4). The data\n // itself drives the color — constraints only forbid hardcoded colors\n // in component source, not in consumer row data.\n useIsomorphicLayoutEffect(() => {\n const el = dotRef.current;\n if (!el) return;\n if (color) {\n el.style.setProperty('--data-table-dot-color', color);\n } else {\n el.style.removeProperty('--data-table-dot-color');\n }\n }, [color]);\n\n if (!color) return null;\n\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n ref={dotRef}\n aria-hidden=\"true\"\n className={[\n 'ds:inline-block ds:shrink-0 ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--data-table-dot-color)]',\n 'ds:border ds:border-[color:var(--border)]',\n SIZE_CLASS[size],\n ].join(' ')}\n />\n {label ? <span>{label}</span> : null}\n </span>\n );\n}\n","import type { ColDef } from 'ag-grid-community';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\n\nexport interface BalanceLine {\n /** User-visible label for this line. */\n label: string;\n /** Field name on the row whose numeric value is rendered. */\n valueField: string;\n /** `'currency'` renders via Intl, `'percent'` appends `%`, `'number'` raw. Default `'number'`. */\n format?: 'currency' | 'percent' | 'number';\n}\n\nexport interface BalanceCellRendererParams {\n lines: BalanceLine[];\n /** ISO 4217 code, used by `currency`-formatted lines. Default `'EUR'`. */\n currency?: string;\n /** Apply destructive color to negative values. */\n highlightNegative?: boolean;\n}\n\nfunction readNumber(row: unknown, field: string): number | null {\n if (!row || typeof row !== 'object') return null;\n const raw = (row as Record<string, unknown>)[field];\n const n = typeof raw === 'number' ? raw : Number(raw);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * Renders a compact set of label / value pairs inside a single AG Grid cell.\n *\n * Layout is **horizontal** with middle-dot separators so the cell fits\n * inside the default AG Grid row height without spilling into the row\n * below. Use the SALDI / Listini patterns (Totale · Incassato · Da Incassare)\n * as the canonical example.\n *\n * If a consumer's content wraps (long localized labels, narrow columns)\n * they can opt into row auto-growth by spreading\n * {@link balanceCellRendererColDefDefaults} onto the column definition.\n */\nexport function BalanceCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & BalanceCellRendererParams,\n) {\n const { data, lines, currency = 'EUR', highlightNegative } = props;\n const { i18n } = useTranslation();\n if (!data) return null;\n\n const locale = i18n.language || 'en';\n\n const formatLine = (\n line: BalanceLine,\n ): { label: string; formatted: string; negative: boolean } | null => {\n const n = readNumber(data, line.valueField);\n if (n === null) return null;\n\n let formatted: string;\n switch (line.format ?? 'number') {\n case 'currency':\n formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(n);\n break;\n case 'percent':\n formatted = new Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 1,\n }).format(n / 100);\n break;\n default:\n formatted = new Intl.NumberFormat(locale).format(n);\n }\n\n return {\n label: line.label,\n formatted,\n negative: Boolean(highlightNegative) && n < 0,\n };\n };\n\n const rendered = lines\n .map(formatLine)\n .filter(\n (x): x is { label: string; formatted: string; negative: boolean } =>\n x !== null,\n );\n if (rendered.length === 0) return null;\n\n return (\n <div\n className={[\n 'ds:flex',\n 'ds:flex-wrap',\n 'ds:items-center',\n 'ds:gap-x-[var(--spacing-sm)]',\n 'ds:gap-y-0',\n 'type-meta',\n 'ds:leading-tight',\n ].join(' ')}\n >\n {rendered.map((item, idx) => (\n <span\n key={`${item.label}-${idx}`}\n className=\"ds:inline-flex ds:items-baseline ds:gap-x-[var(--spacing-xs)]\"\n >\n {idx > 0 ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:me-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\"\n >\n ·\n </span>\n ) : null}\n <span className=\"ds:text-[color:var(--muted-foreground)]\">\n {item.label}\n </span>\n <span\n className={[\n 'ds:tabular-nums',\n 'ds:font-medium',\n item.negative ? 'ds:text-[color:var(--destructive)]' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {item.formatted}\n </span>\n </span>\n ))}\n </div>\n );\n}\n\n/**\n * Column-definition defaults consumers can spread onto a `ColDef` when they\n * want the renderer's wrapped / multi-line behaviour to grow the row.\n *\n * The default compact horizontal layout is engineered to fit the standard\n * AG Grid row height, so this opt-in is only needed when a long label set\n * wraps across two or more lines and the consumer would rather grow the\n * row than wrap silently.\n *\n * AG Grid does NOT auto-grow row height to fit a tall cell unless\n * `autoHeight` and `wrapText` are set on the colDef itself — a cell\n * renderer can't impose that from inside.\n *\n * @example\n * ```ts\n * {\n * headerName: 'Saldi',\n * cellRenderer: BalanceCellRenderer,\n * cellRendererParams: { lines, currency: 'EUR' },\n * ...balanceCellRendererColDefDefaults,\n * }\n * ```\n */\nexport const balanceCellRendererColDefDefaults: Readonly<\n Pick<ColDef, 'autoHeight' | 'wrapText'>\n> = {\n autoHeight: true,\n wrapText: true,\n};\n","import { useEffect, useRef, useState } from 'react';\nimport type { CustomCellEditorProps } from 'ag-grid-react';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_PADDING_X,\n INPUT_SURFACE_TEXT,\n} from '../../_shared/input-surface';\n\n/**\n * Inline text editor that visually matches `<TextInput size=\"sm\">`. Use as\n * `cellEditor` on a colDef with `editable: true`. The cell renderer (default\n * or custom) takes over again once editing stops.\n *\n * AG Grid commits on Enter or Tab or blur; cancels on Escape. The consumer\n * receives the committed value via `onCellValueChanged`.\n */\nexport function EditableTextCellRenderer<TData = unknown>(\n props: CustomCellEditorProps<TData, string>,\n) {\n const { initialValue, onValueChange, stopEditing, column } = props;\n const [value, setValue] = useState<string>(initialValue ?? '');\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Focus + select on mount so typing replaces the current value.\n useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n el.focus();\n el.select();\n }, []);\n\n // The current value is pushed to AG Grid via `onValueChange` on every\n // keystroke — AG Grid commits the most recent value when editing stops.\n // No `useGridCellEditor` hook needed for that contract.\n\n // Thread the column header into the input's accessible name so screen\n // readers announce \"Edit text, {column}\" instead of an unlabelled input.\n // AG Grid doesn't auto-wire the column header to cell editors.\n const headerName =\n (column?.getColDef?.()?.headerName as string | undefined) ?? undefined;\n\n return (\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n aria-label={headerName}\n onChange={(e) => {\n const next = e.target.value;\n setValue(next);\n onValueChange(next);\n }}\n onKeyDown={(e) => {\n // Escape cancels, Enter/Tab commit — AG Grid handles both, but we\n // explicitly stop editing on Enter so the consumer sees the commit\n // immediately rather than waiting for the next focus blur.\n if (e.key === 'Enter') {\n e.preventDefault();\n stopEditing();\n }\n }}\n className={[\n 'ds:block ds:w-full ds:appearance-none',\n // Input surface chrome: rounded border + bg + focus halo.\n INPUT_SURFACE_CHROME,\n // Use the `md` height (`--min-target-size`) so the input\n // auto-lifts to 48px under `.theme-accessible` to satisfy\n // WCAG 2.5.5 target size.\n INPUT_SURFACE_HEIGHT.md,\n INPUT_SURFACE_TEXT.sm,\n INPUT_SURFACE_PADDING_X.sm,\n ].join(' ')}\n />\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CustomCellEditorProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_PADDING_X,\n INPUT_SURFACE_TEXT,\n} from '../../_shared/input-surface';\n\nexport interface EditableCurrencyCellEditorParams {\n /** ISO 4217 currency code (e.g. `EUR`, `USD`). Defaults to `EUR`. */\n currency?: string;\n /** Decimal places allowed in the editor. Defaults to 2 (cents precision). */\n decimals?: number;\n /** Minimum allowed value — values below this are clamped on commit. */\n min?: number;\n /** Maximum allowed value — values above this are clamped on commit. */\n max?: number;\n}\n\n/**\n * Inline numeric editor that visually matches `<TextInput size=\"sm\">`. Use as\n * `cellEditor` on a colDef with `editable: true`. The display formatting is\n * still the renderer's job — once editing stops, the cell hands back to\n * `CurrencyCellRenderer` (or whichever renderer the colDef declares).\n *\n * Stores a Number, not a string, so consumers receive `row.amount = 12.5`\n * not `\"12.5\"`. Strips locale separators on each change so commas/dots in\n * any language convert to a clean numeric value.\n */\nexport function EditableCurrencyCellRenderer<TData = unknown>(\n props: CustomCellEditorProps<TData, number> &\n EditableCurrencyCellEditorParams,\n) {\n const {\n initialValue,\n onValueChange,\n stopEditing,\n column,\n decimals = 2,\n min,\n max,\n } = props;\n const { i18n } = useTranslation();\n const inputRef = useRef<HTMLInputElement | null>(null);\n // Thread the column header into the input's accessible name — see\n // editable-text-cell-renderer.tsx for the rationale.\n const headerName =\n (column?.getColDef?.()?.headerName as string | undefined) ?? undefined;\n\n // Local string state so the user can type intermediate values like \"12.\"\n // before the trailing zero arrives. We commit a Number to AG Grid on each\n // change for consumers that watch row state live; the final commit fires\n // when editing stops.\n const [draft, setDraft] = useState<string>(() => {\n if (initialValue == null || Number.isNaN(initialValue)) return '';\n return String(initialValue);\n });\n\n useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n el.focus();\n el.select();\n }, []);\n\n function parseDraft(input: string): number | null {\n if (input.trim().length === 0) return null;\n // Accept either the user's locale decimal separator or a `.`. Strip\n // grouping characters (locale thousands separators, plus spaces).\n const lang = i18n.language || 'en';\n const partsFmt = new Intl.NumberFormat(lang).formatToParts(12345.6);\n const groupChar = partsFmt.find((p) => p.type === 'group')?.value ?? '';\n const decimalChar =\n partsFmt.find((p) => p.type === 'decimal')?.value ?? '.';\n const cleaned = input\n .replace(new RegExp(`\\\\${groupChar}`, 'g'), '')\n .replace(decimalChar, '.')\n .replace(/[^\\d.-]/g, '');\n const n = Number(cleaned);\n return Number.isFinite(n) ? n : null;\n }\n\n function commit(input: string) {\n const parsed = parseDraft(input);\n if (parsed == null) {\n onValueChange(null);\n return;\n }\n // Clamp first, then round to the declared precision so we never\n // persist floating-point dust from string parsing.\n let clamped = parsed;\n if (typeof min === 'number') clamped = Math.max(min, clamped);\n if (typeof max === 'number') clamped = Math.min(max, clamped);\n const factor = 10 ** decimals;\n onValueChange(Math.round(clamped * factor) / factor);\n }\n\n return (\n <input\n ref={inputRef}\n type=\"text\"\n // Inputmode hints mobile keyboards to show the decimal pad instead\n // of the full keyboard. type=\"number\" would also work but spinners\n // and locale parsing are inconsistent across browsers.\n inputMode=\"decimal\"\n value={draft}\n aria-label={headerName}\n onChange={(e) => {\n const next = e.target.value;\n setDraft(next);\n commit(next);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n stopEditing();\n }\n // Escape — AG Grid cancels by default; the editor doesn't need\n // explicit handling beyond what AG Grid wires automatically.\n }}\n className={[\n 'ds:block ds:w-full ds:appearance-none ds:text-end ds:tabular-nums',\n INPUT_SURFACE_CHROME,\n // Use `md` height — see editable-text-cell-renderer for rationale.\n INPUT_SURFACE_HEIGHT.md,\n INPUT_SURFACE_TEXT.sm,\n INPUT_SURFACE_PADDING_X.sm,\n ].join(' ')}\n />\n );\n}\n"],"names":["useTotalRow","rowData","sumFields","options","useMemo","row","field","total","r","raw","n","ToothIcon","jsx","ToothCellRenderer","props","value","maxInlineSize","Tag","toNumber","CurrencyCellRenderer","currency","colorNegative","strikethrough","i18n","useTranslation","locale","formatted","classNames","reorderColumnWidth","ReorderCellRenderer","data","node","api","onMove","moveUpLabel","moveDownLabel","intent","group","disableAtEnds","t","rowIndex","lastIndex","atFirst","atLast","upLabel","downLabel","buttons","IconButton","ArrowUp","event","ArrowDown","IconButtonGroup","ToggleCellRenderer","onToggle","onError","trueIcon","falseIcon","trueClass","falseClass","label","pending","setPending","useState","isOn","icon","SquareCheckBig","Square","stateClass","resolvedLabel","handleClick","result","err","SIZE_CLASS","readField","HEX_RE","RGB_RE","HSL_RE","CSS_VAR_RE","sanitizeColor","v","ColorDotCellRenderer","colorField","size","labelField","dotRef","useRef","rawColor","color","useIsomorphicLayoutEffect","el","jsxs","readNumber","BalanceCellRenderer","lines","highlightNegative","formatLine","line","rendered","x","item","idx","EditableTextCellRenderer","initialValue","onValueChange","stopEditing","column","setValue","inputRef","useEffect","headerName","_b","_a","e","next","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TEXT","INPUT_SURFACE_PADDING_X","EditableCurrencyCellRenderer","decimals","min","max","draft","setDraft","parseDraft","input","lang","partsFmt","groupChar","p","decimalChar","cleaned","commit","parsed","clamped","factor"],"mappings":"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"}
1
+ {"version":3,"file":"editable-currency-cell-renderer-Cch3RIJL.js","sources":["../../src/components/data-table/hooks/use-total-row.ts","../../src/components/data-table/cell-renderers/tooth-cell-renderer.tsx","../../src/components/data-table/cell-renderers/currency-cell-renderer.tsx","../../src/components/data-table/cell-renderers/reorder-cell-renderer.tsx","../../src/components/data-table/cell-renderers/toggle-cell-renderer.tsx","../../src/components/data-table/cell-renderers/color-dot-cell-renderer.tsx","../../src/components/data-table/cell-renderers/balance-cell-renderer.tsx","../../src/components/data-table/cell-renderers/editable-text-cell-renderer.tsx","../../src/components/data-table/cell-renderers/editable-currency-cell-renderer.tsx"],"sourcesContent":["import { useMemo } from 'react';\n\n/**\n * Compute a pinned total row from a dataset and a list of numeric fields.\n *\n * The returned object is structurally a `TData` with non-summed fields left\n * `undefined` — plug it into `pinnedBottomRowData={[totalRow]}`. Cell renderers\n * in the non-summed columns receive `undefined`, so they should render nothing\n * (all of the DS cell renderers short-circuit on `null`/`undefined`).\n *\n * Pass an optional `labelField` + `labelValue` to show a static caption such\n * as \"Total\" in the first column of the pinned row.\n */\nexport function useTotalRow<TData>(\n rowData: TData[] | undefined,\n sumFields: Array<keyof TData & string>,\n options?: {\n labelField?: keyof TData & string;\n labelValue?: string;\n },\n): TData {\n return useMemo(() => {\n const row: Record<string, unknown> = {};\n\n for (const field of sumFields) {\n let total = 0;\n for (const r of rowData ?? []) {\n const raw = (r as Record<string, unknown>)[field];\n const n = typeof raw === 'number' ? raw : Number(raw);\n if (Number.isFinite(n)) total += n;\n }\n row[field] = total;\n }\n\n if (options?.labelField && options.labelValue !== undefined) {\n row[options.labelField] = options.labelValue;\n }\n\n return row as TData;\n }, [rowData, sumFields, options?.labelField, options?.labelValue]);\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { Tag } from '../../tag/tag';\n\n// Tooth glyph — lucide ships no dental icon, so this is a small inline tooth\n// (a crown narrowing to two roots) tinted with `currentColor`, so it inherits\n// the Tag's text colour. Decorative; the FDI numbers are the accessible label.\nfunction ToothIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-3.5\"\n >\n <path d=\"M12 5.5c-1.074 -1.426 -2.45 -2.2 -4 -2c-2.5 .323 -3.7 2.5 -3.5 5c.1 1.5 .5 3 .5 4.5c0 1.5 .5 3.5 1 5c.3 .9 .5 2 1.5 2s1.3 -1.5 1.5 -2.5c.2 -1 .5 -2 1.5 -2s1.3 1 1.5 2c.2 1 .5 2.5 1.5 2.5s1.2 -1.1 1.5 -2c.5 -1.5 1 -3.5 1 -5c0 -1.5 .4 -3 .5 -4.5c.2 -2.5 -1 -4.677 -3.5 -5c-1.55 -.2 -2.926 .574 -4 2z\" />\n </svg>\n );\n}\n\nexport interface ToothCellRendererParams {\n /** Max inline size of the chip before its label truncates (with a tooltip). */\n maxInlineSize?: string;\n}\n\n/**\n * Renders an array of tooth ids (FDI notation) as a single outlined Tag — the\n * teeth comma-separated and prefixed with a tooth glyph, so dentition reads at\n * a glance instead of as bare numbers.\n */\nexport function ToothCellRenderer(\n props: CustomCellRendererProps<unknown, string[]> & ToothCellRendererParams,\n) {\n const { value, maxInlineSize = '8rem' } = props;\n if (!Array.isArray(value) || value.length === 0) return null;\n\n return (\n <Tag\n label={value.join(', ')}\n size=\"sm\"\n fill=\"outline\"\n leading={<ToothIcon />}\n maxInlineSize={maxInlineSize}\n />\n );\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\n\nexport interface CurrencyCellRendererParams {\n /** ISO 4217 currency code. Default `'EUR'`. */\n currency?: string;\n /** Apply a destructive color token to negative amounts. */\n colorNegative?: boolean;\n /** Render the value with strikethrough — used for written-off balances. */\n strikethrough?: boolean;\n /** `Intl.NumberFormat` escape hatch. Merged on top of currency defaults. */\n options?: Intl.NumberFormatOptions;\n}\n\nfunction toNumber(value: unknown): number | null {\n if (value == null || value === '') return null;\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\nexport function CurrencyCellRenderer(\n props: CustomCellRendererProps & CurrencyCellRendererParams,\n) {\n const {\n value,\n currency = 'EUR',\n colorNegative,\n strikethrough,\n options,\n } = props;\n const { i18n } = useTranslation();\n const n = toNumber(value);\n if (n === null) return null;\n\n const locale = i18n.language || 'en';\n const formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...options,\n }).format(n);\n\n const classNames = ['ds:tabular-nums'];\n if (colorNegative && n < 0)\n classNames.push('ds:text-[color:var(--destructive)]');\n if (strikethrough) classNames.push('line-through');\n\n return <span className={classNames.join(' ')}>{formatted}</span>;\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport { ArrowUp, ArrowDown } from 'lucide-react';\nimport { IconButton } from '../../button/icon-button';\nimport { IconButtonGroup } from '../../icon-button-group';\n\n/**\n * Keyboard-accessible row-reorder cell. AG Grid's native row dragging is\n * mouse/touch only; this renderer adds move-up / move-down buttons so the order\n * is reachable by keyboard too (the missing accessible half of the\n * \"drag-sortable column\" primitive). The consumer owns `rowData` order and\n * reorders it in `onMove` — the same controlled contract as the editable cells.\n */\nexport interface ReorderCellRendererParams<TData = unknown> {\n /** Move the row one step in the given direction (consumer reorders rowData). */\n onMove: (data: TData, direction: 'up' | 'down') => void;\n /** Accessible name for the move-up button (defaults to a kit string). */\n moveUpLabel?: string;\n /** Accessible name for the move-down button (defaults to a kit string). */\n moveDownLabel?: string;\n /** Button intent (default `ghost`). */\n intent?: 'ghost' | 'outline';\n /** Render the two buttons as a connected `IconButtonGroup` (default true). */\n group?: boolean;\n /**\n * Disable move-up on the first displayed row and move-down on the last\n * (default true). Turn off when the grid is filtered/sorted and the ends are\n * not meaningful.\n */\n disableAtEnds?: boolean;\n}\n\n/**\n * Pixel width a reorder column needs for the two `sm` IconButtons (32px each)\n * plus the data-table cell's inline padding so the controls never clip. Mirrors\n * {@link actionsColumnWidth}.\n */\nexport function reorderColumnWidth(): number {\n const SM_BUTTON = 32;\n const CELL_INSET = 26;\n return SM_BUTTON * 2 + CELL_INSET;\n}\n\nexport function ReorderCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ReorderCellRendererParams<TData>,\n) {\n const {\n data,\n node,\n api,\n onMove,\n moveUpLabel,\n moveDownLabel,\n intent = 'ghost',\n group = true,\n disableAtEnds = true,\n } = props;\n const { t } = useTranslation();\n if (!data) return null;\n\n const rowIndex = node.rowIndex ?? -1;\n const lastIndex = api.getDisplayedRowCount() - 1;\n const atFirst = disableAtEnds && rowIndex <= 0;\n const atLast = disableAtEnds && rowIndex >= lastIndex;\n\n const upLabel = moveUpLabel ?? t('dataTable.moveUp', 'Move up');\n const downLabel = moveDownLabel ?? t('dataTable.moveDown', 'Move down');\n\n // An ARRAY of IconButtons (not a Fragment): IconButtonGroup inspects its\n // direct children and rejects anything that isn't a DS IconButton.\n const buttons = [\n <IconButton\n key=\"up\"\n size=\"sm\"\n intent={intent}\n icon={<ArrowUp aria-hidden className=\"ds:size-4\" />}\n tooltip={upLabel}\n aria-label={upLabel}\n disabled={atFirst}\n onClick={(event) => {\n event.stopPropagation();\n onMove(data, 'up');\n }}\n />,\n <IconButton\n key=\"down\"\n size=\"sm\"\n intent={intent}\n icon={<ArrowDown aria-hidden className=\"ds:size-4\" />}\n tooltip={downLabel}\n aria-label={downLabel}\n disabled={atLast}\n onClick={(event) => {\n event.stopPropagation();\n onMove(data, 'down');\n }}\n />,\n ];\n\n return group ? (\n <IconButtonGroup\n aria-label={t('dataTable.reorder', 'Reorder row')}\n size=\"sm\"\n >\n {buttons}\n </IconButtonGroup>\n ) : (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {buttons}\n </span>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { SquareCheckBig, Square } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\n\nexport interface ToggleCellRendererParams<TData = unknown> {\n /**\n * Fires with the row and the new target value. May return a `Promise` —\n * if it rejects, the consumer is expected to revert the underlying value\n * and flash the row with `data-table-row-error` (return that row class\n * from `getRowClass`). Use `onError` below to be notified inside this\n * renderer.\n */\n onToggle: (data: TData, newValue: boolean) => void | Promise<void>;\n /**\n * Optional reject hook. Fires when the `onToggle` promise rejects, with\n * the row and the error. The button auto-disables during the in-flight\n * promise and re-enables on either settle.\n */\n onError?: (data: TData, error: unknown) => void;\n /** Icon shown when the current value is truthy. */\n trueIcon?: ReactNode;\n /** Icon shown when the current value is falsy. */\n falseIcon?: ReactNode;\n /** Extra classes applied to the \"on\" icon — defaults to success token. */\n trueClass?: string;\n /** Extra classes applied to the \"off\" icon. */\n falseClass?: string;\n /** Accessible label. Falls back to the default on/off announcements. */\n label?: string;\n}\n\nexport function ToggleCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData, boolean> &\n ToggleCellRendererParams<TData>,\n) {\n const {\n value,\n data,\n onToggle,\n onError,\n trueIcon,\n falseIcon,\n trueClass = 'ds:text-[color:var(--success)]',\n falseClass = 'ds:text-[color:var(--muted-foreground)]',\n label,\n } = props;\n const { t } = useTranslation();\n const [pending, setPending] = useState(false);\n if (!data) return null;\n\n const isOn = Boolean(value);\n const icon = isOn\n ? (trueIcon ?? <SquareCheckBig aria-hidden className=\"ds:size-4\" />)\n : (falseIcon ?? <Square aria-hidden className=\"ds:size-4\" />);\n const stateClass = isOn ? trueClass : falseClass;\n const resolvedLabel =\n label ?? (isOn ? t('inputs.switch.on') : t('inputs.switch.off'));\n\n async function handleClick(event: React.MouseEvent) {\n event.stopPropagation();\n if (pending || !data) return;\n const next = !isOn;\n const result = onToggle(data, next);\n if (result && typeof (result as Promise<void>).then === 'function') {\n setPending(true);\n try {\n await result;\n } catch (err) {\n onError?.(data, err);\n } finally {\n setPending(false);\n }\n }\n }\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n aria-busy={pending}\n aria-label={resolvedLabel}\n disabled={pending}\n onClick={handleClick}\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:appearance-none ds:bg-transparent ds:p-[var(--spacing-xs)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-50',\n stateClass,\n ].join(' ')}\n >\n {icon}\n </button>\n );\n}\n","import { useRef } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useIsomorphicLayoutEffect } from '../../../hooks/use-isomorphic-layout-effect';\n\nexport interface ColorDotCellRendererParams {\n /** Field name on the row whose value holds the hex color. */\n colorField: string;\n /** Visual size of the dot. */\n size?: 'sm' | 'md' | 'lg';\n /** Optional label shown next to the dot. */\n labelField?: string;\n}\n\nconst SIZE_CLASS: Record<\n NonNullable<ColorDotCellRendererParams['size']>,\n string\n> = {\n sm: 'ds:size-[var(--icon-size-sm)]',\n md: 'ds:size-[var(--icon-size-md)]',\n lg: 'ds:size-[var(--icon-size-lg)]',\n};\n\nfunction readField(row: unknown, field: string): string | undefined {\n if (!row || typeof row !== 'object') return undefined;\n const value = (row as Record<string, unknown>)[field];\n return typeof value === 'string' ? value : undefined;\n}\n\n// Only accept trusted CSS color forms. Anything outside this allow-list\n// (including smuggled `url()` or extra declarations) is dropped so the\n// CSS custom-property writer can't be used to inject styles.\nconst HEX_RE = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst RGB_RE = /^rgba?\\(\\s*[\\d.\\s,%/]+\\)$/i;\nconst HSL_RE = /^hsla?\\(\\s*[\\d.\\s,%/]+\\)$/i;\nconst CSS_VAR_RE = /^var\\(--[a-z0-9-]+(?:,\\s*[^)]+)?\\)$/i;\n\nfunction sanitizeColor(raw: string | undefined): string | undefined {\n if (!raw) return undefined;\n const v = raw.trim();\n if (\n HEX_RE.test(v) ||\n RGB_RE.test(v) ||\n HSL_RE.test(v) ||\n CSS_VAR_RE.test(v)\n ) {\n return v;\n }\n return undefined;\n}\n\nexport function ColorDotCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ColorDotCellRendererParams,\n) {\n const { data, colorField, size = 'md', labelField } = props;\n const dotRef = useRef<HTMLSpanElement | null>(null);\n const rawColor = data ? readField(data, colorField) : undefined;\n const color = sanitizeColor(rawColor);\n const label = data && labelField ? readField(data, labelField) : undefined;\n\n // Apply the dynamic color via a CSS custom property on the element.\n // Keeps hex/rgb literals out of JSX (constraint #2 and #4). The data\n // itself drives the color — constraints only forbid hardcoded colors\n // in component source, not in consumer row data.\n useIsomorphicLayoutEffect(() => {\n const el = dotRef.current;\n if (!el) return;\n if (color) {\n el.style.setProperty('--data-table-dot-color', color);\n } else {\n el.style.removeProperty('--data-table-dot-color');\n }\n }, [color]);\n\n if (!color) return null;\n\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n ref={dotRef}\n aria-hidden=\"true\"\n className={[\n 'ds:inline-block ds:shrink-0 ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--data-table-dot-color)]',\n 'ds:border ds:border-[color:var(--border)]',\n SIZE_CLASS[size],\n ].join(' ')}\n />\n {label ? <span>{label}</span> : null}\n </span>\n );\n}\n","import type { ColDef } from 'ag-grid-community';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\n\nexport interface BalanceLine {\n /** User-visible label for this line. */\n label: string;\n /** Field name on the row whose numeric value is rendered. */\n valueField: string;\n /** `'currency'` renders via Intl, `'percent'` appends `%`, `'number'` raw. Default `'number'`. */\n format?: 'currency' | 'percent' | 'number';\n}\n\nexport interface BalanceCellRendererParams {\n lines: BalanceLine[];\n /** ISO 4217 code, used by `currency`-formatted lines. Default `'EUR'`. */\n currency?: string;\n /** Apply destructive color to negative values. */\n highlightNegative?: boolean;\n}\n\nfunction readNumber(row: unknown, field: string): number | null {\n if (!row || typeof row !== 'object') return null;\n const raw = (row as Record<string, unknown>)[field];\n const n = typeof raw === 'number' ? raw : Number(raw);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * Renders a compact set of label / value pairs inside a single AG Grid cell.\n *\n * Layout is **horizontal** with middle-dot separators so the cell fits\n * inside the default AG Grid row height without spilling into the row\n * below. Use the SALDI / Listini patterns (Totale · Incassato · Da Incassare)\n * as the canonical example.\n *\n * If a consumer's content wraps (long localized labels, narrow columns)\n * they can opt into row auto-growth by spreading\n * {@link balanceCellRendererColDefDefaults} onto the column definition.\n */\nexport function BalanceCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & BalanceCellRendererParams,\n) {\n const { data, lines, currency = 'EUR', highlightNegative } = props;\n const { i18n } = useTranslation();\n if (!data) return null;\n\n const locale = i18n.language || 'en';\n\n const formatLine = (\n line: BalanceLine,\n ): { label: string; formatted: string; negative: boolean } | null => {\n const n = readNumber(data, line.valueField);\n if (n === null) return null;\n\n let formatted: string;\n switch (line.format ?? 'number') {\n case 'currency':\n formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(n);\n break;\n case 'percent':\n formatted = new Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 1,\n }).format(n / 100);\n break;\n default:\n formatted = new Intl.NumberFormat(locale).format(n);\n }\n\n return {\n label: line.label,\n formatted,\n negative: Boolean(highlightNegative) && n < 0,\n };\n };\n\n const rendered = lines\n .map(formatLine)\n .filter(\n (x): x is { label: string; formatted: string; negative: boolean } =>\n x !== null,\n );\n if (rendered.length === 0) return null;\n\n return (\n <div\n className={[\n 'ds:flex',\n 'ds:flex-wrap',\n 'ds:items-center',\n 'ds:gap-x-[var(--spacing-sm)]',\n 'ds:gap-y-0',\n 'type-meta',\n 'ds:leading-tight',\n ].join(' ')}\n >\n {rendered.map((item, idx) => (\n <span\n key={`${item.label}-${idx}`}\n className=\"ds:inline-flex ds:items-baseline ds:gap-x-[var(--spacing-xs)]\"\n >\n {idx > 0 ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:me-[var(--spacing-xs)] ds:text-[color:var(--muted-foreground)]\"\n >\n ·\n </span>\n ) : null}\n <span className=\"ds:text-[color:var(--muted-foreground)]\">\n {item.label}\n </span>\n <span\n className={[\n 'ds:tabular-nums',\n 'ds:font-medium',\n item.negative ? 'ds:text-[color:var(--destructive)]' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {item.formatted}\n </span>\n </span>\n ))}\n </div>\n );\n}\n\n/**\n * Column-definition defaults consumers can spread onto a `ColDef` when they\n * want the renderer's wrapped / multi-line behaviour to grow the row.\n *\n * The default compact horizontal layout is engineered to fit the standard\n * AG Grid row height, so this opt-in is only needed when a long label set\n * wraps across two or more lines and the consumer would rather grow the\n * row than wrap silently.\n *\n * AG Grid does NOT auto-grow row height to fit a tall cell unless\n * `autoHeight` and `wrapText` are set on the colDef itself — a cell\n * renderer can't impose that from inside.\n *\n * @example\n * ```ts\n * {\n * headerName: 'Saldi',\n * cellRenderer: BalanceCellRenderer,\n * cellRendererParams: { lines, currency: 'EUR' },\n * ...balanceCellRendererColDefDefaults,\n * }\n * ```\n */\nexport const balanceCellRendererColDefDefaults: Readonly<\n Pick<ColDef, 'autoHeight' | 'wrapText'>\n> = {\n autoHeight: true,\n wrapText: true,\n};\n","import { useEffect, useRef, useState } from 'react';\nimport type { CustomCellEditorProps } from 'ag-grid-react';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_PADDING_X,\n INPUT_SURFACE_TEXT,\n} from '../../_shared/input-surface';\n\n/**\n * Inline text editor that visually matches `<TextInput size=\"sm\">`. Use as\n * `cellEditor` on a colDef with `editable: true`. The cell renderer (default\n * or custom) takes over again once editing stops.\n *\n * AG Grid commits on Enter or Tab or blur; cancels on Escape. The consumer\n * receives the committed value via `onCellValueChanged`.\n */\nexport function EditableTextCellRenderer<TData = unknown>(\n props: CustomCellEditorProps<TData, string>,\n) {\n const { initialValue, onValueChange, stopEditing, column } = props;\n const [value, setValue] = useState<string>(initialValue ?? '');\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Focus + select on mount so typing replaces the current value.\n useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n el.focus();\n el.select();\n }, []);\n\n // The current value is pushed to AG Grid via `onValueChange` on every\n // keystroke — AG Grid commits the most recent value when editing stops.\n // No `useGridCellEditor` hook needed for that contract.\n\n // Thread the column header into the input's accessible name so screen\n // readers announce \"Edit text, {column}\" instead of an unlabelled input.\n // AG Grid doesn't auto-wire the column header to cell editors.\n const headerName =\n (column?.getColDef?.()?.headerName as string | undefined) ?? undefined;\n\n return (\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n aria-label={headerName}\n onChange={(e) => {\n const next = e.target.value;\n setValue(next);\n onValueChange(next);\n }}\n onKeyDown={(e) => {\n // Escape cancels, Enter/Tab commit — AG Grid handles both, but we\n // explicitly stop editing on Enter so the consumer sees the commit\n // immediately rather than waiting for the next focus blur.\n if (e.key === 'Enter') {\n e.preventDefault();\n stopEditing();\n }\n }}\n className={[\n 'ds:block ds:w-full ds:appearance-none',\n // Input surface chrome: rounded border + bg + focus halo.\n INPUT_SURFACE_CHROME,\n // Use the `md` height (`--min-target-size`) so the input\n // auto-lifts to 48px under `.theme-accessible` to satisfy\n // WCAG 2.5.5 target size.\n INPUT_SURFACE_HEIGHT.md,\n INPUT_SURFACE_TEXT.sm,\n INPUT_SURFACE_PADDING_X.sm,\n ].join(' ')}\n />\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { CustomCellEditorProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n INPUT_SURFACE_CHROME,\n INPUT_SURFACE_HEIGHT,\n INPUT_SURFACE_PADDING_X,\n INPUT_SURFACE_TEXT,\n} from '../../_shared/input-surface';\n\nexport interface EditableCurrencyCellEditorParams {\n /** ISO 4217 currency code (e.g. `EUR`, `USD`). Defaults to `EUR`. */\n currency?: string;\n /** Decimal places allowed in the editor. Defaults to 2 (cents precision). */\n decimals?: number;\n /** Minimum allowed value — values below this are clamped on commit. */\n min?: number;\n /** Maximum allowed value — values above this are clamped on commit. */\n max?: number;\n}\n\n/**\n * Inline numeric editor that visually matches `<TextInput size=\"sm\">`. Use as\n * `cellEditor` on a colDef with `editable: true`. The display formatting is\n * still the renderer's job — once editing stops, the cell hands back to\n * `CurrencyCellRenderer` (or whichever renderer the colDef declares).\n *\n * Stores a Number, not a string, so consumers receive `row.amount = 12.5`\n * not `\"12.5\"`. Strips locale separators on each change so commas/dots in\n * any language convert to a clean numeric value.\n */\nexport function EditableCurrencyCellRenderer<TData = unknown>(\n props: CustomCellEditorProps<TData, number> &\n EditableCurrencyCellEditorParams,\n) {\n const {\n initialValue,\n onValueChange,\n stopEditing,\n column,\n decimals = 2,\n min,\n max,\n } = props;\n const { i18n } = useTranslation();\n const inputRef = useRef<HTMLInputElement | null>(null);\n // Thread the column header into the input's accessible name — see\n // editable-text-cell-renderer.tsx for the rationale.\n const headerName =\n (column?.getColDef?.()?.headerName as string | undefined) ?? undefined;\n\n // Local string state so the user can type intermediate values like \"12.\"\n // before the trailing zero arrives. We commit a Number to AG Grid on each\n // change for consumers that watch row state live; the final commit fires\n // when editing stops.\n const [draft, setDraft] = useState<string>(() => {\n if (initialValue == null || Number.isNaN(initialValue)) return '';\n return String(initialValue);\n });\n\n useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n el.focus();\n el.select();\n }, []);\n\n function parseDraft(input: string): number | null {\n if (input.trim().length === 0) return null;\n // Accept either the user's locale decimal separator or a `.`. Strip\n // grouping characters (locale thousands separators, plus spaces).\n const lang = i18n.language || 'en';\n const partsFmt = new Intl.NumberFormat(lang).formatToParts(12345.6);\n const groupChar = partsFmt.find((p) => p.type === 'group')?.value ?? '';\n const decimalChar =\n partsFmt.find((p) => p.type === 'decimal')?.value ?? '.';\n const cleaned = input\n .replace(new RegExp(`\\\\${groupChar}`, 'g'), '')\n .replace(decimalChar, '.')\n .replace(/[^\\d.-]/g, '');\n const n = Number(cleaned);\n return Number.isFinite(n) ? n : null;\n }\n\n function commit(input: string) {\n const parsed = parseDraft(input);\n if (parsed == null) {\n onValueChange(null);\n return;\n }\n // Clamp first, then round to the declared precision so we never\n // persist floating-point dust from string parsing.\n let clamped = parsed;\n if (typeof min === 'number') clamped = Math.max(min, clamped);\n if (typeof max === 'number') clamped = Math.min(max, clamped);\n const factor = 10 ** decimals;\n onValueChange(Math.round(clamped * factor) / factor);\n }\n\n return (\n <input\n ref={inputRef}\n type=\"text\"\n // Inputmode hints mobile keyboards to show the decimal pad instead\n // of the full keyboard. type=\"number\" would also work but spinners\n // and locale parsing are inconsistent across browsers.\n inputMode=\"decimal\"\n value={draft}\n aria-label={headerName}\n onChange={(e) => {\n const next = e.target.value;\n setDraft(next);\n commit(next);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n stopEditing();\n }\n // Escape — AG Grid cancels by default; the editor doesn't need\n // explicit handling beyond what AG Grid wires automatically.\n }}\n className={[\n 'ds:block ds:w-full ds:appearance-none ds:text-end ds:tabular-nums',\n INPUT_SURFACE_CHROME,\n // Use `md` height — see editable-text-cell-renderer for rationale.\n INPUT_SURFACE_HEIGHT.md,\n INPUT_SURFACE_TEXT.sm,\n INPUT_SURFACE_PADDING_X.sm,\n ].join(' ')}\n />\n );\n}\n"],"names":["useTotalRow","rowData","sumFields","options","useMemo","row","field","total","r","raw","n","ToothIcon","jsx","ToothCellRenderer","props","value","maxInlineSize","Tag","toNumber","CurrencyCellRenderer","currency","colorNegative","strikethrough","i18n","useTranslation","locale","formatted","classNames","reorderColumnWidth","ReorderCellRenderer","data","node","api","onMove","moveUpLabel","moveDownLabel","intent","group","disableAtEnds","t","rowIndex","lastIndex","atFirst","atLast","upLabel","downLabel","buttons","IconButton","ArrowUp","event","ArrowDown","IconButtonGroup","ToggleCellRenderer","onToggle","onError","trueIcon","falseIcon","trueClass","falseClass","label","pending","setPending","useState","isOn","icon","SquareCheckBig","Square","stateClass","resolvedLabel","handleClick","result","err","SIZE_CLASS","readField","HEX_RE","RGB_RE","HSL_RE","CSS_VAR_RE","sanitizeColor","v","ColorDotCellRenderer","colorField","size","labelField","dotRef","useRef","rawColor","color","useIsomorphicLayoutEffect","el","jsxs","readNumber","BalanceCellRenderer","lines","highlightNegative","formatLine","line","rendered","x","item","idx","EditableTextCellRenderer","initialValue","onValueChange","stopEditing","column","setValue","inputRef","useEffect","headerName","_b","_a","e","next","INPUT_SURFACE_CHROME","INPUT_SURFACE_HEIGHT","INPUT_SURFACE_TEXT","INPUT_SURFACE_PADDING_X","EditableCurrencyCellRenderer","decimals","min","max","draft","setDraft","parseDraft","input","lang","partsFmt","groupChar","p","decimalChar","cleaned","commit","parsed","clamped","factor"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { jsx as s, jsxs as t } from "react/jsx-runtime";
2
2
  import { forwardRef as z, useState as I, useRef as T, useMemo as V } from "react";
3
3
  import { c as i } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as L } from "react-i18next";
5
- import { B as M } from "./button-18oBsI3n.js";
6
- import { I as _ } from "./icon-button-CY7GU_Se.js";
5
+ import { B as M } from "./button-CYPx2xFq.js";
6
+ import { I as _ } from "./icon-button-JAXAkqWC.js";
7
7
  import { C as $, S as R } from "./skeleton-B1KTdJ4N.js";
8
8
  import { P as A } from "./pencil-B1sKKyuT.js";
9
9
  const x = i(
@@ -139,4 +139,4 @@ G.displayName = "EditableDescription";
139
139
  export {
140
140
  G as E
141
141
  };
142
- //# sourceMappingURL=editable-description-B4NVdjvd.js.map
142
+ //# sourceMappingURL=editable-description-CRQib91p.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editable-description-B4NVdjvd.js","sources":["../../src/components/editable-description/editable-description.tsx"],"sourcesContent":["import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type Ref,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Pencil } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { CONTENT_ENTER_CLASS, Skeleton } from '../skeleton/skeleton';\n\n/* -------------------------------------------------------------------- */\n/* EditableDescription */\n/* */\n/* A record's free-text description, set as bulleted lines, with a pencil */\n/* beside it when the reader may edit. An appointment's description, a */\n/* task's description, a treatment's remark. PLAIN text only: patient */\n/* notes are rich text and belong to NotesPanel and NoteTimeline. */\n/* */\n/* In practice this text is written as a list (\"sensitive lower left\", */\n/* \"review the bitewings\", \"allow extra time\"), so it is set as one, a */\n/* dot per line, rather than as a paragraph pretending to be prose. */\n/* */\n/* Long descriptions cut at the LINE, not at a rendered row: `maxLines` */\n/* bullets, then a \"See more\" that is itself an item of the list, so the */\n/* column does not shift when it opens. */\n/* */\n/* It DISPLAYS and asks to edit; it does not own the editor. `onEdit` */\n/* hands over to the host, which opens its form, in a rail panel a */\n/* `PanelSubview` with a `TextArea`. Omit `onEdit` for a read-only view. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:min-w-0 ds:items-start ds:gap-[var(--spacing-xs)]',\n);\n\nconst listVariants = cva(\n [\n 'ds:m-0 ds:flex ds:min-w-0 ds:flex-1 ds:list-none ds:flex-col ds:p-0',\n 'ds:gap-[var(--spacing-2xs)]',\n ].join(' '),\n);\n\n/* Ragged on purpose: three lines of one length read as a block, not text. */\nconst LOADING_LINE_WIDTHS = ['80%', '60%', '66%'] as const;\n\nconst emptyVariants = cva(\n 'ds:m-0 ds:min-w-0 ds:flex-1 type-body-sm ds:text-[color:var(--muted-foreground)]',\n);\n\nconst lineVariants = cva(\n 'ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm ds:text-[color:var(--foreground)]',\n);\n\n/* `--spacing-sm` is (line-height − dot) / 2 for this type scale, so the dot\n centres on the FIRST line; `self-start` keeps it there when a line wraps. */\nconst dotVariants = cva(\n [\n 'ds:mt-[var(--spacing-sm)] ds:size-[var(--spacing-xs)] ds:shrink-0 ds:self-start',\n 'ds:rounded-[var(--radius-full)] ds:bg-[color:var(--border)]',\n ].join(' '),\n);\n\nexport interface EditableDescriptionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> {\n /** The description. One bullet per non-empty line. */\n value?: string | null;\n /** Lines shown before the rest go behind \"See more\". Default `3`. */\n maxLines?: number;\n /**\n * The description is being read. With nothing to show yet, it renders\n * bulleted placeholder lines and no pencil. With a `value` already on screen\n * (a refresh) it keeps the text and only sets `aria-busy`.\n */\n loading?: boolean;\n /** Fires from the pencil. Omit for a read-only description. */\n onEdit?: () => void;\n /** Receives the pencil button, so a host can return focus to it. */\n editButtonRef?: Ref<HTMLButtonElement>;\n /** Shown when there are no lines. Defaults to the kit's translated text. */\n emptyLabel?: string;\n /** Accessible name and tooltip of the pencil. Defaults to the kit's text. */\n editLabel?: string;\n /** Disclosure labels. Default to the kit's translated text. */\n seeMoreLabel?: string;\n showLessLabel?: string;\n}\n\nexport const EditableDescription = forwardRef<\n HTMLDivElement,\n EditableDescriptionProps\n>(\n (\n {\n value,\n maxLines = 3,\n loading = false,\n onEdit,\n editButtonRef,\n emptyLabel,\n editLabel,\n seeMoreLabel,\n showLessLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState(false);\n /* Settle in only when this content REPLACES a skeleton. Content that was\n simply there from the start must not fade: it would read as invisible\n for one animation to any test or reader that looks at once. */\n const followedLoading = useRef(false);\n if (loading) followedLoading.current = true;\n const enterClass = followedLoading.current ? CONTENT_ENTER_CLASS : '';\n\n const lines = useMemo(\n () =>\n (value ?? '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean),\n [value],\n );\n\n const hiddenCount = Math.max(0, lines.length - maxLines);\n const shown = expanded ? lines : lines.slice(0, maxLines);\n const resolvedEditLabel = editLabel ?? t('editableDescription.edit');\n\n // A first read shows the placeholder. A REFRESH keeps the lines it has and\n // only marks the block busy: real text never gives way to a skeleton.\n if (loading && lines.length === 0) {\n return (\n <div\n {...rest}\n ref={ref}\n data-component=\"editable-description\"\n data-loading=\"\"\n aria-busy=\"true\"\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n >\n <ul aria-hidden=\"true\" className={listVariants()}>\n {LOADING_LINE_WIDTHS.slice(0, Math.max(1, maxLines)).map(\n (width, index) => (\n <li key={width} className={lineVariants()}>\n <span className={dotVariants()} />\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n stagger={index}\n width={width}\n className=\"ds:mt-[var(--spacing-xs)]\"\n />\n </li>\n ),\n )}\n </ul>\n </div>\n );\n }\n\n return (\n <div\n {...rest}\n ref={ref}\n data-component=\"editable-description\"\n data-empty={lines.length === 0 ? '' : undefined}\n aria-busy={loading || undefined}\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n >\n {lines.length === 0 ? (\n <p data-editable-description-empty=\"\" className={emptyVariants()}>\n {emptyLabel ?? t('editableDescription.empty')}\n </p>\n ) : (\n <ul className={`${listVariants()} ${enterClass}`.trim()}>\n {shown.map((line, index) => (\n <li\n key={`${index}-${line}`}\n data-editable-description-line=\"\"\n className={lineVariants()}\n >\n <span aria-hidden=\"true\" className={dotVariants()} />\n <span className=\"ds:min-w-0 ds:[overflow-wrap:anywhere]\">\n {line}\n </span>\n </li>\n ))}\n {hiddenCount > 0 ? (\n // An ITEM of the list, aligned with the text rather than the\n // dots, so opening it does not shift the column.\n <li className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:size-[var(--spacing-xs)] ds:shrink-0\"\n />\n <Button\n intent=\"link\"\n size=\"sm\"\n data-editable-description-toggle=\"\"\n className=\"ds:!ps-0 ds:!pe-0\"\n aria-expanded={expanded}\n onClick={() => setExpanded((previous) => !previous)}\n >\n {expanded\n ? (showLessLabel ?? t('editableDescription.showLess'))\n : (seeMoreLabel ?? t('editableDescription.seeMore'))}\n </Button>\n </li>\n ) : null}\n </ul>\n )}\n {onEdit ? (\n <IconButton\n ref={editButtonRef}\n icon={<Pencil aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n // Pulled up so the 2rem button centres on the first text line.\n className=\"ds:-mt-[var(--spacing-sm)] ds:shrink-0\"\n aria-label={resolvedEditLabel}\n tooltip={resolvedEditLabel}\n data-editable-description-edit=\"\"\n onClick={onEdit}\n />\n ) : null}\n </div>\n );\n },\n);\nEditableDescription.displayName = 'EditableDescription';\n"],"names":["rootVariants","cva","listVariants","LOADING_LINE_WIDTHS","emptyVariants","lineVariants","dotVariants","EditableDescription","forwardRef","value","maxLines","loading","onEdit","editButtonRef","emptyLabel","editLabel","seeMoreLabel","showLessLabel","className","rest","ref","t","useTranslation","expanded","setExpanded","useState","followedLoading","useRef","enterClass","CONTENT_ENTER_CLASS","lines","useMemo","line","hiddenCount","shown","resolvedEditLabel","jsx","width","index","Skeleton","jsxs","Button","previous","IconButton","Pencil"],"mappings":"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"}
1
+ {"version":3,"file":"editable-description-CRQib91p.js","sources":["../../src/components/editable-description/editable-description.tsx"],"sourcesContent":["import {\n forwardRef,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type Ref,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { Pencil } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { CONTENT_ENTER_CLASS, Skeleton } from '../skeleton/skeleton';\n\n/* -------------------------------------------------------------------- */\n/* EditableDescription */\n/* */\n/* A record's free-text description, set as bulleted lines, with a pencil */\n/* beside it when the reader may edit. An appointment's description, a */\n/* task's description, a treatment's remark. PLAIN text only: patient */\n/* notes are rich text and belong to NotesPanel and NoteTimeline. */\n/* */\n/* In practice this text is written as a list (\"sensitive lower left\", */\n/* \"review the bitewings\", \"allow extra time\"), so it is set as one, a */\n/* dot per line, rather than as a paragraph pretending to be prose. */\n/* */\n/* Long descriptions cut at the LINE, not at a rendered row: `maxLines` */\n/* bullets, then a \"See more\" that is itself an item of the list, so the */\n/* column does not shift when it opens. */\n/* */\n/* It DISPLAYS and asks to edit; it does not own the editor. `onEdit` */\n/* hands over to the host, which opens its form, in a rail panel a */\n/* `PanelSubview` with a `TextArea`. Omit `onEdit` for a read-only view. */\n/* -------------------------------------------------------------------- */\n\nconst rootVariants = cva(\n 'ds:flex ds:min-w-0 ds:items-start ds:gap-[var(--spacing-xs)]',\n);\n\nconst listVariants = cva(\n [\n 'ds:m-0 ds:flex ds:min-w-0 ds:flex-1 ds:list-none ds:flex-col ds:p-0',\n 'ds:gap-[var(--spacing-2xs)]',\n ].join(' '),\n);\n\n/* Ragged on purpose: three lines of one length read as a block, not text. */\nconst LOADING_LINE_WIDTHS = ['80%', '60%', '66%'] as const;\n\nconst emptyVariants = cva(\n 'ds:m-0 ds:min-w-0 ds:flex-1 type-body-sm ds:text-[color:var(--muted-foreground)]',\n);\n\nconst lineVariants = cva(\n 'ds:flex ds:items-start ds:gap-[var(--spacing-xs)] type-body-sm ds:text-[color:var(--foreground)]',\n);\n\n/* `--spacing-sm` is (line-height − dot) / 2 for this type scale, so the dot\n centres on the FIRST line; `self-start` keeps it there when a line wraps. */\nconst dotVariants = cva(\n [\n 'ds:mt-[var(--spacing-sm)] ds:size-[var(--spacing-xs)] ds:shrink-0 ds:self-start',\n 'ds:rounded-[var(--radius-full)] ds:bg-[color:var(--border)]',\n ].join(' '),\n);\n\nexport interface EditableDescriptionProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onChange'\n> {\n /** The description. One bullet per non-empty line. */\n value?: string | null;\n /** Lines shown before the rest go behind \"See more\". Default `3`. */\n maxLines?: number;\n /**\n * The description is being read. With nothing to show yet, it renders\n * bulleted placeholder lines and no pencil. With a `value` already on screen\n * (a refresh) it keeps the text and only sets `aria-busy`.\n */\n loading?: boolean;\n /** Fires from the pencil. Omit for a read-only description. */\n onEdit?: () => void;\n /** Receives the pencil button, so a host can return focus to it. */\n editButtonRef?: Ref<HTMLButtonElement>;\n /** Shown when there are no lines. Defaults to the kit's translated text. */\n emptyLabel?: string;\n /** Accessible name and tooltip of the pencil. Defaults to the kit's text. */\n editLabel?: string;\n /** Disclosure labels. Default to the kit's translated text. */\n seeMoreLabel?: string;\n showLessLabel?: string;\n}\n\nexport const EditableDescription = forwardRef<\n HTMLDivElement,\n EditableDescriptionProps\n>(\n (\n {\n value,\n maxLines = 3,\n loading = false,\n onEdit,\n editButtonRef,\n emptyLabel,\n editLabel,\n seeMoreLabel,\n showLessLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = useState(false);\n /* Settle in only when this content REPLACES a skeleton. Content that was\n simply there from the start must not fade: it would read as invisible\n for one animation to any test or reader that looks at once. */\n const followedLoading = useRef(false);\n if (loading) followedLoading.current = true;\n const enterClass = followedLoading.current ? CONTENT_ENTER_CLASS : '';\n\n const lines = useMemo(\n () =>\n (value ?? '')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean),\n [value],\n );\n\n const hiddenCount = Math.max(0, lines.length - maxLines);\n const shown = expanded ? lines : lines.slice(0, maxLines);\n const resolvedEditLabel = editLabel ?? t('editableDescription.edit');\n\n // A first read shows the placeholder. A REFRESH keeps the lines it has and\n // only marks the block busy: real text never gives way to a skeleton.\n if (loading && lines.length === 0) {\n return (\n <div\n {...rest}\n ref={ref}\n data-component=\"editable-description\"\n data-loading=\"\"\n aria-busy=\"true\"\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n >\n <ul aria-hidden=\"true\" className={listVariants()}>\n {LOADING_LINE_WIDTHS.slice(0, Math.max(1, maxLines)).map(\n (width, index) => (\n <li key={width} className={lineVariants()}>\n <span className={dotVariants()} />\n <Skeleton\n variant=\"text\"\n size=\"sm\"\n stagger={index}\n width={width}\n className=\"ds:mt-[var(--spacing-xs)]\"\n />\n </li>\n ),\n )}\n </ul>\n </div>\n );\n }\n\n return (\n <div\n {...rest}\n ref={ref}\n data-component=\"editable-description\"\n data-empty={lines.length === 0 ? '' : undefined}\n aria-busy={loading || undefined}\n className={[rootVariants(), className].filter(Boolean).join(' ')}\n >\n {lines.length === 0 ? (\n <p data-editable-description-empty=\"\" className={emptyVariants()}>\n {emptyLabel ?? t('editableDescription.empty')}\n </p>\n ) : (\n <ul className={`${listVariants()} ${enterClass}`.trim()}>\n {shown.map((line, index) => (\n <li\n key={`${index}-${line}`}\n data-editable-description-line=\"\"\n className={lineVariants()}\n >\n <span aria-hidden=\"true\" className={dotVariants()} />\n <span className=\"ds:min-w-0 ds:[overflow-wrap:anywhere]\">\n {line}\n </span>\n </li>\n ))}\n {hiddenCount > 0 ? (\n // An ITEM of the list, aligned with the text rather than the\n // dots, so opening it does not shift the column.\n <li className=\"ds:flex ds:items-start ds:gap-[var(--spacing-xs)]\">\n <span\n aria-hidden=\"true\"\n className=\"ds:size-[var(--spacing-xs)] ds:shrink-0\"\n />\n <Button\n intent=\"link\"\n size=\"sm\"\n data-editable-description-toggle=\"\"\n className=\"ds:!ps-0 ds:!pe-0\"\n aria-expanded={expanded}\n onClick={() => setExpanded((previous) => !previous)}\n >\n {expanded\n ? (showLessLabel ?? t('editableDescription.showLess'))\n : (seeMoreLabel ?? t('editableDescription.seeMore'))}\n </Button>\n </li>\n ) : null}\n </ul>\n )}\n {onEdit ? (\n <IconButton\n ref={editButtonRef}\n icon={<Pencil aria-hidden=\"true\" />}\n intent=\"ghost\"\n size=\"sm\"\n // Pulled up so the 2rem button centres on the first text line.\n className=\"ds:-mt-[var(--spacing-sm)] ds:shrink-0\"\n aria-label={resolvedEditLabel}\n tooltip={resolvedEditLabel}\n data-editable-description-edit=\"\"\n onClick={onEdit}\n />\n ) : null}\n </div>\n );\n },\n);\nEditableDescription.displayName = 'EditableDescription';\n"],"names":["rootVariants","cva","listVariants","LOADING_LINE_WIDTHS","emptyVariants","lineVariants","dotVariants","EditableDescription","forwardRef","value","maxLines","loading","onEdit","editButtonRef","emptyLabel","editLabel","seeMoreLabel","showLessLabel","className","rest","ref","t","useTranslation","expanded","setExpanded","useState","followedLoading","useRef","enterClass","CONTENT_ENTER_CLASS","lines","useMemo","line","hiddenCount","shown","resolvedEditLabel","jsx","width","index","Skeleton","jsxs","Button","previous","IconButton","Pencil"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as r, jsxs as p } from "react/jsx-runtime";
2
2
  import { useRef as o, useId as k, useEffect as v, useCallback as E } from "react";
3
3
  import { useTranslation as j } from "react-i18next";
4
4
  import { c as I } from "./index-D2ZczOXr.js";
5
- import { I as N } from "./icon-button-CY7GU_Se.js";
5
+ import { I as N } from "./icon-button-JAXAkqWC.js";
6
6
  import { X as z } from "./x-B5YnXwCz.js";
7
7
  const R = I(
8
8
  [
@@ -90,4 +90,4 @@ function D({
90
90
  export {
91
91
  D as E
92
92
  };
93
- //# sourceMappingURL=editor-overlay-BDiBvQmL.js.map
93
+ //# sourceMappingURL=editor-overlay-DsA7vR5C.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor-overlay-BDiBvQmL.js","sources":["../../src/components/editor-overlay/editor-overlay.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* EditorOverlay — a non-modal, liquid-glass bar docked INSIDE an */\n/* editor region (Gemini / Mac Mail \"Help me write\" style). */\n/* */\n/* Unlike Dialog it does NOT centre on screen, trap focus, or make the */\n/* page inert — and there is NO scrim, so the editor stays visible and */\n/* usable behind it. It expands from the AI pill into a frosted, */\n/* translucent, rounded bar across the editor's block-end edge. The */\n/* host must be `position: relative` (the RichTextEditor editor region */\n/* is); the overlay anchors to it absolutely. Escape and the close */\n/* button dismiss it. Reusable for any editor-attached surface (AI */\n/* draft, future inline tools). */\n/* ------------------------------------------------------------------ */\n\nimport { useCallback, useEffect, useId, useRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { cva } from 'class-variance-authority';\n\nimport { IconButton } from '../button';\n\nexport interface EditorOverlayProps {\n /** Controlled visibility. */\n open: boolean;\n /** Close request (Escape or the close button). */\n onClose: () => void;\n /** Optional visible heading; renders a header row with a close button. */\n title?: ReactNode;\n /** Accessible name for the overlay region (use when there is no visible title). */\n ariaLabel?: string;\n /** Body content. */\n children: ReactNode;\n /** Optional footer slot (e.g. action buttons), right-aligned. */\n footer?: ReactNode;\n /**\n * Opaque instance id, emitted on the wrapper as `data-component-id`. Pass it\n * when more than one overlay can be mounted so an agent / automation tool can\n * tell them apart (PRS §26 §6).\n */\n id?: string;\n /** Extra classes on the glass card. */\n className?: string;\n}\n\n// Non-blocking liquid-glass bar docked across the editor's block-end edge,\n// expanding from the AI pill. No scrim — the editor stays visible + usable.\nconst cardVariants = cva(\n [\n // Spans the editor's block-end edge (a docked bar) and expands from the pill.\n 'ds:absolute ds:z-20',\n 'ds:[inset-inline-start:var(--spacing-md)] ds:[inset-inline-end:var(--spacing-md)]',\n 'ds:[inset-block-end:var(--spacing-md)]',\n // Slim docked bar — compact but with a little breathing room.\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-lg)]',\n // Apple \"Liquid Glass\": a translucent base + backdrop blur/saturate so the\n // editor shows through, a specular top \"rim\" + inner hairline ring, and a\n // soft drop shadow for a floating slab. --card-border is theme-aware (dark\n // hairline on light themes, bright on dark), so the rim reads in all four.\n 'ds:bg-[color-mix(in_srgb,var(--popover)_64%,transparent)]',\n 'ds:backdrop-blur-xl ds:backdrop-saturate-150',\n 'ds:border ds:border-[color-mix(in_srgb,var(--card-border)_70%,transparent)]',\n 'ds:shadow-[inset_0_1px_0_0_var(--card-border),inset_0_0_0_1px_color-mix(in_srgb,var(--card-border)_35%,transparent),var(--shadow-lg)]',\n // Liquid-glass grow out of the pill (bottom-inline-end origin).\n 'ds:origin-bottom-right ds:animate-in ds:fade-in-0 ds:zoom-in-95',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst titleClass =\n 'ds:text-[length:var(--font-size-base)] ds:font-medium ds:text-[color:var(--foreground)]';\n\nexport function EditorOverlay({\n open,\n onClose,\n title,\n ariaLabel,\n children,\n footer,\n id,\n className,\n}: EditorOverlayProps): React.JSX.Element | null {\n const { t } = useTranslation();\n const cardRef = useRef<HTMLDivElement>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n const titleId = useId();\n\n // Latest onClose in a ref: the focus effect below must run only when `open`\n // changes. Depending on `onClose` re-ran it on every host render (a host\n // passing an inline handler), stealing focus from whatever was being typed.\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n }, [onClose]);\n const handleClose = useCallback(() => onClose(), [onClose]);\n\n useEffect(() => {\n if (!open) return undefined;\n restoreFocusRef.current = document.activeElement as HTMLElement | null;\n // Move focus into the overlay (non-modal: we don't trap it, just seed it).\n const raf = window.requestAnimationFrame(() => {\n const focusable = cardRef.current?.querySelector<HTMLElement>(\n 'input, textarea, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n (focusable ?? cardRef.current)?.focus();\n });\n const onKeyDown = (event: KeyboardEvent): void => {\n // An Escape a nested layer already handled (a Radix menu, select or\n // dialog marks its dismiss with preventDefault) closes only that layer.\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.stopPropagation();\n onCloseRef.current();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => {\n window.cancelAnimationFrame(raf);\n document.removeEventListener('keydown', onKeyDown);\n restoreFocusRef.current?.focus?.();\n };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div data-component=\"editor-overlay\" data-component-id={id}>\n <div\n ref={cardRef}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n tabIndex={-1}\n className={[cardVariants(), className].filter(Boolean).join(' ')}\n >\n {/* Header only when there's a visible title — a title-less overlay is a\n header-less composer (named via ariaLabel) whose consumer provides\n its own inline close so no empty band is reserved for it. */}\n {title ? (\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <div id={titleId} className={titleClass}>\n {title}\n </div>\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<X />}\n aria-label={t('common.close')}\n onClick={handleClose}\n />\n </div>\n ) : null}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {children}\n </div>\n {footer ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {footer}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["cardVariants","cva","titleClass","EditorOverlay","open","onClose","title","ariaLabel","children","footer","id","className","t","useTranslation","cardRef","useRef","restoreFocusRef","titleId","useId","onCloseRef","useEffect","handleClose","useCallback","raf","_b","_a","onKeyDown","event","jsx","jsxs","IconButton","X"],"mappings":";;;;;;AA8CA,MAAMA,IAAeC;AAAA,EACnB;AAAA;AAAA,IAEE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IACJ;AAEK,SAASC,EAAc;AAAA,EAC5B,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,IAAAC;AAAA,EACA,WAAAC;AACF,GAAiD;AAC/C,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAuB,IAAI,GACrCC,IAAkBD,EAA2B,IAAI,GACjDE,IAAUC,EAAA,GAKVC,IAAaJ,EAAOV,CAAO;AACjC,EAAAe,EAAU,MAAM;AACd,IAAAD,EAAW,UAAUd;AAAA,EACvB,GAAG,CAACA,CAAO,CAAC;AACZ,QAAMgB,IAAcC,EAAY,MAAMjB,KAAW,CAACA,CAAO,CAAC;AA4B1D,SA1BAe,EAAU,MAAM;AACd,QAAI,CAAChB,EAAM;AACX,IAAAY,EAAgB,UAAU,SAAS;AAEnC,UAAMO,IAAM,OAAO,sBAAsB,MAAM;;AAI7C,OAACC,MAHiBC,IAAAX,EAAQ,YAAR,gBAAAW,EAAiB;AAAA,QACjC;AAAA,YAEYX,EAAQ,YAArB,QAAAU,EAA+B;AAAA,IAClC,CAAC,GACKE,IAAY,CAACC,MAA+B;AAGhD,MAAIA,EAAM,QAAQ,YAAY,CAACA,EAAM,qBACnCA,EAAM,gBAAA,GACNR,EAAW,QAAA;AAAA,IAEf;AACA,oBAAS,iBAAiB,WAAWO,CAAS,GACvC,MAAM;;AACX,aAAO,qBAAqBH,CAAG,GAC/B,SAAS,oBAAoB,WAAWG,CAAS,IACjDF,KAAAC,IAAAT,EAAgB,YAAhB,gBAAAS,EAAyB,UAAzB,QAAAD,EAAA,KAAAC;AAAA,IACF;AAAA,EACF,GAAG,CAACrB,CAAI,CAAC,GAEJA,IAGH,gBAAAwB,EAAC,OAAA,EAAI,kBAAe,kBAAiB,qBAAmBlB,GACtD,UAAA,gBAAAmB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKf;AAAA,MACL,MAAK;AAAA,MACL,cAAW;AAAA,MACX,mBAAiBR,IAAQW,IAAU;AAAA,MACnC,cAAYX,IAAQ,SAAYC;AAAA,MAChC,UAAU;AAAA,MACV,WAAW,CAACP,EAAA,GAAgBW,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAK9D,UAAA;AAAA,QAAAL,IACC,gBAAAuB,EAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,UAAA,gBAAAD,EAAC,OAAA,EAAI,IAAIX,GAAS,WAAWf,GAC1B,UAAAI,GACH;AAAA,UACA,gBAAAsB;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,wBAAOC,GAAA,EAAE;AAAA,cACT,cAAYnB,EAAE,cAAc;AAAA,cAC5B,SAASS;AAAA,YAAA;AAAA,UAAA;AAAA,QACX,EAAA,CACF,IACE;AAAA,QACJ,gBAAAO,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAApB,EAAA,CACH;AAAA,QACCC,IACC,gBAAAmB,EAAC,OAAA,EAAI,WAAU,kFACZ,aACH,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAER,IAvCgB;AAyCpB;"}
1
+ {"version":3,"file":"editor-overlay-DsA7vR5C.js","sources":["../../src/components/editor-overlay/editor-overlay.tsx"],"sourcesContent":["/* ------------------------------------------------------------------ */\n/* EditorOverlay — a non-modal, liquid-glass bar docked INSIDE an */\n/* editor region (Gemini / Mac Mail \"Help me write\" style). */\n/* */\n/* Unlike Dialog it does NOT centre on screen, trap focus, or make the */\n/* page inert — and there is NO scrim, so the editor stays visible and */\n/* usable behind it. It expands from the AI pill into a frosted, */\n/* translucent, rounded bar across the editor's block-end edge. The */\n/* host must be `position: relative` (the RichTextEditor editor region */\n/* is); the overlay anchors to it absolutely. Escape and the close */\n/* button dismiss it. Reusable for any editor-attached surface (AI */\n/* draft, future inline tools). */\n/* ------------------------------------------------------------------ */\n\nimport { useCallback, useEffect, useId, useRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { cva } from 'class-variance-authority';\n\nimport { IconButton } from '../button';\n\nexport interface EditorOverlayProps {\n /** Controlled visibility. */\n open: boolean;\n /** Close request (Escape or the close button). */\n onClose: () => void;\n /** Optional visible heading; renders a header row with a close button. */\n title?: ReactNode;\n /** Accessible name for the overlay region (use when there is no visible title). */\n ariaLabel?: string;\n /** Body content. */\n children: ReactNode;\n /** Optional footer slot (e.g. action buttons), right-aligned. */\n footer?: ReactNode;\n /**\n * Opaque instance id, emitted on the wrapper as `data-component-id`. Pass it\n * when more than one overlay can be mounted so an agent / automation tool can\n * tell them apart (PRS §26 §6).\n */\n id?: string;\n /** Extra classes on the glass card. */\n className?: string;\n}\n\n// Non-blocking liquid-glass bar docked across the editor's block-end edge,\n// expanding from the AI pill. No scrim — the editor stays visible + usable.\nconst cardVariants = cva(\n [\n // Spans the editor's block-end edge (a docked bar) and expands from the pill.\n 'ds:absolute ds:z-20',\n 'ds:[inset-inline-start:var(--spacing-md)] ds:[inset-inline-end:var(--spacing-md)]',\n 'ds:[inset-block-end:var(--spacing-md)]',\n // Slim docked bar — compact but with a little breathing room.\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-lg)]',\n // Apple \"Liquid Glass\": a translucent base + backdrop blur/saturate so the\n // editor shows through, a specular top \"rim\" + inner hairline ring, and a\n // soft drop shadow for a floating slab. --card-border is theme-aware (dark\n // hairline on light themes, bright on dark), so the rim reads in all four.\n 'ds:bg-[color-mix(in_srgb,var(--popover)_64%,transparent)]',\n 'ds:backdrop-blur-xl ds:backdrop-saturate-150',\n 'ds:border ds:border-[color-mix(in_srgb,var(--card-border)_70%,transparent)]',\n 'ds:shadow-[inset_0_1px_0_0_var(--card-border),inset_0_0_0_1px_color-mix(in_srgb,var(--card-border)_35%,transparent),var(--shadow-lg)]',\n // Liquid-glass grow out of the pill (bottom-inline-end origin).\n 'ds:origin-bottom-right ds:animate-in ds:fade-in-0 ds:zoom-in-95',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst titleClass =\n 'ds:text-[length:var(--font-size-base)] ds:font-medium ds:text-[color:var(--foreground)]';\n\nexport function EditorOverlay({\n open,\n onClose,\n title,\n ariaLabel,\n children,\n footer,\n id,\n className,\n}: EditorOverlayProps): React.JSX.Element | null {\n const { t } = useTranslation();\n const cardRef = useRef<HTMLDivElement>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n const titleId = useId();\n\n // Latest onClose in a ref: the focus effect below must run only when `open`\n // changes. Depending on `onClose` re-ran it on every host render (a host\n // passing an inline handler), stealing focus from whatever was being typed.\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n }, [onClose]);\n const handleClose = useCallback(() => onClose(), [onClose]);\n\n useEffect(() => {\n if (!open) return undefined;\n restoreFocusRef.current = document.activeElement as HTMLElement | null;\n // Move focus into the overlay (non-modal: we don't trap it, just seed it).\n const raf = window.requestAnimationFrame(() => {\n const focusable = cardRef.current?.querySelector<HTMLElement>(\n 'input, textarea, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n (focusable ?? cardRef.current)?.focus();\n });\n const onKeyDown = (event: KeyboardEvent): void => {\n // An Escape a nested layer already handled (a Radix menu, select or\n // dialog marks its dismiss with preventDefault) closes only that layer.\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.stopPropagation();\n onCloseRef.current();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => {\n window.cancelAnimationFrame(raf);\n document.removeEventListener('keydown', onKeyDown);\n restoreFocusRef.current?.focus?.();\n };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div data-component=\"editor-overlay\" data-component-id={id}>\n <div\n ref={cardRef}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n tabIndex={-1}\n className={[cardVariants(), className].filter(Boolean).join(' ')}\n >\n {/* Header only when there's a visible title — a title-less overlay is a\n header-less composer (named via ariaLabel) whose consumer provides\n its own inline close so no empty band is reserved for it. */}\n {title ? (\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]\">\n <div id={titleId} className={titleClass}>\n {title}\n </div>\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<X />}\n aria-label={t('common.close')}\n onClick={handleClose}\n />\n </div>\n ) : null}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\">\n {children}\n </div>\n {footer ? (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {footer}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":["cardVariants","cva","titleClass","EditorOverlay","open","onClose","title","ariaLabel","children","footer","id","className","t","useTranslation","cardRef","useRef","restoreFocusRef","titleId","useId","onCloseRef","useEffect","handleClose","useCallback","raf","_b","_a","onKeyDown","event","jsx","jsxs","IconButton","X"],"mappings":";;;;;;AA8CA,MAAMA,IAAeC;AAAA,EACnB;AAAA;AAAA,IAEE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IACJ;AAEK,SAASC,EAAc;AAAA,EAC5B,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,IAAAC;AAAA,EACA,WAAAC;AACF,GAAiD;AAC/C,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAuB,IAAI,GACrCC,IAAkBD,EAA2B,IAAI,GACjDE,IAAUC,EAAA,GAKVC,IAAaJ,EAAOV,CAAO;AACjC,EAAAe,EAAU,MAAM;AACd,IAAAD,EAAW,UAAUd;AAAA,EACvB,GAAG,CAACA,CAAO,CAAC;AACZ,QAAMgB,IAAcC,EAAY,MAAMjB,KAAW,CAACA,CAAO,CAAC;AA4B1D,SA1BAe,EAAU,MAAM;AACd,QAAI,CAAChB,EAAM;AACX,IAAAY,EAAgB,UAAU,SAAS;AAEnC,UAAMO,IAAM,OAAO,sBAAsB,MAAM;;AAI7C,OAACC,MAHiBC,IAAAX,EAAQ,YAAR,gBAAAW,EAAiB;AAAA,QACjC;AAAA,YAEYX,EAAQ,YAArB,QAAAU,EAA+B;AAAA,IAClC,CAAC,GACKE,IAAY,CAACC,MAA+B;AAGhD,MAAIA,EAAM,QAAQ,YAAY,CAACA,EAAM,qBACnCA,EAAM,gBAAA,GACNR,EAAW,QAAA;AAAA,IAEf;AACA,oBAAS,iBAAiB,WAAWO,CAAS,GACvC,MAAM;;AACX,aAAO,qBAAqBH,CAAG,GAC/B,SAAS,oBAAoB,WAAWG,CAAS,IACjDF,KAAAC,IAAAT,EAAgB,YAAhB,gBAAAS,EAAyB,UAAzB,QAAAD,EAAA,KAAAC;AAAA,IACF;AAAA,EACF,GAAG,CAACrB,CAAI,CAAC,GAEJA,IAGH,gBAAAwB,EAAC,OAAA,EAAI,kBAAe,kBAAiB,qBAAmBlB,GACtD,UAAA,gBAAAmB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKf;AAAA,MACL,MAAK;AAAA,MACL,cAAW;AAAA,MACX,mBAAiBR,IAAQW,IAAU;AAAA,MACnC,cAAYX,IAAQ,SAAYC;AAAA,MAChC,UAAU;AAAA,MACV,WAAW,CAACP,EAAA,GAAgBW,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAK9D,UAAA;AAAA,QAAAL,IACC,gBAAAuB,EAAC,OAAA,EAAI,WAAU,yEACb,UAAA;AAAA,UAAA,gBAAAD,EAAC,OAAA,EAAI,IAAIX,GAAS,WAAWf,GAC1B,UAAAI,GACH;AAAA,UACA,gBAAAsB;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,QAAO;AAAA,cACP,wBAAOC,GAAA,EAAE;AAAA,cACT,cAAYnB,EAAE,cAAc;AAAA,cAC5B,SAASS;AAAA,YAAA;AAAA,UAAA;AAAA,QACX,EAAA,CACF,IACE;AAAA,QACJ,gBAAAO,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAApB,EAAA,CACH;AAAA,QACCC,IACC,gBAAAmB,EAAC,OAAA,EAAI,WAAU,kFACZ,aACH,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAER,IAvCgB;AAyCpB;"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as d, Fragment as U } from "react/jsx-runtime";
2
2
  import { forwardRef as u, useId as H, useRef as F, useState as P, useCallback as N, useEffect as q, useContext as g, createContext as M } from "react";
3
3
  import { c as m } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as Z } from "react-i18next";
5
- import { B as x } from "./button-18oBsI3n.js";
5
+ import { B as x } from "./button-CYPx2xFq.js";
6
6
  function G(t, s) {
7
7
  t && (typeof t == "function" ? t(s) : t.current = s);
8
8
  }
@@ -312,4 +312,4 @@ const lt = Object.assign(C, {
312
312
  export {
313
313
  lt as E
314
314
  };
315
- //# sourceMappingURL=empty-state-DTBZ1ENT.js.map
315
+ //# sourceMappingURL=empty-state-Ck1wVWdN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"empty-state-DTBZ1ENT.js","sources":["../../src/components/empty-state/empty-state.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button/button';\n\n/* ------------------------------------------------------------------ */\n/* Ref helper */\n/* ------------------------------------------------------------------ */\n\nfunction setRef<T>(ref: Ref<T>, value: T | null) {\n if (!ref) return;\n if (typeof ref === 'function') ref(value);\n else (ref as { current: T | null }).current = value;\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface EmptyStateContextValue {\n size: 'sm' | 'md' | 'lg';\n variant: 'first-use' | 'no-results' | 'error';\n titleId: string;\n registerTitle: () => void;\n}\n\nconst EmptyStateContext = createContext<EmptyStateContextValue>({\n size: 'md',\n variant: 'first-use',\n titleId: '',\n registerTitle: () => {},\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst emptyStateVariants = cva(\n 'ds:flex ds:flex-col ds:items-center ds:text-center ds:max-w-md ds:ms-auto ds:me-auto ds:w-full',\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-md)] ds:gap-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-md)]',\n lg: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst illustrationVariants = cva(\n 'ds:flex ds:items-center ds:justify-center ds:flex-shrink-0',\n {\n variants: {\n size: {\n sm: 'ds:w-[80px] ds:h-[80px]',\n md: 'ds:w-[160px] ds:h-[160px]',\n lg: 'ds:w-[240px] ds:h-[240px]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst titleVariants = cva('type-title-card ds:text-[var(--foreground)]', {\n variants: {\n size: {\n sm: 'ds:[--type-title-card-size:var(--font-size-sm)]',\n md: '',\n lg: 'ds:[--type-title-card-size:var(--font-size-xl)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\nconst descriptionVariants = cva(\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'ds:[--type-body-sm-size:var(--font-size-xs)]',\n md: '',\n lg: 'ds:[--type-body-sm-size:var(--font-size-base)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Built-in illustrations */\n/* ------------------------------------------------------------------ */\n\nfunction FirstUseIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <circle\n cx=\"60\"\n cy=\"60\"\n r=\"50\"\n fill=\"var(--muted)\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth=\"2\"\n />\n <rect x=\"55\" y=\"30\" width=\"10\" height=\"60\" rx=\"5\" fill=\"var(--primary)\" />\n <rect x=\"30\" y=\"55\" width=\"60\" height=\"10\" rx=\"5\" fill=\"var(--accent)\" />\n </svg>\n );\n}\n\nfunction NoResultsIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <circle cx=\"52\" cy=\"52\" r=\"28\" stroke=\"var(--muted)\" strokeWidth=\"6\" />\n <line\n x1=\"72\"\n y1=\"72\"\n x2=\"92\"\n y2=\"92\"\n stroke=\"var(--muted)\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"42\"\n y1=\"52\"\n x2=\"62\"\n y2=\"52\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction ErrorIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <path\n d=\"M60 15 L110 95 H10 Z\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.1\"\n stroke=\"var(--destructive)\"\n strokeOpacity=\"0.4\"\n strokeWidth=\"3\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"56\"\n y=\"45\"\n width=\"8\"\n height=\"26\"\n rx=\"4\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.6\"\n />\n <circle\n cx=\"60\"\n cy=\"82\"\n r=\"5\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.6\"\n />\n </svg>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Subcomponents */\n/* ------------------------------------------------------------------ */\n\nconst EmptyStateIllustration = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ children, className, ...props }, ref) => {\n const { size } = useContext(EmptyStateContext);\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={illustrationVariants({ size, className })}\n {...props}\n >\n {children}\n </div>\n );\n});\nEmptyStateIllustration.displayName = 'EmptyState.Illustration';\n\nconst EmptyStateTitle = forwardRef<\n HTMLHeadingElement,\n HTMLAttributes<HTMLHeadingElement>\n>(({ children, className, ...props }, ref) => {\n const { size, titleId, registerTitle } = useContext(EmptyStateContext);\n const callbackRef = useCallback(\n (node: HTMLHeadingElement | null) => {\n if (node) registerTitle();\n if (typeof ref === 'function') ref(node);\n else if (ref)\n (ref as { current: HTMLHeadingElement | null }).current = node;\n },\n [ref, registerTitle],\n );\n return (\n <h3\n ref={callbackRef}\n id={titleId}\n className={titleVariants({ size, className })}\n {...props}\n >\n {children}\n </h3>\n );\n});\nEmptyStateTitle.displayName = 'EmptyState.Title';\n\nconst EmptyStateDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ children, className, ...props }, ref) => {\n const { size } = useContext(EmptyStateContext);\n return (\n <p\n ref={ref}\n className={descriptionVariants({ size, className })}\n {...props}\n >\n {children}\n </p>\n );\n});\nEmptyStateDescription.displayName = 'EmptyState.Description';\n\nconst actionsVariants = cva(\n 'ds:flex ds:flex-row ds:flex-wrap ds:items-center ds:justify-center ds:gap-[var(--spacing-md)]',\n);\n\nconst EmptyStateActions = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ children, className, ...props }, ref) => (\n <div ref={ref} className={actionsVariants({ className })} {...props}>\n {children}\n </div>\n));\nEmptyStateActions.displayName = 'EmptyState.Actions';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface EmptyStateProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'title'>,\n VariantProps<typeof emptyStateVariants> {\n variant: 'first-use' | 'no-results' | 'error';\n size?: 'sm' | 'md' | 'lg';\n title?: string;\n description?: string;\n primaryAction?: { label: string; onClick: () => void };\n secondaryAction?: { label: string; onClick: () => void; href?: string };\n autoFocus?: boolean;\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nconst EmptyStateRoot = forwardRef<HTMLDivElement, EmptyStateProps>(\n (\n {\n variant,\n size = 'md',\n title,\n description,\n primaryAction,\n secondaryAction,\n autoFocus = false,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const titleId = useId();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [hasTitle, setHasTitle] = useState(false);\n const registerTitle = useCallback(() => setHasTitle(true), []);\n\n useEffect(() => {\n if (!autoFocus) return;\n const firstBtn = containerRef.current?.querySelector<HTMLElement>(\n 'button:not([disabled]), a[href]',\n );\n firstBtn?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const roleProps =\n variant === 'no-results'\n ? { role: 'status' as const, 'aria-live': 'polite' as const }\n : { role: 'region' as const };\n\n const defaultTitle =\n variant === 'first-use'\n ? t('emptyState.firstUse.title')\n : variant === 'no-results'\n ? t('emptyState.noResults.title')\n : t('emptyState.error.title');\n\n const defaultDescription =\n variant === 'first-use'\n ? t('emptyState.firstUse.description')\n : variant === 'no-results'\n ? t('emptyState.noResults.description')\n : t('emptyState.error.description');\n\n const defaultCtaLabel =\n variant === 'first-use'\n ? t('emptyState.firstUse.cta')\n : variant === 'no-results'\n ? t('emptyState.noResults.cta')\n : t('emptyState.error.cta');\n\n const buttonSize = size === 'sm' ? ('sm' as const) : ('md' as const);\n\n const safeHref = (href: string) =>\n /^(https?:\\/\\/|\\/|#)/.test(href) ? href : '#';\n\n return (\n <EmptyStateContext.Provider\n value={{ size, variant, titleId, registerTitle }}\n >\n <div\n ref={(node) => {\n containerRef.current = node;\n setRef(ref, node);\n }}\n aria-labelledby={hasTitle || !children ? titleId : undefined}\n {...roleProps}\n className={emptyStateVariants({ size, className })}\n data-component=\"empty-state\"\n {...props}\n >\n {children ?? (\n <>\n <EmptyStateIllustration>\n {variant === 'first-use' && <FirstUseIllustration />}\n {variant === 'no-results' && <NoResultsIllustration />}\n {variant === 'error' && <ErrorIllustration />}\n </EmptyStateIllustration>\n <EmptyStateTitle>{title ?? defaultTitle}</EmptyStateTitle>\n <EmptyStateDescription>\n {description ?? defaultDescription}\n </EmptyStateDescription>\n {(primaryAction || secondaryAction) && (\n <EmptyStateActions>\n {primaryAction && (\n <Button\n intent=\"primary\"\n size={buttonSize}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label ?? defaultCtaLabel}\n </Button>\n )}\n {secondaryAction &&\n (secondaryAction.href ? (\n <Button intent=\"ghost\" size={buttonSize} asChild>\n <a\n href={safeHref(secondaryAction.href!)}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </a>\n </Button>\n ) : (\n <Button\n intent=\"ghost\"\n size={buttonSize}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n ))}\n </EmptyStateActions>\n )}\n </>\n )}\n </div>\n </EmptyStateContext.Provider>\n );\n },\n);\nEmptyStateRoot.displayName = 'EmptyState';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const EmptyState = Object.assign(EmptyStateRoot, {\n Illustration: EmptyStateIllustration,\n Title: EmptyStateTitle,\n Description: EmptyStateDescription,\n Actions: EmptyStateActions,\n});\n"],"names":["setRef","ref","value","EmptyStateContext","createContext","emptyStateVariants","cva","illustrationVariants","titleVariants","descriptionVariants","FirstUseIllustration","jsxs","jsx","NoResultsIllustration","ErrorIllustration","EmptyStateIllustration","forwardRef","children","className","props","size","useContext","EmptyStateTitle","titleId","registerTitle","callbackRef","useCallback","node","EmptyStateDescription","actionsVariants","EmptyStateActions","EmptyStateRoot","variant","title","description","primaryAction","secondaryAction","autoFocus","t","useTranslation","useId","containerRef","useRef","hasTitle","setHasTitle","useState","useEffect","firstBtn","_a","roleProps","defaultTitle","defaultDescription","defaultCtaLabel","buttonSize","safeHref","href","Fragment","Button","EmptyState"],"mappings":"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"}
1
+ {"version":3,"file":"empty-state-Ck1wVWdN.js","sources":["../../src/components/empty-state/empty-state.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '../button/button';\n\n/* ------------------------------------------------------------------ */\n/* Ref helper */\n/* ------------------------------------------------------------------ */\n\nfunction setRef<T>(ref: Ref<T>, value: T | null) {\n if (!ref) return;\n if (typeof ref === 'function') ref(value);\n else (ref as { current: T | null }).current = value;\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface EmptyStateContextValue {\n size: 'sm' | 'md' | 'lg';\n variant: 'first-use' | 'no-results' | 'error';\n titleId: string;\n registerTitle: () => void;\n}\n\nconst EmptyStateContext = createContext<EmptyStateContextValue>({\n size: 'md',\n variant: 'first-use',\n titleId: '',\n registerTitle: () => {},\n});\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst emptyStateVariants = cva(\n 'ds:flex ds:flex-col ds:items-center ds:text-center ds:max-w-md ds:ms-auto ds:me-auto ds:w-full',\n {\n variants: {\n size: {\n sm: 'ds:p-[var(--spacing-md)] ds:gap-[var(--spacing-sm)]',\n md: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-md)]',\n lg: 'ds:p-[var(--spacing-lg)] ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst illustrationVariants = cva(\n 'ds:flex ds:items-center ds:justify-center ds:flex-shrink-0',\n {\n variants: {\n size: {\n sm: 'ds:w-[80px] ds:h-[80px]',\n md: 'ds:w-[160px] ds:h-[160px]',\n lg: 'ds:w-[240px] ds:h-[240px]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst titleVariants = cva('type-title-card ds:text-[var(--foreground)]', {\n variants: {\n size: {\n sm: 'ds:[--type-title-card-size:var(--font-size-sm)]',\n md: '',\n lg: 'ds:[--type-title-card-size:var(--font-size-xl)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\nconst descriptionVariants = cva(\n 'type-body-sm ds:text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'ds:[--type-body-sm-size:var(--font-size-xs)]',\n md: '',\n lg: 'ds:[--type-body-sm-size:var(--font-size-base)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Built-in illustrations */\n/* ------------------------------------------------------------------ */\n\nfunction FirstUseIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <circle\n cx=\"60\"\n cy=\"60\"\n r=\"50\"\n fill=\"var(--muted)\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth=\"2\"\n />\n <rect x=\"55\" y=\"30\" width=\"10\" height=\"60\" rx=\"5\" fill=\"var(--primary)\" />\n <rect x=\"30\" y=\"55\" width=\"60\" height=\"10\" rx=\"5\" fill=\"var(--accent)\" />\n </svg>\n );\n}\n\nfunction NoResultsIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <circle cx=\"52\" cy=\"52\" r=\"28\" stroke=\"var(--muted)\" strokeWidth=\"6\" />\n <line\n x1=\"72\"\n y1=\"72\"\n x2=\"92\"\n y2=\"92\"\n stroke=\"var(--muted)\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"42\"\n y1=\"52\"\n x2=\"62\"\n y2=\"52\"\n stroke=\"var(--muted-foreground)\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction ErrorIllustration() {\n return (\n <svg\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"ds:w-full ds:h-full\"\n >\n <path\n d=\"M60 15 L110 95 H10 Z\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.1\"\n stroke=\"var(--destructive)\"\n strokeOpacity=\"0.4\"\n strokeWidth=\"3\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"56\"\n y=\"45\"\n width=\"8\"\n height=\"26\"\n rx=\"4\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.6\"\n />\n <circle\n cx=\"60\"\n cy=\"82\"\n r=\"5\"\n fill=\"var(--destructive)\"\n fillOpacity=\"0.6\"\n />\n </svg>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Subcomponents */\n/* ------------------------------------------------------------------ */\n\nconst EmptyStateIllustration = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ children, className, ...props }, ref) => {\n const { size } = useContext(EmptyStateContext);\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={illustrationVariants({ size, className })}\n {...props}\n >\n {children}\n </div>\n );\n});\nEmptyStateIllustration.displayName = 'EmptyState.Illustration';\n\nconst EmptyStateTitle = forwardRef<\n HTMLHeadingElement,\n HTMLAttributes<HTMLHeadingElement>\n>(({ children, className, ...props }, ref) => {\n const { size, titleId, registerTitle } = useContext(EmptyStateContext);\n const callbackRef = useCallback(\n (node: HTMLHeadingElement | null) => {\n if (node) registerTitle();\n if (typeof ref === 'function') ref(node);\n else if (ref)\n (ref as { current: HTMLHeadingElement | null }).current = node;\n },\n [ref, registerTitle],\n );\n return (\n <h3\n ref={callbackRef}\n id={titleId}\n className={titleVariants({ size, className })}\n {...props}\n >\n {children}\n </h3>\n );\n});\nEmptyStateTitle.displayName = 'EmptyState.Title';\n\nconst EmptyStateDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ children, className, ...props }, ref) => {\n const { size } = useContext(EmptyStateContext);\n return (\n <p\n ref={ref}\n className={descriptionVariants({ size, className })}\n {...props}\n >\n {children}\n </p>\n );\n});\nEmptyStateDescription.displayName = 'EmptyState.Description';\n\nconst actionsVariants = cva(\n 'ds:flex ds:flex-row ds:flex-wrap ds:items-center ds:justify-center ds:gap-[var(--spacing-md)]',\n);\n\nconst EmptyStateActions = forwardRef<\n HTMLDivElement,\n HTMLAttributes<HTMLDivElement>\n>(({ children, className, ...props }, ref) => (\n <div ref={ref} className={actionsVariants({ className })} {...props}>\n {children}\n </div>\n));\nEmptyStateActions.displayName = 'EmptyState.Actions';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface EmptyStateProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'title'>,\n VariantProps<typeof emptyStateVariants> {\n variant: 'first-use' | 'no-results' | 'error';\n size?: 'sm' | 'md' | 'lg';\n title?: string;\n description?: string;\n primaryAction?: { label: string; onClick: () => void };\n secondaryAction?: { label: string; onClick: () => void; href?: string };\n autoFocus?: boolean;\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nconst EmptyStateRoot = forwardRef<HTMLDivElement, EmptyStateProps>(\n (\n {\n variant,\n size = 'md',\n title,\n description,\n primaryAction,\n secondaryAction,\n autoFocus = false,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const titleId = useId();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [hasTitle, setHasTitle] = useState(false);\n const registerTitle = useCallback(() => setHasTitle(true), []);\n\n useEffect(() => {\n if (!autoFocus) return;\n const firstBtn = containerRef.current?.querySelector<HTMLElement>(\n 'button:not([disabled]), a[href]',\n );\n firstBtn?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const roleProps =\n variant === 'no-results'\n ? { role: 'status' as const, 'aria-live': 'polite' as const }\n : { role: 'region' as const };\n\n const defaultTitle =\n variant === 'first-use'\n ? t('emptyState.firstUse.title')\n : variant === 'no-results'\n ? t('emptyState.noResults.title')\n : t('emptyState.error.title');\n\n const defaultDescription =\n variant === 'first-use'\n ? t('emptyState.firstUse.description')\n : variant === 'no-results'\n ? t('emptyState.noResults.description')\n : t('emptyState.error.description');\n\n const defaultCtaLabel =\n variant === 'first-use'\n ? t('emptyState.firstUse.cta')\n : variant === 'no-results'\n ? t('emptyState.noResults.cta')\n : t('emptyState.error.cta');\n\n const buttonSize = size === 'sm' ? ('sm' as const) : ('md' as const);\n\n const safeHref = (href: string) =>\n /^(https?:\\/\\/|\\/|#)/.test(href) ? href : '#';\n\n return (\n <EmptyStateContext.Provider\n value={{ size, variant, titleId, registerTitle }}\n >\n <div\n ref={(node) => {\n containerRef.current = node;\n setRef(ref, node);\n }}\n aria-labelledby={hasTitle || !children ? titleId : undefined}\n {...roleProps}\n className={emptyStateVariants({ size, className })}\n data-component=\"empty-state\"\n {...props}\n >\n {children ?? (\n <>\n <EmptyStateIllustration>\n {variant === 'first-use' && <FirstUseIllustration />}\n {variant === 'no-results' && <NoResultsIllustration />}\n {variant === 'error' && <ErrorIllustration />}\n </EmptyStateIllustration>\n <EmptyStateTitle>{title ?? defaultTitle}</EmptyStateTitle>\n <EmptyStateDescription>\n {description ?? defaultDescription}\n </EmptyStateDescription>\n {(primaryAction || secondaryAction) && (\n <EmptyStateActions>\n {primaryAction && (\n <Button\n intent=\"primary\"\n size={buttonSize}\n onClick={primaryAction.onClick}\n >\n {primaryAction.label ?? defaultCtaLabel}\n </Button>\n )}\n {secondaryAction &&\n (secondaryAction.href ? (\n <Button intent=\"ghost\" size={buttonSize} asChild>\n <a\n href={safeHref(secondaryAction.href!)}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </a>\n </Button>\n ) : (\n <Button\n intent=\"ghost\"\n size={buttonSize}\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </Button>\n ))}\n </EmptyStateActions>\n )}\n </>\n )}\n </div>\n </EmptyStateContext.Provider>\n );\n },\n);\nEmptyStateRoot.displayName = 'EmptyState';\n\n/* ------------------------------------------------------------------ */\n/* Compound export */\n/* ------------------------------------------------------------------ */\n\nexport const EmptyState = Object.assign(EmptyStateRoot, {\n Illustration: EmptyStateIllustration,\n Title: EmptyStateTitle,\n Description: EmptyStateDescription,\n Actions: EmptyStateActions,\n});\n"],"names":["setRef","ref","value","EmptyStateContext","createContext","emptyStateVariants","cva","illustrationVariants","titleVariants","descriptionVariants","FirstUseIllustration","jsxs","jsx","NoResultsIllustration","ErrorIllustration","EmptyStateIllustration","forwardRef","children","className","props","size","useContext","EmptyStateTitle","titleId","registerTitle","callbackRef","useCallback","node","EmptyStateDescription","actionsVariants","EmptyStateActions","EmptyStateRoot","variant","title","description","primaryAction","secondaryAction","autoFocus","t","useTranslation","useId","containerRef","useRef","hasTitle","setHasTitle","useState","useEffect","firstBtn","_a","roleProps","defaultTitle","defaultDescription","defaultCtaLabel","buttonSize","safeHref","href","Fragment","Button","EmptyState"],"mappings":"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"}
@@ -3,8 +3,8 @@ import { forwardRef as q, useId as w, useRef as f, useImperativeHandle as K, use
3
3
  import { useTranslation as D } from "react-i18next";
4
4
  import { A as I } from "./alert-CiQ5Pa3Q.js";
5
5
  import { A as H } from "./avatar-BVvjKNTp.js";
6
- import { B as $ } from "./button-18oBsI3n.js";
7
- import { I as O } from "./icon-button-CY7GU_Se.js";
6
+ import { B as $ } from "./button-CYPx2xFq.js";
7
+ import { I as O } from "./icon-button-JAXAkqWC.js";
8
8
  import { C } from "./card-DPmk26CL.js";
9
9
  import { L as F } from "./link-CPb_pZPr.js";
10
10
  import { P as G } from "./panel-header-D_mTdhUp.js";
@@ -274,4 +274,4 @@ function ae({ section: t }) {
274
274
  export {
275
275
  be as E
276
276
  };
277
- //# sourceMappingURL=entity-summary-CFJfBdVP.js.map
277
+ //# sourceMappingURL=entity-summary-Cvs21xPr.js.map