@alfadocs/ui-kit 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/dist/_chunks/{accordion-BJD1aM67.js → accordion-B6fyINUk.js} +10 -9
  2. package/dist/_chunks/accordion-B6fyINUk.js.map +1 -0
  3. package/dist/_chunks/{agenda-card-DXOgg8IX.js → agenda-card-C_hQGErS.js} +12 -11
  4. package/dist/_chunks/{agenda-card-DXOgg8IX.js.map → agenda-card-C_hQGErS.js.map} +1 -1
  5. package/dist/_chunks/{agenda-tray-DEO8XL8V.js → agenda-tray-CBaVMJLO.js} +6 -5
  6. package/dist/_chunks/{agenda-tray-DEO8XL8V.js.map → agenda-tray-CBaVMJLO.js.map} +1 -1
  7. package/dist/_chunks/{ai-prompt-input-8IShJ-GX.js → ai-prompt-input-K94oVLG2.js} +17 -16
  8. package/dist/_chunks/ai-prompt-input-K94oVLG2.js.map +1 -0
  9. package/dist/_chunks/{alert-ETrF7Q8J.js → alert-rOM4EG0P.js} +12 -11
  10. package/dist/_chunks/{alert-ETrF7Q8J.js.map → alert-rOM4EG0P.js.map} +1 -1
  11. package/dist/_chunks/{app-frame-uq2Gy0vs.js → app-frame-6d7Lu4ea.js} +2 -1
  12. package/dist/_chunks/{app-frame-uq2Gy0vs.js.map → app-frame-6d7Lu4ea.js.map} +1 -1
  13. package/dist/_chunks/{aspect-ratio-BqU4itGW.js → aspect-ratio-CxsdG8vk.js} +9 -8
  14. package/dist/_chunks/{aspect-ratio-BqU4itGW.js.map → aspect-ratio-CxsdG8vk.js.map} +1 -1
  15. package/dist/_chunks/{audio-recorder-BvisG0Wt.js → audio-recorder-Cn8z2zC9.js} +6 -5
  16. package/dist/_chunks/{audio-recorder-BvisG0Wt.js.map → audio-recorder-Cn8z2zC9.js.map} +1 -1
  17. package/dist/_chunks/{audio-visualiser-B4u4goV5.js → audio-visualiser-CeMPCZkd.js} +2 -1
  18. package/dist/_chunks/{audio-visualiser-B4u4goV5.js.map → audio-visualiser-CeMPCZkd.js.map} +1 -1
  19. package/dist/_chunks/{autocomplete.agent-BmrpzsfW.js → autocomplete.agent-DRrp-Rsx.js} +3 -2
  20. package/dist/_chunks/{autocomplete.agent-BmrpzsfW.js.map → autocomplete.agent-DRrp-Rsx.js.map} +1 -1
  21. package/dist/_chunks/{avatar-DTQY5qIZ.js → avatar-Biffh-_H.js} +2 -1
  22. package/dist/_chunks/{avatar-DTQY5qIZ.js.map → avatar-Biffh-_H.js.map} +1 -1
  23. package/dist/_chunks/{badge-BbbBRweN.js → badge-mrstWxve.js} +14 -13
  24. package/dist/_chunks/{badge-BbbBRweN.js.map → badge-mrstWxve.js.map} +1 -1
  25. package/dist/_chunks/{balance-cell-renderer-DjR0rPS6.js → balance-cell-renderer-CiyezQhi.js} +11 -11
  26. package/dist/_chunks/{balance-cell-renderer-DjR0rPS6.js.map → balance-cell-renderer-CiyezQhi.js.map} +1 -1
  27. package/dist/_chunks/{breadcrumb-pdUacgm1.js → breadcrumb-CcZovmIq.js} +2 -1
  28. package/dist/_chunks/breadcrumb-CcZovmIq.js.map +1 -0
  29. package/dist/_chunks/{button-group-BtTHSyU0.js → button-group-CONver7M.js} +9 -8
  30. package/dist/_chunks/{button-group-BtTHSyU0.js.map → button-group-CONver7M.js.map} +1 -1
  31. package/dist/_chunks/{card-DeItIBcV.js → card-BEy58ZKp.js} +2 -1
  32. package/dist/_chunks/card-BEy58ZKp.js.map +1 -0
  33. package/dist/_chunks/{chat-container-ChdJTH0J.js → chat-container-BZvQ3_yT.js} +2 -2
  34. package/dist/_chunks/{chat-container-ChdJTH0J.js.map → chat-container-BZvQ3_yT.js.map} +1 -1
  35. package/dist/_chunks/{chat-input-C-B4snVJ.js → chat-input-xiBIujMv.js} +3 -3
  36. package/dist/_chunks/chat-input-xiBIujMv.js.map +1 -0
  37. package/dist/_chunks/{chat-message-cFNbQYRH.js → chat-message-BtxUyugB.js} +9 -8
  38. package/dist/_chunks/chat-message-BtxUyugB.js.map +1 -0
  39. package/dist/_chunks/{checkbox-DMzgtnqw.js → checkbox-Ni6C_KJg.js} +11 -11
  40. package/dist/_chunks/{checkbox-DMzgtnqw.js.map → checkbox-Ni6C_KJg.js.map} +1 -1
  41. package/dist/_chunks/{checkbox-group-DBnIBRT_.js → checkbox-group-BFZ4oN5t.js} +8 -7
  42. package/dist/_chunks/checkbox-group-BFZ4oN5t.js.map +1 -0
  43. package/dist/_chunks/{collapsible-DPGQnHZh.js → collapsible-fFMqzpdL.js} +8 -7
  44. package/dist/_chunks/collapsible-fFMqzpdL.js.map +1 -0
  45. package/dist/_chunks/{color-picker-DkMFcK2m.js → color-picker-Cl3KdjJd.js} +18 -16
  46. package/dist/_chunks/{color-picker-DkMFcK2m.js.map → color-picker-Cl3KdjJd.js.map} +1 -1
  47. package/dist/_chunks/{combobox.agent-9w6W1Jct.js → combobox.agent-DjdivI3X.js} +2 -1
  48. package/dist/_chunks/combobox.agent-DjdivI3X.js.map +1 -0
  49. package/dist/_chunks/{command-palette.agent-Dg7jhOIc.js → command-palette.agent-BUjzr2ET.js} +2 -1
  50. package/dist/_chunks/command-palette.agent-BUjzr2ET.js.map +1 -0
  51. package/dist/_chunks/{date-picker-0WQ98ZC0.js → date-picker-DYXNsWmM.js} +2 -2
  52. package/dist/_chunks/{date-picker-0WQ98ZC0.js.map → date-picker-DYXNsWmM.js.map} +1 -1
  53. package/dist/_chunks/{date-range-picker-CtwEwoyr.js → date-range-picker-BcNDJI7m.js} +2 -2
  54. package/dist/_chunks/date-range-picker-BcNDJI7m.js.map +1 -0
  55. package/dist/_chunks/{date-time-picker-Df3OJ2_C.js → date-time-picker-CmGiTU__.js} +3 -3
  56. package/dist/_chunks/{date-time-picker-Df3OJ2_C.js.map → date-time-picker-CmGiTU__.js.map} +1 -1
  57. package/dist/_chunks/{description-list-Bk3p71qY.js → description-list-C_1NX8P3.js} +3 -2
  58. package/dist/_chunks/description-list-C_1NX8P3.js.map +1 -0
  59. package/dist/_chunks/{dialog.agent-CtMkDinJ.js → dialog.agent-C2lP9H0h.js} +2 -2
  60. package/dist/_chunks/{dialog.agent-CtMkDinJ.js.map → dialog.agent-C2lP9H0h.js.map} +1 -1
  61. package/dist/_chunks/{dropdown-menu-BnVUeVG3.js → dropdown-menu-2HgU1Emf.js} +4 -3
  62. package/dist/_chunks/dropdown-menu-2HgU1Emf.js.map +1 -0
  63. package/dist/_chunks/{empty-state-DPUnQp0A.js → empty-state-BHrItOiE.js} +2 -1
  64. package/dist/_chunks/{empty-state-DPUnQp0A.js.map → empty-state-BHrItOiE.js.map} +1 -1
  65. package/dist/_chunks/{file-upload.agent-DVMxMeDA.js → file-upload.agent-LlC0W468.js} +2 -2
  66. package/dist/_chunks/{file-upload.agent-DVMxMeDA.js.map → file-upload.agent-LlC0W468.js.map} +1 -1
  67. package/dist/_chunks/{flag-C3BUEwHH.js → flag-DZ6V7-hU.js} +3 -1
  68. package/dist/_chunks/{flag-C3BUEwHH.js.map → flag-DZ6V7-hU.js.map} +1 -1
  69. package/dist/_chunks/{floating-action-button-DjRhFQdd.js → floating-action-button-Cnw-f6AG.js} +5 -4
  70. package/dist/_chunks/{floating-action-button-DjRhFQdd.js.map → floating-action-button-Cnw-f6AG.js.map} +1 -1
  71. package/dist/_chunks/{form-field-DI5LY5aG.js → form-field-BfsPLTSc.js} +2 -1
  72. package/dist/_chunks/form-field-BfsPLTSc.js.map +1 -0
  73. package/dist/_chunks/{freemium-paywall-CCsX3GhK.js → freemium-paywall-Dr9aOtOC.js} +23 -22
  74. package/dist/_chunks/freemium-paywall-Dr9aOtOC.js.map +1 -0
  75. package/dist/_chunks/{header-CVQxeLc_.js → header-BpU9U-1X.js} +3 -2
  76. package/dist/_chunks/{header-CVQxeLc_.js.map → header-BpU9U-1X.js.map} +1 -1
  77. package/dist/_chunks/{icon-button-SWpSs9S6.js → icon-button-CNjWCD1X.js} +9 -8
  78. package/dist/_chunks/icon-button-CNjWCD1X.js.map +1 -0
  79. package/dist/_chunks/{icon-button-group-BnhkUWUg.js → icon-button-group-DeV3FpNY.js} +26 -25
  80. package/dist/_chunks/{icon-button-group-BnhkUWUg.js.map → icon-button-group-DeV3FpNY.js.map} +1 -1
  81. package/dist/_chunks/{kbd-DTcIjYA7.js → kbd-8baVw3KU.js} +35 -31
  82. package/dist/_chunks/kbd-8baVw3KU.js.map +1 -0
  83. package/dist/_chunks/{key-value-pair-Cm-pSE6k.js → key-value-pair-C9hpjC_B.js} +13 -12
  84. package/dist/_chunks/{key-value-pair-Cm-pSE6k.js.map → key-value-pair-C9hpjC_B.js.map} +1 -1
  85. package/dist/_chunks/{leo-sidebar-SqGAp1vx.js → leo-sidebar-CNjZqljo.js} +11 -11
  86. package/dist/_chunks/{leo-sidebar-SqGAp1vx.js.map → leo-sidebar-CNjZqljo.js.map} +1 -1
  87. package/dist/_chunks/{list-Cwe8mcmh.js → list-B1ozIjQe.js} +4 -1
  88. package/dist/_chunks/list-B1ozIjQe.js.map +1 -0
  89. package/dist/_chunks/live-region-C41SO3cA.js +58 -0
  90. package/dist/_chunks/{live-region-COggO6x6.js.map → live-region-C41SO3cA.js.map} +1 -1
  91. package/dist/_chunks/{logo-3wrZGpwg.js → logo-BpFoCL-s.js} +7 -7
  92. package/dist/_chunks/{logo-3wrZGpwg.js.map → logo-BpFoCL-s.js.map} +1 -1
  93. package/dist/_chunks/{matrix-rain-gsHqSvW7.js → matrix-rain-BEkvux64.js} +2 -1
  94. package/dist/_chunks/{matrix-rain-gsHqSvW7.js.map → matrix-rain-BEkvux64.js.map} +1 -1
  95. package/dist/_chunks/{message-card-B0oGrI3i.js → message-card-CZzNO4ov.js} +5 -4
  96. package/dist/_chunks/message-card-CZzNO4ov.js.map +1 -0
  97. package/dist/_chunks/{message-tray-DZ6oZ0cs.js → message-tray-BWbjXW3F.js} +6 -5
  98. package/dist/_chunks/message-tray-BWbjXW3F.js.map +1 -0
  99. package/dist/_chunks/{multi-select.agent-BDEVGMmW.js → multi-select.agent-BSGEW10d.js} +19 -18
  100. package/dist/_chunks/multi-select.agent-BSGEW10d.js.map +1 -0
  101. package/dist/_chunks/{navigation-menu-NjwxyshT.js → navigation-menu-DxOMvrKM.js} +2 -1
  102. package/dist/_chunks/navigation-menu-DxOMvrKM.js.map +1 -0
  103. package/dist/_chunks/{notification-card-C73GqjHH.js → notification-card-DgW-vVg-.js} +4 -3
  104. package/dist/_chunks/{notification-card-C73GqjHH.js.map → notification-card-DgW-vVg-.js.map} +1 -1
  105. package/dist/_chunks/{notification-tray-a8a_nut-.js → notification-tray-CKUgl2jc.js} +6 -5
  106. package/dist/_chunks/{notification-tray-a8a_nut-.js.map → notification-tray-CKUgl2jc.js.map} +1 -1
  107. package/dist/_chunks/{number-input-DFQtl5K2.js → number-input-BPPhekLu.js} +16 -15
  108. package/dist/_chunks/{number-input-DFQtl5K2.js.map → number-input-BPPhekLu.js.map} +1 -1
  109. package/dist/_chunks/{otp-input-C2FdizHh.js → otp-input-De5_Ih7B.js} +2 -1
  110. package/dist/_chunks/{otp-input-C2FdizHh.js.map → otp-input-De5_Ih7B.js.map} +1 -1
  111. package/dist/_chunks/{pagination.agent-sxokDphY.js → pagination.agent-CmA0Ocr5.js} +2 -1
  112. package/dist/_chunks/pagination.agent-CmA0Ocr5.js.map +1 -0
  113. package/dist/_chunks/{password-input-C6PvKyQV.js → password-input-DAT5HQth.js} +7 -7
  114. package/dist/_chunks/password-input-DAT5HQth.js.map +1 -0
  115. package/dist/_chunks/{patient-shell-B4vKnuOf.js → patient-shell-BzHhg6uA.js} +9 -9
  116. package/dist/_chunks/{patient-shell-B4vKnuOf.js.map → patient-shell-BzHhg6uA.js.map} +1 -1
  117. package/dist/_chunks/{payment-form-175AzK-1.js → payment-form-YlxrCpZQ.js} +3 -3
  118. package/dist/_chunks/{payment-form-175AzK-1.js.map → payment-form-YlxrCpZQ.js.map} +1 -1
  119. package/dist/_chunks/{pdf-viewer.agent-DuGfSoep.js → pdf-viewer.agent-sMned5Xn.js} +3 -3
  120. package/dist/_chunks/{pdf-viewer.agent-DuGfSoep.js.map → pdf-viewer.agent-sMned5Xn.js.map} +1 -1
  121. package/dist/_chunks/{phone-input-BavVyXxZ.js → phone-input-BuRe5PyI.js} +3 -2
  122. package/dist/_chunks/phone-input-BuRe5PyI.js.map +1 -0
  123. package/dist/_chunks/{popover-BWgOopjI.js → popover-Ds1iOdiv.js} +3 -2
  124. package/dist/_chunks/popover-Ds1iOdiv.js.map +1 -0
  125. package/dist/_chunks/{privacy-lock-DWL7m_VT.js → privacy-lock-KEruBpM1.js} +16 -15
  126. package/dist/_chunks/privacy-lock-KEruBpM1.js.map +1 -0
  127. package/dist/_chunks/{radio-B_gvGU29.js → radio-XSSNX3Af.js} +8 -7
  128. package/dist/_chunks/radio-XSSNX3Af.js.map +1 -0
  129. package/dist/_chunks/{radio-group-Bn8Wt0yc.js → radio-group-DBrUOPcy.js} +19 -18
  130. package/dist/_chunks/radio-group-DBrUOPcy.js.map +1 -0
  131. package/dist/_chunks/{scroll-area-Ba99pJ_R.js → scroll-area-HIq0hJyJ.js} +14 -12
  132. package/dist/_chunks/scroll-area-HIq0hJyJ.js.map +1 -0
  133. package/dist/_chunks/{search-bar-VoTqJhRp.js → search-bar-9Zbew4yM.js} +4 -3
  134. package/dist/_chunks/search-bar-9Zbew4yM.js.map +1 -0
  135. package/dist/_chunks/{search-input-D6rarD0_.js → search-input-CtkWITO2.js} +28 -28
  136. package/dist/_chunks/{search-input-D6rarD0_.js.map → search-input-CtkWITO2.js.map} +1 -1
  137. package/dist/_chunks/{select-CQxhOXVE.js → select-DdAOtomN.js} +18 -17
  138. package/dist/_chunks/select-DdAOtomN.js.map +1 -0
  139. package/dist/_chunks/{separator-BRQHi8s0.js → separator-B4wXDLNC.js} +9 -8
  140. package/dist/_chunks/{separator-BRQHi8s0.js.map → separator-B4wXDLNC.js.map} +1 -1
  141. package/dist/_chunks/{sheet-CKsuHuHB.js → sheet-D7GRhnWw.js} +3 -2
  142. package/dist/_chunks/sheet-D7GRhnWw.js.map +1 -0
  143. package/dist/_chunks/{sidebar-CiEpSH9e.js → sidebar-Dc2ffrbf.js} +4 -3
  144. package/dist/_chunks/sidebar-Dc2ffrbf.js.map +1 -0
  145. package/dist/_chunks/sign-in-with-alfadocs-button-BotwPDcW.js +45 -0
  146. package/dist/_chunks/{sign-in-with-alfadocs-button-BDErAgG2.js.map → sign-in-with-alfadocs-button-BotwPDcW.js.map} +1 -1
  147. package/dist/_chunks/{skeleton-ClO1v5GE.js → skeleton-DAdPFx9d.js} +18 -16
  148. package/dist/_chunks/{skeleton-ClO1v5GE.js.map → skeleton-DAdPFx9d.js.map} +1 -1
  149. package/dist/_chunks/{skip-link-CASJkBOe.js → skip-link-DmZ3c6cb.js} +12 -11
  150. package/dist/_chunks/{skip-link-CASJkBOe.js.map → skip-link-DmZ3c6cb.js.map} +1 -1
  151. package/dist/_chunks/{slider-BVBlOW_l.js → slider-DjyRt3Mp.js} +2 -1
  152. package/dist/_chunks/slider-DjyRt3Mp.js.map +1 -0
  153. package/dist/_chunks/{slot-grid-B4WvLEwT.js → slot-grid-WHc5A8-z.js} +5 -4
  154. package/dist/_chunks/{slot-grid-B4WvLEwT.js.map → slot-grid-WHc5A8-z.js.map} +1 -1
  155. package/dist/_chunks/{spinner-CoAOGcDa.js → spinner-GCcv67vh.js} +2 -1
  156. package/dist/_chunks/spinner-GCcv67vh.js.map +1 -0
  157. package/dist/_chunks/{stat-D76MNHzK.js → stat-DUB6g90R.js} +3 -1
  158. package/dist/_chunks/{stat-D76MNHzK.js.map → stat-DUB6g90R.js.map} +1 -1
  159. package/dist/_chunks/{stepper-accordion-DHQ80A4v.js → stepper-accordion-2_7Pw0tC.js} +2 -1
  160. package/dist/_chunks/{stepper-accordion-DHQ80A4v.js.map → stepper-accordion-2_7Pw0tC.js.map} +1 -1
  161. package/dist/_chunks/{stepper-calendar-BZUJpj8i.js → stepper-calendar-CWZcFgt_.js} +7 -6
  162. package/dist/_chunks/{stepper-calendar-BZUJpj8i.js.map → stepper-calendar-CWZcFgt_.js.map} +1 -1
  163. package/dist/_chunks/{stepper-progress-DMZ5w5VR.js → stepper-progress-rE7tn7WY.js} +12 -11
  164. package/dist/_chunks/{stepper-progress-DMZ5w5VR.js.map → stepper-progress-rE7tn7WY.js.map} +1 -1
  165. package/dist/_chunks/{streaming-text-D0cW8pwq.js → streaming-text-BgjCTVOw.js} +6 -5
  166. package/dist/_chunks/{streaming-text-D0cW8pwq.js.map → streaming-text-BgjCTVOw.js.map} +1 -1
  167. package/dist/_chunks/{suggestion-chip-BgNFpPEE.js → suggestion-chip-6AB40rxz.js} +2 -1
  168. package/dist/_chunks/{suggestion-chip-BgNFpPEE.js.map → suggestion-chip-6AB40rxz.js.map} +1 -1
  169. package/dist/_chunks/{switch-DtLPKO0p.js → switch-DhSORO9C.js} +2 -1
  170. package/dist/_chunks/{switch-DtLPKO0p.js.map → switch-DhSORO9C.js.map} +1 -1
  171. package/dist/_chunks/{tabs.agent-sQAHxebC.js → tabs.agent-BtaNGxRh.js} +3 -2
  172. package/dist/_chunks/tabs.agent-BtaNGxRh.js.map +1 -0
  173. package/dist/_chunks/{tag-CfSZZN2f.js → tag--uLKOb9f.js} +17 -14
  174. package/dist/_chunks/{tag-CfSZZN2f.js.map → tag--uLKOb9f.js.map} +1 -1
  175. package/dist/_chunks/{task-card-B5xfiFg5.js → task-card-BeSuntXP.js} +11 -10
  176. package/dist/_chunks/{task-card-B5xfiFg5.js.map → task-card-BeSuntXP.js.map} +1 -1
  177. package/dist/_chunks/{task-tray-CWvVxWM0.js → task-tray-pRk6u8Ik.js} +10 -9
  178. package/dist/_chunks/{task-tray-CWvVxWM0.js.map → task-tray-pRk6u8Ik.js.map} +1 -1
  179. package/dist/_chunks/{text-area-iPDv7Nah.js → text-area-xf9-6iDf.js} +13 -13
  180. package/dist/_chunks/{text-area-iPDv7Nah.js.map → text-area-xf9-6iDf.js.map} +1 -1
  181. package/dist/_chunks/{text-input-lh6kRXZS.js → text-input-exh7VD7D.js} +10 -9
  182. package/dist/_chunks/{text-input-lh6kRXZS.js.map → text-input-exh7VD7D.js.map} +1 -1
  183. package/dist/_chunks/theme-root-DDb0TJjd.js +18 -0
  184. package/dist/_chunks/{theme-root-vapFjsnt.js.map → theme-root-DDb0TJjd.js.map} +1 -1
  185. package/dist/_chunks/{theme-toggle-CEaPghpm.js → theme-toggle-CJgA6G24.js} +42 -39
  186. package/dist/_chunks/theme-toggle-CJgA6G24.js.map +1 -0
  187. package/dist/_chunks/{time-picker-Crc87DU3.js → time-picker-D-EueWUG.js} +2 -1
  188. package/dist/_chunks/{time-picker-Crc87DU3.js.map → time-picker-D-EueWUG.js.map} +1 -1
  189. package/dist/_chunks/{timeline-Ym2DRmtu.js → timeline-DIueH4TJ.js} +5 -4
  190. package/dist/_chunks/timeline-DIueH4TJ.js.map +1 -0
  191. package/dist/_chunks/{timestamp-DmSt92P1.js → timestamp-BV2lC-wV.js} +2 -1
  192. package/dist/_chunks/{timestamp-DmSt92P1.js.map → timestamp-BV2lC-wV.js.map} +1 -1
  193. package/dist/_chunks/{toast-DoMNrzwm.js → toast-q0SlabGr.js} +2 -2
  194. package/dist/_chunks/{toast-DoMNrzwm.js.map → toast-q0SlabGr.js.map} +1 -1
  195. package/dist/_chunks/{tooltip-Dp3u8jGz.js → tooltip-DHik5yRI.js} +2 -1
  196. package/dist/_chunks/{tooltip-Dp3u8jGz.js.map → tooltip-DHik5yRI.js.map} +1 -1
  197. package/dist/_chunks/{transcript-panel-Bg1BTMSr.js → transcript-panel-DFnhbrlQ.js} +39 -38
  198. package/dist/_chunks/{transcript-panel-Bg1BTMSr.js.map → transcript-panel-DFnhbrlQ.js.map} +1 -1
  199. package/dist/_chunks/{typing-indicator-BRg22Rqr.js → typing-indicator-CbUBf-Dx.js} +9 -8
  200. package/dist/_chunks/{typing-indicator-BRg22Rqr.js.map → typing-indicator-CbUBf-Dx.js.map} +1 -1
  201. package/dist/_chunks/visually-hidden-BlkhaZWe.js +21 -0
  202. package/dist/_chunks/{visually-hidden-Y3jcdCv-.js.map → visually-hidden-BlkhaZWe.js.map} +1 -1
  203. package/dist/_chunks/{warning-stack-5KROOw9M.js → warning-stack-DCmO0R07.js} +25 -23
  204. package/dist/_chunks/warning-stack-DCmO0R07.js.map +1 -0
  205. package/dist/_chunks/{workflow-map-D4sjYv2d.js → workflow-map-CAM6Uy_J.js} +12 -9
  206. package/dist/_chunks/workflow-map-CAM6Uy_J.js.map +1 -0
  207. package/dist/components/accordion/accordion.d.ts.map +1 -1
  208. package/dist/components/accordion/index.js +1 -1
  209. package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
  210. package/dist/components/agenda-card/index.js +1 -1
  211. package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
  212. package/dist/components/agenda-tray/index.js +1 -1
  213. package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  214. package/dist/components/ai-prompt-input/index.js +1 -1
  215. package/dist/components/alert/alert.d.ts.map +1 -1
  216. package/dist/components/alert/index.js +1 -1
  217. package/dist/components/app-frame/app-frame.d.ts.map +1 -1
  218. package/dist/components/app-frame/index.js +1 -1
  219. package/dist/components/aspect-ratio/aspect-ratio.d.ts.map +1 -1
  220. package/dist/components/aspect-ratio/index.js +1 -1
  221. package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
  222. package/dist/components/audio-recorder/index.js +1 -1
  223. package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +1 -1
  224. package/dist/components/audio-visualiser/index.js +1 -1
  225. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  226. package/dist/components/autocomplete/index.js +1 -1
  227. package/dist/components/avatar/avatar.d.ts.map +1 -1
  228. package/dist/components/avatar/index.js +1 -1
  229. package/dist/components/badge/badge.d.ts.map +1 -1
  230. package/dist/components/badge/index.js +1 -1
  231. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
  232. package/dist/components/breadcrumb/index.js +1 -1
  233. package/dist/components/button/icon-button.d.ts.map +1 -1
  234. package/dist/components/button/index.js +1 -1
  235. package/dist/components/button-group/button-group.d.ts.map +1 -1
  236. package/dist/components/button-group/index.js +1 -1
  237. package/dist/components/card/card.d.ts.map +1 -1
  238. package/dist/components/card/index.js +1 -1
  239. package/dist/components/chat-container/index.js +1 -1
  240. package/dist/components/chat-input/index.js +1 -1
  241. package/dist/components/chat-message/chat-message.d.ts.map +1 -1
  242. package/dist/components/chat-message/index.js +1 -1
  243. package/dist/components/checkbox/index.js +1 -1
  244. package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
  245. package/dist/components/checkbox-group/index.js +1 -1
  246. package/dist/components/collapsible/collapsible.d.ts.map +1 -1
  247. package/dist/components/collapsible/index.js +1 -1
  248. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  249. package/dist/components/color-picker/index.js +1 -1
  250. package/dist/components/combobox/combobox.d.ts.map +1 -1
  251. package/dist/components/combobox/index.js +1 -1
  252. package/dist/components/command-palette/command-palette.d.ts.map +1 -1
  253. package/dist/components/command-palette/index.js +1 -1
  254. package/dist/components/data-table/index.js +1 -1
  255. package/dist/components/date-picker/index.js +1 -1
  256. package/dist/components/date-range-picker/index.js +1 -1
  257. package/dist/components/date-time-picker/index.js +1 -1
  258. package/dist/components/description-list/description-list.d.ts.map +1 -1
  259. package/dist/components/description-list/index.js +1 -1
  260. package/dist/components/dialog/index.js +1 -1
  261. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
  262. package/dist/components/dropdown-menu/index.js +1 -1
  263. package/dist/components/empty-state/empty-state.d.ts.map +1 -1
  264. package/dist/components/empty-state/index.js +1 -1
  265. package/dist/components/file-upload/index.js +1 -1
  266. package/dist/components/flag/flag.d.ts.map +1 -1
  267. package/dist/components/flag/index.js +1 -1
  268. package/dist/components/floating-action-button/floating-action-button.d.ts.map +1 -1
  269. package/dist/components/floating-action-button/index.js +1 -1
  270. package/dist/components/form-field/form-field.d.ts.map +1 -1
  271. package/dist/components/form-field/index.js +1 -1
  272. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  273. package/dist/components/freemium-paywall/index.js +1 -1
  274. package/dist/components/header/header.d.ts.map +1 -1
  275. package/dist/components/header/index.js +1 -1
  276. package/dist/components/icon-button/index.js +1 -1
  277. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  278. package/dist/components/icon-button-group/index.js +1 -1
  279. package/dist/components/kbd/index.js +1 -1
  280. package/dist/components/kbd/kbd.d.ts.map +1 -1
  281. package/dist/components/key-value-pair/index.js +1 -1
  282. package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
  283. package/dist/components/list/index.js +1 -1
  284. package/dist/components/list/list.d.ts.map +1 -1
  285. package/dist/components/live-region/index.js +1 -1
  286. package/dist/components/live-region/live-region.d.ts.map +1 -1
  287. package/dist/components/logo/index.js +1 -1
  288. package/dist/components/matrix-rain/index.js +1 -1
  289. package/dist/components/matrix-rain/matrix-rain.d.ts.map +1 -1
  290. package/dist/components/message-card/index.js +1 -1
  291. package/dist/components/message-card/message-card.d.ts.map +1 -1
  292. package/dist/components/message-tray/index.js +1 -1
  293. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  294. package/dist/components/multi-select/index.js +1 -1
  295. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  296. package/dist/components/navigation-menu/index.js +2 -2
  297. package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
  298. package/dist/components/notification-card/index.js +1 -1
  299. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  300. package/dist/components/notification-tray/index.js +1 -1
  301. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  302. package/dist/components/number-input/index.js +1 -1
  303. package/dist/components/number-input/number-input.d.ts.map +1 -1
  304. package/dist/components/otp-input/index.js +1 -1
  305. package/dist/components/otp-input/otp-input.d.ts.map +1 -1
  306. package/dist/components/pagination/index.js +1 -1
  307. package/dist/components/pagination/pagination.d.ts.map +1 -1
  308. package/dist/components/password-input/index.js +1 -1
  309. package/dist/components/payment-form/index.js +1 -1
  310. package/dist/components/pdf-viewer/index.js +1 -1
  311. package/dist/components/phone-input/index.js +1 -1
  312. package/dist/components/phone-input/phone-input.d.ts.map +1 -1
  313. package/dist/components/popover/index.js +1 -1
  314. package/dist/components/popover/popover.d.ts.map +1 -1
  315. package/dist/components/privacy-lock/index.js +1 -1
  316. package/dist/components/privacy-lock/privacy-lock.d.ts.map +1 -1
  317. package/dist/components/radio/index.js +1 -1
  318. package/dist/components/radio-group/index.js +2 -2
  319. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  320. package/dist/components/radio-group/radio.d.ts.map +1 -1
  321. package/dist/components/scroll-area/index.js +1 -1
  322. package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
  323. package/dist/components/search-bar/index.js +1 -1
  324. package/dist/components/search-input/index.js +1 -1
  325. package/dist/components/select/index.js +1 -1
  326. package/dist/components/select/select.d.ts.map +1 -1
  327. package/dist/components/separator/index.js +1 -1
  328. package/dist/components/separator/separator.d.ts.map +1 -1
  329. package/dist/components/sheet/index.js +1 -1
  330. package/dist/components/sheet/sheet.d.ts.map +1 -1
  331. package/dist/components/sidebar/index.js +1 -1
  332. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  333. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  334. package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts.map +1 -1
  335. package/dist/components/skeleton/index.js +1 -1
  336. package/dist/components/skeleton/skeleton.d.ts.map +1 -1
  337. package/dist/components/skip-link/index.js +1 -1
  338. package/dist/components/skip-link/skip-link.d.ts.map +1 -1
  339. package/dist/components/slider/index.js +1 -1
  340. package/dist/components/slider/slider.d.ts.map +1 -1
  341. package/dist/components/slot-grid/index.js +1 -1
  342. package/dist/components/slot-grid/slot-grid.d.ts.map +1 -1
  343. package/dist/components/spinner/index.js +1 -1
  344. package/dist/components/spinner/spinner.d.ts.map +1 -1
  345. package/dist/components/stat/index.js +1 -1
  346. package/dist/components/stat/stat.d.ts.map +1 -1
  347. package/dist/components/stepper-accordion/index.js +1 -1
  348. package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
  349. package/dist/components/stepper-calendar/index.js +1 -1
  350. package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +1 -1
  351. package/dist/components/stepper-progress/index.js +1 -1
  352. package/dist/components/stepper-progress/stepper-progress.d.ts.map +1 -1
  353. package/dist/components/streaming-text/index.js +1 -1
  354. package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
  355. package/dist/components/suggestion-chip/index.js +1 -1
  356. package/dist/components/suggestion-chip/suggestion-chip.d.ts.map +1 -1
  357. package/dist/components/switch/index.js +1 -1
  358. package/dist/components/switch/switch.d.ts.map +1 -1
  359. package/dist/components/tabs/index.js +1 -1
  360. package/dist/components/tabs/tabs.d.ts.map +1 -1
  361. package/dist/components/tag/index.js +1 -1
  362. package/dist/components/tag/tag.d.ts.map +1 -1
  363. package/dist/components/task-card/index.js +1 -1
  364. package/dist/components/task-card/task-card.d.ts.map +1 -1
  365. package/dist/components/task-tray/index.js +1 -1
  366. package/dist/components/task-tray/task-tray.d.ts.map +1 -1
  367. package/dist/components/text-area/index.js +1 -1
  368. package/dist/components/text-input/index.js +1 -1
  369. package/dist/components/text-input/text-input.d.ts.map +1 -1
  370. package/dist/components/theme-root/index.js +1 -1
  371. package/dist/components/theme-toggle/index.js +1 -1
  372. package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -1
  373. package/dist/components/time-picker/index.js +1 -1
  374. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  375. package/dist/components/timeline/index.js +1 -1
  376. package/dist/components/timeline/timeline.d.ts.map +1 -1
  377. package/dist/components/timestamp/index.js +1 -1
  378. package/dist/components/timestamp/timestamp.d.ts.map +1 -1
  379. package/dist/components/toast/index.js +1 -1
  380. package/dist/components/tooltip/index.js +1 -1
  381. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  382. package/dist/components/transcript-panel/index.js +1 -1
  383. package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
  384. package/dist/components/typing-indicator/index.js +1 -1
  385. package/dist/components/typing-indicator/typing-indicator.d.ts.map +1 -1
  386. package/dist/components/visually-hidden/index.js +1 -1
  387. package/dist/components/warning-stack/index.js +1 -1
  388. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  389. package/dist/components/workflow/index.js +1 -1
  390. package/dist/components/workflow/workflow-card.d.ts.map +1 -1
  391. package/dist/components/workflow/workflow-editor.d.ts.map +1 -1
  392. package/dist/components/workflow/workflow-map.d.ts.map +1 -1
  393. package/dist/index.js +103 -103
  394. package/dist/patterns/leo-assistant/index.js +1 -1
  395. package/dist/patterns/patient-shell/index.js +1 -1
  396. package/package.json +1 -1
  397. package/dist/_chunks/accordion-BJD1aM67.js.map +0 -1
  398. package/dist/_chunks/ai-prompt-input-8IShJ-GX.js.map +0 -1
  399. package/dist/_chunks/breadcrumb-pdUacgm1.js.map +0 -1
  400. package/dist/_chunks/card-DeItIBcV.js.map +0 -1
  401. package/dist/_chunks/chat-input-C-B4snVJ.js.map +0 -1
  402. package/dist/_chunks/chat-message-cFNbQYRH.js.map +0 -1
  403. package/dist/_chunks/checkbox-group-DBnIBRT_.js.map +0 -1
  404. package/dist/_chunks/collapsible-DPGQnHZh.js.map +0 -1
  405. package/dist/_chunks/combobox.agent-9w6W1Jct.js.map +0 -1
  406. package/dist/_chunks/command-palette.agent-Dg7jhOIc.js.map +0 -1
  407. package/dist/_chunks/date-range-picker-CtwEwoyr.js.map +0 -1
  408. package/dist/_chunks/description-list-Bk3p71qY.js.map +0 -1
  409. package/dist/_chunks/dropdown-menu-BnVUeVG3.js.map +0 -1
  410. package/dist/_chunks/form-field-DI5LY5aG.js.map +0 -1
  411. package/dist/_chunks/freemium-paywall-CCsX3GhK.js.map +0 -1
  412. package/dist/_chunks/icon-button-SWpSs9S6.js.map +0 -1
  413. package/dist/_chunks/kbd-DTcIjYA7.js.map +0 -1
  414. package/dist/_chunks/list-Cwe8mcmh.js.map +0 -1
  415. package/dist/_chunks/live-region-COggO6x6.js +0 -57
  416. package/dist/_chunks/message-card-B0oGrI3i.js.map +0 -1
  417. package/dist/_chunks/message-tray-DZ6oZ0cs.js.map +0 -1
  418. package/dist/_chunks/multi-select.agent-BDEVGMmW.js.map +0 -1
  419. package/dist/_chunks/navigation-menu-NjwxyshT.js.map +0 -1
  420. package/dist/_chunks/pagination.agent-sxokDphY.js.map +0 -1
  421. package/dist/_chunks/password-input-C6PvKyQV.js.map +0 -1
  422. package/dist/_chunks/phone-input-BavVyXxZ.js.map +0 -1
  423. package/dist/_chunks/popover-BWgOopjI.js.map +0 -1
  424. package/dist/_chunks/privacy-lock-DWL7m_VT.js.map +0 -1
  425. package/dist/_chunks/radio-B_gvGU29.js.map +0 -1
  426. package/dist/_chunks/radio-group-Bn8Wt0yc.js.map +0 -1
  427. package/dist/_chunks/scroll-area-Ba99pJ_R.js.map +0 -1
  428. package/dist/_chunks/search-bar-VoTqJhRp.js.map +0 -1
  429. package/dist/_chunks/select-CQxhOXVE.js.map +0 -1
  430. package/dist/_chunks/sheet-CKsuHuHB.js.map +0 -1
  431. package/dist/_chunks/sidebar-CiEpSH9e.js.map +0 -1
  432. package/dist/_chunks/sign-in-with-alfadocs-button-BDErAgG2.js +0 -44
  433. package/dist/_chunks/slider-BVBlOW_l.js.map +0 -1
  434. package/dist/_chunks/spinner-CoAOGcDa.js.map +0 -1
  435. package/dist/_chunks/tabs.agent-sQAHxebC.js.map +0 -1
  436. package/dist/_chunks/theme-root-vapFjsnt.js +0 -18
  437. package/dist/_chunks/theme-toggle-CEaPghpm.js.map +0 -1
  438. package/dist/_chunks/timeline-Ym2DRmtu.js.map +0 -1
  439. package/dist/_chunks/visually-hidden-Y3jcdCv-.js +0 -21
  440. package/dist/_chunks/warning-stack-5KROOw9M.js.map +0 -1
  441. package/dist/_chunks/workflow-map-D4sjYv2d.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"balance-cell-renderer-DjR0rPS6.js","sources":["../../node_modules/lucide-react/dist/esm/icons/columns-2.js","../../node_modules/lucide-react/dist/esm/icons/download.js","../../src/components/data-table/toolbar.tsx","../../src/components/data-table/data-table.agent.ts","../../src/components/data-table/data-table.tsx","../../src/components/data-table/hooks/use-total-row.ts","../../src/components/data-table/cell-renderers/status-cell-renderer.tsx","../../src/components/data-table/cell-renderers/user-cell-renderer.tsx","../../src/components/data-table/cell-renderers/tag-list-cell-renderer.tsx","../../src/components/data-table/cell-renderers/date-cell-renderer.tsx","../../src/components/data-table/cell-renderers/currency-cell-renderer.tsx","../../src/components/data-table/cell-renderers/actions-cell-renderer.tsx","../../src/components/data-table/cell-renderers/link-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"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }]\n];\nconst Columns2 = createLucideIcon(\"columns-2\", __iconNode);\n\nexport { __iconNode, Columns2 as default };\n//# sourceMappingURL=columns-2.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.js.map\n","import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Download, FileText, Printer, Columns } from 'lucide-react';\nimport type { GridApi } from 'ag-grid-community';\nimport { Button, type ButtonProps } from '../button/button';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport { Popover } from '../popover/popover';\nimport { Checkbox } from '../checkbox/checkbox';\n\n// Lucide icons default to 24×24 regardless of the wrapping span size, so\n// Button's `startIcon` slot (size-4 span) can't shrink them. Coerce icon\n// nodes to the `sm` button's 16px rendered size before handing them off.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{ className?: string; size?: number }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface ToolbarContextValue {\n /** Accessor to the live AG Grid API. Returns `undefined` until mount. */\n getApi: () => GridApi | undefined;\n /** Number of rows currently selected (re-renders on selection change). */\n selectionCount: number;\n /** Trigger the browser print dialog for the grid. */\n onPrint: () => void;\n}\n\nconst ToolbarContext = createContext<ToolbarContextValue | null>(null);\n\nfunction useToolbarContext(caller: string): ToolbarContextValue {\n const ctx = useContext(ToolbarContext);\n if (!ctx) {\n throw new Error(\n `${caller} must be rendered inside <DataTable.Toolbar> as a descendant of <DataTable>.`,\n );\n }\n return ctx;\n}\n\nexport interface ToolbarProviderProps {\n getApi: () => GridApi | undefined;\n selectionCount: number;\n onPrint: () => void;\n children: ReactNode;\n}\n\nexport function ToolbarProvider({\n getApi,\n selectionCount,\n onPrint,\n children,\n}: ToolbarProviderProps) {\n const value = useMemo(\n () => ({ getApi, selectionCount, onPrint }),\n [getApi, selectionCount, onPrint],\n );\n return <ToolbarContext.Provider value={value}>{children}</ToolbarContext.Provider>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Toolbar root */\n/* ------------------------------------------------------------------ */\n\nconst TOOLBAR_BASE = [\n 'data-table-toolbar',\n 'flex flex-wrap items-center gap-[var(--spacing-sm)]',\n 'pb-[var(--spacing-sm)]',\n].join(' ');\n\nexport interface ToolbarRootProps extends HTMLAttributes<HTMLDivElement> {}\n\nconst ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"toolbar\"\n className={[TOOLBAR_BASE, className ?? ''].join(' ').trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nToolbarRoot.displayName = 'DataTable.Toolbar';\n\n/* ------------------------------------------------------------------ */\n/* FilterBar slot — free-form */\n/* ------------------------------------------------------------------ */\n\nconst FilterBar = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:grow',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nFilterBar.displayName = 'DataTable.Toolbar.FilterBar';\n\n/* ------------------------------------------------------------------ */\n/* Actions slot — right-aligned via ms-auto */\n/* ------------------------------------------------------------------ */\n\nconst Actions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:ms-auto',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nActions.displayName = 'DataTable.Toolbar.Actions';\n\n/* ------------------------------------------------------------------ */\n/* ExportCsv, ExportPdf, Print — icon-only buttons with tooltip labels */\n/* ------------------------------------------------------------------ */\n/* These three share the same shape: a single lucide icon, a localized\n * tooltip that doubles as the accessible label, and either a built-in\n * action (CSV / print) or a consumer-supplied handler (PDF). Rendered\n * as IconButton so a toolbar with several of them reads as a compact\n * icon group rather than three full-width labeled buttons. */\n\ntype ToolbarIconButtonProps = Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick'\n> & {\n /** Accessible label — becomes the tooltip text and `aria-label`. */\n label?: string;\n};\n\nexport interface ExportCsvProps extends ToolbarIconButtonProps {\n /** Optional override — receives the live AG Grid API. */\n onExport?: (api: GridApi) => void;\n}\n\nconst ExportCsv = forwardRef<HTMLButtonElement, ExportCsvProps>(\n ({ label, onExport, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ExportCsv');\n const handleClick = useCallback(() => {\n const api = getApi();\n if (!api) return;\n if (onExport) onExport(api);\n else api.exportDataAsCsv();\n }, [getApi, onExport]);\n\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Download aria-hidden />}\n tooltip={label ?? t('dataTable.exportCsv')}\n onClick={handleClick}\n {...rest}\n />\n );\n },\n);\nExportCsv.displayName = 'DataTable.Toolbar.ExportCsv';\n\nexport interface ExportPdfProps extends ToolbarIconButtonProps {\n onClick: (api: GridApi | undefined) => void;\n}\n\nconst ExportPdf = forwardRef<HTMLButtonElement, ExportPdfProps>(\n ({ label, onClick, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ExportPdf');\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<FileText aria-hidden />}\n tooltip={label ?? t('dataTable.exportPdf')}\n onClick={() => onClick(getApi())}\n {...rest}\n />\n );\n },\n);\nExportPdf.displayName = 'DataTable.Toolbar.ExportPdf';\n\nexport interface PrintProps extends ToolbarIconButtonProps {}\n\nconst Print = forwardRef<HTMLButtonElement, PrintProps>(\n ({ label, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { onPrint } = useToolbarContext('DataTable.Toolbar.Print');\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Printer aria-hidden />}\n tooltip={label ?? t('dataTable.print')}\n onClick={onPrint}\n {...rest}\n />\n );\n },\n);\nPrint.displayName = 'DataTable.Toolbar.Print';\n\n/* ------------------------------------------------------------------ */\n/* ColumnToggle — popover with a checkbox per column */\n/* ------------------------------------------------------------------ */\n\ninterface ColumnEntry {\n colId: string;\n displayName: string;\n visible: boolean;\n}\n\nfunction readColumnEntries(api: GridApi | undefined): ColumnEntry[] {\n if (!api) return [];\n const columns = api.getColumns() ?? [];\n return columns\n .map((col) => {\n const def = col.getColDef();\n if (def.hide === undefined && col.getColId().startsWith('ag-Grid-')) return null;\n return {\n colId: col.getColId(),\n displayName: api.getDisplayNameForColumn(col, null) || col.getColId(),\n visible: col.isVisible(),\n };\n })\n .filter((c): c is ColumnEntry => c !== null);\n}\n\nexport interface ColumnToggleProps {\n label?: string;\n}\n\nconst ColumnToggle = ({ label }: ColumnToggleProps) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ColumnToggle');\n const [open, setOpen] = useState(false);\n const [columns, setColumns] = useState<ColumnEntry[]>([]);\n\n // Refresh the column list whenever the popover opens — picks up\n // columns that were added/removed/renamed since last open.\n useEffect(() => {\n if (!open) return;\n setColumns(readColumnEntries(getApi()));\n }, [open, getApi]);\n\n const toggleColumn = useCallback(\n (colId: string, nextVisible: boolean) => {\n const api = getApi();\n if (!api) return;\n api.setColumnsVisible([colId], nextVisible);\n setColumns((prev) =>\n prev.map((c) => (c.colId === colId ? { ...c, visible: nextVisible } : c)),\n );\n },\n [getApi],\n );\n\n const labelText = label ?? t('dataTable.columnToggle');\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <IconButton\n type=\"button\"\n intent=\"outline\"\n icon={<Columns aria-hidden />}\n aria-label={labelText}\n aria-haspopup=\"dialog\"\n />\n </Popover.Trigger>\n <Popover.Content size=\"sm\" align=\"end\">\n <Popover.Heading>{labelText}</Popover.Heading>\n <ul\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n aria-label={labelText}\n >\n {columns.map((c) => (\n <li key={c.colId}>\n <Checkbox\n label={c.displayName}\n checked={c.visible}\n onCheckedChange={(checked) =>\n toggleColumn(c.colId, checked === true)\n }\n />\n </li>\n ))}\n </ul>\n </Popover.Content>\n </Popover.Root>\n );\n};\nColumnToggle.displayName = 'DataTable.Toolbar.ColumnToggle';\n\n/* ------------------------------------------------------------------ */\n/* BulkAction — hidden when no rows are selected */\n/* ------------------------------------------------------------------ */\n\nexport interface BulkActionProps\n extends Omit<ButtonProps, 'onClick' | 'children' | 'startIcon' | 'intent'> {\n label: string;\n icon?: ReactNode;\n onClick: (api: GridApi | undefined) => void;\n variant?: 'default' | 'destructive';\n}\n\nconst BulkAction = forwardRef<HTMLButtonElement, BulkActionProps>(\n ({ label, icon, onClick, variant = 'default', size = 'sm', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi, selectionCount } = useToolbarContext(\n 'DataTable.Toolbar.BulkAction',\n );\n if (selectionCount === 0) return null;\n\n const resolvedIntent = variant === 'destructive' ? 'destructive' : 'secondary';\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n intent={resolvedIntent}\n size={size}\n startIcon={sizeIcon(icon)}\n onClick={() => onClick(getApi())}\n aria-label={`${label} (${t('dataTable.bulkAction', { count: selectionCount })})`}\n {...rest}\n >\n <span>{label}</span>\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:opacity-80\"\n >\n {t('dataTable.bulkAction', { count: selectionCount })}\n </span>\n </Button>\n );\n },\n);\nBulkAction.displayName = 'DataTable.Toolbar.BulkAction';\n\n/* ------------------------------------------------------------------ */\n/* Assembled namespace — mounted on DataTable.Toolbar downstream */\n/* ------------------------------------------------------------------ */\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n FilterBar,\n Actions,\n ExportCsv,\n ExportPdf,\n Print,\n ColumnToggle,\n BulkAction,\n});\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — DataTable. */\n/* */\n/* Operations work against the curated `DataTableHandle`, never the raw */\n/* ag-grid `GridApi` (consumers needing the raw API call `getRawApi()`). */\n/* See `src/docs/26-agent-readiness.mdx` §15. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { DataTableHandle, DataTableSortEntry } from './data-table';\n\nexport const dataTableAgent: AgentAdapter<DataTableHandle> = {\n id: 'data-table',\n capabilities: [\n 'select_single',\n 'select_multiple',\n 'range_pick',\n 'filter',\n 'sort',\n 'paginate',\n ],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.dataTable.state.selection',\n description: 'Row ids of currently-selected rows.',\n read: (handle) => handle.getSelection(),\n },\n filter: {\n type: 'object',\n descriptionKey: 'ui.agent.dataTable.state.filter',\n description: 'Current ag-grid filter model, keyed by column id.',\n read: (handle) => handle.getFilter(),\n },\n sort: {\n type: 'Array<{ colId, sort }>',\n descriptionKey: 'ui.agent.dataTable.state.sort',\n description: 'Active sort, in priority order.',\n read: (handle) => handle.getSort(),\n },\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.dataTable.state.currentPage',\n description: 'Zero-indexed page number.',\n read: (handle) => handle.getCurrentPage(),\n },\n },\n actions: {\n select_rows: {\n safety: 'read',\n argsType: '{ ids: string[] }',\n descriptionKey: 'ui.agent.dataTable.actions.selectRows',\n description: 'Replace the current selection with the given row ids.',\n invoke: (handle, args: { ids: string[] }) => {\n handle.setSelection(args.ids);\n },\n },\n select_range: {\n safety: 'read',\n argsType: '{ fromId: string, toId: string }',\n descriptionKey: 'ui.agent.dataTable.actions.selectRange',\n description: 'Select every row between fromId and toId, inclusive, in current sort order.',\n invoke: (handle, args: { fromId: string; toId: string }) => {\n handle.selectRange(args.fromId, args.toId);\n },\n },\n clear_selection: {\n safety: 'read',\n descriptionKey: 'ui.agent.dataTable.actions.clearSelection',\n description: 'Deselect all rows.',\n invoke: (handle) => {\n handle.clearSelection();\n },\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ model: Record<string, unknown> }',\n descriptionKey: 'ui.agent.dataTable.actions.applyFilter',\n description: 'Replace the filter model with the given object.',\n invoke: (handle, args: { model: Record<string, unknown> }) => {\n handle.setFilter(args.model);\n },\n },\n sort_by: {\n safety: 'read',\n argsType: '{ model: DataTableSortEntry[] }',\n descriptionKey: 'ui.agent.dataTable.actions.sortBy',\n description: 'Replace the active sort with the given list (priority order).',\n invoke: (handle, args: { model: DataTableSortEntry[] }) => {\n handle.setSort(args.model);\n },\n },\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n descriptionKey: 'ui.agent.dataTable.actions.goToPage',\n description: 'Navigate to the given zero-indexed page.',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'data-table',\n description: 'Marks the DataTable wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'gridId',\n description: 'Sourced from the gridId prop. Required to address a specific table from the agent.',\n },\n item: {\n attr: 'row-id',\n description: 'Native ag-grid row-id attribute on each rendered row. Selection is performed via the curated handle, not by DOM mutation.',\n },\n },\n};\n","import 'ag-grid-community/styles/ag-grid.css';\n// Font-only — `@font-face { agGridQuartz }` for the icon glyphs. We\n// deliberately do NOT import `ag-theme-quartz.css`: that file scopes ~90\n// CSS variables to `.ag-theme-quartz` and hardcodes colors / IBM Plex Sans\n// / 8px grid, which fight the design-system tokens. `ag-grid-theme.css`\n// below is a standalone bridge that defines every var AG Grid references,\n// mapped to DS tokens.\nimport 'ag-grid-community/styles/agGridQuartzFont.css';\nimport '../../tokens/ag-grid-theme.css';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { Skeleton } from '../skeleton';\nimport { EmptyState } from '../empty-state';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AgGridReact } from 'ag-grid-react';\nimport {\n AllCommunityModule,\n ModuleRegistry,\n type ColDef,\n type FilterChangedEvent,\n type GridApi,\n type GridOptions,\n type IServerSideDatasource,\n type RowClassParams,\n type SortChangedEvent,\n} from 'ag-grid-community';\nimport { Toolbar, ToolbarProvider } from './toolbar';\nimport { useAgentRegistration } from '../../agent';\nimport { dataTableAgent } from './data-table.agent';\n\n// AG Grid v33+ requires module registration before any grid renders.\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst dataTableVariants = cva('ag-theme-alfadocs ds:w-full', {\n variants: {\n density: {\n default: '',\n compact: 'data-table-compact',\n expanded: 'data-table-expanded',\n },\n bordered: {\n true: '',\n false: 'ds:[--ag-borders:none]',\n },\n },\n defaultVariants: {\n density: 'default',\n bordered: true,\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* Curated imperative handle — agent-readiness contract */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableSortEntry {\n colId: string;\n sort: 'asc' | 'desc';\n}\n\n/**\n * Curated handle exposed via `forwardRef`. Replaces the legacy raw `GridApi`\n * forwarding — see `src/docs/26-agent-readiness.mdx` §15. Consumers needing\n * the unwrapped ag-grid API call `getRawApi()`.\n */\nexport interface DataTableHandle<TData = unknown> {\n getSelection: () => string[];\n setSelection: (ids: string[]) => void;\n selectRange: (fromId: string, toId: string) => void;\n clearSelection: () => void;\n getFilter: () => Record<string, unknown>;\n setFilter: (model: Record<string, unknown>) => void;\n getSort: () => DataTableSortEntry[];\n setSort: (model: DataTableSortEntry[]) => void;\n getCurrentPage: () => number;\n goToPage: (page: number) => void;\n getRawApi: () => GridApi<TData> | undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps<TData = unknown>\n extends Omit<VariantProps<typeof dataTableVariants>, 'density'> {\n columnDefs: ColDef<TData>[];\n rowData?: TData[];\n rowSelection?: 'single' | 'multiple';\n pagination?: boolean;\n paginationPageSize?: number;\n serverSideDatasource?: IServerSideDatasource;\n gridId?: string;\n onSelectionChanged?: (rows: TData[]) => void;\n onSortChanged?: (event: SortChangedEvent<TData>) => void;\n onFilterChanged?: (event: FilterChangedEvent<TData>) => void;\n noRowsOverlay?: ComponentType;\n loadingOverlay?: ComponentType;\n gridOptions?: GridOptions<TData>;\n /** Grid height as a Tailwind height class, e.g. `\"h-[500px]\"` or `\"h-[var(--data-table-height)]\"` */\n heightClass?: string;\n className?: string;\n\n /** Row height preset. `expanded` adds headroom for complex cells (balances, tag lists). */\n density?: 'compact' | 'default' | 'expanded';\n\n /** Map row → class name. Use together with `data-table-row-success/warning/error` for tinted rows. */\n getRowClass?: (params: RowClassParams<TData>) => string | undefined;\n /** Rows pinned at the bottom of the grid. Use `useTotalRow()` to compute a totals row. */\n pinnedBottomRowData?: TData[];\n\n /** Print-optimised mode — hides toolbar, disables pagination, renders every row. */\n printMode?: boolean;\n\n /** Composable toolbar — renders `<DataTable.Toolbar>…</DataTable.Toolbar>` above the grid. */\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Locale text builder */\n/* ------------------------------------------------------------------ */\n\nfunction useAgLocaleText() {\n const { t } = useTranslation();\n return useMemo(\n () => ({\n // Filter strings\n contains: t('dataTable.agGrid.contains'),\n notContains: t('dataTable.agGrid.notContains'),\n equals: t('dataTable.agGrid.equals'),\n notEqual: t('dataTable.agGrid.notEqual'),\n startsWith: t('dataTable.agGrid.startsWith'),\n endsWith: t('dataTable.agGrid.endsWith'),\n lessThan: t('dataTable.agGrid.lessThan'),\n greaterThan: t('dataTable.agGrid.greaterThan'),\n inRange: t('dataTable.agGrid.inRange'),\n blank: t('dataTable.agGrid.blank'),\n notBlank: t('dataTable.agGrid.notBlank'),\n filterOoo: t('dataTable.agGrid.filterOoo'),\n applyFilter: t('dataTable.agGrid.applyFilter'),\n resetFilter: t('dataTable.agGrid.resetFilter'),\n noRowsToShow: t('dataTable.agGrid.noRowsToShow'),\n selectAll: t('dataTable.agGrid.selectAll'),\n // Pagination\n page: t('dataTable.page'),\n of: t('dataTable.of'),\n to: t('dataTable.to'),\n nextPage: t('dataTable.nextPage'),\n previousPage: t('dataTable.previousPage'),\n firstPage: t('dataTable.firstPage'),\n lastPage: t('dataTable.lastPage'),\n pageSize: t('dataTable.pageSize'),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [t],\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Loading overlay */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultLoadingOverlay() {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]\"\n >\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton\n // eslint-disable-next-line react/no-array-index-key\n key={i}\n variant=\"rectangular\"\n className=\"ds:h-[var(--min-target-size)] ds:w-full\"\n />\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* No-rows overlay — wired to the DS EmptyState component */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultNoRowsOverlay() {\n const { t } = useTranslation();\n return (\n <EmptyState\n variant=\"no-results\"\n size=\"sm\"\n title={t('dataTable.noRows')}\n description={t('dataTable.noRowsDescription')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Column persistence helpers */\n/* ------------------------------------------------------------------ */\n\nfunction loadColumnState(gridId: string) {\n try {\n const raw = localStorage.getItem(`data-table-col-state:${gridId}`);\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\nfunction saveColumnState(gridId: string, api: GridApi) {\n try {\n localStorage.setItem(\n `data-table-col-state:${gridId}`,\n JSON.stringify(api.getColumnState()),\n );\n } catch {\n // localStorage may be unavailable in some environments\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* DataTable */\n/* ------------------------------------------------------------------ */\n\nfunction DataTableInner<TData = unknown>(\n props: DataTableProps<TData>,\n ref: React.ForwardedRef<DataTableHandle<TData>>,\n) {\n const {\n columnDefs,\n rowData,\n rowSelection,\n pagination = false,\n paginationPageSize = 25,\n serverSideDatasource,\n gridId,\n onSelectionChanged,\n onSortChanged,\n onFilterChanged,\n noRowsOverlay,\n loadingOverlay,\n gridOptions,\n density,\n bordered,\n heightClass = 'h-[500px]',\n className,\n getRowClass,\n pinnedBottomRowData,\n printMode = false,\n children,\n } = props;\n\n const { t, i18n } = useTranslation();\n const agGridRef = useRef<AgGridReact<TData>>(null);\n const [selectionCount, setSelectionCount] = useState(0);\n const [sortAnnouncement, setSortAnnouncement] = useState('');\n const localeText = useAgLocaleText();\n\n // Curated imperative handle — see DataTableHandle above.\n const handle = useMemo<DataTableHandle<TData>>(\n () => ({\n getSelection: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n const ids: string[] = [];\n for (const node of api.getSelectedNodes()) {\n if (node.id != null) ids.push(node.id);\n }\n return ids;\n },\n setSelection: (ids) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const want = new Set(ids);\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n selectRange: (fromId, toId) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const ordered: string[] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (node.id != null) ordered.push(node.id);\n });\n const a = ordered.indexOf(fromId);\n const b = ordered.indexOf(toId);\n if (a < 0 || b < 0) return;\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n const want = new Set(ordered.slice(lo, hi + 1));\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n clearSelection: () => {\n agGridRef.current?.api?.deselectAll();\n },\n getFilter: () => agGridRef.current?.api?.getFilterModel() ?? {},\n setFilter: (model) => {\n agGridRef.current?.api?.setFilterModel(model);\n },\n getSort: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n return api\n .getColumnState()\n .filter((c) => c.sort === 'asc' || c.sort === 'desc')\n .map((c) => ({ colId: c.colId, sort: c.sort as 'asc' | 'desc' }));\n },\n setSort: (model) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const next = api.getColumnState().map((c) => {\n const target = model.find((m) => m.colId === c.colId);\n return { ...c, sort: target ? target.sort : null };\n });\n api.applyColumnState({ state: next, defaultState: { sort: null } });\n },\n getCurrentPage: () => agGridRef.current?.api?.paginationGetCurrentPage() ?? 0,\n goToPage: (page) => {\n agGridRef.current?.api?.paginationGoToPage(page);\n },\n getRawApi: () => agGridRef.current?.api,\n }),\n [],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n // Agent adapter is keyed on the row-agnostic DataTableHandle; cast here\n // because TData isn't observable from the agent surface.\n useAgentRegistration(dataTableAgent, handle as DataTableHandle, gridId);\n\n const isRtl = i18n.dir() === 'rtl';\n const isLoading = rowData === undefined;\n\n const prefersReducedMotion = useMemo(\n () => window.matchMedia('(prefers-reduced-motion: reduce)').matches,\n [],\n );\n\n // Suppress compact density in accessible theme — 32px rows violate min-target-size\n const isAccessible = useMemo(\n () => document.documentElement.classList.contains('theme-accessible'),\n [],\n );\n const effectiveDensity = isAccessible && density === 'compact' ? 'default' : density;\n\n // Map logical 'single' | 'multiple' → AG Grid v35 object form\n const rowSelectionOption = useMemo(() => {\n if (!rowSelection) return undefined;\n if (rowSelection === 'single') return { mode: 'singleRow' as const };\n return {\n mode: 'multiRow' as const,\n headerCheckbox: true,\n checkboxes: true,\n };\n }, [rowSelection]);\n\n const rowModelType = serverSideDatasource ? 'serverSide' : 'clientSide';\n\n // Column persistence — restore on mount\n const handleGridReady = useCallback(() => {\n if (!gridId || !agGridRef.current?.api) return;\n const saved = loadColumnState(gridId);\n if (saved) {\n agGridRef.current.api.applyColumnState({ state: saved, applyOrder: true });\n }\n }, [gridId]);\n\n const handleColumnStateChange = useCallback(() => {\n if (gridId && agGridRef.current?.api) {\n saveColumnState(gridId, agGridRef.current.api);\n }\n }, [gridId]);\n\n const handleSelectionChanged = useCallback(() => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const rows = api.getSelectedRows();\n setSelectionCount(rows.length);\n onSelectionChanged?.(rows);\n }, [onSelectionChanged]);\n\n const handleSortChanged = useCallback(\n (event: SortChangedEvent<TData>) => {\n const api = agGridRef.current?.api;\n if (api) {\n const colState = api.getColumnState();\n const sortedCol = colState.find((c) => c.sort);\n if (sortedCol) {\n const colId = sortedCol.colId;\n const colDef = columnDefs.find(\n (cd) => (cd.field as string) === colId || cd.colId === colId,\n );\n const colName = (colDef?.headerName as string) ?? colId;\n const dirKey =\n sortedCol.sort === 'asc'\n ? 'dataTable.sortAscending'\n : 'dataTable.sortDescending';\n setSortAnnouncement(\n t('dataTable.sortAnnounce', {\n column: colName,\n direction: t(dirKey),\n }),\n );\n } else {\n setSortAnnouncement('');\n }\n }\n onSortChanged?.(event);\n },\n [columnDefs, onSortChanged, t],\n );\n\n const handleFilterChanged = useCallback(\n (event: FilterChangedEvent<TData>) => {\n onFilterChanged?.(event);\n },\n [onFilterChanged],\n );\n\n // Clear sort announcement after screen readers have had time to read it\n useEffect(() => {\n if (!sortAnnouncement) return;\n const id = setTimeout(() => setSortAnnouncement(''), 3000);\n return () => clearTimeout(id);\n }, [sortAnnouncement]);\n\n const NoRowsComponent = noRowsOverlay ?? DefaultNoRowsOverlay;\n const LoadingComponent = loadingOverlay ?? DefaultLoadingOverlay;\n\n const getApi = useCallback(\n () => agGridRef.current?.api as GridApi | undefined,\n [],\n );\n\n const handlePrint = useCallback(() => {\n if (typeof window !== 'undefined') {\n window.print();\n }\n }, []);\n\n const wrapperClass = dataTableVariants({\n density: effectiveDensity,\n bordered,\n className,\n });\n\n // Toolbar composition — render either the consumer-provided children,\n // or a default single-button toolbar for backward compatibility.\n const toolbarContent = children ?? (\n <Toolbar>\n <Toolbar.Actions>\n <Toolbar.ExportCsv />\n </Toolbar.Actions>\n </Toolbar>\n );\n\n // Pagination is auto-disabled in print mode so every row prints.\n const paginationEnabled = printMode ? false : pagination;\n\n return (\n <div\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)]\"\n aria-busy={isLoading ? 'true' : undefined}\n data-component=\"data-table\"\n data-component-id={gridId}\n data-print-mode={printMode ? 'true' : undefined}\n >\n {!printMode && (\n <ToolbarProvider\n getApi={getApi}\n selectionCount={selectionCount}\n onPrint={handlePrint}\n >\n {toolbarContent}\n </ToolbarProvider>\n )}\n\n {/* Grid */}\n <div className={[wrapperClass, printMode ? '' : heightClass].join(' ').trim()}>\n <AgGridReact<TData>\n ref={agGridRef}\n // Opt into v32 CSS-file theming so the `.ag-theme-alfadocs` bridge\n // (src/tokens/ag-grid-theme.css) wins. Without this, AG Grid v33+\n // defaults to the JS Theming API (themeQuartz) which overrides our\n // tokens at runtime — including --ag-font-family.\n theme=\"legacy\"\n columnDefs={columnDefs}\n rowData={rowData}\n rowModelType={rowModelType}\n serverSideDatasource={\n serverSideDatasource as IServerSideDatasource | undefined\n }\n rowSelection={rowSelectionOption}\n pagination={paginationEnabled}\n paginationPageSize={paginationPageSize}\n animateRows={!prefersReducedMotion}\n enableRtl={isRtl}\n ensureDomOrder\n suppressCellFocus={false}\n rowBuffer={10}\n localeText={localeText}\n noRowsOverlayComponent={NoRowsComponent}\n loadingOverlayComponent={LoadingComponent}\n getRowClass={getRowClass}\n pinnedBottomRowData={pinnedBottomRowData}\n domLayout={printMode ? 'autoHeight' : undefined}\n onGridReady={handleGridReady}\n onColumnMoved={handleColumnStateChange}\n onColumnResized={handleColumnStateChange}\n onColumnPinned={handleColumnStateChange}\n onSortChanged={handleSortChanged}\n onFilterChanged={handleFilterChanged}\n onSelectionChanged={handleSelectionChanged}\n {...(gridOptions as GridOptions<TData>)}\n />\n </div>\n\n {/* Footer */}\n {!printMode && (\n <div className=\"ds:flex ds:items-center ds:justify-between type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {selectionCount > 0 ? (\n <span>{t('dataTable.selected', { count: selectionCount })}</span>\n ) : (\n <span />\n )}\n </div>\n )}\n\n {/* Aria-live region for sort announcements */}\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {sortAnnouncement}\n </span>\n </div>\n );\n}\n\nconst DataTableBase = forwardRef(DataTableInner) as <TData = unknown>(\n props: DataTableProps<TData> & { ref?: React.Ref<DataTableHandle<TData>> },\n) => React.ReactElement;\n\n(DataTableBase as { displayName?: string }).displayName = 'DataTable';\n\nexport const DataTable = Object.assign(DataTableBase, {\n Toolbar,\n});\n","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 { Badge } from '../../badge/badge';\n\nexport type BadgeVariant = 'neutral' | 'info' | 'success' | 'warning' | 'error';\n\nexport interface StatusCellRendererParams {\n variantMap?: Record<string, BadgeVariant>;\n}\n\nexport function StatusCellRenderer(\n props: CustomCellRendererProps & StatusCellRendererParams,\n) {\n const { value, variantMap } = props;\n const variant: BadgeVariant = variantMap?.[value as string] ?? 'neutral';\n return (\n <Badge variant={variant} withDot size=\"sm\">\n {String(value ?? '')}\n </Badge>\n );\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { Avatar } from '../../avatar/avatar';\n\nexport interface UserCellValue {\n name: string;\n src?: string;\n}\n\nexport function UserCellRenderer(\n props: CustomCellRendererProps<unknown, UserCellValue>,\n) {\n const { value } = props;\n if (!value) return null;\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Avatar name={value.name} src={value.src} size=\"sm\" />\n <span>{value.name}</span>\n </span>\n );\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport { Tag } from '../../tag/tag';\nimport { Tooltip } from '../../tooltip';\n\nexport interface TagListCellRendererParams {\n maxVisible?: number;\n}\n\nexport function TagListCellRenderer(\n props: CustomCellRendererProps<unknown, string[]> & TagListCellRendererParams,\n) {\n const { value, maxVisible = 3 } = props;\n const { t } = useTranslation();\n\n if (!Array.isArray(value) || value.length === 0) return null;\n\n const visible = value.slice(0, maxVisible);\n const overflow = value.length - maxVisible;\n\n return (\n <span className=\"ds:inline-flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {visible.map((tag) => (\n <Tag key={tag} label={tag} size=\"sm\" />\n ))}\n {overflow > 0 && (\n <Tooltip label={value.slice(maxVisible).join(', ')}>\n <Tag\n label={t('inputs.multiSelect.overflow', { count: overflow })}\n size=\"sm\"\n variant=\"neutral\"\n fill=\"outline\"\n />\n </Tooltip>\n )}\n </span>\n );\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { Timestamp } from '../../timestamp';\n\nexport type DateCellFormat = 'date' | 'time' | 'datetime' | 'relative';\n\nexport interface DateCellRendererParams {\n /** Which preset to use. Default `'date'`. */\n format?: DateCellFormat;\n /** Escape hatch — overrides the preset entirely. */\n options?: Intl.DateTimeFormatOptions;\n}\n\nconst PRESETS: Record<Exclude<DateCellFormat, 'relative'>, Intl.DateTimeFormatOptions> = {\n date: { year: 'numeric', month: 'short', day: 'numeric' },\n time: { hour: '2-digit', minute: '2-digit' },\n datetime: {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n },\n};\n\nexport function DateCellRenderer(\n props: CustomCellRendererProps & DateCellRendererParams,\n) {\n const { value, format = 'date', options } = props;\n if (value == null || value === '') return null;\n\n // `shape=\"bare\"` keeps the cell font inherited from --ag-font-size. Timestamp\n // still emits a proper `<time dateTime>` for assistive tech and feeds.\n if (format === 'relative' && !options) {\n return <Timestamp value={value as string | Date} shape=\"bare\" />;\n }\n\n return (\n <Timestamp\n value={value as string | Date}\n format=\"absolute\"\n shape=\"bare\"\n absoluteFormat={options ?? PRESETS[format === 'relative' ? 'date' : format]}\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 { value, currency = 'EUR', colorNegative, strikethrough, options } = 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 = ['tabular-nums'];\n if (colorNegative && n < 0) classNames.push('text-[color:var(--destructive)]');\n if (strikethrough) classNames.push('line-through');\n\n return <span className={classNames.join(' ')}>{formatted}</span>;\n}\n","import { cloneElement, isValidElement, type ReactNode } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { IconButton } from '../../button/icon-button';\n\n// Lucide icons render at their intrinsic 24×24 unless given a `size` prop or\n// `size-*` class. The IconButton's wrapping span is only `size-4` (16px), so a\n// bare `<Trash2 />` overflows and, inside AG Grid's `overflow: hidden` cells,\n// gets clipped into horizontal slivers. Coerce icon nodes to the expected size.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{ className?: string; size?: number }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\nexport interface ActionDef<TData = unknown> {\n /** Lucide-style icon node. */\n icon: ReactNode;\n /** Accessible label — also used as the tooltip. */\n label: string;\n /** Invoked with the row data. */\n onClick: (data: TData) => void;\n /** Disable the action. Pass a predicate for per-row disablement. */\n disabled?: boolean | ((data: TData) => boolean);\n /** Human-readable reason shown in the tooltip when disabled. */\n disabledReason?: string;\n /** `destructive` swaps the button intent. */\n variant?: 'default' | 'destructive';\n /** Hide the action entirely. Pass a predicate for per-row hiding. */\n hidden?: boolean | ((data: TData) => boolean);\n}\n\nexport interface ActionsCellRendererParams<TData = unknown> {\n actions: ActionDef<TData>[];\n}\n\nfunction resolve<T>(\n flag: boolean | ((data: T) => boolean) | undefined,\n data: T,\n): boolean {\n if (typeof flag === 'function') return flag(data);\n return Boolean(flag);\n}\n\nexport function ActionsCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ActionsCellRendererParams<TData>,\n) {\n const { data, actions } = props;\n if (!data) return null;\n\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {actions.map((action, index) => {\n if (resolve(action.hidden, data)) return null;\n const isDisabled = resolve(action.disabled, data);\n const tooltip = isDisabled && action.disabledReason\n ? action.disabledReason\n : action.label;\n\n const isDestructive = action.variant === 'destructive';\n\n return (\n <IconButton\n // Action defs are referentially stable from consumers; index is\n // acceptable here because actions do not reorder within a row.\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n size=\"sm\"\n intent=\"ghost\"\n icon={sizeIcon(action.icon)}\n tooltip={tooltip}\n aria-label={action.label}\n disabled={isDisabled}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick(data);\n }}\n className={\n isDestructive\n ? 'ds:text-[color:var(--destructive)] ds:hover:text-[color:var(--destructive-hover)]'\n : undefined\n }\n />\n );\n })}\n </span>\n );\n}\n","import type { MouseEvent } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\n\ntype Getter<T, TData> = T | ((data: TData) => T | undefined);\n\nexport interface LinkCellRendererParams<TData = unknown> {\n /** Anchor href — or a function that derives it from the row. */\n href?: Getter<string, TData>;\n /** Fallback / additional onClick. Prevents default when provided without href. */\n onClick?: (data: TData) => void;\n /** Small text rendered below the link — supports a row-aware function. */\n secondary?: Getter<string, TData>;\n}\n\nfunction resolve<T, TData>(\n source: Getter<T, TData> | undefined,\n data: TData,\n): T | undefined {\n if (typeof source === 'function') {\n return (source as (data: TData) => T | undefined)(data);\n }\n return source;\n}\n\nfunction safeHref(href: string): string {\n return /^(https?:\\/\\/|\\/|#|mailto:|tel:)/i.test(href) ? href : '#';\n}\n\nexport function LinkCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & LinkCellRendererParams<TData>,\n) {\n const { value, data, href, onClick, secondary } = props;\n if (!data) return null;\n\n const resolvedHref = resolve(href, data);\n const resolvedSecondary = resolve(secondary, data);\n const content = value == null || value === '' ? '' : String(value);\n\n const linkClasses = [\n 'text-[color:var(--primary)]',\n 'hover:underline',\n 'focus-visible:outline-[length:var(--focus-ring-width)]',\n 'focus-visible:outline-solid',\n 'focus-visible:outline-[color:var(--ring)]',\n 'focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'rounded-[var(--radius-sm)]',\n ].join(' ');\n\n const handleClick = (event: MouseEvent) => {\n if (!onClick) return;\n if (!resolvedHref) event.preventDefault();\n event.stopPropagation();\n onClick(data);\n };\n\n return (\n <span className=\"ds:flex ds:flex-col ds:leading-tight\">\n {resolvedHref ? (\n <a\n href={safeHref(resolvedHref)}\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={handleClick}\n className={['ds:appearance-none ds:bg-transparent ds:p-0 ds:text-start', linkClasses].join(' ')}\n >\n {content}\n </button>\n )}\n {resolvedSecondary ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {resolvedSecondary}\n </span>\n ) : null}\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { CheckSquare, Square } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\n\nexport interface ToggleCellRendererParams<TData = unknown> {\n /** Fires with the row and the new target value. */\n onToggle: (data: TData, newValue: boolean) => 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> & ToggleCellRendererParams<TData>,\n) {\n const {\n value,\n data,\n onToggle,\n trueIcon,\n falseIcon,\n trueClass = 'text-[color:var(--success)]',\n falseClass = 'text-[color:var(--muted-foreground)]',\n label,\n } = props;\n const { t } = useTranslation();\n if (!data) return null;\n\n const isOn = Boolean(value);\n const icon = isOn\n ? (trueIcon ?? <CheckSquare 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 return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n aria-label={resolvedLabel}\n onClick={(event) => {\n event.stopPropagation();\n onToggle(data, !isOn);\n }}\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 stateClass,\n ].join(' ')}\n >\n {icon}\n </button>\n );\n}\n","import { useLayoutEffect, useRef } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\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<NonNullable<ColorDotCellRendererParams['size']>, string> = {\n sm: 'size-[var(--icon-size-sm)]',\n md: 'size-[var(--icon-size-md)]',\n lg: '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 (HEX_RE.test(v) || RGB_RE.test(v) || HSL_RE.test(v) || CSS_VAR_RE.test(v)) {\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 useLayoutEffect(() => {\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 { 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\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 return (\n <dl className=\"ds:grid ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-sm)] ds:gap-y-0 type-meta ds:leading-tight\">\n {lines.map((line) => {\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 const valueClass = ['tabular-nums', 'text-end', 'font-medium'];\n if (highlightNegative && n < 0) {\n valueClass.push('text-[color:var(--destructive)]');\n }\n\n return (\n <div key={line.valueField} className=\"ds:contents\">\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">{line.label}</dt>\n <dd className={valueClass.join(' ')}>{formatted}</dd>\n </div>\n );\n })}\n </dl>\n );\n}\n"],"names":["__iconNode","Columns2","createLucideIcon","Download","sizeIcon","node","isValidElement","element","existingClass","className","cloneElement","ToolbarContext","createContext","useToolbarContext","caller","ctx","useContext","ToolbarProvider","getApi","selectionCount","onPrint","children","value","useMemo","jsx","TOOLBAR_BASE","ToolbarRoot","forwardRef","props","ref","FilterBar","Actions","ExportCsv","label","onExport","intent","rest","t","useTranslation","handleClick","useCallback","api","IconButton","ExportPdf","onClick","FileText","Print","Printer","readColumnEntries","col","c","ColumnToggle","open","setOpen","useState","columns","setColumns","useEffect","toggleColumn","colId","nextVisible","prev","labelText","Popover","Columns","Checkbox","checked","BulkAction","icon","variant","size","jsxs","Button","Toolbar","dataTableAgent","handle","args","ModuleRegistry","AllCommunityModule","dataTableVariants","cva","useAgLocaleText","DefaultLoadingOverlay","_","i","Skeleton","DefaultNoRowsOverlay","EmptyState","loadColumnState","gridId","raw","saveColumnState","DataTableInner","columnDefs","rowData","rowSelection","pagination","paginationPageSize","serverSideDatasource","onSelectionChanged","onSortChanged","onFilterChanged","noRowsOverlay","loadingOverlay","gridOptions","density","bordered","heightClass","getRowClass","pinnedBottomRowData","printMode","i18n","agGridRef","useRef","setSelectionCount","sortAnnouncement","setSortAnnouncement","localeText","_a","ids","want","fromId","toId","ordered","a","b","lo","hi","_b","model","next","target","m","page","useImperativeHandle","useAgentRegistration","isRtl","isLoading","prefersReducedMotion","effectiveDensity","rowSelectionOption","rowModelType","handleGridReady","saved","handleColumnStateChange","handleSelectionChanged","rows","handleSortChanged","event","sortedCol","colDef","cd","colName","dirKey","handleFilterChanged","id","NoRowsComponent","LoadingComponent","handlePrint","wrapperClass","toolbarContent","paginationEnabled","AgGridReact","DataTableBase","DataTable","useTotalRow","sumFields","options","row","field","total","r","n","StatusCellRenderer","variantMap","Badge","UserCellRenderer","Avatar","TagListCellRenderer","maxVisible","visible","overflow","tag","Tag","Tooltip","PRESETS","DateCellRenderer","format","Timestamp","toNumber","CurrencyCellRenderer","currency","colorNegative","strikethrough","locale","formatted","classNames","resolve","flag","data","ActionsCellRenderer","actions","action","index","isDisabled","tooltip","isDestructive","source","safeHref","href","LinkCellRenderer","secondary","resolvedHref","resolvedSecondary","content","linkClasses","ToggleCellRenderer","onToggle","trueIcon","falseIcon","trueClass","falseClass","isOn","CheckSquare","Square","stateClass","resolvedLabel","SIZE_CLASS","readField","HEX_RE","RGB_RE","HSL_RE","CSS_VAR_RE","sanitizeColor","v","ColorDotCellRenderer","colorField","labelField","dotRef","rawColor","color","useLayoutEffect","el","readNumber","BalanceCellRenderer","lines","highlightNegative","line","valueClass"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"balance-cell-renderer-CiyezQhi.js","sources":["../../node_modules/lucide-react/dist/esm/icons/columns-2.js","../../node_modules/lucide-react/dist/esm/icons/download.js","../../src/components/data-table/toolbar.tsx","../../src/components/data-table/data-table.agent.ts","../../src/components/data-table/data-table.tsx","../../src/components/data-table/hooks/use-total-row.ts","../../src/components/data-table/cell-renderers/status-cell-renderer.tsx","../../src/components/data-table/cell-renderers/user-cell-renderer.tsx","../../src/components/data-table/cell-renderers/tag-list-cell-renderer.tsx","../../src/components/data-table/cell-renderers/date-cell-renderer.tsx","../../src/components/data-table/cell-renderers/currency-cell-renderer.tsx","../../src/components/data-table/cell-renderers/actions-cell-renderer.tsx","../../src/components/data-table/cell-renderers/link-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"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M12 3v18\", key: \"108xh3\" }]\n];\nconst Columns2 = createLucideIcon(\"columns-2\", __iconNode);\n\nexport { __iconNode, Columns2 as default };\n//# sourceMappingURL=columns-2.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.js.map\n","import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Download, FileText, Printer, Columns } from 'lucide-react';\nimport type { GridApi } from 'ag-grid-community';\nimport { Button, type ButtonProps } from '../button/button';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport { Popover } from '../popover/popover';\nimport { Checkbox } from '../checkbox/checkbox';\n\n// Lucide icons default to 24×24 regardless of the wrapping span size, so\n// Button's `startIcon` slot (size-4 span) can't shrink them. Coerce icon\n// nodes to the `sm` button's 16px rendered size before handing them off.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{ className?: string; size?: number }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\n/* ------------------------------------------------------------------ */\n/* Context */\n/* ------------------------------------------------------------------ */\n\ninterface ToolbarContextValue {\n /** Accessor to the live AG Grid API. Returns `undefined` until mount. */\n getApi: () => GridApi | undefined;\n /** Number of rows currently selected (re-renders on selection change). */\n selectionCount: number;\n /** Trigger the browser print dialog for the grid. */\n onPrint: () => void;\n}\n\nconst ToolbarContext = createContext<ToolbarContextValue | null>(null);\n\nfunction useToolbarContext(caller: string): ToolbarContextValue {\n const ctx = useContext(ToolbarContext);\n if (!ctx) {\n throw new Error(\n `${caller} must be rendered inside <DataTable.Toolbar> as a descendant of <DataTable>.`,\n );\n }\n return ctx;\n}\n\nexport interface ToolbarProviderProps {\n getApi: () => GridApi | undefined;\n selectionCount: number;\n onPrint: () => void;\n children: ReactNode;\n}\n\nexport function ToolbarProvider({\n getApi,\n selectionCount,\n onPrint,\n children,\n}: ToolbarProviderProps) {\n const value = useMemo(\n () => ({ getApi, selectionCount, onPrint }),\n [getApi, selectionCount, onPrint],\n );\n return <ToolbarContext.Provider value={value}>{children}</ToolbarContext.Provider>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Toolbar root */\n/* ------------------------------------------------------------------ */\n\nconst TOOLBAR_BASE = [\n 'data-table-toolbar',\n 'flex flex-wrap items-center gap-[var(--spacing-sm)]',\n 'pb-[var(--spacing-sm)]',\n].join(' ');\n\nexport interface ToolbarRootProps extends HTMLAttributes<HTMLDivElement> {}\n\nconst ToolbarRoot = forwardRef<HTMLDivElement, ToolbarRootProps>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n role=\"toolbar\"\n className={[TOOLBAR_BASE, className ?? ''].join(' ').trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nToolbarRoot.displayName = 'DataTable.Toolbar';\n\n/* ------------------------------------------------------------------ */\n/* FilterBar slot — free-form */\n/* ------------------------------------------------------------------ */\n\nconst FilterBar = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:grow',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nFilterBar.displayName = 'DataTable.Toolbar.FilterBar';\n\n/* ------------------------------------------------------------------ */\n/* Actions slot — right-aligned via ms-auto */\n/* ------------------------------------------------------------------ */\n\nconst Actions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:ms-auto',\n className ?? '',\n ]\n .join(' ')\n .trim()}\n {...props}\n >\n {children}\n </div>\n ),\n);\nActions.displayName = 'DataTable.Toolbar.Actions';\n\n/* ------------------------------------------------------------------ */\n/* ExportCsv, ExportPdf, Print — icon-only buttons with tooltip labels */\n/* ------------------------------------------------------------------ */\n/* These three share the same shape: a single lucide icon, a localized\n * tooltip that doubles as the accessible label, and either a built-in\n * action (CSV / print) or a consumer-supplied handler (PDF). Rendered\n * as IconButton so a toolbar with several of them reads as a compact\n * icon group rather than three full-width labeled buttons. */\n\ntype ToolbarIconButtonProps = Omit<\n IconButtonProps,\n 'icon' | 'aria-label' | 'tooltip' | 'onClick'\n> & {\n /** Accessible label — becomes the tooltip text and `aria-label`. */\n label?: string;\n};\n\nexport interface ExportCsvProps extends ToolbarIconButtonProps {\n /** Optional override — receives the live AG Grid API. */\n onExport?: (api: GridApi) => void;\n}\n\nconst ExportCsv = forwardRef<HTMLButtonElement, ExportCsvProps>(\n ({ label, onExport, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ExportCsv');\n const handleClick = useCallback(() => {\n const api = getApi();\n if (!api) return;\n if (onExport) onExport(api);\n else api.exportDataAsCsv();\n }, [getApi, onExport]);\n\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Download aria-hidden />}\n tooltip={label ?? t('dataTable.exportCsv')}\n onClick={handleClick}\n {...rest}\n />\n );\n },\n);\nExportCsv.displayName = 'DataTable.Toolbar.ExportCsv';\n\nexport interface ExportPdfProps extends ToolbarIconButtonProps {\n onClick: (api: GridApi | undefined) => void;\n}\n\nconst ExportPdf = forwardRef<HTMLButtonElement, ExportPdfProps>(\n ({ label, onClick, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ExportPdf');\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<FileText aria-hidden />}\n tooltip={label ?? t('dataTable.exportPdf')}\n onClick={() => onClick(getApi())}\n {...rest}\n />\n );\n },\n);\nExportPdf.displayName = 'DataTable.Toolbar.ExportPdf';\n\nexport interface PrintProps extends ToolbarIconButtonProps {}\n\nconst Print = forwardRef<HTMLButtonElement, PrintProps>(\n ({ label, intent = 'outline', ...rest }, ref) => {\n const { t } = useTranslation();\n const { onPrint } = useToolbarContext('DataTable.Toolbar.Print');\n return (\n <IconButton\n ref={ref}\n type=\"button\"\n intent={intent}\n icon={<Printer aria-hidden />}\n tooltip={label ?? t('dataTable.print')}\n onClick={onPrint}\n {...rest}\n />\n );\n },\n);\nPrint.displayName = 'DataTable.Toolbar.Print';\n\n/* ------------------------------------------------------------------ */\n/* ColumnToggle — popover with a checkbox per column */\n/* ------------------------------------------------------------------ */\n\ninterface ColumnEntry {\n colId: string;\n displayName: string;\n visible: boolean;\n}\n\nfunction readColumnEntries(api: GridApi | undefined): ColumnEntry[] {\n if (!api) return [];\n const columns = api.getColumns() ?? [];\n return columns\n .map((col) => {\n const def = col.getColDef();\n if (def.hide === undefined && col.getColId().startsWith('ag-Grid-')) return null;\n return {\n colId: col.getColId(),\n displayName: api.getDisplayNameForColumn(col, null) || col.getColId(),\n visible: col.isVisible(),\n };\n })\n .filter((c): c is ColumnEntry => c !== null);\n}\n\nexport interface ColumnToggleProps {\n label?: string;\n}\n\nconst ColumnToggle = ({ label }: ColumnToggleProps) => {\n const { t } = useTranslation();\n const { getApi } = useToolbarContext('DataTable.Toolbar.ColumnToggle');\n const [open, setOpen] = useState(false);\n const [columns, setColumns] = useState<ColumnEntry[]>([]);\n\n // Refresh the column list whenever the popover opens — picks up\n // columns that were added/removed/renamed since last open.\n useEffect(() => {\n if (!open) return;\n setColumns(readColumnEntries(getApi()));\n }, [open, getApi]);\n\n const toggleColumn = useCallback(\n (colId: string, nextVisible: boolean) => {\n const api = getApi();\n if (!api) return;\n api.setColumnsVisible([colId], nextVisible);\n setColumns((prev) =>\n prev.map((c) => (c.colId === colId ? { ...c, visible: nextVisible } : c)),\n );\n },\n [getApi],\n );\n\n const labelText = label ?? t('dataTable.columnToggle');\n\n return (\n <Popover.Root open={open} onOpenChange={setOpen}>\n <Popover.Trigger asChild>\n <IconButton\n type=\"button\"\n intent=\"outline\"\n icon={<Columns aria-hidden />}\n aria-label={labelText}\n aria-haspopup=\"dialog\"\n />\n </Popover.Trigger>\n <Popover.Content size=\"sm\" align=\"end\">\n <Popover.Heading>{labelText}</Popover.Heading>\n <ul\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n aria-label={labelText}\n >\n {columns.map((c) => (\n <li key={c.colId}>\n <Checkbox\n label={c.displayName}\n checked={c.visible}\n onCheckedChange={(checked) =>\n toggleColumn(c.colId, checked === true)\n }\n />\n </li>\n ))}\n </ul>\n </Popover.Content>\n </Popover.Root>\n );\n};\nColumnToggle.displayName = 'DataTable.Toolbar.ColumnToggle';\n\n/* ------------------------------------------------------------------ */\n/* BulkAction — hidden when no rows are selected */\n/* ------------------------------------------------------------------ */\n\nexport interface BulkActionProps\n extends Omit<ButtonProps, 'onClick' | 'children' | 'startIcon' | 'intent'> {\n label: string;\n icon?: ReactNode;\n onClick: (api: GridApi | undefined) => void;\n variant?: 'default' | 'destructive';\n}\n\nconst BulkAction = forwardRef<HTMLButtonElement, BulkActionProps>(\n ({ label, icon, onClick, variant = 'default', size = 'sm', ...rest }, ref) => {\n const { t } = useTranslation();\n const { getApi, selectionCount } = useToolbarContext(\n 'DataTable.Toolbar.BulkAction',\n );\n if (selectionCount === 0) return null;\n\n const resolvedIntent = variant === 'destructive' ? 'destructive' : 'secondary';\n\n return (\n <Button\n ref={ref}\n type=\"button\"\n intent={resolvedIntent}\n size={size}\n startIcon={sizeIcon(icon)}\n onClick={() => onClick(getApi())}\n aria-label={`${label} (${t('dataTable.bulkAction', { count: selectionCount })})`}\n {...rest}\n >\n <span>{label}</span>\n <span\n aria-hidden=\"true\"\n className=\"ds:ms-[var(--spacing-xs)] ds:opacity-80\"\n >\n {t('dataTable.bulkAction', { count: selectionCount })}\n </span>\n </Button>\n );\n },\n);\nBulkAction.displayName = 'DataTable.Toolbar.BulkAction';\n\n/* ------------------------------------------------------------------ */\n/* Assembled namespace — mounted on DataTable.Toolbar downstream */\n/* ------------------------------------------------------------------ */\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n FilterBar,\n Actions,\n ExportCsv,\n ExportPdf,\n Print,\n ColumnToggle,\n BulkAction,\n});\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — DataTable. */\n/* */\n/* Operations work against the curated `DataTableHandle`, never the raw */\n/* ag-grid `GridApi` (consumers needing the raw API call `getRawApi()`). */\n/* See `src/docs/26-agent-readiness.mdx` §15. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { DataTableHandle, DataTableSortEntry } from './data-table';\n\nexport const dataTableAgent: AgentAdapter<DataTableHandle> = {\n id: 'data-table',\n capabilities: [\n 'select_single',\n 'select_multiple',\n 'range_pick',\n 'filter',\n 'sort',\n 'paginate',\n ],\n state: {\n selection: {\n type: 'string[]',\n descriptionKey: 'ui.agent.dataTable.state.selection',\n description: 'Row ids of currently-selected rows.',\n read: (handle) => handle.getSelection(),\n },\n filter: {\n type: 'object',\n descriptionKey: 'ui.agent.dataTable.state.filter',\n description: 'Current ag-grid filter model, keyed by column id.',\n read: (handle) => handle.getFilter(),\n },\n sort: {\n type: 'Array<{ colId, sort }>',\n descriptionKey: 'ui.agent.dataTable.state.sort',\n description: 'Active sort, in priority order.',\n read: (handle) => handle.getSort(),\n },\n currentPage: {\n type: 'number',\n descriptionKey: 'ui.agent.dataTable.state.currentPage',\n description: 'Zero-indexed page number.',\n read: (handle) => handle.getCurrentPage(),\n },\n },\n actions: {\n select_rows: {\n safety: 'read',\n argsType: '{ ids: string[] }',\n descriptionKey: 'ui.agent.dataTable.actions.selectRows',\n description: 'Replace the current selection with the given row ids.',\n invoke: (handle, args: { ids: string[] }) => {\n handle.setSelection(args.ids);\n },\n },\n select_range: {\n safety: 'read',\n argsType: '{ fromId: string, toId: string }',\n descriptionKey: 'ui.agent.dataTable.actions.selectRange',\n description: 'Select every row between fromId and toId, inclusive, in current sort order.',\n invoke: (handle, args: { fromId: string; toId: string }) => {\n handle.selectRange(args.fromId, args.toId);\n },\n },\n clear_selection: {\n safety: 'read',\n descriptionKey: 'ui.agent.dataTable.actions.clearSelection',\n description: 'Deselect all rows.',\n invoke: (handle) => {\n handle.clearSelection();\n },\n },\n apply_filter: {\n safety: 'read',\n argsType: '{ model: Record<string, unknown> }',\n descriptionKey: 'ui.agent.dataTable.actions.applyFilter',\n description: 'Replace the filter model with the given object.',\n invoke: (handle, args: { model: Record<string, unknown> }) => {\n handle.setFilter(args.model);\n },\n },\n sort_by: {\n safety: 'read',\n argsType: '{ model: DataTableSortEntry[] }',\n descriptionKey: 'ui.agent.dataTable.actions.sortBy',\n description: 'Replace the active sort with the given list (priority order).',\n invoke: (handle, args: { model: DataTableSortEntry[] }) => {\n handle.setSort(args.model);\n },\n },\n go_to_page: {\n safety: 'read',\n argsType: '{ page: number }',\n descriptionKey: 'ui.agent.dataTable.actions.goToPage',\n description: 'Navigate to the given zero-indexed page.',\n invoke: (handle, args: { page: number }) => {\n handle.goToPage(args.page);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'data-table',\n description: 'Marks the DataTable wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'gridId',\n description: 'Sourced from the gridId prop. Required to address a specific table from the agent.',\n },\n item: {\n attr: 'row-id',\n description: 'Native ag-grid row-id attribute on each rendered row. Selection is performed via the curated handle, not by DOM mutation.',\n },\n },\n};\n","import 'ag-grid-community/styles/ag-grid.css';\n// Font-only — `@font-face { agGridQuartz }` for the icon glyphs. We\n// deliberately do NOT import `ag-theme-quartz.css`: that file scopes ~90\n// CSS variables to `.ag-theme-quartz` and hardcodes colors / IBM Plex Sans\n// / 8px grid, which fight the design-system tokens. `ag-grid-theme.css`\n// below is a standalone bridge that defines every var AG Grid references,\n// mapped to DS tokens.\nimport 'ag-grid-community/styles/agGridQuartzFont.css';\nimport '../../tokens/ag-grid-theme.css';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { Skeleton } from '../skeleton';\nimport { EmptyState } from '../empty-state';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AgGridReact } from 'ag-grid-react';\nimport {\n AllCommunityModule,\n ModuleRegistry,\n type ColDef,\n type FilterChangedEvent,\n type GridApi,\n type GridOptions,\n type IServerSideDatasource,\n type RowClassParams,\n type SortChangedEvent,\n} from 'ag-grid-community';\nimport { Toolbar, ToolbarProvider } from './toolbar';\nimport { useAgentRegistration } from '../../agent';\nimport { dataTableAgent } from './data-table.agent';\n\n// AG Grid v33+ requires module registration before any grid renders.\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst dataTableVariants = cva('ag-theme-alfadocs ds:w-full', {\n variants: {\n density: {\n default: '',\n compact: 'data-table-compact',\n expanded: 'data-table-expanded',\n },\n bordered: {\n true: '',\n false: 'ds:[--ag-borders:none]',\n },\n },\n defaultVariants: {\n density: 'default',\n bordered: true,\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* Curated imperative handle — agent-readiness contract */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableSortEntry {\n colId: string;\n sort: 'asc' | 'desc';\n}\n\n/**\n * Curated handle exposed via `forwardRef`. Replaces the legacy raw `GridApi`\n * forwarding — see `src/docs/26-agent-readiness.mdx` §15. Consumers needing\n * the unwrapped ag-grid API call `getRawApi()`.\n */\nexport interface DataTableHandle<TData = unknown> {\n getSelection: () => string[];\n setSelection: (ids: string[]) => void;\n selectRange: (fromId: string, toId: string) => void;\n clearSelection: () => void;\n getFilter: () => Record<string, unknown>;\n setFilter: (model: Record<string, unknown>) => void;\n getSort: () => DataTableSortEntry[];\n setSort: (model: DataTableSortEntry[]) => void;\n getCurrentPage: () => number;\n goToPage: (page: number) => void;\n getRawApi: () => GridApi<TData> | undefined;\n}\n\n/* ------------------------------------------------------------------ */\n/* Props */\n/* ------------------------------------------------------------------ */\n\nexport interface DataTableProps<TData = unknown>\n extends Omit<VariantProps<typeof dataTableVariants>, 'density'> {\n columnDefs: ColDef<TData>[];\n rowData?: TData[];\n rowSelection?: 'single' | 'multiple';\n pagination?: boolean;\n paginationPageSize?: number;\n serverSideDatasource?: IServerSideDatasource;\n gridId?: string;\n onSelectionChanged?: (rows: TData[]) => void;\n onSortChanged?: (event: SortChangedEvent<TData>) => void;\n onFilterChanged?: (event: FilterChangedEvent<TData>) => void;\n noRowsOverlay?: ComponentType;\n loadingOverlay?: ComponentType;\n gridOptions?: GridOptions<TData>;\n /** Grid height as a Tailwind height class, e.g. `\"h-[500px]\"` or `\"h-[var(--data-table-height)]\"` */\n heightClass?: string;\n className?: string;\n\n /** Row height preset. `expanded` adds headroom for complex cells (balances, tag lists). */\n density?: 'compact' | 'default' | 'expanded';\n\n /** Map row → class name. Use together with `data-table-row-success/warning/error` for tinted rows. */\n getRowClass?: (params: RowClassParams<TData>) => string | undefined;\n /** Rows pinned at the bottom of the grid. Use `useTotalRow()` to compute a totals row. */\n pinnedBottomRowData?: TData[];\n\n /** Print-optimised mode — hides toolbar, disables pagination, renders every row. */\n printMode?: boolean;\n\n /** Composable toolbar — renders `<DataTable.Toolbar>…</DataTable.Toolbar>` above the grid. */\n children?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Locale text builder */\n/* ------------------------------------------------------------------ */\n\nfunction useAgLocaleText() {\n const { t } = useTranslation();\n return useMemo(\n () => ({\n // Filter strings\n contains: t('dataTable.agGrid.contains'),\n notContains: t('dataTable.agGrid.notContains'),\n equals: t('dataTable.agGrid.equals'),\n notEqual: t('dataTable.agGrid.notEqual'),\n startsWith: t('dataTable.agGrid.startsWith'),\n endsWith: t('dataTable.agGrid.endsWith'),\n lessThan: t('dataTable.agGrid.lessThan'),\n greaterThan: t('dataTable.agGrid.greaterThan'),\n inRange: t('dataTable.agGrid.inRange'),\n blank: t('dataTable.agGrid.blank'),\n notBlank: t('dataTable.agGrid.notBlank'),\n filterOoo: t('dataTable.agGrid.filterOoo'),\n applyFilter: t('dataTable.agGrid.applyFilter'),\n resetFilter: t('dataTable.agGrid.resetFilter'),\n noRowsToShow: t('dataTable.agGrid.noRowsToShow'),\n selectAll: t('dataTable.agGrid.selectAll'),\n // Pagination\n page: t('dataTable.page'),\n of: t('dataTable.of'),\n to: t('dataTable.to'),\n nextPage: t('dataTable.nextPage'),\n previousPage: t('dataTable.previousPage'),\n firstPage: t('dataTable.firstPage'),\n lastPage: t('dataTable.lastPage'),\n pageSize: t('dataTable.pageSize'),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [t],\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Loading overlay */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultLoadingOverlay() {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-md)]\"\n >\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton\n // eslint-disable-next-line react/no-array-index-key\n key={i}\n variant=\"rectangular\"\n className=\"ds:h-[var(--min-target-size)] ds:w-full\"\n />\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* No-rows overlay — wired to the DS EmptyState component */\n/* ------------------------------------------------------------------ */\n\nfunction DefaultNoRowsOverlay() {\n const { t } = useTranslation();\n return (\n <EmptyState\n variant=\"no-results\"\n size=\"sm\"\n title={t('dataTable.noRows')}\n description={t('dataTable.noRowsDescription')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Column persistence helpers */\n/* ------------------------------------------------------------------ */\n\nfunction loadColumnState(gridId: string) {\n try {\n const raw = localStorage.getItem(`data-table-col-state:${gridId}`);\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\nfunction saveColumnState(gridId: string, api: GridApi) {\n try {\n localStorage.setItem(\n `data-table-col-state:${gridId}`,\n JSON.stringify(api.getColumnState()),\n );\n } catch {\n // localStorage may be unavailable in some environments\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* DataTable */\n/* ------------------------------------------------------------------ */\n\nfunction DataTableInner<TData = unknown>(\n props: DataTableProps<TData>,\n ref: React.ForwardedRef<DataTableHandle<TData>>,\n) {\n const {\n columnDefs,\n rowData,\n rowSelection,\n pagination = false,\n paginationPageSize = 25,\n serverSideDatasource,\n gridId,\n onSelectionChanged,\n onSortChanged,\n onFilterChanged,\n noRowsOverlay,\n loadingOverlay,\n gridOptions,\n density,\n bordered,\n heightClass = 'h-[500px]',\n className,\n getRowClass,\n pinnedBottomRowData,\n printMode = false,\n children,\n } = props;\n\n const { t, i18n } = useTranslation();\n const agGridRef = useRef<AgGridReact<TData>>(null);\n const [selectionCount, setSelectionCount] = useState(0);\n const [sortAnnouncement, setSortAnnouncement] = useState('');\n const localeText = useAgLocaleText();\n\n // Curated imperative handle — see DataTableHandle above.\n const handle = useMemo<DataTableHandle<TData>>(\n () => ({\n getSelection: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n const ids: string[] = [];\n for (const node of api.getSelectedNodes()) {\n if (node.id != null) ids.push(node.id);\n }\n return ids;\n },\n setSelection: (ids) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const want = new Set(ids);\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n selectRange: (fromId, toId) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const ordered: string[] = [];\n api.forEachNodeAfterFilterAndSort((node) => {\n if (node.id != null) ordered.push(node.id);\n });\n const a = ordered.indexOf(fromId);\n const b = ordered.indexOf(toId);\n if (a < 0 || b < 0) return;\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n const want = new Set(ordered.slice(lo, hi + 1));\n api.forEachNode((node) => {\n if (node.id != null) node.setSelected(want.has(node.id));\n });\n },\n clearSelection: () => {\n agGridRef.current?.api?.deselectAll();\n },\n getFilter: () => agGridRef.current?.api?.getFilterModel() ?? {},\n setFilter: (model) => {\n agGridRef.current?.api?.setFilterModel(model);\n },\n getSort: () => {\n const api = agGridRef.current?.api;\n if (!api) return [];\n return api\n .getColumnState()\n .filter((c) => c.sort === 'asc' || c.sort === 'desc')\n .map((c) => ({ colId: c.colId, sort: c.sort as 'asc' | 'desc' }));\n },\n setSort: (model) => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const next = api.getColumnState().map((c) => {\n const target = model.find((m) => m.colId === c.colId);\n return { ...c, sort: target ? target.sort : null };\n });\n api.applyColumnState({ state: next, defaultState: { sort: null } });\n },\n getCurrentPage: () => agGridRef.current?.api?.paginationGetCurrentPage() ?? 0,\n goToPage: (page) => {\n agGridRef.current?.api?.paginationGoToPage(page);\n },\n getRawApi: () => agGridRef.current?.api,\n }),\n [],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n // Agent adapter is keyed on the row-agnostic DataTableHandle; cast here\n // because TData isn't observable from the agent surface.\n useAgentRegistration(dataTableAgent, handle as DataTableHandle, gridId);\n\n const isRtl = i18n.dir() === 'rtl';\n const isLoading = rowData === undefined;\n\n const prefersReducedMotion = useMemo(\n () => window.matchMedia('(prefers-reduced-motion: reduce)').matches,\n [],\n );\n\n // Suppress compact density in accessible theme — 32px rows violate min-target-size\n const isAccessible = useMemo(\n () => document.documentElement.classList.contains('theme-accessible'),\n [],\n );\n const effectiveDensity = isAccessible && density === 'compact' ? 'default' : density;\n\n // Map logical 'single' | 'multiple' → AG Grid v35 object form\n const rowSelectionOption = useMemo(() => {\n if (!rowSelection) return undefined;\n if (rowSelection === 'single') return { mode: 'singleRow' as const };\n return {\n mode: 'multiRow' as const,\n headerCheckbox: true,\n checkboxes: true,\n };\n }, [rowSelection]);\n\n const rowModelType = serverSideDatasource ? 'serverSide' : 'clientSide';\n\n // Column persistence — restore on mount\n const handleGridReady = useCallback(() => {\n if (!gridId || !agGridRef.current?.api) return;\n const saved = loadColumnState(gridId);\n if (saved) {\n agGridRef.current.api.applyColumnState({ state: saved, applyOrder: true });\n }\n }, [gridId]);\n\n const handleColumnStateChange = useCallback(() => {\n if (gridId && agGridRef.current?.api) {\n saveColumnState(gridId, agGridRef.current.api);\n }\n }, [gridId]);\n\n const handleSelectionChanged = useCallback(() => {\n const api = agGridRef.current?.api;\n if (!api) return;\n const rows = api.getSelectedRows();\n setSelectionCount(rows.length);\n onSelectionChanged?.(rows);\n }, [onSelectionChanged]);\n\n const handleSortChanged = useCallback(\n (event: SortChangedEvent<TData>) => {\n const api = agGridRef.current?.api;\n if (api) {\n const colState = api.getColumnState();\n const sortedCol = colState.find((c) => c.sort);\n if (sortedCol) {\n const colId = sortedCol.colId;\n const colDef = columnDefs.find(\n (cd) => (cd.field as string) === colId || cd.colId === colId,\n );\n const colName = (colDef?.headerName as string) ?? colId;\n const dirKey =\n sortedCol.sort === 'asc'\n ? 'dataTable.sortAscending'\n : 'dataTable.sortDescending';\n setSortAnnouncement(\n t('dataTable.sortAnnounce', {\n column: colName,\n direction: t(dirKey),\n }),\n );\n } else {\n setSortAnnouncement('');\n }\n }\n onSortChanged?.(event);\n },\n [columnDefs, onSortChanged, t],\n );\n\n const handleFilterChanged = useCallback(\n (event: FilterChangedEvent<TData>) => {\n onFilterChanged?.(event);\n },\n [onFilterChanged],\n );\n\n // Clear sort announcement after screen readers have had time to read it\n useEffect(() => {\n if (!sortAnnouncement) return;\n const id = setTimeout(() => setSortAnnouncement(''), 3000);\n return () => clearTimeout(id);\n }, [sortAnnouncement]);\n\n const NoRowsComponent = noRowsOverlay ?? DefaultNoRowsOverlay;\n const LoadingComponent = loadingOverlay ?? DefaultLoadingOverlay;\n\n const getApi = useCallback(\n () => agGridRef.current?.api as GridApi | undefined,\n [],\n );\n\n const handlePrint = useCallback(() => {\n if (typeof window !== 'undefined') {\n window.print();\n }\n }, []);\n\n const wrapperClass = dataTableVariants({\n density: effectiveDensity,\n bordered,\n className,\n });\n\n // Toolbar composition — render either the consumer-provided children,\n // or a default single-button toolbar for backward compatibility.\n const toolbarContent = children ?? (\n <Toolbar>\n <Toolbar.Actions>\n <Toolbar.ExportCsv />\n </Toolbar.Actions>\n </Toolbar>\n );\n\n // Pagination is auto-disabled in print mode so every row prints.\n const paginationEnabled = printMode ? false : pagination;\n\n return (\n <div\n className=\"ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)]\"\n aria-busy={isLoading ? 'true' : undefined}\n data-component=\"data-table\"\n data-component-id={gridId}\n data-print-mode={printMode ? 'true' : undefined}\n >\n {!printMode && (\n <ToolbarProvider\n getApi={getApi}\n selectionCount={selectionCount}\n onPrint={handlePrint}\n >\n {toolbarContent}\n </ToolbarProvider>\n )}\n\n {/* Grid */}\n <div className={[wrapperClass, printMode ? '' : heightClass].join(' ').trim()}>\n <AgGridReact<TData>\n ref={agGridRef}\n // Opt into v32 CSS-file theming so the `.ag-theme-alfadocs` bridge\n // (src/tokens/ag-grid-theme.css) wins. Without this, AG Grid v33+\n // defaults to the JS Theming API (themeQuartz) which overrides our\n // tokens at runtime — including --ag-font-family.\n theme=\"legacy\"\n columnDefs={columnDefs}\n rowData={rowData}\n rowModelType={rowModelType}\n serverSideDatasource={\n serverSideDatasource as IServerSideDatasource | undefined\n }\n rowSelection={rowSelectionOption}\n pagination={paginationEnabled}\n paginationPageSize={paginationPageSize}\n animateRows={!prefersReducedMotion}\n enableRtl={isRtl}\n ensureDomOrder\n suppressCellFocus={false}\n rowBuffer={10}\n localeText={localeText}\n noRowsOverlayComponent={NoRowsComponent}\n loadingOverlayComponent={LoadingComponent}\n getRowClass={getRowClass}\n pinnedBottomRowData={pinnedBottomRowData}\n domLayout={printMode ? 'autoHeight' : undefined}\n onGridReady={handleGridReady}\n onColumnMoved={handleColumnStateChange}\n onColumnResized={handleColumnStateChange}\n onColumnPinned={handleColumnStateChange}\n onSortChanged={handleSortChanged}\n onFilterChanged={handleFilterChanged}\n onSelectionChanged={handleSelectionChanged}\n {...(gridOptions as GridOptions<TData>)}\n />\n </div>\n\n {/* Footer */}\n {!printMode && (\n <div className=\"ds:flex ds:items-center ds:justify-between type-body-sm ds:text-[color:var(--muted-foreground)]\">\n {selectionCount > 0 ? (\n <span>{t('dataTable.selected', { count: selectionCount })}</span>\n ) : (\n <span />\n )}\n </div>\n )}\n\n {/* Aria-live region for sort announcements */}\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {sortAnnouncement}\n </span>\n </div>\n );\n}\n\nconst DataTableBase = forwardRef(DataTableInner) as <TData = unknown>(\n props: DataTableProps<TData> & { ref?: React.Ref<DataTableHandle<TData>> },\n) => React.ReactElement;\n\n(DataTableBase as { displayName?: string }).displayName = 'DataTable';\n\nexport const DataTable = Object.assign(DataTableBase, {\n Toolbar,\n});\n","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 { Badge } from '../../badge/badge';\n\nexport type BadgeVariant = 'neutral' | 'info' | 'success' | 'warning' | 'error';\n\nexport interface StatusCellRendererParams {\n variantMap?: Record<string, BadgeVariant>;\n}\n\nexport function StatusCellRenderer(\n props: CustomCellRendererProps & StatusCellRendererParams,\n) {\n const { value, variantMap } = props;\n const variant: BadgeVariant = variantMap?.[value as string] ?? 'neutral';\n return (\n <Badge variant={variant} withDot size=\"sm\">\n {String(value ?? '')}\n </Badge>\n );\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { Avatar } from '../../avatar/avatar';\n\nexport interface UserCellValue {\n name: string;\n src?: string;\n}\n\nexport function UserCellRenderer(\n props: CustomCellRendererProps<unknown, UserCellValue>,\n) {\n const { value } = props;\n if (!value) return null;\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Avatar name={value.name} src={value.src} size=\"sm\" />\n <span>{value.name}</span>\n </span>\n );\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { useTranslation } from 'react-i18next';\nimport { Tag } from '../../tag/tag';\nimport { Tooltip } from '../../tooltip';\n\nexport interface TagListCellRendererParams {\n maxVisible?: number;\n}\n\nexport function TagListCellRenderer(\n props: CustomCellRendererProps<unknown, string[]> & TagListCellRendererParams,\n) {\n const { value, maxVisible = 3 } = props;\n const { t } = useTranslation();\n\n if (!Array.isArray(value) || value.length === 0) return null;\n\n const visible = value.slice(0, maxVisible);\n const overflow = value.length - maxVisible;\n\n return (\n <span className=\"ds:inline-flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n {visible.map((tag) => (\n <Tag key={tag} label={tag} size=\"sm\" />\n ))}\n {overflow > 0 && (\n <Tooltip label={value.slice(maxVisible).join(', ')}>\n <Tag\n label={t('inputs.multiSelect.overflow', { count: overflow })}\n size=\"sm\"\n variant=\"neutral\"\n fill=\"outline\"\n />\n </Tooltip>\n )}\n </span>\n );\n}\n","import type { CustomCellRendererProps } from 'ag-grid-react';\nimport { Timestamp } from '../../timestamp';\n\nexport type DateCellFormat = 'date' | 'time' | 'datetime' | 'relative';\n\nexport interface DateCellRendererParams {\n /** Which preset to use. Default `'date'`. */\n format?: DateCellFormat;\n /** Escape hatch — overrides the preset entirely. */\n options?: Intl.DateTimeFormatOptions;\n}\n\nconst PRESETS: Record<Exclude<DateCellFormat, 'relative'>, Intl.DateTimeFormatOptions> = {\n date: { year: 'numeric', month: 'short', day: 'numeric' },\n time: { hour: '2-digit', minute: '2-digit' },\n datetime: {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n },\n};\n\nexport function DateCellRenderer(\n props: CustomCellRendererProps & DateCellRendererParams,\n) {\n const { value, format = 'date', options } = props;\n if (value == null || value === '') return null;\n\n // `shape=\"bare\"` keeps the cell font inherited from --ag-font-size. Timestamp\n // still emits a proper `<time dateTime>` for assistive tech and feeds.\n if (format === 'relative' && !options) {\n return <Timestamp value={value as string | Date} shape=\"bare\" />;\n }\n\n return (\n <Timestamp\n value={value as string | Date}\n format=\"absolute\"\n shape=\"bare\"\n absoluteFormat={options ?? PRESETS[format === 'relative' ? 'date' : format]}\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 { value, currency = 'EUR', colorNegative, strikethrough, options } = 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 = ['tabular-nums'];\n if (colorNegative && n < 0) classNames.push('text-[color:var(--destructive)]');\n if (strikethrough) classNames.push('line-through');\n\n return <span className={classNames.join(' ')}>{formatted}</span>;\n}\n","import { cloneElement, isValidElement, type ReactNode } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { IconButton } from '../../button/icon-button';\n\n// Lucide icons render at their intrinsic 24×24 unless given a `size` prop or\n// `size-*` class. The IconButton's wrapping span is only `size-4` (16px), so a\n// bare `<Trash2 />` overflows and, inside AG Grid's `overflow: hidden` cells,\n// gets clipped into horizontal slivers. Coerce icon nodes to the expected size.\nfunction sizeIcon(node: ReactNode): ReactNode {\n if (!isValidElement(node)) return node;\n const element = node as React.ReactElement<{ className?: string; size?: number }>;\n const existingClass = element.props.className ?? '';\n const className = /\\bsize-|\\bw-|\\bh-/.test(existingClass)\n ? existingClass\n : `${existingClass} size-4`.trim();\n return cloneElement(element, { className, size: element.props.size ?? 16 });\n}\n\nexport interface ActionDef<TData = unknown> {\n /** Lucide-style icon node. */\n icon: ReactNode;\n /** Accessible label — also used as the tooltip. */\n label: string;\n /** Invoked with the row data. */\n onClick: (data: TData) => void;\n /** Disable the action. Pass a predicate for per-row disablement. */\n disabled?: boolean | ((data: TData) => boolean);\n /** Human-readable reason shown in the tooltip when disabled. */\n disabledReason?: string;\n /** `destructive` swaps the button intent. */\n variant?: 'default' | 'destructive';\n /** Hide the action entirely. Pass a predicate for per-row hiding. */\n hidden?: boolean | ((data: TData) => boolean);\n}\n\nexport interface ActionsCellRendererParams<TData = unknown> {\n actions: ActionDef<TData>[];\n}\n\nfunction resolve<T>(\n flag: boolean | ((data: T) => boolean) | undefined,\n data: T,\n): boolean {\n if (typeof flag === 'function') return flag(data);\n return Boolean(flag);\n}\n\nexport function ActionsCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & ActionsCellRendererParams<TData>,\n) {\n const { data, actions } = props;\n if (!data) return null;\n\n return (\n <span className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {actions.map((action, index) => {\n if (resolve(action.hidden, data)) return null;\n const isDisabled = resolve(action.disabled, data);\n const tooltip = isDisabled && action.disabledReason\n ? action.disabledReason\n : action.label;\n\n const isDestructive = action.variant === 'destructive';\n\n return (\n <IconButton\n // Action defs are referentially stable from consumers; index is\n // acceptable here because actions do not reorder within a row.\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n size=\"sm\"\n intent=\"ghost\"\n icon={sizeIcon(action.icon)}\n tooltip={tooltip}\n aria-label={action.label}\n disabled={isDisabled}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick(data);\n }}\n className={\n isDestructive\n ? 'ds:text-[color:var(--destructive)] ds:hover:text-[color:var(--destructive-hover)]'\n : undefined\n }\n />\n );\n })}\n </span>\n );\n}\n","import type { MouseEvent } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\n\ntype Getter<T, TData> = T | ((data: TData) => T | undefined);\n\nexport interface LinkCellRendererParams<TData = unknown> {\n /** Anchor href — or a function that derives it from the row. */\n href?: Getter<string, TData>;\n /** Fallback / additional onClick. Prevents default when provided without href. */\n onClick?: (data: TData) => void;\n /** Small text rendered below the link — supports a row-aware function. */\n secondary?: Getter<string, TData>;\n}\n\nfunction resolve<T, TData>(\n source: Getter<T, TData> | undefined,\n data: TData,\n): T | undefined {\n if (typeof source === 'function') {\n return (source as (data: TData) => T | undefined)(data);\n }\n return source;\n}\n\nfunction safeHref(href: string): string {\n return /^(https?:\\/\\/|\\/|#|mailto:|tel:)/i.test(href) ? href : '#';\n}\n\nexport function LinkCellRenderer<TData = unknown>(\n props: CustomCellRendererProps<TData> & LinkCellRendererParams<TData>,\n) {\n const { value, data, href, onClick, secondary } = props;\n if (!data) return null;\n\n const resolvedHref = resolve(href, data);\n const resolvedSecondary = resolve(secondary, data);\n const content = value == null || value === '' ? '' : String(value);\n\n const linkClasses = [\n 'text-[color:var(--primary)]',\n 'hover:underline',\n 'focus-visible:outline-[length:var(--focus-ring-width)]',\n 'focus-visible:outline-solid',\n 'focus-visible:outline-[color:var(--ring)]',\n 'focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'rounded-[var(--radius-sm)]',\n ].join(' ');\n\n const handleClick = (event: MouseEvent) => {\n if (!onClick) return;\n if (!resolvedHref) event.preventDefault();\n event.stopPropagation();\n onClick(data);\n };\n\n return (\n <span className=\"ds:flex ds:flex-col ds:leading-tight\">\n {resolvedHref ? (\n <a\n href={safeHref(resolvedHref)}\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={handleClick}\n className={['ds:appearance-none ds:bg-transparent ds:p-0 ds:text-start', linkClasses].join(' ')}\n >\n {content}\n </button>\n )}\n {resolvedSecondary ? (\n <span className=\"type-meta ds:text-[color:var(--muted-foreground)]\">\n {resolvedSecondary}\n </span>\n ) : null}\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\nimport { CheckSquare, Square } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\n\nexport interface ToggleCellRendererParams<TData = unknown> {\n /** Fires with the row and the new target value. */\n onToggle: (data: TData, newValue: boolean) => 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> & ToggleCellRendererParams<TData>,\n) {\n const {\n value,\n data,\n onToggle,\n trueIcon,\n falseIcon,\n trueClass = 'text-[color:var(--success)]',\n falseClass = 'text-[color:var(--muted-foreground)]',\n label,\n } = props;\n const { t } = useTranslation();\n if (!data) return null;\n\n const isOn = Boolean(value);\n const icon = isOn\n ? (trueIcon ?? <CheckSquare 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 return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n aria-label={resolvedLabel}\n onClick={(event) => {\n event.stopPropagation();\n onToggle(data, !isOn);\n }}\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 stateClass,\n ].join(' ')}\n >\n {icon}\n </button>\n );\n}\n","import { useLayoutEffect, useRef } from 'react';\nimport type { CustomCellRendererProps } from 'ag-grid-react';\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<NonNullable<ColorDotCellRendererParams['size']>, string> = {\n sm: 'size-[var(--icon-size-sm)]',\n md: 'size-[var(--icon-size-md)]',\n lg: '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 (HEX_RE.test(v) || RGB_RE.test(v) || HSL_RE.test(v) || CSS_VAR_RE.test(v)) {\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 useLayoutEffect(() => {\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 { 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\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 return (\n <dl className=\"ds:grid ds:grid-cols-[auto_1fr] ds:gap-x-[var(--spacing-sm)] ds:gap-y-0 type-meta ds:leading-tight\">\n {lines.map((line) => {\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 const valueClass = ['tabular-nums', 'text-end', 'font-medium'];\n if (highlightNegative && n < 0) {\n valueClass.push('text-[color:var(--destructive)]');\n }\n\n return (\n <div key={line.valueField} className=\"ds:contents\">\n <dt className=\"ds:text-[color:var(--muted-foreground)]\">{line.label}</dt>\n <dd className={valueClass.join(' ')}>{formatted}</dd>\n </div>\n );\n })}\n </dl>\n );\n}\n"],"names":["__iconNode","Columns2","createLucideIcon","Download","sizeIcon","node","isValidElement","element","existingClass","className","cloneElement","ToolbarContext","createContext","useToolbarContext","caller","ctx","useContext","ToolbarProvider","getApi","selectionCount","onPrint","children","value","useMemo","jsx","TOOLBAR_BASE","ToolbarRoot","forwardRef","props","ref","FilterBar","Actions","ExportCsv","label","onExport","intent","rest","t","useTranslation","handleClick","useCallback","api","IconButton","ExportPdf","onClick","FileText","Print","Printer","readColumnEntries","col","c","ColumnToggle","open","setOpen","useState","columns","setColumns","useEffect","toggleColumn","colId","nextVisible","prev","labelText","Popover","Columns","Checkbox","checked","BulkAction","icon","variant","size","jsxs","Button","Toolbar","dataTableAgent","handle","args","ModuleRegistry","AllCommunityModule","dataTableVariants","cva","useAgLocaleText","DefaultLoadingOverlay","_","i","Skeleton","DefaultNoRowsOverlay","EmptyState","loadColumnState","gridId","raw","saveColumnState","DataTableInner","columnDefs","rowData","rowSelection","pagination","paginationPageSize","serverSideDatasource","onSelectionChanged","onSortChanged","onFilterChanged","noRowsOverlay","loadingOverlay","gridOptions","density","bordered","heightClass","getRowClass","pinnedBottomRowData","printMode","i18n","agGridRef","useRef","setSelectionCount","sortAnnouncement","setSortAnnouncement","localeText","_a","ids","want","fromId","toId","ordered","a","b","lo","hi","_b","model","next","target","m","page","useImperativeHandle","useAgentRegistration","isRtl","isLoading","prefersReducedMotion","effectiveDensity","rowSelectionOption","rowModelType","handleGridReady","saved","handleColumnStateChange","handleSelectionChanged","rows","handleSortChanged","event","sortedCol","colDef","cd","colName","dirKey","handleFilterChanged","id","NoRowsComponent","LoadingComponent","handlePrint","wrapperClass","toolbarContent","paginationEnabled","AgGridReact","DataTableBase","DataTable","useTotalRow","sumFields","options","row","field","total","r","n","StatusCellRenderer","variantMap","Badge","UserCellRenderer","Avatar","TagListCellRenderer","maxVisible","visible","overflow","tag","Tag","Tooltip","PRESETS","DateCellRenderer","format","Timestamp","toNumber","CurrencyCellRenderer","currency","colorNegative","strikethrough","locale","formatted","classNames","resolve","flag","data","ActionsCellRenderer","actions","action","index","isDisabled","tooltip","isDestructive","source","safeHref","href","LinkCellRenderer","secondary","resolvedHref","resolvedSecondary","content","linkClasses","ToggleCellRenderer","onToggle","trueIcon","falseIcon","trueClass","falseClass","isOn","CheckSquare","Square","stateClass","resolvedLabel","SIZE_CLASS","readField","HEX_RE","RGB_RE","HSL_RE","CSS_VAR_RE","sanitizeColor","v","ColorDotCellRenderer","colorField","labelField","dotRef","rawColor","color","useLayoutEffect","el","readNumber","BalanceCellRenderer","lines","highlightNegative","line","valueClass"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -26,6 +26,7 @@ const L = V({
26
26
  {
27
27
  ref: p,
28
28
  "aria-label": t ?? x("ui.navigation.breadcrumb.label"),
29
+ "data-component": "breadcrumb",
29
30
  className: i,
30
31
  ...d,
31
32
  children: /* @__PURE__ */ e(
@@ -289,4 +290,4 @@ export {
289
290
  $ as d,
290
291
  R as e
291
292
  };
292
- //# sourceMappingURL=breadcrumb-pdUacgm1.js.map
293
+ //# sourceMappingURL=breadcrumb-CcZovmIq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumb-CcZovmIq.js","sources":["../../src/components/breadcrumb/breadcrumb.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronRight, MoreHorizontal } from 'lucide-react';\n\n/* -------------------------------------------------------------------- */\n/* Context — shares separator variant between siblings */\n/* -------------------------------------------------------------------- */\n\ntype SeparatorVariant = 'chevron' | 'slash';\n\ninterface BreadcrumbContextValue {\n separator: SeparatorVariant;\n}\n\nconst BreadcrumbContext = createContext<BreadcrumbContextValue>({\n separator: 'chevron',\n});\n\n/* -------------------------------------------------------------------- */\n/* Root — <nav aria-label> wrapper + truncation engine */\n/* -------------------------------------------------------------------- */\n\nexport interface BreadcrumbProps extends ComponentPropsWithoutRef<'nav'> {\n /** Override the default `aria-label` (falls back to translated `ui.navigation.breadcrumb.label`). */\n 'aria-label'?: string;\n /** Separator glyph between items. @default 'chevron' */\n separator?: SeparatorVariant;\n /** Maximum number of visible crumbs before collapsing. @default 4 */\n maxItems?: number;\n /** Items kept visible at the start. @default 1 */\n itemsBeforeCollapse?: number;\n /** Items kept visible at the end. @default 1 */\n itemsAfterCollapse?: number;\n /** If true, disables collapse behaviour. */\n disableCollapse?: boolean;\n}\n\nconst Breadcrumb = forwardRef<HTMLElement, BreadcrumbProps>(\n (\n {\n children,\n className,\n 'aria-label': ariaLabel,\n separator = 'chevron',\n maxItems = 4,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n disableCollapse = false,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n return (\n <BreadcrumbContext.Provider value={{ separator }}>\n <nav\n ref={ref}\n aria-label={ariaLabel ?? t('ui.navigation.breadcrumb.label')}\n data-component=\"breadcrumb\"\n className={className}\n {...rest}\n >\n <BreadcrumbList\n maxItems={maxItems}\n itemsBeforeCollapse={itemsBeforeCollapse}\n itemsAfterCollapse={itemsAfterCollapse}\n disableCollapse={disableCollapse}\n >\n {children}\n </BreadcrumbList>\n </nav>\n </BreadcrumbContext.Provider>\n );\n },\n);\nBreadcrumb.displayName = 'Breadcrumb';\n\n/* -------------------------------------------------------------------- */\n/* List — walks its children, injects separators & ellipsis */\n/* -------------------------------------------------------------------- */\n\nconst listClasses = [\n 'flex flex-wrap items-center',\n 'gap-[var(--spacing-xs)]',\n 'text-[var(--font-size-sm)] text-[var(--muted-foreground)]',\n 'ps-0 m-0',\n 'list-none',\n].join(' ');\n\nexport interface BreadcrumbListProps extends ComponentPropsWithoutRef<'ol'> {\n maxItems?: number;\n itemsBeforeCollapse?: number;\n itemsAfterCollapse?: number;\n disableCollapse?: boolean;\n}\n\nconst BreadcrumbList = forwardRef<HTMLOListElement, BreadcrumbListProps>(\n (\n {\n children,\n className,\n maxItems = 4,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n disableCollapse = false,\n ...rest\n },\n ref,\n ) => {\n const arr = Children.toArray(children).filter((c) => isValidElement(c)) as ReactElement[];\n const total = arr.length;\n\n const shouldCollapse =\n !disableCollapse &&\n total > maxItems &&\n itemsBeforeCollapse + itemsAfterCollapse < total;\n\n const renderItem = (child: ReactElement, isLast: boolean, key: string) =>\n cloneElement(child, {\n isCurrent: (child.props as BreadcrumbItemProps).isCurrent ?? isLast,\n key,\n } as Partial<BreadcrumbItemProps>);\n\n const renderSeparatorIf = (condition: boolean, key: string) =>\n condition ? <BreadcrumbSeparator key={key} /> : null;\n\n let nodes: ReactNode[] = [];\n if (!shouldCollapse) {\n arr.forEach((child, i) => {\n const isLast = i === total - 1;\n nodes.push(renderItem(child, isLast, `item-${i}`));\n nodes.push(renderSeparatorIf(!isLast, `sep-${i}`));\n });\n } else {\n const before = arr.slice(0, itemsBeforeCollapse);\n const after = arr.slice(total - itemsAfterCollapse);\n const hidden = arr.slice(itemsBeforeCollapse, total - itemsAfterCollapse);\n\n before.forEach((child, i) => {\n nodes.push(renderItem(child, false, `b-${i}`));\n nodes.push(renderSeparatorIf(true, `b-sep-${i}`));\n });\n\n nodes.push(\n <BreadcrumbItem key=\"ellipsis\">\n <BreadcrumbEllipsis hiddenItems={hidden} />\n </BreadcrumbItem>,\n );\n nodes.push(renderSeparatorIf(true, 'ellipsis-sep'));\n\n after.forEach((child, i) => {\n const isLast = i === after.length - 1;\n nodes.push(renderItem(child, isLast, `a-${i}`));\n nodes.push(renderSeparatorIf(!isLast, `a-sep-${i}`));\n });\n }\n\n return (\n <ol ref={ref} className={[listClasses, className].filter(Boolean).join(' ')} {...rest}>\n {nodes}\n </ol>\n );\n },\n);\nBreadcrumbList.displayName = 'BreadcrumbList';\n\n/* -------------------------------------------------------------------- */\n/* Item — <li> marks current when `isCurrent` */\n/* -------------------------------------------------------------------- */\n\nconst itemClasses = [\n 'inline-flex items-center',\n 'max-inline-size-[16rem]',\n 'min-h-[var(--min-target-size)]',\n 'py-[var(--spacing-xs)]',\n].join(' ');\n\nexport interface BreadcrumbItemProps extends ComponentPropsWithoutRef<'li'> {\n /** Set automatically by `BreadcrumbList` on the final item. */\n isCurrent?: boolean;\n}\n\nconst BreadcrumbItem = forwardRef<HTMLLIElement, BreadcrumbItemProps>(\n ({ children, className, isCurrent = false, ...rest }, ref) => (\n <li\n ref={ref}\n className={[itemClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n {Children.map(children, (child) =>\n isValidElement(child) &&\n (child.type === BreadcrumbLink || (child.props as { _link?: boolean })?._link)\n ? cloneElement(child as ReactElement<BreadcrumbLinkProps>, {\n isCurrent,\n })\n : child,\n )}\n </li>\n ),\n);\nBreadcrumbItem.displayName = 'BreadcrumbItem';\n\n/* -------------------------------------------------------------------- */\n/* Link — renders <a>, or plain text when current */\n/* -------------------------------------------------------------------- */\n\nconst linkClasses = [\n 'inline-flex items-center',\n 'max-inline-size-[16rem]',\n 'overflow-hidden text-ellipsis whitespace-nowrap',\n 'break-normal',\n 'text-[var(--muted-foreground)] no-underline',\n 'hover:text-[var(--foreground)] hover:underline',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'rounded-[var(--radius-sm)]',\n 'transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none',\n 'min-h-[var(--min-target-size)] ps-[var(--spacing-xs)] pe-[var(--spacing-xs)]',\n].join(' ');\n\nconst currentClasses = [\n 'inline-flex items-center',\n 'max-inline-size-[16rem]',\n 'overflow-hidden text-ellipsis whitespace-nowrap',\n 'break-normal',\n 'text-[var(--foreground)] font-[var(--font-weight-semibold)]',\n 'min-h-[var(--min-target-size)] ps-[var(--spacing-xs)] pe-[var(--spacing-xs)]',\n].join(' ');\n\nexport interface BreadcrumbLinkProps\n extends AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Use Radix `Slot` so consumers can pass a router link. */\n asChild?: boolean;\n /** Set by the parent Item when this is the current page. */\n isCurrent?: boolean;\n}\n\nconst BreadcrumbLink = forwardRef<HTMLAnchorElement, BreadcrumbLinkProps>(\n ({ asChild = false, isCurrent = false, className, children, ...rest }, ref) => {\n const { t } = useTranslation();\n\n if (isCurrent) {\n return (\n <span\n aria-current=\"page\"\n aria-label={\n (rest['aria-label'] as string | undefined) ??\n t('ui.navigation.breadcrumb.current')\n }\n className={[currentClasses, className].filter(Boolean).join(' ')}\n >\n {children}\n </span>\n );\n }\n\n if (asChild) {\n return (\n <Slot\n ref={ref}\n className={[linkClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </Slot>\n );\n }\n\n return (\n <a\n ref={ref}\n className={[linkClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n {children}\n </a>\n );\n },\n);\nBreadcrumbLink.displayName = 'BreadcrumbLink';\n\n/* -------------------------------------------------------------------- */\n/* Separator */\n/* -------------------------------------------------------------------- */\n\nconst separatorVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:text-[var(--muted-foreground)]',\n 'ds:ms-[var(--spacing-xs)] ds:me-[var(--spacing-xs)]',\n 'ds:select-none',\n ].join(' '),\n {\n variants: {\n variant: {\n chevron: '',\n slash: '',\n },\n },\n defaultVariants: { variant: 'chevron' },\n },\n);\n\nexport interface BreadcrumbSeparatorProps\n extends Omit<ComponentPropsWithoutRef<'li'>, 'children'>,\n VariantProps<typeof separatorVariants> {\n children?: ReactNode;\n}\n\nconst BreadcrumbSeparator = forwardRef<HTMLLIElement, BreadcrumbSeparatorProps>(\n ({ className, variant, children, ...rest }, ref) => {\n const ctx = useContext(BreadcrumbContext);\n const resolved = variant ?? ctx.separator;\n const defaultGlyph =\n resolved === 'slash' ? (\n <span aria-hidden=\"true\">/</span>\n ) : (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:rtl:-scale-x-100\"\n />\n );\n return (\n <li\n ref={ref}\n aria-hidden=\"true\"\n role=\"presentation\"\n className={separatorVariants({ variant: resolved, className })}\n {...rest}\n >\n {children ?? defaultGlyph}\n </li>\n );\n },\n);\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator';\n\n/* -------------------------------------------------------------------- */\n/* Ellipsis — opens a Radix DropdownMenu with hidden crumbs */\n/* -------------------------------------------------------------------- */\n\nconst ellipsisTriggerClasses = [\n 'inline-flex items-center justify-center',\n 'min-w-[var(--min-target-size)] min-h-[var(--min-target-size)]',\n 'rounded-[var(--radius-sm)]',\n 'text-[var(--muted-foreground)]',\n 'hover:text-[var(--foreground)]',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none',\n].join(' ');\n\nconst ellipsisContentClasses = [\n 'z-[var(--z-dropdown)] min-w-[12rem] overflow-hidden',\n 'rounded-[var(--radius-md)] border border-[var(--border)]',\n 'bg-[var(--background)] text-[var(--foreground)]',\n 'shadow-[var(--shadow-lg)]',\n 'p-[var(--spacing-xs)]',\n 'animate-in fade-in zoom-in-95 motion-reduce:animate-none',\n].join(' ');\n\nconst ellipsisItemClasses = [\n 'flex items-center',\n 'min-h-[var(--min-target-size)]',\n 'ps-[var(--spacing-sm)] pe-[var(--spacing-sm)]',\n 'rounded-[var(--radius-sm)]',\n 'text-[var(--foreground)] cursor-pointer select-none',\n 'data-[highlighted]:bg-[var(--muted)] data-[highlighted]:text-[var(--foreground)]',\n 'outline-none',\n].join(' ');\n\nexport interface BreadcrumbEllipsisProps extends ComponentPropsWithoutRef<'button'> {\n /** Hidden crumb elements rendered inside the dropdown menu. */\n hiddenItems?: ReactElement[];\n}\n\nconst BreadcrumbEllipsis = forwardRef<HTMLButtonElement, BreadcrumbEllipsisProps>(\n ({ className, hiddenItems = [], ...rest }, ref) => {\n const { t } = useTranslation();\n const showPath = t('ui.navigation.breadcrumb.showPath');\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n ref={ref}\n type=\"button\"\n aria-label={showPath}\n className={[ellipsisTriggerClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n <MoreHorizontal aria-hidden=\"true\" className=\"ds:size-4\" />\n <span className=\"ds:sr-only\">{showPath}</span>\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className={ellipsisContentClasses}\n align=\"start\"\n sideOffset={6}\n >\n {hiddenItems.map((item, i) => {\n // Extract the anchor inside the hidden BreadcrumbItem (if any)\n const linkChild = extractLink(item);\n return (\n <DropdownMenu.Item\n key={`hidden-${i}`}\n asChild\n className={ellipsisItemClasses}\n >\n {linkChild ?? <span>{item}</span>}\n </DropdownMenu.Item>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n },\n);\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis';\n\n/**\n * Walks a `BreadcrumbItem` to find the first child whose type is\n * `BreadcrumbLink` and returns the link rendered as a plain `<a>` so the\n * dropdown item can adopt its navigational behaviour.\n */\nfunction extractLink(item: ReactElement): ReactElement | null {\n let found: ReactElement | null = null;\n const itemChildren = (item.props as { children?: ReactNode }).children;\n Children.forEach(itemChildren, (child) => {\n if (found) return;\n if (!isValidElement(child)) return;\n if (child.type === BreadcrumbLink) {\n const linkProps = child.props as BreadcrumbLinkProps & { children?: ReactNode };\n const href = typeof linkProps.href === 'string' ? linkProps.href : undefined;\n const safeHref =\n href && /^\\s*javascript:/i.test(href) ? undefined : href;\n found = (\n <a\n href={safeHref}\n onClick={linkProps.onClick as AnchorHTMLAttributes<HTMLAnchorElement>['onClick']}\n >\n {linkProps.children}\n </a>\n );\n }\n });\n return found;\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n"],"names":["BreadcrumbContext","createContext","Breadcrumb","forwardRef","children","className","ariaLabel","separator","maxItems","itemsBeforeCollapse","itemsAfterCollapse","disableCollapse","rest","ref","t","useTranslation","jsx","BreadcrumbList","listClasses","arr","Children","c","isValidElement","total","shouldCollapse","renderItem","child","isLast","key","cloneElement","renderSeparatorIf","condition","BreadcrumbSeparator","nodes","i","before","after","hidden","BreadcrumbItem","BreadcrumbEllipsis","itemClasses","isCurrent","BreadcrumbLink","_a","linkClasses","currentClasses","asChild","Slot","separatorVariants","cva","variant","ctx","useContext","resolved","defaultGlyph","ChevronRight","ellipsisTriggerClasses","ellipsisContentClasses","ellipsisItemClasses","hiddenItems","showPath","jsxs","DropdownMenu","MoreHorizontal","item","linkChild","extractLink","found","itemChildren","linkProps","href","safeHref"],"mappings":"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"}
@@ -45,14 +45,14 @@ const M = S(
45
45
  ), U = K(
46
46
  ({
47
47
  className: x,
48
- orientation: l = "horizontal",
48
+ orientation: a = "horizontal",
49
49
  separator: k = !1,
50
50
  toolbar: p = !1,
51
51
  intent: v = "outline",
52
52
  label: A,
53
53
  children: z,
54
54
  ...E
55
- }, a) => {
55
+ }, l) => {
56
56
  const { t: L } = H(), j = A ?? L("ui.buttonGroup.label", "Button group"), c = p, d = R([]), [u, h] = g(0), w = R(null), [b, B] = g(!1);
57
57
  T(() => {
58
58
  if (typeof window > "u") return;
@@ -65,7 +65,7 @@ const M = S(
65
65
  if (!c) return;
66
66
  const e = d.current.filter(Boolean).length;
67
67
  if (e === 0) return;
68
- const s = l === "vertical" ? "ArrowDown" : b ? "ArrowLeft" : "ArrowRight", f = l === "vertical" ? "ArrowUp" : b ? "ArrowRight" : "ArrowLeft";
68
+ const s = a === "vertical" ? "ArrowDown" : b ? "ArrowLeft" : "ArrowRight", f = a === "vertical" ? "ArrowUp" : b ? "ArrowRight" : "ArrowLeft";
69
69
  let n = null;
70
70
  if (t.key === s ? n = (u + 1) % e : t.key === f ? n = (u - 1 + e) % e : t.key === "Home" ? n = 0 : t.key === "End" && (n = e - 1), n === null) return;
71
71
  const i = e;
@@ -78,7 +78,7 @@ const M = S(
78
78
  }
79
79
  t.preventDefault(), h(r), (y = d.current[r]) == null || y.focus();
80
80
  },
81
- [c, l, b, u]
81
+ [c, a, b, u]
82
82
  ), D = C.map(z, (t, e) => {
83
83
  if (!F(t)) return t;
84
84
  const s = t, f = (i) => {
@@ -100,13 +100,14 @@ const M = S(
100
100
  "div",
101
101
  {
102
102
  ref: (t) => {
103
- w.current = t, typeof a == "function" ? a(t) : a && typeof a == "object" && (a.current = t);
103
+ w.current = t, typeof l == "function" ? l(t) : l && typeof l == "object" && (l.current = t);
104
104
  },
105
105
  role: p ? "toolbar" : "group",
106
106
  "aria-label": j,
107
- "aria-orientation": p ? l ?? "horizontal" : void 0,
107
+ "aria-orientation": p ? a ?? "horizontal" : void 0,
108
+ "data-component": "button-group",
108
109
  onKeyDown: I,
109
- className: M({ orientation: l, separator: k, className: x }),
110
+ className: M({ orientation: a, separator: k, className: x }),
110
111
  ...E,
111
112
  children: D
112
113
  }
@@ -117,4 +118,4 @@ U.displayName = "ButtonGroup";
117
118
  export {
118
119
  U as B
119
120
  };
120
- //# sourceMappingURL=button-group-BtTHSyU0.js.map
121
+ //# sourceMappingURL=button-group-CONver7M.js.map