erp-pro-ui 0.2.4 → 0.2.6

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 (413) hide show
  1. package/dist/accordion.cjs +1 -1
  2. package/dist/accordion.mjs +1 -1
  3. package/dist/alert.cjs +1 -1
  4. package/dist/alert.mjs +1 -1
  5. package/dist/animated-content.cjs +1 -1
  6. package/dist/animated-content.mjs +1 -1
  7. package/dist/ascii-text.cjs +1 -1
  8. package/dist/ascii-text.mjs +1 -1
  9. package/dist/background-gradient-animation.cjs +1 -1
  10. package/dist/background-gradient-animation.mjs +1 -1
  11. package/dist/button-hover-border-gradient.cjs +1 -1
  12. package/dist/button-hover-border-gradient.mjs +1 -1
  13. package/dist/button.cjs +1 -1
  14. package/dist/button.mjs +1 -1
  15. package/dist/calendar.cjs +1 -1
  16. package/dist/calendar.mjs +1 -1
  17. package/dist/card.cjs +1 -1
  18. package/dist/card.mjs +1 -1
  19. package/dist/carousel.cjs +1 -1
  20. package/dist/carousel.mjs +1 -1
  21. package/dist/catalog.cjs +14 -0
  22. package/dist/catalog.cjs.map +1 -1
  23. package/dist/catalog.d.ts +25 -1
  24. package/dist/catalog.d.ts.map +1 -1
  25. package/dist/catalog.mjs +14 -0
  26. package/dist/catalog.mjs.map +1 -1
  27. package/dist/charts.cjs +1 -1
  28. package/dist/charts.mjs +1 -1
  29. package/dist/checkbox.cjs +1 -1
  30. package/dist/checkbox.mjs +1 -1
  31. package/dist/chip.cjs +1 -1
  32. package/dist/chip.mjs +1 -1
  33. package/dist/chroma-grid.cjs +1 -1
  34. package/dist/chroma-grid.mjs +1 -1
  35. package/dist/chunks/{drawer-D07dGN6R.cjs → Drawer-D72Xi2Gq.cjs} +2 -2
  36. package/dist/chunks/{drawer-D07dGN6R.cjs.map → Drawer-D72Xi2Gq.cjs.map} +1 -1
  37. package/dist/chunks/{drawer-DaoAXL-w.mjs → Drawer-Y0_sJni5.mjs} +2 -2
  38. package/dist/chunks/{drawer-DaoAXL-w.mjs.map → Drawer-Y0_sJni5.mjs.map} +1 -1
  39. package/dist/chunks/{DropdownMenu-BtTOri-A.mjs → DropdownMenu-BQ4WlaGp.mjs} +1 -1
  40. package/dist/chunks/{DropdownMenu-BtTOri-A.mjs.map → DropdownMenu-BQ4WlaGp.mjs.map} +1 -1
  41. package/dist/chunks/{DropdownMenu-BDrNYO-D.cjs → DropdownMenu-yh04burS.cjs} +1 -1
  42. package/dist/chunks/{DropdownMenu-BDrNYO-D.cjs.map → DropdownMenu-yh04burS.cjs.map} +1 -1
  43. package/dist/chunks/EllipsisVerticalIcon-BJw3MNkg.cjs +51 -0
  44. package/dist/chunks/EllipsisVerticalIcon-BJw3MNkg.cjs.map +1 -0
  45. package/dist/chunks/EllipsisVerticalIcon-C2b2KMfE.mjs +45 -0
  46. package/dist/chunks/EllipsisVerticalIcon-C2b2KMfE.mjs.map +1 -0
  47. package/dist/chunks/{HoverBorderGradient-NbdXeLgC.mjs → HoverBorderGradient-DEtm3owk.mjs} +1 -1
  48. package/dist/chunks/{HoverBorderGradient-NbdXeLgC.mjs.map → HoverBorderGradient-DEtm3owk.mjs.map} +1 -1
  49. package/dist/chunks/{HoverBorderGradient-9pfvBoHR.cjs → HoverBorderGradient-DMMyr2L3.cjs} +1 -1
  50. package/dist/chunks/{HoverBorderGradient-9pfvBoHR.cjs.map → HoverBorderGradient-DMMyr2L3.cjs.map} +1 -1
  51. package/dist/chunks/{SunToMoonButton-BkEfkElJ.mjs → SunToMoonButton-BOKHzC1H.mjs} +1 -1
  52. package/dist/chunks/{SunToMoonButton-BkEfkElJ.mjs.map → SunToMoonButton-BOKHzC1H.mjs.map} +1 -1
  53. package/dist/chunks/{SunToMoonButton-jS4BJD9q.cjs → SunToMoonButton-gX4Kk_5B.cjs} +1 -1
  54. package/dist/chunks/{SunToMoonButton-jS4BJD9q.cjs.map → SunToMoonButton-gX4Kk_5B.cjs.map} +1 -1
  55. package/dist/chunks/{Tooltip-DK3B879v.mjs → Tooltip-LbOKP__2.mjs} +10 -7
  56. package/dist/chunks/Tooltip-LbOKP__2.mjs.map +1 -0
  57. package/dist/chunks/{Tooltip-DD30yj3A.cjs → Tooltip-nnaiqJTT.cjs} +10 -7
  58. package/dist/chunks/Tooltip-nnaiqJTT.cjs.map +1 -0
  59. package/dist/chunks/{accordion-CmB6EidC.cjs → accordion-Bj3Sj0mC.cjs} +2 -2
  60. package/dist/chunks/{accordion-CmB6EidC.cjs.map → accordion-Bj3Sj0mC.cjs.map} +1 -1
  61. package/dist/chunks/{accordion-6zxJUYXr.mjs → accordion-CLcjNX_X.mjs} +2 -2
  62. package/dist/chunks/{accordion-6zxJUYXr.mjs.map → accordion-CLcjNX_X.mjs.map} +1 -1
  63. package/dist/chunks/{alert-C5KEeQqh.cjs → alert-BBA4Sh4e.cjs} +2 -2
  64. package/dist/chunks/{alert-C5KEeQqh.cjs.map → alert-BBA4Sh4e.cjs.map} +1 -1
  65. package/dist/chunks/{alert-XVmYJgds.mjs → alert-oUz79MGc.mjs} +2 -2
  66. package/dist/chunks/{alert-XVmYJgds.mjs.map → alert-oUz79MGc.mjs.map} +1 -1
  67. package/dist/chunks/{animated-content-CLsFnjgr.cjs → animated-content-B3wbiWQI.cjs} +1 -1
  68. package/dist/chunks/{animated-content-CLsFnjgr.cjs.map → animated-content-B3wbiWQI.cjs.map} +1 -1
  69. package/dist/chunks/{animated-content-bK6xp-vc.mjs → animated-content-CiNJLgbq.mjs} +1 -1
  70. package/dist/chunks/{animated-content-bK6xp-vc.mjs.map → animated-content-CiNJLgbq.mjs.map} +1 -1
  71. package/dist/chunks/{ascii-text-Bdy4C5rU.mjs → ascii-text-C6JegLhP.mjs} +1 -1
  72. package/dist/chunks/{ascii-text-Bdy4C5rU.mjs.map → ascii-text-C6JegLhP.mjs.map} +1 -1
  73. package/dist/chunks/{ascii-text-BFnpVur6.cjs → ascii-text-KwVE41Hw.cjs} +1 -1
  74. package/dist/chunks/{ascii-text-BFnpVur6.cjs.map → ascii-text-KwVE41Hw.cjs.map} +1 -1
  75. package/dist/chunks/{background-gradient-animation-CiNdmA61.cjs → background-gradient-animation-1LZY3DYT.cjs} +1 -1
  76. package/dist/chunks/{background-gradient-animation-CiNdmA61.cjs.map → background-gradient-animation-1LZY3DYT.cjs.map} +1 -1
  77. package/dist/chunks/{background-gradient-animation-BR9wx6Z8.mjs → background-gradient-animation-CTc2ZR74.mjs} +1 -1
  78. package/dist/chunks/{background-gradient-animation-BR9wx6Z8.mjs.map → background-gradient-animation-CTc2ZR74.mjs.map} +1 -1
  79. package/dist/chunks/{button-A6UTvrOu.mjs → button-IDShmQqA.mjs} +3 -2
  80. package/dist/chunks/button-IDShmQqA.mjs.map +1 -0
  81. package/dist/chunks/{button-hover-border-gradient-DnFvjNNw.mjs → button-hover-border-gradient-B2ebbDek.mjs} +2 -2
  82. package/dist/chunks/{button-hover-border-gradient-DnFvjNNw.mjs.map → button-hover-border-gradient-B2ebbDek.mjs.map} +1 -1
  83. package/dist/chunks/{button-hover-border-gradient-ssmwU5-U.cjs → button-hover-border-gradient-DGZqd8je.cjs} +2 -2
  84. package/dist/chunks/{button-hover-border-gradient-ssmwU5-U.cjs.map → button-hover-border-gradient-DGZqd8je.cjs.map} +1 -1
  85. package/dist/chunks/{button-C4MXPxsC.cjs → button-uD87K76W.cjs} +3 -2
  86. package/dist/chunks/button-uD87K76W.cjs.map +1 -0
  87. package/dist/chunks/{calendar-CQJgQ5H_.cjs → calendar-DCkikZYb.cjs} +2 -2
  88. package/dist/chunks/{calendar-CQJgQ5H_.cjs.map → calendar-DCkikZYb.cjs.map} +1 -1
  89. package/dist/chunks/{calendar-5XzPqKbE.mjs → calendar-FxAmm_ao.mjs} +2 -2
  90. package/dist/chunks/{calendar-5XzPqKbE.mjs.map → calendar-FxAmm_ao.mjs.map} +1 -1
  91. package/dist/chunks/{card-RrT68nvu.cjs → card-Cuud0jIt.cjs} +1 -1
  92. package/dist/chunks/{card-RrT68nvu.cjs.map → card-Cuud0jIt.cjs.map} +1 -1
  93. package/dist/chunks/{card-BId1_zHw.mjs → card-DNeC6jqk.mjs} +1 -1
  94. package/dist/chunks/{card-BId1_zHw.mjs.map → card-DNeC6jqk.mjs.map} +1 -1
  95. package/dist/chunks/{carousel-Dd4rp-jr.mjs → carousel-Dpe5QLJK.mjs} +2 -2
  96. package/dist/chunks/{carousel-Dd4rp-jr.mjs.map → carousel-Dpe5QLJK.mjs.map} +1 -1
  97. package/dist/chunks/{carousel-Cv0m1Pp5.cjs → carousel-xHkrV_pt.cjs} +2 -2
  98. package/dist/chunks/{carousel-Cv0m1Pp5.cjs.map → carousel-xHkrV_pt.cjs.map} +1 -1
  99. package/dist/chunks/chartStyles-BADmRKZo.cjs +108 -0
  100. package/dist/chunks/chartStyles-BADmRKZo.cjs.map +1 -0
  101. package/dist/chunks/chartStyles-DPXgYmGn.mjs +55 -0
  102. package/dist/chunks/chartStyles-DPXgYmGn.mjs.map +1 -0
  103. package/dist/chunks/{charts-DkVu0rFc.mjs → charts-C-KQ3Nk5.mjs} +3 -54
  104. package/dist/chunks/charts-C-KQ3Nk5.mjs.map +1 -0
  105. package/dist/chunks/{charts-BmIV-mJy.cjs → charts-COx3IbI2.cjs} +42 -93
  106. package/dist/chunks/charts-COx3IbI2.cjs.map +1 -0
  107. package/dist/chunks/{checkbox-D8ivRZ1x.cjs → checkbox-CDknzh89.cjs} +1 -1
  108. package/dist/chunks/{checkbox-D8ivRZ1x.cjs.map → checkbox-CDknzh89.cjs.map} +1 -1
  109. package/dist/chunks/{checkbox-3aB7XC9_.mjs → checkbox-Y04NlzB8.mjs} +1 -1
  110. package/dist/chunks/{checkbox-3aB7XC9_.mjs.map → checkbox-Y04NlzB8.mjs.map} +1 -1
  111. package/dist/chunks/{chip-CqcdcSs2.mjs → chip-B3j6R6sO.mjs} +3 -3
  112. package/dist/chunks/{chip-CqcdcSs2.mjs.map → chip-B3j6R6sO.mjs.map} +1 -1
  113. package/dist/chunks/{chip-B0YzBwkz.cjs → chip-sfQlzrbo.cjs} +3 -3
  114. package/dist/chunks/{chip-B0YzBwkz.cjs.map → chip-sfQlzrbo.cjs.map} +1 -1
  115. package/dist/chunks/{chroma-grid-opB2DBtS.mjs → chroma-grid-BHS9qAn_.mjs} +1 -1
  116. package/dist/chunks/{chroma-grid-opB2DBtS.mjs.map → chroma-grid-BHS9qAn_.mjs.map} +1 -1
  117. package/dist/chunks/{chroma-grid-DcZ9f4Ui.cjs → chroma-grid-Bp55pKEm.cjs} +1 -1
  118. package/dist/chunks/{chroma-grid-DcZ9f4Ui.cjs.map → chroma-grid-Bp55pKEm.cjs.map} +1 -1
  119. package/dist/chunks/{color-palette-C3lesasJ.mjs → color-palette-D9Qlw2Cx.mjs} +1 -1
  120. package/dist/chunks/{color-palette-C3lesasJ.mjs.map → color-palette-D9Qlw2Cx.mjs.map} +1 -1
  121. package/dist/chunks/{color-palette-pLh6En3n.cjs → color-palette-Duud5Iqq.cjs} +1 -1
  122. package/dist/chunks/{color-palette-pLh6En3n.cjs.map → color-palette-Duud5Iqq.cjs.map} +1 -1
  123. package/dist/chunks/{combobox-CtNrGmuR.cjs → combobox-C3a2iogC.cjs} +4 -4
  124. package/dist/chunks/{combobox-CtNrGmuR.cjs.map → combobox-C3a2iogC.cjs.map} +1 -1
  125. package/dist/chunks/{combobox-B6yk5U82.mjs → combobox-neBItbtz.mjs} +4 -4
  126. package/dist/chunks/{combobox-B6yk5U82.mjs.map → combobox-neBItbtz.mjs.map} +1 -1
  127. package/dist/chunks/dashboard-cards-BnPt0gDW.mjs +2428 -0
  128. package/dist/chunks/dashboard-cards-BnPt0gDW.mjs.map +1 -0
  129. package/dist/chunks/dashboard-cards-DNWJPKRu.cjs +2524 -0
  130. package/dist/chunks/dashboard-cards-DNWJPKRu.cjs.map +1 -0
  131. package/dist/chunks/{data-table-fAEuevPn.cjs → data-table-BZEiSZI2.cjs} +48 -36
  132. package/dist/chunks/data-table-BZEiSZI2.cjs.map +1 -0
  133. package/dist/chunks/{data-table-Dtf6lKpp.mjs → data-table-EfGKkerd.mjs} +47 -35
  134. package/dist/chunks/data-table-EfGKkerd.mjs.map +1 -0
  135. package/dist/chunks/{date-picker-BmQ0rgwH.mjs → date-picker-3IDSmb9Z.mjs} +3 -3
  136. package/dist/chunks/{date-picker-BmQ0rgwH.mjs.map → date-picker-3IDSmb9Z.mjs.map} +1 -1
  137. package/dist/chunks/{date-picker-qpUZMtZC.cjs → date-picker-_EVYpGga.cjs} +3 -3
  138. package/dist/chunks/{date-picker-qpUZMtZC.cjs.map → date-picker-_EVYpGga.cjs.map} +1 -1
  139. package/dist/chunks/{dialog-DSyq6MS3.mjs → dialog-B60BjJz0.mjs} +3 -3
  140. package/dist/chunks/{dialog-DSyq6MS3.mjs.map → dialog-B60BjJz0.mjs.map} +1 -1
  141. package/dist/chunks/{dialog-J2ZTSTpL.cjs → dialog-i9LdkXmF.cjs} +3 -3
  142. package/dist/chunks/{dialog-J2ZTSTpL.cjs.map → dialog-i9LdkXmF.cjs.map} +1 -1
  143. package/dist/chunks/event-calendar-BbFOUDov.mjs +1191 -0
  144. package/dist/chunks/event-calendar-BbFOUDov.mjs.map +1 -0
  145. package/dist/chunks/event-calendar-Bljd_7PI.cjs +1209 -0
  146. package/dist/chunks/event-calendar-Bljd_7PI.cjs.map +1 -0
  147. package/dist/chunks/{form-CtZ6U-_B.mjs → form-CDc9UM3r.mjs} +1 -1
  148. package/dist/chunks/{form-CtZ6U-_B.mjs.map → form-CDc9UM3r.mjs.map} +1 -1
  149. package/dist/chunks/{form-X6Vyaavl.cjs → form-DGwdlSW2.cjs} +1 -1
  150. package/dist/chunks/{form-X6Vyaavl.cjs.map → form-DGwdlSW2.cjs.map} +1 -1
  151. package/dist/chunks/{gradual-blur-C6NOnjTw.cjs → gradual-blur-BNYVlqb1.cjs} +1 -1
  152. package/dist/chunks/{gradual-blur-C6NOnjTw.cjs.map → gradual-blur-BNYVlqb1.cjs.map} +1 -1
  153. package/dist/chunks/{gradual-blur-DXfxpCdB.mjs → gradual-blur-Bw2KNmXb.mjs} +1 -1
  154. package/dist/chunks/{gradual-blur-DXfxpCdB.mjs.map → gradual-blur-Bw2KNmXb.mjs.map} +1 -1
  155. package/dist/chunks/{hover-card--rplmsA_.cjs → hover-card-Dp6Y2h2J.cjs} +1 -1
  156. package/dist/chunks/{hover-card--rplmsA_.cjs.map → hover-card-Dp6Y2h2J.cjs.map} +1 -1
  157. package/dist/chunks/{hover-card-C88rU-nW.mjs → hover-card-G66SUyjq.mjs} +1 -1
  158. package/dist/chunks/{hover-card-C88rU-nW.mjs.map → hover-card-G66SUyjq.mjs.map} +1 -1
  159. package/dist/chunks/{icons-bx3nrxNv.mjs → icons-JzMKLygv.mjs} +2 -43
  160. package/dist/chunks/icons-JzMKLygv.mjs.map +1 -0
  161. package/dist/chunks/{icons-CRanVZB1.cjs → icons-ub9iu-JG.cjs} +1 -48
  162. package/dist/chunks/icons-ub9iu-JG.cjs.map +1 -0
  163. package/dist/chunks/{input-Bqo9Q5zF.mjs → input-CRc3MKb_.mjs} +3 -3
  164. package/dist/chunks/{input-Bqo9Q5zF.mjs.map → input-CRc3MKb_.mjs.map} +1 -1
  165. package/dist/chunks/{input-DkCPyWXi.cjs → input-DMTwz27q.cjs} +3 -3
  166. package/dist/chunks/{input-DkCPyWXi.cjs.map → input-DMTwz27q.cjs.map} +1 -1
  167. package/dist/chunks/{label-BKzqfAAq.cjs → label-B5Ugq0Nk.cjs} +1 -1
  168. package/dist/chunks/{label-BKzqfAAq.cjs.map → label-B5Ugq0Nk.cjs.map} +1 -1
  169. package/dist/chunks/{label-Drxg0cG2.mjs → label-Bc_r54NU.mjs} +1 -1
  170. package/dist/chunks/{label-Drxg0cG2.mjs.map → label-Bc_r54NU.mjs.map} +1 -1
  171. package/dist/chunks/{loading-BiM4mKh6.cjs → loading-DZKJc3e7.cjs} +2 -2
  172. package/dist/chunks/{loading-BiM4mKh6.cjs.map → loading-DZKJc3e7.cjs.map} +1 -1
  173. package/dist/chunks/{loading-Dtosnb4A.mjs → loading-ll2L6lc7.mjs} +2 -2
  174. package/dist/chunks/{loading-Dtosnb4A.mjs.map → loading-ll2L6lc7.mjs.map} +1 -1
  175. package/dist/chunks/{multi-select-combobox-C0DoDzxQ.cjs → multi-select-combobox-CFJGq1hn.cjs} +3 -3
  176. package/dist/chunks/{multi-select-combobox-C0DoDzxQ.cjs.map → multi-select-combobox-CFJGq1hn.cjs.map} +1 -1
  177. package/dist/chunks/{multi-select-combobox-Do23ZfOQ.mjs → multi-select-combobox-C_8sxaiL.mjs} +3 -3
  178. package/dist/chunks/{multi-select-combobox-Do23ZfOQ.mjs.map → multi-select-combobox-C_8sxaiL.mjs.map} +1 -1
  179. package/dist/chunks/{otp-input-CkhV-sGl.cjs → otp-input-B5-tuc0q.cjs} +1 -1
  180. package/dist/chunks/{otp-input-CkhV-sGl.cjs.map → otp-input-B5-tuc0q.cjs.map} +1 -1
  181. package/dist/chunks/{otp-input-JOysxKfD.mjs → otp-input-BpcTJOmU.mjs} +1 -1
  182. package/dist/chunks/{otp-input-JOysxKfD.mjs.map → otp-input-BpcTJOmU.mjs.map} +1 -1
  183. package/dist/chunks/{overlay-BzkUmjQ-.mjs → overlay-CG1dMYtO.mjs} +1 -1
  184. package/dist/chunks/{overlay-BzkUmjQ-.mjs.map → overlay-CG1dMYtO.mjs.map} +1 -1
  185. package/dist/chunks/{overlay-DNnZywyR.cjs → overlay-DzE_GyYf.cjs} +1 -1
  186. package/dist/chunks/{overlay-DNnZywyR.cjs.map → overlay-DzE_GyYf.cjs.map} +1 -1
  187. package/dist/chunks/{password-strength-meter-BsvqQBAg.mjs → password-strength-meter-CH6uQAuK.mjs} +2 -2
  188. package/dist/chunks/{password-strength-meter-BsvqQBAg.mjs.map → password-strength-meter-CH6uQAuK.mjs.map} +1 -1
  189. package/dist/chunks/{password-strength-meter-DCi_BP7e.cjs → password-strength-meter-_o1T1HLO.cjs} +2 -2
  190. package/dist/chunks/{password-strength-meter-DCi_BP7e.cjs.map → password-strength-meter-_o1T1HLO.cjs.map} +1 -1
  191. package/dist/chunks/{progress-bar-DQ5ZKk2Y.mjs → progress-bar-BAvRSW1b.mjs} +1 -1
  192. package/dist/chunks/{progress-bar-DQ5ZKk2Y.mjs.map → progress-bar-BAvRSW1b.mjs.map} +1 -1
  193. package/dist/chunks/{progress-bar-CYaBO_lS.cjs → progress-bar-FfdFVvTT.cjs} +1 -1
  194. package/dist/chunks/{progress-bar-CYaBO_lS.cjs.map → progress-bar-FfdFVvTT.cjs.map} +1 -1
  195. package/dist/chunks/{radio-CuiM_gDv.mjs → radio-BMOnxnUS.mjs} +1 -1
  196. package/dist/chunks/{radio-CuiM_gDv.mjs.map → radio-BMOnxnUS.mjs.map} +1 -1
  197. package/dist/chunks/{radio-zx9xEW_C.cjs → radio-wagafWwx.cjs} +1 -1
  198. package/dist/chunks/{radio-zx9xEW_C.cjs.map → radio-wagafWwx.cjs.map} +1 -1
  199. package/dist/chunks/{select-CUaSNR09.mjs → select--DeSgPdn.mjs} +4 -4
  200. package/dist/chunks/{select-CUaSNR09.mjs.map → select--DeSgPdn.mjs.map} +1 -1
  201. package/dist/chunks/{select-bZ9WqLOc.cjs → select-zFFyNmlY.cjs} +4 -4
  202. package/dist/chunks/{select-bZ9WqLOc.cjs.map → select-zFFyNmlY.cjs.map} +1 -1
  203. package/dist/chunks/{sidebar-Kkr45nuN.cjs → sidebar-Cq7UbKJT.cjs} +18 -21
  204. package/dist/chunks/sidebar-Cq7UbKJT.cjs.map +1 -0
  205. package/dist/chunks/{sidebar-DYEDFV2u.mjs → sidebar-oemmRzCL.mjs} +18 -21
  206. package/dist/chunks/sidebar-oemmRzCL.mjs.map +1 -0
  207. package/dist/chunks/{skeleton-nH1eAN96.mjs → skeleton-BsDMlWZG.mjs} +1 -1
  208. package/dist/chunks/{skeleton-nH1eAN96.mjs.map → skeleton-BsDMlWZG.mjs.map} +1 -1
  209. package/dist/chunks/{skeleton-DCBGLNAZ.cjs → skeleton-DWvVc17T.cjs} +1 -1
  210. package/dist/chunks/{skeleton-DCBGLNAZ.cjs.map → skeleton-DWvVc17T.cjs.map} +1 -1
  211. package/dist/chunks/{spinners-C9acUulz.cjs → spinners-DBAJliAj.cjs} +2 -2
  212. package/dist/chunks/{spinners-C9acUulz.cjs.map → spinners-DBAJliAj.cjs.map} +1 -1
  213. package/dist/chunks/{spinners-g6_Up5Rb.mjs → spinners-DlMcokJa.mjs} +2 -2
  214. package/dist/chunks/{spinners-g6_Up5Rb.mjs.map → spinners-DlMcokJa.mjs.map} +1 -1
  215. package/dist/chunks/{splash-cursor-N4FdnkOa.mjs → splash-cursor-Bb7LSzaO.mjs} +1 -1
  216. package/dist/chunks/{splash-cursor-N4FdnkOa.mjs.map → splash-cursor-Bb7LSzaO.mjs.map} +1 -1
  217. package/dist/chunks/{splash-cursor-BqG7ClsJ.cjs → splash-cursor-CQ6_HwHV.cjs} +1 -1
  218. package/dist/chunks/{splash-cursor-BqG7ClsJ.cjs.map → splash-cursor-CQ6_HwHV.cjs.map} +1 -1
  219. package/dist/chunks/{spotlight-card-D9Z3nTmb.mjs → spotlight-card-Bs0iiSLc.mjs} +1 -1
  220. package/dist/chunks/{spotlight-card-D9Z3nTmb.mjs.map → spotlight-card-Bs0iiSLc.mjs.map} +1 -1
  221. package/dist/chunks/{spotlight-card-BmsqC7wm.cjs → spotlight-card-COfSD7ns.cjs} +1 -1
  222. package/dist/chunks/{spotlight-card-BmsqC7wm.cjs.map → spotlight-card-COfSD7ns.cjs.map} +1 -1
  223. package/dist/chunks/{stepper-Jv5OS1nY.mjs → stepper-B9NdZ6ZV.mjs} +4 -4
  224. package/dist/chunks/{stepper-Jv5OS1nY.mjs.map → stepper-B9NdZ6ZV.mjs.map} +1 -1
  225. package/dist/chunks/{stepper-DepvEGfr.cjs → stepper-CTteR-Kj.cjs} +4 -4
  226. package/dist/chunks/{stepper-DepvEGfr.cjs.map → stepper-CTteR-Kj.cjs.map} +1 -1
  227. package/dist/chunks/{sun-to-moon-button-BJtBEaa3.mjs → sun-to-moon-button-DWHDpP5B.mjs} +2 -2
  228. package/dist/chunks/{sun-to-moon-button-BJtBEaa3.mjs.map → sun-to-moon-button-DWHDpP5B.mjs.map} +1 -1
  229. package/dist/chunks/{sun-to-moon-button-PwgTPsTW.cjs → sun-to-moon-button-lt-1vmWm.cjs} +2 -2
  230. package/dist/chunks/{sun-to-moon-button-PwgTPsTW.cjs.map → sun-to-moon-button-lt-1vmWm.cjs.map} +1 -1
  231. package/dist/chunks/{switch-iPsN1NS2.mjs → switch--68scepb.mjs} +1 -1
  232. package/dist/chunks/{switch-iPsN1NS2.mjs.map → switch--68scepb.mjs.map} +1 -1
  233. package/dist/chunks/{switch-X3l8xnle.cjs → switch-BbFl5b4t.cjs} +1 -1
  234. package/dist/chunks/{switch-X3l8xnle.cjs.map → switch-BbFl5b4t.cjs.map} +1 -1
  235. package/dist/chunks/{textarea-Bdo-Trvi.mjs → textarea-CEj9voUJ.mjs} +1 -1
  236. package/dist/chunks/{textarea-Bdo-Trvi.mjs.map → textarea-CEj9voUJ.mjs.map} +1 -1
  237. package/dist/chunks/{textarea-CGRl2hrM.cjs → textarea-U_JeSWI3.cjs} +1 -1
  238. package/dist/chunks/{textarea-CGRl2hrM.cjs.map → textarea-U_JeSWI3.cjs.map} +1 -1
  239. package/dist/chunks/{toast-DiFgv3IL.cjs → toast-2yq4Q7-q.cjs} +2 -2
  240. package/dist/chunks/{toast-DiFgv3IL.cjs.map → toast-2yq4Q7-q.cjs.map} +1 -1
  241. package/dist/chunks/{toast-BcBidy5n.mjs → toast-CyY8VZN7.mjs} +2 -2
  242. package/dist/chunks/{toast-BcBidy5n.mjs.map → toast-CyY8VZN7.mjs.map} +1 -1
  243. package/dist/chunks/{truncated-text-BIXqNfOL.cjs → truncated-text-CswjmrHZ.cjs} +1 -1
  244. package/dist/chunks/{truncated-text-BIXqNfOL.cjs.map → truncated-text-CswjmrHZ.cjs.map} +1 -1
  245. package/dist/chunks/{truncated-text-C9t9o9IA.mjs → truncated-text-DUYTW1KP.mjs} +1 -1
  246. package/dist/chunks/{truncated-text-C9t9o9IA.mjs.map → truncated-text-DUYTW1KP.mjs.map} +1 -1
  247. package/dist/chunks/{typography-LwwY_MOy.cjs → typography-CFIiYk1d.cjs} +1 -1
  248. package/dist/chunks/{typography-LwwY_MOy.cjs.map → typography-CFIiYk1d.cjs.map} +1 -1
  249. package/dist/chunks/{typography-Ct-jDJP3.mjs → typography-DHE9sUZ8.mjs} +1 -1
  250. package/dist/chunks/{typography-Ct-jDJP3.mjs.map → typography-DHE9sUZ8.mjs.map} +1 -1
  251. package/dist/color-palette.cjs +1 -1
  252. package/dist/color-palette.mjs +1 -1
  253. package/dist/combobox.cjs +1 -1
  254. package/dist/combobox.mjs +1 -1
  255. package/dist/components/data-display/charts/chartPalette.d.ts +1 -1
  256. package/dist/components/data-display/dashboard-cards/DeviceSalesCard.d.ts +25 -0
  257. package/dist/components/data-display/dashboard-cards/DeviceSalesCard.d.ts.map +1 -0
  258. package/dist/components/data-display/dashboard-cards/EarningReportsTabsCard.d.ts +34 -0
  259. package/dist/components/data-display/dashboard-cards/EarningReportsTabsCard.d.ts.map +1 -0
  260. package/dist/components/data-display/dashboard-cards/EarningsCard.d.ts +43 -0
  261. package/dist/components/data-display/dashboard-cards/EarningsCard.d.ts.map +1 -0
  262. package/dist/components/data-display/dashboard-cards/ExpensesCard.d.ts +26 -0
  263. package/dist/components/data-display/dashboard-cards/ExpensesCard.d.ts.map +1 -0
  264. package/dist/components/data-display/dashboard-cards/IncomeExpenseCard.d.ts +30 -0
  265. package/dist/components/data-display/dashboard-cards/IncomeExpenseCard.d.ts.map +1 -0
  266. package/dist/components/data-display/dashboard-cards/RevenueGrowthCard.d.ts +26 -0
  267. package/dist/components/data-display/dashboard-cards/RevenueGrowthCard.d.ts.map +1 -0
  268. package/dist/components/data-display/dashboard-cards/SalesOverviewCard.d.ts +33 -0
  269. package/dist/components/data-display/dashboard-cards/SalesOverviewCard.d.ts.map +1 -0
  270. package/dist/components/data-display/dashboard-cards/ShipmentStatisticsCard.d.ts +33 -0
  271. package/dist/components/data-display/dashboard-cards/ShipmentStatisticsCard.d.ts.map +1 -0
  272. package/dist/components/data-display/dashboard-cards/StockAvailabilityCard.d.ts +24 -0
  273. package/dist/components/data-display/dashboard-cards/StockAvailabilityCard.d.ts.map +1 -0
  274. package/dist/components/data-display/dashboard-cards/SupportTrackerCard.d.ts +25 -0
  275. package/dist/components/data-display/dashboard-cards/SupportTrackerCard.d.ts.map +1 -0
  276. package/dist/components/data-display/dashboard-cards/TopicsCard.d.ts +18 -0
  277. package/dist/components/data-display/dashboard-cards/TopicsCard.d.ts.map +1 -0
  278. package/dist/components/data-display/dashboard-cards/VehicleConditionCard.d.ts +20 -0
  279. package/dist/components/data-display/dashboard-cards/VehicleConditionCard.d.ts.map +1 -0
  280. package/dist/components/data-display/dashboard-cards/VehiclesOverviewCard.d.ts +21 -0
  281. package/dist/components/data-display/dashboard-cards/VehiclesOverviewCard.d.ts.map +1 -0
  282. package/dist/components/data-display/dashboard-cards/index.d.ts +26 -0
  283. package/dist/components/data-display/dashboard-cards/index.d.ts.map +1 -1
  284. package/dist/components/data-display/data-table/DataTable.d.ts.map +1 -1
  285. package/dist/components/data-display/data-table/DataTableControls.d.ts.map +1 -1
  286. package/dist/components/data-display/event-calendar/AddEventPanel.d.ts +11 -0
  287. package/dist/components/data-display/event-calendar/AddEventPanel.d.ts.map +1 -0
  288. package/dist/components/data-display/event-calendar/CalendarHeader.d.ts +13 -0
  289. package/dist/components/data-display/event-calendar/CalendarHeader.d.ts.map +1 -0
  290. package/dist/components/data-display/event-calendar/CalendarSidebar.d.ts +13 -0
  291. package/dist/components/data-display/event-calendar/CalendarSidebar.d.ts.map +1 -0
  292. package/dist/components/data-display/event-calendar/EventCalendar.d.ts +3 -0
  293. package/dist/components/data-display/event-calendar/EventCalendar.d.ts.map +1 -0
  294. package/dist/components/data-display/event-calendar/EventDetailDrawer.d.ts +10 -0
  295. package/dist/components/data-display/event-calendar/EventDetailDrawer.d.ts.map +1 -0
  296. package/dist/components/data-display/event-calendar/EventFilterList.d.ts +9 -0
  297. package/dist/components/data-display/event-calendar/EventFilterList.d.ts.map +1 -0
  298. package/dist/components/data-display/event-calendar/EventPill.d.ts +10 -0
  299. package/dist/components/data-display/event-calendar/EventPill.d.ts.map +1 -0
  300. package/dist/components/data-display/event-calendar/MiniCalendarPicker.d.ts +9 -0
  301. package/dist/components/data-display/event-calendar/MiniCalendarPicker.d.ts.map +1 -0
  302. package/dist/components/data-display/event-calendar/calendarUtils.d.ts +27 -0
  303. package/dist/components/data-display/event-calendar/calendarUtils.d.ts.map +1 -0
  304. package/dist/components/data-display/event-calendar/index.d.ts +4 -0
  305. package/dist/components/data-display/event-calendar/index.d.ts.map +1 -0
  306. package/dist/components/data-display/event-calendar/types.d.ts +52 -0
  307. package/dist/components/data-display/event-calendar/types.d.ts.map +1 -0
  308. package/dist/components/data-display/event-calendar/views/DayView.d.ts +10 -0
  309. package/dist/components/data-display/event-calendar/views/DayView.d.ts.map +1 -0
  310. package/dist/components/data-display/event-calendar/views/ListView.d.ts +10 -0
  311. package/dist/components/data-display/event-calendar/views/ListView.d.ts.map +1 -0
  312. package/dist/components/data-display/event-calendar/views/MonthView.d.ts +11 -0
  313. package/dist/components/data-display/event-calendar/views/MonthView.d.ts.map +1 -0
  314. package/dist/components/data-display/event-calendar/views/WeekView.d.ts +10 -0
  315. package/dist/components/data-display/event-calendar/views/WeekView.d.ts.map +1 -0
  316. package/dist/components/forms/button/Button.d.ts.map +1 -1
  317. package/dist/components/navigation/sidebar/DashboardSidebarShell.d.ts +3 -1
  318. package/dist/components/navigation/sidebar/DashboardSidebarShell.d.ts.map +1 -1
  319. package/dist/components/navigation/sidebar/SidebarLinks.d.ts.map +1 -1
  320. package/dist/components/overlays/tooltip/Tooltip.d.ts +3 -1
  321. package/dist/components/overlays/tooltip/Tooltip.d.ts.map +1 -1
  322. package/dist/dashboard-cards.cjs +18 -0
  323. package/dist/dashboard-cards.d.ts +2 -0
  324. package/dist/dashboard-cards.mjs +2 -0
  325. package/dist/data-table.cjs +1 -1
  326. package/dist/data-table.mjs +1 -1
  327. package/dist/date-picker.cjs +1 -1
  328. package/dist/date-picker.mjs +1 -1
  329. package/dist/dialog.cjs +1 -1
  330. package/dist/dialog.mjs +1 -1
  331. package/dist/docs.cjs +31 -0
  332. package/dist/docs.cjs.map +1 -1
  333. package/dist/docs.d.ts.map +1 -1
  334. package/dist/docs.mjs +31 -0
  335. package/dist/docs.mjs.map +1 -1
  336. package/dist/drawer.cjs +2 -2
  337. package/dist/drawer.mjs +1 -1
  338. package/dist/event-calendar.cjs +5 -0
  339. package/dist/event-calendar.d.ts +2 -0
  340. package/dist/event-calendar.mjs +2 -0
  341. package/dist/form.cjs +1 -1
  342. package/dist/form.mjs +1 -1
  343. package/dist/gradual-blur.cjs +1 -1
  344. package/dist/gradual-blur.mjs +1 -1
  345. package/dist/hover-border-gradient.cjs +1 -1
  346. package/dist/hover-border-gradient.mjs +1 -1
  347. package/dist/hover-card.cjs +1 -1
  348. package/dist/hover-card.mjs +1 -1
  349. package/dist/icons.cjs +3 -2
  350. package/dist/icons.mjs +2 -1
  351. package/dist/index.cjs +74 -330
  352. package/dist/index.cjs.map +1 -1
  353. package/dist/index.d.ts +5 -2
  354. package/dist/index.d.ts.map +1 -1
  355. package/dist/index.mjs +55 -327
  356. package/dist/index.mjs.map +1 -1
  357. package/dist/input.cjs +1 -1
  358. package/dist/input.mjs +1 -1
  359. package/dist/label.cjs +1 -1
  360. package/dist/label.mjs +1 -1
  361. package/dist/loading.cjs +1 -1
  362. package/dist/loading.mjs +1 -1
  363. package/dist/multi-select-combobox.cjs +1 -1
  364. package/dist/multi-select-combobox.mjs +1 -1
  365. package/dist/otp-input.cjs +1 -1
  366. package/dist/otp-input.mjs +1 -1
  367. package/dist/password-strength-meter.cjs +1 -1
  368. package/dist/password-strength-meter.mjs +1 -1
  369. package/dist/progress-bar.cjs +1 -1
  370. package/dist/progress-bar.mjs +1 -1
  371. package/dist/radio.cjs +1 -1
  372. package/dist/radio.mjs +1 -1
  373. package/dist/select.cjs +1 -1
  374. package/dist/select.mjs +1 -1
  375. package/dist/sidebar.cjs +1 -1
  376. package/dist/sidebar.mjs +1 -1
  377. package/dist/skeleton.cjs +1 -1
  378. package/dist/skeleton.mjs +1 -1
  379. package/dist/spinners.cjs +1 -1
  380. package/dist/spinners.mjs +1 -1
  381. package/dist/splash-cursor.cjs +1 -1
  382. package/dist/splash-cursor.mjs +1 -1
  383. package/dist/spotlight-card.cjs +1 -1
  384. package/dist/spotlight-card.mjs +1 -1
  385. package/dist/stepper.cjs +1 -1
  386. package/dist/stepper.mjs +1 -1
  387. package/dist/sun-to-moon-button.cjs +2 -2
  388. package/dist/sun-to-moon-button.mjs +2 -2
  389. package/dist/switch.cjs +1 -1
  390. package/dist/switch.mjs +1 -1
  391. package/dist/textarea.cjs +1 -1
  392. package/dist/textarea.mjs +1 -1
  393. package/dist/toast.cjs +1 -1
  394. package/dist/toast.mjs +1 -1
  395. package/dist/tooltip.cjs +1 -1
  396. package/dist/tooltip.mjs +1 -1
  397. package/dist/truncated-text.cjs +1 -1
  398. package/dist/truncated-text.mjs +1 -1
  399. package/dist/typography.cjs +1 -1
  400. package/dist/typography.mjs +1 -1
  401. package/package.json +17 -5
  402. package/dist/chunks/Tooltip-DD30yj3A.cjs.map +0 -1
  403. package/dist/chunks/Tooltip-DK3B879v.mjs.map +0 -1
  404. package/dist/chunks/button-A6UTvrOu.mjs.map +0 -1
  405. package/dist/chunks/button-C4MXPxsC.cjs.map +0 -1
  406. package/dist/chunks/charts-BmIV-mJy.cjs.map +0 -1
  407. package/dist/chunks/charts-DkVu0rFc.mjs.map +0 -1
  408. package/dist/chunks/data-table-Dtf6lKpp.mjs.map +0 -1
  409. package/dist/chunks/data-table-fAEuevPn.cjs.map +0 -1
  410. package/dist/chunks/icons-CRanVZB1.cjs.map +0 -1
  411. package/dist/chunks/icons-bx3nrxNv.mjs.map +0 -1
  412. package/dist/chunks/sidebar-DYEDFV2u.mjs.map +0 -1
  413. package/dist/chunks/sidebar-Kkr45nuN.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-EfGKkerd.mjs","names":[],"sources":["../../src/components/data-display/data-table/TablePrimitives.tsx","../../src/components/data-display/data-table/DataTableRows.tsx","../../src/components/data-display/data-table/DataTableControls.tsx","../../src/components/data-display/data-table/DataTableToolbar.tsx","../../src/components/data-display/data-table/DataTableFilters.tsx","../../src/components/data-display/data-table/direction.ts","../../src/components/data-display/data-table/DataTable.tsx"],"sourcesContent":["import React from \"react\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport const TableContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<\"div\">\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={mergeClassNames(\"overflow-auto\", className)}\n {...props}\n />\n));\nTableContainer.displayName = \"TableContainer\";\n\nexport const Table = React.forwardRef<\n HTMLTableElement,\n React.ComponentPropsWithoutRef<\"table\">\n>(({ className, ...props }, ref) => (\n <table\n ref={ref}\n className={mergeClassNames(\"w-full min-w-[800px]\", className)}\n {...props}\n />\n));\nTable.displayName = \"Table\";\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentPropsWithoutRef<\"thead\">\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={mergeClassNames(\"sticky top-0 z-10 bg-ds-surface-1\", className)}\n {...props}\n />\n));\nTableHeader.displayName = \"TableHeader\";\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentPropsWithoutRef<\"tbody\">\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableBody.displayName = \"TableBody\";\n\nexport const TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentPropsWithoutRef<\"tfoot\">\n>(({ className, ...props }, ref) => (\n <tfoot ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableFooter.displayName = \"TableFooter\";\n\nexport const TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.ComponentPropsWithoutRef<\"tr\">\n>(({ className, ...props }, ref) => (\n <tr ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableRow.displayName = \"TableRow\";\n\nexport const TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ComponentPropsWithoutRef<\"th\">\n>(({ className, ...props }, ref) => (\n <th ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableHead.displayName = \"TableHead\";\n\nexport const TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.ComponentPropsWithoutRef<\"td\">\n>(({ className, ...props }, ref) => (\n <td ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableCell.displayName = \"TableCell\";\n\nexport const TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.ComponentPropsWithoutRef<\"caption\">\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={mergeClassNames(\"caption-bottom text-sm text-ds-2\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n","import React from \"react\";\nimport { flexRender, type Table as TanStackTable } from \"@tanstack/react-table\";\nimport { Checkbox } from \"../../forms/checkbox\";\nimport { LoaderIcon } from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\nimport { TableCell, TableRow } from \"./TablePrimitives\";\n\nexport interface DataTableEmptyStateContext {\n isLoading: boolean;\n hasActiveFilters: boolean;\n searchQuery: string;\n}\n\ninterface TableStateRowProps {\n colSpan: number;\n children: React.ReactNode;\n rowClassName?: string;\n cellClassName?: string;\n}\n\nfunction TableStateRow({\n colSpan,\n children,\n rowClassName,\n cellClassName,\n}: TableStateRowProps) {\n return (\n <TableRow className={rowClassName}>\n <TableCell\n colSpan={colSpan}\n className={mergeClassNames(\n \"px-4 py-12 text-center text-ds-2\",\n cellClassName,\n )}\n >\n {children}\n </TableCell>\n </TableRow>\n );\n}\n\nfunction LoadingTableState({\n colSpan,\n rowClassName,\n cellClassName,\n}: {\n colSpan: number;\n rowClassName?: string;\n cellClassName?: string;\n}) {\n return (\n <TableStateRow\n colSpan={colSpan}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n >\n <div className=\"flex flex-col items-center gap-3\">\n <LoaderIcon\n className=\"w-8 h-8 animate-spin text-ds-1\"\n aria-hidden=\"true\"\n />\n <span>Loading data...</span>\n </div>\n </TableStateRow>\n );\n}\n\nfunction EmptyTableState({\n colSpan,\n rowClassName,\n cellClassName,\n children,\n}: {\n colSpan: number;\n rowClassName?: string;\n cellClassName?: string;\n children?: React.ReactNode;\n}) {\n return (\n <TableStateRow\n colSpan={colSpan}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n >\n {children ?? (\n <div className=\"flex flex-col items-center gap-2\">\n <span className=\"text-4xl\">🔍</span>\n <p className=\"font-medium\">No results found</p>\n <p className=\"text-sm\">Try adjusting the filter</p>\n </div>\n )}\n </TableStateRow>\n );\n}\n\nexport interface DataTableRowsProps<T> {\n table: TanStackTable<T>;\n direction: \"ltr\" | \"rtl\";\n hasRowActions: boolean;\n isLoading: boolean;\n bulkSelectionActive: boolean;\n selectedRowIds: Record<string, boolean>;\n onToggleRowSelection: (rowId: string, checked: boolean) => void;\n rowMenuOpen: number | null;\n onToggleRowMenu: (rowIndex: number) => void;\n onCloseRowMenu: () => void;\n onRowAction?: (action: string, row: T) => void;\n rowClassName?: string;\n cellClassName?: string;\n onRowClick?: (row: T, rowIndex: number) => void;\n expandedRowId: string | null;\n onToggleExpandedRow: (rowId: string) => void;\n renderRowDetails?: (row: T, rowIndex: number) => React.ReactNode;\n hasActiveFilters: boolean;\n searchQuery: string;\n renderEmptyState?: (context: DataTableEmptyStateContext) => React.ReactNode;\n renderRowActionsCell: (context: {\n rowIndex: number;\n row: T;\n isOpen: boolean;\n openDirection: \"up\" | \"down\";\n onToggle: (rowIndex: number) => void;\n onClose: () => void;\n onRowAction?: (action: string, row: T) => void;\n }) => React.ReactNode;\n}\n\nexport function DataTableRows<T>({\n table,\n direction,\n hasRowActions,\n isLoading,\n bulkSelectionActive,\n selectedRowIds,\n onToggleRowSelection,\n rowMenuOpen,\n onToggleRowMenu,\n onCloseRowMenu,\n onRowAction,\n rowClassName,\n cellClassName,\n onRowClick,\n expandedRowId,\n onToggleExpandedRow,\n renderRowDetails,\n hasActiveFilters,\n searchQuery,\n renderEmptyState,\n renderRowActionsCell,\n}: DataTableRowsProps<T>) {\n const colSpan =\n table.getVisibleLeafColumns().length +\n (bulkSelectionActive ? 1 : 0) +\n (hasRowActions ? 1 : 0);\n\n if (isLoading) {\n return (\n <LoadingTableState\n colSpan={colSpan}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n />\n );\n }\n\n if (table.getRowModel().rows.length === 0) {\n const customEmptyState = renderEmptyState?.({\n isLoading,\n hasActiveFilters,\n searchQuery,\n });\n\n return (\n <EmptyTableState\n colSpan={colSpan}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n >\n {customEmptyState}\n </EmptyTableState>\n );\n }\n\n return (\n <>\n {table.getRowModel().rows.map((row) => {\n const isExpandable = typeof renderRowDetails === \"function\";\n const isExpanded = expandedRowId === row.id;\n\n const handleRowToggle = () => {\n onRowClick?.(row.original, row.index);\n if (isExpandable) {\n onToggleExpandedRow(row.id);\n }\n };\n\n return (\n <React.Fragment key={row.id}>\n <TableRow\n className={mergeClassNames(\n \"border-b border-ds-border-2 transition-colors hover:bg-ds-surface-2\",\n (isExpandable || onRowClick) && \"cursor-pointer\",\n rowClassName,\n )}\n onClick={isExpandable || onRowClick ? handleRowToggle : undefined}\n >\n {bulkSelectionActive ? (\n <TableCell\n className={mergeClassNames(\n \"w-12 px-4 py-3 align-middle\",\n cellClassName,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n <Checkbox\n aria-label={`Select row ${row.id}`}\n checked={Boolean(selectedRowIds[row.id])}\n onChange={(event) =>\n onToggleRowSelection(row.id, event.target.checked)\n }\n />\n </TableCell>\n ) : null}\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n className={mergeClassNames(\n \"px-4 py-3 text-sm text-ds-1\",\n direction === \"rtl\" ? \"text-right\" : \"text-left\",\n cellClassName,\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n {hasRowActions\n ? renderRowActionsCell({\n rowIndex: row.index,\n row: row.original,\n isOpen: rowMenuOpen === row.index,\n openDirection:\n row.index >= table.getRowModel().rows.length - 2\n ? \"up\"\n : \"down\",\n onToggle: onToggleRowMenu,\n onClose: onCloseRowMenu,\n onRowAction,\n })\n : null}\n </TableRow>\n {isExpandable && isExpanded ? (\n <TableRow className={mergeClassNames(\"bg-ds-surface-2\", rowClassName)}>\n <TableCell\n colSpan={colSpan}\n className={mergeClassNames(\n \"px-4 py-4 text-ds-1\",\n direction === \"rtl\" ? \"text-right\" : \"text-left\",\n cellClassName,\n )}\n >\n {renderRowDetails?.(row.original, row.index)}\n </TableCell>\n </TableRow>\n ) : null}\n </React.Fragment>\n );\n })}\n </>\n );\n}\n","import React from \"react\";\nimport { Button } from \"../../forms/button\";\nimport { Checkbox } from \"../../forms/checkbox\";\nimport { DropdownMenu } from \"../../overlays/dropdown-menu\";\n\ninterface FilterDropdownProps {\n trigger: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n direction?: \"ltr\" | \"rtl\";\n}\n\nexport const FilterDropdown: React.FC<FilterDropdownProps> = ({\n trigger,\n open,\n onOpenChange,\n children,\n direction = \"ltr\",\n}) => {\n return (\n <DropdownMenu\n trigger={trigger}\n open={open}\n onOpenChange={onOpenChange}\n className=\"relative\"\n animationClassName={`${\n direction === \"rtl\" ? \"origin-top-left\" : \"origin-top-right\"\n } transition-all duration-200 ease-[cubic-bezier(0.22,1,0.36,1)]`}\n panelClassName={`top-full z-50 mt-2 min-w-64 overflow-hidden rounded-md border border-ds-border-2 bg-ds-surface-1 shadow-[0_18px_40px_rgba(15,23,42,0.18)] ring-1 ring-inset ring-ds-border-3/35 backdrop-blur-2xl ${\n direction === \"rtl\" ? \"left-0\" : \"right-0\"\n }`}\n >\n {children}\n </DropdownMenu>\n );\n};\n\ninterface FilterButtonProps {\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n hasActive?: boolean;\n}\n\nexport const FilterButton: React.FC<FilterButtonProps> = ({\n icon,\n label,\n onClick,\n hasActive,\n}) => (\n <Button\n onClick={onClick}\n title={label}\n aria-label={label}\n className={`h-10 min-w-10 px-0 py-0 shadow-none ${\n hasActive\n ? \"border-ds-border-accent/20 bg-ds-accent-subtle text-ds-1 hover:bg-ds-accent-subtle hover:opacity-100\"\n : \"border-transparent bg-transparent text-ds-2 hover:bg-ds-surface-2 hover:text-ds-1 hover:opacity-100\"\n }`}\n >\n {icon}\n </Button>\n);\n\ninterface ColumnToggleLabels {\n columns: string;\n showAll: string;\n hideAll: string;\n}\n\ninterface ColumnToggleProps {\n columns: {\n id: string;\n label: string;\n visible?: boolean;\n }[];\n onToggle: (columnId: string) => void;\n onShowAll?: () => void;\n onHideAll?: () => void;\n labels: ColumnToggleLabels;\n}\n\nexport const ColumnToggle: React.FC<ColumnToggleProps> = ({\n columns,\n onToggle,\n onShowAll,\n onHideAll,\n labels,\n}) => (\n <div\n className=\"flex flex-col\"\n style={{ maxHeight: \"min(400px, 80dvh)\" }}\n >\n {/* Header — never scrolls */}\n <div className=\"flex shrink-0 items-center px-4 pb-2 pt-4\">\n <span className=\"text-sm font-semibold text-ds-1\">{labels.columns}</span>\n </div>\n\n {/* Scrollable column list */}\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 pb-1\">\n <div className=\"space-y-0.5\">\n {columns.map((col) => (\n <div\n key={col.id}\n className=\"rounded-md px-2 py-1 hover:bg-ds-surface-2\"\n >\n <Checkbox\n checked={col.visible !== false}\n onChange={() => onToggle(col.id)}\n label={col.label}\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Sticky footer — always visible at bottom */}\n {(onShowAll || onHideAll) && (\n <div className=\"flex shrink-0 gap-2 border-t border-ds-border-2 px-4 py-3\">\n {onShowAll && (\n <Button\n onClick={onShowAll}\n size=\"small\"\n className=\"flex-1 border-none bg-transparent px-1 py-1 text-xs font-semibold text-ds-1 shadow-none hover:bg-transparent hover:text-ds-accent-hover hover:opacity-100\"\n >\n {labels.showAll}\n </Button>\n )}\n {onHideAll && (\n <Button\n onClick={onHideAll}\n size=\"small\"\n className=\"flex-1 border-none bg-transparent px-1 py-1 text-xs font-semibold text-ds-2 shadow-none hover:bg-transparent hover:text-ds-1 hover:opacity-100\"\n >\n {labels.hideAll}\n </Button>\n )}\n </div>\n )}\n </div>\n);\n","import React from \"react\";\nimport { Chip } from \"../chip\";\nimport { Button } from \"../../forms/button\";\nimport { Input } from \"../../forms/input\";\nimport { Tooltip } from \"../../overlays/tooltip\";\nimport {\n ArrowDownIcon,\n ColumnsIcon,\n RefreshIcon,\n SearchIcon,\n SelectionIcon,\n TrashIcon,\n} from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\nimport {\n ColumnToggle,\n FilterButton,\n FilterDropdown,\n} from \"./DataTableControls\";\n\nconst ICON_BUTTON_CLASS_NAME =\n \"inline-flex items-center justify-center rounded-lg text-ds-2 transition-colors hover:bg-ds-surface-2 hover:text-ds-1\";\nconst DISABLED_ICON_BUTTON_CLASS_NAME = `${ICON_BUTTON_CLASS_NAME} disabled:cursor-not-allowed disabled:opacity-40`;\nconst TABLE_CONTROL_ICON_CLASS_NAME = \"h-[18px] w-[18px] shrink-0\";\nconst TABLE_COMPLEX_ICON_CLASS_NAME = TABLE_CONTROL_ICON_CLASS_NAME;\nconst TOOLBAR_ACTION_BUTTON_CLASS_NAME =\n \"inline-flex h-9 items-center gap-2 rounded-md border border-transparent bg-transparent px-2.5 text-[12px] font-semibold uppercase tracking-[0.03em] text-ds-2 shadow-none transition-[border-color,background-color,color] duration-200 hover:border-ds-border-3 hover:bg-ds-surface-2 hover:text-ds-1 hover:opacity-100\";\n\ninterface ToolbarIconButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport function ToolbarIconButton({\n title,\n onClick,\n disabled,\n children,\n}: ToolbarIconButtonProps) {\n return (\n <Tooltip content={title}>\n <Button\n onClick={onClick}\n disabled={disabled}\n title={title}\n aria-label={title}\n className={\n disabled\n ? `${DISABLED_ICON_BUTTON_CLASS_NAME} h-10 w-10 shrink-0 border-transparent bg-transparent px-0 py-0 text-base shadow-none`\n : `${ICON_BUTTON_CLASS_NAME} h-10 w-10 shrink-0 border-transparent bg-transparent px-0 py-0 text-base shadow-none`\n }\n >\n {children}\n </Button>\n </Tooltip>\n );\n}\n\ninterface ToolbarActionButtonProps {\n title: string;\n label: string;\n onClick?: () => void;\n isActive?: boolean;\n icon: React.ReactNode;\n}\n\nfunction ToolbarActionButton({\n title,\n label,\n onClick,\n isActive = false,\n icon,\n}: ToolbarActionButtonProps) {\n return (\n <Button\n onClick={onClick}\n title={title}\n aria-label={title}\n aria-pressed={isActive}\n className={mergeClassNames(\n TOOLBAR_ACTION_BUTTON_CLASS_NAME,\n isActive\n ? \"border-ds-border-3 bg-ds-surface-2 text-ds-1\"\n : \"text-ds-2\",\n )}\n >\n <span\n className={mergeClassNames(\n \"inline-flex h-5 w-5 items-center justify-center text-ds-2\",\n isActive && \"text-ds-1\",\n )}\n >\n {icon}\n </span>\n <span>{label}</span>\n </Button>\n );\n}\n\ninterface SearchFieldProps {\n value: string;\n onChange: (value: string) => void;\n placeholder: string;\n direction: \"ltr\" | \"rtl\";\n}\n\nfunction SearchField({\n value,\n onChange,\n placeholder,\n direction,\n}: SearchFieldProps) {\n return (\n <div className=\"relative w-[300px]\">\n <SearchIcon\n className={`pointer-events-none absolute top-1/2 z-10 -translate-y-1/2 text-ds-2 ${TABLE_CONTROL_ICON_CLASS_NAME}`}\n style={{\n insetInlineStart: \"1rem\",\n }}\n aria-hidden=\"true\"\n />\n <Input\n type=\"text\"\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n className=\"placeholder:!text-ds-3\"\n style={{\n paddingInlineStart: \"2.75rem\",\n textAlign: direction === \"rtl\" ? \"right\" : \"left\",\n }}\n />\n </div>\n );\n}\n\ninterface ToolbarLabels {\n columns: string;\n showAll: string;\n hideAll: string;\n refresh: string;\n export: string;\n columnSettings: string;\n}\n\ninterface DataTableToolbarProps {\n direction: \"ltr\" | \"rtl\";\n showRefreshButton?: boolean;\n showExportButton?: boolean;\n searchQuery: string;\n onSearchChange: (value: string) => void;\n searchPlaceholder: string;\n bulkDeleteEnabled: boolean;\n bulkSelectionActive: boolean;\n selectedCount: number;\n bulkActionsContent?: React.ReactNode;\n bulkActionCard?: React.ReactNode;\n onToggleBulkSelection: () => void;\n onBulkDeleteSelected: () => void;\n onRefresh?: () => void;\n onExport?: () => void;\n columnMenuOpen: boolean;\n onToggleColumnMenu: () => void;\n onCloseColumnMenu: () => void;\n columns: {\n id: string;\n label: string;\n visible?: boolean;\n }[];\n onColumnToggle?: (columnId: string) => void;\n onShowAllColumns: () => void;\n onHideAllColumns: () => void;\n labels: ToolbarLabels;\n toolbarActions?: React.ReactNode;\n}\n\nexport function DataTableToolbar({\n direction,\n showRefreshButton = true,\n showExportButton = true,\n searchQuery,\n onSearchChange,\n searchPlaceholder,\n bulkDeleteEnabled,\n bulkSelectionActive,\n selectedCount,\n bulkActionsContent,\n bulkActionCard,\n onToggleBulkSelection,\n onBulkDeleteSelected,\n onRefresh,\n onExport,\n columnMenuOpen,\n onToggleColumnMenu,\n onCloseColumnMenu,\n columns,\n onColumnToggle,\n onShowAllColumns,\n onHideAllColumns,\n labels,\n toolbarActions,\n}: DataTableToolbarProps) {\n const hasSelectedRows = selectedCount > 0;\n\n return (\n <div className=\"border-b border-ds-border-2 px-4 py-3\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center lg:justify-between\">\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n {bulkDeleteEnabled ? (\n <FilterButton\n icon={\n <SelectionIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n }\n label={\n bulkSelectionActive\n ? \"Disable bulk selection\"\n : \"Enable bulk selection\"\n }\n onClick={onToggleBulkSelection}\n hasActive={bulkSelectionActive}\n />\n ) : null}\n\n <SearchField\n value={searchQuery}\n onChange={onSearchChange}\n placeholder={searchPlaceholder}\n direction={direction}\n />\n </div>\n\n <div className=\"flex items-center gap-1 self-end lg:self-auto\">\n {showRefreshButton ? (\n <ToolbarActionButton\n title={labels.refresh}\n label={labels.refresh}\n onClick={onRefresh}\n icon={\n <RefreshIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n }\n />\n ) : null}\n {showExportButton ? (\n <ToolbarActionButton\n title={labels.export}\n label={labels.export}\n onClick={onExport}\n icon={\n <ArrowDownIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n }\n />\n ) : null}\n {toolbarActions}\n\n <FilterDropdown\n direction={direction}\n open={columnMenuOpen}\n onOpenChange={(nextOpen) => {\n if (nextOpen) {\n if (!columnMenuOpen) {\n onToggleColumnMenu();\n }\n return;\n }\n onCloseColumnMenu();\n }}\n trigger={\n <ToolbarActionButton\n title={labels.columnSettings}\n label={labels.columnSettings}\n isActive={columnMenuOpen}\n icon={\n <ColumnsIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n }\n />\n }\n >\n <ColumnToggle\n columns={columns}\n onToggle={(columnId) => {\n onColumnToggle?.(columnId);\n }}\n onShowAll={onShowAllColumns}\n onHideAll={onHideAllColumns}\n labels={labels}\n />\n </FilterDropdown>\n </div>\n </div>\n\n {bulkSelectionActive && hasSelectedRows\n ? (bulkActionCard ?? (\n <div className=\"mt-2 flex flex-col gap-2 rounded-md border border-ds-border-2 bg-ds-surface-2 px-3 py-2 shadow-sm lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Chip\n variant=\"soft\"\n color=\"primary\"\n size=\"sm\"\n className=\"uppercase tracking-wide\"\n >\n Bulk actions\n </Chip>\n <p className=\"text-sm font-medium text-ds-1\">\n {selectedCount} {selectedCount === 1 ? \"row\" : \"rows\"}{\" \"}\n selected\n </p>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {bulkActionsContent}\n {bulkDeleteEnabled ? (\n <Button\n onClick={onBulkDeleteSelected}\n primary\n size=\"small\"\n className=\"border-ds-border-accent/20 px-3 py-2 text-sm text-ds-on-accent shadow-lg shadow-ds-accent/20 hover:bg-ds-accent-hover hover:opacity-100\"\n >\n <TrashIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n Delete selected\n </Button>\n ) : null}\n </div>\n </div>\n ))\n : null}\n </div>\n );\n}\n","import React from \"react\";\nimport { Combobox } from \"../../forms/combobox\";\nimport { MultiSelectCombobox } from \"../../forms/multi-select-combobox\";\nimport { Checkbox } from \"../../forms/checkbox\";\nimport { Input } from \"../../forms/input\";\nimport { Select } from \"../../forms/select\";\nimport { Switch } from \"../../forms/switch\";\nimport {\n DatePicker,\n type DatePickerValue,\n type DateRangeValue,\n} from \"../../forms/date-picker\";\nimport type { FilterOption, FilterValue, FilterValues } from \"./DataTable\";\n\ntype NumberRangeFilterValue = { min?: number; max?: number };\n\nconst toSelectOptions = (options?: string[]) =>\n (options || []).map((option) => ({\n value: option,\n label: option,\n }));\n\nconst getStringFilterValue = (value?: FilterValue): string =>\n typeof value === \"string\" ? value : \"\";\n\nconst getMultiStringFilterValue = (value?: FilterValue): string[] => {\n if (Array.isArray(value)) {\n return value;\n }\n\n return typeof value === \"string\" && value ? [value] : [];\n};\n\nconst getNumberRangeFilterValue = (\n value?: FilterValue,\n): NumberRangeFilterValue => {\n if (\n !value ||\n typeof value !== \"object\" ||\n \"start\" in value ||\n \"end\" in value\n ) {\n return {};\n }\n\n return value as NumberRangeFilterValue;\n};\n\nconst getDateFilterValue = (value?: FilterValue): DatePickerValue =>\n value instanceof Date || value === null ? value : null;\n\nconst getDateRangeFilterValue = (value?: FilterValue): DateRangeValue => {\n if (\n value &&\n typeof value === \"object\" &&\n \"start\" in value &&\n \"end\" in value\n ) {\n return value as DateRangeValue;\n }\n\n return { start: null, end: null };\n};\n\ntype FilterableColumn = {\n id: string;\n label: string;\n filterable?: boolean;\n multiFilter?: boolean;\n};\n\nfunction buildGeneratedFilterOptions<T>(\n columns: FilterableColumn[],\n data: T[],\n): FilterOption[] {\n return columns\n .filter((column) => column.filterable !== false)\n .map((column) => {\n const uniqueValues = new Set<string>();\n\n data.forEach((row) => {\n const value = (row as Record<string, unknown>)[column.id];\n if (value !== undefined && value !== null && value !== \"\") {\n uniqueValues.add(String(value));\n }\n });\n\n return {\n id: column.id,\n label: column.label,\n options: Array.from(uniqueValues).sort(),\n multiple: column.multiFilter,\n };\n });\n}\n\nexport function resolveFilterOptions<T>(\n columns: FilterableColumn[],\n data: T[],\n externalFilterOptions: FilterOption[] | undefined,\n asyncFilterOptions: Record<string, { options: string[]; isLoading: boolean }>,\n): FilterOption[] {\n if (!externalFilterOptions?.length) {\n return buildGeneratedFilterOptions(columns, data);\n }\n\n return externalFilterOptions.map((filter) => {\n const asyncState = asyncFilterOptions[filter.id];\n if (!asyncState) {\n return filter;\n }\n\n return {\n ...filter,\n options: asyncState.options,\n isLoading: asyncState.isLoading,\n };\n });\n}\n\nfunction matchesSearchQuery<T>(row: T, searchQuery: string): boolean {\n if (!searchQuery.trim()) {\n return true;\n }\n\n const lowerCasedSearch = searchQuery.toLowerCase();\n return Object.values(row as Record<string, unknown>).some((value) =>\n String(value).toLowerCase().includes(lowerCasedSearch),\n );\n}\n\nfunction matchesFilterValue(\n rowValue: unknown,\n filterValue: FilterValue,\n filterType: FilterOption[\"type\"],\n): boolean {\n if (typeof filterValue === \"string\") {\n if (!filterValue) return true;\n\n const rowText = String(rowValue).toLowerCase();\n const filterText = filterValue.toLowerCase();\n return rowText.includes(filterText);\n }\n\n if (Array.isArray(filterValue)) {\n if (!filterValue.length) return true;\n\n const rowText = String(rowValue).toLowerCase();\n return filterValue.some((value) => rowText.includes(value.toLowerCase()));\n }\n\n if (typeof filterValue === \"boolean\") {\n return Boolean(rowValue) === filterValue;\n }\n\n if (filterType === \"date\" && filterValue instanceof Date) {\n const rowDate = new Date(String(rowValue));\n return rowDate.toDateString() === filterValue.toDateString();\n }\n\n if (\n filterType === \"date-range\" &&\n typeof filterValue === \"object\" &&\n filterValue !== null &&\n \"start\" in filterValue\n ) {\n const rangeValue = filterValue as DateRangeValue;\n const rowDate = new Date(String(rowValue));\n\n if (Number.isNaN(rowDate.getTime())) {\n return false;\n }\n\n if (rangeValue.start && rowDate < rangeValue.start) return false;\n if (rangeValue.end) {\n const endDate = new Date(rangeValue.end);\n endDate.setHours(23, 59, 59, 999);\n if (rowDate > endDate) return false;\n }\n\n return true;\n }\n\n if (\n filterType === \"number-range\" &&\n typeof filterValue === \"object\" &&\n filterValue !== null &&\n !(\"start\" in filterValue)\n ) {\n const rangeValue = filterValue as NumberRangeFilterValue;\n const rowNumber = Number(rowValue);\n\n if (Number.isNaN(rowNumber)) {\n return false;\n }\n\n if (rangeValue.min !== undefined && rowNumber < rangeValue.min)\n return false;\n if (rangeValue.max !== undefined && rowNumber > rangeValue.max)\n return false;\n\n return true;\n }\n\n return true;\n}\n\nexport function filterClientData<T>(\n data: T[],\n activeFilters: FilterValues,\n searchQuery: string,\n serverSideFiltering: boolean,\n filterOptions: FilterOption[],\n): T[] {\n if (serverSideFiltering) {\n return data;\n }\n\n return data.filter((row) => {\n if (!matchesSearchQuery(row, searchQuery)) {\n return false;\n }\n\n return Object.entries(activeFilters).every(([filterId, filterValue]) => {\n if (isFilterValueEmpty(filterValue)) {\n return true;\n }\n\n const filterOption = filterOptions.find(\n (filter) => filter.id === filterId,\n );\n const rowValue = (row as Record<string, unknown>)[filterId];\n\n return matchesFilterValue(rowValue, filterValue, filterOption?.type);\n });\n });\n}\n\nexport function useAsyncFilterOptions(\n filterOptions: FilterOption[] | undefined,\n isSelectorOpen: boolean,\n) {\n const [asyncOptions, setAsyncOptions] = React.useState<\n Record<string, { options: string[]; isLoading: boolean }>\n >({});\n\n React.useEffect(() => {\n if (!isSelectorOpen || !filterOptions?.length) return;\n\n filterOptions.forEach((filter) => {\n if (filter.fetchOptions && !asyncOptions[filter.id]) {\n setAsyncOptions((previous) => ({\n ...previous,\n [filter.id]: { options: filter.options || [], isLoading: true },\n }));\n\n filter\n .fetchOptions()\n .then((options) => {\n setAsyncOptions((previous) => ({\n ...previous,\n [filter.id]: { options, isLoading: false },\n }));\n })\n .catch(() => {\n setAsyncOptions((previous) => ({\n ...previous,\n [filter.id]: {\n options: filter.options || [],\n isLoading: false,\n },\n }));\n });\n }\n });\n }, [filterOptions, isSelectorOpen, asyncOptions]);\n\n return asyncOptions;\n}\n\nexport const isFilterValueEmpty = (value?: FilterValue | null): boolean => {\n if (value === undefined || value === null) {\n return true;\n }\n\n if (typeof value === \"string\") {\n return value === \"\";\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Date || typeof value === \"boolean\") {\n return false;\n }\n\n if (\"start\" in value || \"end\" in value) {\n const rangeValue = value as DateRangeValue;\n return !rangeValue.start && !rangeValue.end;\n }\n\n return value.min === undefined && value.max === undefined;\n};\n\nexport const isFilterActive = (value?: FilterValue): boolean =>\n !isFilterValueEmpty(value);\n\nfunction LoadingFilterField({ label }: { label: string }) {\n return (\n <div className=\"min-w-[200px] space-y-2 rounded-lg border border-ds-border-2 bg-ds-surface-2/70 px-3 py-2\">\n <div className=\"h-3 w-24 animate-pulse rounded bg-ds-surface-3\" />\n <div className=\"h-10 w-full animate-pulse rounded bg-ds-surface-1\" />\n <p className=\"text-xs text-ds-2\">\n Loading {label.toLowerCase()} options...\n </p>\n </div>\n );\n}\n\ninterface NumberRangeFilterProps {\n value: NumberRangeFilterValue;\n direction: \"ltr\" | \"rtl\";\n onChange: (value: NumberRangeFilterValue) => void;\n}\n\nfunction NumberRangeFilter({\n value,\n direction,\n onChange,\n}: NumberRangeFilterProps) {\n return (\n <div\n dir={direction}\n className={`flex gap-2 ${direction === \"rtl\" ? \"flex-row-reverse\" : \"\"}`}\n >\n <Input\n type=\"number\"\n placeholder=\"Min\"\n value={value.min?.toString() || \"\"}\n onChange={(e) =>\n onChange({\n ...value,\n min: e.target.value ? Number(e.target.value) : undefined,\n })\n }\n className=\"w-20\"\n />\n <Input\n type=\"number\"\n placeholder=\"Max\"\n value={value.max?.toString() || \"\"}\n onChange={(e) =>\n onChange({\n ...value,\n max: e.target.value ? Number(e.target.value) : undefined,\n })\n }\n className=\"w-20\"\n />\n </div>\n );\n}\n\ninterface FilterFieldControlProps {\n filter: FilterOption;\n value: FilterValue | undefined;\n isActive: boolean;\n direction: \"ltr\" | \"rtl\";\n onChange: (value: FilterValue) => void;\n}\n\nexport function FilterFieldControl({\n filter,\n value,\n isActive,\n direction,\n onChange,\n}: FilterFieldControlProps) {\n if (filter.isLoading) {\n return <LoadingFilterField label={filter.label} />;\n }\n\n switch (filter.type) {\n case \"text\":\n return (\n <Input\n dir={direction}\n value={getStringFilterValue(value)}\n onChange={(event) => onChange(event.target.value)}\n placeholder={filter.placeholder || filter.label}\n />\n );\n case \"select\":\n return (\n <Select\n dir={direction}\n value={getStringFilterValue(value)}\n onChange={(event) => onChange(event.target.value)}\n options={toSelectOptions(filter.options)}\n placeholder={filter.placeholder || filter.label}\n />\n );\n case \"combobox\":\n return filter.multiple ? (\n <div dir={direction}>\n <MultiSelectCombobox\n value={getMultiStringFilterValue(value)}\n onChange={(values) => onChange(values)}\n placeholder={filter.placeholder || filter.label}\n options={toSelectOptions(filter.options)}\n />\n </div>\n ) : (\n <div dir={direction}>\n <Combobox\n value={getStringFilterValue(value)}\n onChange={(nextValue) => onChange(nextValue)}\n placeholder={filter.placeholder || filter.label}\n options={toSelectOptions(filter.options)}\n />\n </div>\n );\n case \"checkbox\":\n return (\n <div className=\"flex h-10 items-center px-2\">\n <Checkbox\n checked={Boolean(value)}\n onChange={(event) => onChange(event.target.checked)}\n label={filter.label}\n />\n </div>\n );\n case \"switch\":\n return (\n <div className=\"flex h-10 items-center px-2\">\n <Switch\n dir={direction}\n checked={Boolean(value)}\n onChange={(event) => onChange(event.target.checked)}\n />\n </div>\n );\n case \"date\":\n return (\n <DatePicker\n mode=\"single\"\n value={getDateFilterValue(value)}\n onChange={(nextValue) => onChange(nextValue)}\n placeholder={filter.placeholder || filter.label}\n />\n );\n case \"date-range\":\n return (\n <DatePicker\n mode=\"range\"\n value={getDateRangeFilterValue(value)}\n onChange={(nextValue) => onChange(nextValue)}\n placeholder={filter.placeholder || filter.label}\n />\n );\n case \"number-range\":\n return (\n <NumberRangeFilter\n value={getNumberRangeFilterValue(value)}\n direction={direction}\n onChange={onChange}\n />\n );\n default:\n return filter.multiple ? (\n <div dir={direction}>\n <MultiSelectCombobox\n value={getMultiStringFilterValue(value)}\n onChange={(values) => onChange(values)}\n placeholder={filter.placeholder || filter.label}\n options={toSelectOptions(filter.options)}\n />\n </div>\n ) : (\n <div dir={direction}>\n <Combobox\n value={getStringFilterValue(value)}\n onChange={(nextValue) => onChange(nextValue)}\n placeholder={filter.placeholder || filter.label}\n options={toSelectOptions(filter.options)}\n />\n </div>\n );\n }\n}\n","const rtlLanguages = /^(ar|fa|ur|he)(-|$)/i;\n\nexport type TableDirection = \"ltr\" | \"rtl\";\n\n/**\n * Resolves table direction from nearest `dir` ancestor, document root, or locale.\n * This mirrors Tabs direction behavior so data-display patterns stay consistent.\n */\nexport function resolveTableDirection(\n host: HTMLElement | null,\n): TableDirection {\n if (typeof document === \"undefined\") {\n return \"ltr\";\n }\n\n const nearestWithDirection = host?.closest<HTMLElement>(\"[dir]\");\n const explicitDirection =\n nearestWithDirection?.getAttribute(\"dir\") ??\n document.documentElement.getAttribute(\"dir\") ??\n undefined;\n\n if (explicitDirection === \"rtl\" || explicitDirection === \"ltr\") {\n return explicitDirection;\n }\n\n if (\n typeof navigator !== \"undefined\" &&\n rtlLanguages.test(navigator.language)\n ) {\n return \"rtl\";\n }\n\n return \"ltr\";\n}\n","import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n useReactTable,\n getCoreRowModel,\n getPaginationRowModel,\n getFilteredRowModel,\n flexRender,\n type CellContext,\n type ColumnDef,\n type PaginationState,\n type Table as TanStackTable,\n} from \"@tanstack/react-table\";\nimport { Button } from \"../../forms/button\";\nimport { Checkbox } from \"../../forms/checkbox\";\nimport { Input } from \"../../forms/input\";\nimport { Select } from \"../../forms/select\";\nimport { type DatePickerValue } from \"../../forms/date-picker\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n ChevronsLeftIcon,\n ChevronsRightIcon,\n EllipsisVerticalIcon,\n FilterIcon,\n FilterProfileIcon,\n FilterXIcon,\n LoaderIcon,\n} from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\nimport {\n TableContainer,\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableHead,\n TableCell,\n TableCaption,\n} from \"./TablePrimitives\";\nimport { DataTableRows } from \"./DataTableRows\";\nimport type { DataTableEmptyStateContext } from \"./DataTableRows\";\nimport { DataTableToolbar, ToolbarIconButton } from \"./DataTableToolbar\";\nimport {\n ColumnToggle,\n FilterButton,\n FilterDropdown,\n} from \"./DataTableControls\";\nimport {\n FilterFieldControl,\n filterClientData,\n isFilterActive,\n resolveFilterOptions,\n useAsyncFilterOptions,\n} from \"./DataTableFilters\";\nimport { resolveTableDirection, type TableDirection } from \"./direction\";\nexport {\n TableContainer,\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableHead,\n TableCell,\n TableCaption,\n} from \"./TablePrimitives\";\nexport type { DataTableEmptyStateContext } from \"./DataTableRows\";\nexport {\n ColumnToggle,\n FilterButton,\n FilterDropdown,\n} from \"./DataTableControls\";\nexport { ToolbarIconButton } from \"./DataTableToolbar\";\n\n// Filter option type - can be static or async\nexport interface FilterOption {\n id: string;\n label: string;\n type?:\n | \"text\"\n | \"select\"\n | \"combobox\"\n | \"checkbox\"\n | \"switch\"\n | \"date\"\n | \"date-range\"\n | \"number-range\";\n placeholder?: string;\n options?: string[]; // Static options\n // Async options support\n queryKey?: string | string[]; // React Query key for caching\n fetchOptions?: () => Promise<string[]>; // Async function to fetch options\n isLoading?: boolean; // Loading state (managed externally)\n multiple?: boolean; // Enable multi-select\n /* Crystal UI Unification */\n /*\n ### Automated Browser Testing\n The filters were verified using the browser subagent, confirming that each filter type correctly updates the table data in real-time and adheres to our new unified \"Crystal\" aesthetic.\n\n ````carousel\n ![Unified Crystal Filters](file:///Users/dani.dev/.gemini/antigravity/brain/cddc57db-96d9-409e-add9-b0c887fa88f1/data_table_crystal_filters_verification_1771807771898.png)\n <!-- slide -->\n ![Crystal Combobox Dropdown](file:///Users/dani.dev/.gemini/antigravity/brain/cddc57db-96d9-409e-add9-b0c887fa88f1/crystal_look_verification_final_1771807597075.png)\n <!-- slide -->\n ![Global Unification Verification Recording](file:///Users/dani.dev/.gemini/antigravity/brain/cddc57db-96d9-409e-add9-b0c887fa88f1/verify_global_crystal_style_1771807684506.webp)\n ````\n\n ### Key Successes:\n - **Unified Aesthetic**: All components now share a consistent `backdrop-blur-xl` and semi-transparent background.\n - **Improved Visual Hierarchy**: The crystal effect makes the components feel integrated with the page while still being clearly interactive.\n - **Robust Logic**: Maintained all advanced filtering logic (date ranges, numeric ranges, partial matches) while upgrading the visual layer.\n */\n}\n\n// Filter value can be single string, array of strings, or range objects\nexport type FilterValue =\n | string\n | string[]\n | boolean\n | DatePickerValue\n | { min?: number; max?: number };\nexport type FilterValues = Record<string, FilterValue>;\n\nexport interface DataTableBulkActionContext<T> {\n selectedRows: T[];\n selectedCount: number;\n clearSelection: () => void;\n disableBulkSelection: () => void;\n}\n\nexport interface DataTableCellRenderContext<T> {\n value: unknown;\n row: T;\n rowIndex: number;\n columnId: string;\n}\n\nexport interface DataTableColumn<T> {\n id: string;\n label: string;\n visible?: boolean;\n filterable?: boolean;\n multiFilter?: boolean;\n priority?: number;\n renderCell?: (context: DataTableCellRenderContext<T>) => React.ReactNode;\n}\n\nexport interface DataTableRowAction<T> {\n id: string;\n label: string;\n variant?: \"default\" | \"destructive\";\n onClick?: (row: T) => void;\n}\n\nexport interface DataTableTextLabels {\n columns: string;\n showAll: string;\n hideAll: string;\n refresh: string;\n export: string;\n columnSettings: string;\n showFilters: string;\n addFilter: string;\n clearFilters: string;\n filterProfiles: string;\n saveNewFilterProfile: string;\n}\n\nconst DEFAULT_DATA_TABLE_LABELS: DataTableTextLabels = {\n columns: \"COLUMNS\",\n showAll: \"SHOW ALL\",\n hideAll: \"HIDE ALL\",\n refresh: \"REFRESH\",\n export: \"EXPORT\",\n columnSettings: \"COLUMNS\",\n showFilters: \"SHOW FILTERS\",\n addFilter: \"Add filter\",\n clearFilters: \"Clear filters\",\n filterProfiles: \"Filter profiles\",\n saveNewFilterProfile: \"Save new filter profile\",\n};\n\nexport interface FilterSelectorFooterContext {\n onShowAll: () => void;\n onHideAll: () => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface DataTableProps<T = Record<string, any>> {\n columns: DataTableColumn<T>[];\n data: T[];\n /** Force layout direction for table internals (row actions, sticky columns, pagination). */\n direction?: \"auto\" | TableDirection;\n isLoading?: boolean; // Table data loading state\n onColumnToggle?: (columnId: string) => void;\n /** Number of items per page */\n pageSize?: number;\n /** Maximum height for the scrollable table area */\n maxHeight?: string;\n onSearch?: (query: string) => void;\n onRefresh?: () => void;\n onExport?: () => void;\n showRefreshButton?: boolean;\n showExportButton?: boolean;\n onRowAction?: (action: string, row: T) => void;\n onRowClick?: (row: T, rowIndex: number) => void;\n renderRowDetails?: (row: T, rowIndex: number) => React.ReactNode;\n rowActions?: DataTableRowAction<T>[];\n onBulkDelete?: (rows: T[]) => void;\n renderBulkActions?: (\n context: DataTableBulkActionContext<T>,\n ) => React.ReactNode;\n renderBulkActionCard?: (\n context: DataTableBulkActionContext<T>,\n ) => React.ReactNode;\n onFilterChange?: (filters: FilterValues) => void;\n // Filter options - can include async filters\n filterOptions?: FilterOption[];\n // Called when filters are applied (for server-side filtering)\n onFiltersApply?: (filters: FilterValues) => void;\n // Enable server-side filtering mode\n serverSideFiltering?: boolean;\n searchPlaceholder?: string;\n children?: React.ReactNode;\n /** Total row count for server-side pagination */\n totalCount?: number;\n /** Callback when pagination changes (for server-side pagination) */\n onPaginationChange?: (pageIndex: number, pageSize: number) => void;\n renderEmptyState?: (context: DataTableEmptyStateContext) => React.ReactNode;\n labels?: Partial<DataTableTextLabels>;\n renderFilterSelectorFooterActions?: (\n context: FilterSelectorFooterContext,\n ) => React.ReactNode;\n renderFilterRowActions?: React.ReactNode;\n renderToolbarActions?: React.ReactNode;\n className?: string;\n tableContainerClassName?: string;\n tableClassName?: string;\n caption?: React.ReactNode;\n captionClassName?: string;\n headerClassName?: string;\n headerRowClassName?: string;\n headClassName?: string;\n bodyClassName?: string;\n rowClassName?: string;\n cellClassName?: string;\n footerClassName?: string;\n}\n\nfunction renderDefaultCellValue(value: unknown): React.ReactNode {\n if (value === undefined || value === null || value === \"\") {\n return \"-\";\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"Yes\" : \"No\";\n }\n\n if (Array.isArray(value)) {\n return value.length > 0 ? value.join(\", \") : \"-\";\n }\n\n return value as React.ReactNode;\n}\n\ninterface FilterProfileProps {\n isOpen: boolean;\n onClose: () => void;\n onSaveProfile: (name: string) => void;\n}\n\nexport const FilterProfile: React.FC<FilterProfileProps> = ({\n isOpen,\n onClose,\n onSaveProfile,\n}) => {\n const [profileName, setProfileName] = React.useState(\"\");\n\n const handleSave = () => {\n if (profileName.trim()) {\n onSaveProfile(profileName);\n setProfileName(\"\");\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-200\"\n onClick={onClose}\n >\n <div\n className=\"bg-ds-surface-1 border border-ds-border-2 rounded-xl p-6 max-w-md w-full mx-4\"\n onClick={(e) => e.stopPropagation()}\n >\n <h2 className=\"text-2xl font-bold text-ds-1 mb-4\">Add new profile</h2>\n\n <label className=\"mb-2 block text-sm font-medium text-ds-1\">\n Enter filter profile name:\n </label>\n <Input\n type=\"text\"\n value={profileName}\n onChange={(e) => setProfileName(e.target.value)}\n placeholder=\"Enter value\"\n className=\"\"\n onKeyDown={(e) => e.key === \"Enter\" && handleSave()}\n />\n\n <div className=\"flex justify-end gap-3 mt-6\">\n <Button onClick={onClose} className=\"min-w-28\" size=\"medium\">\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n disabled={!profileName.trim()}\n className=\"min-w-28\"\n size=\"medium\"\n primary\n >\n Save\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nconst TABLE_CONTROL_ICON_CLASS_NAME = \"h-[18px] w-[18px] shrink-0\";\nconst TABLE_COMPLEX_ICON_CLASS_NAME = TABLE_CONTROL_ICON_CLASS_NAME;\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 30, 50, 100] as const;\nconst ROW_ACTIONS_CELL_WIDTH_CLASS_NAME = \"w-12 min-w-12 max-w-12\";\nconst ROW_ACTIONS_MENU_MIN_WIDTH_PX = 140;\nconst ROW_ACTIONS_MENU_MAX_WIDTH_PX = 200;\nconst ROW_ACTIONS_MENU_GAP_PX = 6;\nconst ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX = 8;\nconst ROW_ACTIONS_MENU_RIGHT_GUTTER_PX = 0;\nconst ROW_ACTIONS_MENU_LEFT_GUTTER_PX = 0;\n\ninterface RowActionsCellProps<T> {\n rowIndex: number;\n row: T;\n isOpen: boolean;\n openDirection: \"up\" | \"down\";\n tableContainerRef: React.RefObject<HTMLDivElement | null>;\n onToggle: (rowIndex: number) => void;\n onClose: () => void;\n onRowAction?: (action: string, row: T) => void;\n actions: DataTableRowAction<T>[];\n direction: TableDirection;\n}\n\nfunction RowActionsCell<T>({\n rowIndex,\n row,\n isOpen,\n openDirection,\n tableContainerRef,\n onToggle,\n onClose,\n onRowAction,\n actions,\n direction,\n}: RowActionsCellProps<T>) {\n const toggleAnchorRef = React.useRef<HTMLDivElement | null>(null);\n const menuRef = React.useRef<HTMLDivElement | null>(null);\n const [menuPosition, setMenuPosition] = React.useState<{\n top: number;\n right?: number;\n left?: number;\n } | null>(null);\n\n const updateMenuPosition = React.useCallback(() => {\n if (!isOpen || !toggleAnchorRef.current) {\n return;\n }\n\n const anchorRect = toggleAnchorRef.current.getBoundingClientRect();\n const tableRect = tableContainerRef.current?.getBoundingClientRect();\n const menuHeight =\n menuRef.current?.getBoundingClientRect().height ??\n Math.max(actions.length, 1) * 36 + 12;\n\n const spaceBelow =\n window.innerHeight -\n anchorRect.bottom -\n ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX;\n const spaceAbove = anchorRect.top - ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX;\n\n const openUpward =\n openDirection === \"up\"\n ? spaceBelow < menuHeight || spaceAbove > spaceBelow\n : spaceBelow < menuHeight && spaceAbove > spaceBelow;\n\n const targetTop = openUpward\n ? anchorRect.top - menuHeight - ROW_ACTIONS_MENU_GAP_PX\n : anchorRect.bottom + ROW_ACTIONS_MENU_GAP_PX;\n\n const maxTop = Math.max(\n ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX,\n window.innerHeight - menuHeight - ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX,\n );\n const clampedTop = Math.min(\n Math.max(targetTop, ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX),\n maxTop,\n );\n\n if (direction === \"rtl\") {\n const leftOffset = Math.max(\n (tableRect?.left ?? anchorRect.left) + ROW_ACTIONS_MENU_LEFT_GUTTER_PX,\n ROW_ACTIONS_MENU_LEFT_GUTTER_PX,\n );\n\n setMenuPosition({\n top: clampedTop,\n left: leftOffset,\n });\n\n return;\n }\n\n const rightOffset = Math.max(\n window.innerWidth -\n (tableRect?.right ?? anchorRect.right) +\n ROW_ACTIONS_MENU_RIGHT_GUTTER_PX,\n ROW_ACTIONS_MENU_RIGHT_GUTTER_PX,\n );\n\n setMenuPosition({\n top: clampedTop,\n right: rightOffset,\n });\n }, [actions.length, direction, isOpen, openDirection, tableContainerRef]);\n\n React.useLayoutEffect(() => {\n if (!isOpen) {\n setMenuPosition(null);\n return;\n }\n\n updateMenuPosition();\n const rafId = window.requestAnimationFrame(updateMenuPosition);\n return () => window.cancelAnimationFrame(rafId);\n }, [isOpen, updateMenuPosition]);\n\n React.useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n const handleViewportChange = () => onClose();\n const tableContainerElement = tableContainerRef.current;\n\n window.addEventListener(\"keydown\", handleEscape);\n window.addEventListener(\"resize\", handleViewportChange);\n window.addEventListener(\"scroll\", handleViewportChange, true);\n tableContainerElement?.addEventListener(\"scroll\", handleViewportChange, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener(\"keydown\", handleEscape);\n window.removeEventListener(\"resize\", handleViewportChange);\n window.removeEventListener(\"scroll\", handleViewportChange, true);\n tableContainerElement?.removeEventListener(\n \"scroll\",\n handleViewportChange,\n );\n };\n }, [isOpen, onClose, tableContainerRef]);\n\n const rowActionsMenu = isOpen\n ? createPortal(\n <>\n <div className=\"fixed inset-0 z-[220]\" onClick={onClose} />\n <div\n ref={menuRef}\n dir={direction}\n className={mergeClassNames(\n \"fixed z-[230] min-w-[140px] max-w-[200px] overflow-hidden rounded-lg border border-ds-border-3 bg-ds-surface-2 shadow-xl\",\n direction === \"rtl\" ? \"text-right\" : \"text-left\",\n )}\n style={{\n top: menuPosition?.top,\n right: menuPosition?.right,\n left: menuPosition?.left,\n minWidth: `${ROW_ACTIONS_MENU_MIN_WIDTH_PX}px`,\n maxWidth: `${ROW_ACTIONS_MENU_MAX_WIDTH_PX}px`,\n }}\n onClick={(event) => event.stopPropagation()}\n >\n {actions.map((action) => (\n <Button\n key={action.id}\n onClick={() => {\n action.onClick?.(row);\n onRowAction?.(action.id, row);\n onClose();\n }}\n className={mergeClassNames(\n \"w-full rounded-none border-none bg-ds-surface-2 px-4 py-2 text-sm font-normal shadow-none hover:bg-ds-surface-3 hover:opacity-100\",\n direction === \"rtl\"\n ? \"justify-end text-right\"\n : \"justify-start text-left\",\n action.variant === \"destructive\"\n ? \"text-error hover:text-error\"\n : \"text-ds-2 hover:text-ds-1\",\n )}\n >\n {action.label}\n </Button>\n ))}\n </div>\n </>,\n document.body,\n )\n : null;\n\n return (\n <td\n className={mergeClassNames(\n \"relative h-full overflow-hidden border-x border-ds-border-2 bg-ds-surface-1 p-0 align-middle\",\n direction === \"rtl\"\n ? \"sticky left-0 text-right shadow-[8px_0_12px_-10px_rgba(15,23,42,0.35)]\"\n : \"sticky right-0 text-right shadow-[-8px_0_12px_-10px_rgba(15,23,42,0.35)]\",\n ROW_ACTIONS_CELL_WIDTH_CLASS_NAME,\n isOpen ? \"z-20\" : \"z-10\",\n )}\n >\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -inset-y-px left-0 z-20 w-px bg-ds-border-2\"\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -inset-y-px right-0 z-20 w-px bg-ds-border-2\"\n />\n <div\n ref={toggleAnchorRef}\n className={mergeClassNames(\n \"absolute -inset-y-px z-10 flex items-stretch bg-ds-surface-2\",\n direction === \"rtl\" ? \"left-0 justify-start\" : \"right-0 justify-end\",\n )}\n >\n <Button\n onClick={(event) => {\n event.stopPropagation();\n onToggle(rowIndex);\n }}\n aria-label=\"Open row actions\"\n className={mergeClassNames(\n \"h-full w-12 rounded-none border-none px-0 py-0 shadow-none hover:opacity-100 \",\n isOpen\n ? \"bg-ds-surface-2 text-ds-1\"\n : \"bg-ds-surface-2 text-ds-2 hover:bg-ds-surface-3 hover:text-ds-1\",\n )}\n >\n <EllipsisVerticalIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n </Button>\n </div>\n {rowActionsMenu}\n </td>\n );\n}\n\ninterface DataTablePaginationProps<T> {\n table: TanStackTable<T>;\n totalCount?: number;\n filteredCount: number;\n direction: TableDirection;\n}\n\nfunction DataTablePagination<T>({\n table,\n totalCount,\n filteredCount,\n direction,\n}: DataTablePaginationProps<T>) {\n const { pageIndex, pageSize } = table.getState().pagination;\n const itemCount = totalCount ?? filteredCount;\n const pageStart = itemCount === 0 ? 0 : pageIndex * pageSize + 1;\n const pageEnd = Math.min((pageIndex + 1) * pageSize, itemCount);\n const pageSizeOptions = Array.from(\n new Set([...DEFAULT_PAGE_SIZE_OPTIONS, pageSize]),\n ).sort((left, right) => left - right);\n\n return (\n <div className=\"relative z-10 flex flex-col gap-3 border-t border-ds-border-2 bg-ds-surface-2 px-4 py-3 overflow-visible md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-ds-2\">\n Showing {pageStart} to {pageEnd} of {itemCount} items\n </span>\n </div>\n\n <div className=\"flex flex-wrap items-center justify-end gap-2 overflow-visible\">\n <span className=\"text-sm text-ds-2\">Rows</span>\n <Select\n value={String(pageSize)}\n onChange={(event) => table.setPageSize(Number(event.target.value))}\n aria-label=\"Rows per page\"\n size=\"compact\"\n containerClassName=\"w-[5.5rem] min-w-[5.5rem] shrink-0\"\n triggerClassName=\"px-2.5 font-medium text-ds-1\"\n dropdownClassName=\"top-auto bottom-full z-[80] mb-1 mt-0\"\n options={pageSizeOptions.map((size) => ({\n value: String(size),\n label: String(size),\n }))}\n />\n\n <ToolbarIconButton\n title=\"First page\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n {direction === \"rtl\" ? (\n <ChevronsRightIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronsLeftIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n )}\n </ToolbarIconButton>\n\n <ToolbarIconButton\n title=\"Previous page\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n {direction === \"rtl\" ? (\n <ChevronRightIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronLeftIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n )}\n </ToolbarIconButton>\n\n <span className=\"inline-flex h-10 shrink-0 items-center rounded-lg px-3 text-sm font-medium text-ds-2\">\n Page {pageIndex + 1} of {table.getPageCount()}\n </span>\n\n <ToolbarIconButton\n title=\"Next page\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n {direction === \"rtl\" ? (\n <ChevronLeftIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronRightIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n )}\n </ToolbarIconButton>\n\n <ToolbarIconButton\n title=\"Last page\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n {direction === \"rtl\" ? (\n <ChevronsLeftIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronsRightIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n )}\n </ToolbarIconButton>\n </div>\n </div>\n );\n}\n\ninterface FilterSelectorMenuProps {\n direction: TableDirection;\n filterOptions: FilterOption[];\n visibleFilters: string[];\n onToggleFilter: (filterId: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n labels: DataTableTextLabels;\n footerActions?: React.ReactNode;\n}\n\nfunction FilterSelectorMenu({\n direction,\n filterOptions,\n visibleFilters,\n onToggleFilter,\n onShowAll,\n onHideAll,\n labels,\n footerActions,\n}: FilterSelectorMenuProps) {\n return (\n <div\n dir={direction}\n className={mergeClassNames(\n \"flex min-w-48 flex-col\",\n direction === \"rtl\" ? \"text-right\" : \"text-left\",\n )}\n style={{ maxHeight: \"min(400px, 80dvh)\" }}\n >\n {/* Header — never scrolls */}\n <div className=\"flex shrink-0 items-center px-4 pb-2 pt-4\">\n <span className=\"text-sm font-semibold text-ds-1\">\n {labels.showFilters}\n </span>\n </div>\n\n {/* Scrollable filter list */}\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 pb-1\">\n <div className=\"space-y-0.5\">\n {filterOptions.map((filter) => (\n <div\n key={filter.id}\n className=\"min-w-36 rounded-md px-2 py-1 hover:bg-ds-surface-2\"\n >\n <Checkbox\n checked={visibleFilters.includes(filter.id)}\n onChange={(event) =>\n onToggleFilter(filter.id, event.target.checked)\n }\n label={filter.label}\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Sticky footer — always visible at bottom */}\n <div\n className={mergeClassNames(\n \"flex shrink-0 gap-2 border-t border-ds-border-2 px-4 py-3\",\n direction === \"rtl\" && \"flex-row-reverse\",\n )}\n >\n <Button\n onClick={onShowAll}\n size=\"small\"\n className=\"flex-1 border-none bg-transparent px-1 py-1 text-xs font-semibold text-ds-1 shadow-none hover:bg-transparent hover:text-ds-accent-hover hover:opacity-100\"\n >\n {labels.showAll}\n </Button>\n <Button\n onClick={onHideAll}\n size=\"small\"\n className=\"flex-1 border-none bg-transparent px-1 py-1 text-xs font-semibold text-ds-2 shadow-none hover:bg-transparent hover:text-ds-1 hover:opacity-100\"\n >\n {labels.hideAll}\n </Button>\n {footerActions}\n </div>\n </div>\n );\n}\n\nconst usesManualPagination = (\n totalCount?: number,\n onPaginationChange?: (pageIndex: number, pageSize: number) => void,\n) => totalCount !== undefined || typeof onPaginationChange === \"function\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function DataTable<T = Record<string, any>>({\n columns,\n data,\n direction = \"auto\",\n isLoading = false,\n onColumnToggle,\n pageSize = 10,\n maxHeight = \"500px\",\n onSearch,\n onRefresh,\n onExport,\n showRefreshButton = true,\n showExportButton = true,\n onRowAction,\n onRowClick,\n renderRowDetails,\n rowActions,\n onBulkDelete,\n renderBulkActions,\n renderBulkActionCard,\n onFilterChange,\n onFiltersApply,\n serverSideFiltering = false,\n filterOptions: externalFilterOptions,\n searchPlaceholder = \"Search ...\",\n totalCount,\n onPaginationChange,\n renderEmptyState,\n labels: labelsProp,\n renderFilterSelectorFooterActions,\n renderFilterRowActions,\n renderToolbarActions,\n className,\n tableContainerClassName,\n tableClassName,\n caption,\n captionClassName,\n headerClassName,\n headerRowClassName,\n headClassName,\n bodyClassName,\n rowClassName,\n cellClassName,\n footerClassName,\n}: DataTableProps<T>) {\n const tableRootRef = React.useRef<HTMLDivElement | null>(null);\n const [tableDirection, setTableDirection] =\n React.useState<TableDirection>(\"ltr\");\n\n React.useLayoutEffect(() => {\n if (direction === \"rtl\" || direction === \"ltr\") {\n setTableDirection(direction);\n return;\n }\n\n setTableDirection(resolveTableDirection(tableRootRef.current));\n }, [direction]);\n\n const isRtl = tableDirection === \"rtl\";\n\n const resolvedRowActions = React.useMemo<DataTableRowAction<T>[]>(\n () => rowActions ?? [],\n [rowActions],\n );\n const hasRowActions = resolvedRowActions.length > 0;\n\n const labels = React.useMemo<DataTableTextLabels>(\n () => ({\n ...DEFAULT_DATA_TABLE_LABELS,\n ...labelsProp,\n }),\n [labelsProp],\n );\n\n const [pagination, setPagination] = React.useState<PaginationState>({\n pageIndex: 0,\n pageSize: pageSize,\n });\n const [columnMenuOpen, setColumnMenuOpen] = React.useState(false);\n const [profileMenuOpen, setProfileMenuOpen] = React.useState(false);\n const [profileOpen, setProfileOpen] = React.useState(false);\n const [filterSelectorOpen, setFilterSelectorOpen] = React.useState(false);\n const [visibleFilters, setVisibleFilters] = React.useState<string[]>([]);\n const [activeFilters, setActiveFilters] = React.useState<FilterValues>({});\n const [bulkSelectionActive, setBulkSelectionActive] = React.useState(false);\n const [selectedRowIds, setSelectedRowIds] = React.useState<\n Record<string, boolean>\n >({});\n const [rowMenuOpen, setRowMenuOpen] = React.useState<number | null>(null);\n const [expandedRowId, setExpandedRowId] = React.useState<string | null>(null);\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n const [columnVisibility, setColumnVisibility] = React.useState<\n Record<string, boolean>\n >(() =>\n Object.fromEntries(\n columns.map((column) => [column.id, column.visible !== false]),\n ),\n );\n\n const columnsVisibilitySignature = React.useMemo(\n () =>\n columns\n .map((column) => `${column.id}:${column.visible !== false}`)\n .join(\"|\"),\n [columns],\n );\n\n React.useEffect(() => {\n setColumnVisibility(\n Object.fromEntries(\n columns.map((column) => [column.id, column.visible !== false]),\n ),\n );\n }, [columns, columnsVisibilitySignature]);\n\n const asyncFilterOptions = useAsyncFilterOptions(\n externalFilterOptions,\n filterSelectorOpen,\n );\n\n // Auto-generate filter options from columns that are filterable\n const filterOptions: FilterOption[] = React.useMemo(() => {\n return resolveFilterOptions(\n columns,\n data,\n externalFilterOptions,\n asyncFilterOptions,\n );\n }, [columns, data, externalFilterOptions, asyncFilterOptions]);\n\n const resolvedColumns = React.useMemo(\n () =>\n columns.map((column) => ({\n ...column,\n visible: columnVisibility[column.id] ?? column.visible !== false,\n })),\n [columnVisibility, columns],\n );\n\n const visibleColumns = React.useMemo(\n () => resolvedColumns.filter((column) => column.visible !== false),\n [resolvedColumns],\n );\n const manualPagination = usesManualPagination(totalCount, onPaginationChange);\n const pageCount =\n totalCount === undefined\n ? undefined\n : Math.ceil(totalCount / pagination.pageSize);\n\n // Filter data based on search query and active filters (client-side only)\n const filteredData = React.useMemo(() => {\n return filterClientData(\n data,\n activeFilters,\n searchQuery,\n serverSideFiltering,\n filterOptions,\n );\n }, [data, activeFilters, searchQuery, serverSideFiltering, filterOptions]);\n\n // TanStack Table columns definition\n const tableColumns = React.useMemo<ColumnDef<T>[]>(\n () =>\n visibleColumns.map((col) => ({\n id: col.id,\n accessorKey: col.id,\n header: col.label,\n cell: (info: CellContext<T, unknown>) => {\n const value = info.getValue();\n\n if (col.renderCell) {\n return col.renderCell({\n value,\n row: info.row.original,\n rowIndex: info.row.index,\n columnId: col.id,\n });\n }\n\n return renderDefaultCellValue(value);\n },\n })),\n [visibleColumns],\n );\n\n const updatePagination = React.useCallback(\n (\n updater:\n | PaginationState\n | ((previous: PaginationState) => PaginationState),\n ) => {\n setPagination((previous) => {\n const nextPagination =\n typeof updater === \"function\" ? updater(previous) : updater;\n\n if (\n previous.pageIndex !== nextPagination.pageIndex ||\n previous.pageSize !== nextPagination.pageSize\n ) {\n onPaginationChange?.(\n nextPagination.pageIndex,\n nextPagination.pageSize,\n );\n }\n\n return nextPagination;\n });\n },\n [onPaginationChange],\n );\n\n const table = useReactTable({\n data: filteredData,\n columns: tableColumns,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n state: {\n pagination,\n globalFilter: searchQuery,\n },\n onPaginationChange: updatePagination,\n manualPagination,\n pageCount,\n });\n\n const visibleRows = table.getRowModel().rows;\n const bulkDeleteEnabled = typeof onBulkDelete === \"function\";\n const selectedRows = React.useMemo(\n () =>\n visibleRows\n .filter((row) => selectedRowIds[row.id])\n .map((row) => row.original),\n [selectedRowIds, visibleRows],\n );\n const allVisibleRowsSelected =\n visibleRows.length > 0 &&\n visibleRows.every((row) => selectedRowIds[row.id]);\n\n React.useEffect(() => {\n updatePagination((previous) =>\n previous.pageIndex === 0 ? previous : { ...previous, pageIndex: 0 },\n );\n }, [activeFilters, searchQuery, updatePagination]);\n\n React.useEffect(() => {\n setSelectedRowIds((previous) => {\n const visibleRowIds = new Set(visibleRows.map((row) => row.id));\n const nextSelection = Object.fromEntries(\n Object.entries(previous).filter(\n ([rowId, isSelected]) => isSelected && visibleRowIds.has(rowId),\n ),\n );\n\n const previousKeys = Object.keys(previous).sort().join(\"|\");\n const nextKeys = Object.keys(nextSelection).sort().join(\"|\");\n\n return previousKeys === nextKeys ? previous : nextSelection;\n });\n }, [visibleRows]);\n\n const applyFilters = React.useCallback(\n (nextFilters: FilterValues) => {\n setActiveFilters(nextFilters);\n onFilterChange?.(nextFilters);\n\n if (serverSideFiltering) {\n onFiltersApply?.(nextFilters);\n }\n },\n [onFilterChange, onFiltersApply, serverSideFiltering],\n );\n\n const handleSearchChange = React.useCallback(\n (value: string) => {\n setSearchQuery(value);\n onSearch?.(value);\n },\n [onSearch],\n );\n\n const handleFilterChange = React.useCallback(\n (filterId: string, value: FilterValue) => {\n applyFilters({\n ...activeFilters,\n [filterId]: value,\n });\n },\n [activeFilters, applyFilters],\n );\n\n const handleResetFilters = React.useCallback(() => {\n applyFilters({});\n }, [applyFilters]);\n\n const handleToggleFilterVisibility = React.useCallback(\n (filterId: string, isVisible: boolean) => {\n setVisibleFilters((previous) => {\n if (isVisible) {\n return previous.includes(filterId)\n ? previous\n : [...previous, filterId];\n }\n\n return previous.filter((id) => id !== filterId);\n });\n\n if (!isVisible && filterId in activeFilters) {\n const nextFilters = { ...activeFilters };\n delete nextFilters[filterId];\n applyFilters(nextFilters);\n }\n },\n [activeFilters, applyFilters],\n );\n\n const handleShowAllFilters = React.useCallback(() => {\n setVisibleFilters(filterOptions.map((filter) => filter.id));\n }, [filterOptions]);\n\n const handleHideAllFilters = React.useCallback(() => {\n setVisibleFilters([]);\n handleResetFilters();\n }, [handleResetFilters]);\n\n const handleToggleRowMenu = React.useCallback((rowIndex: number) => {\n setRowMenuOpen((previous) => (previous === rowIndex ? null : rowIndex));\n }, []);\n const handleCloseRowMenu = React.useCallback(() => {\n setRowMenuOpen(null);\n }, []);\n const handleToggleExpandedRow = React.useCallback((rowId: string) => {\n setExpandedRowId((previous) => (previous === rowId ? null : rowId));\n }, []);\n const tableContainerRef = React.useRef<HTMLDivElement | null>(null);\n\n const handleToggleColumnMenu = React.useCallback(() => {\n setColumnMenuOpen((previous) => !previous);\n }, []);\n\n const handleToggleColumnVisibility = React.useCallback(\n (columnId: string) => {\n setColumnVisibility((previous) => ({\n ...previous,\n [columnId]: !(previous[columnId] ?? true),\n }));\n onColumnToggle?.(columnId);\n },\n [onColumnToggle],\n );\n\n const handleShowAllColumns = React.useCallback(() => {\n setColumnVisibility(\n Object.fromEntries(columns.map((column) => [column.id, true])),\n );\n }, [columns]);\n\n const handleHideAllColumns = React.useCallback(() => {\n setColumnVisibility(\n Object.fromEntries(columns.map((column) => [column.id, false])),\n );\n }, [columns]);\n\n const handleToggleBulkSelection = React.useCallback(() => {\n setBulkSelectionActive((previous) => {\n if (previous) {\n setSelectedRowIds({});\n }\n\n return !previous;\n });\n }, []);\n\n const handleToggleRowSelection = React.useCallback(\n (rowId: string, checked: boolean) => {\n setSelectedRowIds((previous) => {\n if (checked) {\n return {\n ...previous,\n [rowId]: true,\n };\n }\n\n const nextSelection = { ...previous };\n delete nextSelection[rowId];\n return nextSelection;\n });\n },\n [],\n );\n\n const handleToggleAllVisibleRows = React.useCallback(\n (checked: boolean) => {\n setSelectedRowIds((previous) => {\n const nextSelection = { ...previous };\n\n visibleRows.forEach((row) => {\n if (checked) {\n nextSelection[row.id] = true;\n } else {\n delete nextSelection[row.id];\n }\n });\n\n return nextSelection;\n });\n },\n [visibleRows],\n );\n\n const handleBulkDeleteSelected = React.useCallback(() => {\n if (!onBulkDelete || selectedRows.length === 0) {\n return;\n }\n\n onBulkDelete(selectedRows);\n setSelectedRowIds({});\n }, [onBulkDelete, selectedRows]);\n\n const handleClearSelectedRows = React.useCallback(() => {\n setSelectedRowIds({});\n }, []);\n\n const handleDisableBulkSelection = React.useCallback(() => {\n setBulkSelectionActive(false);\n setSelectedRowIds({});\n }, []);\n\n const bulkActionContext = React.useMemo<DataTableBulkActionContext<T>>(\n () => ({\n selectedRows,\n selectedCount: selectedRows.length,\n clearSelection: handleClearSelectedRows,\n disableBulkSelection: handleDisableBulkSelection,\n }),\n [handleClearSelectedRows, handleDisableBulkSelection, selectedRows],\n );\n\n const bulkActionsContent = renderBulkActions?.(bulkActionContext);\n const bulkActionCard = renderBulkActionCard?.(bulkActionContext);\n\n const handleOpenProfile = React.useCallback(() => {\n setProfileOpen(true);\n setProfileMenuOpen(false);\n }, []);\n\n const hasActiveFilters = Object.values(activeFilters).some(isFilterActive);\n\n const handleSaveProfile = (profileName: string) => {\n void {\n name: profileName,\n filters: activeFilters,\n timestamp: new Date().toISOString(),\n };\n };\n\n return (\n <div\n ref={tableRootRef}\n dir={tableDirection}\n className={mergeClassNames(\"space-y-0\", className)}\n >\n {/* Row 1: Filters Row - Separated with border */}\n <div className=\"relative z-[60] mb-4 min-h-[80px] flex items-center justify-between gap-4 rounded-lg border border-ds-border-2 bg-ds-surface-1 px-4 py-4\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n {filterOptions\n .filter((filter) => visibleFilters.includes(filter.id))\n .map((filter, index) => {\n const isActive = isFilterActive(activeFilters[filter.id]);\n\n return (\n <div\n key={filter.id}\n className={mergeClassNames(\n \"min-w-[200px]\",\n index > 0 && \"border-ds-border-2 ps-3\",\n index > 0 && (isRtl ? \"border-r\" : \"border-l\"),\n )}\n >\n <FilterFieldControl\n filter={filter}\n value={activeFilters[filter.id]}\n isActive={isActive}\n direction={tableDirection}\n onChange={(value) => handleFilterChange(filter.id, value)}\n />\n </div>\n );\n })}\n </div>\n\n {/* Right side icons */}\n <div className=\"ms-auto flex items-center gap-1\">\n <FilterDropdown\n direction={tableDirection}\n open={filterSelectorOpen}\n onOpenChange={setFilterSelectorOpen}\n trigger={\n <ToolbarIconButton title={labels.addFilter}>\n <FilterIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n </ToolbarIconButton>\n }\n >\n <FilterSelectorMenu\n direction={tableDirection}\n filterOptions={filterOptions}\n visibleFilters={visibleFilters}\n onToggleFilter={handleToggleFilterVisibility}\n onShowAll={handleShowAllFilters}\n onHideAll={handleHideAllFilters}\n labels={labels}\n footerActions={renderFilterSelectorFooterActions?.({\n onShowAll: handleShowAllFilters,\n onHideAll: handleHideAllFilters,\n })}\n />\n </FilterDropdown>\n <ToolbarIconButton\n onClick={handleResetFilters}\n disabled={!hasActiveFilters}\n title={labels.clearFilters}\n >\n <FilterXIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n </ToolbarIconButton>\n <FilterDropdown\n direction={tableDirection}\n open={profileMenuOpen}\n onOpenChange={setProfileMenuOpen}\n trigger={\n <ToolbarIconButton title={labels.filterProfiles}>\n <FilterProfileIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n </ToolbarIconButton>\n }\n >\n <div className=\"p-2 min-w-48\">\n <Button\n onClick={handleOpenProfile}\n className={mergeClassNames(\n \"w-full border-2 border-dashed border-ds-border-accent/40 bg-transparent px-4 py-3 text-sm font-medium text-ds-1 shadow-none hover:bg-ds-accent-subtle hover:opacity-100\",\n tableDirection === \"rtl\"\n ? \"justify-end text-right\"\n : \"justify-start text-left\",\n )}\n >\n {labels.saveNewFilterProfile}\n </Button>\n </div>\n </FilterDropdown>\n {renderFilterRowActions}\n </div>\n </div>\n {/* Table */}\n <div className=\"relative overflow-visible rounded-lg border border-ds-border-2 bg-ds-surface-1\">\n <DataTableToolbar\n direction={tableDirection}\n showRefreshButton={showRefreshButton}\n showExportButton={showExportButton}\n searchQuery={searchQuery}\n onSearchChange={handleSearchChange}\n searchPlaceholder={searchPlaceholder}\n bulkDeleteEnabled={bulkDeleteEnabled}\n bulkSelectionActive={bulkSelectionActive}\n selectedCount={selectedRows.length}\n bulkActionsContent={bulkActionsContent}\n bulkActionCard={bulkActionCard}\n onToggleBulkSelection={handleToggleBulkSelection}\n onBulkDeleteSelected={handleBulkDeleteSelected}\n onRefresh={onRefresh}\n onExport={onExport}\n columnMenuOpen={columnMenuOpen}\n onToggleColumnMenu={handleToggleColumnMenu}\n onCloseColumnMenu={() => setColumnMenuOpen(false)}\n columns={resolvedColumns}\n onColumnToggle={handleToggleColumnVisibility}\n onShowAllColumns={handleShowAllColumns}\n onHideAllColumns={handleHideAllColumns}\n labels={labels}\n toolbarActions={renderToolbarActions}\n />\n\n {/* Table Container */}\n <TableContainer\n ref={tableContainerRef}\n className={tableContainerClassName}\n style={{ maxHeight }}\n >\n <Table className={tableClassName}>\n {caption ? (\n <TableCaption className={captionClassName}>\n {caption}\n </TableCaption>\n ) : null}\n <TableHeader className={mergeClassNames(\"z-40\", headerClassName)}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow\n key={headerGroup.id}\n className={mergeClassNames(\n \"border-b border-ds-border-2\",\n headerRowClassName,\n )}\n >\n {bulkSelectionActive ? (\n <TableHead\n className={mergeClassNames(\n \"w-12 bg-ds-surface-2 px-4 py-3\",\n headClassName,\n )}\n >\n <Checkbox\n aria-label=\"Select all visible rows\"\n checked={allVisibleRowsSelected}\n onChange={(event) =>\n handleToggleAllVisibleRows(event.target.checked)\n }\n />\n </TableHead>\n ) : null}\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className={mergeClassNames(\n \"whitespace-nowrap bg-ds-surface-2 px-4 py-3 text-sm font-semibold text-ds-1\",\n isRtl ? \"text-right\" : \"text-left\",\n headClassName,\n )}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableHead>\n ))}\n {hasRowActions ? (\n <TableHead\n className={mergeClassNames(\n \"sticky top-0 z-30 border-x border-ds-border-2 bg-ds-surface-2 p-0\",\n isRtl\n ? \"left-0 shadow-[8px_0_12px_-10px_rgba(15,23,42,0.35)]\"\n : \"right-0 shadow-[-8px_0_12px_-10px_rgba(15,23,42,0.35)]\",\n ROW_ACTIONS_CELL_WIDTH_CLASS_NAME,\n headClassName,\n )}\n >\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -inset-y-px left-0 z-30 w-px bg-ds-border-2\"\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -inset-y-px right-0 z-30 w-px bg-ds-border-2\"\n />\n <div aria-hidden=\"true\" className=\"h-[45px] w-12\" />\n </TableHead>\n ) : null}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody className={bodyClassName}>\n <DataTableRows\n table={table}\n direction={tableDirection}\n hasRowActions={hasRowActions}\n isLoading={isLoading}\n bulkSelectionActive={bulkSelectionActive}\n selectedRowIds={selectedRowIds}\n onToggleRowSelection={handleToggleRowSelection}\n rowMenuOpen={rowMenuOpen}\n onToggleRowMenu={handleToggleRowMenu}\n onCloseRowMenu={handleCloseRowMenu}\n onRowAction={onRowAction}\n onRowClick={onRowClick}\n expandedRowId={expandedRowId}\n onToggleExpandedRow={handleToggleExpandedRow}\n renderRowDetails={renderRowDetails}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n hasActiveFilters={hasActiveFilters}\n searchQuery={searchQuery}\n renderEmptyState={renderEmptyState}\n renderRowActionsCell={(context) =>\n hasRowActions ? (\n <RowActionsCell\n rowIndex={context.rowIndex}\n row={context.row}\n isOpen={context.isOpen}\n openDirection={context.openDirection}\n tableContainerRef={tableContainerRef}\n onToggle={context.onToggle}\n onClose={context.onClose}\n onRowAction={context.onRowAction}\n actions={resolvedRowActions}\n direction={tableDirection}\n />\n ) : null\n }\n />\n </TableBody>\n <TableFooter className={footerClassName} />\n </Table>\n </TableContainer>\n\n <div className={footerClassName}>\n <DataTablePagination\n table={table}\n totalCount={totalCount}\n filteredCount={filteredData.length}\n direction={tableDirection}\n />\n </div>\n </div>\n {/* Profile Modal */}\n <FilterProfile\n isOpen={profileOpen}\n onClose={() => setProfileOpen(false)}\n onSaveProfile={(name) => {\n handleSaveProfile(name);\n setProfileOpen(false);\n }}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { q as CloseIcon } from "./icons-bx3nrxNv.mjs";
