erp-pro-ui 0.2.6 → 0.2.7
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.
- package/dist/accordion.cjs +1 -1
- package/dist/accordion.mjs +1 -1
- package/dist/alert.cjs +1 -1
- package/dist/alert.mjs +1 -1
- package/dist/animated-content.cjs +1 -1
- package/dist/animated-content.mjs +1 -1
- package/dist/ascii-text.cjs +1 -1
- package/dist/ascii-text.mjs +1 -1
- package/dist/background-gradient-animation.cjs +1 -1
- package/dist/background-gradient-animation.mjs +1 -1
- package/dist/button-hover-border-gradient.cjs +1 -1
- package/dist/button-hover-border-gradient.mjs +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.mjs +1 -1
- package/dist/calendar.cjs +1 -1
- package/dist/calendar.mjs +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.mjs +1 -1
- package/dist/carousel.cjs +1 -1
- package/dist/carousel.mjs +1 -1
- package/dist/catalog.cjs +7 -0
- package/dist/catalog.cjs.map +1 -1
- package/dist/catalog.d.ts +13 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.mjs +7 -0
- package/dist/catalog.mjs.map +1 -1
- package/dist/charts.cjs +1 -1
- package/dist/charts.mjs +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.mjs +1 -1
- package/dist/chip.cjs +1 -1
- package/dist/chip.mjs +1 -1
- package/dist/chroma-grid.cjs +1 -1
- package/dist/chroma-grid.mjs +1 -1
- package/dist/chunks/{Drawer-Y0_sJni5.mjs → Drawer-BhTTQV8Q.mjs} +2 -2
- package/dist/chunks/{Drawer-Y0_sJni5.mjs.map → Drawer-BhTTQV8Q.mjs.map} +1 -1
- package/dist/chunks/{Drawer-D72Xi2Gq.cjs → Drawer-C_DLqrus.cjs} +2 -3
- package/dist/chunks/{Drawer-D72Xi2Gq.cjs.map → Drawer-C_DLqrus.cjs.map} +1 -1
- package/dist/chunks/{DropdownMenu-BQ4WlaGp.mjs → DropdownMenu-B18BI5l7.mjs} +2 -2
- package/dist/chunks/{DropdownMenu-BQ4WlaGp.mjs.map → DropdownMenu-B18BI5l7.mjs.map} +1 -1
- package/dist/chunks/{DropdownMenu-yh04burS.cjs → DropdownMenu-CEmlmX7P.cjs} +2 -3
- package/dist/chunks/{DropdownMenu-yh04burS.cjs.map → DropdownMenu-CEmlmX7P.cjs.map} +1 -1
- package/dist/chunks/{HoverBorderGradient-DEtm3owk.mjs → HoverBorderGradient-CGKcviEd.mjs} +2 -2
- package/dist/chunks/{HoverBorderGradient-DEtm3owk.mjs.map → HoverBorderGradient-CGKcviEd.mjs.map} +1 -1
- package/dist/chunks/{HoverBorderGradient-DMMyr2L3.cjs → HoverBorderGradient-DTKasFZO.cjs} +2 -3
- package/dist/chunks/{HoverBorderGradient-DMMyr2L3.cjs.map → HoverBorderGradient-DTKasFZO.cjs.map} +1 -1
- package/dist/chunks/{SunToMoonButton-BOKHzC1H.mjs → SunToMoonButton-DIMK53fW.mjs} +2 -2
- package/dist/chunks/{SunToMoonButton-BOKHzC1H.mjs.map → SunToMoonButton-DIMK53fW.mjs.map} +1 -1
- package/dist/chunks/{SunToMoonButton-gX4Kk_5B.cjs → SunToMoonButton-DUuIqw22.cjs} +2 -3
- package/dist/chunks/{SunToMoonButton-gX4Kk_5B.cjs.map → SunToMoonButton-DUuIqw22.cjs.map} +1 -1
- package/dist/chunks/{Tooltip-nnaiqJTT.cjs → Tooltip-1yPGRJ2Q.cjs} +1 -2
- package/dist/chunks/{Tooltip-nnaiqJTT.cjs.map → Tooltip-1yPGRJ2Q.cjs.map} +1 -1
- package/dist/chunks/{Tooltip-LbOKP__2.mjs → Tooltip-CEj-I4JO.mjs} +1 -1
- package/dist/chunks/{Tooltip-LbOKP__2.mjs.map → Tooltip-CEj-I4JO.mjs.map} +1 -1
- package/dist/chunks/{accordion-CLcjNX_X.mjs → accordion-Cf-Q3rec.mjs} +2 -2
- package/dist/chunks/{accordion-CLcjNX_X.mjs.map → accordion-Cf-Q3rec.mjs.map} +1 -1
- package/dist/chunks/{accordion-Bj3Sj0mC.cjs → accordion-X4PNqWkW.cjs} +2 -3
- package/dist/chunks/{accordion-Bj3Sj0mC.cjs.map → accordion-X4PNqWkW.cjs.map} +1 -1
- package/dist/chunks/{alert-BBA4Sh4e.cjs → alert-BEMULPIi.cjs} +2 -3
- package/dist/chunks/{alert-BBA4Sh4e.cjs.map → alert-BEMULPIi.cjs.map} +1 -1
- package/dist/chunks/{alert-oUz79MGc.mjs → alert-GImBqaCY.mjs} +2 -2
- package/dist/chunks/{alert-oUz79MGc.mjs.map → alert-GImBqaCY.mjs.map} +1 -1
- package/dist/chunks/{animated-content-CiNJLgbq.mjs → animated-content-Bp-Yt0_7.mjs} +1 -1
- package/dist/chunks/{animated-content-CiNJLgbq.mjs.map → animated-content-Bp-Yt0_7.mjs.map} +1 -1
- package/dist/chunks/{animated-content-B3wbiWQI.cjs → animated-content-tSHXDZq2.cjs} +1 -2
- package/dist/chunks/{animated-content-B3wbiWQI.cjs.map → animated-content-tSHXDZq2.cjs.map} +1 -1
- package/dist/chunks/{ascii-text-KwVE41Hw.cjs → ascii-text-Ctua6ucZ.cjs} +2 -2
- package/dist/chunks/{ascii-text-KwVE41Hw.cjs.map → ascii-text-Ctua6ucZ.cjs.map} +1 -1
- package/dist/chunks/{ascii-text-C6JegLhP.mjs → ascii-text-QyP7JU7g.mjs} +1 -1
- package/dist/chunks/{ascii-text-C6JegLhP.mjs.map → ascii-text-QyP7JU7g.mjs.map} +1 -1
- package/dist/chunks/{background-gradient-animation-CTc2ZR74.mjs → background-gradient-animation-CZUD_aq2.mjs} +2 -2
- package/dist/chunks/{background-gradient-animation-CTc2ZR74.mjs.map → background-gradient-animation-CZUD_aq2.mjs.map} +1 -1
- package/dist/chunks/{background-gradient-animation-1LZY3DYT.cjs → background-gradient-animation-PvM0i88k.cjs} +2 -3
- package/dist/chunks/{background-gradient-animation-1LZY3DYT.cjs.map → background-gradient-animation-PvM0i88k.cjs.map} +1 -1
- package/dist/chunks/{button-IDShmQqA.mjs → button-CAU9ej3h.mjs} +2 -2
- package/dist/chunks/{button-IDShmQqA.mjs.map → button-CAU9ej3h.mjs.map} +1 -1
- package/dist/chunks/{button-uD87K76W.cjs → button-D2ZYmVda.cjs} +2 -3
- package/dist/chunks/{button-uD87K76W.cjs.map → button-D2ZYmVda.cjs.map} +1 -1
- package/dist/chunks/{button-hover-border-gradient-DGZqd8je.cjs → button-hover-border-gradient-D12Zjmd3.cjs} +2 -3
- package/dist/chunks/{button-hover-border-gradient-DGZqd8je.cjs.map → button-hover-border-gradient-D12Zjmd3.cjs.map} +1 -1
- package/dist/chunks/{button-hover-border-gradient-B2ebbDek.mjs → button-hover-border-gradient-VNEg4V0o.mjs} +2 -2
- package/dist/chunks/{button-hover-border-gradient-B2ebbDek.mjs.map → button-hover-border-gradient-VNEg4V0o.mjs.map} +1 -1
- package/dist/chunks/calendar-BlUhssD4.mjs +203 -0
- package/dist/chunks/calendar-BlUhssD4.mjs.map +1 -0
- package/dist/chunks/calendar-CdKKhdx5.cjs +208 -0
- package/dist/chunks/calendar-CdKKhdx5.cjs.map +1 -0
- package/dist/chunks/{card-Cuud0jIt.cjs → card-C_Qr7E6E.cjs} +1 -2
- package/dist/chunks/{card-Cuud0jIt.cjs.map → card-C_Qr7E6E.cjs.map} +1 -1
- package/dist/chunks/{card-DNeC6jqk.mjs → card-DYHDNCPK.mjs} +1 -1
- package/dist/chunks/{card-DNeC6jqk.mjs.map → card-DYHDNCPK.mjs.map} +1 -1
- package/dist/chunks/{carousel-xHkrV_pt.cjs → carousel-DtOJEbEU.cjs} +4 -5
- package/dist/chunks/{carousel-xHkrV_pt.cjs.map → carousel-DtOJEbEU.cjs.map} +1 -1
- package/dist/chunks/{carousel-Dpe5QLJK.mjs → carousel-eeqWZZHE.mjs} +4 -4
- package/dist/chunks/{carousel-Dpe5QLJK.mjs.map → carousel-eeqWZZHE.mjs.map} +1 -1
- package/dist/chunks/{chartStyles-BADmRKZo.cjs → chartStyles-2mTluDoo.cjs} +1 -1
- package/dist/chunks/{chartStyles-BADmRKZo.cjs.map → chartStyles-2mTluDoo.cjs.map} +1 -1
- package/dist/chunks/{chartStyles-DPXgYmGn.mjs → chartStyles-DrHVYS5N.mjs} +1 -1
- package/dist/chunks/{chartStyles-DPXgYmGn.mjs.map → chartStyles-DrHVYS5N.mjs.map} +1 -1
- package/dist/chunks/{charts-COx3IbI2.cjs → charts-DMu4zp8j.cjs} +4 -4
- package/dist/chunks/{charts-COx3IbI2.cjs.map → charts-DMu4zp8j.cjs.map} +1 -1
- package/dist/chunks/{charts-C-KQ3Nk5.mjs → charts-DlskmT1J.mjs} +3 -3
- package/dist/chunks/{charts-C-KQ3Nk5.mjs.map → charts-DlskmT1J.mjs.map} +1 -1
- package/dist/chunks/{checkbox-Y04NlzB8.mjs → checkbox-D7EJQbqC.mjs} +1 -1
- package/dist/chunks/{checkbox-Y04NlzB8.mjs.map → checkbox-D7EJQbqC.mjs.map} +1 -1
- package/dist/chunks/{checkbox-CDknzh89.cjs → checkbox-Lw2UqyNE.cjs} +1 -2
- package/dist/chunks/{checkbox-CDknzh89.cjs.map → checkbox-Lw2UqyNE.cjs.map} +1 -1
- package/dist/chunks/{chip-sfQlzrbo.cjs → chip-D5i9VT9O.cjs} +4 -5
- package/dist/chunks/{chip-sfQlzrbo.cjs.map → chip-D5i9VT9O.cjs.map} +1 -1
- package/dist/chunks/{chip-B3j6R6sO.mjs → chip-DBlSQcqR.mjs} +4 -4
- package/dist/chunks/{chip-B3j6R6sO.mjs.map → chip-DBlSQcqR.mjs.map} +1 -1
- package/dist/chunks/{chroma-grid-Bp55pKEm.cjs → chroma-grid-CTDtdFUm.cjs} +2 -3
- package/dist/chunks/{chroma-grid-Bp55pKEm.cjs.map → chroma-grid-CTDtdFUm.cjs.map} +1 -1
- package/dist/chunks/{chroma-grid-BHS9qAn_.mjs → chroma-grid-DuLTfGVP.mjs} +2 -2
- package/dist/chunks/{chroma-grid-BHS9qAn_.mjs.map → chroma-grid-DuLTfGVP.mjs.map} +1 -1
- package/dist/chunks/{color-palette-Duud5Iqq.cjs → color-palette-DQQ9UV0N.cjs} +2 -2
- package/dist/chunks/{color-palette-Duud5Iqq.cjs.map → color-palette-DQQ9UV0N.cjs.map} +1 -1
- package/dist/chunks/{color-palette-D9Qlw2Cx.mjs → color-palette-G1HUXWJP.mjs} +1 -1
- package/dist/chunks/{color-palette-D9Qlw2Cx.mjs.map → color-palette-G1HUXWJP.mjs.map} +1 -1
- package/dist/chunks/{combobox-C3a2iogC.cjs → combobox-CkNzH1YV.cjs} +6 -6
- package/dist/chunks/{combobox-C3a2iogC.cjs.map → combobox-CkNzH1YV.cjs.map} +1 -1
- package/dist/chunks/{combobox-neBItbtz.mjs → combobox-xNmFFHd6.mjs} +5 -5
- package/dist/chunks/{combobox-neBItbtz.mjs.map → combobox-xNmFFHd6.mjs.map} +1 -1
- package/dist/chunks/dashboard-cards-Bww66_5K.cjs +6570 -0
- package/dist/chunks/dashboard-cards-Bww66_5K.cjs.map +1 -0
- package/dist/chunks/dashboard-cards-lnifLEyj.mjs +6385 -0
- package/dist/chunks/dashboard-cards-lnifLEyj.mjs.map +1 -0
- package/dist/chunks/{data-table-BZEiSZI2.cjs → data-table-BCVbzkLo.cjs} +16 -17
- package/dist/chunks/{data-table-BZEiSZI2.cjs.map → data-table-BCVbzkLo.cjs.map} +1 -1
- package/dist/chunks/{data-table-EfGKkerd.mjs → data-table-C25KHEn4.mjs} +14 -15
- package/dist/chunks/{data-table-EfGKkerd.mjs.map → data-table-C25KHEn4.mjs.map} +1 -1
- package/dist/chunks/date-picker--cqsgsIV.mjs +587 -0
- package/dist/chunks/date-picker--cqsgsIV.mjs.map +1 -0
- package/dist/chunks/date-picker-BJQdFyqr.cjs +592 -0
- package/dist/chunks/date-picker-BJQdFyqr.cjs.map +1 -0
- package/dist/chunks/{dialog-B60BjJz0.mjs → dialog-BHIeG3Sg.mjs} +3 -3
- package/dist/chunks/{dialog-B60BjJz0.mjs.map → dialog-BHIeG3Sg.mjs.map} +1 -1
- package/dist/chunks/{dialog-i9LdkXmF.cjs → dialog-CLKU0cXX.cjs} +3 -4
- package/dist/chunks/{dialog-i9LdkXmF.cjs.map → dialog-CLKU0cXX.cjs.map} +1 -1
- package/dist/chunks/draggable-grid-2L_eHKfp.cjs +245 -0
- package/dist/chunks/draggable-grid-2L_eHKfp.cjs.map +1 -0
- package/dist/chunks/draggable-grid-IuCMSOsE.mjs +240 -0
- package/dist/chunks/draggable-grid-IuCMSOsE.mjs.map +1 -0
- package/dist/chunks/{event-calendar-BbFOUDov.mjs → event-calendar-CO2doGJW.mjs} +11 -11
- package/dist/chunks/{event-calendar-BbFOUDov.mjs.map → event-calendar-CO2doGJW.mjs.map} +1 -1
- package/dist/chunks/{event-calendar-Bljd_7PI.cjs → event-calendar-CvficOuV.cjs} +11 -12
- package/dist/chunks/{event-calendar-Bljd_7PI.cjs.map → event-calendar-CvficOuV.cjs.map} +1 -1
- package/dist/chunks/{form-DGwdlSW2.cjs → form-DARN6jtX.cjs} +1 -2
- package/dist/chunks/{form-DGwdlSW2.cjs.map → form-DARN6jtX.cjs.map} +1 -1
- package/dist/chunks/{form-CDc9UM3r.mjs → form-DNuFklNR.mjs} +1 -1
- package/dist/chunks/{form-CDc9UM3r.mjs.map → form-DNuFklNR.mjs.map} +1 -1
- package/dist/chunks/{gradual-blur-BNYVlqb1.cjs → gradual-blur-BBLbpXD4.cjs} +2 -3
- package/dist/chunks/{gradual-blur-BNYVlqb1.cjs.map → gradual-blur-BBLbpXD4.cjs.map} +1 -1
- package/dist/chunks/{gradual-blur-Bw2KNmXb.mjs → gradual-blur-BPx2MSWI.mjs} +2 -2
- package/dist/chunks/{gradual-blur-Bw2KNmXb.mjs.map → gradual-blur-BPx2MSWI.mjs.map} +1 -1
- package/dist/chunks/{hover-card-G66SUyjq.mjs → hover-card-BkVHGXz6.mjs} +1 -1
- package/dist/chunks/{hover-card-G66SUyjq.mjs.map → hover-card-BkVHGXz6.mjs.map} +1 -1
- package/dist/chunks/{hover-card-Dp6Y2h2J.cjs → hover-card-DwZFtu8w.cjs} +1 -2
- package/dist/chunks/{hover-card-Dp6Y2h2J.cjs.map → hover-card-DwZFtu8w.cjs.map} +1 -1
- package/dist/chunks/{icons-ub9iu-JG.cjs → icons-Ci8yEvvF.cjs} +48 -2
- package/dist/chunks/icons-Ci8yEvvF.cjs.map +1 -0
- package/dist/chunks/{icons-JzMKLygv.mjs → icons-CkVHNbbN.mjs} +43 -2
- package/dist/chunks/icons-CkVHNbbN.mjs.map +1 -0
- package/dist/chunks/{input-CRc3MKb_.mjs → input-B-XSdnfh.mjs} +4 -4
- package/dist/chunks/{input-CRc3MKb_.mjs.map → input-B-XSdnfh.mjs.map} +1 -1
- package/dist/chunks/{input-DMTwz27q.cjs → input-EH7x0pQY.cjs} +4 -5
- package/dist/chunks/{input-DMTwz27q.cjs.map → input-EH7x0pQY.cjs.map} +1 -1
- package/dist/chunks/{label-Bc_r54NU.mjs → label-CcsncrKQ.mjs} +1 -1
- package/dist/chunks/{label-Bc_r54NU.mjs.map → label-CcsncrKQ.mjs.map} +1 -1
- package/dist/chunks/{label-B5Ugq0Nk.cjs → label-Du-5H7wd.cjs} +1 -2
- package/dist/chunks/{label-B5Ugq0Nk.cjs.map → label-Du-5H7wd.cjs.map} +1 -1
- package/dist/chunks/{loading-ll2L6lc7.mjs → loading-2Lh_355V.mjs} +2 -2
- package/dist/chunks/{loading-ll2L6lc7.mjs.map → loading-2Lh_355V.mjs.map} +1 -1
- package/dist/chunks/{loading-DZKJc3e7.cjs → loading-DeGHTDO2.cjs} +2 -3
- package/dist/chunks/{loading-DZKJc3e7.cjs.map → loading-DeGHTDO2.cjs.map} +1 -1
- package/dist/chunks/{multi-select-combobox-C_8sxaiL.mjs → multi-select-combobox-BOdKmPj2.mjs} +4 -4
- package/dist/chunks/{multi-select-combobox-C_8sxaiL.mjs.map → multi-select-combobox-BOdKmPj2.mjs.map} +1 -1
- package/dist/chunks/{multi-select-combobox-CFJGq1hn.cjs → multi-select-combobox-PPYRcaPg.cjs} +5 -5
- package/dist/chunks/{multi-select-combobox-CFJGq1hn.cjs.map → multi-select-combobox-PPYRcaPg.cjs.map} +1 -1
- package/dist/chunks/{otp-input-BpcTJOmU.mjs → otp-input--_itTXaL.mjs} +1 -1
- package/dist/chunks/{otp-input-BpcTJOmU.mjs.map → otp-input--_itTXaL.mjs.map} +1 -1
- package/dist/chunks/{otp-input-B5-tuc0q.cjs → otp-input-Dgw_47Z7.cjs} +1 -2
- package/dist/chunks/{otp-input-B5-tuc0q.cjs.map → otp-input-Dgw_47Z7.cjs.map} +1 -1
- package/dist/chunks/{overlay-DzE_GyYf.cjs → overlay-15EzdrIu.cjs} +1 -2
- package/dist/chunks/{overlay-DzE_GyYf.cjs.map → overlay-15EzdrIu.cjs.map} +1 -1
- package/dist/chunks/{overlay-CG1dMYtO.mjs → overlay-BMbhF-EC.mjs} +1 -1
- package/dist/chunks/{overlay-CG1dMYtO.mjs.map → overlay-BMbhF-EC.mjs.map} +1 -1
- package/dist/chunks/{password-strength-meter-_o1T1HLO.cjs → password-strength-meter-Be1c-dnK.cjs} +2 -3
- package/dist/chunks/{password-strength-meter-_o1T1HLO.cjs.map → password-strength-meter-Be1c-dnK.cjs.map} +1 -1
- package/dist/chunks/{password-strength-meter-CH6uQAuK.mjs → password-strength-meter-Q1Qr-4tz.mjs} +2 -2
- package/dist/chunks/{password-strength-meter-CH6uQAuK.mjs.map → password-strength-meter-Q1Qr-4tz.mjs.map} +1 -1
- package/dist/chunks/{progress-bar-FfdFVvTT.cjs → progress-bar-BsnX079N.cjs} +3 -3
- package/dist/chunks/{progress-bar-FfdFVvTT.cjs.map → progress-bar-BsnX079N.cjs.map} +1 -1
- package/dist/chunks/{progress-bar-BAvRSW1b.mjs → progress-bar-l5WpbpZf.mjs} +2 -2
- package/dist/chunks/{progress-bar-BAvRSW1b.mjs.map → progress-bar-l5WpbpZf.mjs.map} +1 -1
- package/dist/chunks/{radio-BMOnxnUS.mjs → radio-B94_TGtz.mjs} +2 -2
- package/dist/chunks/{radio-BMOnxnUS.mjs.map → radio-B94_TGtz.mjs.map} +1 -1
- package/dist/chunks/{radio-wagafWwx.cjs → radio-W_NiS_dO.cjs} +2 -3
- package/dist/chunks/{radio-wagafWwx.cjs.map → radio-W_NiS_dO.cjs.map} +1 -1
- package/dist/chunks/{select-zFFyNmlY.cjs → select-C5lkcrSB.cjs} +5 -6
- package/dist/chunks/{select-zFFyNmlY.cjs.map → select-C5lkcrSB.cjs.map} +1 -1
- package/dist/chunks/{select--DeSgPdn.mjs → select-DnSSxddm.mjs} +5 -5
- package/dist/chunks/{select--DeSgPdn.mjs.map → select-DnSSxddm.mjs.map} +1 -1
- package/dist/chunks/{sidebar-oemmRzCL.mjs → sidebar-C3Sx87wD.mjs} +10 -11
- package/dist/chunks/{sidebar-oemmRzCL.mjs.map → sidebar-C3Sx87wD.mjs.map} +1 -1
- package/dist/chunks/{sidebar-Cq7UbKJT.cjs → sidebar-DDRWkz5k.cjs} +10 -12
- package/dist/chunks/{sidebar-Cq7UbKJT.cjs.map → sidebar-DDRWkz5k.cjs.map} +1 -1
- package/dist/chunks/{skeleton-DWvVc17T.cjs → skeleton-B2u9c1xJ.cjs} +2 -3
- package/dist/chunks/{skeleton-DWvVc17T.cjs.map → skeleton-B2u9c1xJ.cjs.map} +1 -1
- package/dist/chunks/{skeleton-BsDMlWZG.mjs → skeleton-DVAlrOq2.mjs} +2 -2
- package/dist/chunks/{skeleton-BsDMlWZG.mjs.map → skeleton-DVAlrOq2.mjs.map} +1 -1
- package/dist/chunks/{spinners-DlMcokJa.mjs → spinners-BQtIp2ov.mjs} +2 -2
- package/dist/chunks/{spinners-DlMcokJa.mjs.map → spinners-BQtIp2ov.mjs.map} +1 -1
- package/dist/chunks/{spinners-DBAJliAj.cjs → spinners-BiebALzS.cjs} +2 -3
- package/dist/chunks/{spinners-DBAJliAj.cjs.map → spinners-BiebALzS.cjs.map} +1 -1
- package/dist/chunks/{splash-cursor-CQ6_HwHV.cjs → splash-cursor-8b7ORB2k.cjs} +2 -3
- package/dist/chunks/{splash-cursor-CQ6_HwHV.cjs.map → splash-cursor-8b7ORB2k.cjs.map} +1 -1
- package/dist/chunks/{splash-cursor-Bb7LSzaO.mjs → splash-cursor-CeZffMed.mjs} +2 -2
- package/dist/chunks/{splash-cursor-Bb7LSzaO.mjs.map → splash-cursor-CeZffMed.mjs.map} +1 -1
- package/dist/chunks/{spotlight-card-COfSD7ns.cjs → spotlight-card-BQjp7hO1.cjs} +2 -3
- package/dist/chunks/{spotlight-card-COfSD7ns.cjs.map → spotlight-card-BQjp7hO1.cjs.map} +1 -1
- package/dist/chunks/{spotlight-card-Bs0iiSLc.mjs → spotlight-card-DiPtBCAK.mjs} +2 -2
- package/dist/chunks/{spotlight-card-Bs0iiSLc.mjs.map → spotlight-card-DiPtBCAK.mjs.map} +1 -1
- package/dist/chunks/{stepper-CTteR-Kj.cjs → stepper-BuhQfQTH.cjs} +5 -6
- package/dist/chunks/{stepper-CTteR-Kj.cjs.map → stepper-BuhQfQTH.cjs.map} +1 -1
- package/dist/chunks/{stepper-B9NdZ6ZV.mjs → stepper-CVNcexxq.mjs} +5 -5
- package/dist/chunks/{stepper-B9NdZ6ZV.mjs.map → stepper-CVNcexxq.mjs.map} +1 -1
- package/dist/chunks/{sun-to-moon-button-lt-1vmWm.cjs → sun-to-moon-button-BzYGFhrg.cjs} +4 -5
- package/dist/chunks/{sun-to-moon-button-lt-1vmWm.cjs.map → sun-to-moon-button-BzYGFhrg.cjs.map} +1 -1
- package/dist/chunks/{sun-to-moon-button-DWHDpP5B.mjs → sun-to-moon-button-CRXBMFZb.mjs} +4 -4
- package/dist/chunks/{sun-to-moon-button-DWHDpP5B.mjs.map → sun-to-moon-button-CRXBMFZb.mjs.map} +1 -1
- package/dist/chunks/{switch-BbFl5b4t.cjs → switch-CEoT3MgX.cjs} +1 -2
- package/dist/chunks/{switch-BbFl5b4t.cjs.map → switch-CEoT3MgX.cjs.map} +1 -1
- package/dist/chunks/{switch--68scepb.mjs → switch-DUnNe4xP.mjs} +1 -1
- package/dist/chunks/{switch--68scepb.mjs.map → switch-DUnNe4xP.mjs.map} +1 -1
- package/dist/chunks/{textarea-U_JeSWI3.cjs → textarea-Bschfj24.cjs} +2 -3
- package/dist/chunks/{textarea-U_JeSWI3.cjs.map → textarea-Bschfj24.cjs.map} +1 -1
- package/dist/chunks/{textarea-CEj9voUJ.mjs → textarea-CfeKo5HA.mjs} +2 -2
- package/dist/chunks/{textarea-CEj9voUJ.mjs.map → textarea-CfeKo5HA.mjs.map} +1 -1
- package/dist/chunks/{theme-koPrLKQv.mjs → theme-BXML6jHE.mjs} +1 -1
- package/dist/chunks/{theme-koPrLKQv.mjs.map → theme-BXML6jHE.mjs.map} +1 -1
- package/dist/chunks/{theme-D6B-FaoE.cjs → theme-BzTaXYZ8.cjs} +1 -2
- package/dist/chunks/{theme-D6B-FaoE.cjs.map → theme-BzTaXYZ8.cjs.map} +1 -1
- package/dist/chunks/{toast-CyY8VZN7.mjs → toast-D1W0BvoH.mjs} +2 -2
- package/dist/chunks/{toast-CyY8VZN7.mjs.map → toast-D1W0BvoH.mjs.map} +1 -1
- package/dist/chunks/{toast-2yq4Q7-q.cjs → toast-DL8svc6q.cjs} +2 -3
- package/dist/chunks/{toast-2yq4Q7-q.cjs.map → toast-DL8svc6q.cjs.map} +1 -1
- package/dist/chunks/{truncated-text-CswjmrHZ.cjs → truncated-text-D0t4atw5.cjs} +3 -3
- package/dist/chunks/{truncated-text-CswjmrHZ.cjs.map → truncated-text-D0t4atw5.cjs.map} +1 -1
- package/dist/chunks/{truncated-text-DUYTW1KP.mjs → truncated-text-DIkg-8Vo.mjs} +2 -2
- package/dist/chunks/{truncated-text-DUYTW1KP.mjs.map → truncated-text-DIkg-8Vo.mjs.map} +1 -1
- package/dist/chunks/{typography-CFIiYk1d.cjs → typography-C5fYwhp2.cjs} +3 -3
- package/dist/chunks/{typography-CFIiYk1d.cjs.map → typography-C5fYwhp2.cjs.map} +1 -1
- package/dist/chunks/{typography-DHE9sUZ8.mjs → typography-Czi7t5y4.mjs} +2 -2
- package/dist/chunks/{typography-DHE9sUZ8.mjs.map → typography-Czi7t5y4.mjs.map} +1 -1
- package/dist/chunks/{utils-LRbEQHYs.cjs → utils-CoA0q63n.cjs} +84 -4
- package/dist/chunks/utils-CoA0q63n.cjs.map +1 -0
- package/dist/chunks/{utils-7S0u48mU.mjs → utils-Dc7j29ec.mjs} +84 -4
- package/dist/chunks/utils-Dc7j29ec.mjs.map +1 -0
- package/dist/color-palette.cjs +1 -1
- package/dist/color-palette.mjs +1 -1
- package/dist/combobox.cjs +1 -1
- package/dist/combobox.mjs +1 -1
- package/dist/components/data-display/dashboard-cards/AIFeatureAdoptionCard.d.ts +26 -0
- package/dist/components/data-display/dashboard-cards/AIFeatureAdoptionCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/AIInsightsCard.d.ts +30 -0
- package/dist/components/data-display/dashboard-cards/AIInsightsCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/AcquisitionChannelCard.d.ts +24 -0
- package/dist/components/data-display/dashboard-cards/AcquisitionChannelCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/BarBreakdownCard.d.ts +49 -0
- package/dist/components/data-display/dashboard-cards/BarBreakdownCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/CustomerLifecycleCard.d.ts +24 -0
- package/dist/components/data-display/dashboard-cards/CustomerLifecycleCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/EarningReportsTabsCard.d.ts +111 -2
- package/dist/components/data-display/dashboard-cards/EarningReportsTabsCard.d.ts.map +1 -1
- package/dist/components/data-display/dashboard-cards/FinancialPLCard.d.ts +78 -0
- package/dist/components/data-display/dashboard-cards/FinancialPLCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/InventoryCards.d.ts +44 -0
- package/dist/components/data-display/dashboard-cards/InventoryCards.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/PaymentSummaryCard.d.ts +45 -0
- package/dist/components/data-display/dashboard-cards/PaymentSummaryCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/SalesHeatmapCard.d.ts +36 -0
- package/dist/components/data-display/dashboard-cards/SalesHeatmapCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/SeatUtilizationCard.d.ts +22 -0
- package/dist/components/data-display/dashboard-cards/SeatUtilizationCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/SubscriptionHealthCard.d.ts +23 -0
- package/dist/components/data-display/dashboard-cards/SubscriptionHealthCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/ToolUsageOverviewCard.d.ts +22 -0
- package/dist/components/data-display/dashboard-cards/ToolUsageOverviewCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/TopPlansCard.d.ts +23 -0
- package/dist/components/data-display/dashboard-cards/TopPlansCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/TopSellingItemsCard.d.ts +42 -0
- package/dist/components/data-display/dashboard-cards/TopSellingItemsCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/TopToolsCard.d.ts +22 -0
- package/dist/components/data-display/dashboard-cards/TopToolsCard.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/_PLCardHeader.d.ts +63 -0
- package/dist/components/data-display/dashboard-cards/_PLCardHeader.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/_PLCharts.d.ts +33 -0
- package/dist/components/data-display/dashboard-cards/_PLCharts.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/_PLKpiStrip.d.ts +11 -0
- package/dist/components/data-display/dashboard-cards/_PLKpiStrip.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/_PLOverview.d.ts +9 -0
- package/dist/components/data-display/dashboard-cards/_PLOverview.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/_TabTooltip.d.ts +8 -0
- package/dist/components/data-display/dashboard-cards/_TabTooltip.d.ts.map +1 -0
- package/dist/components/data-display/dashboard-cards/index.d.ts +32 -1
- package/dist/components/data-display/dashboard-cards/index.d.ts.map +1 -1
- package/dist/components/forms/calendar/Calendar.d.ts +1 -1
- package/dist/components/forms/calendar/Calendar.d.ts.map +1 -1
- package/dist/components/forms/calendar/types.d.ts +6 -0
- package/dist/components/forms/calendar/types.d.ts.map +1 -1
- package/dist/components/forms/date-picker/DatePicker.d.ts.map +1 -1
- package/dist/components/layout/draggable-grid/DraggableGrid.d.ts +20 -0
- package/dist/components/layout/draggable-grid/DraggableGrid.d.ts.map +1 -0
- package/dist/components/layout/draggable-grid/index.d.ts +3 -0
- package/dist/components/layout/draggable-grid/index.d.ts.map +1 -0
- package/dist/components/navigation/sidebar/DashboardSidebarShell.d.ts.map +1 -1
- package/dist/dashboard-cards.cjs +16 -1
- package/dist/dashboard-cards.mjs +2 -2
- package/dist/data-table.cjs +1 -1
- package/dist/data-table.mjs +1 -1
- package/dist/date-picker.cjs +1 -1
- package/dist/date-picker.mjs +1 -1
- package/dist/dialog.cjs +1 -1
- package/dist/dialog.mjs +1 -1
- package/dist/docs.cjs +13 -0
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.d.ts.map +1 -1
- package/dist/docs.mjs +13 -0
- package/dist/docs.mjs.map +1 -1
- package/dist/draggable-grid.cjs +3 -0
- package/dist/draggable-grid.d.ts +2 -0
- package/dist/draggable-grid.mjs +2 -0
- package/dist/drawer.cjs +1 -1
- package/dist/drawer.mjs +1 -1
- package/dist/event-calendar.cjs +1 -1
- package/dist/event-calendar.mjs +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.mjs +1 -1
- package/dist/gradual-blur.cjs +1 -1
- package/dist/gradual-blur.mjs +1 -1
- package/dist/hover-border-gradient.cjs +1 -1
- package/dist/hover-border-gradient.mjs +1 -1
- package/dist/hover-card.cjs +1 -1
- package/dist/hover-card.mjs +1 -1
- package/dist/icons.cjs +2 -3
- package/dist/icons.mjs +1 -2
- package/dist/index.cjs +71 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +55 -55
- package/dist/index.mjs.map +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.mjs +1 -1
- package/dist/label.cjs +1 -1
- package/dist/label.mjs +1 -1
- package/dist/loading.cjs +1 -1
- package/dist/loading.mjs +1 -1
- package/dist/multi-select-combobox.cjs +1 -1
- package/dist/multi-select-combobox.mjs +1 -1
- package/dist/otp-input.cjs +1 -1
- package/dist/otp-input.mjs +1 -1
- package/dist/password-strength-meter.cjs +1 -1
- package/dist/password-strength-meter.mjs +1 -1
- package/dist/progress-bar.cjs +1 -1
- package/dist/progress-bar.mjs +1 -1
- package/dist/radio.cjs +1 -1
- package/dist/radio.mjs +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.mjs +1 -1
- package/dist/sidebar.cjs +1 -1
- package/dist/sidebar.mjs +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.mjs +1 -1
- package/dist/spinners.cjs +1 -1
- package/dist/spinners.mjs +1 -1
- package/dist/splash-cursor.cjs +1 -1
- package/dist/splash-cursor.mjs +1 -1
- package/dist/spotlight-card.cjs +1 -1
- package/dist/spotlight-card.mjs +1 -1
- package/dist/stepper.cjs +1 -1
- package/dist/stepper.mjs +1 -1
- package/dist/sun-to-moon-button.cjs +2 -2
- package/dist/sun-to-moon-button.mjs +2 -2
- package/dist/switch.cjs +1 -1
- package/dist/switch.mjs +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.mjs +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.mjs +1 -1
- package/dist/toast.cjs +1 -1
- package/dist/toast.mjs +1 -1
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.mjs +1 -1
- package/dist/truncated-text.cjs +1 -1
- package/dist/truncated-text.mjs +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.mjs +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.mjs +1 -1
- package/package.json +34 -13
- package/dist/chunks/EllipsisVerticalIcon-BJw3MNkg.cjs +0 -51
- package/dist/chunks/EllipsisVerticalIcon-BJw3MNkg.cjs.map +0 -1
- package/dist/chunks/EllipsisVerticalIcon-C2b2KMfE.mjs +0 -45
- package/dist/chunks/EllipsisVerticalIcon-C2b2KMfE.mjs.map +0 -1
- package/dist/chunks/calendar-DCkikZYb.cjs +0 -184
- package/dist/chunks/calendar-DCkikZYb.cjs.map +0 -1
- package/dist/chunks/calendar-FxAmm_ao.mjs +0 -178
- package/dist/chunks/calendar-FxAmm_ao.mjs.map +0 -1
- package/dist/chunks/dashboard-cards-BnPt0gDW.mjs +0 -2428
- package/dist/chunks/dashboard-cards-BnPt0gDW.mjs.map +0 -1
- package/dist/chunks/dashboard-cards-DNWJPKRu.cjs +0 -2524
- package/dist/chunks/dashboard-cards-DNWJPKRu.cjs.map +0 -1
- package/dist/chunks/date-picker-3IDSmb9Z.mjs +0 -228
- package/dist/chunks/date-picker-3IDSmb9Z.mjs.map +0 -1
- package/dist/chunks/date-picker-_EVYpGga.cjs +0 -234
- package/dist/chunks/date-picker-_EVYpGga.cjs.map +0 -1
- package/dist/chunks/icons-JzMKLygv.mjs.map +0 -1
- package/dist/chunks/icons-ub9iu-JG.cjs.map +0 -1
- package/dist/chunks/utils-7S0u48mU.mjs.map +0 -1
- package/dist/chunks/utils-LRbEQHYs.cjs.map +0 -1
- /package/dist/chunks/{chunk-B_GkZjkl.cjs → chunk-D6vf50IK.cjs} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table-BZEiSZI2.cjs","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 \n <!-- slide -->\n \n <!-- slide -->\n \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
|
+
{"version":3,"file":"data-table-BCVbzkLo.cjs","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 \n <!-- slide -->\n \n <!-- slide -->\n \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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"}
|