eidos-ui 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/dist/Avatar.types-BY-C09Ke.d.cts +23 -0
  2. package/dist/Avatar.types-BY-C09Ke.d.ts +23 -0
  3. package/dist/{Header.types-BZi80bWz.d.cts → Header.types-B3QtuiL-.d.cts} +7 -3
  4. package/dist/{Header.types-DJt-q01P.d.ts → Header.types-C6w0FBY8.d.ts} +7 -3
  5. package/dist/{Table.types-Cl5gR8r9.d.cts → Table.types-CPj-udMc.d.cts} +95 -0
  6. package/dist/{Table.types-jhPb7JNU.d.ts → Table.types-CZZ7QWAI.d.ts} +95 -0
  7. package/dist/Toolbar.types-DSk8z2iy.d.cts +38 -0
  8. package/dist/Toolbar.types-RN0klQzu.d.ts +38 -0
  9. package/dist/alert/index.cjs +4 -4
  10. package/dist/alert/index.d.cts +2 -1
  11. package/dist/alert/index.d.ts +2 -1
  12. package/dist/alert/index.js +3 -3
  13. package/dist/avatar/index.d.cts +3 -21
  14. package/dist/avatar/index.d.ts +3 -21
  15. package/dist/button/index.cjs +3 -3
  16. package/dist/button/index.js +2 -2
  17. package/dist/chip/index.cjs +3 -3
  18. package/dist/chip/index.js +2 -2
  19. package/dist/{chunk-KIXFSXIN.cjs → chunk-3E7TKBQI.cjs} +5 -3
  20. package/dist/chunk-3E7TKBQI.cjs.map +1 -0
  21. package/dist/{chunk-ZBKJ3EMK.cjs → chunk-442U3W6R.cjs} +3 -3
  22. package/dist/{chunk-ZBKJ3EMK.cjs.map → chunk-442U3W6R.cjs.map} +1 -1
  23. package/dist/{chunk-YQLCPKGV.js → chunk-5HUZYY54.js} +6 -4
  24. package/dist/chunk-5HUZYY54.js.map +1 -0
  25. package/dist/{chunk-G5IGADJI.cjs → chunk-5VM2256W.cjs} +7 -11
  26. package/dist/chunk-5VM2256W.cjs.map +1 -0
  27. package/dist/{chunk-Z4ZY7L7W.js → chunk-5ZL6PYU3.js} +3 -3
  28. package/dist/{chunk-A3NE2C7C.js → chunk-67RFMV6K.js} +2 -2
  29. package/dist/{chunk-2U7UJOOB.cjs → chunk-6HUHH6Y4.cjs} +17 -15
  30. package/dist/chunk-6HUHH6Y4.cjs.map +1 -0
  31. package/dist/{chunk-5WROPW7Z.js → chunk-A7WQINIG.js} +3 -3
  32. package/dist/{chunk-DKZTDYH5.cjs → chunk-AAA6TR5I.cjs} +3 -3
  33. package/dist/{chunk-DKZTDYH5.cjs.map → chunk-AAA6TR5I.cjs.map} +1 -1
  34. package/dist/{chunk-A7Z2QAFZ.cjs → chunk-APK5OQRV.cjs} +5 -5
  35. package/dist/{chunk-A7Z2QAFZ.cjs.map → chunk-APK5OQRV.cjs.map} +1 -1
  36. package/dist/{chunk-ISABZ2VX.cjs → chunk-AXBYJ2OY.cjs} +9 -9
  37. package/dist/{chunk-ISABZ2VX.cjs.map → chunk-AXBYJ2OY.cjs.map} +1 -1
  38. package/dist/{chunk-6RGJAQCU.cjs → chunk-B5G5XVFJ.cjs} +5 -5
  39. package/dist/{chunk-6RGJAQCU.cjs.map → chunk-B5G5XVFJ.cjs.map} +1 -1
  40. package/dist/{chunk-MW2S7PZ7.cjs → chunk-D5IY2HUV.cjs} +5 -5
  41. package/dist/{chunk-MW2S7PZ7.cjs.map → chunk-D5IY2HUV.cjs.map} +1 -1
  42. package/dist/{chunk-FMPXSF3H.cjs → chunk-DAXZRNNO.cjs} +4 -4
  43. package/dist/{chunk-FMPXSF3H.cjs.map → chunk-DAXZRNNO.cjs.map} +1 -1
  44. package/dist/{chunk-AJZTVCST.js → chunk-EXITZVB2.js} +24 -9
  45. package/dist/chunk-EXITZVB2.js.map +1 -0
  46. package/dist/{chunk-AYMD4D4M.cjs → chunk-EZME5CLK.cjs} +3 -3
  47. package/dist/{chunk-AYMD4D4M.cjs.map → chunk-EZME5CLK.cjs.map} +1 -1
  48. package/dist/{chunk-IV4LM3MB.js → chunk-F26VIKNF.js} +9 -11
  49. package/dist/chunk-F26VIKNF.js.map +1 -0
  50. package/dist/{chunk-WPTMMOA6.cjs → chunk-G77YR73R.cjs} +10 -13
  51. package/dist/chunk-G77YR73R.cjs.map +1 -0
  52. package/dist/chunk-GEHL4LKK.cjs +32 -0
  53. package/dist/chunk-GEHL4LKK.cjs.map +1 -0
  54. package/dist/chunk-GGSII6Y2.cjs +921 -0
  55. package/dist/chunk-GGSII6Y2.cjs.map +1 -0
  56. package/dist/{chunk-3VRMTWUS.js → chunk-GHQ6SQPI.js} +7 -10
  57. package/dist/chunk-GHQ6SQPI.js.map +1 -0
  58. package/dist/{chunk-56B6RLOE.js → chunk-GI6VJYOS.js} +4 -4
  59. package/dist/{chunk-56B6RLOE.js.map → chunk-GI6VJYOS.js.map} +1 -1
  60. package/dist/{chunk-UGMONQGH.cjs → chunk-GR2PMCVN.cjs} +10 -12
  61. package/dist/chunk-GR2PMCVN.cjs.map +1 -0
  62. package/dist/{chunk-7AHZTHXR.cjs → chunk-GT22EGJP.cjs} +5 -5
  63. package/dist/{chunk-7AHZTHXR.cjs.map → chunk-GT22EGJP.cjs.map} +1 -1
  64. package/dist/{chunk-ALGX5X4N.js → chunk-IFVT5UCY.js} +3 -3
  65. package/dist/{chunk-5CLC3FJO.js → chunk-KBG77JHC.js} +13 -2
  66. package/dist/chunk-KBG77JHC.js.map +1 -0
  67. package/dist/{chunk-HLNKIAE5.cjs → chunk-KJZUYC4X.cjs} +5 -5
  68. package/dist/{chunk-HLNKIAE5.cjs.map → chunk-KJZUYC4X.cjs.map} +1 -1
  69. package/dist/{chunk-4BQM5F76.cjs → chunk-LFWPQYWX.cjs} +3 -3
  70. package/dist/{chunk-4BQM5F76.cjs.map → chunk-LFWPQYWX.cjs.map} +1 -1
  71. package/dist/{chunk-XVSODE4K.cjs → chunk-LIFUHQH5.cjs} +35 -20
  72. package/dist/chunk-LIFUHQH5.cjs.map +1 -0
  73. package/dist/{chunk-PJC7NZUV.cjs → chunk-LUL6RZ4M.cjs} +3 -3
  74. package/dist/{chunk-PJC7NZUV.cjs.map → chunk-LUL6RZ4M.cjs.map} +1 -1
  75. package/dist/{chunk-4UJ7LG4W.cjs → chunk-N2IGZIEX.cjs} +3 -3
  76. package/dist/{chunk-4UJ7LG4W.cjs.map → chunk-N2IGZIEX.cjs.map} +1 -1
  77. package/dist/{chunk-3LHQUOGP.js → chunk-NGVOXM7P.js} +3 -3
  78. package/dist/{chunk-WTXASLBB.js → chunk-O5WEKLNF.js} +2 -2
  79. package/dist/{chunk-BOB5JJ7F.js → chunk-P7IQY5YH.js} +2 -2
  80. package/dist/{chunk-VZYLJSV5.js → chunk-R4PU2TBM.js} +2 -2
  81. package/dist/{chunk-P2GCAVUZ.js → chunk-RAZRQ57B.js} +2 -2
  82. package/dist/{chunk-K7IFNKMN.js → chunk-REVK7IGN.js} +2 -2
  83. package/dist/{chunk-6U2H26A4.cjs → chunk-RHOT7AEI.cjs} +3 -3
  84. package/dist/{chunk-6U2H26A4.cjs.map → chunk-RHOT7AEI.cjs.map} +1 -1
  85. package/dist/{chunk-MH2CD2QT.js → chunk-RKA2OJRT.js} +207 -102
  86. package/dist/chunk-RKA2OJRT.js.map +1 -0
  87. package/dist/{chunk-JC4WLVBG.js → chunk-RWOX2NJN.js} +2 -2
  88. package/dist/{chunk-4LM33LDV.js → chunk-S3CT536K.js} +2 -2
  89. package/dist/{chunk-4M3LZLOH.js → chunk-SHYSLWQG.js} +2 -2
  90. package/dist/{chunk-EQEV7GPT.cjs → chunk-SKEWTQJ7.cjs} +5 -5
  91. package/dist/{chunk-EQEV7GPT.cjs.map → chunk-SKEWTQJ7.cjs.map} +1 -1
  92. package/dist/{chunk-2ZENLZEQ.cjs → chunk-SKTDGCWJ.cjs} +232 -127
  93. package/dist/chunk-SKTDGCWJ.cjs.map +1 -0
  94. package/dist/{chunk-2BXCIWL7.js → chunk-SN6EWQDJ.js} +3 -3
  95. package/dist/{chunk-DW2YDWGN.js → chunk-TEJIPPZR.js} +2 -2
  96. package/dist/{chunk-OGKD5PLS.cjs → chunk-TRLBYA5G.cjs} +4 -4
  97. package/dist/{chunk-OGKD5PLS.cjs.map → chunk-TRLBYA5G.cjs.map} +1 -1
  98. package/dist/{chunk-WE5FTQGD.js → chunk-VHMOKXUT.js} +3 -7
  99. package/dist/chunk-VHMOKXUT.js.map +1 -0
  100. package/dist/{chunk-S77GR5YQ.cjs → chunk-VHQTDITV.cjs} +3 -3
  101. package/dist/{chunk-S77GR5YQ.cjs.map → chunk-VHQTDITV.cjs.map} +1 -1
  102. package/dist/{chunk-3HMKE2GJ.js → chunk-VSTQEHVZ.js} +6 -4
  103. package/dist/chunk-VSTQEHVZ.js.map +1 -0
  104. package/dist/{chunk-HNUTV3HR.cjs → chunk-WUBQJVB7.cjs} +3 -3
  105. package/dist/{chunk-HNUTV3HR.cjs.map → chunk-WUBQJVB7.cjs.map} +1 -1
  106. package/dist/{chunk-S7TWEVC3.js → chunk-Y53HCLGW.js} +2 -2
  107. package/dist/{chunk-WIE7HDIM.js → chunk-YJXZR7RL.js} +2 -2
  108. package/dist/{chunk-IJYYHBZC.cjs → chunk-Z4SLV6WG.cjs} +3 -3
  109. package/dist/{chunk-IJYYHBZC.cjs.map → chunk-Z4SLV6WG.cjs.map} +1 -1
  110. package/dist/chunk-ZEZK664O.js +921 -0
  111. package/dist/chunk-ZEZK664O.js.map +1 -0
  112. package/dist/{chunk-JMD3P4CY.js → chunk-ZHFPV43D.js} +2 -2
  113. package/dist/combobox/index.cjs +4 -4
  114. package/dist/combobox/index.js +3 -3
  115. package/dist/context-menu/index.cjs +4 -4
  116. package/dist/context-menu/index.js +3 -3
  117. package/dist/data-grid/index.cjs +13 -13
  118. package/dist/data-grid/index.d.cts +49 -3
  119. package/dist/data-grid/index.d.ts +49 -3
  120. package/dist/data-grid/index.js +12 -12
  121. package/dist/date-picker/index.cjs +6 -6
  122. package/dist/date-picker/index.js +5 -5
  123. package/dist/drawer/index.cjs +4 -4
  124. package/dist/drawer/index.d.cts +2 -1
  125. package/dist/drawer/index.d.ts +2 -1
  126. package/dist/drawer/index.js +3 -3
  127. package/dist/empty-state/index.d.cts +2 -2
  128. package/dist/empty-state/index.d.ts +2 -2
  129. package/dist/header/index.cjs +4 -4
  130. package/dist/header/index.d.cts +2 -2
  131. package/dist/header/index.d.ts +2 -2
  132. package/dist/header/index.js +3 -3
  133. package/dist/index.cjs +29 -29
  134. package/dist/index.css +318 -73
  135. package/dist/index.d.cts +5 -4
  136. package/dist/index.d.ts +5 -4
  137. package/dist/index.js +28 -28
  138. package/dist/inline-edit/index.cjs +4 -4
  139. package/dist/inline-edit/index.js +3 -3
  140. package/dist/input/index.cjs +3 -3
  141. package/dist/input/index.js +2 -2
  142. package/dist/menu/index.cjs +3 -3
  143. package/dist/menu/index.js +2 -2
  144. package/dist/modal/index.cjs +4 -4
  145. package/dist/modal/index.d.cts +2 -1
  146. package/dist/modal/index.d.ts +2 -1
  147. package/dist/modal/index.js +3 -3
  148. package/dist/navigation/index.cjs +4 -4
  149. package/dist/navigation/index.js +3 -3
  150. package/dist/page-layout/index.cjs +8 -8
  151. package/dist/page-layout/index.d.cts +3 -2
  152. package/dist/page-layout/index.d.ts +3 -2
  153. package/dist/page-layout/index.js +7 -7
  154. package/dist/pagination/index.cjs +6 -6
  155. package/dist/pagination/index.js +5 -5
  156. package/dist/popover/index.cjs +2 -2
  157. package/dist/popover/index.d.cts +2 -2
  158. package/dist/popover/index.d.ts +2 -2
  159. package/dist/popover/index.js +1 -1
  160. package/dist/segmented-control/index.cjs +3 -3
  161. package/dist/segmented-control/index.js +2 -2
  162. package/dist/select/index.cjs +4 -4
  163. package/dist/select/index.js +3 -3
  164. package/dist/snackbar/index.cjs +4 -4
  165. package/dist/snackbar/index.js +3 -3
  166. package/dist/split-button/index.cjs +4 -4
  167. package/dist/split-button/index.js +3 -3
  168. package/dist/table/index.cjs +11 -11
  169. package/dist/table/index.d.cts +3 -3
  170. package/dist/table/index.d.ts +3 -3
  171. package/dist/table/index.js +10 -10
  172. package/dist/tabs/index.cjs +3 -3
  173. package/dist/tabs/index.js +2 -2
  174. package/dist/tag-input/index.cjs +4 -4
  175. package/dist/tag-input/index.js +3 -3
  176. package/dist/textarea/index.cjs +3 -3
  177. package/dist/textarea/index.js +2 -2
  178. package/dist/toolbar/index.cjs +5 -5
  179. package/dist/toolbar/index.d.cts +3 -2
  180. package/dist/toolbar/index.d.ts +3 -2
  181. package/dist/toolbar/index.js +4 -4
  182. package/package.json +6 -5
  183. package/dist/Toolbar.types-BGD57Uhm.d.ts +0 -22
  184. package/dist/Toolbar.types-tQkLmPIu.d.cts +0 -22
  185. package/dist/chunk-2U7UJOOB.cjs.map +0 -1
  186. package/dist/chunk-2ZENLZEQ.cjs.map +0 -1
  187. package/dist/chunk-3HMKE2GJ.js.map +0 -1
  188. package/dist/chunk-3VRMTWUS.js.map +0 -1
  189. package/dist/chunk-5CLC3FJO.js.map +0 -1
  190. package/dist/chunk-AJZTVCST.js.map +0 -1
  191. package/dist/chunk-G5IGADJI.cjs.map +0 -1
  192. package/dist/chunk-GOR642KK.cjs +0 -21
  193. package/dist/chunk-GOR642KK.cjs.map +0 -1
  194. package/dist/chunk-IV4LM3MB.js.map +0 -1
  195. package/dist/chunk-KIXFSXIN.cjs.map +0 -1
  196. package/dist/chunk-MH2CD2QT.js.map +0 -1
  197. package/dist/chunk-QONDJ5VM.cjs +0 -744
  198. package/dist/chunk-QONDJ5VM.cjs.map +0 -1
  199. package/dist/chunk-UGMONQGH.cjs.map +0 -1
  200. package/dist/chunk-VSFKM7FE.js +0 -744
  201. package/dist/chunk-VSFKM7FE.js.map +0 -1
  202. package/dist/chunk-WE5FTQGD.js.map +0 -1
  203. package/dist/chunk-WPTMMOA6.cjs.map +0 -1
  204. package/dist/chunk-XVSODE4K.cjs.map +0 -1
  205. package/dist/chunk-YQLCPKGV.js.map +0 -1
  206. /package/dist/{chunk-Z4ZY7L7W.js.map → chunk-5ZL6PYU3.js.map} +0 -0
  207. /package/dist/{chunk-A3NE2C7C.js.map → chunk-67RFMV6K.js.map} +0 -0
  208. /package/dist/{chunk-5WROPW7Z.js.map → chunk-A7WQINIG.js.map} +0 -0
  209. /package/dist/{chunk-ALGX5X4N.js.map → chunk-IFVT5UCY.js.map} +0 -0
  210. /package/dist/{chunk-3LHQUOGP.js.map → chunk-NGVOXM7P.js.map} +0 -0
  211. /package/dist/{chunk-WTXASLBB.js.map → chunk-O5WEKLNF.js.map} +0 -0
  212. /package/dist/{chunk-BOB5JJ7F.js.map → chunk-P7IQY5YH.js.map} +0 -0
  213. /package/dist/{chunk-VZYLJSV5.js.map → chunk-R4PU2TBM.js.map} +0 -0
  214. /package/dist/{chunk-P2GCAVUZ.js.map → chunk-RAZRQ57B.js.map} +0 -0
  215. /package/dist/{chunk-K7IFNKMN.js.map → chunk-REVK7IGN.js.map} +0 -0
  216. /package/dist/{chunk-JC4WLVBG.js.map → chunk-RWOX2NJN.js.map} +0 -0
  217. /package/dist/{chunk-4LM33LDV.js.map → chunk-S3CT536K.js.map} +0 -0
  218. /package/dist/{chunk-4M3LZLOH.js.map → chunk-SHYSLWQG.js.map} +0 -0
  219. /package/dist/{chunk-2BXCIWL7.js.map → chunk-SN6EWQDJ.js.map} +0 -0
  220. /package/dist/{chunk-DW2YDWGN.js.map → chunk-TEJIPPZR.js.map} +0 -0
  221. /package/dist/{chunk-S7TWEVC3.js.map → chunk-Y53HCLGW.js.map} +0 -0
  222. /package/dist/{chunk-WIE7HDIM.js.map → chunk-YJXZR7RL.js.map} +0 -0
  223. /package/dist/{chunk-JMD3P4CY.js.map → chunk-ZHFPV43D.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-2U7UJOOB.cjs","../node_modules/dayjs/dayjs.min.js","../node_modules/dayjs/plugin/utc.js","../node_modules/dayjs/plugin/timezone.js","../node_modules/dayjs/plugin/weekOfYear.js","../src/components/DatePicker/DatePicker.component.tsx","../src/components/DatePicker/Calendar.component.tsx","../src/components/DatePicker/TimeInput.component.tsx"],"names":["t","e","n","r","i","s","u","a","M","m","f","l","$","y","v","g","D","o","d","c","h","import_dayjs","dayjs","weekOfYear","useCallback","jsx","useState"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-2U7UJOOB.cjs","sourcesContent":[null,"!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),Y=_.prototype;return O.prototype=Y,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){Y[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_timezone=e()}(this,(function(){\"use strict\";var t={year:0,month:1,day:2,hour:3,minute:4,second:5},e={};return function(n,i,r){var o,a=function(t,n,i){void 0===i&&(i={});var r=new Date(t),o=function(t,n){void 0===n&&(n={});var i=n.timeZoneName||\"short\",r=t+\"|\"+i,o=e[r];return o||(o=new Intl.DateTimeFormat(\"en-US\",{hour12:!1,timeZone:t,year:\"numeric\",month:\"2-digit\",day:\"2-digit\",hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",timeZoneName:i}),e[r]=o),o}(n,i);return o.formatToParts(r)},u=function(e,n){for(var i=a(e,n),o=[],u=0;u<i.length;u+=1){var f=i[u],s=f.type,m=f.value,c=t[s];c>=0&&(o[c]=parseInt(m,10))}var l=o[3],d=24===l?0:l,h=o[0]+\"-\"+o[1]+\"-\"+o[2]+\" \"+d+\":\"+o[4]+\":\"+o[5]+\":000\",v=+e;return(r.utc(h).valueOf()-(v-=v%1e3))/6e4},f=i.prototype;f.tz=function(t,e){if(void 0===t&&(t=o),!this.isValid())return this;var n,i=this.utcOffset(),a=this.toDate(),f=a.toLocaleString(\"en-US\",{timeZone:t}),s=u(+a,t);if(!Number(s))n=this.utcOffset(0,e);else if(n=r(f,{locale:this.$L}).$set(\"millisecond\",this.$ms).utcOffset(s,!0),e){var m=n.utcOffset();n=n.add(i-m,\"minute\")}return n.$x.$timezone=t,n},f.offsetName=function(t){var e=this.$x.$timezone||r.tz.guess(),n=a(this.valueOf(),e,{timeZoneName:t}).find((function(t){return\"timezonename\"===t.type.toLowerCase()}));return n&&n.value};var s=f.startOf;f.startOf=function(t,e){if(!this.$x||!this.$x.$timezone)return s.call(this,t,e);var n=r(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\"),{locale:this.$L});return s.call(n,t,e).tz(this.$x.$timezone,!0)},r.tz=function(t,e,n){var i=n&&e,a=n||e||o,f=u(+r(),a);if(\"string\"!=typeof t)return r(t).tz(a);var s=r.utc(t,i).valueOf();if(Number.isNaN(s)){var m=r(NaN);return m.$x.$timezone=a,m}var c=function(t,e,n){var i=t-60*e*1e3,r=u(i,n);if(e===r)return[i,e];var o=u(i-=60*(r-e)*1e3,n);return r===o?[i,r]:[t-60*Math.min(r,o)*1e3,Math.max(r,o)]}(s,f,a),l=c[0],d=c[1],h=r(l).utcOffset(d);return h.$x.$timezone=a,h},r.tz.guess=function(){return Intl.DateTimeFormat().resolvedOptions().timeZone},r.tz.setDefault=function(t){o=t}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_weekOfYear=t()}(this,(function(){\"use strict\";var e=\"week\",t=\"year\";return function(i,n,r){var f=n.prototype;f.week=function(i){if(void 0===i&&(i=null),null!==i)return this.add(7*(i-this.week()),\"day\");var n=this.$locale().yearStart||1;if(11===this.month()&&this.date()>25){var f=r(this).startOf(t).add(1,t).date(n),s=r(this).endOf(e);if(f.isBefore(s))return 1}var a=r(this).startOf(t).date(n).startOf(e).subtract(1,\"millisecond\"),o=this.diff(a,e,!0);return o<0?r(this).startOf(\"week\").week():Math.ceil(o)},f.weeks=function(e){return void 0===e&&(e=null),this.week(e)}}}));","import React, { useState, useCallback, useRef, useMemo } from 'react';\nimport dayjs, { Dayjs } from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport { Calendar as CalendarIcon, X } from 'lucide-react';\nimport { Input } from '../Input/Input.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport { Calendar } from './Calendar.component';\nimport { TimeInput } from './TimeInput.component';\nimport type {\n DatePickerProps,\n DateSelectionMode,\n DateTimeValue,\n TimeValue,\n RangeTimeValue,\n} from './DatePicker.types';\n\n// Initialize dayjs plugins\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\nexport const DatePicker = <T extends DateSelectionMode = 'single'>({\n mode,\n value,\n onChange,\n granularity = 'day',\n time = { enabled: false },\n calendar = { numberOfCalendars: 2 },\n format = {\n displayFormat: 'MMM DD, YYYY',\n inputFormat: 'YYYY-MM-DD',\n timeFormat: 'HH:mm',\n timezone: 'UTC',\n },\n placeholder = 'Select date...',\n disabled = false,\n required = false,\n name,\n id,\n inputProps = {},\n minDate,\n maxDate,\n disabledDates = [],\n disabledDaysOfWeek = [],\n className = '',\n fullWidth = false,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n autoWidth = false,\n}: DatePickerProps<T>) => {\n const [dropdownKey, setDropdownKey] = useState(0);\n // Two different, deliberately different, notions of \"timezone\" are in\n // play here, matching two genuinely different kinds of value:\n //\n // - Date-only (time.enabled === false): a pure calendar date has no\n // wall-clock moment attached to it, so there's nothing for a timezone\n // to sensibly represent. It's anchored to a fixed `pickerTimezone`\n // (default UTC) so the same calendar date always serializes to the\n // same ISO instant no matter which machine picks it - see\n // `composeDateOnly`.\n // - Date + time (time.enabled === true): this genuinely represents a\n // real-world instant, e.g. a meeting at a specific wall-clock time -\n // exactly the case a timezone exists to disambiguate. That instant\n // should be computed from *the picking user's own local offset*\n // (someone in UTC+3 typing \"15:00\" means 12:00 UTC), and later\n // displayed by converting that same UTC instant into *each viewer's\n // own* local offset (that same instant shows as \"12:00\" to a UTC+0\n // viewer). That's exactly plain, un-anchored dayjs/Date behavior with\n // no explicit timezone forcing at all, so this path intentionally\n // does not use `pickerTimezone` anywhere.\n const pickerTimezone = format.timezone || 'UTC';\n // Combines a calendar date (only its Y-M-D is read, so it's timezone-\n // agnostic going in) with a start/end-of-day boundary, anchored to\n // `pickerTimezone` - only ever used for date-only values.\n const composeDateOnly = useCallback(\n (date: Dayjs, boundary: 'start' | 'end' = 'start') => {\n const anchored = dayjs.tz(date.format('YYYY-MM-DD'), pickerTimezone);\n return boundary === 'end' ? anchored.endOf('day') : anchored.startOf('day');\n },\n [pickerTimezone],\n );\n // Combines a calendar date with a time-of-day using plain local\n // semantics (no timezone forcing) - only ever used for date+time values,\n // see the note above.\n const composeLocalDateTime = useCallback(\n (date: Dayjs, t: TimeValue): Dayjs =>\n date\n .hour(t.hours)\n .minute(t.minutes)\n .second(t.seconds || 0),\n [],\n );\n // Re-anchors an already-stored ISO instant's calendar day (read in the\n // browser's own local timezone, matching how it was written) onto a new\n // time-of-day - used when the user edits a TimeInput without re-picking\n // the date, so that edit actually changes the returned value instead of\n // only updating the separate `value.time` field alongside an unchanged\n // `value.date`. Deliberately local, not anchored to `pickerTimezone` -\n // see the note above.\n const recomposeIsoWithTime = useCallback(\n (isoString: string, t: TimeValue): string =>\n dayjs(isoString)\n .hour(t.hours)\n .minute(t.minutes)\n .second(t.seconds || 0)\n .toISOString(),\n [],\n );\n // Month granularity always shows a single year/month grid - side-by-side\n // \"next month\" calendars don't make sense once there are no day cells.\n const numberOfCalendars = granularity === 'month' ? 1 : calendar.numberOfCalendars || 2;\n const independentCalendars = calendar.independent ?? false;\n // One entry per visible calendar. In the default (non-independent) mode\n // these always stay consecutive months, kept in sync from a single shared\n // control (see `handleCalendarMonthChange`) - the array shape is the same\n // either way, only how a change to one entry propagates differs.\n const [calendarDates, setCalendarDates] = useState<Dayjs[]>(() =>\n Array.from({ length: numberOfCalendars }, (_, i) => dayjs().add(i, 'month')),\n );\n const handleCalendarMonthChange = useCallback(\n (index: number, newDate: Dayjs) => {\n if (!independentCalendars) {\n // Coupled: every calendar shifts together, re-anchored so `index`\n // lands on `newDate` - e.g. moving calendar 1 to November re-anchors\n // calendar 0 to October, same as before this was array-based.\n const anchor = newDate.subtract(index, 'month');\n setCalendarDates(\n Array.from({ length: numberOfCalendars }, (_, i) => anchor.add(i, 'month')),\n );\n return;\n }\n\n // Independent: only this calendar moves, clamped so it can never reach\n // or cross an immediate neighbor's month - two calendars both landing\n // on (or swapping past) the same month would be exactly the confusing\n // state independent mode exists to let users avoid, just self-inflicted\n // instead of automatic.\n setCalendarDates((prev) => {\n const next = [...prev];\n let clamped = newDate;\n const left = prev[index - 1];\n const right = prev[index + 1];\n if (left && !clamped.isAfter(left, 'month')) {\n clamped = left.add(1, 'month');\n }\n if (right && !clamped.isBefore(right, 'month')) {\n clamped = right.subtract(1, 'month');\n }\n next[index] = clamped;\n return next;\n });\n },\n [independentCalendars, numberOfCalendars],\n );\n const triggerRef = useRef<HTMLDivElement>(null);\n\n // Convert the string-based constraint props to the Dayjs objects Calendar\n // actually consumes for its `isBefore`/`isAfter`/`isSame` comparisons.\n const minDateObj = useMemo(() => (minDate ? dayjs(minDate) : undefined), [minDate]);\n const maxDateObj = useMemo(() => (maxDate ? dayjs(maxDate) : undefined), [maxDate]);\n const disabledDatesObj = useMemo(() => disabledDates.map((d) => dayjs(d)), [disabledDates]);\n\n // Default time values\n const defaultStartTime = useMemo<TimeValue>(() => ({ hours: 0, minutes: 0, seconds: 0 }), []);\n const defaultEndTime = useMemo<TimeValue>(() => ({ hours: 23, minutes: 59, seconds: 59 }), []);\n\n // Helper function to convert stored ISO strings back to the calendar date\n // they represent, for calendar-grid display (which day to highlight).\n const toLocalDateString = useCallback(\n (isoString: string | null): string | null => {\n if (!isoString) return null;\n const parsed = dayjs(isoString);\n // Date-only values were anchored to `pickerTimezone` when stored (see\n // `composeDateOnly`) - reading them back via the browser's ambient\n // timezone instead would recover the wrong calendar day for anyone\n // not in that same timezone. Date+time values were deliberately\n // never anchored (see the note above `pickerTimezone`), so they stay\n // on local interpretation, matching how they were written.\n return (time.enabled ? parsed : parsed.tz(pickerTimezone)).format('YYYY-MM-DD');\n },\n [time.enabled, pickerTimezone],\n );\n\n // Convert current value to calendar-compatible format\n const { selectedDates, rangeStart, rangeEnd } = useMemo(() => {\n if (!value?.date) {\n return { selectedDates: [], rangeStart: null, rangeEnd: null };\n }\n\n switch (mode) {\n case 'single': {\n const isoString = value.date as string | null;\n const localDateStr = toLocalDateString(isoString);\n return {\n selectedDates: localDateStr ? [dayjs(localDateStr)] : [],\n rangeStart: null,\n rangeEnd: null,\n };\n }\n case 'multiple': {\n const isoStrings = value.date as string[];\n const localDateStrings = isoStrings\n .map((d) => toLocalDateString(d))\n .filter(Boolean) as string[];\n return {\n selectedDates: localDateStrings.map((d) => dayjs(d)),\n rangeStart: null,\n rangeEnd: null,\n };\n }\n case 'range': {\n const range = value.date as { start: string | null; end: string | null };\n const startStr = toLocalDateString(range.start);\n const endStr = toLocalDateString(range.end);\n return {\n selectedDates: [],\n rangeStart: startStr ? dayjs(startStr) : null,\n rangeEnd: endStr ? dayjs(endStr) : null,\n };\n }\n default:\n return { selectedDates: [], rangeStart: null, rangeEnd: null };\n }\n }, [value, mode, toLocalDateString]);\n\n // Handle date selection from calendar - always return ISO strings. Uses\n // `composeDateOnly` (fixed `pickerTimezone` anchor) when time.enabled is\n // false, `composeLocalDateTime` (plain local semantics) when true - see\n // the note above `pickerTimezone` for why these need to differ.\n const handleDateSelect = useCallback(\n (selectedDate: Dayjs) => {\n // `granularity === 'month'` means the calendar only ever hands us a\n // day *within* the picked month (see Calendar's month grid) - the\n // stored/returned value is always that month's last day, while the\n // day-of-week boundary semantics below ('start' of day vs 'end' of\n // day) are unaffected.\n const effectiveDate = granularity === 'month' ? selectedDate.endOf('month') : selectedDate;\n const compareUnit = granularity === 'month' ? 'month' : 'day';\n\n switch (mode) {\n case 'single': {\n let dateWithTime: Dayjs;\n // Preserve whatever time the user already configured via\n // TimeInput rather than resetting to the default every time a\n // different date is picked.\n const activeTime = (value?.time as TimeValue) ?? defaultStartTime;\n if (time.enabled) {\n dateWithTime = composeLocalDateTime(effectiveDate, activeTime);\n } else {\n dateWithTime = composeDateOnly(effectiveDate, 'start');\n }\n\n const newValue: DateTimeValue<T> = {\n date: dateWithTime.toISOString() as DateTimeValue<T>['date'],\n time: time.enabled ? (activeTime as DateTimeValue<T>['time']) : undefined,\n };\n\n onChange?.(newValue);\n setDropdownKey((prev) => prev + 1); // Close dropdown\n break;\n }\n\n case 'multiple': {\n const currentDates = (value?.date as string[]) || [];\n const currentDayjs = currentDates.map((d) => dayjs(d));\n\n // Check if date is already selected\n const existingIndex = currentDayjs.findIndex((d) => d.isSame(effectiveDate, compareUnit));\n let newDates: Dayjs[];\n\n if (existingIndex >= 0) {\n // Remove if already selected\n newDates = currentDayjs.filter((_, index) => index !== existingIndex);\n } else {\n // Add new date, preserving the shared time already configured.\n const activeTime = (value?.time as TimeValue) ?? defaultStartTime;\n const dateWithTime = time.enabled\n ? composeLocalDateTime(effectiveDate, activeTime)\n : composeDateOnly(effectiveDate, 'start');\n newDates = [...currentDayjs, dateWithTime];\n }\n\n // Always return ISO strings\n const newValue: DateTimeValue<T> = {\n date: newDates.map((d) => d.toISOString()) as DateTimeValue<T>['date'],\n time: time.enabled\n ? (((value?.time as TimeValue) ?? defaultStartTime) as DateTimeValue<T>['time'])\n : undefined,\n };\n\n onChange?.(newValue);\n break;\n }\n\n case 'range': {\n const currentRange = (value?.date as { start: string | null; end: string | null }) || {\n start: null,\n end: null,\n };\n const currentRangeTime = (value?.time as RangeTimeValue) || {\n start: defaultStartTime,\n end: defaultEndTime,\n };\n\n if (!currentRange.start || (currentRange.start && currentRange.end)) {\n // Start new range, preserving the already-configured start time.\n const startWithTime = time.enabled\n ? composeLocalDateTime(effectiveDate, currentRangeTime.start)\n : composeDateOnly(effectiveDate, 'start');\n\n // Always return ISO string\n const newValue: DateTimeValue<T> = {\n date: { start: startWithTime.toISOString(), end: null } as DateTimeValue<T>['date'],\n time: time.enabled ? (currentRangeTime as DateTimeValue<T>['time']) : undefined,\n };\n\n onChange?.(newValue);\n } else {\n // Complete the range. Date-only starts were anchored to\n // `pickerTimezone` when stored (see `composeDateOnly`) -\n // re-read it the same way so the \"is end before start\"\n // comparison below lines up with the day it actually\n // represents. Date+time starts were never anchored, so\n // they stay on local interpretation, matching how they\n // were written.\n const start = time.enabled\n ? dayjs(currentRange.start)\n : dayjs(currentRange.start).tz(pickerTimezone);\n let end = effectiveDate;\n\n // Ensure end is after start\n if (end.isBefore(start, compareUnit)) {\n end = start;\n }\n\n end = time.enabled\n ? composeLocalDateTime(end, currentRangeTime.end)\n : composeDateOnly(end, 'end');\n\n // Always return ISO strings\n const newValue: DateTimeValue<T> = {\n date: {\n start: currentRange.start,\n end: end.toISOString(),\n } as DateTimeValue<T>['date'],\n time: time.enabled ? (currentRangeTime as DateTimeValue<T>['time']) : undefined,\n };\n\n onChange?.(newValue);\n setDropdownKey((prev) => prev + 1); // Close dropdown after completing range\n }\n break;\n }\n }\n },\n [\n mode,\n time,\n value,\n onChange,\n defaultStartTime,\n defaultEndTime,\n composeDateOnly,\n composeLocalDateTime,\n pickerTimezone,\n granularity,\n ],\n );\n\n // Format display value\n const displayValue = useMemo(() => {\n if (!value?.date) return '';\n\n const displayFmt =\n format.displayFormat || (granularity === 'month' ? 'MMM YYYY' : 'MMM DD, YYYY');\n // Date-only values were anchored to `pickerTimezone` when stored (see\n // `composeDateOnly`) - display them in that same timezone rather than\n // the viewer's ambient one, so the trigger shows the actual calendar\n // date that was picked. Date+time values were deliberately never\n // anchored (see the note above `pickerTimezone`) - the viewer's own\n // local timezone is exactly what should convert that instant for\n // display, e.g. a UTC+3-scheduled 15:00 meeting showing as 12:00 to a\n // UTC+0 viewer.\n const parseDateOnlyAware = (iso: string) =>\n time.enabled ? dayjs(iso) : dayjs(iso).tz(pickerTimezone);\n\n switch (mode) {\n case 'single': {\n const date = parseDateOnlyAware(value.date as string);\n let result = date.format(displayFmt);\n if (time.enabled) {\n const timeStr = time.includeSeconds ? date.format('HH:mm:ss') : date.format('HH:mm');\n result += ` ${timeStr}`;\n }\n return result;\n }\n\n case 'multiple': {\n const dates = value.date as string[];\n if (time.enabled) {\n const formattedDates = dates.map((d) => {\n const date = parseDateOnlyAware(d);\n const dateStr = date.format(displayFmt);\n const timeStr = time.includeSeconds ? date.format('HH:mm:ss') : date.format('HH:mm');\n return `${dateStr} ${timeStr}`;\n });\n return formattedDates.join(', ');\n } else {\n const formattedDates = dates.map((d) => parseDateOnlyAware(d).format(displayFmt));\n return formattedDates.join(', ');\n }\n }\n\n case 'range': {\n const rangeValue = value.date as { start: string | null; end: string | null };\n const parts: string[] = [];\n\n if (rangeValue.start) {\n const startDate = parseDateOnlyAware(rangeValue.start);\n let startStr = startDate.format(displayFmt);\n if (time.enabled) {\n const timeStr = time.includeSeconds\n ? startDate.format('HH:mm:ss')\n : startDate.format('HH:mm');\n startStr += ` ${timeStr}`;\n }\n parts.push(startStr);\n }\n\n if (rangeValue.end) {\n const endDate = parseDateOnlyAware(rangeValue.end);\n let endStr = endDate.format(displayFmt);\n if (time.enabled) {\n const timeStr = time.includeSeconds\n ? endDate.format('HH:mm:ss')\n : endDate.format('HH:mm');\n endStr += ` ${timeStr}`;\n }\n parts.push(endStr);\n }\n\n return parts.join(' - ');\n }\n\n default:\n return '';\n }\n }, [value, mode, time, format, pickerTimezone, granularity]);\n\n // Handle clear\n const handleClear = useCallback(\n (e?: React.MouseEvent) => {\n if (e) {\n e.stopPropagation();\n }\n\n const clearedValue = (() => {\n if (mode === 'multiple') {\n return {\n date: [] as unknown as DateTimeValue<T>['date'],\n time: time.enabled\n ? (defaultStartTime as unknown as DateTimeValue<T>['time'])\n : undefined,\n } as DateTimeValue<T>;\n } else if (mode === 'range') {\n return {\n date: { start: null, end: null } as unknown as DateTimeValue<T>['date'],\n time: time.enabled\n ? ({\n start: defaultStartTime,\n end: defaultEndTime,\n } as unknown as DateTimeValue<T>['time'])\n : undefined,\n } as DateTimeValue<T>;\n } else {\n return {\n date: null as unknown as DateTimeValue<T>['date'],\n time: time.enabled\n ? (defaultStartTime as unknown as DateTimeValue<T>['time'])\n : undefined,\n } as DateTimeValue<T>;\n }\n })();\n\n onChange?.(clearedValue);\n setDropdownKey((prev) => prev + 1); // Close dropdown\n },\n [mode, time, onChange, defaultStartTime, defaultEndTime],\n );\n\n // Create trigger element\n const triggerElement = (\n <div\n ref={triggerRef}\n className={`eidos-date-picker-trigger${fullWidth ? ' eidos-date-picker-trigger--fullWidth' : ''}`}\n >\n <Input\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n name={name}\n id={id}\n readOnly={true}\n preIcon={CalendarIcon}\n posIcon={displayValue ? X : undefined}\n posIconButton={!!displayValue}\n onPosIconClick={displayValue ? handleClear : undefined}\n {...inputProps}\n clearable={false}\n />\n </div>\n );\n\n // Create dropdown content with calendar(s) and time inputs\n const dropdownContent = (\n <div className={'eidos-date-picker-content'}>\n {/* Multiple calendars with container-level navigation */}\n <div className={'eidos-date-picker-calendars-wrapper'}>\n {Array.from({ length: numberOfCalendars }, (_, index) => {\n const calendarDate = calendarDates[index] ?? dayjs().add(index, 'month');\n return (\n <Calendar\n key={index}\n currentDate={calendarDate}\n selectedDates={selectedDates}\n rangeStart={rangeStart}\n rangeEnd={rangeEnd}\n mode={mode}\n granularity={granularity}\n onDateSelect={handleDateSelect}\n onMonthChange={(newDate) => handleCalendarMonthChange(index, newDate)}\n minDate={minDateObj}\n maxDate={maxDateObj}\n disabledDates={disabledDatesObj}\n disabledDaysOfWeek={disabledDaysOfWeek}\n showWeekNumbers={calendar.showWeekNumbers}\n firstDayOfWeek={calendar.firstDayOfWeek}\n // Non-independent: only the first calendar's control is\n // interactive, since it's the one every other calendar\n // actually follows. Independent: every calendar gets one.\n showNavigation={independentCalendars || index === 0}\n />\n );\n })}\n </div>\n\n {/* Time inputs */}\n {time.enabled && (\n <div className={'eidos-date-picker-time-container'}>\n {mode === 'single' && (\n <TimeInput\n value={(value?.time as TimeValue) || defaultStartTime}\n onChange={(newTime) => {\n // Recompose the actual returned value with the new\n // time, not just the separate `time` field - see\n // `recomposeIsoWithTime`.\n const currentIso = value?.date as string | null;\n const newValue = {\n ...value,\n date: (currentIso\n ? recomposeIsoWithTime(currentIso, newTime)\n : currentIso) as DateTimeValue<T>['date'],\n time: newTime,\n } as DateTimeValue<T>;\n onChange?.(newValue);\n }}\n includeSeconds={time.includeSeconds}\n disabled={disabled}\n label=\"Time\"\n />\n )}\n\n {mode === 'multiple' && (\n <TimeInput\n value={(value?.time as TimeValue) || defaultStartTime}\n onChange={(newTime) => {\n // Recompose every selected date with the new shared\n // time - see `recomposeIsoWithTime`.\n const currentDates = (value?.date as string[]) || [];\n const newValue = {\n ...value,\n date: currentDates.map((d) =>\n recomposeIsoWithTime(d, newTime),\n ) as DateTimeValue<T>['date'],\n time: newTime,\n } as DateTimeValue<T>;\n onChange?.(newValue);\n }}\n includeSeconds={time.includeSeconds}\n disabled={disabled}\n label=\"Time for all dates\"\n />\n )}\n\n {mode === 'range' && (\n <div className={'eidos-date-picker-range-time-inputs'}>\n <TimeInput\n value={(value?.time as RangeTimeValue)?.start || defaultStartTime}\n onChange={(newTime) => {\n const currentRangeTime = (value?.time as RangeTimeValue) || {\n start: defaultStartTime,\n end: defaultEndTime,\n };\n // Recompose just the start of the range with the new\n // time - see `recomposeIsoWithTime`.\n const currentRange = (value?.date as {\n start: string | null;\n end: string | null;\n }) || {\n start: null,\n end: null,\n };\n const newValue = {\n ...value,\n date: {\n ...currentRange,\n start: currentRange.start\n ? recomposeIsoWithTime(currentRange.start, newTime)\n : currentRange.start,\n } as DateTimeValue<T>['date'],\n time: {\n ...currentRangeTime,\n start: newTime,\n },\n } as DateTimeValue<T>;\n onChange?.(newValue);\n }}\n includeSeconds={time.includeSeconds}\n disabled={disabled}\n label=\"Start time\"\n />\n <TimeInput\n value={(value?.time as RangeTimeValue)?.end || defaultEndTime}\n onChange={(newTime) => {\n const currentRangeTime = (value?.time as RangeTimeValue) || {\n start: defaultStartTime,\n end: defaultEndTime,\n };\n // Recompose just the end of the range with the new\n // time - see `recomposeIsoWithTime`.\n const currentRange = (value?.date as {\n start: string | null;\n end: string | null;\n }) || {\n start: null,\n end: null,\n };\n const newValue = {\n ...value,\n date: {\n ...currentRange,\n end: currentRange.end\n ? recomposeIsoWithTime(currentRange.end, newTime)\n : currentRange.end,\n } as DateTimeValue<T>['date'],\n time: {\n ...currentRangeTime,\n end: newTime,\n },\n } as DateTimeValue<T>;\n onChange?.(newValue);\n }}\n includeSeconds={time.includeSeconds}\n disabled={disabled}\n label=\"End time\"\n />\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return (\n <div\n className={`eidos-date-picker-container${fullWidth ? ' eidos-date-picker-container--fullWidth' : ''} ${className}`.trim()}\n >\n <Dropdown\n key={dropdownKey}\n trigger={triggerElement}\n content={dropdownContent}\n placement=\"bottom\"\n minWidth={minWidth}\n maxWidth={maxWidth || 'none'}\n minHeight={minHeight}\n maxHeight={maxHeight || 'none'}\n autoWidth={autoWidth}\n triggerRef={triggerRef as React.RefObject<HTMLElement | null>}\n />\n </div>\n );\n};\n\nDatePicker.displayName = 'DatePicker';\n","import React, { useMemo, useCallback } from 'react';\nimport dayjs, { Dayjs } from 'dayjs';\nimport weekOfYear from 'dayjs/plugin/weekOfYear';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\n\n// Initialize dayjs plugins\ndayjs.extend(weekOfYear);\nimport { Select } from '../Select/Select.component';\nimport type { CalendarProps } from './DatePicker.types';\nimport { Button } from '../Button/Button.component';\n\nexport const Calendar: React.FC<CalendarProps> = ({\n currentDate,\n selectedDates,\n rangeStart,\n rangeEnd,\n // mode, // TODO: Use this for different selection behaviors\n granularity = 'day',\n onDateSelect,\n onMonthChange,\n minDate,\n maxDate,\n disabledDates = [],\n disabledDaysOfWeek = [],\n showWeekNumbers = false,\n firstDayOfWeek = 1, // Monday\n showNavigation = true,\n}) => {\n // Generate month options (12 months)\n const monthOptions = useMemo(() => {\n return Array.from({ length: 12 }, (_, i) => ({\n id: i.toString(),\n label: dayjs().month(i).format('MMMM'),\n value: i.toString(),\n }));\n }, []);\n\n // Generate year options (current year ± 50 years)\n const yearOptions = useMemo(() => {\n const currentYear = dayjs().year();\n const years = [];\n for (let year = currentYear - 50; year <= currentYear + 50; year++) {\n years.push({\n id: year.toString(),\n label: year.toString(),\n value: year.toString(),\n });\n }\n return years;\n }, []);\n\n // Handle month selection\n const handleMonthSelect = useCallback(\n (value: string | string[]) => {\n if (typeof value === 'string') {\n const newDate = currentDate.month(parseInt(value));\n onMonthChange(newDate);\n }\n },\n [currentDate, onMonthChange],\n );\n\n // Handle year selection\n const handleYearSelect = useCallback(\n (value: string | string[]) => {\n if (typeof value === 'string') {\n const newDate = currentDate.year(parseInt(value));\n onMonthChange(newDate);\n }\n },\n [currentDate, onMonthChange],\n );\n\n // Handle navigation arrows\n const handlePrevMonth = useCallback(() => {\n onMonthChange(currentDate.subtract(1, 'month'));\n }, [currentDate, onMonthChange]);\n\n const handleNextMonth = useCallback(() => {\n onMonthChange(currentDate.add(1, 'month'));\n }, [currentDate, onMonthChange]);\n\n const handlePrevYear = useCallback(() => {\n onMonthChange(currentDate.subtract(1, 'year'));\n }, [currentDate, onMonthChange]);\n\n const handleNextYear = useCallback(() => {\n onMonthChange(currentDate.add(1, 'year'));\n }, [currentDate, onMonthChange]);\n\n // Generate the 12 months of `currentDate`'s year - used instead of\n // `calendarDays` when `granularity === 'month'`.\n const monthCells = useMemo(() => {\n return Array.from({ length: 12 }, (_, i) => {\n const monthDate = currentDate.month(i).startOf('month');\n const isToday = monthDate.isSame(dayjs(), 'month');\n const isSelected = selectedDates.some((date) => date.isSame(monthDate, 'month'));\n const isDisabled =\n (minDate && monthDate.endOf('month').isBefore(minDate, 'month')) ||\n (maxDate && monthDate.isAfter(maxDate, 'month'));\n\n const isRangeStart = rangeStart?.isSame(monthDate, 'month') || false;\n const isRangeEnd = rangeEnd?.isSame(monthDate, 'month') || false;\n const isInRange =\n rangeStart &&\n rangeEnd &&\n monthDate.isAfter(rangeStart, 'month') &&\n monthDate.isBefore(rangeEnd, 'month');\n\n return {\n date: monthDate,\n isToday,\n isSelected,\n isDisabled,\n isRangeStart,\n isRangeEnd,\n isInRange,\n };\n });\n }, [currentDate, selectedDates, rangeStart, rangeEnd, minDate, maxDate]);\n\n // Generate calendar days\n const calendarDays = useMemo(() => {\n const startOfMonth = currentDate.startOf('month');\n\n // Get the first day of the week for the first day of the month\n let startOfCalendar = startOfMonth.startOf('week');\n if (firstDayOfWeek === 1) {\n // Monday\n startOfCalendar =\n startOfMonth.day() === 0\n ? startOfMonth.subtract(6, 'day')\n : startOfMonth.startOf('week').add(1, 'day');\n }\n\n // Generate 42 days (6 weeks * 7 days)\n const days = [];\n let current = startOfCalendar;\n\n for (let i = 0; i < 42; i++) {\n const isCurrentMonth = current.month() === currentDate.month();\n const isToday = current.isSame(dayjs(), 'day');\n const isSelected = selectedDates.some((date) => date.isSame(current, 'day'));\n const isDisabled =\n (minDate && current.isBefore(minDate, 'day')) ||\n (maxDate && current.isAfter(maxDate, 'day')) ||\n disabledDates.some((date) => date.isSame(current, 'day')) ||\n disabledDaysOfWeek.includes(current.day());\n\n // Range logic\n const isRangeStart = rangeStart?.isSame(current, 'day') || false;\n const isRangeEnd = rangeEnd?.isSame(current, 'day') || false;\n const isInRange =\n rangeStart &&\n rangeEnd &&\n current.isAfter(rangeStart, 'day') &&\n current.isBefore(rangeEnd, 'day');\n\n days.push({\n date: current,\n isCurrentMonth,\n isToday,\n isSelected,\n isDisabled,\n isRangeStart,\n isRangeEnd,\n isInRange,\n });\n\n current = current.add(1, 'day');\n }\n\n return days;\n }, [\n currentDate,\n selectedDates,\n rangeStart,\n rangeEnd,\n minDate,\n maxDate,\n disabledDates,\n disabledDaysOfWeek,\n firstDayOfWeek,\n ]);\n\n // Generate weekday headers\n const weekDays = useMemo(() => {\n const days = [];\n let start =\n firstDayOfWeek === 0 ? dayjs().startOf('week') : dayjs().startOf('week').add(1, 'day');\n\n for (let i = 0; i < 7; i++) {\n days.push(start.format('dd'));\n start = start.add(1, 'day');\n }\n return days;\n }, [firstDayOfWeek]);\n\n // Handle date click\n const handleDateClick = useCallback(\n (date: Dayjs) => {\n onDateSelect(date);\n },\n [onDateSelect],\n );\n\n return (\n <div className={'eidos-calendar'}>\n {/* Header with navigation - only interactive when this calendar actually\n\t\t\t navigates independently of its neighbors (see `showNavigation` doc).\n\t\t\t Showing editable, interactive controls that silently move a sibling\n\t\t\t calendar instead of themselves is exactly the confusing behavior this\n\t\t\t is meant to avoid; a plain label is honest about what will happen. */}\n <div className={'eidos-calendar-header'}>\n {showNavigation ? (\n granularity === 'month' ? (\n <>\n <Button variant=\"text\" icon={ChevronLeft} onClick={handlePrevYear} />\n\n <div className={'eidos-calendar-selectors'}>\n <Select\n options={yearOptions}\n value={currentDate.year().toString()}\n onChange={handleYearSelect}\n clearable={false}\n dropdownProps={{\n dropdownGroup: 'calendar-navigation',\n }}\n />\n </div>\n\n <Button variant=\"text\" icon={ChevronRight} onClick={handleNextYear} />\n </>\n ) : (\n <>\n <Button variant=\"text\" icon={ChevronLeft} onClick={handlePrevMonth} />\n\n <div className={'eidos-calendar-selectors'}>\n <Select\n options={monthOptions}\n value={currentDate.month().toString()}\n onChange={handleMonthSelect}\n clearable={false}\n dropdownProps={{\n dropdownGroup: 'calendar-navigation',\n }}\n />\n <Select\n options={yearOptions}\n value={currentDate.year().toString()}\n onChange={handleYearSelect}\n clearable={false}\n dropdownProps={{\n dropdownGroup: 'calendar-navigation',\n }}\n />\n </div>\n\n <Button variant=\"text\" icon={ChevronRight} onClick={handleNextMonth} />\n </>\n )\n ) : (\n <div className={'eidos-calendar-label'}>\n {currentDate.format(granularity === 'month' ? 'YYYY' : 'MMMM YYYY')}\n </div>\n )}\n </div>\n\n {/* Calendar grid */}\n {granularity === 'month' ? (\n <div className={'eidos-calendar-month-cells'}>\n {monthCells.map((month, index) => (\n <button\n key={index}\n type=\"button\"\n className={`eidos-calendar-date-cell eidos-calendar-month-cell ${month.isToday ? 'eidos-calendar-today' : ''} ${month.isSelected ? 'eidos-calendar-selected' : ''} ${month.isDisabled ? 'eidos-calendar-disabled' : ''} ${month.isRangeStart ? 'eidos-calendar-range-start' : ''} ${month.isRangeEnd ? 'eidos-calendar-range-end' : ''} ${month.isInRange ? 'eidos-calendar-in-range' : ''}`.trim()}\n onClick={() => !month.isDisabled && handleDateClick(month.date)}\n disabled={month.isDisabled}\n >\n {month.date.format('MMM')}\n </button>\n ))}\n </div>\n ) : (\n <div className={'eidos-calendar-grid'}>\n {/* Week numbers column (optional) */}\n {showWeekNumbers && (\n <div className={'eidos-calendar-week-numbers-column'}>\n <div className={'eidos-calendar-week-number-header'}></div>\n {Array.from({ length: 6 }, (_, weekIndex) => {\n const weekStart = calendarDays[weekIndex * 7].date;\n return (\n <div key={weekIndex} className={'eidos-calendar-week-number'}>\n {weekStart.format('W')}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Main calendar content */}\n <div className={'eidos-calendar-content'}>\n {/* Weekday headers */}\n <div className={'eidos-calendar-week-days'}>\n {weekDays.map((day, index) => (\n <div key={index} className={'eidos-calendar-week-day'}>\n {day}\n </div>\n ))}\n </div>\n\n {/* Date cells */}\n <div className={'eidos-calendar-date-cells'}>\n {calendarDays.map((day, index) => (\n <button\n key={index}\n type=\"button\"\n className={`eidos-calendar-date-cell ${!day.isCurrentMonth ? 'eidos-calendar-other-month' : ''} ${day.isToday ? 'eidos-calendar-today' : ''} ${day.isSelected ? 'eidos-calendar-selected' : ''} ${day.isDisabled ? 'eidos-calendar-disabled' : ''} ${day.isRangeStart ? 'eidos-calendar-range-start' : ''} ${day.isRangeEnd ? 'eidos-calendar-range-end' : ''} ${day.isInRange ? 'eidos-calendar-in-range' : ''}`.trim()}\n onClick={() => !day.isDisabled && handleDateClick(day.date)}\n disabled={day.isDisabled}\n >\n {day.date.date()}\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { Input } from '../Input/Input.component';\nimport type { TimeValue } from './DatePicker.types';\n\nexport interface TimeInputProps {\n value: TimeValue;\n onChange: (time: TimeValue) => void;\n includeSeconds?: boolean;\n disabled?: boolean;\n label?: string;\n}\n\nexport const TimeInput: React.FC<TimeInputProps> = ({\n value,\n onChange,\n includeSeconds = false,\n disabled = false,\n label = 'Time',\n}) => {\n const [hours, setHours] = useState(value.hours.toString().padStart(2, '0'));\n const [minutes, setMinutes] = useState(value.minutes.toString().padStart(2, '0'));\n const [seconds, setSeconds] = useState((value.seconds || 0).toString().padStart(2, '0'));\n\n // Update local state when value prop changes\n useEffect(() => {\n setHours(value.hours.toString().padStart(2, '0'));\n setMinutes(value.minutes.toString().padStart(2, '0'));\n setSeconds((value.seconds || 0).toString().padStart(2, '0'));\n }, [value]);\n\n const handleTimeChange = useCallback(\n (newHours: number, newMinutes: number, newSeconds: number) => {\n onChange({\n hours: newHours,\n minutes: newMinutes,\n seconds: newSeconds,\n });\n },\n [onChange],\n );\n\n const handleHoursChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newHours = Math.max(0, Math.min(23, parseInt(e.target.value) || 0));\n setHours(newHours.toString().padStart(2, '0'));\n handleTimeChange(newHours, value.minutes, value.seconds || 0);\n },\n [handleTimeChange, value.minutes, value.seconds],\n );\n\n const handleMinutesChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newMinutes = Math.max(0, Math.min(59, parseInt(e.target.value) || 0));\n setMinutes(newMinutes.toString().padStart(2, '0'));\n handleTimeChange(value.hours, newMinutes, value.seconds || 0);\n },\n [handleTimeChange, value.hours, value.seconds],\n );\n\n const handleSecondsChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newSeconds = Math.max(0, Math.min(59, parseInt(e.target.value) || 0));\n setSeconds(newSeconds.toString().padStart(2, '0'));\n handleTimeChange(value.hours, value.minutes, newSeconds);\n },\n [handleTimeChange, value.hours, value.minutes],\n );\n\n return (\n <div className={'eidos-time-input'}>\n {label && <label className={'eidos-time-input-label'}>{label}</label>}\n <div className={'eidos-time-input-inputs'}>\n <div className={'eidos-time-input-input-group'}>\n <Input\n type=\"number\"\n value={hours}\n onChange={handleHoursChange}\n disabled={disabled}\n min={0}\n max={23}\n placeholder=\"HH\"\n size=\"sm\"\n className={'eidos-time-input-time-field'}\n />\n <span className={'eidos-time-input-separator'}>:</span>\n </div>\n <div className={'eidos-time-input-input-group'}>\n <Input\n type=\"number\"\n value={minutes}\n onChange={handleMinutesChange}\n disabled={disabled}\n min={0}\n max={59}\n placeholder=\"MM\"\n size=\"sm\"\n className={'eidos-time-input-time-field'}\n />\n {includeSeconds && <span className={'eidos-time-input-separator'}>:</span>}\n </div>\n {includeSeconds && (\n <div className={'eidos-time-input-input-group'}>\n <Input\n type=\"number\"\n value={seconds}\n onChange={handleSecondsChange}\n disabled={disabled}\n min={0}\n max={59}\n placeholder=\"SS\"\n size=\"sm\"\n className={'eidos-time-input-time-field'}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-2ZENLZEQ.cjs","../src/components/DataGrid/DataGrid.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-2ZENLZEQ.cjs","sourcesContent":[null,"import React, { useState, useEffect, useRef, useCallback, useMemo, useLayoutEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n GripVertical,\n ArrowUp,\n ArrowDown,\n ChevronsUpDown,\n ChevronRight,\n X,\n Plus,\n AlignJustify,\n Check,\n FolderOpen,\n SearchX,\n MoreVertical,\n} from 'lucide-react';\nimport {\n DndContext,\n PointerSensor,\n KeyboardSensor,\n useSensor,\n useSensors,\n closestCenter,\n} from '@dnd-kit/core';\nimport type { DragEndEvent } from '@dnd-kit/core';\nimport {\n SortableContext,\n verticalListSortingStrategy,\n useSortable,\n arrayMove,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { Button } from '../Button';\nimport { SplitButton } from '../SplitButton';\nimport { Input } from '../Input/Input.component';\nimport { Select } from '../Select/Select.component';\nimport { Combobox } from '../Combobox';\nimport { SegmentedControl } from '../SegmentedControl';\nimport { Checkbox } from '../Checkbox/Checkbox.component';\nimport { Spinner } from '../Spinner/Spinner.component';\nimport { Pagination } from '../Pagination';\nimport { EmptyState } from '../EmptyState';\nimport { Dropdown } from '../Dropdown';\nimport { Menu } from '../Menu';\nimport type { MenuItemType } from '../Menu';\nimport { TableFiltersDropdown } from '../Table/TableFiltersDropdown.component';\nimport type { FilterValue, TableColumn, TableFilters } from '../Table/Table.types';\nimport type {\n DataGridProps,\n DataGridActionsColumn,\n DataGridCellType,\n DataGridFilterField,\n DataGridQuickFilter,\n DataGridSelectOption,\n EditingCell,\n} from './DataGrid.types';\nimport { renderIcon } from '../../utils';\nimport type { RowKey } from '../../utils';\nimport './DataGrid.scss';\n\n// Minimum usable width (px) for a single table column - used to derive an\n// automatic card-view threshold from the number of displayed columns, so a\n// grid with many columns doesn't have to overflow horizontally before\n// `cardViewBreakpoint` (a single, hand-tuned number) is reached. See\n// `isCardView` below.\nconst MIN_COLUMN_WIDTH_PX = 100;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal column + row access\n//\n// The public `DataGridColumn<T>` is a discriminated union, which is what lets\n// a consumer's `key` be checked against `keyof T` and gives `renderCell` /\n// `renderEditor` / `validate` the field's own value type instead of `unknown`.\n//\n// Internally the grid walks `columns` generically: it probes members that\n// exist on only one variant (`validate` on value columns, `actions` on the\n// actions column) and looks row fields up by a runtime string key. Narrowing\n// the union at each of those ~30 sites would add a lot of noise for no added\n// safety - the union is enforced where it matters, at the consumer's call\n// site - so the grid widens it once, here, and the render code below is\n// unchanged from when `DataGridColumn` was a single flat interface.\n// ─────────────────────────────────────────────────────────────────────────────\ntype InternalColumn<T extends object> = Omit<DataGridActionsColumn<T>, 'type' | 'key'> & {\n /**\n * Widened to a required plain string. Only the actions variant may omit\n * `key`, and it never reaches a path that consumes one: it renders in its\n * own dedicated slot with a hard-coded `data-col-key=\"__actions__\"`, and is\n * filtered out of `dataColumns` / `sortedColumns`.\n */\n key: string;\n type?: DataGridCellType;\n editable?: boolean;\n required?: boolean;\n options?: DataGridSelectOption[];\n validate?: (value: unknown) => string | true;\n renderCell?: (value: unknown, row: T, rowIndex: number) => React.ReactNode;\n renderEditor?: (value: unknown, onChange: (v: unknown) => void, row: T) => React.ReactNode;\n};\n\n/** Reads a row field by a runtime string key - see `InternalColumn` above. */\nconst cellOf = <T extends object>(row: T, key: string): unknown =>\n (row as Record<string, unknown>)[key];\n\n// Value of the reset (\"All\") segment a quick filter's SegmentedControl always\n// prepends - a SegmentedControl has no empty state of its own, so it needs an\n// explicit segment standing for \"no filter\".\nconst QUICK_FILTER_RESET_VALUE = '';\n\n// Whether a filter value is meaningful enough to keep in the filter state.\n// Empty values are *deleted* from it rather than stored as '' / [], so the\n// key count stays an accurate \"are any filters active?\" signal - that's what\n// drives the \"No results found\" empty state and the dropdown's active\n// indicator.\nconst hasFilterValue = (value: FilterValue): boolean => {\n if (value === undefined || value === null || value === '') return false;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object' && 'start' in value) return !!(value.start || value.end);\n return true;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SortableTableRow - wraps a <tr> with dnd-kit sortable behaviour.\n//\n// Render-prop pattern: passes `dragHandleProps` down to whichever child element\n// should be the drag handle (typically the grip icon's <span>), so the <tr>\n// itself owns the DOM ref + layout-transform while the handle owns the listeners.\n// Pass `disabled={true}` when draggableRows is off - useSortable is always\n// called unconditionally to satisfy the Rules of Hooks.\n// ─────────────────────────────────────────────────────────────────────────────\nfunction SortableTableRow({\n id,\n disabled,\n className,\n children,\n}: {\n id: string;\n disabled?: boolean;\n className?: string;\n children: (dragHandleProps: object, isDragging: boolean) => React.ReactNode;\n}): React.ReactElement {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n disabled,\n });\n\n return (\n <tr\n ref={setNodeRef}\n className={[className, isDragging ? 'eidos-datagrid-row--dragging' : '']\n .filter(Boolean)\n .join(' ')}\n style={{\n transform: CSS.Transform.toString(transform),\n transition: transition ?? undefined,\n opacity: isDragging ? 0.4 : 1,\n }}\n {...attributes}\n >\n {children(listeners ?? {}, isDragging)}\n </tr>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useExpandAnimation - drives a row's expanded-content open/close transition.\n// Mirrors the max-height technique AccordionItem uses, so row expansion\n// animates consistently with Accordion elsewhere in the library - but also\n// keeps tracking the content's height for as long as the panel stays open\n// (via ResizeObserver on the unclipped inner node), not just once at the\n// moment it opens. Content whose height changes after opening - e.g. an\n// async fetch resolving into more/less content than a loading placeholder -\n// would otherwise stay clipped at whatever height was measured on open.\n//\n// Content stays mounted through the close animation (so it can transition\n// shut instead of vanishing instantly), but is never mounted before the row\n// is actually opened for the first time - so `renderExpandedContent` (which\n// may kick off a data fetch) never runs for a row nobody has expanded.\n//\n// Must be called from its own per-row component (not inline in a .map()\n// callback) so the number of hook calls stays constant across renders\n// regardless of how many rows are currently displayed.\n// ─────────────────────────────────────────────────────────────────────────────\nfunction useExpandAnimation(isOpen: boolean): {\n mounted: boolean;\n maxHeight: number;\n outerRef: React.RefObject<HTMLDivElement | null>;\n innerRef: React.RefObject<HTMLDivElement | null>;\n handleTransitionEnd: () => void;\n} {\n // outerRef: the clipped, max-height/overflow-hidden wrapper actually\n // animated - its own rendered height is pinned by `maxHeight` below, so it\n // can't be the thing observed for size changes (see innerRef).\n const outerRef = useRef<HTMLDivElement>(null);\n // innerRef: the unconstrained content itself - always laid out at its\n // natural height regardless of the outer wrapper's clipping, so its size\n // genuinely changes when its content does. That's what ResizeObserver\n // needs to be watching.\n const innerRef = useRef<HTMLDivElement>(null);\n const [maxHeight, setMaxHeight] = useState(0);\n const [mounted, setMounted] = useState(isOpen);\n\n useEffect(() => {\n if (isOpen) setMounted(true);\n }, [isOpen]);\n\n useEffect(() => {\n if (!mounted) return;\n\n if (!isOpen) {\n setMaxHeight(0);\n return;\n }\n\n const node = innerRef.current;\n if (!node) return;\n\n const update = () => setMaxHeight(node.scrollHeight);\n update();\n\n const observer = new ResizeObserver(update);\n observer.observe(node);\n return () => observer.disconnect();\n }, [isOpen, mounted]);\n\n const handleTransitionEnd = useCallback(() => {\n if (!isOpen) setMounted(false);\n }, [isOpen]);\n\n return { mounted, maxHeight, outerRef, innerRef, handleTransitionEnd };\n}\n\n// Table mode: one extra full-width <tr> rendered directly after an expanded\n// row - see `expandable`/`renderExpandedContent` on DataGridProps.\nfunction ExpandedTableRow({\n isOpen,\n colSpan,\n render,\n}: {\n isOpen: boolean;\n colSpan: number;\n render: () => React.ReactNode;\n}): React.ReactElement | null {\n const { mounted, maxHeight, outerRef, innerRef, handleTransitionEnd } =\n useExpandAnimation(isOpen);\n if (!mounted) return null;\n\n return (\n <tr className=\"eidos-datagrid-expanded-row\">\n <td colSpan={colSpan} className=\"eidos-datagrid-expanded-cell\">\n <div\n ref={outerRef}\n className=\"eidos-datagrid-expand-panel\"\n style={{ maxHeight: `${maxHeight}px` }}\n onTransitionEnd={handleTransitionEnd}\n >\n <div ref={innerRef} className=\"eidos-datagrid-expand-panel-inner\">\n {render()}\n </div>\n </div>\n </td>\n </tr>\n );\n}\n\n// Card mode: the same animated panel, appended inside the card itself below\n// its fields.\nfunction ExpandedCardPanel({\n isOpen,\n render,\n}: {\n isOpen: boolean;\n render: () => React.ReactNode;\n}): React.ReactElement | null {\n const { mounted, maxHeight, outerRef, innerRef, handleTransitionEnd } =\n useExpandAnimation(isOpen);\n if (!mounted) return null;\n\n return (\n <div\n ref={outerRef}\n className=\"eidos-datagrid-expand-panel\"\n style={{ maxHeight: `${maxHeight}px` }}\n onTransitionEnd={handleTransitionEnd}\n >\n <div ref={innerRef} className=\"eidos-datagrid-expand-panel-inner\">\n {render()}\n </div>\n </div>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Inner implementation (generic function so we can assign .displayName cleanly)\n// ─────────────────────────────────────────────────────────────────────────────\nfunction DataGridInner<T extends object>({\n // ── Existing props ─────────────────────────────────────────────────────────\n columns: columnsProp,\n data,\n rowKey,\n onChange,\n onRowAdd,\n editable = false,\n loading = false,\n emptyText = 'No data available',\n className,\n stickyHeader = false,\n maxHeight,\n showRowNumbers = false,\n draggableRows = false,\n onRowReorder,\n // ── Sorting ────────────────────────────────────────────────────────────────\n currentSort,\n onSortChange,\n // ── Filtering ──────────────────────────────────────────────────────────────\n showFilters = false,\n filterConfig = [],\n filters,\n onFiltersChange,\n // ── Quick filters ──────────────────────────────────────────────────────────\n quickFilters = [],\n // ── Pagination ─────────────────────────────────────────────────────────────\n showPagination = false,\n pageSize = 10,\n pageSizeOptions,\n totalRows: totalRowsProp,\n onPageChange,\n // ── Row selection + bulk actions ───────────────────────────────────────────\n selectable = false,\n selectedRows: controlledSelectedRows,\n defaultSelectedRows,\n onSelectionChange,\n bulkActions,\n // ── Row expansion ────────────────────────────────────────────────────────────\n expandable = false,\n renderExpandedContent,\n isRowExpandable,\n expandMultiple = true,\n expandedRows: controlledExpandedRows,\n defaultExpandedRows,\n onExpandedRowsChange,\n // ── Display ────────────────────────────────────────────────────────────────\n density = 'comfortable',\n showDensity = false,\n // ── Card view ────────────────────────────────────────────────────────────────\n hasCardView = true,\n cardViewBreakpoint = 640,\n cardMinWidth = 280,\n}: DataGridProps<T>): React.ReactElement {\n // See `InternalColumn` above - a cast, not a copy, so the identity\n // comparisons below (`c !== actionsColumn`) still hold.\n const columns = columnsProp as InternalColumn<T>[];\n // `rowKey` is `RowKey<T>` publicly, so the `'id'` default can't live in the\n // destructuring: `'id'` isn't a field of every `T`.\n const rowKeyField: string = rowKey ?? 'id';\n // ── State + paired refs (editing - preserved exactly) ─────────────────────\n // We keep a ref alongside each piece of mutable state so that event\n // handlers registered in effects can always read the *latest* value without\n // stale-closure bugs, while the state variables drive re-renders normally.\n\n const [localData, _setLocalData] = useState<T[]>(data);\n const localDataRef = useRef<T[]>(data);\n\n const [editingCell, _setEditingCell] = useState<EditingCell>(null);\n const editingCellRef = useRef<EditingCell>(null);\n\n const [editValue, _setEditValue] = useState<unknown>(null);\n const editValueRef = useRef<unknown>(null);\n\n const [editError, setEditError] = useState<string | null>(null);\n\n // ── Validation error tooltip (portaled) ─────────────────────────────────────\n // Positioned via a portal into document.body rather than `position: absolute`\n // inside the cell - a cell on the last visible row would otherwise place the\n // tooltip past the scroll container's bottom edge, which still counts toward\n // that container's scrollable content size and forces an unwanted scrollbar\n // just to reveal a tooltip nobody asked to scroll to. Portaling escapes the\n // scroll container's box entirely, the same way Dropdown's own content does.\n // HTMLElement (not HTMLTableCellElement) so the same ref can anchor either\n // a <td> in table mode or a card field <div> in card view - only\n // `getBoundingClientRect()` is ever called on it.\n const errorTooltipAnchorRef = useRef<HTMLElement | null>(null);\n const [errorTooltipPosition, setErrorTooltipPosition] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const activeCellError = editingCell && editError ? editError : null;\n\n useLayoutEffect(() => {\n if (!activeCellError) {\n setErrorTooltipPosition(null);\n return;\n }\n\n const updatePosition = () => {\n const node = errorTooltipAnchorRef.current;\n if (!node) return;\n const rect = node.getBoundingClientRect();\n setErrorTooltipPosition({ top: rect.bottom + 4, left: rect.left });\n };\n\n updatePosition();\n\n // Capture phase catches scroll events from any scrollable ancestor\n // (e.g. this grid's own scroll container), not just window/document -\n // `scroll` doesn't bubble, so a plain (bubble-phase) listener on window\n // would miss it entirely.\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition, true);\n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition, true);\n };\n }, [activeCellError]);\n\n // ── New state ──────────────────────────────────────────────────────────────\n // Density (internal when showDensity=true, otherwise respects the prop)\n const [internalDensity, setInternalDensity] = useState<'compact' | 'comfortable' | 'spacious'>(\n density,\n );\n const effectiveDensity = showDensity ? internalDensity : density;\n\n // Sorting (client-side internal state)\n const [internalSort, setInternalSort] = useState<{\n key: string;\n direction: 'asc' | 'desc';\n } | null>(null);\n\n // Filtering (client-side internal state), seeded from any quick filter\n // `defaultValue`s. Lazy, so it only reads `quickFilters` on mount - later\n // edits to the array's default values don't yank a filter the user has\n // since changed. In server-side mode this state is unused entirely, which\n // is why `defaultValue` is documented as client-side only.\n const [internalFilters, setInternalFilters] = useState<TableFilters>(() => {\n const seeded: TableFilters = {};\n quickFilters.forEach(({ key, defaultValue }) => {\n if (hasFilterValue(defaultValue)) seeded[key] = defaultValue;\n });\n return seeded;\n });\n\n // Pagination\n const [currentPage, setCurrentPage] = useState(1);\n const [currentPageSize, setCurrentPageSize] = useState(pageSize);\n\n // Selection\n const isControlledSelection = controlledSelectedRows !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<Set<string>>(\n () => new Set(defaultSelectedRows ?? []),\n );\n\n // Row expansion\n const isControlledExpansion = controlledExpandedRows !== undefined;\n const [internalExpandedKeys, setInternalExpandedKeys] = useState<Set<string>>(\n () => new Set(defaultExpandedRows ?? []),\n );\n\n // Card view: measured off the grid's own container width (not the\n // viewport) via ResizeObserver, so it responds correctly even when the\n // grid sits in a narrow sidebar/split-pane on an otherwise wide screen.\n // Starts `null` (unmeasured) rather than 0, so the table is what renders\n // for one frame on mount instead of briefly flashing cards.\n const [containerWidth, setContainerWidth] = useState<number | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n // A callback ref (not `useRef` + a `useLayoutEffect` keyed on `hasCardView`)\n // so this fires whenever the container DOM node actually becomes\n // available, not just when `hasCardView` changes. A plain effect only\n // reruns on its own dependency changing - it does NOT rerun just because\n // a *different* conditional branch attaches the ref for the first time.\n // The `loading` early-return below renders its own container div; any\n // consumer whose `loading` prop starts `true` on mount (e.g. fetching\n // data asynchronously, so it can never resolve before the first render)\n // would mount that div first, find `containerRef.current` still null, and\n // then never re-run the effect once `loading` flips to `false` and the\n // real container mounts - `hasCardView` itself never changed, so nothing\n // triggered a re-run, leaving `containerWidth` (and therefore card view)\n // permanently stuck. A callback ref sidesteps that entirely: whichever\n // container div actually mounts, this runs for it.\n const setContainerRef = useCallback(\n (el: HTMLDivElement | null) => {\n resizeObserverRef.current?.disconnect();\n resizeObserverRef.current = null;\n\n if (!el || !hasCardView) return;\n\n const observer = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width;\n if (width != null) setContainerWidth(width);\n });\n observer.observe(el);\n resizeObserverRef.current = observer;\n },\n [hasCardView],\n );\n // Displayed column count, computed directly from props (available here\n // without waiting on the `dataColumns`/`actionsColumn` memos below) -\n // `columns.length` already includes the actions column if any, matching\n // how `totalCols` is derived further down from `dataColumns.length +\n // (actionsColumn ? 1 : 0)`.\n const columnCountForCardView =\n columns.length +\n (showRowNumbers ? 1 : 0) +\n (draggableRows ? 1 : 0) +\n (selectable ? 1 : 0) +\n (expandable ? 1 : 0);\n\n // Card view kicks in below the explicit `cardViewBreakpoint` OR once the\n // container is too narrow to fit every column at a reasonable minimum\n // width - the latter means a wide/many-column grid auto-switches without\n // the consumer having to hand-calculate a breakpoint for it.\n const isCardView =\n hasCardView &&\n containerWidth !== null &&\n (containerWidth < cardViewBreakpoint ||\n containerWidth < columnCountForCardView * MIN_COLUMN_WIDTH_PX);\n\n // Card view header/subheader: only the first matching column is honored\n // (see DataGridColumn.cardHeader/cardSubheader).\n const cardHeaderColumn = useMemo(() => columns.find((c) => c.cardHeader), [columns]);\n const cardSubheaderColumn = useMemo(() => columns.find((c) => c.cardSubheader), [columns]);\n // The row-actions column, if any - only the first `type: 'actions'` column\n // is honored (see DataGridColumn.actions). Rendered in its own dedicated\n // slot (far right in table mode, top-right of the card in card view),\n // never as a normal data column.\n const actionsColumn = useMemo(() => columns.find((c) => c.type === 'actions'), [columns]);\n // Every column that actually renders as data - excludes the actions\n // column entirely (it's never a normal cell) from both table columns and\n // pinning/filtering/validation logic.\n const dataColumns = useMemo(\n () => columns.filter((c) => c !== actionsColumn),\n [columns, actionsColumn],\n );\n // Remaining columns render as label:value field rows, in declaration order.\n const cardFieldColumns = useMemo(\n () => dataColumns.filter((c) => c !== cardHeaderColumn && c !== cardSubheaderColumn),\n [dataColumns, cardHeaderColumn, cardSubheaderColumn],\n );\n\n // Pinned columns offset map (computed in useLayoutEffect)\n const theadRef = useRef<HTMLTableSectionElement>(null);\n const [pinnedOffsets, setPinnedOffsets] = useState<\n Map<string, { side: 'left' | 'right'; offset: number }>\n >(new Map());\n\n // ── Synced setters (preserved exactly) ────────────────────────────────────\n const setLocalData = useCallback((v: T[]) => {\n localDataRef.current = v;\n _setLocalData(v);\n }, []);\n\n const setEditingCell = useCallback((v: EditingCell) => {\n editingCellRef.current = v;\n _setEditingCell(v);\n }, []);\n\n const setEditValue = useCallback((v: unknown) => {\n editValueRef.current = v;\n _setEditValue(v);\n }, []);\n\n // ── Sync when the data prop changes externally (preserved) ─────────────────\n useEffect(() => {\n setLocalData(data);\n }, [data, setLocalData]);\n\n // ── Active sort / filters (derived) ───────────────────────────────────────\n // Server-side sort: caller controls currentSort + onSortChange.\n // Client-side sort: we manage internalSort.\n const activeSort = currentSort ?? internalSort;\n\n // Server-side filter: caller controls filters + onFiltersChange.\n // Client-side filter: we manage internalFilters.\n const activeFilters: TableFilters = useMemo(\n () => (onFiltersChange ? (filters ?? {}) : internalFilters),\n [onFiltersChange, filters, internalFilters],\n );\n\n // ── Selection derived state ────────────────────────────────────────────────\n const selectedSet = useMemo(\n () =>\n new Set(isControlledSelection ? (controlledSelectedRows ?? []) : [...internalSelectedKeys]),\n [isControlledSelection, controlledSelectedRows, internalSelectedKeys],\n );\n\n const allKeys = useMemo(\n () => localData.map((row, idx) => String(cellOf(row, rowKeyField) ?? idx)),\n [localData, rowKeyField],\n );\n\n const allSelected = allKeys.length > 0 && allKeys.every((k) => selectedSet.has(k));\n const someSelected = !allSelected && allKeys.some((k) => selectedSet.has(k));\n const hasSelection = selectedSet.size > 0;\n\n const selectedItems = useMemo(\n () => localData.filter((row, idx) => selectedSet.has(String(cellOf(row, rowKeyField) ?? idx))),\n [localData, selectedSet, rowKeyField],\n );\n\n // ── Row expansion derived state ─────────────────────────────────────────────\n const expandedSet = useMemo(\n () =>\n new Set(isControlledExpansion ? (controlledExpandedRows ?? []) : [...internalExpandedKeys]),\n [isControlledExpansion, controlledExpandedRows, internalExpandedKeys],\n );\n\n // ── Quick filters: key ownership ───────────────────────────────────────────\n // Quick filters and the filter dropdown share one TableFilters object, so\n // each side has to own a disjoint set of keys - see `dropdownFilters` below\n // for why the dropdown can't just be handed the whole thing.\n const quickFilterKeys = useMemo(() => new Set(quickFilters.map((f) => f.key)), [quickFilters]);\n\n // ── Filter dropdown adapter: DataGridFilterField → TableColumn ─────────────\n // TableFiltersDropdown expects TableColumn<T>[]; we project our (decoupled,\n // column-independent) filter schema onto that shape. A key already claimed\n // by a quick filter is dropped: the quick filter is the always-visible\n // control, and two controls writing one key would each clobber the other.\n const filterDropdownColumns = useMemo((): TableColumn<T>[] => {\n return filterConfig\n .filter((field) => !quickFilterKeys.has(field.key))\n .map(\n (field: DataGridFilterField<T>) =>\n ({\n key: field.key,\n label: field.label,\n filterable: true,\n filterType: field.filterType,\n filterOptions: field.filterOptions,\n dateFilterMode: field.dateFilterMode,\n }) as TableColumn<T>,\n );\n }, [filterConfig, quickFilterKeys]);\n\n const dropdownFilterKeys = useMemo(\n () => new Set(filterDropdownColumns.map((col) => String(col.key))),\n [filterDropdownColumns],\n );\n\n // The dropdown gets only the keys it owns, never the whole filter object.\n // It mirrors every key it's handed into a filter row, so a key it has no\n // matching column for (a quick filter's, or a server-side caller's filter\n // on an unlisted field) would render as a blank, un-removable \"Select\n // column\" row - and its Apply, which emits its complete set, would drop\n // that value on the floor.\n const dropdownFilters = useMemo(\n () =>\n Object.fromEntries(\n Object.entries(activeFilters).filter(([key]) => dropdownFilterKeys.has(key)),\n ),\n [activeFilters, dropdownFilterKeys],\n );\n\n // ── Client-side filtering ──────────────────────────────────────────────────\n const filteredData = useMemo(() => {\n // Server-side mode: parent is responsible for filtering; use data as-is.\n if (onFiltersChange) return localData;\n\n const filterEntries = Object.entries(activeFilters).filter(([, val]) => {\n if (val === undefined || val === null || val === '') return false;\n if (Array.isArray(val) && val.length === 0) return false;\n return true;\n });\n\n if (filterEntries.length === 0) return localData;\n\n return localData.filter((row) =>\n filterEntries.every(([key, filterValue]) => {\n const cellValue = cellOf(row, key);\n\n if (Array.isArray(filterValue)) {\n return filterValue.includes(String(cellValue ?? ''));\n }\n if (typeof filterValue === 'boolean') {\n return Boolean(cellValue) === filterValue;\n }\n if (typeof filterValue === 'object' && filterValue !== null && 'start' in filterValue) {\n const { start, end } = filterValue as { start: string | null; end: string | null };\n const dateStr = String(cellValue ?? '');\n if (start && dateStr < start) return false;\n if (end && dateStr > end) return false;\n return true;\n }\n // Default: case-insensitive text contains\n return String(cellValue ?? '')\n .toLowerCase()\n .includes(String(filterValue).toLowerCase());\n }),\n );\n }, [localData, activeFilters, onFiltersChange]);\n\n // ── Client-side sorting ────────────────────────────────────────────────────\n const sortedData = useMemo(() => {\n // Server-side mode or no active sort: use data as-is.\n if (onSortChange || !activeSort) return filteredData;\n\n return [...filteredData].sort((a, b) => {\n const aVal = cellOf(a, activeSort.key);\n const bVal = cellOf(b, activeSort.key);\n\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n\n const compare =\n typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal));\n\n return activeSort.direction === 'asc' ? compare : -compare;\n });\n }, [filteredData, activeSort, onSortChange]);\n\n // ── Client-side pagination ─────────────────────────────────────────────────\n const displayData = useMemo(() => {\n if (!showPagination) return sortedData;\n if (onPageChange) return sortedData; // Server-side: parent slices the data\n const start = (currentPage - 1) * currentPageSize;\n return sortedData.slice(start, start + currentPageSize);\n }, [sortedData, showPagination, currentPage, currentPageSize, onPageChange]);\n\n const totalItemCount = totalRowsProp ?? sortedData.length;\n const totalPages = Math.max(1, Math.ceil(totalItemCount / currentPageSize));\n\n // Reset to page 1 when filters change (client-side and server-side).\n // Depend on the serialized *value* of activeFilters, not the object\n // reference: in server-side mode activeFilters is derived straight from\n // the caller's `filters` prop, and callers commonly build that object\n // inline in render (a new reference every render) whether or not its\n // contents actually changed. Comparing by reference made this effect -\n // and the page reset it causes - fire on every unrelated parent\n // re-render (e.g. new page data arriving), not just on real filter\n // changes.\n const activeFiltersKey = useMemo(() => JSON.stringify(activeFilters), [activeFilters]);\n useEffect(() => {\n setCurrentPage(1);\n }, [activeFiltersKey]);\n\n // Reset to page 1 when client-side sort changes\n useEffect(() => {\n setCurrentPage(1);\n }, [internalSort]);\n\n // ── Pinned columns: measure th widths and compute sticky offsets ───────────\n // Mirrors the exact pattern used in Table.component.tsx.\n // System columns (sel, drag, rownum, actions) contribute to the offset\n // accumulator but are not themselves sticky-positioned.\n useLayoutEffect(() => {\n const hasPinned = columns.some((c) => c.pin);\n if (!hasPinned || !theadRef.current) {\n setPinnedOffsets((prev) => (prev.size > 0 ? new Map() : prev));\n return;\n }\n\n const headerRow = theadRef.current.querySelector('tr');\n if (!headerRow) return;\n\n const cells = Array.from(headerRow.querySelectorAll<HTMLTableCellElement>('th[data-col-key]'));\n const newOffsets = new Map<string, { side: 'left' | 'right'; offset: number }>();\n\n // Left-pinned: scan left-to-right\n // When any data column is pin:'left', auto-pin the system columns too so\n // the entire frozen-left group moves as a coherent unit.\n const hasLeftPin = columns.some((c) => c.pin === 'left');\n let leftAccum = 0;\n for (const cell of cells) {\n const key = cell.dataset.colKey!;\n if (key === '__expand__' || key === '__sel__' || key === '__drag__' || key === '__rownum__') {\n if (hasLeftPin) {\n newOffsets.set(key, { side: 'left', offset: leftAccum });\n }\n leftAccum += cell.offsetWidth;\n } else {\n const col = columns.find((c) => c.key === key);\n if (col?.pin === 'left') {\n newOffsets.set(key, { side: 'left', offset: leftAccum });\n leftAccum += cell.offsetWidth;\n }\n }\n }\n\n // Right-pinned: scan right-to-left\n let rightAccum = 0;\n for (let i = cells.length - 1; i >= 0; i--) {\n const cell = cells[i];\n const key = cell.dataset.colKey!;\n if (key === '__actions__') {\n rightAccum += cell.offsetWidth;\n } else {\n const col = columns.find((c) => c.key === key);\n if (col?.pin === 'right') {\n newOffsets.set(key, { side: 'right', offset: rightAccum });\n rightAccum += cell.offsetWidth;\n }\n }\n }\n\n setPinnedOffsets(newOffsets);\n }, [columns, selectable, draggableRows, showRowNumbers, expandable]);\n\n // ── Sticky-column helpers ──────────────────────────────────────────────────\n const getCellPinnedProps = useCallback(\n (colKey: string): { style: React.CSSProperties; className: string } => {\n const info = pinnedOffsets.get(colKey);\n if (!info) return { style: {}, className: '' };\n return {\n style: { position: 'sticky', [info.side]: info.offset, zIndex: 1 },\n className:\n info.side === 'left'\n ? 'eidos-datagrid-cell--pinned-left'\n : 'eidos-datagrid-cell--pinned-right',\n };\n },\n [pinnedOffsets],\n );\n\n const getHeaderPinnedProps = useCallback(\n (colKey: string): { style: React.CSSProperties; className: string } => {\n const info = pinnedOffsets.get(colKey);\n if (!info) return { style: {}, className: '' };\n return {\n // z-index 3: above both body sticky cells (1) and non-sticky header (1 from SCSS)\n style: { position: 'sticky', [info.side]: info.offset, zIndex: 3 },\n className:\n info.side === 'left'\n ? 'eidos-datagrid-header-cell--pinned-left'\n : 'eidos-datagrid-header-cell--pinned-right',\n };\n },\n [pinnedOffsets],\n );\n\n // ── Editing helpers (preserved exactly) ────────────────────────────────────\n const isCellEditable = useCallback(\n (col: InternalColumn<T>): boolean => {\n if (!editable) return false;\n if (col.type === 'readonly' || col.type === 'actions') return false;\n if (col.editable === false) return false;\n return true;\n },\n [editable],\n );\n\n const validateCell = useCallback((col: InternalColumn<T>, value: unknown): string | null => {\n if (col.required && (value === '' || value === null || value === undefined)) {\n return 'This field is required';\n }\n if (col.validate) {\n const result = col.validate(value);\n if (result !== true) return result as string;\n }\n return null;\n }, []);\n\n const cellErrorKey = (rowIndex: number, colKey: string) => `${rowIndex}:${colKey}`;\n\n // Cells with a validation error, keyed by `${rowIndex}:${colKey}` - derived\n // directly from the actual data rather than tracked as its own state, so a\n // cell that starts out invalid (e.g. seeded with an empty required field)\n // is flagged immediately on render instead of only after the user has\n // focused and committed it at least once. Recomputes whenever the data\n // actually changes, which already covers every case that needs it: typing\n // a fix and committing, an external `data` prop update, a row being added,\n // etc. Painted as a background tint on every render (see\n // `eidos-data-grid-cell--has-error` below); the more prominent border +\n // text (`eidos-data-grid-cell--error`) only shows while that specific cell\n // is the one being edited, via `editError` (see `startEdit`).\n const cellErrors = useMemo(() => {\n const errors: Record<string, string> = {};\n localData.forEach((row, rowIndex) => {\n for (const col of columns) {\n if (!isCellEditable(col)) continue;\n const error = validateCell(col, cellOf(row, col.key));\n if (error) errors[cellErrorKey(rowIndex, col.key)] = error;\n }\n });\n return errors;\n }, [localData, columns, isCellEditable, validateCell]);\n\n // ── Commit / discard ────────────────────────────────────────────────────────\n /**\n * Validates a cell's value and always persists it (even if invalid - see\n * `commitEdit` below for why). `cellErrors` above picks the result up\n * automatically once `localData` updates. Returns the validation error, if any.\n */\n const commitValue = useCallback(\n (rowIndex: number, colKey: string, value: unknown): string | null => {\n const col = columns.find((c) => c.key === colKey);\n if (!col) return null;\n\n const error = validateCell(col, value);\n\n const newData = localDataRef.current.map<T>((row, idx) =>\n idx === rowIndex ? ({ ...row, [colKey]: value } as T) : row,\n );\n setLocalData(newData);\n onChange?.(newData);\n\n return error;\n },\n [columns, onChange, setLocalData, validateCell],\n );\n\n /**\n * Commits the currently-editing cell and exits edit mode. Never blocks: an\n * invalid value is still saved and flagged via `cellErrors` (see above)\n * rather than trapping the user in the cell - a required field going empty\n * is exactly the case validation is there to catch and surface, not a\n * reason to freeze every other interaction with the grid until it's fixed.\n */\n const commitEdit = useCallback(() => {\n const cell = editingCellRef.current;\n if (!cell) return;\n\n const col = columns.find((c) => c.key === cell.colKey);\n if (!col) {\n setEditingCell(null);\n return;\n }\n\n commitValue(cell.rowIndex, cell.colKey, editValueRef.current);\n setEditingCell(null);\n setEditError(null);\n }, [columns, commitValue, setEditingCell]);\n\n const discardEdit = useCallback(() => {\n setEditingCell(null);\n setEditError(null);\n }, [setEditingCell]);\n\n // Keep a ref to the latest commit so the global handler never captures\n // a stale version, without having the effect re-run on every re-render.\n const commitEditRef = useRef(commitEdit);\n useEffect(() => {\n commitEditRef.current = commitEdit;\n }, [commitEdit]);\n\n // ── Global mousedown: commit on blur - i.e. any click that isn't on the\n // active editor itself ──────────────────────────────────────────────────\n // Using mousedown (fires before blur/click) lets us finalize the active\n // cell before a click elsewhere starts a new edit or does anything else.\n //\n // Deliberately NOT scoped to \"outside the grid container\" - a click on\n // another cell already commits via that cell's own `handleCellClick`\n // (which commits any in-flight edit before starting its own), but a grid\n // has plenty of space that isn't a cell at all: toolbar buttons, sort\n // headers, pagination, row actions, and - especially in card view - the\n // card's own padding, gaps, and labels. None of those have a handler that\n // commits the edit, so scoping this to \"outside the grid\" left the editor\n // stuck open for any click that landed inside the grid but outside an\n // actual cell. The only clicks that should NOT commit are ones still\n // interacting with the editor being edited (identified by its own\n // `--editing` class, shared by both the <td> and card versions) or its\n // portaled dropdown content (eidos-dropdown-content) - e.g. opening a\n // Select's own options list.\n useEffect(() => {\n if (!editingCell) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n const target = e.target as Element;\n\n if (\n target.closest?.(\n '.eidos-data-grid-cell--editing, .eidos-datagrid-card-value--editing, .eidos-dropdown-content',\n )\n ) {\n return;\n }\n\n commitEditRef.current();\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [editingCell]);\n\n // ── Start editing ────────────────────────────────────────────────────────\n const startEdit = useCallback(\n (rowIndex: number, colKey: string, currentValue: unknown) => {\n const col = columns.find((c) => c.key === colKey);\n if (!col || !isCellEditable(col)) return;\n setEditingCell({ rowIndex, colKey });\n setEditValue(currentValue);\n // Re-focusing a cell that's already flagged shows its error\n // immediately, without needing to retype/re-trigger validation first.\n setEditError(cellErrors[cellErrorKey(rowIndex, colKey)] ?? null);\n },\n [columns, isCellEditable, setEditingCell, setEditValue, cellErrors],\n );\n\n // ── Cell click handler (preserved) ─────────────────────────────────────────\n const handleCellClick = useCallback(\n (rowIndex: number, col: InternalColumn<T>) => {\n const row = localDataRef.current[rowIndex];\n const value = row === undefined ? undefined : cellOf(row, col.key);\n\n // Checkbox cells: toggle immediately - no \"edit mode\" UI needed\n if (col.type === 'checkbox') {\n if (!editable || col.editable === false) return;\n const newData = localDataRef.current.map<T>((row, idx) =>\n idx === rowIndex ? ({ ...row, [col.key]: !value } as T) : row,\n );\n setLocalData(newData);\n onChange?.(newData);\n return;\n }\n\n if (!isCellEditable(col)) return;\n\n // Already editing this exact cell - do nothing\n const cell = editingCellRef.current;\n if (cell?.rowIndex === rowIndex && cell?.colKey === col.key) return;\n\n // Commit any in-flight edit first - never blocks navigation, see commitEdit.\n if (cell) commitEdit();\n\n startEdit(rowIndex, col.key, value);\n },\n [editable, isCellEditable, commitEdit, startEdit, setLocalData, onChange],\n );\n\n // ── Keyboard navigation inside an editing cell (preserved) ─────────────────\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent, rowIndex: number, colKey: string) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n discardEdit();\n return;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n commitEdit();\n return;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n\n // Flat list of editable cells in DOM order (over the full dataset)\n const editableCells: Array<{ rowIndex: number; colKey: string }> = [];\n for (let ri = 0; ri < localDataRef.current.length; ri++) {\n for (const c of columns) {\n if (isCellEditable(c)) {\n editableCells.push({ rowIndex: ri, colKey: c.key });\n }\n }\n }\n\n const idx = editableCells.findIndex((c) => c.rowIndex === rowIndex && c.colKey === colKey);\n const next = e.shiftKey ? editableCells[idx - 1] : editableCells[idx + 1];\n\n // Commit the current cell - never blocks navigation, see commitEdit.\n commitValue(rowIndex, colKey, editValueRef.current);\n\n if (next) {\n setEditingCell(next);\n setEditValue(cellOf(localDataRef.current[next.rowIndex], next.colKey));\n setEditError(cellErrors[cellErrorKey(next.rowIndex, next.colKey)] ?? null);\n } else {\n setEditingCell(null);\n setEditError(null);\n }\n }\n },\n [\n columns,\n isCellEditable,\n commitEdit,\n commitValue,\n discardEdit,\n cellErrors,\n setEditingCell,\n setEditValue,\n ],\n );\n\n const handleRowAdd = useCallback(() => {\n if (!onRowAdd) return;\n const newRow = onRowAdd();\n const newData = [newRow, ...localDataRef.current];\n setLocalData(newData);\n onChange?.(newData);\n setCurrentPage(1);\n }, [onRowAdd, onChange, setLocalData]);\n\n // ── Selection handlers ──────────────────────────────────────────────────────\n const commitSelection = useCallback(\n (keys: string[]) => {\n if (!isControlledSelection) setInternalSelectedKeys(new Set(keys));\n const rows = localDataRef.current.filter((row, idx) =>\n keys.includes(String(cellOf(row, rowKeyField) ?? idx)),\n );\n onSelectionChange?.(keys, rows);\n },\n [isControlledSelection, rowKeyField, onSelectionChange],\n );\n\n const toggleRow = useCallback(\n (key: string) => {\n const next = selectedSet.has(key)\n ? [...selectedSet].filter((k) => k !== key)\n : [...selectedSet, key];\n commitSelection(next);\n },\n [selectedSet, commitSelection],\n );\n\n const toggleAll = useCallback(() => {\n commitSelection(allSelected ? [] : allKeys);\n }, [allSelected, allKeys, commitSelection]);\n\n const clearSelection = useCallback(() => commitSelection([]), [commitSelection]);\n\n // ── Row expansion handlers ───────────────────────────────────────────────────\n const commitExpanded = useCallback(\n (keys: string[]) => {\n if (!isControlledExpansion) setInternalExpandedKeys(new Set(keys));\n onExpandedRowsChange?.(keys);\n },\n [isControlledExpansion, onExpandedRowsChange],\n );\n\n const toggleExpanded = useCallback(\n (key: string) => {\n const isOpen = expandedSet.has(key);\n const next = expandMultiple\n ? isOpen\n ? [...expandedSet].filter((k) => k !== key)\n : [...expandedSet, key]\n : isOpen\n ? []\n : [key];\n commitExpanded(next);\n },\n [expandedSet, expandMultiple, commitExpanded],\n );\n\n // ── Sort handler ────────────────────────────────────────────────────────────\n const handleSortClick = useCallback(\n (colKey: string) => {\n if (onSortChange) {\n // Server-side: delegate to parent\n const newDir =\n currentSort?.key === colKey && currentSort?.direction === 'asc' ? 'desc' : 'asc';\n // `colKey` came from a rendered column, so it is a field of `T` by\n // construction - the public callback is narrowed for the caller's\n // benefit, which this internal string can't prove on its own.\n onSortChange(colKey as RowKey<T>, newDir);\n } else {\n // Client-side: cycle asc → desc → unsorted (null)\n setInternalSort((prev) => {\n if (prev?.key === colKey) {\n return prev.direction === 'asc' ? { key: colKey, direction: 'desc' } : null;\n }\n return { key: colKey, direction: 'asc' };\n });\n }\n },\n [onSortChange, currentSort],\n );\n\n // ── Filter handlers ──────────────────────────────────────────────────────────\n const commitFilters = useCallback(\n (newFilters: TableFilters) => {\n setCurrentPage(1);\n if (onFiltersChange) {\n onFiltersChange(newFilters);\n } else {\n setInternalFilters(newFilters);\n }\n },\n [onFiltersChange],\n );\n\n // The dropdown's writer. It emits its complete cleaned set, covering only\n // the keys it owns, so everything else in the filter state - quick filters\n // included - has to be merged back in rather than replaced. This is also\n // what makes its \"Clear All\" clear only the dropdown's own filters.\n const handleFiltersChange = useCallback(\n (newFilters: TableFilters) => {\n const preserved = Object.entries(activeFilters).filter(\n ([key]) => !dropdownFilterKeys.has(key),\n );\n commitFilters({ ...Object.fromEntries(preserved), ...newFilters });\n },\n [activeFilters, dropdownFilterKeys, commitFilters],\n );\n\n // A quick filter's writer. Empty values delete the key instead of storing\n // '' / [] - see `hasFilterValue`.\n const handleQuickFilterChange = useCallback(\n (key: string, value: FilterValue) => {\n const next = { ...activeFilters };\n if (hasFilterValue(value)) {\n next[key] = value;\n } else {\n delete next[key];\n }\n commitFilters(next);\n },\n [activeFilters, commitFilters],\n );\n\n // Resets every filter, whichever control owns it - what the \"no results\"\n // empty state offers, unlike the dropdown's own scoped \"Clear All\".\n const clearAllFilters = useCallback(() => commitFilters({}), [commitFilters]);\n\n // ── Page handlers ────────────────────────────────────────────────────────────\n const handlePageChange = useCallback(\n (page: number) => {\n setCurrentPage(page);\n onPageChange?.(page, currentPageSize);\n },\n [currentPageSize, onPageChange],\n );\n\n const handlePageSizeChange = useCallback(\n (newPageSize: number) => {\n setCurrentPageSize(newPageSize);\n setCurrentPage(1);\n onPageChange?.(1, newPageSize);\n },\n [onPageChange],\n );\n\n // ── dnd-kit: sensors + drag-end handler (preserved) ───────────────────────\n // Sensors are always initialised (hook rules) - PointerSensor's distance\n // constraint prevents accidental drags on normal cell clicks.\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor),\n );\n\n const handleRowDragEnd = useCallback(\n (event: DragEndEvent) => {\n if (!draggableRows) return; // belt-and-suspenders\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n const oldIndex = localDataRef.current.findIndex(\n (row, i) => String(cellOf(row, rowKeyField) ?? i) === String(active.id),\n );\n const newIndex = localDataRef.current.findIndex(\n (row, i) => String(cellOf(row, rowKeyField) ?? i) === String(over.id),\n );\n\n if (oldIndex === -1 || newIndex === -1) return;\n\n const newData = arrayMove(localDataRef.current, oldIndex, newIndex);\n setLocalData(newData);\n onChange?.(newData);\n onRowReorder?.(newData);\n },\n [draggableRows, rowKeyField, setLocalData, onChange, onRowReorder],\n );\n\n // ── Cell content renderers (preserved exactly) ─────────────────────────────\n const renderViewCell = (\n col: InternalColumn<T>,\n value: unknown,\n row: T,\n rowIndex: number,\n ): React.ReactNode => {\n if (col.renderCell) return col.renderCell(value, row, rowIndex);\n\n switch (col.type) {\n case 'checkbox':\n // The <td> onClick handles toggling; onChange is a no-op here so that\n // the controlled Checkbox doesn't re-toggle via its own handler.\n return (\n <Checkbox\n checked={Boolean(value)}\n onChange={() => {\n /* handled by td onClick */\n }}\n size=\"sm\"\n />\n );\n\n case 'select': {\n const option = col.options?.find((o) => o.value === String(value ?? ''));\n return <span>{option ? option.label : String(value ?? '')}</span>;\n }\n\n case 'readonly':\n case 'text':\n case 'number':\n case 'date':\n default:\n return <span>{String(value ?? '')}</span>;\n }\n };\n\n // `variant`/`size` default to the table cell's look: 'bare' has no border/\n // background/radius of its own so the surrounding <td>'s own inset ring\n // (`.eidos-data-grid-cell--editing`) reads as the field's border, and\n // 'sm' keeps the editor from growing the row's height. A card field isn't\n // sitting inside that ring - it's a standalone field in a stack, so it\n // should just look like any other standalone Input/Select in the design\n // system (their own component defaults), not the table's cell-shaped\n // variant. Passing `undefined` here (rather than omitting the prop) is\n // equivalent to omitting it - falls back to each component's own default.\n const renderEditCell = (\n col: InternalColumn<T>,\n value: unknown,\n row: T,\n rowIndex: number,\n context: 'table' | 'card' = 'table',\n ): React.ReactNode => {\n if (col.renderEditor) {\n return col.renderEditor(value, (v) => setEditValue(v), row);\n }\n\n const variant = context === 'table' ? 'bare' : undefined;\n const size = context === 'table' ? 'sm' : undefined;\n\n switch (col.type) {\n case 'number':\n return (\n <Input\n type=\"number\"\n variant={variant}\n size={size}\n value={String(value ?? '')}\n onChange={(e) => setEditValue(e.target.value)}\n autoFocus\n fullWidth\n clearable={false}\n />\n );\n\n case 'date':\n return (\n <Input\n type=\"date\"\n variant={variant}\n size={size}\n value={String(value ?? '')}\n onChange={(e) => setEditValue(e.target.value)}\n autoFocus\n fullWidth\n clearable={false}\n />\n );\n\n case 'select': {\n // Auto-commit as soon as the user picks an option; the Dropdown's portal\n // means we can't rely on a simple onBlur for this cell type.\n // autoOpen=true so the dropdown opens on the same click that entered\n // edit mode - no second click needed.\n const selectOptions = (col.options ?? []).map((o) => ({\n id: o.value,\n value: o.value,\n label: o.label,\n }));\n\n return (\n <Select\n options={selectOptions}\n value={String(value ?? '')}\n autoOpen\n fullWidth\n inputProps={{ variant, size }}\n onChange={(v) => {\n const selected = Array.isArray(v) ? (v[0] ?? '') : v;\n const newData = localDataRef.current.map<T>((r, i) =>\n i === rowIndex ? ({ ...r, [col.key]: selected } as T) : r,\n );\n setLocalData(newData);\n onChange?.(newData);\n setEditingCell(null);\n }}\n clearable={false}\n />\n );\n }\n\n default:\n return (\n <Input\n type=\"text\"\n variant={variant}\n size={size}\n value={String(value ?? '')}\n onChange={(e) => setEditValue(e.target.value)}\n autoFocus\n fullWidth\n clearable={false}\n />\n );\n }\n };\n\n // ── Card view cell value ─────────────────────────────────────────────────\n // Mirrors the <td> cell's click/edit/error-state wiring in `renderViewCell`/\n // `renderEditCell` above, just wrapped in a plain <div> so it can sit\n // either in a card's label:value field row or its header/subheader - both\n // stay just as editable as any table cell.\n const renderCardValue = (\n col: InternalColumn<T>,\n row: T,\n localIndex: number,\n baseClassName: string,\n ): React.ReactNode => {\n const value = cellOf(row, col.key);\n const isEditing = editingCell?.rowIndex === localIndex && editingCell?.colKey === col.key;\n const canEdit = isCellEditable(col);\n const isFlagged = cellErrorKey(localIndex, col.key) in cellErrors;\n const hasError = isEditing && Boolean(editError);\n\n const valueCls = [\n baseClassName,\n // Deliberately NOT `eidos-data-grid-cell--editing` (unlike the <td>\n // version of this same state) - that class's whole job is forcing the\n // editor into `position: absolute; inset: 0` so it fills a <td>\n // without changing the table row's height. A card field has no row\n // to preserve the height of, so it just needs its own \"is editing\"\n // hook for spacing - the editor itself renders normally, with each\n // component's own default (non-`bare`) look (see `renderEditCell`).\n isEditing && 'eidos-datagrid-card-value--editing',\n hasError && 'eidos-data-grid-cell--error',\n isFlagged && !hasError && 'eidos-data-grid-cell--has-error',\n canEdit && !isEditing && 'eidos-data-grid-cell--editable',\n col.type === 'readonly' && 'eidos-data-grid-cell--readonly',\n // Checkbox glyph is intrinsically narrow - without this the value\n // wrapper stretches to the card's full width (block layout), making\n // the whole row clickable/toggleable instead of just the checkbox.\n col.type === 'checkbox' && 'eidos-datagrid-card-value--checkbox',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={\n hasError ? (errorTooltipAnchorRef as React.RefObject<HTMLDivElement | null>) : undefined\n }\n className={valueCls}\n onClick={() => handleCellClick(localIndex, col)}\n onKeyDown={isEditing ? (e) => handleKeyDown(e, localIndex, col.key) : undefined}\n tabIndex={isEditing ? -1 : undefined}\n >\n {isEditing\n ? renderEditCell(col, editValue, row, localIndex, 'card')\n : renderViewCell(col, value, row, localIndex)}\n </div>\n );\n };\n\n // Label-above-value field, stacked - used for every column that isn't the\n // card's header/subheader.\n const renderCardField = (col: InternalColumn<T>, row: T, localIndex: number): React.ReactNode => (\n <div key={col.key} className=\"eidos-datagrid-card-field\">\n <span className=\"eidos-datagrid-card-field-label\">{col.header}</span>\n {renderCardValue(col, row, localIndex, 'eidos-datagrid-card-field-value')}\n </div>\n );\n\n // ── Row-actions menu (type: 'actions' column) ──────────────────────────────\n // Shared between the table's dedicated actions <td> and the card's\n // top-right toolbar slot - see `actionsColumn`/`DataGridColumn.actions`.\n // Renders nothing if there's no actions column, or it has no actions.\n const renderActionsMenu = (row: T, localIndex: number): React.ReactNode => {\n if (!actionsColumn) return null;\n\n const items: MenuItemType[] = actionsColumn.renderActions\n ? actionsColumn.renderActions(row, localIndex)\n : (actionsColumn.actions ?? []).flatMap((action, index) => {\n const id = action.id ?? `${action.label}-${index}`;\n const isDisabled =\n typeof action.disabled === 'function' ? action.disabled(row) : Boolean(action.disabled);\n\n const item: MenuItemType = {\n id,\n type: 'item',\n label: action.label,\n icon: action.icon,\n disabled: isDisabled,\n color: action.danger ? 'danger' : undefined,\n onClick: () => action.onClick(row, localIndex),\n };\n\n return action.divider\n ? [{ id: `${id}-divider`, type: 'separator' as const }, item]\n : [item];\n });\n\n if (!items.length) return null;\n\n return (\n <Menu\n trigger={\n <button type=\"button\" className=\"eidos-datagrid-actions-trigger\" aria-label=\"Row actions\">\n {actionsColumn.actionsIcon ? (\n renderIcon(actionsColumn.actionsIcon, 'eidos-datagrid-actions-trigger-icon')\n ) : (\n <MoreVertical size={16} />\n )}\n </button>\n }\n items={items}\n />\n );\n };\n\n // Columns sorted for rendering: pin:left → unpinned → pin:right. Excludes\n // the actions column (see `dataColumns`) - it's never a normal, sortable/\n // pinnable data column, always rendered in its own dedicated slot instead.\n // This ensures a pinned column defined in the middle of the columns array\n // is always displayed at the correct edge regardless of its original position.\n // The original `columns` prop is still used for key-based lookups above.\n const sortedColumns = useMemo(\n () => [\n ...dataColumns.filter((c) => c.pin === 'left'),\n ...dataColumns.filter((c) => !c.pin),\n ...dataColumns.filter((c) => c.pin === 'right'),\n ],\n [dataColumns],\n );\n\n const totalCols =\n dataColumns.length +\n (showRowNumbers ? 1 : 0) +\n (actionsColumn ? 1 : 0) +\n (draggableRows ? 1 : 0) +\n (selectable ? 1 : 0) +\n (expandable ? 1 : 0);\n\n // Row IDs for SortableContext - must be the displayed rows (not full dataset)\n // so dnd-kit knows which items are currently rendered.\n const rowIds = displayData.map((row, i) => String(cellOf(row, rowKeyField) ?? i));\n\n const containerStyle: React.CSSProperties = {};\n if (stickyHeader && maxHeight) {\n containerStyle.maxHeight = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n }\n\n // Toolbar visibility: show whenever filters, quick filters, density picker,\n // selectable, or add-row are active.\n const showToolbar =\n !!showFilters || quickFilters.length > 0 || !!showDensity || !!selectable || !!onRowAdd;\n\n // Quick filters share the toolbar's left zone with the selection count and\n // bulk actions, which take it over entirely while rows are selected.\n const showQuickFilters = quickFilters.length > 0 && !(selectable && hasSelection);\n\n const renderQuickFilter = (quickFilter: DataGridQuickFilter): React.ReactElement => {\n const { key, label, disabled, width } = quickFilter;\n const value = activeFilters[key];\n // Only set inline when supplied - the default lives in the stylesheet, so\n // the common case emits no style attribute at all.\n const style =\n width === undefined\n ? undefined\n : ({\n '--eidos-datagrid-quick-filter-width': typeof width === 'number' ? `${width}px` : width,\n } as React.CSSProperties);\n\n const control = (() => {\n switch (quickFilter.type) {\n case 'segmented':\n return (\n <SegmentedControl\n size=\"sm\"\n color={quickFilter.color}\n disabled={disabled}\n // The reset segment is always prepended: a SegmentedControl\n // always has exactly one segment selected, so without it the\n // filter could never be cleared.\n options={[\n { value: QUICK_FILTER_RESET_VALUE, label: quickFilter.allLabel ?? 'All' },\n ...quickFilter.options,\n ]}\n value={typeof value === 'string' ? value : QUICK_FILTER_RESET_VALUE}\n onChange={(next) => handleQuickFilterChange(key, next)}\n />\n );\n case 'combobox':\n return (\n <Combobox\n size=\"sm\"\n fullWidth\n disabled={disabled}\n placeholder={quickFilter.placeholder ?? label}\n clearable={quickFilter.clearable ?? true}\n emptyText={quickFilter.emptyText}\n loading={quickFilter.loading}\n loadingText={quickFilter.loadingText}\n onSearch={quickFilter.onSearch}\n options={(quickFilter.options ?? []).map((option) => ({\n ...option,\n id: option.value,\n }))}\n value={typeof value === 'string' ? value : ''}\n onChange={(next) => handleQuickFilterChange(key, next)}\n />\n );\n case 'select':\n default:\n return (\n <Select\n fullWidth\n inputProps={{ size: 'sm' }}\n disabled={disabled}\n placeholder={quickFilter.placeholder ?? label}\n clearable={quickFilter.clearable ?? true}\n multiple={quickFilter.multiple}\n options={quickFilter.options.map((option) => ({ ...option, id: option.value }))}\n // Never `undefined` - Select and Combobox both treat that as\n // \"uncontrolled\" and would then keep showing a value the\n // filter state no longer holds after a clear.\n value={\n quickFilter.multiple\n ? Array.isArray(value)\n ? value\n : []\n : typeof value === 'string'\n ? value\n : ''\n }\n onChange={(next) => handleQuickFilterChange(key, next)}\n />\n );\n }\n })();\n\n return (\n <div\n key={key}\n className={`eidos-datagrid-quick-filter eidos-datagrid-quick-filter--${quickFilter.type}`}\n style={style}\n // No visible field label fits in the toolbar, so the group carries the\n // accessible name for whichever control it wraps.\n role=\"group\"\n aria-label={label}\n >\n {control}\n </div>\n );\n };\n\n // Density modifier class (comfortable = default = no extra class)\n const densityClass =\n effectiveDensity !== 'comfortable' ? `eidos-datagrid--${effectiveDensity}` : '';\n\n // Always include the current page size in the options so the Select is never blank.\n const effectivePageSizeOptions = useMemo(() => {\n const opts = pageSizeOptions ?? [10, 25, 50, 100];\n return opts.includes(pageSize) ? opts : [...opts, pageSize].sort((a, b) => a - b);\n }, [pageSizeOptions, pageSize]);\n\n // ── Loading state (preserved) ───────────────────────────────────────────────\n // `ref={setContainerRef}` here too (not just the main return below) - a\n // consumer whose `loading` prop starts `true` on mount renders this\n // branch first, and without it `hasCardView` would never get a container\n // to measure until some unrelated re-render happened to remount it - see\n // `setContainerRef`'s comment above for the full explanation.\n if (loading) {\n return (\n <div\n ref={setContainerRef}\n className={['eidos-data-grid-container', className].filter(Boolean).join(' ')}\n >\n <div className=\"eidos-data-grid-loading\">\n <Spinner size=\"md\" />\n <p>Loading…</p>\n </div>\n </div>\n );\n }\n\n // ── Render ─────────────────────────────────────────────────────────────────\n // Pre-compute sticky props for system columns so we can spread them on\n // header <th>s and body <td>s without calling the helpers multiple times.\n const expandHeaderPin = getHeaderPinnedProps('__expand__');\n const selHeaderPin = getHeaderPinnedProps('__sel__');\n const dragHeaderPin = getHeaderPinnedProps('__drag__');\n const rownumHeaderPin = getHeaderPinnedProps('__rownum__');\n const expandCellPin = getCellPinnedProps('__expand__');\n const selCellPin = getCellPinnedProps('__sel__');\n const dragCellPin = getCellPinnedProps('__drag__');\n const rownumCellPin = getCellPinnedProps('__rownum__');\n\n return (\n <div\n ref={setContainerRef}\n className={[\n 'eidos-data-grid-container',\n stickyHeader && 'eidos-data-grid-container--sticky-header',\n densityClass,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={containerStyle}\n >\n {/* ── Toolbar ─────────────────────────────────────────────────────── */}\n {showToolbar && (\n <div className=\"eidos-datagrid-toolbar\">\n {/* Left zone: quick filters, or selection count + bulk actions */}\n <div className=\"eidos-datagrid-toolbar-left\">\n {showQuickFilters && (\n <div className=\"eidos-datagrid-quick-filters\">\n {quickFilters.map(renderQuickFilter)}\n </div>\n )}\n\n {selectable && hasSelection && (\n <>\n <span className=\"eidos-datagrid-selection-count\">{selectedSet.size} selected</span>\n\n {bulkActions && bulkActions.length > 0 && (\n <div className=\"eidos-datagrid-bulk-actions\">\n {bulkActions.map((action) => {\n const isDisabled =\n typeof action.disabled === 'function'\n ? action.disabled(selectedItems)\n : (action.disabled ?? false);\n\n if (action.type === 'split-button') {\n return (\n <SplitButton\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n preIcon={action.icon}\n disabled={isDisabled}\n label={action.label}\n onClick={() => action.onClick(selectedItems)}\n options={action.options.map((option) => ({\n id: option.id,\n label: option.label,\n icon: option.icon,\n disabled: option.disabled,\n onClick: () => option.onClick(selectedItems),\n }))}\n />\n );\n }\n\n return action.label ? (\n <Button\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n preIcon={action.icon}\n posIcon={action.posIcon}\n disabled={isDisabled}\n onClick={() => action.onClick(selectedItems)}\n >\n {action.label}\n </Button>\n ) : action.icon ? (\n <Button\n key={action.id}\n size=\"sm\"\n variant={action.variant ?? 'outlined'}\n color={action.color ?? 'secondary'}\n icon={action.icon}\n disabled={isDisabled}\n onClick={() => action.onClick(selectedItems)}\n />\n ) : null;\n })}\n </div>\n )}\n\n <button\n type=\"button\"\n className=\"eidos-datagrid-clear-selection\"\n onClick={clearSelection}\n aria-label=\"Clear selection\"\n >\n <X size={14} />\n </button>\n </>\n )}\n </div>\n\n {/* Right zone: density picker + filter button + add-row button */}\n <div className=\"eidos-datagrid-toolbar-right\">\n {showDensity && (\n <Dropdown\n placement=\"bottom\"\n align=\"end\"\n autoWidth={false}\n trigger={\n <Button variant=\"text\" size=\"sm\" preIcon={AlignJustify}>\n Density\n </Button>\n }\n content={\n <div className=\"eidos-table-menu-panel\">\n {(\n [\n { value: 'compact', label: 'Compact' },\n { value: 'comfortable', label: 'Comfortable' },\n { value: 'spacious', label: 'Spacious' },\n ] as const\n ).map((option) => (\n <button\n key={option.value}\n className={[\n 'eidos-table-menu-item',\n effectiveDensity === option.value ? 'eidos-table-menu-item--active' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => setInternalDensity(option.value)}\n >\n <span className=\"eidos-table-menu-item-check\">\n {effectiveDensity === option.value && <Check size={14} />}\n </span>\n <span>{option.label}</span>\n </button>\n ))}\n </div>\n }\n />\n )}\n\n {showFilters && filterDropdownColumns.length > 0 && (\n <TableFiltersDropdown<T>\n columns={filterDropdownColumns}\n filters={dropdownFilters}\n onFiltersChange={handleFiltersChange}\n />\n )}\n\n {onRowAdd && (\n <Button variant=\"outlined\" size=\"sm\" preIcon={Plus} onClick={handleRowAdd}>\n Add row\n </Button>\n )}\n </div>\n </div>\n )}\n\n {isCardView ? (\n /* ── Card view ────────────────────────────────────────────────── */\n <div\n className=\"eidos-datagrid-cards\"\n style={{ '--eidos-datagrid-card-min-width': `${cardMinWidth}px` } as React.CSSProperties}\n >\n {displayData.length > 0 ? (\n displayData.map((row, displayIndex) => {\n const localIndex = localData.indexOf(row);\n const rowKeyValue = String(cellOf(row, rowKeyField) ?? displayIndex);\n const isRowSelected = selectable && selectedSet.has(rowKeyValue);\n const isRowExpanded = expandable && expandedSet.has(rowKeyValue);\n const canExpandRow = !isRowExpandable || isRowExpandable(row);\n\n return (\n <div\n key={rowKeyValue}\n className={[\n 'eidos-datagrid-card',\n isRowSelected && 'eidos-datagrid-card--selected',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* stopPropagation so the checkbox/actions menu never bubble\n into a consumer's own row-click handler (e.g. opening a\n details drawer) - mirrors the selection/drag-handle <td>s'\n own `onClick={(e) => e.stopPropagation()}` in table mode. */}\n <div className=\"eidos-datagrid-card-toolbar\" onClick={(e) => e.stopPropagation()}>\n <div className=\"eidos-datagrid-card-toolbar-left\">\n {expandable && canExpandRow && (\n <button\n type=\"button\"\n className={[\n 'eidos-datagrid-expand-toggle',\n isRowExpanded && 'eidos-datagrid-expand-toggle--open',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => toggleExpanded(rowKeyValue)}\n aria-expanded={isRowExpanded}\n aria-label={isRowExpanded ? 'Collapse row' : 'Expand row'}\n >\n <ChevronRight size={14} />\n </button>\n )}\n {selectable && (\n <Checkbox\n checked={isRowSelected}\n onChange={() => toggleRow(rowKeyValue)}\n size=\"sm\"\n />\n )}\n {showRowNumbers && (\n <span className=\"eidos-datagrid-card-row-number\">#{localIndex + 1}</span>\n )}\n </div>\n\n {/* Always rendered (even empty) so it occupies the toolbar's\n middle grid column - conditionally omitting the element\n itself would shift `eidos-datagrid-card-toolbar-right`\n into this column instead of the third one. */}\n <div className=\"eidos-datagrid-card-heading\">\n {cardHeaderColumn &&\n renderCardValue(\n cardHeaderColumn,\n row,\n localIndex,\n 'eidos-datagrid-card-heading-title',\n )}\n {cardSubheaderColumn &&\n renderCardValue(\n cardSubheaderColumn,\n row,\n localIndex,\n 'eidos-datagrid-card-heading-subtitle',\n )}\n </div>\n\n <div className=\"eidos-datagrid-card-toolbar-right\">\n {renderActionsMenu(row, localIndex)}\n </div>\n </div>\n\n <div className=\"eidos-datagrid-card-fields\">\n {cardFieldColumns.map((col) => renderCardField(col, row, localIndex))}\n </div>\n\n {expandable && renderExpandedContent && (\n <ExpandedCardPanel\n isOpen={isRowExpanded}\n render={() => renderExpandedContent(row, localIndex)}\n />\n )}\n </div>\n );\n })\n ) : (\n <div className=\"eidos-datagrid-card-empty\">\n {Object.keys(activeFilters).length > 0 ? (\n <EmptyState\n icon={<SearchX />}\n title=\"No results found\"\n description=\"Try adjusting your filters or search terms.\"\n action={\n <Button size=\"sm\" variant=\"outlined\" color=\"primary\" onClick={clearAllFilters}>\n Clear filters\n </Button>\n }\n size=\"sm\"\n />\n ) : (\n <EmptyState\n icon={<FolderOpen />}\n title={emptyText}\n description={\n onRowAdd ? 'Add a row to get started.' : 'There are no records to display.'\n }\n size=\"sm\"\n />\n )}\n </div>\n )}\n </div>\n ) : (\n <>\n {/* ── Table (wrapped for horizontal scroll) ───────────────────────── */}\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleRowDragEnd}\n >\n <div className=\"eidos-data-grid-scroll\">\n <table className={['eidos-data-grid', densityClass].filter(Boolean).join(' ')}>\n <thead ref={theadRef}>\n <tr>\n {/* Drag-handle column - must come before every other system column */}\n {draggableRows && (\n <th\n className={[\n 'eidos-data-grid-header-cell',\n 'eidos-datagrid-drag-handle-cell',\n dragHeaderPin.className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={dragHeaderPin.style}\n data-col-key=\"__drag__\"\n />\n )}\n\n {/* Expand-toggle column */}\n {expandable && (\n <th\n className={[\n 'eidos-data-grid-header-cell',\n 'eidos-datagrid-expand-cell',\n expandHeaderPin.className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={expandHeaderPin.style}\n data-col-key=\"__expand__\"\n />\n )}\n\n {/* Selection checkbox column - must come before row numbers */}\n {selectable && (\n <th\n className={[\n 'eidos-data-grid-header-cell',\n 'eidos-datagrid-checkbox-cell',\n selHeaderPin.className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={selHeaderPin.style}\n data-col-key=\"__sel__\"\n >\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={toggleAll}\n size=\"sm\"\n />\n </th>\n )}\n\n {showRowNumbers && (\n <th\n className={[\n 'eidos-data-grid-header-cell',\n 'eidos-data-grid-row-number-col',\n rownumHeaderPin.className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={rownumHeaderPin.style}\n data-col-key=\"__rownum__\"\n >\n #\n </th>\n )}\n\n {sortedColumns.map((col) => {\n const colKey = col.key;\n const isSortable = !!col.sortable;\n const isCurrentlySorted = activeSort?.key === colKey;\n const sortDir = isCurrentlySorted ? activeSort!.direction : null;\n const alignClass = `eidos-datagrid-align-${col.align ?? 'left'}`;\n const { style: pinnedStyle, className: pinnedClass } =\n getHeaderPinnedProps(colKey);\n\n return (\n <th\n key={colKey}\n className={[\n 'eidos-data-grid-header-cell',\n isSortable && 'eidos-datagrid-header-cell--sortable',\n isCurrentlySorted && 'eidos-datagrid-header-cell--sorted',\n alignClass,\n pinnedClass,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n width:\n col.width != null\n ? typeof col.width === 'number'\n ? `${col.width}px`\n : col.width\n : undefined,\n minWidth:\n col.minWidth != null\n ? typeof col.minWidth === 'number'\n ? `${col.minWidth}px`\n : col.minWidth\n : undefined,\n ...pinnedStyle,\n }}\n data-col-key={colKey}\n onClick={isSortable ? () => handleSortClick(colKey) : undefined}\n >\n <div className={`eidos-datagrid-header-content ${alignClass}`}>\n <span className=\"eidos-datagrid-header-label\">{col.header}</span>\n {isSortable && (\n <span className=\"eidos-datagrid-sort-icon\">\n {sortDir === 'asc' && <ArrowUp size={14} />}\n {sortDir === 'desc' && <ArrowDown size={14} />}\n {!sortDir && <ChevronsUpDown size={14} />}\n </span>\n )}\n </div>\n </th>\n );\n })}\n\n {actionsColumn && (\n <th\n className=\"eidos-data-grid-header-cell eidos-data-grid-actions-col\"\n data-col-key=\"__actions__\"\n />\n )}\n </tr>\n </thead>\n\n <tbody>\n <SortableContext items={rowIds} strategy={verticalListSortingStrategy}>\n {displayData.length > 0 ? (\n displayData.map((row, displayIndex) => {\n // Find this row's position in the full localData array.\n // displayData rows are the same object references as in localData\n // (filter/sort/slice never clone row objects), so indexOf is O(n)\n // but always accurate - even after edits that produce new row objects.\n const localIndex = localData.indexOf(row);\n const rowKeyValue = String(cellOf(row, rowKeyField) ?? displayIndex);\n const isRowSelected = selectable && selectedSet.has(rowKeyValue);\n const isRowExpanded = expandable && expandedSet.has(rowKeyValue);\n const canExpandRow = !isRowExpandable || isRowExpandable(row);\n\n return (\n // React.Fragment (rather than SortableTableRow taking the\n // `key` directly) so an expanded row's detail <tr> - see\n // ExpandedTableRow below - can sit right underneath it as\n // a sibling, keyed together as one reconciliation unit.\n <React.Fragment key={rowKeyValue}>\n {/* SortableTableRow is always rendered (hooks unconditional);\n disabled={true} when draggableRows is off so dnd-kit is a no-op. */}\n <SortableTableRow\n id={rowKeyValue}\n disabled={!draggableRows}\n className={[\n 'eidos-data-grid-row',\n isRowSelected && 'eidos-datagrid-row--selected',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {(dragHandleProps, isDragging) => (\n <>\n {draggableRows && (\n <td\n className={[\n 'eidos-datagrid-drag-handle-cell',\n dragCellPin.className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={dragCellPin.style}\n // Prevent a click on the handle from triggering cell editing\n onClick={(e) => e.stopPropagation()}\n >\n <span\n {...(dragHandleProps as React.HTMLAttributes<HTMLSpanElement>)}\n className={[\n 'eidos-datagrid-drag-handle',\n isDragging && 'eidos-datagrid-drag-handle--dragging',\n ]\n .filter(Boolean)\n .join(' ')}\n title=\"Drag to reorder\"\n >\n <GripVertical size={14} />\n </span>\n </td>\n )}\n\n {expandable && (\n <td\n className={[\n 'eidos-data-grid-cell',\n 'eidos-datagrid-expand-cell',\n expandCellPin.className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={expandCellPin.style}\n // Prevent a click on the toggle from triggering cell editing\n onClick={(e) => e.stopPropagation()}\n >\n {canExpandRow && (\n <button\n type=\"button\"\n className={[\n 'eidos-datagrid-expand-toggle',\n isRowExpanded && 'eidos-datagrid-expand-toggle--open',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => toggleExpanded(rowKeyValue)}\n aria-expanded={isRowExpanded}\n aria-label={isRowExpanded ? 'Collapse row' : 'Expand row'}\n >\n <ChevronRight size={14} />\n </button>\n )}\n </td>\n )}\n\n {selectable && (\n <td\n className={[\n 'eidos-data-grid-cell',\n 'eidos-datagrid-checkbox-cell',\n selCellPin.className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={selCellPin.style}\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={isRowSelected}\n onChange={() => toggleRow(rowKeyValue)}\n size=\"sm\"\n />\n </td>\n )}\n\n {showRowNumbers && (\n <td\n className={[\n 'eidos-data-grid-cell',\n 'eidos-data-grid-row-number',\n rownumCellPin.className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={rownumCellPin.style}\n >\n {localIndex + 1}\n </td>\n )}\n\n {sortedColumns.map((col) => {\n const value = cellOf(row, col.key);\n const isEditing =\n editingCell?.rowIndex === localIndex &&\n editingCell?.colKey === col.key;\n const canEdit = isCellEditable(col);\n // Persists for a cell regardless of focus (background tint only);\n // the border + message only show once this exact cell is\n // focused again, via `hasError` below.\n const isFlagged =\n cellErrorKey(localIndex, col.key) in cellErrors;\n const hasError = isEditing && Boolean(editError);\n const { style: pinnedStyle, className: pinnedClass } =\n getCellPinnedProps(col.key);\n\n const cellCls = [\n 'eidos-data-grid-cell',\n isEditing && 'eidos-data-grid-cell--editing',\n hasError && 'eidos-data-grid-cell--error',\n isFlagged && !hasError && 'eidos-data-grid-cell--has-error',\n canEdit && !isEditing && 'eidos-data-grid-cell--editable',\n col.type === 'readonly' && 'eidos-data-grid-cell--readonly',\n `eidos-datagrid-align-${col.align ?? 'left'}`,\n pinnedClass,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <td\n key={col.key}\n ref={\n hasError\n ? (errorTooltipAnchorRef as React.RefObject<HTMLTableDataCellElement | null>)\n : undefined\n }\n className={cellCls}\n style={pinnedStyle}\n onClick={() => handleCellClick(localIndex, col)}\n onKeyDown={\n isEditing\n ? (e) => handleKeyDown(e, localIndex, col.key)\n : undefined\n }\n // Make editing cells focusable so keydown events register\n tabIndex={isEditing ? -1 : undefined}\n >\n {isEditing\n ? renderEditCell(col, editValue, row, localIndex)\n : renderViewCell(col, value, row, localIndex)}\n </td>\n );\n })}\n\n {actionsColumn && (\n <td\n className=\"eidos-data-grid-cell eidos-data-grid-actions-col\"\n // Prevent a click on the actions menu from bubbling into a\n // consumer's own row-click handler (e.g. opening a details\n // drawer) - mirrors the selection/drag-handle <td>s above.\n onClick={(e) => e.stopPropagation()}\n >\n {renderActionsMenu(row, localIndex)}\n </td>\n )}\n </>\n )}\n </SortableTableRow>\n\n {expandable && renderExpandedContent && (\n <ExpandedTableRow\n isOpen={isRowExpanded}\n colSpan={totalCols}\n render={() => renderExpandedContent(row, localIndex)}\n />\n )}\n </React.Fragment>\n );\n })\n ) : (\n <tr className=\"eidos-data-grid-empty-row\">\n <td\n colSpan={totalCols}\n className=\"eidos-data-grid-cell eidos-data-grid-empty-cell\"\n >\n {Object.keys(activeFilters).length > 0 ? (\n <EmptyState\n icon={<SearchX />}\n title=\"No results found\"\n description=\"Try adjusting your filters or search terms.\"\n action={\n <Button\n size=\"sm\"\n variant=\"outlined\"\n color=\"primary\"\n onClick={clearAllFilters}\n >\n Clear filters\n </Button>\n }\n size=\"sm\"\n />\n ) : (\n <EmptyState\n icon={<FolderOpen />}\n title={emptyText}\n description={\n onRowAdd\n ? 'Add a row to get started.'\n : 'There are no records to display.'\n }\n size=\"sm\"\n />\n )}\n </td>\n </tr>\n )}\n </SortableContext>\n </tbody>\n </table>\n </div>\n </DndContext>\n </>\n )}\n\n {/* ── Pagination footer ────────────────────────────────────────────── */}\n {showPagination && (\n <div className=\"eidos-datagrid-footer\">\n <Pagination\n page={currentPage}\n totalPages={totalPages}\n onChange={handlePageChange}\n totalItems={totalItemCount}\n pageSize={currentPageSize}\n onPageSizeChange={handlePageSizeChange}\n pageSizeOptions={effectivePageSizeOptions}\n />\n </div>\n )}\n\n {/* Portaled rather than a child of the erroring cell - see errorTooltipPosition above */}\n {activeCellError &&\n errorTooltipPosition &&\n createPortal(\n <div\n className=\"eidos-data-grid-cell-error\"\n style={{ top: errorTooltipPosition.top, left: errorTooltipPosition.left }}\n >\n {activeCellError}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n\n// Assign displayName cleanly without losing the generic signature\nexport const DataGrid = Object.assign(DataGridInner, { displayName: 'DataGrid' });\n"]}