2
- import { t as Calendar } from "./calendar-5XzPqKbE.mjs";
1
+ import { K as CloseIcon } from "./icons-JzMKLygv.mjs";
2
+ import { t as Calendar } from "./calendar-FxAmm_ao.mjs";
3
3
  import { useEffect, useMemo, useRef, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { motion, useMotionTemplate, useMotionValue } from "framer-motion";
@@ -225,4 +225,4 @@ var DatePicker = ({ mode = "single", value, onChange, label, placeholder = "Pick
225
225
  //#endregion
226
226
  export { DatePicker as t };
227
227
 
228
- //# sourceMappingURL=date-picker-BmQ0rgwH.mjs.map
228
+ //# sourceMappingURL=date-picker-3IDSmb9Z.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker-BmQ0rgwH.mjs","names":[],"sources":["../../src/components/forms/date-picker/DatePicker.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { Calendar } from \"../calendar\";\nimport { CloseIcon } from \"../../icons\";\n\nimport type { DatePickerProps, DatePickerValue, DateRangeValue } from \"./types\";\n\nconst formatDate = (date: Date | null) =>\n date?.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }) ?? \"\";\n\nconst isRangeValue = (value: DatePickerValue): value is DateRangeValue =>\n typeof value === \"object\" &&\n value !== null &&\n \"start\" in value &&\n \"end\" in value;\n\nconst emptyRange: DateRangeValue = { start: null, end: null };\n\nconst PANEL_GAP = 8;\nconst VIEWPORT_MARGIN = 12;\n\nexport const DatePicker = ({\n mode = \"single\",\n value,\n onChange,\n label,\n placeholder = \"Pick a date\",\n helperText,\n disabled = false,\n className = \"\",\n presets,\n}: DatePickerProps) => {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<DatePickerValue>(\n value ?? (mode === \"range\" ? emptyRange : null),\n );\n\n const currentValue = isControlled ? value : internalValue;\n const singleValue = mode === \"range\" ? null : (currentValue as Date | null);\n const rangeValue =\n mode === \"range\" && isRangeValue(currentValue)\n ? currentValue\n : mode === \"range\"\n ? { ...emptyRange }\n : emptyRange;\n\n const displayValue = useMemo(() => {\n if (mode === \"range\") {\n if (rangeValue.start && rangeValue.end) {\n return `${formatDate(rangeValue.start)} — ${formatDate(rangeValue.end)}`;\n }\n if (rangeValue.start) {\n return `${formatDate(rangeValue.start)} — …`;\n }\n return \"\";\n }\n return formatDate(singleValue);\n }, [mode, rangeValue.end, rangeValue.start, singleValue]);\n\n const hasSelection =\n mode === \"range\"\n ? Boolean(rangeValue.start || rangeValue.end)\n : Boolean(singleValue);\n\n const updateValue = (next: DatePickerValue) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n const [panelPosition, setPanelPosition] = useState({\n top: 0,\n left: 0,\n minWidth: 320,\n });\n\n useEffect(() => {\n const isEventInside = (event: Event) => {\n const eventPath =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n\n return eventPath.some((target) => {\n if (!(target instanceof Node)) {\n return false;\n }\n\n return (\n containerRef.current?.contains(target) ||\n panelRef.current?.contains(target)\n );\n });\n };\n\n const handlePointerOutside = (event: PointerEvent) => {\n const target = event.target;\n\n if (\n (target instanceof Node &&\n (containerRef.current?.contains(target) ||\n panelRef.current?.contains(target))) ||\n isEventInside(event)\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleFocusOutside = (event: FocusEvent) => {\n const target = event.target;\n\n if (\n (target instanceof Node &&\n (containerRef.current?.contains(target) ||\n panelRef.current?.contains(target))) ||\n isEventInside(event)\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n if (open) {\n document.addEventListener(\"pointerdown\", handlePointerOutside, true);\n document.addEventListener(\"focusin\", handleFocusOutside, true);\n }\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerOutside, true);\n document.removeEventListener(\"focusin\", handleFocusOutside, true);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const updatePanelPosition = () => {\n const triggerRect = triggerRef.current?.getBoundingClientRect();\n\n if (!triggerRect) {\n return;\n }\n\n const panelHeight = panelRef.current?.offsetHeight ?? 360;\n const spaceBelow = window.innerHeight - triggerRect.bottom;\n const shouldOpenAbove =\n spaceBelow < panelHeight + PANEL_GAP &&\n triggerRect.top > panelHeight + PANEL_GAP;\n\n const unclampedLeft = triggerRect.left;\n const maxLeft = Math.max(\n VIEWPORT_MARGIN,\n window.innerWidth - Math.max(triggerRect.width, 320) - VIEWPORT_MARGIN,\n );\n const left = Math.min(Math.max(unclampedLeft, VIEWPORT_MARGIN), maxLeft);\n\n setPanelPosition({\n top: shouldOpenAbove\n ? Math.max(VIEWPORT_MARGIN, triggerRect.top - panelHeight - PANEL_GAP)\n : Math.min(\n triggerRect.bottom + PANEL_GAP,\n window.innerHeight - panelHeight - VIEWPORT_MARGIN,\n ),\n left,\n minWidth: Math.max(triggerRect.width, 320),\n });\n };\n\n updatePanelPosition();\n\n const frameId = window.requestAnimationFrame(updatePanelPosition);\n\n window.addEventListener(\"resize\", updatePanelPosition);\n window.addEventListener(\"scroll\", updatePanelPosition, true);\n\n return () => {\n window.cancelAnimationFrame(frameId);\n window.removeEventListener(\"resize\", updatePanelPosition);\n window.removeEventListener(\"scroll\", updatePanelPosition, true);\n };\n }, [open, presets]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handlePresetClick = (getValue: () => DatePickerValue) => {\n const next = getValue();\n updateValue(next);\n setOpen(false);\n };\n\n const handleClearSelection = () => {\n if (disabled) {\n return;\n }\n\n updateValue(mode === \"range\" ? { ...emptyRange } : null);\n setOpen(false);\n };\n\n return (\n <div ref={containerRef} className={`w-full space-y-2 ${className}`.trim()}>\n {label && <p className=\"text-sm font-medium text-ds-1\">{label}</p>}\n <div className=\"relative\">\n <motion.div\n style={{\n backgroundImage: disabled\n ? \"none\"\n : useMotionTemplate`\n radial-gradient(\n ${\n visible ? `${radius}px` : \"0px\"\n } circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={!disabled ? handleMouseMove : undefined}\n onMouseEnter={!disabled ? () => setVisible(true) : undefined}\n onMouseLeave={!disabled ? () => setVisible(false) : undefined}\n className={\n disabled\n ? \"group/date-picker rounded-lg border-none bg-ds-surface-1 p-[2px]\"\n : \"group/date-picker rounded-lg border-ds-border-2 p-[2px]\"\n }\n >\n <div className=\"relative\">\n <button\n ref={triggerRef}\n type=\"button\"\n className={`flex w-full items-center justify-between rounded-md border border-ds-border-field bg-ds-surface-1 px-3 py-2 text-sm text-ds-1 transition duration-400 ease-in-out ${\n disabled ? \"cursor-not-allowed opacity-50\" : \"\"\n }`}\n style={{ paddingInlineEnd: \"2.5rem\" }}\n onClick={() => !disabled && setOpen((prev) => !prev)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={disabled}\n >\n <span className={displayValue ? \"text-ds-1\" : \"text-ds-2\"}>\n {displayValue || placeholder}\n </span>\n </button>\n\n {hasSelection && !disabled ? (\n <button\n type=\"button\"\n className=\"absolute top-1/2 inline-flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded-full text-ds-2 transition-colors hover:bg-ds-accent-subtle hover:text-ds-1\"\n style={{ insetInlineEnd: \"0.75rem\" }}\n onClick={handleClearSelection}\n aria-label={\n mode === \"range\"\n ? \"Clear selected date range\"\n : \"Clear selected date\"\n }\n >\n <CloseIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </button>\n ) : (\n <span\n className=\"pointer-events-none absolute top-1/2 -translate-y-1/2 text-ds-2\"\n style={{ insetInlineEnd: \"0.75rem\" }}\n aria-hidden=\"true\"\n >\n 📅\n </span>\n )}\n </div>\n </motion.div>\n </div>\n {helperText && <p className=\"text-xs text-ds-2\">{helperText}</p>}\n {open && !disabled && typeof document !== \"undefined\"\n ? createPortal(\n <div className=\"fixed inset-0 z-60\">\n <div\n className=\"absolute inset-0\"\n aria-hidden=\"true\"\n onPointerDown={() => setOpen(false)}\n />\n <div\n ref={panelRef}\n className=\"dropdown-panel absolute z-10\"\n style={{\n top: panelPosition.top,\n left: panelPosition.left,\n minWidth: panelPosition.minWidth,\n }}\n role=\"dialog\"\n aria-modal=\"false\"\n >\n <Calendar\n value={mode === \"single\" ? (singleValue ?? null) : undefined}\n selectionMode={mode}\n range={mode === \"range\" ? rangeValue : undefined}\n onSelect={\n mode === \"single\"\n ? (date) => {\n updateValue(date);\n setOpen(false);\n }\n : undefined\n }\n onRangeSelect={\n mode === \"range\"\n ? (nextRange) => {\n updateValue(nextRange);\n if (nextRange.start && nextRange.end) {\n setOpen(false);\n }\n }\n : undefined\n }\n />\n {presets?.length ? (\n <div className=\"mt-3 flex flex-wrap gap-2 rounded-lg border border-ds-border-2 bg-ds-surface-1/95 p-3 shadow-xl backdrop-blur-xl\">\n {presets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"rounded-full border border-ds-border-field px-3 py-1 text-xs text-ds-2 transition-colors hover:border-ds-border-accent hover:bg-ds-accent-subtle hover:text-ds-1\"\n onClick={() => handlePresetClick(preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"date-picker-3IDSmb9Z.mjs","names":[],"sources":["../../src/components/forms/date-picker/DatePicker.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { Calendar } from \"../calendar\";\nimport { CloseIcon } from \"../../icons\";\n\nimport type { DatePickerProps, DatePickerValue, DateRangeValue } from \"./types\";\n\nconst formatDate = (date: Date | null) =>\n date?.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }) ?? \"\";\n\nconst isRangeValue = (value: DatePickerValue): value is DateRangeValue =>\n typeof value === \"object\" &&\n value !== null &&\n \"start\" in value &&\n \"end\" in value;\n\nconst emptyRange: DateRangeValue = { start: null, end: null };\n\nconst PANEL_GAP = 8;\nconst VIEWPORT_MARGIN = 12;\n\nexport const DatePicker = ({\n mode = \"single\",\n value,\n onChange,\n label,\n placeholder = \"Pick a date\",\n helperText,\n disabled = false,\n className = \"\",\n presets,\n}: DatePickerProps) => {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<DatePickerValue>(\n value ?? (mode === \"range\" ? emptyRange : null),\n );\n\n const currentValue = isControlled ? value : internalValue;\n const singleValue = mode === \"range\" ? null : (currentValue as Date | null);\n const rangeValue =\n mode === \"range\" && isRangeValue(currentValue)\n ? currentValue\n : mode === \"range\"\n ? { ...emptyRange }\n : emptyRange;\n\n const displayValue = useMemo(() => {\n if (mode === \"range\") {\n if (rangeValue.start && rangeValue.end) {\n return `${formatDate(rangeValue.start)} — ${formatDate(rangeValue.end)}`;\n }\n if (rangeValue.start) {\n return `${formatDate(rangeValue.start)} — …`;\n }\n return \"\";\n }\n return formatDate(singleValue);\n }, [mode, rangeValue.end, rangeValue.start, singleValue]);\n\n const hasSelection =\n mode === \"range\"\n ? Boolean(rangeValue.start || rangeValue.end)\n : Boolean(singleValue);\n\n const updateValue = (next: DatePickerValue) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n const [panelPosition, setPanelPosition] = useState({\n top: 0,\n left: 0,\n minWidth: 320,\n });\n\n useEffect(() => {\n const isEventInside = (event: Event) => {\n const eventPath =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n\n return eventPath.some((target) => {\n if (!(target instanceof Node)) {\n return false;\n }\n\n return (\n containerRef.current?.contains(target) ||\n panelRef.current?.contains(target)\n );\n });\n };\n\n const handlePointerOutside = (event: PointerEvent) => {\n const target = event.target;\n\n if (\n (target instanceof Node &&\n (containerRef.current?.contains(target) ||\n panelRef.current?.contains(target))) ||\n isEventInside(event)\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleFocusOutside = (event: FocusEvent) => {\n const target = event.target;\n\n if (\n (target instanceof Node &&\n (containerRef.current?.contains(target) ||\n panelRef.current?.contains(target))) ||\n isEventInside(event)\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n if (open) {\n document.addEventListener(\"pointerdown\", handlePointerOutside, true);\n document.addEventListener(\"focusin\", handleFocusOutside, true);\n }\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerOutside, true);\n document.removeEventListener(\"focusin\", handleFocusOutside, true);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const updatePanelPosition = () => {\n const triggerRect = triggerRef.current?.getBoundingClientRect();\n\n if (!triggerRect) {\n return;\n }\n\n const panelHeight = panelRef.current?.offsetHeight ?? 360;\n const spaceBelow = window.innerHeight - triggerRect.bottom;\n const shouldOpenAbove =\n spaceBelow < panelHeight + PANEL_GAP &&\n triggerRect.top > panelHeight + PANEL_GAP;\n\n const unclampedLeft = triggerRect.left;\n const maxLeft = Math.max(\n VIEWPORT_MARGIN,\n window.innerWidth - Math.max(triggerRect.width, 320) - VIEWPORT_MARGIN,\n );\n const left = Math.min(Math.max(unclampedLeft, VIEWPORT_MARGIN), maxLeft);\n\n setPanelPosition({\n top: shouldOpenAbove\n ? Math.max(VIEWPORT_MARGIN, triggerRect.top - panelHeight - PANEL_GAP)\n : Math.min(\n triggerRect.bottom + PANEL_GAP,\n window.innerHeight - panelHeight - VIEWPORT_MARGIN,\n ),\n left,\n minWidth: Math.max(triggerRect.width, 320),\n });\n };\n\n updatePanelPosition();\n\n const frameId = window.requestAnimationFrame(updatePanelPosition);\n\n window.addEventListener(\"resize\", updatePanelPosition);\n window.addEventListener(\"scroll\", updatePanelPosition, true);\n\n return () => {\n window.cancelAnimationFrame(frameId);\n window.removeEventListener(\"resize\", updatePanelPosition);\n window.removeEventListener(\"scroll\", updatePanelPosition, true);\n };\n }, [open, presets]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handlePresetClick = (getValue: () => DatePickerValue) => {\n const next = getValue();\n updateValue(next);\n setOpen(false);\n };\n\n const handleClearSelection = () => {\n if (disabled) {\n return;\n }\n\n updateValue(mode === \"range\" ? { ...emptyRange } : null);\n setOpen(false);\n };\n\n return (\n <div ref={containerRef} className={`w-full space-y-2 ${className}`.trim()}>\n {label && <p className=\"text-sm font-medium text-ds-1\">{label}</p>}\n <div className=\"relative\">\n <motion.div\n style={{\n backgroundImage: disabled\n ? \"none\"\n : useMotionTemplate`\n radial-gradient(\n ${\n visible ? `${radius}px` : \"0px\"\n } circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={!disabled ? handleMouseMove : undefined}\n onMouseEnter={!disabled ? () => setVisible(true) : undefined}\n onMouseLeave={!disabled ? () => setVisible(false) : undefined}\n className={\n disabled\n ? \"group/date-picker rounded-lg border-none bg-ds-surface-1 p-[2px]\"\n : \"group/date-picker rounded-lg border-ds-border-2 p-[2px]\"\n }\n >\n <div className=\"relative\">\n <button\n ref={triggerRef}\n type=\"button\"\n className={`flex w-full items-center justify-between rounded-md border border-ds-border-field bg-ds-surface-1 px-3 py-2 text-sm text-ds-1 transition duration-400 ease-in-out ${\n disabled ? \"cursor-not-allowed opacity-50\" : \"\"\n }`}\n style={{ paddingInlineEnd: \"2.5rem\" }}\n onClick={() => !disabled && setOpen((prev) => !prev)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={disabled}\n >\n <span className={displayValue ? \"text-ds-1\" : \"text-ds-2\"}>\n {displayValue || placeholder}\n </span>\n </button>\n\n {hasSelection && !disabled ? (\n <button\n type=\"button\"\n className=\"absolute top-1/2 inline-flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded-full text-ds-2 transition-colors hover:bg-ds-accent-subtle hover:text-ds-1\"\n style={{ insetInlineEnd: \"0.75rem\" }}\n onClick={handleClearSelection}\n aria-label={\n mode === \"range\"\n ? \"Clear selected date range\"\n : \"Clear selected date\"\n }\n >\n <CloseIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </button>\n ) : (\n <span\n className=\"pointer-events-none absolute top-1/2 -translate-y-1/2 text-ds-2\"\n style={{ insetInlineEnd: \"0.75rem\" }}\n aria-hidden=\"true\"\n >\n 📅\n </span>\n )}\n </div>\n </motion.div>\n </div>\n {helperText && <p className=\"text-xs text-ds-2\">{helperText}</p>}\n {open && !disabled && typeof document !== \"undefined\"\n ? createPortal(\n <div className=\"fixed inset-0 z-60\">\n <div\n className=\"absolute inset-0\"\n aria-hidden=\"true\"\n onPointerDown={() => setOpen(false)}\n />\n <div\n ref={panelRef}\n className=\"dropdown-panel absolute z-10\"\n style={{\n top: panelPosition.top,\n left: panelPosition.left,\n minWidth: panelPosition.minWidth,\n }}\n role=\"dialog\"\n aria-modal=\"false\"\n >\n <Calendar\n value={mode === \"single\" ? (singleValue ?? null) : undefined}\n selectionMode={mode}\n range={mode === \"range\" ? rangeValue : undefined}\n onSelect={\n mode === \"single\"\n ? (date) => {\n updateValue(date);\n setOpen(false);\n }\n : undefined\n }\n onRangeSelect={\n mode === \"range\"\n ? (nextRange) => {\n updateValue(nextRange);\n if (nextRange.start && nextRange.end) {\n setOpen(false);\n }\n }\n : undefined\n }\n />\n {presets?.length ? (\n <div className=\"mt-3 flex flex-wrap gap-2 rounded-lg border border-ds-border-2 bg-ds-surface-1/95 p-3 shadow-xl backdrop-blur-xl\">\n {presets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"rounded-full border border-ds-border-field px-3 py-1 text-xs text-ds-2 transition-colors hover:border-ds-border-accent hover:bg-ds-accent-subtle hover:text-ds-1\"\n onClick={() => handlePresetClick(preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  require("./chunk-B_GkZjkl.cjs");
2
- const require_icons = require("./icons-CRanVZB1.cjs");
3
- const require_calendar = require("./calendar-CQJgQ5H_.cjs");
2
+ const require_icons = require("./icons-ub9iu-JG.cjs");
3
+ const require_calendar = require("./calendar-DCkikZYb.cjs");
4
4
  let react = require("react");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
6
6
  let framer_motion = require("framer-motion");
@@ -231,4 +231,4 @@ Object.defineProperty(exports, "DatePicker", {
231
231
  }
232
232
  });
233
233
 
234
- //# sourceMappingURL=date-picker-qpUZMtZC.cjs.map
234
+ //# sourceMappingURL=date-picker-_EVYpGga.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker-qpUZMtZC.cjs","names":[],"sources":["../../src/components/forms/date-picker/DatePicker.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { Calendar } from \"../calendar\";\nimport { CloseIcon } from \"../../icons\";\n\nimport type { DatePickerProps, DatePickerValue, DateRangeValue } from \"./types\";\n\nconst formatDate = (date: Date | null) =>\n date?.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }) ?? \"\";\n\nconst isRangeValue = (value: DatePickerValue): value is DateRangeValue =>\n typeof value === \"object\" &&\n value !== null &&\n \"start\" in value &&\n \"end\" in value;\n\nconst emptyRange: DateRangeValue = { start: null, end: null };\n\nconst PANEL_GAP = 8;\nconst VIEWPORT_MARGIN = 12;\n\nexport const DatePicker = ({\n mode = \"single\",\n value,\n onChange,\n label,\n placeholder = \"Pick a date\",\n helperText,\n disabled = false,\n className = \"\",\n presets,\n}: DatePickerProps) => {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<DatePickerValue>(\n value ?? (mode === \"range\" ? emptyRange : null),\n );\n\n const currentValue = isControlled ? value : internalValue;\n const singleValue = mode === \"range\" ? null : (currentValue as Date | null);\n const rangeValue =\n mode === \"range\" && isRangeValue(currentValue)\n ? currentValue\n : mode === \"range\"\n ? { ...emptyRange }\n : emptyRange;\n\n const displayValue = useMemo(() => {\n if (mode === \"range\") {\n if (rangeValue.start && rangeValue.end) {\n return `${formatDate(rangeValue.start)} — ${formatDate(rangeValue.end)}`;\n }\n if (rangeValue.start) {\n return `${formatDate(rangeValue.start)} — …`;\n }\n return \"\";\n }\n return formatDate(singleValue);\n }, [mode, rangeValue.end, rangeValue.start, singleValue]);\n\n const hasSelection =\n mode === \"range\"\n ? Boolean(rangeValue.start || rangeValue.end)\n : Boolean(singleValue);\n\n const updateValue = (next: DatePickerValue) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n const [panelPosition, setPanelPosition] = useState({\n top: 0,\n left: 0,\n minWidth: 320,\n });\n\n useEffect(() => {\n const isEventInside = (event: Event) => {\n const eventPath =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n\n return eventPath.some((target) => {\n if (!(target instanceof Node)) {\n return false;\n }\n\n return (\n containerRef.current?.contains(target) ||\n panelRef.current?.contains(target)\n );\n });\n };\n\n const handlePointerOutside = (event: PointerEvent) => {\n const target = event.target;\n\n if (\n (target instanceof Node &&\n (containerRef.current?.contains(target) ||\n panelRef.current?.contains(target))) ||\n isEventInside(event)\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleFocusOutside = (event: FocusEvent) => {\n const target = event.target;\n\n if (\n (target instanceof Node &&\n (containerRef.current?.contains(target) ||\n panelRef.current?.contains(target))) ||\n isEventInside(event)\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n if (open) {\n document.addEventListener(\"pointerdown\", handlePointerOutside, true);\n document.addEventListener(\"focusin\", handleFocusOutside, true);\n }\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerOutside, true);\n document.removeEventListener(\"focusin\", handleFocusOutside, true);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const updatePanelPosition = () => {\n const triggerRect = triggerRef.current?.getBoundingClientRect();\n\n if (!triggerRect) {\n return;\n }\n\n const panelHeight = panelRef.current?.offsetHeight ?? 360;\n const spaceBelow = window.innerHeight - triggerRect.bottom;\n const shouldOpenAbove =\n spaceBelow < panelHeight + PANEL_GAP &&\n triggerRect.top > panelHeight + PANEL_GAP;\n\n const unclampedLeft = triggerRect.left;\n const maxLeft = Math.max(\n VIEWPORT_MARGIN,\n window.innerWidth - Math.max(triggerRect.width, 320) - VIEWPORT_MARGIN,\n );\n const left = Math.min(Math.max(unclampedLeft, VIEWPORT_MARGIN), maxLeft);\n\n setPanelPosition({\n top: shouldOpenAbove\n ? Math.max(VIEWPORT_MARGIN, triggerRect.top - panelHeight - PANEL_GAP)\n : Math.min(\n triggerRect.bottom + PANEL_GAP,\n window.innerHeight - panelHeight - VIEWPORT_MARGIN,\n ),\n left,\n minWidth: Math.max(triggerRect.width, 320),\n });\n };\n\n updatePanelPosition();\n\n const frameId = window.requestAnimationFrame(updatePanelPosition);\n\n window.addEventListener(\"resize\", updatePanelPosition);\n window.addEventListener(\"scroll\", updatePanelPosition, true);\n\n return () => {\n window.cancelAnimationFrame(frameId);\n window.removeEventListener(\"resize\", updatePanelPosition);\n window.removeEventListener(\"scroll\", updatePanelPosition, true);\n };\n }, [open, presets]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handlePresetClick = (getValue: () => DatePickerValue) => {\n const next = getValue();\n updateValue(next);\n setOpen(false);\n };\n\n const handleClearSelection = () => {\n if (disabled) {\n return;\n }\n\n updateValue(mode === \"range\" ? { ...emptyRange } : null);\n setOpen(false);\n };\n\n return (\n <div ref={containerRef} className={`w-full space-y-2 ${className}`.trim()}>\n {label && <p className=\"text-sm font-medium text-ds-1\">{label}</p>}\n <div className=\"relative\">\n <motion.div\n style={{\n backgroundImage: disabled\n ? \"none\"\n : useMotionTemplate`\n radial-gradient(\n ${\n visible ? `${radius}px` : \"0px\"\n } circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={!disabled ? handleMouseMove : undefined}\n onMouseEnter={!disabled ? () => setVisible(true) : undefined}\n onMouseLeave={!disabled ? () => setVisible(false) : undefined}\n className={\n disabled\n ? \"group/date-picker rounded-lg border-none bg-ds-surface-1 p-[2px]\"\n : \"group/date-picker rounded-lg border-ds-border-2 p-[2px]\"\n }\n >\n <div className=\"relative\">\n <button\n ref={triggerRef}\n type=\"button\"\n className={`flex w-full items-center justify-between rounded-md border border-ds-border-field bg-ds-surface-1 px-3 py-2 text-sm text-ds-1 transition duration-400 ease-in-out ${\n disabled ? \"cursor-not-allowed opacity-50\" : \"\"\n }`}\n style={{ paddingInlineEnd: \"2.5rem\" }}\n onClick={() => !disabled && setOpen((prev) => !prev)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={disabled}\n >\n <span className={displayValue ? \"text-ds-1\" : \"text-ds-2\"}>\n {displayValue || placeholder}\n </span>\n </button>\n\n {hasSelection && !disabled ? (\n <button\n type=\"button\"\n className=\"absolute top-1/2 inline-flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded-full text-ds-2 transition-colors hover:bg-ds-accent-subtle hover:text-ds-1\"\n style={{ insetInlineEnd: \"0.75rem\" }}\n onClick={handleClearSelection}\n aria-label={\n mode === \"range\"\n ? \"Clear selected date range\"\n : \"Clear selected date\"\n }\n >\n <CloseIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </button>\n ) : (\n <span\n className=\"pointer-events-none absolute top-1/2 -translate-y-1/2 text-ds-2\"\n style={{ insetInlineEnd: \"0.75rem\" }}\n aria-hidden=\"true\"\n >\n 📅\n </span>\n )}\n </div>\n </motion.div>\n </div>\n {helperText && <p className=\"text-xs text-ds-2\">{helperText}</p>}\n {open && !disabled && typeof document !== \"undefined\"\n ? createPortal(\n <div className=\"fixed inset-0 z-60\">\n <div\n className=\"absolute inset-0\"\n aria-hidden=\"true\"\n onPointerDown={() => setOpen(false)}\n />\n <div\n ref={panelRef}\n className=\"dropdown-panel absolute z-10\"\n style={{\n top: panelPosition.top,\n left: panelPosition.left,\n minWidth: panelPosition.minWidth,\n }}\n role=\"dialog\"\n aria-modal=\"false\"\n >\n <Calendar\n value={mode === \"single\" ? (singleValue ?? null) : undefined}\n selectionMode={mode}\n range={mode === \"range\" ? rangeValue : undefined}\n onSelect={\n mode === \"single\"\n ? (date) => {\n updateValue(date);\n setOpen(false);\n }\n : undefined\n }\n onRangeSelect={\n mode === \"range\"\n ? (nextRange) => {\n updateValue(nextRange);\n if (nextRange.start && nextRange.end) {\n setOpen(false);\n }\n }\n : undefined\n }\n />\n {presets?.length ? (\n <div className=\"mt-3 flex flex-wrap gap-2 rounded-lg border border-ds-border-2 bg-ds-surface-1/95 p-3 shadow-xl backdrop-blur-xl\">\n {presets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"rounded-full border border-ds-border-field px-3 py-1 text-xs text-ds-2 transition-colors hover:border-ds-border-accent hover:bg-ds-accent-subtle hover:text-ds-1\"\n onClick={() => handlePresetClick(preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"date-picker-_EVYpGga.cjs","names":[],"sources":["../../src/components/forms/date-picker/DatePicker.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { Calendar } from \"../calendar\";\nimport { CloseIcon } from \"../../icons\";\n\nimport type { DatePickerProps, DatePickerValue, DateRangeValue } from \"./types\";\n\nconst formatDate = (date: Date | null) =>\n date?.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }) ?? \"\";\n\nconst isRangeValue = (value: DatePickerValue): value is DateRangeValue =>\n typeof value === \"object\" &&\n value !== null &&\n \"start\" in value &&\n \"end\" in value;\n\nconst emptyRange: DateRangeValue = { start: null, end: null };\n\nconst PANEL_GAP = 8;\nconst VIEWPORT_MARGIN = 12;\n\nexport const DatePicker = ({\n mode = \"single\",\n value,\n onChange,\n label,\n placeholder = \"Pick a date\",\n helperText,\n disabled = false,\n className = \"\",\n presets,\n}: DatePickerProps) => {\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(false);\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<DatePickerValue>(\n value ?? (mode === \"range\" ? emptyRange : null),\n );\n\n const currentValue = isControlled ? value : internalValue;\n const singleValue = mode === \"range\" ? null : (currentValue as Date | null);\n const rangeValue =\n mode === \"range\" && isRangeValue(currentValue)\n ? currentValue\n : mode === \"range\"\n ? { ...emptyRange }\n : emptyRange;\n\n const displayValue = useMemo(() => {\n if (mode === \"range\") {\n if (rangeValue.start && rangeValue.end) {\n return `${formatDate(rangeValue.start)} — ${formatDate(rangeValue.end)}`;\n }\n if (rangeValue.start) {\n return `${formatDate(rangeValue.start)} — …`;\n }\n return \"\";\n }\n return formatDate(singleValue);\n }, [mode, rangeValue.end, rangeValue.start, singleValue]);\n\n const hasSelection =\n mode === \"range\"\n ? Boolean(rangeValue.start || rangeValue.end)\n : Boolean(singleValue);\n\n const updateValue = (next: DatePickerValue) => {\n if (!isControlled) {\n setInternalValue(next);\n }\n onChange?.(next);\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n const [panelPosition, setPanelPosition] = useState({\n top: 0,\n left: 0,\n minWidth: 320,\n });\n\n useEffect(() => {\n const isEventInside = (event: Event) => {\n const eventPath =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n\n return eventPath.some((target) => {\n if (!(target instanceof Node)) {\n return false;\n }\n\n return (\n containerRef.current?.contains(target) ||\n panelRef.current?.contains(target)\n );\n });\n };\n\n const handlePointerOutside = (event: PointerEvent) => {\n const target = event.target;\n\n if (\n (target instanceof Node &&\n (containerRef.current?.contains(target) ||\n panelRef.current?.contains(target))) ||\n isEventInside(event)\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n const handleFocusOutside = (event: FocusEvent) => {\n const target = event.target;\n\n if (\n (target instanceof Node &&\n (containerRef.current?.contains(target) ||\n panelRef.current?.contains(target))) ||\n isEventInside(event)\n ) {\n return;\n }\n\n setOpen(false);\n };\n\n if (open) {\n document.addEventListener(\"pointerdown\", handlePointerOutside, true);\n document.addEventListener(\"focusin\", handleFocusOutside, true);\n }\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerOutside, true);\n document.removeEventListener(\"focusin\", handleFocusOutside, true);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const updatePanelPosition = () => {\n const triggerRect = triggerRef.current?.getBoundingClientRect();\n\n if (!triggerRect) {\n return;\n }\n\n const panelHeight = panelRef.current?.offsetHeight ?? 360;\n const spaceBelow = window.innerHeight - triggerRect.bottom;\n const shouldOpenAbove =\n spaceBelow < panelHeight + PANEL_GAP &&\n triggerRect.top > panelHeight + PANEL_GAP;\n\n const unclampedLeft = triggerRect.left;\n const maxLeft = Math.max(\n VIEWPORT_MARGIN,\n window.innerWidth - Math.max(triggerRect.width, 320) - VIEWPORT_MARGIN,\n );\n const left = Math.min(Math.max(unclampedLeft, VIEWPORT_MARGIN), maxLeft);\n\n setPanelPosition({\n top: shouldOpenAbove\n ? Math.max(VIEWPORT_MARGIN, triggerRect.top - panelHeight - PANEL_GAP)\n : Math.min(\n triggerRect.bottom + PANEL_GAP,\n window.innerHeight - panelHeight - VIEWPORT_MARGIN,\n ),\n left,\n minWidth: Math.max(triggerRect.width, 320),\n });\n };\n\n updatePanelPosition();\n\n const frameId = window.requestAnimationFrame(updatePanelPosition);\n\n window.addEventListener(\"resize\", updatePanelPosition);\n window.addEventListener(\"scroll\", updatePanelPosition, true);\n\n return () => {\n window.cancelAnimationFrame(frameId);\n window.removeEventListener(\"resize\", updatePanelPosition);\n window.removeEventListener(\"scroll\", updatePanelPosition, true);\n };\n }, [open, presets]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handlePresetClick = (getValue: () => DatePickerValue) => {\n const next = getValue();\n updateValue(next);\n setOpen(false);\n };\n\n const handleClearSelection = () => {\n if (disabled) {\n return;\n }\n\n updateValue(mode === \"range\" ? { ...emptyRange } : null);\n setOpen(false);\n };\n\n return (\n <div ref={containerRef} className={`w-full space-y-2 ${className}`.trim()}>\n {label && <p className=\"text-sm font-medium text-ds-1\">{label}</p>}\n <div className=\"relative\">\n <motion.div\n style={{\n backgroundImage: disabled\n ? \"none\"\n : useMotionTemplate`\n radial-gradient(\n ${\n visible ? `${radius}px` : \"0px\"\n } circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={!disabled ? handleMouseMove : undefined}\n onMouseEnter={!disabled ? () => setVisible(true) : undefined}\n onMouseLeave={!disabled ? () => setVisible(false) : undefined}\n className={\n disabled\n ? \"group/date-picker rounded-lg border-none bg-ds-surface-1 p-[2px]\"\n : \"group/date-picker rounded-lg border-ds-border-2 p-[2px]\"\n }\n >\n <div className=\"relative\">\n <button\n ref={triggerRef}\n type=\"button\"\n className={`flex w-full items-center justify-between rounded-md border border-ds-border-field bg-ds-surface-1 px-3 py-2 text-sm text-ds-1 transition duration-400 ease-in-out ${\n disabled ? \"cursor-not-allowed opacity-50\" : \"\"\n }`}\n style={{ paddingInlineEnd: \"2.5rem\" }}\n onClick={() => !disabled && setOpen((prev) => !prev)}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={disabled}\n >\n <span className={displayValue ? \"text-ds-1\" : \"text-ds-2\"}>\n {displayValue || placeholder}\n </span>\n </button>\n\n {hasSelection && !disabled ? (\n <button\n type=\"button\"\n className=\"absolute top-1/2 inline-flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded-full text-ds-2 transition-colors hover:bg-ds-accent-subtle hover:text-ds-1\"\n style={{ insetInlineEnd: \"0.75rem\" }}\n onClick={handleClearSelection}\n aria-label={\n mode === \"range\"\n ? \"Clear selected date range\"\n : \"Clear selected date\"\n }\n >\n <CloseIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </button>\n ) : (\n <span\n className=\"pointer-events-none absolute top-1/2 -translate-y-1/2 text-ds-2\"\n style={{ insetInlineEnd: \"0.75rem\" }}\n aria-hidden=\"true\"\n >\n 📅\n </span>\n )}\n </div>\n </motion.div>\n </div>\n {helperText && <p className=\"text-xs text-ds-2\">{helperText}</p>}\n {open && !disabled && typeof document !== \"undefined\"\n ? createPortal(\n <div className=\"fixed inset-0 z-60\">\n <div\n className=\"absolute inset-0\"\n aria-hidden=\"true\"\n onPointerDown={() => setOpen(false)}\n />\n <div\n ref={panelRef}\n className=\"dropdown-panel absolute z-10\"\n style={{\n top: panelPosition.top,\n left: panelPosition.left,\n minWidth: panelPosition.minWidth,\n }}\n role=\"dialog\"\n aria-modal=\"false\"\n >\n <Calendar\n value={mode === \"single\" ? (singleValue ?? null) : undefined}\n selectionMode={mode}\n range={mode === \"range\" ? rangeValue : undefined}\n onSelect={\n mode === \"single\"\n ? (date) => {\n updateValue(date);\n setOpen(false);\n }\n : undefined\n }\n onRangeSelect={\n mode === \"range\"\n ? (nextRange) => {\n updateValue(nextRange);\n if (nextRange.start && nextRange.end) {\n setOpen(false);\n }\n }\n : undefined\n }\n />\n {presets?.length ? (\n <div className=\"mt-3 flex flex-wrap gap-2 rounded-lg border border-ds-border-2 bg-ds-surface-1/95 p-3 shadow-xl backdrop-blur-xl\">\n {presets.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n className=\"rounded-full border border-ds-border-field px-3 py-1 text-xs text-ds-2 transition-colors hover:border-ds-border-accent hover:bg-ds-accent-subtle hover:text-ds-1\"\n onClick={() => handlePresetClick(preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </div>,\n document.body,\n )\n : null}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { _ as AlertTriangleIcon, h as CheckCircleIcon, l as LoaderIcon, o as QuestionCircleIcon, q as CloseIcon, u as InfoCircleIcon, v as AlertCircleIcon } from "./icons-bx3nrxNv.mjs";
2
- import { t as useOverlayEffects } from "./overlay-BzkUmjQ-.mjs";
1
+ import { K as CloseIcon, _ as AlertTriangleIcon, h as CheckCircleIcon, l as LoaderIcon, o as QuestionCircleIcon, u as InfoCircleIcon, v as AlertCircleIcon } from "./icons-JzMKLygv.mjs";
2
+ import { t as useOverlayEffects } from "./overlay-CG1dMYtO.mjs";
3
3
  import { useEffect, useRef } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { AnimatePresence, motion } from "framer-motion";
@@ -390,4 +390,4 @@ var Dialog = ({ open, onOpenChange, title, description, children, footer, closeO
390
390
  //#endregion
391
391
  export { Dialog as t };
392
392
 
393
- //# sourceMappingURL=dialog-DSyq6MS3.mjs.map
393
+ //# sourceMappingURL=dialog-B60BjJz0.mjs.map