@akshar-technosoft/ui 1.3.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/README.md +0 -0
  2. package/dist/components/core/error.cjs +3 -0
  3. package/dist/components/core/error.cjs.map +1 -0
  4. package/dist/components/core/error.d.cts +5 -0
  5. package/dist/components/core/error.d.ts +5 -0
  6. package/dist/components/core/error.js +3 -0
  7. package/dist/components/core/error.js.map +1 -0
  8. package/dist/components/core/event-success.cjs +3 -0
  9. package/dist/components/core/event-success.cjs.map +1 -0
  10. package/dist/components/core/event-success.d.cts +5 -0
  11. package/dist/components/core/event-success.d.ts +5 -0
  12. package/dist/components/core/event-success.js +3 -0
  13. package/dist/components/core/event-success.js.map +1 -0
  14. package/dist/components/core/index.cjs +3 -0
  15. package/dist/components/core/index.cjs.map +1 -0
  16. package/dist/components/core/index.d.cts +7 -0
  17. package/dist/components/core/index.d.ts +7 -0
  18. package/dist/components/core/index.js +3 -0
  19. package/dist/components/core/index.js.map +1 -0
  20. package/dist/components/core/loader.cjs +3 -0
  21. package/dist/components/core/loader.cjs.map +1 -0
  22. package/dist/components/core/loader.d.cts +5 -0
  23. package/dist/components/core/loader.d.ts +5 -0
  24. package/dist/components/core/loader.js +3 -0
  25. package/dist/components/core/loader.js.map +1 -0
  26. package/dist/components/core/notfound.cjs +3 -0
  27. package/dist/components/core/notfound.cjs.map +1 -0
  28. package/dist/components/core/notfound.d.cts +5 -0
  29. package/dist/components/core/notfound.d.ts +5 -0
  30. package/dist/components/core/notfound.js +3 -0
  31. package/dist/components/core/notfound.js.map +1 -0
  32. package/dist/components/core/offline-content.cjs +3 -0
  33. package/dist/components/core/offline-content.cjs.map +1 -0
  34. package/dist/components/core/offline-content.d.cts +5 -0
  35. package/dist/components/core/offline-content.d.ts +5 -0
  36. package/dist/components/core/offline-content.js +3 -0
  37. package/dist/components/core/offline-content.js.map +1 -0
  38. package/dist/components/core/unauthorized.cjs +3 -0
  39. package/dist/components/core/unauthorized.cjs.map +1 -0
  40. package/dist/components/core/unauthorized.d.cts +5 -0
  41. package/dist/components/core/unauthorized.d.ts +5 -0
  42. package/dist/components/core/unauthorized.js +3 -0
  43. package/dist/components/core/unauthorized.js.map +1 -0
  44. package/dist/components/data/data-table/data-table-action-bar.cjs +3 -0
  45. package/dist/components/data/data-table/data-table-action-bar.cjs.map +1 -0
  46. package/dist/components/data/data-table/data-table-action-bar.d.cts +26 -0
  47. package/dist/components/data/data-table/data-table-action-bar.d.ts +26 -0
  48. package/dist/components/data/data-table/data-table-action-bar.js +3 -0
  49. package/dist/components/data/data-table/data-table-action-bar.js.map +1 -0
  50. package/dist/components/data/data-table/data-table-aggregation.cjs +3 -0
  51. package/dist/components/data/data-table/data-table-aggregation.cjs.map +1 -0
  52. package/dist/components/data/data-table/data-table-aggregation.d.cts +25 -0
  53. package/dist/components/data/data-table/data-table-aggregation.d.ts +25 -0
  54. package/dist/components/data/data-table/data-table-aggregation.js +3 -0
  55. package/dist/components/data/data-table/data-table-aggregation.js.map +1 -0
  56. package/dist/components/data/data-table/data-table-columns.cjs +3 -0
  57. package/dist/components/data/data-table/data-table-columns.cjs.map +1 -0
  58. package/dist/components/data/data-table/data-table-columns.d.cts +20 -0
  59. package/dist/components/data/data-table/data-table-columns.d.ts +20 -0
  60. package/dist/components/data/data-table/data-table-columns.js +3 -0
  61. package/dist/components/data/data-table/data-table-columns.js.map +1 -0
  62. package/dist/components/data/data-table/data-table-export.cjs +3 -0
  63. package/dist/components/data/data-table/data-table-export.cjs.map +1 -0
  64. package/dist/components/data/data-table/data-table-export.d.cts +38 -0
  65. package/dist/components/data/data-table/data-table-export.d.ts +38 -0
  66. package/dist/components/data/data-table/data-table-export.js +3 -0
  67. package/dist/components/data/data-table/data-table-export.js.map +1 -0
  68. package/dist/components/data/data-table/data-table-filtering.cjs +3 -0
  69. package/dist/components/data/data-table/data-table-filtering.cjs.map +1 -0
  70. package/dist/components/data/data-table/data-table-filtering.d.cts +17 -0
  71. package/dist/components/data/data-table/data-table-filtering.d.ts +17 -0
  72. package/dist/components/data/data-table/data-table-filtering.js +3 -0
  73. package/dist/components/data/data-table/data-table-filtering.js.map +1 -0
  74. package/dist/components/data/data-table/data-table-footer.cjs +3 -0
  75. package/dist/components/data/data-table/data-table-footer.cjs.map +1 -0
  76. package/dist/components/data/data-table/data-table-footer.d.cts +21 -0
  77. package/dist/components/data/data-table/data-table-footer.d.ts +21 -0
  78. package/dist/components/data/data-table/data-table-footer.js +3 -0
  79. package/dist/components/data/data-table/data-table-footer.js.map +1 -0
  80. package/dist/components/data/data-table/data-table-header.cjs +3 -0
  81. package/dist/components/data/data-table/data-table-header.cjs.map +1 -0
  82. package/dist/components/data/data-table/data-table-header.d.cts +23 -0
  83. package/dist/components/data/data-table/data-table-header.d.ts +23 -0
  84. package/dist/components/data/data-table/data-table-header.js +3 -0
  85. package/dist/components/data/data-table/data-table-header.js.map +1 -0
  86. package/dist/components/data/data-table/data-table-pagination.cjs +3 -0
  87. package/dist/components/data/data-table/data-table-pagination.cjs.map +1 -0
  88. package/dist/components/data/data-table/data-table-pagination.d.cts +14 -0
  89. package/dist/components/data/data-table/data-table-pagination.d.ts +14 -0
  90. package/dist/components/data/data-table/data-table-pagination.js +3 -0
  91. package/dist/components/data/data-table/data-table-pagination.js.map +1 -0
  92. package/dist/components/data/data-table/data-table-persist.cjs +3 -0
  93. package/dist/components/data/data-table/data-table-persist.cjs.map +1 -0
  94. package/dist/components/data/data-table/data-table-persist.d.cts +103 -0
  95. package/dist/components/data/data-table/data-table-persist.d.ts +103 -0
  96. package/dist/components/data/data-table/data-table-persist.js +3 -0
  97. package/dist/components/data/data-table/data-table-persist.js.map +1 -0
  98. package/dist/components/data/data-table/data-table-pinning.cjs +3 -0
  99. package/dist/components/data/data-table/data-table-pinning.cjs.map +1 -0
  100. package/dist/components/data/data-table/data-table-pinning.d.cts +39 -0
  101. package/dist/components/data/data-table/data-table-pinning.d.ts +39 -0
  102. package/dist/components/data/data-table/data-table-pinning.js +3 -0
  103. package/dist/components/data/data-table/data-table-pinning.js.map +1 -0
  104. package/dist/components/data/data-table/data-table-toolbar-menus.cjs +3 -0
  105. package/dist/components/data/data-table/data-table-toolbar-menus.cjs.map +1 -0
  106. package/dist/components/data/data-table/data-table-toolbar-menus.d.cts +21 -0
  107. package/dist/components/data/data-table/data-table-toolbar-menus.d.ts +21 -0
  108. package/dist/components/data/data-table/data-table-toolbar-menus.js +3 -0
  109. package/dist/components/data/data-table/data-table-toolbar-menus.js.map +1 -0
  110. package/dist/components/data/data-table/data-table-toolbar.cjs +3 -0
  111. package/dist/components/data/data-table/data-table-toolbar.cjs.map +1 -0
  112. package/dist/components/data/data-table/data-table-toolbar.d.cts +36 -0
  113. package/dist/components/data/data-table/data-table-toolbar.d.ts +36 -0
  114. package/dist/components/data/data-table/data-table-toolbar.js +3 -0
  115. package/dist/components/data/data-table/data-table-toolbar.js.map +1 -0
  116. package/dist/components/data/data-table/data-table-types.cjs +3 -0
  117. package/dist/components/data/data-table/data-table-types.cjs.map +1 -0
  118. package/dist/components/data/data-table/data-table-types.d.cts +536 -0
  119. package/dist/components/data/data-table/data-table-types.d.ts +536 -0
  120. package/dist/components/data/data-table/data-table-types.js +2 -0
  121. package/dist/components/data/data-table/data-table-types.js.map +1 -0
  122. package/dist/components/data/data-table/data-table.cjs +3 -0
  123. package/dist/components/data/data-table/data-table.cjs.map +1 -0
  124. package/dist/components/data/data-table/data-table.d.cts +10 -0
  125. package/dist/components/data/data-table/data-table.d.ts +10 -0
  126. package/dist/components/data/data-table/data-table.js +3 -0
  127. package/dist/components/data/data-table/data-table.js.map +1 -0
  128. package/dist/components/data/data-table/index.cjs +3 -0
  129. package/dist/components/data/data-table/index.cjs.map +1 -0
  130. package/dist/components/data/data-table/index.d.cts +16 -0
  131. package/dist/components/data/data-table/index.d.ts +16 -0
  132. package/dist/components/data/data-table/index.js +3 -0
  133. package/dist/components/data/data-table/index.js.map +1 -0
  134. package/dist/components/data/data-table/use-table-filter-param.cjs +3 -0
  135. package/dist/components/data/data-table/use-table-filter-param.cjs.map +1 -0
  136. package/dist/components/data/data-table/use-table-filter-param.d.cts +37 -0
  137. package/dist/components/data/data-table/use-table-filter-param.d.ts +37 -0
  138. package/dist/components/data/data-table/use-table-filter-param.js +3 -0
  139. package/dist/components/data/data-table/use-table-filter-param.js.map +1 -0
  140. package/dist/components/data/data-table/use-table-persist.cjs +3 -0
  141. package/dist/components/data/data-table/use-table-persist.cjs.map +1 -0
  142. package/dist/components/data/data-table/use-table-persist.d.cts +36 -0
  143. package/dist/components/data/data-table/use-table-persist.d.ts +36 -0
  144. package/dist/components/data/data-table/use-table-persist.js +3 -0
  145. package/dist/components/data/data-table/use-table-persist.js.map +1 -0
  146. package/dist/components/data/data-template/data-template-action-bar.cjs +3 -0
  147. package/dist/components/data/data-template/data-template-action-bar.cjs.map +1 -0
  148. package/dist/components/data/data-template/data-template-action-bar.d.cts +14 -0
  149. package/dist/components/data/data-template/data-template-action-bar.d.ts +14 -0
  150. package/dist/components/data/data-template/data-template-action-bar.js +3 -0
  151. package/dist/components/data/data-template/data-template-action-bar.js.map +1 -0
  152. package/dist/components/data/data-template/data-template-pagination.cjs +3 -0
  153. package/dist/components/data/data-template/data-template-pagination.cjs.map +1 -0
  154. package/dist/components/data/data-template/data-template-pagination.d.cts +17 -0
  155. package/dist/components/data/data-template/data-template-pagination.d.ts +17 -0
  156. package/dist/components/data/data-template/data-template-pagination.js +3 -0
  157. package/dist/components/data/data-template/data-template-pagination.js.map +1 -0
  158. package/dist/components/data/data-template/data-template-toolbar.cjs +3 -0
  159. package/dist/components/data/data-template/data-template-toolbar.cjs.map +1 -0
  160. package/dist/components/data/data-template/data-template-toolbar.d.cts +27 -0
  161. package/dist/components/data/data-template/data-template-toolbar.d.ts +27 -0
  162. package/dist/components/data/data-template/data-template-toolbar.js +3 -0
  163. package/dist/components/data/data-template/data-template-toolbar.js.map +1 -0
  164. package/dist/components/data/data-template/data-template-types.cjs +3 -0
  165. package/dist/components/data/data-template/data-template-types.cjs.map +1 -0
  166. package/dist/components/data/data-template/data-template-types.d.cts +105 -0
  167. package/dist/components/data/data-template/data-template-types.d.ts +105 -0
  168. package/dist/components/data/data-template/data-template-types.js +2 -0
  169. package/dist/components/data/data-template/data-template-types.js.map +1 -0
  170. package/dist/components/data/data-template/data-template.cjs +3 -0
  171. package/dist/components/data/data-template/data-template.cjs.map +1 -0
  172. package/dist/components/data/data-template/data-template.d.cts +8 -0
  173. package/dist/components/data/data-template/data-template.d.ts +8 -0
  174. package/dist/components/data/data-template/data-template.js +3 -0
  175. package/dist/components/data/data-template/data-template.js.map +1 -0
  176. package/dist/components/data/data-template/index.cjs +3 -0
  177. package/dist/components/data/data-template/index.cjs.map +1 -0
  178. package/dist/components/data/data-template/index.d.cts +8 -0
  179. package/dist/components/data/data-template/index.d.ts +8 -0
  180. package/dist/components/data/data-template/index.js +3 -0
  181. package/dist/components/data/data-template/index.js.map +1 -0
  182. package/dist/components/date-helper.cjs +0 -0
  183. package/dist/components/date-helper.cjs.map +0 -0
  184. package/dist/components/date-helper.d.cts +0 -0
  185. package/dist/components/date-helper.d.ts +0 -0
  186. package/dist/components/date-helper.js +0 -0
  187. package/dist/components/date-helper.js.map +0 -0
  188. package/dist/components/general.cjs +0 -0
  189. package/dist/components/general.cjs.map +0 -0
  190. package/dist/components/general.d.cts +0 -0
  191. package/dist/components/general.d.ts +0 -0
  192. package/dist/components/general.js +0 -0
  193. package/dist/components/general.js.map +0 -0
  194. package/dist/components/helper/date-filter.cjs +3 -0
  195. package/dist/components/helper/date-filter.cjs.map +1 -0
  196. package/dist/components/helper/date-filter.d.cts +19 -0
  197. package/dist/components/helper/date-filter.d.ts +19 -0
  198. package/dist/components/helper/date-filter.js +3 -0
  199. package/dist/components/helper/date-filter.js.map +1 -0
  200. package/dist/components/layouts/app-container.cjs +3 -0
  201. package/dist/components/layouts/app-container.cjs.map +1 -0
  202. package/dist/components/layouts/app-container.d.cts +11 -0
  203. package/dist/components/layouts/app-container.d.ts +11 -0
  204. package/dist/components/layouts/app-container.js +3 -0
  205. package/dist/components/layouts/app-container.js.map +1 -0
  206. package/dist/components/layouts/app-content.cjs +3 -0
  207. package/dist/components/layouts/app-content.cjs.map +1 -0
  208. package/dist/components/layouts/app-content.d.cts +53 -0
  209. package/dist/components/layouts/app-content.d.ts +53 -0
  210. package/dist/components/layouts/app-content.js +3 -0
  211. package/dist/components/layouts/app-content.js.map +1 -0
  212. package/dist/components/layouts/app-footer.cjs +3 -0
  213. package/dist/components/layouts/app-footer.cjs.map +1 -0
  214. package/dist/components/layouts/app-footer.d.cts +17 -0
  215. package/dist/components/layouts/app-footer.d.ts +17 -0
  216. package/dist/components/layouts/app-footer.js +3 -0
  217. package/dist/components/layouts/app-footer.js.map +1 -0
  218. package/dist/components/layouts/app-header.cjs +3 -0
  219. package/dist/components/layouts/app-header.cjs.map +1 -0
  220. package/dist/components/layouts/app-header.d.cts +32 -0
  221. package/dist/components/layouts/app-header.d.ts +32 -0
  222. package/dist/components/layouts/app-header.js +3 -0
  223. package/dist/components/layouts/app-header.js.map +1 -0
  224. package/dist/components/layouts/index.cjs +3 -0
  225. package/dist/components/layouts/index.cjs.map +1 -0
  226. package/dist/components/layouts/index.d.cts +7 -0
  227. package/dist/components/layouts/index.d.ts +7 -0
  228. package/dist/components/layouts/index.js +3 -0
  229. package/dist/components/layouts/index.js.map +1 -0
  230. package/dist/components/ui/badge.cjs +3 -0
  231. package/dist/components/ui/badge.cjs.map +1 -0
  232. package/dist/components/ui/badge.d.cts +13 -0
  233. package/dist/components/ui/badge.d.ts +13 -0
  234. package/dist/components/ui/badge.js +3 -0
  235. package/dist/components/ui/badge.js.map +1 -0
  236. package/dist/components/ui/button.cjs +3 -0
  237. package/dist/components/ui/button.cjs.map +1 -0
  238. package/dist/components/ui/button.d.cts +14 -0
  239. package/dist/components/ui/button.d.ts +14 -0
  240. package/dist/components/ui/button.js +3 -0
  241. package/dist/components/ui/button.js.map +1 -0
  242. package/dist/components/ui/calendar.cjs +3 -0
  243. package/dist/components/ui/calendar.cjs.map +1 -0
  244. package/dist/components/ui/calendar.d.cts +13 -0
  245. package/dist/components/ui/calendar.d.ts +13 -0
  246. package/dist/components/ui/calendar.js +3 -0
  247. package/dist/components/ui/calendar.js.map +1 -0
  248. package/dist/components/ui/card.cjs +3 -0
  249. package/dist/components/ui/card.cjs.map +1 -0
  250. package/dist/components/ui/card.d.cts +12 -0
  251. package/dist/components/ui/card.d.ts +12 -0
  252. package/dist/components/ui/card.js +3 -0
  253. package/dist/components/ui/card.js.map +1 -0
  254. package/dist/components/ui/checkbox.cjs +3 -0
  255. package/dist/components/ui/checkbox.cjs.map +1 -0
  256. package/dist/components/ui/checkbox.d.cts +7 -0
  257. package/dist/components/ui/checkbox.d.ts +7 -0
  258. package/dist/components/ui/checkbox.js +3 -0
  259. package/dist/components/ui/checkbox.js.map +1 -0
  260. package/dist/components/ui/command.cjs +3 -0
  261. package/dist/components/ui/command.cjs.map +1 -0
  262. package/dist/components/ui/command.d.cts +20 -0
  263. package/dist/components/ui/command.d.ts +20 -0
  264. package/dist/components/ui/command.js +3 -0
  265. package/dist/components/ui/command.js.map +1 -0
  266. package/dist/components/ui/dialog.cjs +3 -0
  267. package/dist/components/ui/dialog.cjs.map +1 -0
  268. package/dist/components/ui/dialog.d.cts +16 -0
  269. package/dist/components/ui/dialog.d.ts +16 -0
  270. package/dist/components/ui/dialog.js +3 -0
  271. package/dist/components/ui/dialog.js.map +1 -0
  272. package/dist/components/ui/dropdown-menu.cjs +3 -0
  273. package/dist/components/ui/dropdown-menu.cjs.map +1 -0
  274. package/dist/components/ui/dropdown-menu.d.cts +28 -0
  275. package/dist/components/ui/dropdown-menu.d.ts +28 -0
  276. package/dist/components/ui/dropdown-menu.js +3 -0
  277. package/dist/components/ui/dropdown-menu.js.map +1 -0
  278. package/dist/components/ui/input.cjs +3 -0
  279. package/dist/components/ui/input.cjs.map +1 -0
  280. package/dist/components/ui/input.d.cts +6 -0
  281. package/dist/components/ui/input.d.ts +6 -0
  282. package/dist/components/ui/input.js +3 -0
  283. package/dist/components/ui/input.js.map +1 -0
  284. package/dist/components/ui/popover.cjs +3 -0
  285. package/dist/components/ui/popover.cjs.map +1 -0
  286. package/dist/components/ui/popover.d.cts +10 -0
  287. package/dist/components/ui/popover.d.ts +10 -0
  288. package/dist/components/ui/popover.js +3 -0
  289. package/dist/components/ui/popover.js.map +1 -0
  290. package/dist/components/ui/select.cjs +3 -0
  291. package/dist/components/ui/select.cjs.map +1 -0
  292. package/dist/components/ui/select.d.cts +18 -0
  293. package/dist/components/ui/select.d.ts +18 -0
  294. package/dist/components/ui/select.js +3 -0
  295. package/dist/components/ui/select.js.map +1 -0
  296. package/dist/components/ui/separator.cjs +3 -0
  297. package/dist/components/ui/separator.cjs.map +1 -0
  298. package/dist/components/ui/separator.d.cts +7 -0
  299. package/dist/components/ui/separator.d.ts +7 -0
  300. package/dist/components/ui/separator.js +3 -0
  301. package/dist/components/ui/separator.js.map +1 -0
  302. package/dist/components/ui/sheet.cjs +3 -0
  303. package/dist/components/ui/sheet.cjs.map +1 -0
  304. package/dist/components/ui/sheet.d.cts +18 -0
  305. package/dist/components/ui/sheet.d.ts +18 -0
  306. package/dist/components/ui/sheet.js +3 -0
  307. package/dist/components/ui/sheet.js.map +1 -0
  308. package/dist/components/ui/table.cjs +3 -0
  309. package/dist/components/ui/table.cjs.map +1 -0
  310. package/dist/components/ui/table.d.cts +13 -0
  311. package/dist/components/ui/table.d.ts +13 -0
  312. package/dist/components/ui/table.js +3 -0
  313. package/dist/components/ui/table.js.map +1 -0
  314. package/dist/components/ui/toggle.cjs +3 -0
  315. package/dist/components/ui/toggle.cjs.map +1 -0
  316. package/dist/components/ui/toggle.d.cts +16 -0
  317. package/dist/components/ui/toggle.d.ts +16 -0
  318. package/dist/components/ui/toggle.js +3 -0
  319. package/dist/components/ui/toggle.js.map +1 -0
  320. package/dist/components/ui/tooltip.cjs +3 -0
  321. package/dist/components/ui/tooltip.cjs.map +1 -0
  322. package/dist/components/ui/tooltip.d.cts +10 -0
  323. package/dist/components/ui/tooltip.d.ts +10 -0
  324. package/dist/components/ui/tooltip.js +3 -0
  325. package/dist/components/ui/tooltip.js.map +1 -0
  326. package/dist/index.cjs +1 -1
  327. package/dist/index.cjs.map +1 -1
  328. package/dist/index.d.cts +28 -920
  329. package/dist/index.d.ts +28 -920
  330. package/dist/index.js +1 -1
  331. package/dist/index.js.map +1 -1
  332. package/dist/lib/utils.cjs +0 -0
  333. package/dist/lib/utils.cjs.map +0 -0
  334. package/dist/lib/utils.d.cts +0 -0
  335. package/dist/lib/utils.d.ts +0 -0
  336. package/dist/lib/utils.js +0 -0
  337. package/dist/lib/utils.js.map +0 -0
  338. package/package.json +92 -92
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/data/data-table/data-table-header.tsx","../../../../src/lib/utils.ts","../../../../src/components/ui/table.tsx","../../../../src/components/ui/button.tsx","../../../../src/components/ui/dropdown-menu.tsx","../../../../src/components/data/data-table/data-table-pinning.ts"],"sourcesContent":["import { flexRender, type Table } from \"@tanstack/react-table\"\nimport {\n ChevronUp,\n ChevronDown,\n ChevronsUpDown,\n EyeOff,\n MoreHorizontal,\n MoveLeftIcon,\n MoveRightIcon,\n PinOffIcon,\n Calculator,\n} from \"lucide-react\"\nimport { TableHead, TableRow } from \"../../ui/table.jsx\"\nimport { Button } from \"../../ui/button.jsx\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../ui/dropdown-menu.jsx\"\nimport { cn } from \"../../../lib/utils.js\"\nimport type { AggregationConfigMap, GroupColumnDef } from \"./data-table-types.js\"\nimport { getPinningStyles, stickyWidth } from \"./data-table-pinning.js\"\n\ninterface DataTableHeaderRowsProps<T> {\n table: Table<T>\n aggregations: AggregationConfigMap<T>\n enableColumnPinning: boolean\n enableColumnResizing: boolean\n enableColumnVisibility: boolean\n enableRowSelection: boolean\n fixedCheckboxColumn: boolean\n bordered: boolean\n compact: boolean\n onPinColumn: (columnId: string, side: \"left\" | \"right\" | false) => void\n}\n\n/** Column-header rows (sorting/pin menu, aggregation marker, sticky-safe borders, resizer). */\nexport function DataTableHeaderRows<T>({\n table,\n aggregations,\n enableColumnPinning,\n enableColumnResizing,\n enableColumnVisibility,\n enableRowSelection,\n fixedCheckboxColumn,\n bordered,\n compact,\n onPinColumn,\n}: DataTableHeaderRowsProps<T>) {\n // last center column drops border-r so it doesn't double the right-pinned separator\n const centerCols = table.getVisibleLeafColumns().filter((c) => !c.getIsPinned())\n const lastCenterId = centerCols[centerCols.length - 1]?.id\n\n return (\n <>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id} className=\"hover:bg-transparent\">\n {headerGroup.headers.map((header, index) => {\n const isGroupHeader = header.depth === 0 && header.colSpan > 1\n const isPinnedLeft =\n enableColumnPinning &&\n (header.column.getIsPinned() === \"left\" ||\n header.column.id === \"serialNumber\" ||\n (header.column.id === \"select\" && enableRowSelection))\n const isPinnedRight = enableColumnPinning && header.column.getIsPinned() === \"right\"\n const canSort = header.column.getCanSort()\n const canPin = enableColumnPinning && header.column.columnDef.enablePinning !== false\n const isSerialNumber = header.column.id === \"serialNumber\"\n const isCheckbox = header.column.id === \"select\"\n const alwaysPinned = isSerialNumber || (isCheckbox && fixedCheckboxColumn)\n const headerAlign = (header.column.columnDef as GroupColumnDef<T>).headerAlign || \"left\"\n const hasAggregation = aggregations && aggregations[header.column.id]?.enabled\n const canHide = enableColumnVisibility && !alwaysPinned && header.column.getCanHide()\n const menuAllowed = (header.column.columnDef as GroupColumnDef<T>).enableHeaderMenu !== false\n const hasMenu = menuAllowed && (canSort || (canPin && !alwaysPinned) || canHide)\n const sorted = header.column.getIsSorted()\n const reserveMenuSpace = (header.column.columnDef as GroupColumnDef<T>).reserveMenuSpace === true\n\n const flexJustify = {\n left: \"justify-start\",\n center: \"justify-center\",\n right: \"justify-end\",\n }[headerAlign]\n\n return (\n <TableHead\n key={header.id}\n colSpan={header.colSpan}\n data-col-id={!isGroupHeader ? header.column.id : undefined}\n className={cn(\n \"group bg-sidebar px-0 font-semibold text-foreground\",\n !compact && \"py-2\",\n bordered &&\n index < headerGroup.headers.length - 1 &&\n header.column.id !== lastCenterId &&\n \"border-r\",\n \"relative\",\n isPinnedLeft && \"sticky left-0 z-25 bg-sidebar/95\",\n isPinnedRight && \"sticky right-0 z-25 bg-sidebar/95\",\n (isSerialNumber || isCheckbox) && \"sticky left-0 z-25 bg-sidebar/95\",\n isGroupHeader ? \"text-center\" : \"text-left\"\n )}\n style={{\n width: stickyWidth(header.getSize(), isPinnedLeft || isPinnedRight),\n minWidth: stickyWidth(header.getSize(), isPinnedLeft || isPinnedRight),\n ...getPinningStyles(header.column, enableColumnPinning),\n }}\n >\n {isGroupHeader ? (\n <div className=\"flex justify-center items-center\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {hasAggregation && <Calculator className=\"ml-1 w-3 h-3 text-primary\" />}\n </div>\n ) : (\n <div\n className={cn(\"relative flex items-center px-2 w-full\", flexJustify, canSort && \"cursor-pointer select-none\")}\n onClick={canSort ? (e) => {\n // Custom (JSX) headers may hold their own controls — a click on one must not sort.\n if ((e.target as HTMLElement).closest(\"button, a, input, select, [role=button], [role=checkbox]\")) return\n header.column.getToggleSortingHandler()?.(e)\n } : undefined}\n >\n {/* sorted, or a column opted into reserveMenuSpace, reserves real space\n (deliberate user action / explicit opt-in — column may grow); everyone\n else's hover reserves nothing, the cluster is pure overlay */}\n <div className={cn(\n \"flex items-center gap-1 min-w-0 max-w-full\",\n sorted && (headerAlign === \"right\" ? \"pl-6\" : \"pr-6\"),\n reserveMenuSpace && (headerAlign === \"right\"\n ? (hasMenu ? \"pl-12\" : \"pl-6\")\n : (hasMenu ? \"pr-12\" : \"pr-6\")),\n )}>\n {hasAggregation && <Calculator className=\"mr-1 w-3 h-3 text-primary shrink-0\" />}\n {header.isPlaceholder ? null : (\n <span className=\"truncate\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </span>\n )}\n </div>\n {/* floating right cluster [sort chevron][⋯]: while sorted the title reserves\n pr-6 so it ellipses instead of running under the chevron, and the chevron\n sits at the right edge. On hover the ⋯ expands w-0→w-6, shifting the\n chevron left to make room; a gradient scrim fades the title out under the\n overlay. pointer-events-none keeps the whole area click-to-sort, only the\n button itself is interactive. */}\n {(hasMenu || canSort) && (\n <div className={cn(\n \"absolute inset-y-0 flex items-center pointer-events-none\",\n headerAlign === \"right\" ? \"left-0 pr-8 pl-1 flex-row-reverse\" : \"right-0 pl-8 pr-1\"\n )}>\n <div\n className={cn(\n \"absolute inset-0 from-sidebar from-45% to-transparent\",\n headerAlign === \"right\" ? \"bg-gradient-to-r\" : \"bg-gradient-to-l\",\n \"transition-opacity duration-200 ease-out\",\n \"opacity-0 group-hover:opacity-100 group-has-[[data-state=open]]:opacity-100\"\n )}\n />\n {canSort && (\n <span className=\"relative shrink-0\">\n {sorted ? (\n sorted === \"asc\" ? <ChevronUp className=\"w-4 h-4\" /> : <ChevronDown className=\"w-4 h-4\" />\n ) : (\n <ChevronsUpDown className=\"w-3.5 h-3.5 opacity-0 group-hover:opacity-40 transition-opacity\" />\n )}\n </span>\n )}\n {hasMenu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n tabIndex={-1}\n aria-label=\"Column options\"\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"relative size-6 rounded-sm pointer-events-auto overflow-hidden\",\n \"bg-sidebar hover:bg-border dark:bg-sidebar dark:hover:bg-accent\",\n \"w-0 opacity-0 group-hover:w-5 group-hover:opacity-100\",\n headerAlign === \"right\" ? \"mr-0\" : \"ml-0\",\n canSort && (headerAlign === \"right\" ? \"group-hover:mr-0.5\" : \"group-hover:ml-0.5\"),\n \"data-[state=open]:w-5 data-[state=open]:opacity-100\",\n canSort && (headerAlign === \"right\" ? \"data-[state=open]:mr-0.5\" : \"data-[state=open]:ml-0.5\"),\n \"transition-all duration-200 ease-out\"\n )}\n >\n <MoreHorizontal className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n {/* content is portaled but React events still bubble through the\n component tree — without this, item clicks hit click-to-sort */}\n <DropdownMenuContent\n align=\"end\"\n className=\"w-48\"\n onClick={(e) => e.stopPropagation()}\n >\n {canSort && (\n <>\n <DropdownMenuLabel>Sorting</DropdownMenuLabel>\n <DropdownMenuItem\n onClick={() => header.column.toggleSorting(false)}\n disabled={sorted === \"asc\"}\n >\n <ChevronUp className=\"mr-2 w-4 h-4\" />\n Sort Ascending\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => header.column.toggleSorting(true)}\n disabled={sorted === \"desc\"}\n >\n <ChevronDown className=\"mr-2 w-4 h-4\" />\n Sort Descending\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => header.column.clearSorting()}\n disabled={!sorted}\n >\n <ChevronsUpDown className=\"mr-2 w-4 h-4\" />\n Clear Sort\n </DropdownMenuItem>\n {((canPin && !alwaysPinned) || canHide) && <DropdownMenuSeparator />}\n </>\n )}\n {canPin && !alwaysPinned && (\n <>\n <DropdownMenuLabel>Pin Column</DropdownMenuLabel>\n <DropdownMenuItem\n onClick={() => onPinColumn(header.column.id, \"left\")}\n disabled={header.column.getIsPinned() === \"left\"}\n >\n <MoveLeftIcon />\n Pin Left\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => onPinColumn(header.column.id, \"right\")}\n disabled={header.column.getIsPinned() === \"right\"}\n >\n <MoveRightIcon />\n Pin Right\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => onPinColumn(header.column.id, false)}\n disabled={!header.column.getIsPinned()}\n >\n <PinOffIcon />\n Unpin\n </DropdownMenuItem>\n {canHide && <DropdownMenuSeparator />}\n </>\n )}\n {canHide && (\n <DropdownMenuItem onClick={() => header.column.toggleVisibility(false)}>\n <EyeOff className=\"mr-2 w-4 h-4\" />\n Hide Column\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )}\n </div>\n )}\n {/* border drawn in-cell (a border on the sticky header scrolls away) */}\n <div\n className={cn(\n \"absolute bottom-0 inset-x-0 pointer-events-none\",\n hasAggregation ? \"h-0.5 bg-primary/40\" : \"h-px bg-border\"\n )}\n />\n {/* Column Resizer */}\n {enableColumnResizing &&\n header.column.getCanResize() &&\n !isGroupHeader &&\n header.colSpan === 1 && (\n <div\n className=\"top-0 right-0 absolute hover:bg-primary opacity-0 hover:opacity-100 bg-border w-1 h-full transition-opacity cursor-col-resize select-none touch-none\"\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onClick={(e) => e.stopPropagation()}\n />\n )}\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </>\n )\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils.js\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full h-full max-h-full overflow-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import * as React from \"react\"\nimport { Slot as SlotPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils.js\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 dark:focus-visible:border-ring\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils.js\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"cursor-pointer focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","import type { Column, ColumnPinningState, Table } from \"@tanstack/react-table\"\nimport type { CSSProperties } from \"react\"\nimport type { GroupColumnDef } from \"./data-table-types.js\"\n\n/**\n * Sticky styles for a pinned column cell — TanStack's official pinning pattern\n * (`getStart`/`getAfter` offsets; column locked to `size` so offsets stay true; 1px inset\n * shadow separates the first right-pinned column).\n */\nexport function getPinningStyles(\n column: Column<any, unknown>,\n enableColumnPinning: boolean,\n): CSSProperties {\n if (!enableColumnPinning) return {}\n const pinned = column.getIsPinned()\n if (!pinned) return {}\n\n const size = column.getSize()\n\n return {\n position: \"sticky\",\n left: pinned === \"left\" ? column.getStart(\"left\") : undefined,\n right: pinned === \"right\" ? column.getAfter(\"right\") : undefined,\n width: size,\n minWidth: size,\n maxWidth: size,\n // box-shadow (not border) stays put on sticky cells; marks the right-pinned group's left edge\n boxShadow:\n pinned === \"right\" && column.getIsFirstColumn(\"right\")\n ? \"inset 1px 0 0 0 var(--border)\"\n : undefined,\n }\n}\n\n/** Width for a non-pinned cell: explicit size or auto (150 = TanStack default = auto). */\nexport const stickyWidth = (size: number, isPinned: boolean): number | string =>\n isPinned ? size : size !== 150 ? size : \"auto\"\n\n/**\n * Resolve `defaultPin`/`pinIndex` off the raw column defs (recursing into group columns) into\n * ordered left/right id lists for the table's initial pinning state. Lower `pinIndex` sits\n * closer to the outer edge; columns without a finite `pinIndex` keep declaration order.\n * Defensive against bad input (duplicate/malformed ids, non-numeric `pinIndex`, an invalid\n * `defaultPin` value slipping through from untyped JS callers): each is skipped or falls back\n * rather than corrupting the pinning state.\n */\nexport function collectDefaultPinned<T>(columns: GroupColumnDef<T>[]): { left: string[]; right: string[] } {\n type Entry = { id: string; order: number }\n const left: Entry[] = []\n const right: Entry[] = []\n const seen = new Set<string>()\n\n const walk = (cols: GroupColumnDef<T>[]) => {\n cols.forEach((col, index) => {\n const rawId = (col as any).id ?? (col as any).accessorKey\n const id = rawId != null ? String(rawId) : \"\"\n if (id && (col.defaultPin === \"left\" || col.defaultPin === \"right\") && !seen.has(id)) {\n seen.add(id)\n const order = Number.isFinite(col.pinIndex as number) ? (col.pinIndex as number) : index\n ;(col.defaultPin === \"left\" ? left : right).push({ id, order })\n }\n if (col.columns) walk(col.columns)\n })\n }\n walk(columns)\n\n // stable sort (spec-guaranteed since ES2019): equal/duplicate `order` values keep declaration order\n const toIds = (entries: Entry[]) => entries.sort((a, b) => a.order - b.order).map((e) => e.id)\n return { left: toIds(left), right: toIds(right) }\n}\n\n/** Re-assert the always-left-pinned helper columns on every pinning change. */\nexport function enforceAlwaysPinned(next: ColumnPinningState, always: string[]): ColumnPinningState {\n return {\n left: [...always, ...(next.left ?? []).filter((id) => !always.includes(id))],\n right: (next.right ?? []).filter((id) => !always.includes(id)),\n }\n}\n\n/**\n * Pin/unpin a column. Captures the column's live rendered width on pin (so it doesn't jump to\n * its declared `size`) and drops the override on unpin.\n */\nexport function pinColumn<T>(\n table: Table<T>,\n columnId: string,\n side: \"left\" | \"right\" | false,\n opts: { container: HTMLElement | null; alwaysPinnedLeft: string[] },\n) {\n if (side === false) {\n table.setColumnSizing((prev) => {\n const next = { ...prev }\n delete next[columnId]\n return next\n })\n } else {\n const headerEl = opts.container?.querySelector<HTMLElement>(`[data-col-id=\"${columnId}\"]`)\n const width = headerEl ? Math.round(headerEl.getBoundingClientRect().width) : 0\n if (width > 0) table.setColumnSizing((prev) => ({ ...prev, [columnId]: width }))\n }\n\n const { alwaysPinnedLeft } = opts\n const current = table.getState().columnPinning\n const newPinning = {\n left: (current.left ?? []).filter((id) => alwaysPinnedLeft.includes(id)),\n right: [...(current.right ?? [])],\n }\n\n if (side === \"right\") {\n if (!newPinning.right.includes(columnId)) newPinning.right.push(columnId)\n } else if (side === \"left\") {\n newPinning.right = newPinning.right.filter((id) => id !== columnId)\n if (!newPinning.left.includes(columnId) && !alwaysPinnedLeft.includes(columnId)) {\n newPinning.left.push(columnId)\n }\n } else {\n newPinning.left = newPinning.left.filter((id) => id !== columnId)\n newPinning.right = newPinning.right.filter((id) => id !== columnId)\n }\n\n table.setColumnPinning(newPinning)\n}\n"],"mappings":"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","names":["flexRender","ChevronUp","ChevronDown","ChevronsUpDown","EyeOff","MoreHorizontal","MoveLeftIcon","MoveRightIcon","PinOffIcon","Calculator","clsx","twMerge","cn","inputs","jsx","TableRow","className","props","jsx","cn","TableHead","SlotPrimitive","cva","jsx","buttonVariants","cva","Button","className","variant","size","asChild","props","Comp","SlotPrimitive","cn","DropdownMenuPrimitive","CheckIcon","ChevronRightIcon","CircleIcon","jsx","jsxs","DropdownMenu","props","DropdownMenuPrimitive","DropdownMenuTrigger","props","jsx","DropdownMenuPrimitive","DropdownMenuContent","className","sideOffset","cn","DropdownMenuItem","className","inset","variant","props","jsx","DropdownMenuPrimitive","cn","DropdownMenuLabel","className","inset","props","jsx","DropdownMenuPrimitive","cn","DropdownMenuSeparator","getPinningStyles","column","enableColumnPinning","pinned","size","stickyWidth","isPinned","Fragment","jsx","jsxs","DataTableHeaderRows","table","aggregations","enableColumnPinning","enableColumnResizing","enableColumnVisibility","enableRowSelection","fixedCheckboxColumn","bordered","compact","onPinColumn","centerCols","c","lastCenterId","headerGroup","TableRow","header","index","isGroupHeader","isPinnedLeft","isPinnedRight","canSort","canPin","isSerialNumber","isCheckbox","alwaysPinned","headerAlign","hasAggregation","canHide","hasMenu","sorted","reserveMenuSpace","flexJustify","TableHead","cn","stickyWidth","getPinningStyles","flexRender","Calculator","e","ChevronUp","ChevronDown","ChevronsUpDown","DropdownMenu","DropdownMenuTrigger","Button","MoreHorizontal","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","DropdownMenuSeparator","MoveLeftIcon","MoveRightIcon","PinOffIcon","EyeOff"]}
@@ -0,0 +1,3 @@
1
+ "use client"
2
+ "use strict";var b=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var _=(e,t)=>{for(var o in t)b(e,o,{get:t[o],enumerable:!0})},M=(e,t,o,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of B(t))!D.call(e,n)&&n!==o&&b(e,n,{get:()=>t[n],enumerable:!(i=V(t,n))||i.enumerable});return e};var j=e=>M(b({},"__esModule",{value:!0}),e);var O={};_(O,{DataTablePagination:()=>G});module.exports=j(O);var x=require("lucide-react");var y=require("radix-ui"),w=require("class-variance-authority");var S=require("clsx"),P=require("tailwind-merge");function p(...e){return(0,P.twMerge)((0,S.clsx)(e))}var N=require("react/jsx-runtime"),L=(0,w.cva)("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 dark:focus-visible:border-ring",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function h({className:e,variant:t,size:o,asChild:i=!1,...n}){let d=i?y.Slot.Slot:"button";return(0,N.jsx)(d,{"data-slot":"button",className:p(L({variant:t,size:o,className:e})),...n})}var c=require("radix-ui"),m=require("lucide-react");var r=require("react/jsx-runtime");function C({...e}){return(0,r.jsx)(c.Select.Root,{"data-slot":"select",...e})}function z({...e}){return(0,r.jsx)(c.Select.Value,{"data-slot":"select-value",...e})}function k({className:e,size:t="default",children:o,...i}){return(0,r.jsxs)(c.Select.Trigger,{"data-slot":"select-trigger","data-size":t,className:p("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...i,children:[o,(0,r.jsx)(c.Select.Icon,{asChild:!0,children:(0,r.jsx)(m.ChevronDownIcon,{className:"size-4 opacity-50"})})]})}function I({className:e,children:t,position:o="popper",...i}){return(0,r.jsx)(c.Select.Portal,{children:(0,r.jsxs)(c.Select.Content,{"data-slot":"select-content",className:p("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",o==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:o,...i,children:[(0,r.jsx)(U,{}),(0,r.jsx)(c.Select.Viewport,{className:p("p-1",o==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),children:t}),(0,r.jsx)(A,{})]})})}function R({className:e,children:t,...o}){return(0,r.jsxs)(c.Select.Item,{"data-slot":"select-item",className:p("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",e),...o,children:[(0,r.jsx)("span",{className:"absolute right-2 flex size-3.5 items-center justify-center",children:(0,r.jsx)(c.Select.ItemIndicator,{children:(0,r.jsx)(m.CheckIcon,{className:"size-4"})})}),(0,r.jsx)(c.Select.ItemText,{children:t})]})}function U({className:e,...t}){return(0,r.jsx)(c.Select.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:p("flex cursor-default items-center justify-center py-1",e),...t,children:(0,r.jsx)(m.ChevronUpIcon,{className:"size-4"})})}function A({className:e,...t}){return(0,r.jsx)(c.Select.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:p("flex cursor-default items-center justify-center py-1",e),...t,children:(0,r.jsx)(m.ChevronDownIcon,{className:"size-4"})})}var a=require("react/jsx-runtime");function $(e,t,o=1){let i=e+1,n=o*2+5;if(t<=n)return Array.from({length:t},(s,T)=>T+1);let d=Math.max(i-o,1),g=Math.min(i+o,t),l=d>2,f=g<t-1,v=3+o*2,u=[];if(!l&&f){for(let s=1;s<=v;s++)u.push(s);u.push("ellipsis",t)}else if(l&&!f){u.push(1,"ellipsis");for(let s=t-v+1;s<=t;s++)u.push(s)}else{u.push(1,"ellipsis");for(let s=d;s<=g;s++)u.push(s);u.push("ellipsis",t)}return u}function G({table:e,config:t}){if(!t)return null;let o=e.getPageCount(),i=e.getState().pagination.pageIndex,n=e.getState().pagination.pageSize,d=e.getFilteredRowModel().rows.length,g="size-8 p-0 rounded-lg";return(0,a.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded-xl",children:[t.showInfo!==!1&&(0,a.jsxs)("span",{className:"hidden text-sm text-muted-foreground sm:inline",children:["Showing ",d===0?0:i*n+1," to"," ",Math.min((i+1)*n,d)," of ",d," entries"]}),(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(()=>{let l=t.pageSizeOptions??[10,25,50,100,-1];if(l.length===0)return null;let f=l.includes(-1),v=d>0&&n>=d,u=f&&v?"-1":`${n}`;return(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"hidden text-sm font-medium md:inline",children:"Rows"}),(0,a.jsxs)(C,{value:u,onValueChange:s=>e.setPageSize(s==="-1"?Math.max(d,1):Number(s)),children:[(0,a.jsx)(k,{className:"h-8 w-auto min-w-[4rem] gap-1 rounded-lg",children:(0,a.jsx)(z,{})}),(0,a.jsx)(I,{side:"top",className:"rounded-lg",children:l.map(s=>(0,a.jsx)(R,{value:`${s}`,children:s===-1?"All":s},s))})]})]})})(),o>1&&(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(h,{variant:"outline",size:"sm",onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),"aria-label":"Previous page",className:g,children:(0,a.jsx)(x.ChevronLeft,{className:"size-4"})}),t.showPageNumbers&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("span",{className:"px-2 text-sm text-muted-foreground tabular-nums sm:hidden",children:[i+1," / ",o]}),(0,a.jsx)("div",{className:"hidden items-center gap-1 sm:flex",children:$(i,o).map((l,f)=>l==="ellipsis"?(0,a.jsx)("span",{className:"flex size-8 items-center justify-center text-sm text-muted-foreground",children:"\u2026"},`e${f}`):(0,a.jsx)(h,{variant:l-1===i?"default":"outline",size:"sm",className:p(g,"tabular-nums"),onClick:()=>e.setPageIndex(l-1),"aria-label":`Page ${l}`,"aria-current":l-1===i?"page":void 0,children:l},l))})]}),(0,a.jsx)(h,{variant:"outline",size:"sm",onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),"aria-label":"Next page",className:g,children:(0,a.jsx)(x.ChevronRight,{className:"size-4"})})]})]})]})}0&&(module.exports={DataTablePagination});
3
+ //# sourceMappingURL=data-table-pagination.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/data/data-table/data-table-pagination.tsx","../../../../src/components/ui/button.tsx","../../../../src/lib/utils.ts","../../../../src/components/ui/select.tsx"],"sourcesContent":["import type { Table } from \"@tanstack/react-table\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\n\nimport { Button } from \"../../ui/button.jsx\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui/select.jsx\"\nimport { cn } from \"../../../lib/utils.js\"\nimport type { PaginationConfig } from \"./data-table-types.js\"\n\ninterface DataTablePaginationProps<TData> {\n table: Table<TData>\n config?: PaginationConfig\n}\n\n/**\n * Page items (1-based) with ellipsis gaps, e.g. `1 … 4 5 [6] 7 8 … 20`.\n * Always shows the first & last page plus a window of `siblings` around the current page.\n */\nfunction getPageItems(current: number, pageCount: number, siblings = 1): (number | \"ellipsis\")[] {\n const cur = current + 1 // work 1-based\n const slots = siblings * 2 + 5 // first, last, current, 2*siblings, 2 ellipsis\n if (pageCount <= slots) {\n return Array.from({ length: pageCount }, (_, i) => i + 1)\n }\n\n const left = Math.max(cur - siblings, 1)\n const right = Math.min(cur + siblings, pageCount)\n const showLeftDots = left > 2\n const showRightDots = right < pageCount - 1\n const edgeCount = 3 + siblings * 2\n const items: (number | \"ellipsis\")[] = []\n\n if (!showLeftDots && showRightDots) {\n for (let i = 1; i <= edgeCount; i++) items.push(i)\n items.push(\"ellipsis\", pageCount)\n } else if (showLeftDots && !showRightDots) {\n items.push(1, \"ellipsis\")\n for (let i = pageCount - edgeCount + 1; i <= pageCount; i++) items.push(i)\n } else {\n items.push(1, \"ellipsis\")\n for (let i = left; i <= right; i++) items.push(i)\n items.push(\"ellipsis\", pageCount)\n }\n return items\n}\n\nexport function DataTablePagination<TData>({ table, config }: DataTablePaginationProps<TData>) {\n if (!config) return null\n\n const pageCount = table.getPageCount()\n const pageIndex = table.getState().pagination.pageIndex\n const pageSize = table.getState().pagination.pageSize\n const totalRows = table.getFilteredRowModel().rows.length\n\n const navBtn = \"size-8 p-0 rounded-lg\"\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-3 rounded-xl\">\n {/* Left: range info */}\n {config.showInfo !== false && (\n <span className=\"hidden text-sm text-muted-foreground sm:inline\">\n Showing {totalRows === 0 ? 0 : pageIndex * pageSize + 1} to{\" \"}\n {Math.min((pageIndex + 1) * pageSize, totalRows)} of {totalRows} entries\n </span>\n )}\n\n {/* Right: page size + nav */}\n <div className=\"flex items-center gap-3\">\n {(() => {\n // Sensible defaults when the consumer doesn't pass options (incl. \"All\"); pass `[]`\n // to hide the selector entirely. `-1` renders \"All\" (page size = row count).\n const sizeOptions = config.pageSizeOptions ?? [10, 25, 50, 100, -1]\n if (sizeOptions.length === 0) return null\n const hasAll = sizeOptions.includes(-1)\n const showingAll = totalRows > 0 && pageSize >= totalRows\n const selectValue = hasAll && showingAll ? \"-1\" : `${pageSize}`\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"hidden text-sm font-medium md:inline\">Rows</span>\n <Select\n value={selectValue}\n onValueChange={(value) =>\n table.setPageSize(value === \"-1\" ? Math.max(totalRows, 1) : Number(value))\n }\n >\n <SelectTrigger className=\"h-8 w-auto min-w-[4rem] gap-1 rounded-lg\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent side=\"top\" className=\"rounded-lg\">\n {sizeOptions.map((size) => (\n <SelectItem key={size} value={`${size}`}>\n {size === -1 ? \"All\" : size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n })()}\n\n {/* Nav only makes sense with more than one page — otherwise it's just muted buttons. */}\n {pageCount > 1 && (\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"Previous page\"\n className={navBtn}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n\n {config.showPageNumbers && (\n <>\n {/* Mobile: compact \"current / total\" (the full window is too wide for phones). */}\n <span className=\"px-2 text-sm text-muted-foreground tabular-nums sm:hidden\">\n {pageIndex + 1} / {pageCount}\n </span>\n\n {/* sm+: full ellipsis window. */}\n <div className=\"hidden items-center gap-1 sm:flex\">\n {getPageItems(pageIndex, pageCount).map((item, i) =>\n item === \"ellipsis\" ? (\n <span\n key={`e${i}`}\n className=\"flex size-8 items-center justify-center text-sm text-muted-foreground\"\n >\n …\n </span>\n ) : (\n <Button\n key={item}\n variant={item - 1 === pageIndex ? \"default\" : \"outline\"}\n size=\"sm\"\n className={cn(navBtn, \"tabular-nums\")}\n onClick={() => table.setPageIndex(item - 1)}\n aria-label={`Page ${item}`}\n aria-current={item - 1 === pageIndex ? \"page\" : undefined}\n >\n {item}\n </Button>\n ),\n )}\n </div>\n </>\n )}\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label=\"Next page\"\n className={navBtn}\n >\n <ChevronRight className=\"size-4\" />\n </Button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { Slot as SlotPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils.js\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 dark:focus-visible:border-ring\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils.js\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"mappings":"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","names":["data_table_pagination_exports","__export","DataTablePagination","__toCommonJS","import_lucide_react","import_radix_ui","import_class_variance_authority","import_clsx","import_tailwind_merge","cn","inputs","import_jsx_runtime","buttonVariants","Button","className","variant","size","asChild","props","Comp","SlotPrimitive","cn","import_radix_ui","import_lucide_react","import_jsx_runtime","Select","props","SelectPrimitive","SelectValue","props","SelectPrimitive","SelectTrigger","className","size","children","cn","SelectContent","position","SelectScrollUpButton","SelectScrollDownButton","SelectItem","className","children","props","SelectPrimitive","cn","SelectScrollUpButton","className","props","SelectPrimitive","cn","SelectScrollDownButton","import_jsx_runtime","getPageItems","current","pageCount","siblings","cur","slots","_","i","left","right","showLeftDots","showRightDots","edgeCount","items","DataTablePagination","table","config","pageIndex","pageSize","totalRows","navBtn","sizeOptions","hasAll","showingAll","selectValue","Select","value","SelectTrigger","SelectValue","SelectContent","size","SelectItem","Button","item","cn"]}
@@ -0,0 +1,14 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Table } from '@tanstack/react-table';
3
+ import { PaginationConfig } from './data-table-types.cjs';
4
+ import 'lucide-react';
5
+ import './data-table-persist.cjs';
6
+ import './data-table-export.cjs';
7
+
8
+ interface DataTablePaginationProps<TData> {
9
+ table: Table<TData>;
10
+ config?: PaginationConfig;
11
+ }
12
+ declare function DataTablePagination<TData>({ table, config }: DataTablePaginationProps<TData>): react_jsx_runtime.JSX.Element | null;
13
+
14
+ export { DataTablePagination };
@@ -0,0 +1,14 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { Table } from '@tanstack/react-table';
3
+ import { PaginationConfig } from './data-table-types.js';
4
+ import 'lucide-react';
5
+ import './data-table-persist.js';
6
+ import './data-table-export.js';
7
+
8
+ interface DataTablePaginationProps<TData> {
9
+ table: Table<TData>;
10
+ config?: PaginationConfig;
11
+ }
12
+ declare function DataTablePagination<TData>({ table, config }: DataTablePaginationProps<TData>): react_jsx_runtime.JSX.Element | null;
13
+
14
+ export { DataTablePagination };
@@ -0,0 +1,3 @@
1
+ "use client"
2
+ import{ChevronLeft as j,ChevronRight as L}from"lucide-react";import{Slot as I}from"radix-ui";import{cva as R}from"class-variance-authority";import{clsx as z}from"clsx";import{twMerge as k}from"tailwind-merge";function d(...e){return k(z(e))}import{jsx as V}from"react/jsx-runtime";var T=R("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 dark:focus-visible:border-ring",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function h({className:e,variant:t,size:o,asChild:s=!1,...u}){let c=s?I.Slot:"button";return V(c,{"data-slot":"button",className:d(T({variant:t,size:o,className:e})),...u})}import{Select as n}from"radix-ui";import{CheckIcon as B,ChevronDownIcon as b,ChevronUpIcon as D}from"lucide-react";import{jsx as r,jsxs as x}from"react/jsx-runtime";function S({...e}){return r(n.Root,{"data-slot":"select",...e})}function P({...e}){return r(n.Value,{"data-slot":"select-value",...e})}function y({className:e,size:t="default",children:o,...s}){return x(n.Trigger,{"data-slot":"select-trigger","data-size":t,className:d("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...s,children:[o,r(n.Icon,{asChild:!0,children:r(b,{className:"size-4 opacity-50"})})]})}function w({className:e,children:t,position:o="popper",...s}){return r(n.Portal,{children:x(n.Content,{"data-slot":"select-content",className:d("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",o==="popper"&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",e),position:o,...s,children:[r(_,{}),r(n.Viewport,{className:d("p-1",o==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),children:t}),r(M,{})]})})}function N({className:e,children:t,...o}){return x(n.Item,{"data-slot":"select-item",className:d("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",e),...o,children:[r("span",{className:"absolute right-2 flex size-3.5 items-center justify-center",children:r(n.ItemIndicator,{children:r(B,{className:"size-4"})})}),r(n.ItemText,{children:t})]})}function _({className:e,...t}){return r(n.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:d("flex cursor-default items-center justify-center py-1",e),...t,children:r(D,{className:"size-4"})})}function M({className:e,...t}){return r(n.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:d("flex cursor-default items-center justify-center py-1",e),...t,children:r(b,{className:"size-4"})})}import{Fragment as A,jsx as l,jsxs as m}from"react/jsx-runtime";function U(e,t,o=1){let s=e+1,u=o*2+5;if(t<=u)return Array.from({length:t},(a,C)=>C+1);let c=Math.max(s-o,1),g=Math.min(s+o,t),i=c>2,f=g<t-1,v=3+o*2,p=[];if(!i&&f){for(let a=1;a<=v;a++)p.push(a);p.push("ellipsis",t)}else if(i&&!f){p.push(1,"ellipsis");for(let a=t-v+1;a<=t;a++)p.push(a)}else{p.push(1,"ellipsis");for(let a=c;a<=g;a++)p.push(a);p.push("ellipsis",t)}return p}function oe({table:e,config:t}){if(!t)return null;let o=e.getPageCount(),s=e.getState().pagination.pageIndex,u=e.getState().pagination.pageSize,c=e.getFilteredRowModel().rows.length,g="size-8 p-0 rounded-lg";return m("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded-xl",children:[t.showInfo!==!1&&m("span",{className:"hidden text-sm text-muted-foreground sm:inline",children:["Showing ",c===0?0:s*u+1," to"," ",Math.min((s+1)*u,c)," of ",c," entries"]}),m("div",{className:"flex items-center gap-3",children:[(()=>{let i=t.pageSizeOptions??[10,25,50,100,-1];if(i.length===0)return null;let f=i.includes(-1),v=c>0&&u>=c,p=f&&v?"-1":`${u}`;return m("div",{className:"flex items-center gap-2",children:[l("span",{className:"hidden text-sm font-medium md:inline",children:"Rows"}),m(S,{value:p,onValueChange:a=>e.setPageSize(a==="-1"?Math.max(c,1):Number(a)),children:[l(y,{className:"h-8 w-auto min-w-[4rem] gap-1 rounded-lg",children:l(P,{})}),l(w,{side:"top",className:"rounded-lg",children:i.map(a=>l(N,{value:`${a}`,children:a===-1?"All":a},a))})]})]})})(),o>1&&m("div",{className:"flex items-center gap-1",children:[l(h,{variant:"outline",size:"sm",onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),"aria-label":"Previous page",className:g,children:l(j,{className:"size-4"})}),t.showPageNumbers&&m(A,{children:[m("span",{className:"px-2 text-sm text-muted-foreground tabular-nums sm:hidden",children:[s+1," / ",o]}),l("div",{className:"hidden items-center gap-1 sm:flex",children:U(s,o).map((i,f)=>i==="ellipsis"?l("span",{className:"flex size-8 items-center justify-center text-sm text-muted-foreground",children:"\u2026"},`e${f}`):l(h,{variant:i-1===s?"default":"outline",size:"sm",className:d(g,"tabular-nums"),onClick:()=>e.setPageIndex(i-1),"aria-label":`Page ${i}`,"aria-current":i-1===s?"page":void 0,children:i},i))})]}),l(h,{variant:"outline",size:"sm",onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),"aria-label":"Next page",className:g,children:l(L,{className:"size-4"})})]})]})]})}export{oe as DataTablePagination};
3
+ //# sourceMappingURL=data-table-pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/data/data-table/data-table-pagination.tsx","../../../../src/components/ui/button.tsx","../../../../src/lib/utils.ts","../../../../src/components/ui/select.tsx"],"sourcesContent":["import type { Table } from \"@tanstack/react-table\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\n\nimport { Button } from \"../../ui/button.jsx\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui/select.jsx\"\nimport { cn } from \"../../../lib/utils.js\"\nimport type { PaginationConfig } from \"./data-table-types.js\"\n\ninterface DataTablePaginationProps<TData> {\n table: Table<TData>\n config?: PaginationConfig\n}\n\n/**\n * Page items (1-based) with ellipsis gaps, e.g. `1 … 4 5 [6] 7 8 … 20`.\n * Always shows the first & last page plus a window of `siblings` around the current page.\n */\nfunction getPageItems(current: number, pageCount: number, siblings = 1): (number | \"ellipsis\")[] {\n const cur = current + 1 // work 1-based\n const slots = siblings * 2 + 5 // first, last, current, 2*siblings, 2 ellipsis\n if (pageCount <= slots) {\n return Array.from({ length: pageCount }, (_, i) => i + 1)\n }\n\n const left = Math.max(cur - siblings, 1)\n const right = Math.min(cur + siblings, pageCount)\n const showLeftDots = left > 2\n const showRightDots = right < pageCount - 1\n const edgeCount = 3 + siblings * 2\n const items: (number | \"ellipsis\")[] = []\n\n if (!showLeftDots && showRightDots) {\n for (let i = 1; i <= edgeCount; i++) items.push(i)\n items.push(\"ellipsis\", pageCount)\n } else if (showLeftDots && !showRightDots) {\n items.push(1, \"ellipsis\")\n for (let i = pageCount - edgeCount + 1; i <= pageCount; i++) items.push(i)\n } else {\n items.push(1, \"ellipsis\")\n for (let i = left; i <= right; i++) items.push(i)\n items.push(\"ellipsis\", pageCount)\n }\n return items\n}\n\nexport function DataTablePagination<TData>({ table, config }: DataTablePaginationProps<TData>) {\n if (!config) return null\n\n const pageCount = table.getPageCount()\n const pageIndex = table.getState().pagination.pageIndex\n const pageSize = table.getState().pagination.pageSize\n const totalRows = table.getFilteredRowModel().rows.length\n\n const navBtn = \"size-8 p-0 rounded-lg\"\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-3 rounded-xl\">\n {/* Left: range info */}\n {config.showInfo !== false && (\n <span className=\"hidden text-sm text-muted-foreground sm:inline\">\n Showing {totalRows === 0 ? 0 : pageIndex * pageSize + 1} to{\" \"}\n {Math.min((pageIndex + 1) * pageSize, totalRows)} of {totalRows} entries\n </span>\n )}\n\n {/* Right: page size + nav */}\n <div className=\"flex items-center gap-3\">\n {(() => {\n // Sensible defaults when the consumer doesn't pass options (incl. \"All\"); pass `[]`\n // to hide the selector entirely. `-1` renders \"All\" (page size = row count).\n const sizeOptions = config.pageSizeOptions ?? [10, 25, 50, 100, -1]\n if (sizeOptions.length === 0) return null\n const hasAll = sizeOptions.includes(-1)\n const showingAll = totalRows > 0 && pageSize >= totalRows\n const selectValue = hasAll && showingAll ? \"-1\" : `${pageSize}`\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"hidden text-sm font-medium md:inline\">Rows</span>\n <Select\n value={selectValue}\n onValueChange={(value) =>\n table.setPageSize(value === \"-1\" ? Math.max(totalRows, 1) : Number(value))\n }\n >\n <SelectTrigger className=\"h-8 w-auto min-w-[4rem] gap-1 rounded-lg\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent side=\"top\" className=\"rounded-lg\">\n {sizeOptions.map((size) => (\n <SelectItem key={size} value={`${size}`}>\n {size === -1 ? \"All\" : size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n })()}\n\n {/* Nav only makes sense with more than one page — otherwise it's just muted buttons. */}\n {pageCount > 1 && (\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"Previous page\"\n className={navBtn}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n\n {config.showPageNumbers && (\n <>\n {/* Mobile: compact \"current / total\" (the full window is too wide for phones). */}\n <span className=\"px-2 text-sm text-muted-foreground tabular-nums sm:hidden\">\n {pageIndex + 1} / {pageCount}\n </span>\n\n {/* sm+: full ellipsis window. */}\n <div className=\"hidden items-center gap-1 sm:flex\">\n {getPageItems(pageIndex, pageCount).map((item, i) =>\n item === \"ellipsis\" ? (\n <span\n key={`e${i}`}\n className=\"flex size-8 items-center justify-center text-sm text-muted-foreground\"\n >\n …\n </span>\n ) : (\n <Button\n key={item}\n variant={item - 1 === pageIndex ? \"default\" : \"outline\"}\n size=\"sm\"\n className={cn(navBtn, \"tabular-nums\")}\n onClick={() => table.setPageIndex(item - 1)}\n aria-label={`Page ${item}`}\n aria-current={item - 1 === pageIndex ? \"page\" : undefined}\n >\n {item}\n </Button>\n ),\n )}\n </div>\n </>\n )}\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label=\"Next page\"\n className={navBtn}\n >\n <ChevronRight className=\"size-4\" />\n </Button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { Slot as SlotPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils.js\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 dark:focus-visible:border-ring\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? SlotPrimitive.Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}","import * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils.js\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n"],"mappings":"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","names":["ChevronLeft","ChevronRight","SlotPrimitive","cva","clsx","twMerge","cn","inputs","jsx","buttonVariants","cva","Button","className","variant","size","asChild","props","Comp","SlotPrimitive","cn","SelectPrimitive","CheckIcon","ChevronDownIcon","ChevronUpIcon","jsx","jsxs","Select","props","SelectPrimitive","SelectValue","props","jsx","SelectPrimitive","SelectTrigger","className","size","children","jsxs","cn","ChevronDownIcon","SelectContent","position","SelectScrollUpButton","SelectScrollDownButton","SelectItem","className","children","props","jsxs","SelectPrimitive","cn","jsx","CheckIcon","SelectScrollUpButton","className","props","jsx","SelectPrimitive","cn","ChevronUpIcon","SelectScrollDownButton","ChevronDownIcon","Fragment","jsx","jsxs","getPageItems","current","pageCount","siblings","cur","slots","_","i","left","right","showLeftDots","showRightDots","edgeCount","items","DataTablePagination","table","config","pageIndex","pageSize","totalRows","navBtn","sizeOptions","hasAll","showingAll","selectValue","Select","value","SelectTrigger","SelectValue","SelectContent","size","SelectItem","Button","ChevronLeft","item","cn","ChevronRight"]}
@@ -0,0 +1,3 @@
1
+ "use client"
2
+ "use strict";var o=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var R=(e,t)=>{for(var n in t)o(e,n,{get:t[n],enumerable:!0})},k=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of h(t))!b.call(e,s)&&s!==n&&o(e,s,{get:()=>t[s],enumerable:!(r=w(t,s))||r.enumerable});return e};var m=e=>k(o({},"__esModule",{value:!0}),e);var T={};R(T,{clearPersisted:()=>F,patchSnapshot:()=>y,readGroupSlots:()=>x,readPersistedExternal:()=>C,readSnapshot:()=>P,resolvePersist:()=>I,subscribeGroup:()=>v,trackMountedKey:()=>M,writeGroupSlot:()=>G});module.exports=m(T);var l="atsui:tbl:v1:",a=new Map,f=new Map;function g(e){try{let t=localStorage.getItem(l+e);return t?JSON.parse(t):void 0}catch{return}}function c(e,t){try{localStorage.setItem(l+e,JSON.stringify(t))}catch{}}function I(e){return e?typeof e=="string"?{key:e}:e:null}function P(e,t){return a.get(e)??(t?g(e):void 0)??{}}function y(e,t,n){let r={...P(e,t),...n};a.set(e,r),t&&c(e,r)}var u=new Map;function v(e,t){let n=u.get(e);return n||(n=new Set,u.set(e,n)),n.add(t),()=>{n.delete(t)}}function x(e,t){return{...t?g("g:"+e)??{}:{},...f.get(e)??{}}}function G(e,t,n,r){let s=x(e,t),p=r==null||r==="";if(p?s[n]===void 0:s[n]===r)return;let i={...s};p?delete i[n]:i[n]=r,f.set(e,i),t&&c("g:"+e,i),u.get(e)?.forEach(S=>S())}function F(e,t){if(y(e.key,e.local,{filters:{},globalFilter:"",external:{},groupedField:"all"}),e.group)for(let n of t)G(e.group,e.local,n,void 0)}function C(e){return(a.get(e)??g(e))?.external??{}}var d=new Set;function M(e){return d.has(e)&&console.warn(`[DataTable] persist key "${e}" is used by two mounted tables \u2014 they will overwrite each other's saved state. Give each table a unique key.`),d.add(e),()=>{d.delete(e)}}0&&(module.exports={clearPersisted,patchSnapshot,readGroupSlots,readPersistedExternal,readSnapshot,resolvePersist,subscribeGroup,trackMountedKey,writeGroupSlot});
3
+ //# sourceMappingURL=data-table-persist.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/data/data-table/data-table-persist.ts"],"sourcesContent":["/**\n * Storage for the DataTable `persist` feature: filter values, global search text, external\n * (server) filter values and pagination survive unmount/back-navigation — in-memory by default,\n * optionally localStorage (`local: true`).\n *\n * Values are stored per FILTER IDENTITY (`key`/`id`), not as raw TanStack state — that's what\n * lets a `shared` slot apply across pages even when the pages use different filter keys or one\n * side is an `externalSearch` filter.\n */\n\n/**\n * Augment this interface ONCE in the app to get autocomplete + typo checking for `group` and\n * `shared` (without it both are plain strings):\n * ```ts\n * // src/types/table-persist.d.ts\n * declare module \"@akshar-technosoft/ui\" {\n * interface PersistGroupRegistry { inhouse: \"party\" | \"material\"; sales: \"party\" }\n * }\n * ```\n */\nexport interface PersistGroupRegistry { }\n\nexport type PersistGroupId = keyof PersistGroupRegistry extends never\n ? string\n : keyof PersistGroupRegistry & string\n\n/** Every slot across every registered group — the un-narrowed fallback `PersistSlotFor` resolves\n * to when a specific group isn't pinned (e.g. `shared` typed before `persist.group` is set). */\nexport type PersistSlotId = keyof PersistGroupRegistry extends never\n ? string\n : PersistGroupRegistry[keyof PersistGroupRegistry] & string\n\n/**\n * `shared`'s value type, narrowed to ONE group's own slots instead of every group's. `G` is\n * whatever `DataTableProps`'s own group type param resolves to for this table (see there for how\n * it gets pinned) — a real group key narrows to just that group's slots; `undefined` (no group\n * pinned yet) falls back to `PersistSlotId`, every group's slots, same as before this existed.\n */\nexport type PersistSlotFor<G extends PersistGroupId | undefined> =\n G extends keyof PersistGroupRegistry ? PersistGroupRegistry[G] & string : PersistSlotId\n\nexport type PersistConfig<G extends PersistGroupId | undefined = PersistGroupId> = {\n /**\n * Unique id for this table ACROSS THE WHOLE APP (it's the storage map key, and the\n * localStorage key when `local: true`). Two tables with the same key share one saved state —\n * that's a bug unless you meant it. One page with two tables needs two keys.\n */\n key: string\n /**\n * Namespace for `shared` filter slots — ONLY tables with the same group exchange those values\n * (a \"party\" slot in group \"inhouse\" never leaks into group \"sales\"). Required for `shared`\n * to do anything; a `shared` filter on a table without a group is inert (dev warning).\n *\n * Setting this is also what narrows `filters[].shared`'s autocomplete/type-check to just THIS\n * group's own slots — see `DataTableProps`'s `G` type param.\n */\n group?: G\n /**\n * Also write to localStorage so state survives refresh/re-login.\n * NOTE: unlike zustand's `persist` middleware, the default here is IN-MEMORY (back-navigation\n * only); localStorage is the opt-in. Multi-client caveat: localStorage is per-browser, not\n * per-login — a client switch on the same machine sees the previous client's saved filters.\n * @default false\n */\n local?: boolean\n /** Set false to persist filters only, not page index/size. @default true */\n pagination?: boolean\n}\n\nexport type PersistSnapshot = {\n /** filter values keyed by filter identity (`key`/`id`) */\n filters?: Record<string, unknown>\n globalFilter?: string\n /** grouped global-search picker selection (\"all\" or a filter id) */\n groupedField?: string\n external?: Record<string, unknown>\n pagination?: { pageIndex: number; pageSize: number }\n}\n\nconst LS_PREFIX = \"atsui:tbl:v1:\"\n\nconst mem = new Map<string, PersistSnapshot>()\nconst memGroups = new Map<string, Record<string, unknown>>()\n\nfunction lsRead<T>(key: string): T | undefined {\n try {\n const raw = localStorage.getItem(LS_PREFIX + key)\n return raw ? (JSON.parse(raw) as T) : undefined\n } catch {\n return undefined\n }\n}\n\nfunction lsWrite(key: string, value: unknown) {\n try {\n localStorage.setItem(LS_PREFIX + key, JSON.stringify(value))\n } catch {\n /* private mode / quota — memory copy still works */\n }\n}\n\n/** Resolve the `persist` prop (string shorthand or config) to a config, or null when absent.\n * `G` is deliberately `any` here — this is the runtime resolver, which only ever reads `group`\n * as a plain string; the narrowed `G` exists purely for `DataTableProps`'s authoring-time\n * `shared` type-check and has no runtime meaning to erase. */\nexport function resolvePersist(prop: string | PersistConfig<any> | undefined): PersistConfig<any> | null {\n if (!prop) return null\n return typeof prop === \"string\" ? { key: prop } : prop\n}\n\nexport function readSnapshot(key: string, local: boolean | undefined): PersistSnapshot {\n return mem.get(key) ?? (local ? lsRead<PersistSnapshot>(key) : undefined) ?? {}\n}\n\nexport function patchSnapshot(key: string, local: boolean | undefined, patch: Partial<PersistSnapshot>) {\n const next = { ...readSnapshot(key, local), ...patch }\n mem.set(key, next)\n if (local) lsWrite(key, next)\n}\n\nconst groupListeners = new Map<string, Set<() => void>>()\n\n/** Notify when any slot in a group changes (live sync between mounted tables). */\nexport function subscribeGroup(group: string, cb: () => void): () => void {\n let set = groupListeners.get(group)\n if (!set) { set = new Set(); groupListeners.set(group, set) }\n set.add(cb)\n return () => { set!.delete(cb) }\n}\n\n/**\n * `local` mirrors the CALLING table's own `persist.local` — same rule as `readSnapshot`: only\n * consult localStorage when this particular table opted into it. No cross-table stickiness — a\n * table with `local: false` never touches ls for this group, full stop, even if some other\n * table in the same group has `local: true`. Each table's own flag governs its own reads/writes.\n */\nexport function readGroupSlots(group: string, local: boolean | undefined): Record<string, unknown> {\n return { ...(local ? lsRead<Record<string, unknown>>(\"g:\" + group) ?? {} : {}), ...(memGroups.get(group) ?? {}) }\n}\n\nexport function writeGroupSlot(group: string, local: boolean | undefined, slot: string, value: unknown) {\n const prev = readGroupSlots(group, local)\n const empty = value === undefined || value === null || value === \"\"\n if (empty ? prev[slot] === undefined : prev[slot] === value) return // unchanged — no write, no notify\n const next = { ...prev }\n if (empty) delete next[slot]\n else next[slot] = value\n memGroups.set(group, next)\n if (local) lsWrite(\"g:\" + group, next)\n groupListeners.get(group)?.forEach((cb) => cb())\n}\n\n/** Wipe a table's persisted filters (Clear All Filters). Pagination is kept. */\nexport function clearPersisted(config: PersistConfig<any>, sharedSlots: string[]) {\n patchSnapshot(config.key, config.local, { filters: {}, globalFilter: \"\", external: {}, groupedField: \"all\" })\n if (config.group) for (const slot of sharedSlots) writeGroupSlot(config.group, config.local, slot, undefined)\n}\n\n/**\n * Persisted external (server) filter values for a table key — use in the PAGE's query-params\n * initializer so the very first request already carries the restored filters (otherwise the\n * default request fires once and is immediately superseded by the replayed one):\n * ```ts\n * const [params, setParams] = useState(() => ({ Status: \"Completed\", ...mapToParams(readPersistedExternal(\"qc-completed\")) }))\n * ```\n */\nexport function readPersistedExternal(key: string): Record<string, unknown> {\n return (mem.get(key) ?? lsRead<PersistSnapshot>(key))?.external ?? {}\n}\n\nconst mountedKeys = new Set<string>()\n\n/** Dev guard: two mounted tables on one `persist` key silently share state — warn once. */\nexport function trackMountedKey(key: string): () => void {\n if (mountedKeys.has(key)) {\n console.warn(`[DataTable] persist key \"${key}\" is used by two mounted tables — they will overwrite each other's saved state. Give each table a unique key.`)\n }\n mountedKeys.add(key)\n return () => { mountedKeys.delete(key) }\n}\n"],"mappings":"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","names":["data_table_persist_exports","__export","clearPersisted","patchSnapshot","readGroupSlots","readPersistedExternal","readSnapshot","resolvePersist","subscribeGroup","trackMountedKey","writeGroupSlot","__toCommonJS","LS_PREFIX","mem","memGroups","lsRead","key","raw","lsWrite","value","prop","local","patch","next","groupListeners","group","cb","set","slot","prev","empty","config","sharedSlots","mountedKeys"]}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Storage for the DataTable `persist` feature: filter values, global search text, external
3
+ * (server) filter values and pagination survive unmount/back-navigation — in-memory by default,
4
+ * optionally localStorage (`local: true`).
5
+ *
6
+ * Values are stored per FILTER IDENTITY (`key`/`id`), not as raw TanStack state — that's what
7
+ * lets a `shared` slot apply across pages even when the pages use different filter keys or one
8
+ * side is an `externalSearch` filter.
9
+ */
10
+ /**
11
+ * Augment this interface ONCE in the app to get autocomplete + typo checking for `group` and
12
+ * `shared` (without it both are plain strings):
13
+ * ```ts
14
+ * // src/types/table-persist.d.ts
15
+ * declare module "@akshar-technosoft/ui" {
16
+ * interface PersistGroupRegistry { inhouse: "party" | "material"; sales: "party" }
17
+ * }
18
+ * ```
19
+ */
20
+ interface PersistGroupRegistry {
21
+ }
22
+ type PersistGroupId = keyof PersistGroupRegistry extends never ? string : keyof PersistGroupRegistry & string;
23
+ /** Every slot across every registered group — the un-narrowed fallback `PersistSlotFor` resolves
24
+ * to when a specific group isn't pinned (e.g. `shared` typed before `persist.group` is set). */
25
+ type PersistSlotId = keyof PersistGroupRegistry extends never ? string : PersistGroupRegistry[keyof PersistGroupRegistry] & string;
26
+ /**
27
+ * `shared`'s value type, narrowed to ONE group's own slots instead of every group's. `G` is
28
+ * whatever `DataTableProps`'s own group type param resolves to for this table (see there for how
29
+ * it gets pinned) — a real group key narrows to just that group's slots; `undefined` (no group
30
+ * pinned yet) falls back to `PersistSlotId`, every group's slots, same as before this existed.
31
+ */
32
+ type PersistSlotFor<G extends PersistGroupId | undefined> = G extends keyof PersistGroupRegistry ? PersistGroupRegistry[G] & string : PersistSlotId;
33
+ type PersistConfig<G extends PersistGroupId | undefined = PersistGroupId> = {
34
+ /**
35
+ * Unique id for this table ACROSS THE WHOLE APP (it's the storage map key, and the
36
+ * localStorage key when `local: true`). Two tables with the same key share one saved state —
37
+ * that's a bug unless you meant it. One page with two tables needs two keys.
38
+ */
39
+ key: string;
40
+ /**
41
+ * Namespace for `shared` filter slots — ONLY tables with the same group exchange those values
42
+ * (a "party" slot in group "inhouse" never leaks into group "sales"). Required for `shared`
43
+ * to do anything; a `shared` filter on a table without a group is inert (dev warning).
44
+ *
45
+ * Setting this is also what narrows `filters[].shared`'s autocomplete/type-check to just THIS
46
+ * group's own slots — see `DataTableProps`'s `G` type param.
47
+ */
48
+ group?: G;
49
+ /**
50
+ * Also write to localStorage so state survives refresh/re-login.
51
+ * NOTE: unlike zustand's `persist` middleware, the default here is IN-MEMORY (back-navigation
52
+ * only); localStorage is the opt-in. Multi-client caveat: localStorage is per-browser, not
53
+ * per-login — a client switch on the same machine sees the previous client's saved filters.
54
+ * @default false
55
+ */
56
+ local?: boolean;
57
+ /** Set false to persist filters only, not page index/size. @default true */
58
+ pagination?: boolean;
59
+ };
60
+ type PersistSnapshot = {
61
+ /** filter values keyed by filter identity (`key`/`id`) */
62
+ filters?: Record<string, unknown>;
63
+ globalFilter?: string;
64
+ /** grouped global-search picker selection ("all" or a filter id) */
65
+ groupedField?: string;
66
+ external?: Record<string, unknown>;
67
+ pagination?: {
68
+ pageIndex: number;
69
+ pageSize: number;
70
+ };
71
+ };
72
+ /** Resolve the `persist` prop (string shorthand or config) to a config, or null when absent.
73
+ * `G` is deliberately `any` here — this is the runtime resolver, which only ever reads `group`
74
+ * as a plain string; the narrowed `G` exists purely for `DataTableProps`'s authoring-time
75
+ * `shared` type-check and has no runtime meaning to erase. */
76
+ declare function resolvePersist(prop: string | PersistConfig<any> | undefined): PersistConfig<any> | null;
77
+ declare function readSnapshot(key: string, local: boolean | undefined): PersistSnapshot;
78
+ declare function patchSnapshot(key: string, local: boolean | undefined, patch: Partial<PersistSnapshot>): void;
79
+ /** Notify when any slot in a group changes (live sync between mounted tables). */
80
+ declare function subscribeGroup(group: string, cb: () => void): () => void;
81
+ /**
82
+ * `local` mirrors the CALLING table's own `persist.local` — same rule as `readSnapshot`: only
83
+ * consult localStorage when this particular table opted into it. No cross-table stickiness — a
84
+ * table with `local: false` never touches ls for this group, full stop, even if some other
85
+ * table in the same group has `local: true`. Each table's own flag governs its own reads/writes.
86
+ */
87
+ declare function readGroupSlots(group: string, local: boolean | undefined): Record<string, unknown>;
88
+ declare function writeGroupSlot(group: string, local: boolean | undefined, slot: string, value: unknown): void;
89
+ /** Wipe a table's persisted filters (Clear All Filters). Pagination is kept. */
90
+ declare function clearPersisted(config: PersistConfig<any>, sharedSlots: string[]): void;
91
+ /**
92
+ * Persisted external (server) filter values for a table key — use in the PAGE's query-params
93
+ * initializer so the very first request already carries the restored filters (otherwise the
94
+ * default request fires once and is immediately superseded by the replayed one):
95
+ * ```ts
96
+ * const [params, setParams] = useState(() => ({ Status: "Completed", ...mapToParams(readPersistedExternal("qc-completed")) }))
97
+ * ```
98
+ */
99
+ declare function readPersistedExternal(key: string): Record<string, unknown>;
100
+ /** Dev guard: two mounted tables on one `persist` key silently share state — warn once. */
101
+ declare function trackMountedKey(key: string): () => void;
102
+
103
+ export { type PersistConfig, type PersistGroupId, type PersistGroupRegistry, type PersistSlotFor, type PersistSlotId, type PersistSnapshot, clearPersisted, patchSnapshot, readGroupSlots, readPersistedExternal, readSnapshot, resolvePersist, subscribeGroup, trackMountedKey, writeGroupSlot };
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Storage for the DataTable `persist` feature: filter values, global search text, external
3
+ * (server) filter values and pagination survive unmount/back-navigation — in-memory by default,
4
+ * optionally localStorage (`local: true`).
5
+ *
6
+ * Values are stored per FILTER IDENTITY (`key`/`id`), not as raw TanStack state — that's what
7
+ * lets a `shared` slot apply across pages even when the pages use different filter keys or one
8
+ * side is an `externalSearch` filter.
9
+ */
10
+ /**
11
+ * Augment this interface ONCE in the app to get autocomplete + typo checking for `group` and
12
+ * `shared` (without it both are plain strings):
13
+ * ```ts
14
+ * // src/types/table-persist.d.ts
15
+ * declare module "@akshar-technosoft/ui" {
16
+ * interface PersistGroupRegistry { inhouse: "party" | "material"; sales: "party" }
17
+ * }
18
+ * ```
19
+ */
20
+ interface PersistGroupRegistry {
21
+ }
22
+ type PersistGroupId = keyof PersistGroupRegistry extends never ? string : keyof PersistGroupRegistry & string;
23
+ /** Every slot across every registered group — the un-narrowed fallback `PersistSlotFor` resolves
24
+ * to when a specific group isn't pinned (e.g. `shared` typed before `persist.group` is set). */
25
+ type PersistSlotId = keyof PersistGroupRegistry extends never ? string : PersistGroupRegistry[keyof PersistGroupRegistry] & string;
26
+ /**
27
+ * `shared`'s value type, narrowed to ONE group's own slots instead of every group's. `G` is
28
+ * whatever `DataTableProps`'s own group type param resolves to for this table (see there for how
29
+ * it gets pinned) — a real group key narrows to just that group's slots; `undefined` (no group
30
+ * pinned yet) falls back to `PersistSlotId`, every group's slots, same as before this existed.
31
+ */
32
+ type PersistSlotFor<G extends PersistGroupId | undefined> = G extends keyof PersistGroupRegistry ? PersistGroupRegistry[G] & string : PersistSlotId;
33
+ type PersistConfig<G extends PersistGroupId | undefined = PersistGroupId> = {
34
+ /**
35
+ * Unique id for this table ACROSS THE WHOLE APP (it's the storage map key, and the
36
+ * localStorage key when `local: true`). Two tables with the same key share one saved state —
37
+ * that's a bug unless you meant it. One page with two tables needs two keys.
38
+ */
39
+ key: string;
40
+ /**
41
+ * Namespace for `shared` filter slots — ONLY tables with the same group exchange those values
42
+ * (a "party" slot in group "inhouse" never leaks into group "sales"). Required for `shared`
43
+ * to do anything; a `shared` filter on a table without a group is inert (dev warning).
44
+ *
45
+ * Setting this is also what narrows `filters[].shared`'s autocomplete/type-check to just THIS
46
+ * group's own slots — see `DataTableProps`'s `G` type param.
47
+ */
48
+ group?: G;
49
+ /**
50
+ * Also write to localStorage so state survives refresh/re-login.
51
+ * NOTE: unlike zustand's `persist` middleware, the default here is IN-MEMORY (back-navigation
52
+ * only); localStorage is the opt-in. Multi-client caveat: localStorage is per-browser, not
53
+ * per-login — a client switch on the same machine sees the previous client's saved filters.
54
+ * @default false
55
+ */
56
+ local?: boolean;
57
+ /** Set false to persist filters only, not page index/size. @default true */
58
+ pagination?: boolean;
59
+ };
60
+ type PersistSnapshot = {
61
+ /** filter values keyed by filter identity (`key`/`id`) */
62
+ filters?: Record<string, unknown>;
63
+ globalFilter?: string;
64
+ /** grouped global-search picker selection ("all" or a filter id) */
65
+ groupedField?: string;
66
+ external?: Record<string, unknown>;
67
+ pagination?: {
68
+ pageIndex: number;
69
+ pageSize: number;
70
+ };
71
+ };
72
+ /** Resolve the `persist` prop (string shorthand or config) to a config, or null when absent.
73
+ * `G` is deliberately `any` here — this is the runtime resolver, which only ever reads `group`
74
+ * as a plain string; the narrowed `G` exists purely for `DataTableProps`'s authoring-time
75
+ * `shared` type-check and has no runtime meaning to erase. */
76
+ declare function resolvePersist(prop: string | PersistConfig<any> | undefined): PersistConfig<any> | null;
77
+ declare function readSnapshot(key: string, local: boolean | undefined): PersistSnapshot;
78
+ declare function patchSnapshot(key: string, local: boolean | undefined, patch: Partial<PersistSnapshot>): void;
79
+ /** Notify when any slot in a group changes (live sync between mounted tables). */
80
+ declare function subscribeGroup(group: string, cb: () => void): () => void;
81
+ /**
82
+ * `local` mirrors the CALLING table's own `persist.local` — same rule as `readSnapshot`: only
83
+ * consult localStorage when this particular table opted into it. No cross-table stickiness — a
84
+ * table with `local: false` never touches ls for this group, full stop, even if some other
85
+ * table in the same group has `local: true`. Each table's own flag governs its own reads/writes.
86
+ */
87
+ declare function readGroupSlots(group: string, local: boolean | undefined): Record<string, unknown>;
88
+ declare function writeGroupSlot(group: string, local: boolean | undefined, slot: string, value: unknown): void;
89
+ /** Wipe a table's persisted filters (Clear All Filters). Pagination is kept. */
90
+ declare function clearPersisted(config: PersistConfig<any>, sharedSlots: string[]): void;
91
+ /**
92
+ * Persisted external (server) filter values for a table key — use in the PAGE's query-params
93
+ * initializer so the very first request already carries the restored filters (otherwise the
94
+ * default request fires once and is immediately superseded by the replayed one):
95
+ * ```ts
96
+ * const [params, setParams] = useState(() => ({ Status: "Completed", ...mapToParams(readPersistedExternal("qc-completed")) }))
97
+ * ```
98
+ */
99
+ declare function readPersistedExternal(key: string): Record<string, unknown>;
100
+ /** Dev guard: two mounted tables on one `persist` key silently share state — warn once. */
101
+ declare function trackMountedKey(key: string): () => void;
102
+
103
+ export { type PersistConfig, type PersistGroupId, type PersistGroupRegistry, type PersistSlotFor, type PersistSlotId, type PersistSnapshot, clearPersisted, patchSnapshot, readGroupSlots, readPersistedExternal, readSnapshot, resolvePersist, subscribeGroup, trackMountedKey, writeGroupSlot };
@@ -0,0 +1,3 @@
1
+ "use client"
2
+ var p="atsui:tbl:v1:",u=new Map,l=new Map;function a(e){try{let t=localStorage.getItem(p+e);return t?JSON.parse(t):void 0}catch{return}}function f(e,t){try{localStorage.setItem(p+e,JSON.stringify(t))}catch{}}function S(e){return e?typeof e=="string"?{key:e}:e:null}function P(e,t){return u.get(e)??(t?a(e):void 0)??{}}function y(e,t,n){let r={...P(e,t),...n};u.set(e,r),t&&f(e,r)}var d=new Map;function w(e,t){let n=d.get(e);return n||(n=new Set,d.set(e,n)),n.add(t),()=>{n.delete(t)}}function x(e,t){return{...t?a("g:"+e)??{}:{},...l.get(e)??{}}}function G(e,t,n,r){let i=x(e,t),g=r==null||r==="";if(g?i[n]===void 0:i[n]===r)return;let s={...i};g?delete s[n]:s[n]=r,l.set(e,s),t&&f("g:"+e,s),d.get(e)?.forEach(c=>c())}function h(e,t){if(y(e.key,e.local,{filters:{},globalFilter:"",external:{},groupedField:"all"}),e.group)for(let n of t)G(e.group,e.local,n,void 0)}function b(e){return(u.get(e)??a(e))?.external??{}}var o=new Set;function R(e){return o.has(e)&&console.warn(`[DataTable] persist key "${e}" is used by two mounted tables \u2014 they will overwrite each other's saved state. Give each table a unique key.`),o.add(e),()=>{o.delete(e)}}export{h as clearPersisted,y as patchSnapshot,x as readGroupSlots,b as readPersistedExternal,P as readSnapshot,S as resolvePersist,w as subscribeGroup,R as trackMountedKey,G as writeGroupSlot};
3
+ //# sourceMappingURL=data-table-persist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/data/data-table/data-table-persist.ts"],"sourcesContent":["/**\n * Storage for the DataTable `persist` feature: filter values, global search text, external\n * (server) filter values and pagination survive unmount/back-navigation — in-memory by default,\n * optionally localStorage (`local: true`).\n *\n * Values are stored per FILTER IDENTITY (`key`/`id`), not as raw TanStack state — that's what\n * lets a `shared` slot apply across pages even when the pages use different filter keys or one\n * side is an `externalSearch` filter.\n */\n\n/**\n * Augment this interface ONCE in the app to get autocomplete + typo checking for `group` and\n * `shared` (without it both are plain strings):\n * ```ts\n * // src/types/table-persist.d.ts\n * declare module \"@akshar-technosoft/ui\" {\n * interface PersistGroupRegistry { inhouse: \"party\" | \"material\"; sales: \"party\" }\n * }\n * ```\n */\nexport interface PersistGroupRegistry { }\n\nexport type PersistGroupId = keyof PersistGroupRegistry extends never\n ? string\n : keyof PersistGroupRegistry & string\n\n/** Every slot across every registered group — the un-narrowed fallback `PersistSlotFor` resolves\n * to when a specific group isn't pinned (e.g. `shared` typed before `persist.group` is set). */\nexport type PersistSlotId = keyof PersistGroupRegistry extends never\n ? string\n : PersistGroupRegistry[keyof PersistGroupRegistry] & string\n\n/**\n * `shared`'s value type, narrowed to ONE group's own slots instead of every group's. `G` is\n * whatever `DataTableProps`'s own group type param resolves to for this table (see there for how\n * it gets pinned) — a real group key narrows to just that group's slots; `undefined` (no group\n * pinned yet) falls back to `PersistSlotId`, every group's slots, same as before this existed.\n */\nexport type PersistSlotFor<G extends PersistGroupId | undefined> =\n G extends keyof PersistGroupRegistry ? PersistGroupRegistry[G] & string : PersistSlotId\n\nexport type PersistConfig<G extends PersistGroupId | undefined = PersistGroupId> = {\n /**\n * Unique id for this table ACROSS THE WHOLE APP (it's the storage map key, and the\n * localStorage key when `local: true`). Two tables with the same key share one saved state —\n * that's a bug unless you meant it. One page with two tables needs two keys.\n */\n key: string\n /**\n * Namespace for `shared` filter slots — ONLY tables with the same group exchange those values\n * (a \"party\" slot in group \"inhouse\" never leaks into group \"sales\"). Required for `shared`\n * to do anything; a `shared` filter on a table without a group is inert (dev warning).\n *\n * Setting this is also what narrows `filters[].shared`'s autocomplete/type-check to just THIS\n * group's own slots — see `DataTableProps`'s `G` type param.\n */\n group?: G\n /**\n * Also write to localStorage so state survives refresh/re-login.\n * NOTE: unlike zustand's `persist` middleware, the default here is IN-MEMORY (back-navigation\n * only); localStorage is the opt-in. Multi-client caveat: localStorage is per-browser, not\n * per-login — a client switch on the same machine sees the previous client's saved filters.\n * @default false\n */\n local?: boolean\n /** Set false to persist filters only, not page index/size. @default true */\n pagination?: boolean\n}\n\nexport type PersistSnapshot = {\n /** filter values keyed by filter identity (`key`/`id`) */\n filters?: Record<string, unknown>\n globalFilter?: string\n /** grouped global-search picker selection (\"all\" or a filter id) */\n groupedField?: string\n external?: Record<string, unknown>\n pagination?: { pageIndex: number; pageSize: number }\n}\n\nconst LS_PREFIX = \"atsui:tbl:v1:\"\n\nconst mem = new Map<string, PersistSnapshot>()\nconst memGroups = new Map<string, Record<string, unknown>>()\n\nfunction lsRead<T>(key: string): T | undefined {\n try {\n const raw = localStorage.getItem(LS_PREFIX + key)\n return raw ? (JSON.parse(raw) as T) : undefined\n } catch {\n return undefined\n }\n}\n\nfunction lsWrite(key: string, value: unknown) {\n try {\n localStorage.setItem(LS_PREFIX + key, JSON.stringify(value))\n } catch {\n /* private mode / quota — memory copy still works */\n }\n}\n\n/** Resolve the `persist` prop (string shorthand or config) to a config, or null when absent.\n * `G` is deliberately `any` here — this is the runtime resolver, which only ever reads `group`\n * as a plain string; the narrowed `G` exists purely for `DataTableProps`'s authoring-time\n * `shared` type-check and has no runtime meaning to erase. */\nexport function resolvePersist(prop: string | PersistConfig<any> | undefined): PersistConfig<any> | null {\n if (!prop) return null\n return typeof prop === \"string\" ? { key: prop } : prop\n}\n\nexport function readSnapshot(key: string, local: boolean | undefined): PersistSnapshot {\n return mem.get(key) ?? (local ? lsRead<PersistSnapshot>(key) : undefined) ?? {}\n}\n\nexport function patchSnapshot(key: string, local: boolean | undefined, patch: Partial<PersistSnapshot>) {\n const next = { ...readSnapshot(key, local), ...patch }\n mem.set(key, next)\n if (local) lsWrite(key, next)\n}\n\nconst groupListeners = new Map<string, Set<() => void>>()\n\n/** Notify when any slot in a group changes (live sync between mounted tables). */\nexport function subscribeGroup(group: string, cb: () => void): () => void {\n let set = groupListeners.get(group)\n if (!set) { set = new Set(); groupListeners.set(group, set) }\n set.add(cb)\n return () => { set!.delete(cb) }\n}\n\n/**\n * `local` mirrors the CALLING table's own `persist.local` — same rule as `readSnapshot`: only\n * consult localStorage when this particular table opted into it. No cross-table stickiness — a\n * table with `local: false` never touches ls for this group, full stop, even if some other\n * table in the same group has `local: true`. Each table's own flag governs its own reads/writes.\n */\nexport function readGroupSlots(group: string, local: boolean | undefined): Record<string, unknown> {\n return { ...(local ? lsRead<Record<string, unknown>>(\"g:\" + group) ?? {} : {}), ...(memGroups.get(group) ?? {}) }\n}\n\nexport function writeGroupSlot(group: string, local: boolean | undefined, slot: string, value: unknown) {\n const prev = readGroupSlots(group, local)\n const empty = value === undefined || value === null || value === \"\"\n if (empty ? prev[slot] === undefined : prev[slot] === value) return // unchanged — no write, no notify\n const next = { ...prev }\n if (empty) delete next[slot]\n else next[slot] = value\n memGroups.set(group, next)\n if (local) lsWrite(\"g:\" + group, next)\n groupListeners.get(group)?.forEach((cb) => cb())\n}\n\n/** Wipe a table's persisted filters (Clear All Filters). Pagination is kept. */\nexport function clearPersisted(config: PersistConfig<any>, sharedSlots: string[]) {\n patchSnapshot(config.key, config.local, { filters: {}, globalFilter: \"\", external: {}, groupedField: \"all\" })\n if (config.group) for (const slot of sharedSlots) writeGroupSlot(config.group, config.local, slot, undefined)\n}\n\n/**\n * Persisted external (server) filter values for a table key — use in the PAGE's query-params\n * initializer so the very first request already carries the restored filters (otherwise the\n * default request fires once and is immediately superseded by the replayed one):\n * ```ts\n * const [params, setParams] = useState(() => ({ Status: \"Completed\", ...mapToParams(readPersistedExternal(\"qc-completed\")) }))\n * ```\n */\nexport function readPersistedExternal(key: string): Record<string, unknown> {\n return (mem.get(key) ?? lsRead<PersistSnapshot>(key))?.external ?? {}\n}\n\nconst mountedKeys = new Set<string>()\n\n/** Dev guard: two mounted tables on one `persist` key silently share state — warn once. */\nexport function trackMountedKey(key: string): () => void {\n if (mountedKeys.has(key)) {\n console.warn(`[DataTable] persist key \"${key}\" is used by two mounted tables — they will overwrite each other's saved state. Give each table a unique key.`)\n }\n mountedKeys.add(key)\n return () => { mountedKeys.delete(key) }\n}\n"],"mappings":";AA+EA,IAAMA,EAAY,gBAEZC,EAAM,IAAI,IACVC,EAAY,IAAI,IAEtB,SAASC,EAAUC,EAA4B,CAC7C,GAAI,CACF,IAAMC,EAAM,aAAa,QAAQL,EAAYI,CAAG,EAChD,OAAOC,EAAO,KAAK,MAAMA,CAAG,EAAU,MACxC,MAAQ,CACN,MACF,CACF,CAEA,SAASC,EAAQF,EAAaG,EAAgB,CAC5C,GAAI,CACF,aAAa,QAAQP,EAAYI,EAAK,KAAK,UAAUG,CAAK,CAAC,CAC7D,MAAQ,CAER,CACF,CAMO,SAASC,EAAeC,EAA0E,CACvG,OAAKA,EACE,OAAOA,GAAS,SAAW,CAAE,IAAKA,CAAK,EAAIA,EADhC,IAEpB,CAEO,SAASC,EAAaN,EAAaO,EAA6C,CACrF,OAAOV,EAAI,IAAIG,CAAG,IAAMO,EAAQR,EAAwBC,CAAG,EAAI,SAAc,CAAC,CAChF,CAEO,SAASQ,EAAcR,EAAaO,EAA4BE,EAAiC,CACtG,IAAMC,EAAO,CAAE,GAAGJ,EAAaN,EAAKO,CAAK,EAAG,GAAGE,CAAM,EACrDZ,EAAI,IAAIG,EAAKU,CAAI,EACbH,GAAOL,EAAQF,EAAKU,CAAI,CAC9B,CAEA,IAAMC,EAAiB,IAAI,IAGpB,SAASC,EAAeC,EAAeC,EAA4B,CACxE,IAAIC,EAAMJ,EAAe,IAAIE,CAAK,EAClC,OAAKE,IAAOA,EAAM,IAAI,IAAOJ,EAAe,IAAIE,EAAOE,CAAG,GAC1DA,EAAI,IAAID,CAAE,EACH,IAAM,CAAEC,EAAK,OAAOD,CAAE,CAAE,CACjC,CAQO,SAASE,EAAeH,EAAeN,EAAqD,CACjG,MAAO,CAAE,GAAIA,EAAQR,EAAgC,KAAOc,CAAK,GAAK,CAAC,EAAI,CAAC,EAAI,GAAIf,EAAU,IAAIe,CAAK,GAAK,CAAC,CAAG,CAClH,CAEO,SAASI,EAAeJ,EAAeN,EAA4BW,EAAcf,EAAgB,CACtG,IAAMgB,EAAOH,EAAeH,EAAON,CAAK,EAClCa,EAA+BjB,GAAU,MAAQA,IAAU,GACjE,GAAIiB,EAAQD,EAAKD,CAAI,IAAM,OAAYC,EAAKD,CAAI,IAAMf,EAAO,OAC7D,IAAMO,EAAO,CAAE,GAAGS,CAAK,EACnBC,EAAO,OAAOV,EAAKQ,CAAI,EACtBR,EAAKQ,CAAI,EAAIf,EAClBL,EAAU,IAAIe,EAAOH,CAAI,EACrBH,GAAOL,EAAQ,KAAOW,EAAOH,CAAI,EACrCC,EAAe,IAAIE,CAAK,GAAG,QAASC,GAAOA,EAAG,CAAC,CACjD,CAGO,SAASO,EAAeC,EAA4BC,EAAuB,CAEhF,GADAf,EAAcc,EAAO,IAAKA,EAAO,MAAO,CAAE,QAAS,CAAC,EAAG,aAAc,GAAI,SAAU,CAAC,EAAG,aAAc,KAAM,CAAC,EACxGA,EAAO,MAAO,QAAWJ,KAAQK,EAAaN,EAAeK,EAAO,MAAOA,EAAO,MAAOJ,EAAM,MAAS,CAC9G,CAUO,SAASM,EAAsBxB,EAAsC,CAC1E,OAAQH,EAAI,IAAIG,CAAG,GAAKD,EAAwBC,CAAG,IAAI,UAAY,CAAC,CACtE,CAEA,IAAMyB,EAAc,IAAI,IAGjB,SAASC,EAAgB1B,EAAyB,CACvD,OAAIyB,EAAY,IAAIzB,CAAG,GACrB,QAAQ,KAAK,4BAA4BA,CAAG,oHAA+G,EAE7JyB,EAAY,IAAIzB,CAAG,EACZ,IAAM,CAAEyB,EAAY,OAAOzB,CAAG,CAAE,CACzC","names":["LS_PREFIX","mem","memGroups","lsRead","key","raw","lsWrite","value","resolvePersist","prop","readSnapshot","local","patchSnapshot","patch","next","groupListeners","subscribeGroup","group","cb","set","readGroupSlots","writeGroupSlot","slot","prev","empty","clearPersisted","config","sharedSlots","readPersistedExternal","mountedKeys","trackMountedKey"]}