@lucasbernardosn/react-table 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/components/column-menu/column-menu-check.d.ts +8 -0
  4. package/dist/components/column-menu/column-menu-check.d.ts.map +1 -0
  5. package/dist/components/column-menu/column-menu-check.js +17 -0
  6. package/dist/components/column-menu/column-menu-check.js.map +1 -0
  7. package/dist/components/column-menu/column-menu-hide-item.d.ts +23 -0
  8. package/dist/components/column-menu/column-menu-hide-item.d.ts.map +1 -0
  9. package/dist/components/column-menu/column-menu-hide-item.js +28 -0
  10. package/dist/components/column-menu/column-menu-hide-item.js.map +1 -0
  11. package/dist/components/column-menu/column-menu-labels.d.ts +21 -0
  12. package/dist/components/column-menu/column-menu-labels.d.ts.map +1 -0
  13. package/dist/components/column-menu/column-menu-labels.js +14 -0
  14. package/dist/components/column-menu/column-menu-labels.js.map +1 -0
  15. package/dist/components/column-menu/column-menu-pin-items.d.ts +25 -0
  16. package/dist/components/column-menu/column-menu-pin-items.d.ts.map +1 -0
  17. package/dist/components/column-menu/column-menu-pin-items.js +65 -0
  18. package/dist/components/column-menu/column-menu-pin-items.js.map +1 -0
  19. package/dist/components/column-menu/column-menu-popup.d.ts +39 -0
  20. package/dist/components/column-menu/column-menu-popup.d.ts.map +1 -0
  21. package/dist/components/column-menu/column-menu-popup.js +66 -0
  22. package/dist/components/column-menu/column-menu-popup.js.map +1 -0
  23. package/dist/components/column-menu/column-menu-root.d.ts +34 -0
  24. package/dist/components/column-menu/column-menu-root.d.ts.map +1 -0
  25. package/dist/components/column-menu/column-menu-root.js +36 -0
  26. package/dist/components/column-menu/column-menu-root.js.map +1 -0
  27. package/dist/components/column-menu/column-menu-sort-items.d.ts +29 -0
  28. package/dist/components/column-menu/column-menu-sort-items.d.ts.map +1 -0
  29. package/dist/components/column-menu/column-menu-sort-items.js +61 -0
  30. package/dist/components/column-menu/column-menu-sort-items.js.map +1 -0
  31. package/dist/components/column-menu/column-menu-trigger.d.ts +23 -0
  32. package/dist/components/column-menu/column-menu-trigger.d.ts.map +1 -0
  33. package/dist/components/column-menu/column-menu-trigger.js +38 -0
  34. package/dist/components/column-menu/column-menu-trigger.js.map +1 -0
  35. package/dist/components/column-menu/index.d.ts +2 -0
  36. package/dist/components/column-menu/index.js +2 -0
  37. package/dist/components/column-menu/index.parts.d.ts +13 -0
  38. package/dist/components/column-menu/index.parts.d.ts.map +1 -0
  39. package/dist/components/column-menu/index.parts.js +20 -0
  40. package/dist/components/column-menu/index.parts.js.map +1 -0
  41. package/dist/components/columns-panel/columns-panel-item.d.ts +31 -0
  42. package/dist/components/columns-panel/columns-panel-item.d.ts.map +1 -0
  43. package/dist/components/columns-panel/columns-panel-item.js +92 -0
  44. package/dist/components/columns-panel/columns-panel-item.js.map +1 -0
  45. package/dist/components/columns-panel/columns-panel-root.d.ts +51 -0
  46. package/dist/components/columns-panel/columns-panel-root.d.ts.map +1 -0
  47. package/dist/components/columns-panel/columns-panel-root.js +134 -0
  48. package/dist/components/columns-panel/columns-panel-root.js.map +1 -0
  49. package/dist/components/columns-panel/get-columns-panel-column-order.d.ts +16 -0
  50. package/dist/components/columns-panel/get-columns-panel-column-order.d.ts.map +1 -0
  51. package/dist/components/columns-panel/get-columns-panel-column-order.js +24 -0
  52. package/dist/components/columns-panel/get-columns-panel-column-order.js.map +1 -0
  53. package/dist/components/columns-panel/index.d.ts +2 -0
  54. package/dist/components/columns-panel/index.js +2 -0
  55. package/dist/components/columns-panel/index.parts.d.ts +8 -0
  56. package/dist/components/columns-panel/index.parts.d.ts.map +1 -0
  57. package/dist/components/columns-panel/index.parts.js +12 -0
  58. package/dist/components/columns-panel/index.parts.js.map +1 -0
  59. package/dist/components/data-table/body/data-table-body.d.ts +58 -0
  60. package/dist/components/data-table/body/data-table-body.d.ts.map +1 -0
  61. package/dist/components/data-table/body/data-table-body.js +99 -0
  62. package/dist/components/data-table/body/data-table-body.js.map +1 -0
  63. package/dist/components/data-table/body/data-table-cell.d.ts +26 -0
  64. package/dist/components/data-table/body/data-table-cell.d.ts.map +1 -0
  65. package/dist/components/data-table/body/data-table-cell.js +80 -0
  66. package/dist/components/data-table/body/data-table-cell.js.map +1 -0
  67. package/dist/components/data-table/body/data-table-empty.d.ts +38 -0
  68. package/dist/components/data-table/body/data-table-empty.d.ts.map +1 -0
  69. package/dist/components/data-table/body/data-table-empty.js +71 -0
  70. package/dist/components/data-table/body/data-table-empty.js.map +1 -0
  71. package/dist/components/data-table/body/data-table-row-focus.d.ts +32 -0
  72. package/dist/components/data-table/body/data-table-row-focus.d.ts.map +1 -0
  73. package/dist/components/data-table/body/data-table-row-focus.js +58 -0
  74. package/dist/components/data-table/body/data-table-row-focus.js.map +1 -0
  75. package/dist/components/data-table/body/data-table-row.d.ts +67 -0
  76. package/dist/components/data-table/body/data-table-row.d.ts.map +1 -0
  77. package/dist/components/data-table/body/data-table-row.js +150 -0
  78. package/dist/components/data-table/body/data-table-row.js.map +1 -0
  79. package/dist/components/data-table/body/use-data-table-row-focus-recovery.d.ts +19 -0
  80. package/dist/components/data-table/body/use-data-table-row-focus-recovery.d.ts.map +1 -0
  81. package/dist/components/data-table/body/use-data-table-row-focus-recovery.js +64 -0
  82. package/dist/components/data-table/body/use-data-table-row-focus-recovery.js.map +1 -0
  83. package/dist/components/data-table/header/data-table-header-button.d.ts +25 -0
  84. package/dist/components/data-table/header/data-table-header-button.d.ts.map +1 -0
  85. package/dist/components/data-table/header/data-table-header-button.js +57 -0
  86. package/dist/components/data-table/header/data-table-header-button.js.map +1 -0
  87. package/dist/components/data-table/header/data-table-header-cell.d.ts +34 -0
  88. package/dist/components/data-table/header/data-table-header-cell.d.ts.map +1 -0
  89. package/dist/components/data-table/header/data-table-header-cell.js +97 -0
  90. package/dist/components/data-table/header/data-table-header-cell.js.map +1 -0
  91. package/dist/components/data-table/header/data-table-header-content.d.ts +21 -0
  92. package/dist/components/data-table/header/data-table-header-content.d.ts.map +1 -0
  93. package/dist/components/data-table/header/data-table-header-content.js +37 -0
  94. package/dist/components/data-table/header/data-table-header-content.js.map +1 -0
  95. package/dist/components/data-table/header/data-table-header-row.d.ts +15 -0
  96. package/dist/components/data-table/header/data-table-header-row.d.ts.map +1 -0
  97. package/dist/components/data-table/header/data-table-header-row.js +28 -0
  98. package/dist/components/data-table/header/data-table-header-row.js.map +1 -0
  99. package/dist/components/data-table/header/data-table-header.d.ts +46 -0
  100. package/dist/components/data-table/header/data-table-header.d.ts.map +1 -0
  101. package/dist/components/data-table/header/data-table-header.js +80 -0
  102. package/dist/components/data-table/header/data-table-header.js.map +1 -0
  103. package/dist/components/data-table/index.d.ts +2 -0
  104. package/dist/components/data-table/index.js +2 -0
  105. package/dist/components/data-table/index.parts.d.ts +32 -0
  106. package/dist/components/data-table/index.parts.d.ts.map +1 -0
  107. package/dist/components/data-table/index.parts.js +60 -0
  108. package/dist/components/data-table/index.parts.js.map +1 -0
  109. package/dist/components/data-table/loading/get-data-table-loading-without-rows.d.ts +16 -0
  110. package/dist/components/data-table/loading/get-data-table-loading-without-rows.d.ts.map +1 -0
  111. package/dist/components/data-table/loading/get-data-table-loading-without-rows.js +18 -0
  112. package/dist/components/data-table/loading/get-data-table-loading-without-rows.js.map +1 -0
  113. package/dist/components/data-table/loading/use-data-table-loading-inert.d.ts +16 -0
  114. package/dist/components/data-table/loading/use-data-table-loading-inert.d.ts.map +1 -0
  115. package/dist/components/data-table/loading/use-data-table-loading-inert.js +54 -0
  116. package/dist/components/data-table/loading/use-data-table-loading-inert.js.map +1 -0
  117. package/dist/components/data-table/loading/use-data-table-loading.d.ts +13 -0
  118. package/dist/components/data-table/loading/use-data-table-loading.d.ts.map +1 -0
  119. package/dist/components/data-table/loading/use-data-table-loading.js +40 -0
  120. package/dist/components/data-table/loading/use-data-table-loading.js.map +1 -0
  121. package/dist/components/data-table/pagination/data-table-page-button.d.ts +45 -0
  122. package/dist/components/data-table/pagination/data-table-page-button.d.ts.map +1 -0
  123. package/dist/components/data-table/pagination/data-table-page-button.js +67 -0
  124. package/dist/components/data-table/pagination/data-table-page-button.js.map +1 -0
  125. package/dist/components/data-table/pagination/data-table-page-size-select.d.ts +47 -0
  126. package/dist/components/data-table/pagination/data-table-page-size-select.d.ts.map +1 -0
  127. package/dist/components/data-table/pagination/data-table-page-size-select.js +68 -0
  128. package/dist/components/data-table/pagination/data-table-page-size-select.js.map +1 -0
  129. package/dist/components/data-table/pagination/data-table-page-status.d.ts +43 -0
  130. package/dist/components/data-table/pagination/data-table-page-status.d.ts.map +1 -0
  131. package/dist/components/data-table/pagination/data-table-page-status.js +48 -0
  132. package/dist/components/data-table/pagination/data-table-page-status.js.map +1 -0
  133. package/dist/components/data-table/pagination/data-table-pagination.d.ts +38 -0
  134. package/dist/components/data-table/pagination/data-table-pagination.d.ts.map +1 -0
  135. package/dist/components/data-table/pagination/data-table-pagination.js +87 -0
  136. package/dist/components/data-table/pagination/data-table-pagination.js.map +1 -0
  137. package/dist/components/data-table/pagination/data-table-row-range.d.ts +49 -0
  138. package/dist/components/data-table/pagination/data-table-row-range.d.ts.map +1 -0
  139. package/dist/components/data-table/pagination/data-table-row-range.js +63 -0
  140. package/dist/components/data-table/pagination/data-table-row-range.js.map +1 -0
  141. package/dist/components/data-table/pagination/data-table-selected-count.d.ts +37 -0
  142. package/dist/components/data-table/pagination/data-table-selected-count.d.ts.map +1 -0
  143. package/dist/components/data-table/pagination/data-table-selected-count.js +44 -0
  144. package/dist/components/data-table/pagination/data-table-selected-count.js.map +1 -0
  145. package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts +15 -0
  146. package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts.map +1 -0
  147. package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.js +38 -0
  148. package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.js.map +1 -0
  149. package/dist/components/data-table/resize/data-table-resize-handle.d.ts +48 -0
  150. package/dist/components/data-table/resize/data-table-resize-handle.d.ts.map +1 -0
  151. package/dist/components/data-table/resize/data-table-resize-handle.js +115 -0
  152. package/dist/components/data-table/resize/data-table-resize-handle.js.map +1 -0
  153. package/dist/components/data-table/resize/use-data-table-resize-scroll.d.ts +18 -0
  154. package/dist/components/data-table/resize/use-data-table-resize-scroll.d.ts.map +1 -0
  155. package/dist/components/data-table/resize/use-data-table-resize-scroll.js +55 -0
  156. package/dist/components/data-table/resize/use-data-table-resize-scroll.js.map +1 -0
  157. package/dist/components/data-table/root/data-table-grid-classes.d.ts +10 -0
  158. package/dist/components/data-table/root/data-table-grid-classes.d.ts.map +1 -0
  159. package/dist/components/data-table/root/data-table-grid-classes.js +22 -0
  160. package/dist/components/data-table/root/data-table-grid-classes.js.map +1 -0
  161. package/dist/components/data-table/root/data-table-root.d.ts +41 -0
  162. package/dist/components/data-table/root/data-table-root.d.ts.map +1 -0
  163. package/dist/components/data-table/root/data-table-root.js +72 -0
  164. package/dist/components/data-table/root/data-table-root.js.map +1 -0
  165. package/dist/components/data-table/root/data-table-scroll-area.d.ts +21 -0
  166. package/dist/components/data-table/root/data-table-scroll-area.d.ts.map +1 -0
  167. package/dist/components/data-table/root/data-table-scroll-area.js +127 -0
  168. package/dist/components/data-table/root/data-table-scroll-area.js.map +1 -0
  169. package/dist/components/data-table/root/get-data-table-column-layout.d.ts +45 -0
  170. package/dist/components/data-table/root/get-data-table-column-layout.d.ts.map +1 -0
  171. package/dist/components/data-table/root/get-data-table-column-layout.js +55 -0
  172. package/dist/components/data-table/root/get-data-table-column-layout.js.map +1 -0
  173. package/dist/components/data-table/root/get-data-table-column-pinning.d.ts +46 -0
  174. package/dist/components/data-table/root/get-data-table-column-pinning.d.ts.map +1 -0
  175. package/dist/components/data-table/root/get-data-table-column-pinning.js +46 -0
  176. package/dist/components/data-table/root/get-data-table-column-pinning.js.map +1 -0
  177. package/dist/components/data-table/root/get-data-table-scroll-parent.d.ts +13 -0
  178. package/dist/components/data-table/root/get-data-table-scroll-parent.d.ts.map +1 -0
  179. package/dist/components/data-table/root/get-data-table-scroll-parent.js +20 -0
  180. package/dist/components/data-table/root/get-data-table-scroll-parent.js.map +1 -0
  181. package/dist/components/data-table/root/use-data-table-column-layout.d.ts +25 -0
  182. package/dist/components/data-table/root/use-data-table-column-layout.d.ts.map +1 -0
  183. package/dist/components/data-table/root/use-data-table-column-layout.js +106 -0
  184. package/dist/components/data-table/root/use-data-table-column-layout.js.map +1 -0
  185. package/dist/components/data-table/root/use-data-table-header-offset.d.ts +15 -0
  186. package/dist/components/data-table/root/use-data-table-header-offset.d.ts.map +1 -0
  187. package/dist/components/data-table/root/use-data-table-header-offset.js +35 -0
  188. package/dist/components/data-table/root/use-data-table-header-offset.js.map +1 -0
  189. package/dist/components/data-table/selection/data-table-row-checkbox.d.ts +33 -0
  190. package/dist/components/data-table/selection/data-table-row-checkbox.d.ts.map +1 -0
  191. package/dist/components/data-table/selection/data-table-row-checkbox.js +50 -0
  192. package/dist/components/data-table/selection/data-table-row-checkbox.js.map +1 -0
  193. package/dist/components/data-table/selection/data-table-select-all-checkbox.d.ts +31 -0
  194. package/dist/components/data-table/selection/data-table-select-all-checkbox.d.ts.map +1 -0
  195. package/dist/components/data-table/selection/data-table-select-all-checkbox.js +44 -0
  196. package/dist/components/data-table/selection/data-table-select-all-checkbox.js.map +1 -0
  197. package/dist/components/data-table/selection/selection-column-def.d.ts +54 -0
  198. package/dist/components/data-table/selection/selection-column-def.d.ts.map +1 -0
  199. package/dist/components/data-table/selection/selection-column-def.js +55 -0
  200. package/dist/components/data-table/selection/selection-column-def.js.map +1 -0
  201. package/dist/components/data-table/sorting/data-table-sort-indicator.d.ts +26 -0
  202. package/dist/components/data-table/sorting/data-table-sort-indicator.d.ts.map +1 -0
  203. package/dist/components/data-table/sorting/data-table-sort-indicator.js +64 -0
  204. package/dist/components/data-table/sorting/data-table-sort-indicator.js.map +1 -0
  205. package/dist/components/data-table/sorting/data-table-sort-trigger.d.ts +31 -0
  206. package/dist/components/data-table/sorting/data-table-sort-trigger.d.ts.map +1 -0
  207. package/dist/components/data-table/sorting/data-table-sort-trigger.js +46 -0
  208. package/dist/components/data-table/sorting/data-table-sort-trigger.js.map +1 -0
  209. package/dist/components/data-table/toolbar/data-table-density-select.d.ts +39 -0
  210. package/dist/components/data-table/toolbar/data-table-density-select.d.ts.map +1 -0
  211. package/dist/components/data-table/toolbar/data-table-density-select.js +60 -0
  212. package/dist/components/data-table/toolbar/data-table-density-select.js.map +1 -0
  213. package/dist/components/data-table/toolbar/data-table-sort-column-select.d.ts +47 -0
  214. package/dist/components/data-table/toolbar/data-table-sort-column-select.d.ts.map +1 -0
  215. package/dist/components/data-table/toolbar/data-table-sort-column-select.js +78 -0
  216. package/dist/components/data-table/toolbar/data-table-sort-column-select.js.map +1 -0
  217. package/dist/components/data-table/toolbar/data-table-sort-direction-select.d.ts +40 -0
  218. package/dist/components/data-table/toolbar/data-table-sort-direction-select.d.ts.map +1 -0
  219. package/dist/components/data-table/toolbar/data-table-sort-direction-select.js +66 -0
  220. package/dist/components/data-table/toolbar/data-table-sort-direction-select.js.map +1 -0
  221. package/dist/features/active-row/active-row-feature.d.ts +22 -0
  222. package/dist/features/active-row/active-row-feature.d.ts.map +1 -0
  223. package/dist/features/active-row/active-row-feature.js +55 -0
  224. package/dist/features/active-row/active-row-feature.js.map +1 -0
  225. package/dist/features/active-row/active-row-feature.types.d.ts +64 -0
  226. package/dist/features/active-row/active-row-feature.types.d.ts.map +1 -0
  227. package/dist/features/active-row/active-row-feature.types.js +0 -0
  228. package/dist/features/column-alignment/column-alignment-feature.d.ts +23 -0
  229. package/dist/features/column-alignment/column-alignment-feature.d.ts.map +1 -0
  230. package/dist/features/column-alignment/column-alignment-feature.js +34 -0
  231. package/dist/features/column-alignment/column-alignment-feature.js.map +1 -0
  232. package/dist/features/column-alignment/column-alignment-feature.types.d.ts +34 -0
  233. package/dist/features/column-alignment/column-alignment-feature.types.d.ts.map +1 -0
  234. package/dist/features/column-alignment/column-alignment-feature.types.js +0 -0
  235. package/dist/features/index.d.ts +9 -0
  236. package/dist/features/index.js +5 -0
  237. package/dist/features/loading/loading-feature.d.ts +30 -0
  238. package/dist/features/loading/loading-feature.d.ts.map +1 -0
  239. package/dist/features/loading/loading-feature.js +48 -0
  240. package/dist/features/loading/loading-feature.js.map +1 -0
  241. package/dist/features/loading/loading-feature.types.d.ts +50 -0
  242. package/dist/features/loading/loading-feature.types.d.ts.map +1 -0
  243. package/dist/features/loading/loading-feature.types.js +0 -0
  244. package/dist/features/row-density/row-density-feature.d.ts +26 -0
  245. package/dist/features/row-density/row-density-feature.d.ts.map +1 -0
  246. package/dist/features/row-density/row-density-feature.js +44 -0
  247. package/dist/features/row-density/row-density-feature.js.map +1 -0
  248. package/dist/features/row-density/row-density-feature.types.d.ts +53 -0
  249. package/dist/features/row-density/row-density-feature.types.d.ts.map +1 -0
  250. package/dist/features/row-density/row-density-feature.types.js +0 -0
  251. package/dist/types/index.d.ts +2 -0
  252. package/dist/types/index.js +0 -0
  253. package/dist/types/table-with.d.ts +96 -0
  254. package/dist/types/table-with.d.ts.map +1 -0
  255. package/dist/types/table-with.js +0 -0
  256. package/dist/utils/get-default-column-label.d.ts +17 -0
  257. package/dist/utils/get-default-column-label.d.ts.map +1 -0
  258. package/dist/utils/get-default-column-label.js +18 -0
  259. package/dist/utils/get-default-column-label.js.map +1 -0
  260. package/dist/utils/has-feature.d.ts +54 -0
  261. package/dist/utils/has-feature.d.ts.map +1 -0
  262. package/dist/utils/has-feature.js +55 -0
  263. package/dist/utils/has-feature.js.map +1 -0
  264. package/dist/utils/index.d.ts +3 -0
  265. package/dist/utils/index.js +3 -0
  266. package/package.json +80 -3
  267. package/README.md +0 -3
@@ -0,0 +1,58 @@
1
+ import { Row, RowData, Table, TableFeatures } from "@tanstack/react-table";
2
+ import { useRender } from "@base-ui/react";
3
+ import React from "react";
4
+ import { MergeOverride } from "@lucasbernardosn/utils";
5
+ //#region src/components/data-table/body/data-table-body.d.ts
6
+ export type DataTableBodyProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
7
+ /** A tabela do `useTable`. */
8
+ table: Table<TFeatures, TData>;
9
+ /**
10
+ * Uma função que recebe cada linha do row model e devolve o elemento dela. Com nós comuns,
11
+ * quem usa faz o laço.
12
+ * @default (row) => <DataTable.Row row={row} />
13
+ */
14
+ children?: React.ReactNode | ((row: Row<TFeatures, TData>) => React.ReactNode);
15
+ /**
16
+ * Quantas linhas-fantasma o corpo desenha na carga sem linhas, com `loadingFeature`.
17
+ * @default 10
18
+ */
19
+ loadingRowCount?: number;
20
+ }>;
21
+ /**
22
+ * O corpo da tabela (`role="rowgroup"`).
23
+ *
24
+ * Com render-prop ou sem `children`, faz o laço sozinho: assina as linhas do row model e
25
+ * re-renderiza quando os dados, a ordenação ou a página mudam, sem o dono da tabela precisar
26
+ * re-renderizar. Com nós comuns, o laço é de quem usa, e o dono precisa re-renderizar quando as
27
+ * linhas mudam.
28
+ *
29
+ * Marca as linhas com `content-visibility: auto`: o que está fora da tela não entra no estilo,
30
+ * no layout nem na pintura, e o corpo aguenta centenas de linhas sem virtualização. Para
31
+ * desligar, passe `className="*:[content-visibility:visible]"`.
32
+ *
33
+ * Com `activeRowFeature`, quando a linha com foco sai (apagada, de outra página, filtrada), o foco
34
+ * volta para a linha ativa, se ela ficou, ou para a que tomou o lugar da que saiu.
35
+ *
36
+ * Com `rowPaginationFeature`, trocar de página ou de tamanho volta a rolagem vertical ao topo.
37
+ *
38
+ * Com `loadingFeature`, fica bloqueado (`inert`) enquanto carrega. Sem linhas, desenha
39
+ * linhas-fantasma com skeleton (`loadingRowCount`); com linhas, cada célula troca o conteúdo por um
40
+ * skeleton (ver `DataTable.Root`).
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * <DataTable.Body table={table}>
45
+ * {(row) => (
46
+ * <DataTable.Row row={row}>
47
+ * {(cell) => <DataTable.Cell cell={cell} />}
48
+ * </DataTable.Row>
49
+ * )}
50
+ * </DataTable.Body>
51
+ * ```
52
+ */
53
+ export declare const DataTableBody: {
54
+ <TFeatures extends TableFeatures, TData extends RowData>(props: DataTableBodyProps<TFeatures, TData>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
55
+ displayName: string;
56
+ };
57
+ //#endregion
58
+ //# sourceMappingURL=data-table-body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-body.d.ts","names":[],"sources":["../../../../src/components/data-table/body/data-table-body.tsx"],"mappings":";;;;;YAgBY,mBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,MAAM,WAAW;;;;;;EAMxB,WACI,MAAM,cACJ,KAAK,IAAI,WAAW,WAAW,MAAM;;;;;EAK3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAoCS;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,mBAAmB,WAAW,SAAM,MAAA,+BAAA,MAAA"}
@@ -0,0 +1,99 @@
1
+ import { hasTableFeature } from "../../../utils/has-feature.js";
2
+ import { getDataTableLoadingWithoutRows } from "../loading/get-data-table-loading-without-rows.js";
3
+ import { useDataTableLoadingInert } from "../loading/use-data-table-loading-inert.js";
4
+ import { useDataTablePageScrollReset } from "../pagination/use-data-table-page-scroll-reset.js";
5
+ import { DATA_TABLE_GRID_CLASS_NAMES } from "../root/data-table-grid-classes.js";
6
+ import { DataTableRow } from "./data-table-row.js";
7
+ import { useDataTableRowFocusRecovery } from "./use-data-table-row-focus-recovery.js";
8
+ import { jsx } from "react/jsx-runtime";
9
+ import { mergeProps, useRender } from "@base-ui/react";
10
+ import { useSelector } from "@tanstack/react-store";
11
+ import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
12
+ import { Fragment as Fragment$1 } from "react";
13
+ import { Skeleton } from "@lucasbernardosn/react-ui/feedback/skeleton";
14
+ //#region src/components/data-table/body/data-table-body.tsx
15
+ /**
16
+ * O corpo da tabela (`role="rowgroup"`).
17
+ *
18
+ * Com render-prop ou sem `children`, faz o laço sozinho: assina as linhas do row model e
19
+ * re-renderiza quando os dados, a ordenação ou a página mudam, sem o dono da tabela precisar
20
+ * re-renderizar. Com nós comuns, o laço é de quem usa, e o dono precisa re-renderizar quando as
21
+ * linhas mudam.
22
+ *
23
+ * Marca as linhas com `content-visibility: auto`: o que está fora da tela não entra no estilo,
24
+ * no layout nem na pintura, e o corpo aguenta centenas de linhas sem virtualização. Para
25
+ * desligar, passe `className="*:[content-visibility:visible]"`.
26
+ *
27
+ * Com `activeRowFeature`, quando a linha com foco sai (apagada, de outra página, filtrada), o foco
28
+ * volta para a linha ativa, se ela ficou, ou para a que tomou o lugar da que saiu.
29
+ *
30
+ * Com `rowPaginationFeature`, trocar de página ou de tamanho volta a rolagem vertical ao topo.
31
+ *
32
+ * Com `loadingFeature`, fica bloqueado (`inert`) enquanto carrega. Sem linhas, desenha
33
+ * linhas-fantasma com skeleton (`loadingRowCount`); com linhas, cada célula troca o conteúdo por um
34
+ * skeleton (ver `DataTable.Root`).
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * <DataTable.Body table={table}>
39
+ * {(row) => (
40
+ * <DataTable.Row row={row}>
41
+ * {(cell) => <DataTable.Cell cell={cell} />}
42
+ * </DataTable.Row>
43
+ * )}
44
+ * </DataTable.Body>
45
+ * ```
46
+ */
47
+ const DataTableBody = (props) => {
48
+ const { table, loadingRowCount = 10, render, className, children, ref, ...rest } = props;
49
+ /**
50
+ * Memoizado pelo TanStack: o array só muda com as linhas. Tamanho, colunas e seleção mudam o
51
+ * store, mas não o row model, e não re-renderizam o corpo.
52
+ */
53
+ const rows = useSelector(table.store, () => table.getRowModel().rows);
54
+ const focusRecovery = useDataTableRowFocusRecovery(table, rows);
55
+ useDataTablePageScrollReset(table, focusRecovery.ref);
56
+ useDataTableLoadingInert(table, focusRecovery.ref);
57
+ /**
58
+ * Quantas colunas cada linha-fantasma tem, ou 0 sem elas: só na carga sem linhas. Re-renderiza
59
+ * quando as linhas-fantasma entram ou saem, ou quando as colunas visíveis mudam durante a carga.
60
+ */
61
+ const ghostColumnCount = useSelector(table.store, () => {
62
+ if (!getDataTableLoadingWithoutRows(table)) return 0;
63
+ return hasTableFeature(table, "columnVisibilityFeature") ? table.getVisibleLeafColumns().length : table.getAllLeafColumns().length;
64
+ });
65
+ /** Com render-prop ou sem `children`, o laço é daqui; com nós comuns, de quem usa. */
66
+ const content = typeof children === "function" || children === void 0 ? rows.map((row) => /* @__PURE__ */ jsx(Fragment$1, { children: children === void 0 ? /* @__PURE__ */ jsx(DataTableRow, { row }) : children(row) }, row.id)) : children;
67
+ /**
68
+ * Fora da árvore de acessibilidade, que já sabe da espera pelo `aria-busy` do `DataTable.Root`.
69
+ * A grade é a da `DataTable.Row`, e o espaçamento repete o da `DataTable.Cell`.
70
+ */
71
+ const ghostRows = Array.from({ length: loadingRowCount }, (_, rowIndex) => /* @__PURE__ */ jsx("div", {
72
+ "aria-hidden": true,
73
+ "data-component": "DataTable.GhostRow",
74
+ className: mergeTwClassNames([DATA_TABLE_GRID_CLASS_NAMES, "last:border-b-0"]),
75
+ children: Array.from({ length: ghostColumnCount }, (_, columnIndex) => /* @__PURE__ */ jsx("div", {
76
+ className: "h-(--data-table-row-height) content-center px-(--data-table-cell-padding)",
77
+ children: /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-3/4" })
78
+ }, columnIndex))
79
+ }, rowIndex));
80
+ const baseProps = {
81
+ "data-component": "DataTable.Body",
82
+ role: "rowgroup",
83
+ onFocus: focusRecovery.onFocus,
84
+ onBlur: focusRecovery.onBlur,
85
+ className: mergeTwClassNames(["*:[content-visibility:auto]", "*:[contain-intrinsic-height:auto_calc(var(--data-table-row-height)+1px)]"], className),
86
+ children: ghostColumnCount > 0 ? ghostRows : content
87
+ };
88
+ return useRender({
89
+ render,
90
+ ref: [focusRecovery.ref, ref ?? null],
91
+ defaultTagName: "div",
92
+ props: mergeProps(baseProps, rest)
93
+ });
94
+ };
95
+ DataTableBody.displayName = "DataTable.Body";
96
+ //#endregion
97
+ export { DataTableBody };
98
+
99
+ //# sourceMappingURL=data-table-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-body.js","names":["Fragment"],"sources":["../../../../src/components/data-table/body/data-table-body.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { Skeleton } from '@lucasbernardosn/react-ui/feedback/skeleton';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { Row, RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { Fragment } from 'react';\nimport { hasTableFeature } from '../../../utils';\nimport { getDataTableLoadingWithoutRows } from '../loading/get-data-table-loading-without-rows';\nimport { useDataTableLoadingInert } from '../loading/use-data-table-loading-inert';\nimport { useDataTablePageScrollReset } from '../pagination/use-data-table-page-scroll-reset';\nimport { DATA_TABLE_GRID_CLASS_NAMES } from '../root/data-table-grid-classes';\nimport { DataTableRow } from './data-table-row';\nimport { useDataTableRowFocusRecovery } from './use-data-table-row-focus-recovery';\n\nexport type DataTableBodyProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** A tabela do `useTable`. */\n table: Table<TFeatures, TData>;\n /**\n * Uma função que recebe cada linha do row model e devolve o elemento dela. Com nós comuns,\n * quem usa faz o laço.\n * @default (row) => <DataTable.Row row={row} />\n */\n children?:\n | React.ReactNode\n | ((row: Row<TFeatures, TData>) => React.ReactNode);\n /**\n * Quantas linhas-fantasma o corpo desenha na carga sem linhas, com `loadingFeature`.\n * @default 10\n */\n loadingRowCount?: number;\n }\n>;\n\n/**\n * O corpo da tabela (`role=\"rowgroup\"`).\n *\n * Com render-prop ou sem `children`, faz o laço sozinho: assina as linhas do row model e\n * re-renderiza quando os dados, a ordenação ou a página mudam, sem o dono da tabela precisar\n * re-renderizar. Com nós comuns, o laço é de quem usa, e o dono precisa re-renderizar quando as\n * linhas mudam.\n *\n * Marca as linhas com `content-visibility: auto`: o que está fora da tela não entra no estilo,\n * no layout nem na pintura, e o corpo aguenta centenas de linhas sem virtualização. Para\n * desligar, passe `className=\"*:[content-visibility:visible]\"`.\n *\n * Com `activeRowFeature`, quando a linha com foco sai (apagada, de outra página, filtrada), o foco\n * volta para a linha ativa, se ela ficou, ou para a que tomou o lugar da que saiu.\n *\n * Com `rowPaginationFeature`, trocar de página ou de tamanho volta a rolagem vertical ao topo.\n *\n * Com `loadingFeature`, fica bloqueado (`inert`) enquanto carrega. Sem linhas, desenha\n * linhas-fantasma com skeleton (`loadingRowCount`); com linhas, cada célula troca o conteúdo por um\n * skeleton (ver `DataTable.Root`).\n *\n * @example\n * ```tsx\n * <DataTable.Body table={table}>\n * {(row) => (\n * <DataTable.Row row={row}>\n * {(cell) => <DataTable.Cell cell={cell} />}\n * </DataTable.Row>\n * )}\n * </DataTable.Body>\n * ```\n */\nexport const DataTableBody = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableBodyProps<TFeatures, TData>,\n) => {\n const {\n table,\n loadingRowCount = 10,\n render,\n className,\n children,\n ref,\n ...rest\n } = props;\n\n /**\n * Memoizado pelo TanStack: o array só muda com as linhas. Tamanho, colunas e seleção mudam o\n * store, mas não o row model, e não re-renderizam o corpo.\n */\n const rows = useSelector(table.store, () => table.getRowModel().rows);\n\n const focusRecovery = useDataTableRowFocusRecovery(table, rows);\n\n useDataTablePageScrollReset(table, focusRecovery.ref);\n\n useDataTableLoadingInert(table, focusRecovery.ref);\n\n /**\n * Quantas colunas cada linha-fantasma tem, ou 0 sem elas: só na carga sem linhas. Re-renderiza\n * quando as linhas-fantasma entram ou saem, ou quando as colunas visíveis mudam durante a carga.\n */\n const ghostColumnCount = useSelector(table.store, () => {\n if (!getDataTableLoadingWithoutRows(table)) {\n return 0;\n }\n\n return hasTableFeature(table, 'columnVisibilityFeature')\n ? table.getVisibleLeafColumns().length\n : table.getAllLeafColumns().length;\n });\n\n /** Com render-prop ou sem `children`, o laço é daqui; com nós comuns, de quem usa. */\n const content =\n typeof children === 'function' || children === undefined\n ? rows.map((row) => (\n <Fragment key={row.id}>\n {children === undefined ? (\n <DataTableRow row={row} />\n ) : (\n children(row)\n )}\n </Fragment>\n ))\n : children;\n\n /**\n * Fora da árvore de acessibilidade, que já sabe da espera pelo `aria-busy` do `DataTable.Root`.\n * A grade é a da `DataTable.Row`, e o espaçamento repete o da `DataTable.Cell`.\n */\n const ghostRows = Array.from({ length: loadingRowCount }, (_, rowIndex) => (\n <div\n key={rowIndex}\n aria-hidden={true}\n data-component=\"DataTable.GhostRow\"\n className={mergeTwClassNames([\n DATA_TABLE_GRID_CLASS_NAMES,\n 'last:border-b-0',\n ])}\n >\n {Array.from({ length: ghostColumnCount }, (_, columnIndex) => (\n <div\n key={columnIndex}\n className=\"h-(--data-table-row-height) content-center px-(--data-table-cell-padding)\"\n >\n <Skeleton className=\"h-3 w-3/4\" />\n </div>\n ))}\n </div>\n ));\n\n const baseProps = {\n 'data-component': 'DataTable.Body',\n role: 'rowgroup',\n onFocus: focusRecovery.onFocus,\n onBlur: focusRecovery.onBlur,\n className: mergeTwClassNames(\n [\n // As linhas fora da tela pulam estilo, layout e pintura. Sem isto, cada tick do arrasto\n // de uma coluna, que reescreve a variável herdada do template no `Root`, recalcula todas\n // as linhas, e com centenas delas o arrasto trava.\n '*:[content-visibility:auto]',\n // A altura de uma linha que ainda não apareceu: a da densidade mais a borda de baixo da\n // `DataTable.Row`. Com `auto`, a linha que já apareceu guarda a altura medida. Uma\n // estimativa errada faz a barra de rolagem pular quando as linhas entram na tela.\n '*:[contain-intrinsic-height:auto_calc(var(--data-table-row-height)+1px)]',\n ],\n className,\n ),\n children: ghostColumnCount > 0 ? ghostRows : content,\n };\n\n return useRender({\n render,\n ref: [focusRecovery.ref, ref ?? null],\n defaultTagName: 'div',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableBody.displayName = 'DataTable.Body';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEA,MAAa,iBAIX,UACG;CACH,MAAM,EACJ,OACA,kBAAkB,IAClB,QACA,WACA,UACA,KACA,GAAG,SACD;;;;;CAMJ,MAAM,OAAO,YAAY,MAAM,aAAa,MAAM,YAAY,CAAC,CAAC,IAAI;CAEpE,MAAM,gBAAgB,6BAA6B,OAAO,IAAI;CAE9D,4BAA4B,OAAO,cAAc,GAAG;CAEpD,yBAAyB,OAAO,cAAc,GAAG;;;;;CAMjD,MAAM,mBAAmB,YAAY,MAAM,aAAa;EACtD,IAAI,CAAC,+BAA+B,KAAK,GACvC,OAAO;EAGT,OAAO,gBAAgB,OAAO,yBAAyB,IACnD,MAAM,sBAAsB,CAAC,CAAC,SAC9B,MAAM,kBAAkB,CAAC,CAAC;CAChC,CAAC;;CAGD,MAAM,UACJ,OAAO,aAAa,cAAc,aAAa,KAAA,IAC3C,KAAK,KAAK,QACR,oBAACA,YAAD,EAAA,UACG,aAAa,KAAA,IACZ,oBAAC,cAAD,EAAmB,IAAM,CAAA,IAEzB,SAAS,GAAG,EAEN,GANK,IAAI,EAMT,CACX,IACD;;;;;CAMN,MAAM,YAAY,MAAM,KAAK,EAAE,QAAQ,gBAAgB,IAAI,GAAG,aAC5D,oBAAC,OAAD;EAEE,eAAa;EACb,kBAAe;EACf,WAAW,kBAAkB,CAC3B,6BACA,iBACF,CAAC;EAEA,UAAA,MAAM,KAAK,EAAE,QAAQ,iBAAiB,IAAI,GAAG,gBAC5C,oBAAC,OAAD;GAEE,WAAU;GAEV,UAAA,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA;EAC9B,GAJE,WAIF,CACN;CACE,GAhBE,QAgBF,CACN;CAED,MAAM,YAAY;EAChB,kBAAkB;EAClB,MAAM;EACN,SAAS,cAAc;EACvB,QAAQ,cAAc;EACtB,WAAW,kBACT,CAIE,+BAIA,0EACF,GACA,SACF;EACA,UAAU,mBAAmB,IAAI,YAAY;CAC/C;CAEA,OAAO,UAAU;EACf;EACA,KAAK,CAAC,cAAc,KAAK,OAAO,IAAI;EACpC,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,cAAc,cAAc"}
@@ -0,0 +1,26 @@
1
+ import { Cell, RowData, TableFeatures } from "@tanstack/react-table";
2
+ import { useRender } from "@base-ui/react";
3
+ import { MergeOverride } from "@lucasbernardosn/utils";
4
+ //#region src/components/data-table/body/data-table-cell.d.ts
5
+ export type DataTableCellProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
6
+ /** A célula da linha. */
7
+ cell: Cell<TFeatures, TData>;
8
+ }>;
9
+ /**
10
+ * Uma célula do corpo (`role="cell"`). Sem `children`, mostra o `cell` da definição da coluna;
11
+ * com eles, mostra os `children`.
12
+ *
13
+ * Trunca o texto com reticências. Para arrumar o conteúdo em linha, como texto com ícone, passe
14
+ * `className="flex items-center gap-2"` e trunque o texto por conta própria.
15
+ *
16
+ * Com `columnAlignmentFeature`, alinha o conteúdo pelo `align` da coluna e o marca em
17
+ * `data-align`. Com `columnPinningFeature`, numa coluna fixada, gruda na borda do lado dela,
18
+ * marcada com `data-pinned`, e repete o fundo da `DataTable.Row` para cobrir o que rola por
19
+ * baixo.
20
+ */
21
+ export declare const DataTableCell: {
22
+ <TFeatures extends TableFeatures, TData extends RowData>(props: DataTableCellProps<TFeatures, TData>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
23
+ displayName: string;
24
+ };
25
+ //#endregion
26
+ //# sourceMappingURL=data-table-cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-cell.d.ts","names":[],"sources":["../../../../src/components/data-table/body/data-table-cell.tsx"],"mappings":";;;;YAeY,mBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,MAAM,KAAK,WAAW;;;;;;;;;;;;;;qBAgBb;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,mBAAmB,WAAW,yBAAM,+CAAA"}
@@ -0,0 +1,80 @@
1
+ import { hasColumnFeature, hasTableFeature } from "../../../utils/has-feature.js";
2
+ import { getDataTableColumnPinning, getDataTablePinnedStyle } from "../root/get-data-table-column-pinning.js";
3
+ import { FlexRender } from "@tanstack/react-table";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import { mergeProps, useRender } from "@base-ui/react";
6
+ import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
7
+ //#region src/components/data-table/body/data-table-cell.tsx
8
+ /**
9
+ * Uma célula do corpo (`role="cell"`). Sem `children`, mostra o `cell` da definição da coluna;
10
+ * com eles, mostra os `children`.
11
+ *
12
+ * Trunca o texto com reticências. Para arrumar o conteúdo em linha, como texto com ícone, passe
13
+ * `className="flex items-center gap-2"` e trunque o texto por conta própria.
14
+ *
15
+ * Com `columnAlignmentFeature`, alinha o conteúdo pelo `align` da coluna e o marca em
16
+ * `data-align`. Com `columnPinningFeature`, numa coluna fixada, gruda na borda do lado dela,
17
+ * marcada com `data-pinned`, e repete o fundo da `DataTable.Row` para cobrir o que rola por
18
+ * baixo.
19
+ */
20
+ const DataTableCell = (props) => {
21
+ const { cell, render, className, children, ...rest } = props;
22
+ /**
23
+ * Sem assinatura: o alinhamento vem da definição da coluna, que não muda em runtime. Uma troca
24
+ * das colunas muda as células, e a `DataTable.Row` re-renderiza, com a célula junto.
25
+ */
26
+ const align = hasColumnFeature(cell.column, "columnAlignmentFeature") ? cell.column.getAlign() : void 0;
27
+ /**
28
+ * Sem assinatura: o pinning muda as células da linha, e a `DataTable.Row` re-renderiza, com a
29
+ * célula junto. O deslocamento muda no resize, mas fica na variável que o `DataTable.Root`
30
+ * escreve.
31
+ */
32
+ const pinning = getDataTableColumnPinning(cell.column);
33
+ const baseProps = {
34
+ "data-component": "DataTable.Cell",
35
+ "data-align": align,
36
+ "data-pinned": pinning.position || void 0,
37
+ role: hasTableFeature(cell.table, "activeRowFeature") ? "gridcell" : "cell",
38
+ style: getDataTablePinnedStyle(pinning),
39
+ className: mergeTwClassNames([
40
+ "block",
41
+ "content-center",
42
+ "min-w-0",
43
+ "truncate",
44
+ "data-[align=center]:text-center",
45
+ "data-[align=end]:text-end",
46
+ "h-(--data-table-row-height)",
47
+ "px-(--data-table-cell-padding)",
48
+ "data-pinned:sticky",
49
+ "data-pinned:z-1",
50
+ "data-pinned:bg-(--data-table-row-background)",
51
+ "data-[pinned=start]:has-[+:not([data-pinned=start])]:shadow-[6px_0_8px_-6px_rgb(0_0_0/0.12)]",
52
+ "dark:data-[pinned=start]:has-[+:not([data-pinned=start])]:shadow-[6px_0_8px_-6px_rgb(0_0_0/0.8)]",
53
+ "data-[pinned=end]:not-[[data-pinned=end]+*]:shadow-[-6px_0_8px_-6px_rgb(0_0_0/0.12)]",
54
+ "dark:data-[pinned=end]:not-[[data-pinned=end]+*]:shadow-[-6px_0_8px_-6px_rgb(0_0_0/0.8)]",
55
+ "text-sm",
56
+ "in-data-loading:text-[0px]",
57
+ "in-data-loading:*:hidden",
58
+ "in-data-loading:before:content-['']",
59
+ "in-data-loading:before:inline-block",
60
+ "in-data-loading:before:align-middle",
61
+ "in-data-loading:before:h-3",
62
+ "in-data-loading:before:w-3/4",
63
+ "in-data-loading:before:rounded-md",
64
+ "in-data-loading:before:corner-squircle",
65
+ "in-data-loading:before:bg-gray-6",
66
+ "in-data-loading:before:not-motion-reduced:animate-skeleton-pulse"
67
+ ], className),
68
+ children: children === void 0 ? /* @__PURE__ */ jsx(FlexRender, { cell }) : children
69
+ };
70
+ return useRender({
71
+ render,
72
+ defaultTagName: "div",
73
+ props: mergeProps(baseProps, rest)
74
+ });
75
+ };
76
+ DataTableCell.displayName = "DataTable.Cell";
77
+ //#endregion
78
+ export { DataTableCell };
79
+
80
+ //# sourceMappingURL=data-table-cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-cell.js","names":[],"sources":["../../../../src/components/data-table/body/data-table-cell.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport {\n type Cell,\n FlexRender,\n type RowData,\n type TableFeatures,\n} from '@tanstack/react-table';\nimport { hasColumnFeature, hasTableFeature } from '../../../utils';\nimport {\n getDataTableColumnPinning,\n getDataTablePinnedStyle,\n} from '../root/get-data-table-column-pinning';\n\nexport type DataTableCellProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** A célula da linha. */\n cell: Cell<TFeatures, TData>;\n }\n>;\n\n/**\n * Uma célula do corpo (`role=\"cell\"`). Sem `children`, mostra o `cell` da definição da coluna;\n * com eles, mostra os `children`.\n *\n * Trunca o texto com reticências. Para arrumar o conteúdo em linha, como texto com ícone, passe\n * `className=\"flex items-center gap-2\"` e trunque o texto por conta própria.\n *\n * Com `columnAlignmentFeature`, alinha o conteúdo pelo `align` da coluna e o marca em\n * `data-align`. Com `columnPinningFeature`, numa coluna fixada, gruda na borda do lado dela,\n * marcada com `data-pinned`, e repete o fundo da `DataTable.Row` para cobrir o que rola por\n * baixo.\n */\nexport const DataTableCell = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableCellProps<TFeatures, TData>,\n) => {\n const { cell, render, className, children, ...rest } = props;\n\n /**\n * Sem assinatura: o alinhamento vem da definição da coluna, que não muda em runtime. Uma troca\n * das colunas muda as células, e a `DataTable.Row` re-renderiza, com a célula junto.\n */\n const align = hasColumnFeature(cell.column, 'columnAlignmentFeature')\n ? cell.column.getAlign()\n : undefined;\n\n /**\n * Sem assinatura: o pinning muda as células da linha, e a `DataTable.Row` re-renderiza, com a\n * célula junto. O deslocamento muda no resize, mas fica na variável que o `DataTable.Root`\n * escreve.\n */\n const pinning = getDataTableColumnPinning(cell.column);\n\n const baseProps = {\n 'data-component': 'DataTable.Cell',\n 'data-align': align,\n 'data-pinned': pinning.position || undefined,\n // Dentro do `grid` do `DataTable.Root`, que a navegação por teclado liga, a célula é `gridcell`.\n role: hasTableFeature(cell.table, 'activeRowFeature') ? 'gridcell' : 'cell',\n style: getDataTablePinnedStyle(pinning),\n className: mergeTwClassNames(\n [\n // Bloco, e não flex: só num bloco o texto ganha reticências. O `content-center` centraliza\n // na vertical.\n 'block',\n 'content-center',\n // Item de grid tem `min-width: auto`: sem isto, um conteúdo longo alarga o track, e a\n // coluna deixa de bater com o template.\n 'min-w-0',\n 'truncate',\n\n // Pelo `text-align`: a célula é bloco, e o conteúdo em linha, como o checkbox, segue.\n 'data-[align=center]:text-center',\n 'data-[align=end]:text-end',\n\n // Do `DataTable.Root`, pela densidade.\n 'h-(--data-table-row-height)',\n\n 'px-(--data-table-cell-padding)',\n\n // Fixada: gruda por cima das células do centro, e o fundo da linha a deixa opaca.\n 'data-pinned:sticky',\n 'data-pinned:z-1',\n 'data-pinned:bg-(--data-table-row-background)',\n // Sombra na borda da fixada, do lado em que o centro passa por baixo: na última do início e\n // na primeira do fim. Mais forte no escuro, onde a do claro sumiria no fundo.\n 'data-[pinned=start]:has-[+:not([data-pinned=start])]:shadow-[6px_0_8px_-6px_rgb(0_0_0/0.12)]',\n 'dark:data-[pinned=start]:has-[+:not([data-pinned=start])]:shadow-[6px_0_8px_-6px_rgb(0_0_0/0.8)]',\n 'data-[pinned=end]:not-[[data-pinned=end]+*]:shadow-[-6px_0_8px_-6px_rgb(0_0_0/0.12)]',\n 'dark:data-[pinned=end]:not-[[data-pinned=end]+*]:shadow-[-6px_0_8px_-6px_rgb(0_0_0/0.8)]',\n\n // A cor do texto vem da `DataTable.Row`, para a cor que o app puser na linha chegar aqui.\n 'text-sm',\n\n // Carregamento (`data-loading` no `DataTable.Root`): o conteúdo some\n // sem a célula mudar de tamanho, e um bloco com as classes do `Skeleton` do `ui` ocupa o\n // lugar, alinhado como o conteúdo. Por CSS, para as células não re-renderizarem a cada\n // carga. O texto vai a 0px, e não a transparente: senão empurraria o bloco no `center`.\n 'in-data-loading:text-[0px]',\n 'in-data-loading:*:hidden',\n \"in-data-loading:before:content-['']\",\n 'in-data-loading:before:inline-block',\n 'in-data-loading:before:align-middle',\n 'in-data-loading:before:h-3',\n 'in-data-loading:before:w-3/4',\n 'in-data-loading:before:rounded-md',\n 'in-data-loading:before:corner-squircle',\n 'in-data-loading:before:bg-gray-6',\n 'in-data-loading:before:not-motion-reduced:animate-skeleton-pulse',\n ],\n className,\n ),\n children: children === undefined ? <FlexRender cell={cell} /> : children,\n };\n\n return useRender({\n render,\n defaultTagName: 'div',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableCell.displayName = 'DataTable.Cell';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAsCA,MAAa,iBAIX,UACG;CACH,MAAM,EAAE,MAAM,QAAQ,WAAW,UAAU,GAAG,SAAS;;;;;CAMvD,MAAM,QAAQ,iBAAiB,KAAK,QAAQ,wBAAwB,IAChE,KAAK,OAAO,SAAS,IACrB,KAAA;;;;;;CAOJ,MAAM,UAAU,0BAA0B,KAAK,MAAM;CAErD,MAAM,YAAY;EAChB,kBAAkB;EAClB,cAAc;EACd,eAAe,QAAQ,YAAY,KAAA;EAEnC,MAAM,gBAAgB,KAAK,OAAO,kBAAkB,IAAI,aAAa;EACrE,OAAO,wBAAwB,OAAO;EACtC,WAAW,kBACT;GAGE;GACA;GAGA;GACA;GAGA;GACA;GAGA;GAEA;GAGA;GACA;GACA;GAGA;GACA;GACA;GACA;GAGA;GAMA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,GACA,SACF;EACA,UAAU,aAAa,KAAA,IAAY,oBAAC,YAAD,EAAkB,KAAO,CAAA,IAAI;CAClE;CAEA,OAAO,UAAU;EACf;EACA,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,cAAc,cAAc"}
@@ -0,0 +1,38 @@
1
+ import { RowData, Table, TableFeatures } from "@tanstack/react-table";
2
+ import { useRender } from "@base-ui/react";
3
+ import { MergeOverride } from "@lucasbernardosn/utils";
4
+ //#region src/components/data-table/body/data-table-empty.d.ts
5
+ export type DataTableEmptyProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
6
+ /** A tabela do `useTable`. */
7
+ table: Table<TFeatures, TData>;
8
+ }>;
9
+ /**
10
+ * O estado vazio da tabela, para depois do `DataTable.Body`, dentro do `DataTable.Root`. Aparece
11
+ * quando o row model não tem linhas e a tabela não está carregando: com `loadingFeature`, a carga
12
+ * sem linhas mostra as linhas-fantasma do corpo, e não o vazio.
13
+ *
14
+ * Sem `children`, mostra o `EmptyState` do `ui`, sem moldura, com "Nenhum registro encontrado"
15
+ * e uma descrição que sugere ajustar os filtros. Com `children`, o conteúdo do app, como uma
16
+ * mensagem do filtro e um botão para limpá-lo. Fica centralizado na largura da tabela.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * <DataTable.Root table={table}>
21
+ * <DataTable.Header table={table} />
22
+ * <DataTable.Body table={table} />
23
+ * <DataTable.Empty table={table}>
24
+ * <EmptyState.Root variant="plain">
25
+ * <EmptyState.Content>
26
+ * <EmptyState.Title>Nenhum cliente para este filtro</EmptyState.Title>
27
+ * </EmptyState.Content>
28
+ * </EmptyState.Root>
29
+ * </DataTable.Empty>
30
+ * </DataTable.Root>
31
+ * ```
32
+ */
33
+ export declare const DataTableEmpty: {
34
+ <TFeatures extends TableFeatures, TData extends RowData>(props: DataTableEmptyProps<TFeatures, TData>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | null;
35
+ displayName: string;
36
+ };
37
+ //#endregion
38
+ //# sourceMappingURL=data-table-empty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-empty.d.ts","names":[],"sources":["../../../../src/components/data-table/body/data-table-empty.tsx"],"mappings":";;;;YASY,oBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;qBA4Bf;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,oBAAoB,WAAW,yBAAM,+CAAA"}
@@ -0,0 +1,71 @@
1
+ import { hasTableFeature } from "../../../utils/has-feature.js";
2
+ import { TrayIcon } from "@phosphor-icons/react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { mergeProps, useRender } from "@base-ui/react";
5
+ import { useSelector } from "@tanstack/react-store";
6
+ import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
7
+ import { EmptyState } from "@lucasbernardosn/react-ui/feedback/empty-state";
8
+ //#region src/components/data-table/body/data-table-empty.tsx
9
+ /**
10
+ * O estado vazio da tabela, para depois do `DataTable.Body`, dentro do `DataTable.Root`. Aparece
11
+ * quando o row model não tem linhas e a tabela não está carregando: com `loadingFeature`, a carga
12
+ * sem linhas mostra as linhas-fantasma do corpo, e não o vazio.
13
+ *
14
+ * Sem `children`, mostra o `EmptyState` do `ui`, sem moldura, com "Nenhum registro encontrado"
15
+ * e uma descrição que sugere ajustar os filtros. Com `children`, o conteúdo do app, como uma
16
+ * mensagem do filtro e um botão para limpá-lo. Fica centralizado na largura da tabela.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * <DataTable.Root table={table}>
21
+ * <DataTable.Header table={table} />
22
+ * <DataTable.Body table={table} />
23
+ * <DataTable.Empty table={table}>
24
+ * <EmptyState.Root variant="plain">
25
+ * <EmptyState.Content>
26
+ * <EmptyState.Title>Nenhum cliente para este filtro</EmptyState.Title>
27
+ * </EmptyState.Content>
28
+ * </EmptyState.Root>
29
+ * </DataTable.Empty>
30
+ * </DataTable.Root>
31
+ * ```
32
+ */
33
+ const DataTableEmpty = (props) => {
34
+ const { table, render, className, children, ...rest } = props;
35
+ /**
36
+ * Re-renderiza quando a tabela fica vazia ou deixa de ficar. O store: as linhas mudam com os
37
+ * dados, e o carregamento, com a feature opcional.
38
+ */
39
+ const isEmpty = useSelector(table.store, () => table.getRowModel().rows.length === 0 && !(hasTableFeature(table, "loadingFeature") && table.atoms.isLoading.get()));
40
+ /** Dentro do `grid` do `DataTable.Root`, que a navegação por teclado liga, a célula é `gridcell`. */
41
+ const cellRole = hasTableFeature(table, "activeRowFeature") ? "gridcell" : "cell";
42
+ const baseProps = {
43
+ "data-component": "DataTable.Empty",
44
+ role: "row",
45
+ className: mergeTwClassNames(["py-8"], className),
46
+ children: /* @__PURE__ */ jsx("div", {
47
+ role: cellRole,
48
+ children: children === void 0 ? /* @__PURE__ */ jsxs(EmptyState.Root, {
49
+ variant: "plain",
50
+ children: [/* @__PURE__ */ jsx(EmptyState.Indicator, {
51
+ className: "text-gray-11",
52
+ children: /* @__PURE__ */ jsx(TrayIcon, {})
53
+ }), /* @__PURE__ */ jsxs(EmptyState.Content, { children: [/* @__PURE__ */ jsx(EmptyState.Title, {
54
+ className: "text-gray-11",
55
+ children: "Nenhum registro encontrado"
56
+ }), /* @__PURE__ */ jsx(EmptyState.Description, { children: "Não há registros para mostrar. Se houver filtros aplicados, tente ajustá-los." })] })]
57
+ }) : children
58
+ })
59
+ };
60
+ const element = useRender({
61
+ render,
62
+ defaultTagName: "div",
63
+ props: mergeProps(baseProps, rest)
64
+ });
65
+ return isEmpty ? element : null;
66
+ };
67
+ DataTableEmpty.displayName = "DataTable.Empty";
68
+ //#endregion
69
+ export { DataTableEmpty };
70
+
71
+ //# sourceMappingURL=data-table-empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-empty.js","names":[],"sources":["../../../../src/components/data-table/body/data-table-empty.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { EmptyState } from '@lucasbernardosn/react-ui/feedback/empty-state';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { TrayIcon } from '@phosphor-icons/react';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport { hasTableFeature } from '../../../utils';\n\nexport type DataTableEmptyProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** A tabela do `useTable`. */\n table: Table<TFeatures, TData>;\n }\n>;\n\n/**\n * O estado vazio da tabela, para depois do `DataTable.Body`, dentro do `DataTable.Root`. Aparece\n * quando o row model não tem linhas e a tabela não está carregando: com `loadingFeature`, a carga\n * sem linhas mostra as linhas-fantasma do corpo, e não o vazio.\n *\n * Sem `children`, mostra o `EmptyState` do `ui`, sem moldura, com \"Nenhum registro encontrado\"\n * e uma descrição que sugere ajustar os filtros. Com `children`, o conteúdo do app, como uma\n * mensagem do filtro e um botão para limpá-lo. Fica centralizado na largura da tabela.\n *\n * @example\n * ```tsx\n * <DataTable.Root table={table}>\n * <DataTable.Header table={table} />\n * <DataTable.Body table={table} />\n * <DataTable.Empty table={table}>\n * <EmptyState.Root variant=\"plain\">\n * <EmptyState.Content>\n * <EmptyState.Title>Nenhum cliente para este filtro</EmptyState.Title>\n * </EmptyState.Content>\n * </EmptyState.Root>\n * </DataTable.Empty>\n * </DataTable.Root>\n * ```\n */\nexport const DataTableEmpty = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableEmptyProps<TFeatures, TData>,\n) => {\n const { table, render, className, children, ...rest } = props;\n\n /**\n * Re-renderiza quando a tabela fica vazia ou deixa de ficar. O store: as linhas mudam com os\n * dados, e o carregamento, com a feature opcional.\n */\n const isEmpty = useSelector(\n table.store,\n () =>\n table.getRowModel().rows.length === 0 &&\n !(\n hasTableFeature(table, 'loadingFeature') && table.atoms.isLoading.get()\n ),\n );\n\n /** Dentro do `grid` do `DataTable.Root`, que a navegação por teclado liga, a célula é `gridcell`. */\n const cellRole = hasTableFeature(table, 'activeRowFeature')\n ? 'gridcell'\n : 'cell';\n\n const baseProps = {\n 'data-component': 'DataTable.Empty',\n // Uma linha com uma célula: dentro de `table` e `grid`, o ARIA só aceita linhas.\n role: 'row',\n className: mergeTwClassNames(['py-8'], className),\n children: (\n <div role={cellRole}>\n {children === undefined ? (\n <EmptyState.Root variant=\"plain\">\n <EmptyState.Indicator className=\"text-gray-11\">\n <TrayIcon />\n </EmptyState.Indicator>\n\n <EmptyState.Content>\n <EmptyState.Title className=\"text-gray-11\">\n Nenhum registro encontrado\n </EmptyState.Title>\n <EmptyState.Description>\n Não há registros para mostrar. Se houver filtros aplicados,\n tente ajustá-los.\n </EmptyState.Description>\n </EmptyState.Content>\n </EmptyState.Root>\n ) : (\n children\n )}\n </div>\n ),\n };\n\n const element = useRender({\n render,\n defaultTagName: 'div',\n props: mergeProps(baseProps, rest),\n });\n\n return isEmpty ? element : null;\n};\n\nDataTableEmpty.displayName = 'DataTable.Empty';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAa,kBAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,UAAU,GAAG,SAAS;;;;;CAMxD,MAAM,UAAU,YACd,MAAM,aAEJ,MAAM,YAAY,CAAC,CAAC,KAAK,WAAW,KACpC,EACE,gBAAgB,OAAO,gBAAgB,KAAK,MAAM,MAAM,UAAU,IAAI,EAE5E;;CAGA,MAAM,WAAW,gBAAgB,OAAO,kBAAkB,IACtD,aACA;CAEJ,MAAM,YAAY;EAChB,kBAAkB;EAElB,MAAM;EACN,WAAW,kBAAkB,CAAC,MAAM,GAAG,SAAS;EAChD,UACE,oBAAC,OAAD;GAAK,MAAM;GACR,UAAA,aAAa,KAAA,IACZ,qBAAC,WAAW,MAAZ;IAAiB,SAAQ;IAAzB,UAAA,CACE,oBAAC,WAAW,WAAZ;KAAsB,WAAU;KAC9B,UAAA,oBAAC,UAAD,CAAW,CAAA;IACS,CAAA,GAEtB,qBAAC,WAAW,SAAZ,EAAA,UAAA,CACE,oBAAC,WAAW,OAAZ;KAAkB,WAAU;KAAe,UAAA;IAEzB,CAAA,GAClB,oBAAC,WAAW,aAAZ,EAAA,UAAwB,gFAGA,CAAA,CACN,EAAA,CAAA,CACL;GAEjB,CAAA,IAAA;EAEC,CAAA;CAET;CAEA,MAAM,UAAU,UAAU;EACxB;EACA,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;CAED,OAAO,UAAU,UAAU;AAC7B;AAEA,eAAe,cAAc"}
@@ -0,0 +1,32 @@
1
+ //#region src/components/data-table/body/data-table-row-focus.d.ts
2
+ /**
3
+ * As linhas do corpo que contém o elemento, na ordem do DOM.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * getDataTableRowElements(rowElement).indexOf(rowElement);
8
+ * // → a posição da linha no corpo
9
+ * ```
10
+ */
11
+ export declare const getDataTableRowElements: (element: Element) => HTMLElement[];
12
+ /**
13
+ * A linha para onde uma tecla leva o foco: ↑↓ uma linha, Home e End a primeira e a última,
14
+ * PageUp e PageDown uma tela. Sem destino (outra tecla, um modificador, um campo de texto ou a
15
+ * ponta da tabela), `undefined`, e a tecla segue para o navegador.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * getDataTableRowKeyTarget(rowElement, event);
20
+ * // ↓ na terceira linha → o elemento da quarta
21
+ * ```
22
+ */
23
+ export declare const getDataTableRowKeyTarget: (rowElement: HTMLElement, event: Pick<KeyboardEvent, "key" | "target" | "altKey" | "ctrlKey" | "metaKey" | "shiftKey">) => HTMLElement | undefined;
24
+ /**
25
+ * Foca a linha e a traz para a vista pelo caminho mais curto. O `focus()` sozinho às vezes
26
+ * centraliza a linha e a tabela pula; o `nearest` rola só o que falta, respeita o
27
+ * `scroll-padding-top` (a linha para abaixo do cabeçalho) e não mexe na rolagem horizontal, já
28
+ * que a linha é mais larga que a área visível.
29
+ */
30
+ export declare const focusDataTableRow: (rowElement: HTMLElement) => void;
31
+ //#endregion
32
+ //# sourceMappingURL=data-table-row-focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-row-focus.d.ts","names":[],"sources":["../../../../src/components/data-table/body/data-table-row-focus.ts"],"mappings":";;;;;;;;;;qBAqBa,0BAA2B,SAAS,YAAO;;;;;;;;;;;;qBAmC3C,2BACX,YAAY,aACZ,OAAO,KACL,qFAED;;;;;;;qBA2CU,oBAAqB,YAAY"}
@@ -0,0 +1,58 @@
1
+ import { getDataTableScrollParent } from "../root/get-data-table-scroll-parent.js";
2
+ //#region src/components/data-table/body/data-table-row-focus.ts
3
+ /** Um campo de texto dentro da linha fica com as setas, que movem o cursor nele. */
4
+ const TEXT_ENTRY_SELECTOR = "input:not([type=\"checkbox\"], [type=\"radio\"], [type=\"button\"], [type=\"submit\"], [type=\"reset\"]), textarea, select, [contenteditable]:not([contenteditable=\"false\"])";
5
+ /**
6
+ * As linhas do corpo que contém o elemento, na ordem do DOM.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * getDataTableRowElements(rowElement).indexOf(rowElement);
11
+ * // → a posição da linha no corpo
12
+ * ```
13
+ */
14
+ const getDataTableRowElements = (element) => Array.from(element.closest("[role=\"rowgroup\"]")?.querySelectorAll("[role=\"row\"]") ?? []);
15
+ /**
16
+ * Quantas linhas inteiras cabem na área visível, abaixo do cabeçalho: o passo do PageUp e do
17
+ * PageDown.
18
+ */
19
+ const getPageSize = (rowElement) => {
20
+ const scrollParent = getDataTableScrollParent(rowElement);
21
+ const visibleHeight = scrollParent ? scrollParent.clientHeight - (Number.parseFloat(getComputedStyle(scrollParent).scrollPaddingTop) || 0) : window.innerHeight;
22
+ return Math.max(1, Math.floor(visibleHeight / Math.max(1, rowElement.offsetHeight)));
23
+ };
24
+ /**
25
+ * A linha para onde uma tecla leva o foco: ↑↓ uma linha, Home e End a primeira e a última,
26
+ * PageUp e PageDown uma tela. Sem destino (outra tecla, um modificador, um campo de texto ou a
27
+ * ponta da tabela), `undefined`, e a tecla segue para o navegador.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * getDataTableRowKeyTarget(rowElement, event);
32
+ * // ↓ na terceira linha → o elemento da quarta
33
+ * ```
34
+ */
35
+ const getDataTableRowKeyTarget = (rowElement, event) => {
36
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey || event.target instanceof Element && event.target.matches(TEXT_ENTRY_SELECTOR)) return;
37
+ const rowElements = getDataTableRowElements(rowElement);
38
+ const index = rowElements.indexOf(rowElement);
39
+ const targetIndex = event.key === "ArrowDown" ? index + 1 : event.key === "ArrowUp" ? index - 1 : event.key === "Home" ? 0 : event.key === "End" ? rowElements.length - 1 : event.key === "PageDown" ? Math.min(index + getPageSize(rowElement), rowElements.length - 1) : event.key === "PageUp" ? Math.max(index - getPageSize(rowElement), 0) : -1;
40
+ return targetIndex === index ? void 0 : rowElements[targetIndex];
41
+ };
42
+ /**
43
+ * Foca a linha e a traz para a vista pelo caminho mais curto. O `focus()` sozinho às vezes
44
+ * centraliza a linha e a tabela pula; o `nearest` rola só o que falta, respeita o
45
+ * `scroll-padding-top` (a linha para abaixo do cabeçalho) e não mexe na rolagem horizontal, já
46
+ * que a linha é mais larga que a área visível.
47
+ */
48
+ const focusDataTableRow = (rowElement) => {
49
+ rowElement.focus({ preventScroll: true });
50
+ rowElement.scrollIntoView({
51
+ block: "nearest",
52
+ inline: "nearest"
53
+ });
54
+ };
55
+ //#endregion
56
+ export { focusDataTableRow, getDataTableRowElements, getDataTableRowKeyTarget };
57
+
58
+ //# sourceMappingURL=data-table-row-focus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-row-focus.js","names":[],"sources":["../../../../src/components/data-table/body/data-table-row-focus.ts"],"sourcesContent":["import { getDataTableScrollParent } from '../root/get-data-table-scroll-parent';\n\n/*\n * O foco entre as linhas, pelo DOM: as setas movem o foco para o elemento da linha vizinha, e a\n * `DataTable.Row` grava a linha ativa quando o recebe. A ordem das linhas é a do DOM, que é a do\n * row model.\n */\n\n/** Um campo de texto dentro da linha fica com as setas, que movem o cursor nele. */\nconst TEXT_ENTRY_SELECTOR =\n 'input:not([type=\"checkbox\"], [type=\"radio\"], [type=\"button\"], [type=\"submit\"], [type=\"reset\"]), textarea, select, [contenteditable]:not([contenteditable=\"false\"])';\n\n/**\n * As linhas do corpo que contém o elemento, na ordem do DOM.\n *\n * @example\n * ```ts\n * getDataTableRowElements(rowElement).indexOf(rowElement);\n * // → a posição da linha no corpo\n * ```\n */\nexport const getDataTableRowElements = (element: Element) =>\n Array.from(\n element\n .closest('[role=\"rowgroup\"]')\n ?.querySelectorAll<HTMLElement>('[role=\"row\"]') ?? [],\n );\n\n/**\n * Quantas linhas inteiras cabem na área visível, abaixo do cabeçalho: o passo do PageUp e do\n * PageDown.\n */\nconst getPageSize = (rowElement: HTMLElement) => {\n const scrollParent = getDataTableScrollParent(rowElement);\n const visibleHeight = scrollParent\n ? scrollParent.clientHeight -\n (Number.parseFloat(getComputedStyle(scrollParent).scrollPaddingTop) || 0)\n : window.innerHeight;\n\n return Math.max(\n 1,\n Math.floor(visibleHeight / Math.max(1, rowElement.offsetHeight)),\n );\n};\n\n/**\n * A linha para onde uma tecla leva o foco: ↑↓ uma linha, Home e End a primeira e a última,\n * PageUp e PageDown uma tela. Sem destino (outra tecla, um modificador, um campo de texto ou a\n * ponta da tabela), `undefined`, e a tecla segue para o navegador.\n *\n * @example\n * ```ts\n * getDataTableRowKeyTarget(rowElement, event);\n * // ↓ na terceira linha → o elemento da quarta\n * ```\n */\nexport const getDataTableRowKeyTarget = (\n rowElement: HTMLElement,\n event: Pick<\n KeyboardEvent,\n 'key' | 'target' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >,\n) => {\n if (\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey ||\n (event.target instanceof Element &&\n event.target.matches(TEXT_ENTRY_SELECTOR))\n ) {\n return undefined;\n }\n\n const rowElements = getDataTableRowElements(rowElement);\n const index = rowElements.indexOf(rowElement);\n\n const targetIndex =\n event.key === 'ArrowDown'\n ? index + 1\n : event.key === 'ArrowUp'\n ? index - 1\n : event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? rowElements.length - 1\n : event.key === 'PageDown'\n ? Math.min(\n index + getPageSize(rowElement),\n rowElements.length - 1,\n )\n : event.key === 'PageUp'\n ? Math.max(index - getPageSize(rowElement), 0)\n : -1;\n\n return targetIndex === index ? undefined : rowElements[targetIndex];\n};\n\n/**\n * Foca a linha e a traz para a vista pelo caminho mais curto. O `focus()` sozinho às vezes\n * centraliza a linha e a tabela pula; o `nearest` rola só o que falta, respeita o\n * `scroll-padding-top` (a linha para abaixo do cabeçalho) e não mexe na rolagem horizontal, já\n * que a linha é mais larga que a área visível.\n */\nexport const focusDataTableRow = (rowElement: HTMLElement) => {\n rowElement.focus({ preventScroll: true });\n rowElement.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n};\n"],"mappings":";;;AASA,MAAM,sBACJ;;;;;;;;;;AAWF,MAAa,2BAA2B,YACtC,MAAM,KACJ,QACG,QAAQ,qBAAmB,CAAC,EAC3B,iBAA8B,gBAAc,KAAK,CAAC,CACxD;;;;;AAMF,MAAM,eAAe,eAA4B;CAC/C,MAAM,eAAe,yBAAyB,UAAU;CACxD,MAAM,gBAAgB,eAClB,aAAa,gBACZ,OAAO,WAAW,iBAAiB,YAAY,CAAC,CAAC,gBAAgB,KAAK,KACvE,OAAO;CAEX,OAAO,KAAK,IACV,GACA,KAAK,MAAM,gBAAgB,KAAK,IAAI,GAAG,WAAW,YAAY,CAAC,CACjE;AACF;;;;;;;;;;;;AAaA,MAAa,4BACX,YACA,UAIG;CACH,IACE,MAAM,UACN,MAAM,WACN,MAAM,WACN,MAAM,YACL,MAAM,kBAAkB,WACvB,MAAM,OAAO,QAAQ,mBAAmB,GAE1C;CAGF,MAAM,cAAc,wBAAwB,UAAU;CACtD,MAAM,QAAQ,YAAY,QAAQ,UAAU;CAE5C,MAAM,cACJ,MAAM,QAAQ,cACV,QAAQ,IACR,MAAM,QAAQ,YACZ,QAAQ,IACR,MAAM,QAAQ,SACZ,IACA,MAAM,QAAQ,QACZ,YAAY,SAAS,IACrB,MAAM,QAAQ,aACZ,KAAK,IACH,QAAQ,YAAY,UAAU,GAC9B,YAAY,SAAS,CACvB,IACA,MAAM,QAAQ,WACZ,KAAK,IAAI,QAAQ,YAAY,UAAU,GAAG,CAAC,IAC3C;CAEhB,OAAO,gBAAgB,QAAQ,KAAA,IAAY,YAAY;AACzD;;;;;;;AAQA,MAAa,qBAAqB,eAA4B;CAC5D,WAAW,MAAM,EAAE,eAAe,KAAK,CAAC;CACxC,WAAW,eAAe;EAAE,OAAO;EAAW,QAAQ;CAAU,CAAC;AACnE"}
@@ -0,0 +1,67 @@
1
+ import { Cell, Row, RowData, TableFeatures } from "@tanstack/react-table";
2
+ import { useRender } from "@base-ui/react";
3
+ import React from "react";
4
+ import { MergeOverride } from "@lucasbernardosn/utils";
5
+ //#region src/components/data-table/body/data-table-row.d.ts
6
+ export type DataTableRowProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
7
+ /** A linha do row model. */
8
+ row: Row<TFeatures, TData>;
9
+ /**
10
+ * Uma função que recebe cada célula visível e devolve o elemento dela. Com nós comuns, quem
11
+ * usa faz o laço.
12
+ * @default (cell) => <DataTable.Cell cell={cell} />
13
+ */
14
+ children?: React.ReactNode | ((cell: Cell<TFeatures, TData>) => React.ReactNode);
15
+ }>;
16
+ /**
17
+ * Uma linha do corpo (`role="row"`). É um grid com as colunas do `--data-table-template`, que o
18
+ * `DataTable.Root` escreve.
19
+ *
20
+ * Com render-prop ou sem `children`, faz o laço das células sozinha: assina as próprias células e
21
+ * re-renderiza quando a ordem, a visibilidade ou o pinning das colunas mudam, que não mudam o row
22
+ * model e não passam pelo `DataTable.Body`. Com `columnVisibilityFeature`, são as células
23
+ * visíveis; sem ela, todas. Com `columnPinningFeature`, vêm na ordem das regiões: as fixadas no
24
+ * início, as do centro e as fixadas no fim.
25
+ *
26
+ * Com `rowSelectionFeature`, a linha selecionada ganha `data-selected` e o fundo destacado, e com
27
+ * `activeRowFeature`, também o `aria-selected`. O clique na linha não seleciona: o `onClick` fica
28
+ * livre, e a seleção é do `DataTable.RowCheckbox` e do Espaço.
29
+ *
30
+ * Com `activeRowFeature`, entra na navegação por teclado. A linha ativa tem o ponto de Tab (sem
31
+ * ela no row model, a primeira), e receber o foco, pelo teclado ou pelo clique, torna esta a
32
+ * ativa, marcada com `data-active`. ↑↓, Home, End, PageUp e PageDown movem o foco entre as
33
+ * linhas, e o Espaço alterna a seleção, com Shift para o intervalo. Os atalhos são do app, no
34
+ * `onKeyDown`, que roda antes: um `preventDefault()` cancela o da linha. Num campo de texto de
35
+ * dentro, as setas ficam com o campo.
36
+ *
37
+ * O fundo fica na variável `--data-table-row-background`, que as células fixadas repetem: o
38
+ * hover e a selecionada a trocam para `gray-3`, e as duas juntas, para `gray-4`. Para colorir uma
39
+ * linha, troque a variável, e não use `bg-*`, que deixaria as fixadas com a cor antiga. A cor do
40
+ * texto fica na linha, e as células herdam.
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * <DataTable.Row
45
+ * row={row}
46
+ * onClick={() => openCustomer(row.original)}
47
+ * onKeyDown={(event) => {
48
+ * if (event.key === 'Enter') {
49
+ * openCustomer(row.original);
50
+ * }
51
+ * }}
52
+ * className={
53
+ * row.original.overdue
54
+ * ? '[--data-table-row-background:var(--color-gray-2)] text-gray-11'
55
+ * : undefined
56
+ * }
57
+ * >
58
+ * {(cell) => <DataTable.Cell cell={cell} />}
59
+ * </DataTable.Row>
60
+ * ```
61
+ */
62
+ export declare const DataTableRow: {
63
+ <TFeatures extends TableFeatures, TData extends RowData>(props: DataTableRowProps<TFeatures, TData>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
64
+ displayName: string;
65
+ };
66
+ //#endregion
67
+ //# sourceMappingURL=data-table-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-row.d.ts","names":[],"sources":["../../../../src/components/data-table/body/data-table-row.tsx"],"mappings":";;;;;YAeY,kBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,KAAK,IAAI,WAAW;;;;;;EAMpB,WACI,MAAM,cACJ,MAAM,KAAK,WAAW,WAAW,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAkDpC;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,kBAAkB,WAAW,SAAM,MAAA,+BAAA,MAAA"}