@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,44 @@
1
+ import { mergeProps, useRender } from "@base-ui/react";
2
+ import { useSelector } from "@tanstack/react-store";
3
+ import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
4
+ //#region src/components/data-table/pagination/data-table-selected-count.tsx
5
+ /**
6
+ * Quantas linhas estão marcadas: "3 selecionadas". Aparece também sem nenhuma, "0 selecionadas":
7
+ * na barra da paginação, o lado esquerdo não some e volta a cada seleção.
8
+ *
9
+ * Conta os ids marcados no estado, e não as linhas carregadas: com a paginação pela API, entram as
10
+ * marcadas em outras páginas. Exige o `getRowId` com o id do registro (ver
11
+ * `DataTable.RowCheckbox`).
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * <DataTable.SelectedCount table={table}>
16
+ * {(count) => `${count} de ${total}`}
17
+ * </DataTable.SelectedCount>
18
+ * ```
19
+ */
20
+ const DataTableSelectedCount = (props) => {
21
+ const { table, render, className, children, ...rest } = props;
22
+ /** Re-renderiza quando o número de marcadas muda. */
23
+ const count = useSelector(table.atoms.rowSelection, (rowSelection) => Object.values(rowSelection).filter(Boolean).length);
24
+ const baseProps = {
25
+ "data-component": "DataTable.SelectedCount",
26
+ className: mergeTwClassNames([
27
+ "text-gray-11",
28
+ "text-sm",
29
+ "tabular-nums",
30
+ "whitespace-nowrap"
31
+ ], className),
32
+ children: children === void 0 ? `${count.toLocaleString("pt-BR")} ${count === 1 ? "selecionada" : "selecionadas"}` : children(count)
33
+ };
34
+ return useRender({
35
+ render,
36
+ defaultTagName: "span",
37
+ props: mergeProps(baseProps, rest)
38
+ });
39
+ };
40
+ DataTableSelectedCount.displayName = "DataTable.SelectedCount";
41
+ //#endregion
42
+ export { DataTableSelectedCount };
43
+
44
+ //# sourceMappingURL=data-table-selected-count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-selected-count.js","names":[],"sources":["../../../../src/components/data-table/pagination/data-table-selected-count.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport type { TableWith } from '../../../types';\n\nexport type DataTableSelectedCountProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'span'>,\n {\n /** A tabela. Exige `rowSelectionFeature`. */\n table: TableWith<TFeatures, TData, 'rowSelectionFeature'>;\n /**\n * Uma função que recebe quantas linhas estão marcadas e devolve o texto.\n * @default (count) => '3 selecionadas', '1 selecionada' ou '0 selecionadas'\n */\n children?: (count: number) => React.ReactNode;\n }\n>;\n\n/**\n * Quantas linhas estão marcadas: \"3 selecionadas\". Aparece também sem nenhuma, \"0 selecionadas\":\n * na barra da paginação, o lado esquerdo não some e volta a cada seleção.\n *\n * Conta os ids marcados no estado, e não as linhas carregadas: com a paginação pela API, entram as\n * marcadas em outras páginas. Exige o `getRowId` com o id do registro (ver\n * `DataTable.RowCheckbox`).\n *\n * @example\n * ```tsx\n * <DataTable.SelectedCount table={table}>\n * {(count) => `${count} de ${total}`}\n * </DataTable.SelectedCount>\n * ```\n */\nexport const DataTableSelectedCount = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableSelectedCountProps<TFeatures, TData>,\n) => {\n const { table, render, className, children, ...rest } = props;\n\n /** Re-renderiza quando o número de marcadas muda. */\n const count = useSelector(\n table.atoms.rowSelection,\n (rowSelection) => Object.values(rowSelection).filter(Boolean).length,\n );\n\n const baseProps = {\n 'data-component': 'DataTable.SelectedCount',\n className: mergeTwClassNames(\n [\n 'text-gray-11',\n 'text-sm',\n\n 'tabular-nums',\n 'whitespace-nowrap',\n ],\n className,\n ),\n children:\n children === undefined\n ? `${count.toLocaleString('pt-BR')} ${count === 1 ? 'selecionada' : 'selecionadas'}`\n : children(count),\n };\n\n return useRender({\n render,\n defaultTagName: 'span',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableSelectedCount.displayName = 'DataTable.SelectedCount';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuCA,MAAa,0BAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,UAAU,GAAG,SAAS;;CAGxD,MAAM,QAAQ,YACZ,MAAM,MAAM,eACX,iBAAiB,OAAO,OAAO,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,MAChE;CAEA,MAAM,YAAY;EAChB,kBAAkB;EAClB,WAAW,kBACT;GACE;GACA;GAEA;GACA;EACF,GACA,SACF;EACA,UACE,aAAa,KAAA,IACT,GAAG,MAAM,eAAe,OAAO,EAAE,GAAG,UAAU,IAAI,gBAAgB,mBAClE,SAAS,KAAK;CACtB;CAEA,OAAO,UAAU;EACf;EACA,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,uBAAuB,cAAc"}
@@ -0,0 +1,15 @@
1
+ import { RowData, Table, TableFeatures } from "@tanstack/react-table";
2
+ import React from "react";
3
+ //#region src/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts
4
+ /**
5
+ * Volta a rolagem vertical ao topo quando a página ou o tamanho dela mudam. Sem isto, quem rolou
6
+ * até o fim e passou de página cai no fim da página seguinte. A rolagem horizontal fica. Só com
7
+ * `rowPaginationFeature`.
8
+ *
9
+ * Assina a paginação fora do React, como o bloqueio da carga: rolar não re-renderiza o corpo, que
10
+ * recriaria todas as linhas. Na paginação pela API, a página muda antes de as linhas chegarem, e
11
+ * um render ali seria à toa.
12
+ */
13
+ export declare const useDataTablePageScrollReset: <TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, ref: React.RefObject<HTMLElement | null>) => void;
14
+ //#endregion
15
+ //# sourceMappingURL=use-data-table-page-scroll-reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-data-table-page-scroll-reset.d.ts","names":[],"sources":["../../../../src/components/data-table/pagination/use-data-table-page-scroll-reset.ts"],"mappings":";;;;;;;;;;;;qBAea,8BACX,kBAAkB,eAClB,cAAc,SAEd,OAAO,MAAM,WAAW,QACxB,KAAK,MAAM,UAAU"}
@@ -0,0 +1,38 @@
1
+ import { hasTableFeature } from "../../../utils/has-feature.js";
2
+ import { getDataTableScrollParent } from "../root/get-data-table-scroll-parent.js";
3
+ import { useLayoutEffect } from "react";
4
+ //#region src/components/data-table/pagination/use-data-table-page-scroll-reset.ts
5
+ /**
6
+ * Volta a rolagem vertical ao topo quando a página ou o tamanho dela mudam. Sem isto, quem rolou
7
+ * até o fim e passou de página cai no fim da página seguinte. A rolagem horizontal fica. Só com
8
+ * `rowPaginationFeature`.
9
+ *
10
+ * Assina a paginação fora do React, como o bloqueio da carga: rolar não re-renderiza o corpo, que
11
+ * recriaria todas as linhas. Na paginação pela API, a página muda antes de as linhas chegarem, e
12
+ * um render ali seria à toa.
13
+ */
14
+ const useDataTablePageScrollReset = (table, ref) => {
15
+ useLayoutEffect(() => {
16
+ if (!hasTableFeature(table, "rowPaginationFeature")) return;
17
+ const paginationAtom = table.atoms.pagination;
18
+ /** A página e o tamanho num texto, para comparar com `===`. */
19
+ const getPageKey = () => {
20
+ const { pageIndex, pageSize } = paginationAtom.get();
21
+ return `${pageIndex}:${pageSize}`;
22
+ };
23
+ /** A página da última rolagem: na montagem, não rola. */
24
+ let lastPageKey = getPageKey();
25
+ const subscription = paginationAtom.subscribe(() => {
26
+ const pageKey = getPageKey();
27
+ if (pageKey === lastPageKey) return;
28
+ lastPageKey = pageKey;
29
+ const scrollParent = ref.current && getDataTableScrollParent(ref.current);
30
+ if (scrollParent) scrollParent.scrollTop = 0;
31
+ });
32
+ return () => subscription.unsubscribe();
33
+ }, [table, ref]);
34
+ };
35
+ //#endregion
36
+ export { useDataTablePageScrollReset };
37
+
38
+ //# sourceMappingURL=use-data-table-page-scroll-reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-data-table-page-scroll-reset.js","names":[],"sources":["../../../../src/components/data-table/pagination/use-data-table-page-scroll-reset.ts"],"sourcesContent":["import type { RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { useLayoutEffect } from 'react';\nimport { hasTableFeature } from '../../../utils';\nimport { getDataTableScrollParent } from '../root/get-data-table-scroll-parent';\n\n/**\n * Volta a rolagem vertical ao topo quando a página ou o tamanho dela mudam. Sem isto, quem rolou\n * até o fim e passou de página cai no fim da página seguinte. A rolagem horizontal fica. Só com\n * `rowPaginationFeature`.\n *\n * Assina a paginação fora do React, como o bloqueio da carga: rolar não re-renderiza o corpo, que\n * recriaria todas as linhas. Na paginação pela API, a página muda antes de as linhas chegarem, e\n * um render ali seria à toa.\n */\nexport const useDataTablePageScrollReset = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table<TFeatures, TData>,\n ref: React.RefObject<HTMLElement | null>,\n) => {\n useLayoutEffect(() => {\n if (!hasTableFeature(table, 'rowPaginationFeature')) {\n return;\n }\n\n const paginationAtom = table.atoms.pagination;\n\n /** A página e o tamanho num texto, para comparar com `===`. */\n const getPageKey = () => {\n const { pageIndex, pageSize } = paginationAtom.get();\n\n return `${pageIndex}:${pageSize}`;\n };\n\n /** A página da última rolagem: na montagem, não rola. */\n let lastPageKey = getPageKey();\n\n const subscription = paginationAtom.subscribe(() => {\n const pageKey = getPageKey();\n\n if (pageKey === lastPageKey) {\n return;\n }\n\n lastPageKey = pageKey;\n\n const scrollParent = ref.current && getDataTableScrollParent(ref.current);\n\n if (scrollParent) {\n scrollParent.scrollTop = 0;\n }\n });\n\n return () => subscription.unsubscribe();\n }, [table, ref]);\n};\n"],"mappings":";;;;;;;;;;;;;AAeA,MAAa,+BAIX,OACA,QACG;CACH,sBAAsB;EACpB,IAAI,CAAC,gBAAgB,OAAO,sBAAsB,GAChD;EAGF,MAAM,iBAAiB,MAAM,MAAM;;EAGnC,MAAM,mBAAmB;GACvB,MAAM,EAAE,WAAW,aAAa,eAAe,IAAI;GAEnD,OAAO,GAAG,UAAU,GAAG;EACzB;;EAGA,IAAI,cAAc,WAAW;EAE7B,MAAM,eAAe,eAAe,gBAAgB;GAClD,MAAM,UAAU,WAAW;GAE3B,IAAI,YAAY,aACd;GAGF,cAAc;GAEd,MAAM,eAAe,IAAI,WAAW,yBAAyB,IAAI,OAAO;GAExE,IAAI,cACF,aAAa,YAAY;EAE7B,CAAC;EAED,aAAa,aAAa,YAAY;CACxC,GAAG,CAAC,OAAO,GAAG,CAAC;AACjB"}
@@ -0,0 +1,48 @@
1
+ import { HeaderWith } from "../../../types/table-with.js";
2
+ import "../../../types/index.js";
3
+ import { RowData, TableFeatures } from "@tanstack/react-table";
4
+ import { useRender } from "@base-ui/react";
5
+ import React from "react";
6
+ import { MergeOverride } from "@lucasbernardosn/utils";
7
+ //#region src/components/data-table/resize/data-table-resize-handle.d.ts
8
+ export type DataTableResizeHandleProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
9
+ /** O header da coluna. Exige `columnSizingFeature` e `columnResizingFeature`. */
10
+ header: HeaderWith<TFeatures, TData, 'columnResizingFeature' | 'columnSizingFeature'>;
11
+ }>;
12
+ /**
13
+ * Área de agarre para redimensionar uma coluna, sobre a linha vertical do fim do header (que
14
+ * precisa ser `relative`). Arrastar redimensiona; duplo clique devolve a coluna ao tamanho
15
+ * definido.
16
+ *
17
+ * A caixa tem largura zero, e a área de agarre é um `::before` transparente de 12px centrado na
18
+ * linha, metade sobre a coluna vizinha; na última coluna e antes de uma fixada do fim, toda do
19
+ * lado de dentro. No repouso não aparece; no hover e no arrasto, o handle vira a âncora da
20
+ * linha-guia, que a `DataTable.ScrollArea` desenha na altura toda da tabela.
21
+ * Quando a borda chega à beira de uma fixada do fim ou ao fim da área visível, a rolagem
22
+ * acompanha o arrasto. Numa coluna que não redimensiona (`enableResizing: false`), não
23
+ * renderiza.
24
+ *
25
+ * Durante o arrasto, o `InteractionShield` do `ui` cobre a página: nada, dentro ou fora da
26
+ * tabela, reage ao ponteiro, o cursor de resize vale em toda parte, e o texto não é selecionado.
27
+ * A roda do mouse, por cima dele, não rola a tabela.
28
+ *
29
+ * Exige `columnResizeMode: 'onChange'` na tabela. Com o padrão do TanStack, `'onEnd'`, o tamanho
30
+ * só muda ao soltar: no arrasto nada anda na tela (nem a coluna, nem o handle, nem a guia), e a
31
+ * coluna pula no fim.
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * const table = useTable({ features, columns, data, columnResizeMode: 'onChange' });
36
+ *
37
+ * <DataTable.HeaderCell header={header}>
38
+ * <DataTable.HeaderContent header={header} />
39
+ * <DataTable.ResizeHandle header={header} />
40
+ * </DataTable.HeaderCell>
41
+ * ```
42
+ */
43
+ export declare const DataTableResizeHandle: {
44
+ <TFeatures extends TableFeatures, TData extends RowData>(props: DataTableResizeHandleProps<TFeatures, TData>): React.JSX.Element | null;
45
+ displayName: string;
46
+ };
47
+ //#endregion
48
+ //# sourceMappingURL=data-table-resize-handle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-resize-handle.d.ts","names":[],"sources":["../../../../src/components/data-table/resize/data-table-resize-handle.tsx"],"mappings":";;;;;;;YAWY,2BACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,QAAQ,WACN,WACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAqCO;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,2BAA2B,WAAW,SAAM,MAAA,IAAA"}
@@ -0,0 +1,115 @@
1
+ import { useDataTableResizeScroll } from "./use-data-table-resize-scroll.js";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { mergeProps, useRender } from "@base-ui/react";
4
+ import { useSelector } from "@tanstack/react-store";
5
+ import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
6
+ import { useRef } from "react";
7
+ import { InteractionShield } from "@lucasbernardosn/react-ui/utilities/interaction-shield";
8
+ //#region src/components/data-table/resize/data-table-resize-handle.tsx
9
+ /**
10
+ * Área de agarre para redimensionar uma coluna, sobre a linha vertical do fim do header (que
11
+ * precisa ser `relative`). Arrastar redimensiona; duplo clique devolve a coluna ao tamanho
12
+ * definido.
13
+ *
14
+ * A caixa tem largura zero, e a área de agarre é um `::before` transparente de 12px centrado na
15
+ * linha, metade sobre a coluna vizinha; na última coluna e antes de uma fixada do fim, toda do
16
+ * lado de dentro. No repouso não aparece; no hover e no arrasto, o handle vira a âncora da
17
+ * linha-guia, que a `DataTable.ScrollArea` desenha na altura toda da tabela.
18
+ * Quando a borda chega à beira de uma fixada do fim ou ao fim da área visível, a rolagem
19
+ * acompanha o arrasto. Numa coluna que não redimensiona (`enableResizing: false`), não
20
+ * renderiza.
21
+ *
22
+ * Durante o arrasto, o `InteractionShield` do `ui` cobre a página: nada, dentro ou fora da
23
+ * tabela, reage ao ponteiro, o cursor de resize vale em toda parte, e o texto não é selecionado.
24
+ * A roda do mouse, por cima dele, não rola a tabela.
25
+ *
26
+ * Exige `columnResizeMode: 'onChange'` na tabela. Com o padrão do TanStack, `'onEnd'`, o tamanho
27
+ * só muda ao soltar: no arrasto nada anda na tela (nem a coluna, nem o handle, nem a guia), e a
28
+ * coluna pula no fim.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * const table = useTable({ features, columns, data, columnResizeMode: 'onChange' });
33
+ *
34
+ * <DataTable.HeaderCell header={header}>
35
+ * <DataTable.HeaderContent header={header} />
36
+ * <DataTable.ResizeHandle header={header} />
37
+ * </DataTable.HeaderCell>
38
+ * ```
39
+ */
40
+ const DataTableResizeHandle = (props) => {
41
+ const { header, render, className, ref, ...rest } = props;
42
+ const handleRef = useRef(null);
43
+ /**
44
+ * O atom do resize muda a cada tick do arrasto, mas o booleano só no começo e no fim: o handle
45
+ * re-renderiza duas vezes por arrasto, e só o da coluna arrastada.
46
+ */
47
+ const isResizing = useSelector(header.column.table.atoms.columnResizing, () => header.column.getIsResizing());
48
+ useDataTableResizeScroll(header.column.table, isResizing, handleRef);
49
+ const onResizeStart = header.getResizeHandler();
50
+ /**
51
+ * O duplo clique pelo `detail` do `mousedown`, que conta os cliques, e não pelo `dblclick`: o
52
+ * arrasto começa no primeiro `mousedown`, o shield cobre o handle, e o `mouseup` cai nele. O
53
+ * navegador então não manda o `click` nem o `dblclick` ao handle.
54
+ */
55
+ const handleMouseDown = (event) => {
56
+ if (event.detail === 2) {
57
+ header.column.resetSize();
58
+ return;
59
+ }
60
+ onResizeStart(event);
61
+ };
62
+ const baseProps = {
63
+ "data-component": "DataTable.ResizeHandle",
64
+ "data-resizing": isResizing ? "" : void 0,
65
+ "aria-hidden": true,
66
+ onMouseDown: handleMouseDown,
67
+ onTouchStart: onResizeStart,
68
+ className: mergeTwClassNames([
69
+ "absolute",
70
+ "top-0",
71
+ "right-0",
72
+ "in-[[role=columnheader]:last-child]:right-px",
73
+ "z-10",
74
+ "h-full",
75
+ "cursor-col-resize",
76
+ "touch-none",
77
+ "select-none",
78
+ "before:absolute",
79
+ "before:top-0",
80
+ "before:right-0",
81
+ "before:h-full",
82
+ "before:w-3",
83
+ "before:translate-x-1.5",
84
+ "before:content-[\"\"]",
85
+ "in-[[role=columnheader]:last-child]:before:translate-x-0",
86
+ "in-[[role=columnheader]:has(+[data-pinned=end])]:before:translate-x-0",
87
+ "after:absolute",
88
+ "after:inset-y-0",
89
+ "after:left-0",
90
+ "after:w-0.5",
91
+ "after:-translate-x-1/2",
92
+ "after:content-[\"\"]",
93
+ "hover:after:bg-gray-9",
94
+ "data-resizing:after:bg-black",
95
+ "dark:data-resizing:after:bg-white",
96
+ "hover:[anchor-name:--data-table-resize-handle]",
97
+ "data-resizing:[anchor-name:--data-table-resize-handle]"
98
+ ], className)
99
+ };
100
+ const element = useRender({
101
+ render,
102
+ defaultTagName: "div",
103
+ ref: [handleRef, ref ?? null],
104
+ props: mergeProps(baseProps, rest)
105
+ });
106
+ return header.column.getCanResize() ? /* @__PURE__ */ jsxs(Fragment, { children: [element, /* @__PURE__ */ jsx(InteractionShield, {
107
+ active: isResizing,
108
+ cursor: "col-resize"
109
+ })] }) : null;
110
+ };
111
+ DataTableResizeHandle.displayName = "DataTable.ResizeHandle";
112
+ //#endregion
113
+ export { DataTableResizeHandle };
114
+
115
+ //# sourceMappingURL=data-table-resize-handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-resize-handle.js","names":[],"sources":["../../../../src/components/data-table/resize/data-table-resize-handle.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { InteractionShield } from '@lucasbernardosn/react-ui/utilities/interaction-shield';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport type { HeaderWith } from '../../../types';\nimport { useDataTableResizeScroll } from './use-data-table-resize-scroll';\n\nexport type DataTableResizeHandleProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** O header da coluna. Exige `columnSizingFeature` e `columnResizingFeature`. */\n header: HeaderWith<\n TFeatures,\n TData,\n 'columnResizingFeature' | 'columnSizingFeature'\n >;\n }\n>;\n\n/**\n * Área de agarre para redimensionar uma coluna, sobre a linha vertical do fim do header (que\n * precisa ser `relative`). Arrastar redimensiona; duplo clique devolve a coluna ao tamanho\n * definido.\n *\n * A caixa tem largura zero, e a área de agarre é um `::before` transparente de 12px centrado na\n * linha, metade sobre a coluna vizinha; na última coluna e antes de uma fixada do fim, toda do\n * lado de dentro. No repouso não aparece; no hover e no arrasto, o handle vira a âncora da\n * linha-guia, que a `DataTable.ScrollArea` desenha na altura toda da tabela.\n * Quando a borda chega à beira de uma fixada do fim ou ao fim da área visível, a rolagem\n * acompanha o arrasto. Numa coluna que não redimensiona (`enableResizing: false`), não\n * renderiza.\n *\n * Durante o arrasto, o `InteractionShield` do `ui` cobre a página: nada, dentro ou fora da\n * tabela, reage ao ponteiro, o cursor de resize vale em toda parte, e o texto não é selecionado.\n * A roda do mouse, por cima dele, não rola a tabela.\n *\n * Exige `columnResizeMode: 'onChange'` na tabela. Com o padrão do TanStack, `'onEnd'`, o tamanho\n * só muda ao soltar: no arrasto nada anda na tela (nem a coluna, nem o handle, nem a guia), e a\n * coluna pula no fim.\n *\n * @example\n * ```tsx\n * const table = useTable({ features, columns, data, columnResizeMode: 'onChange' });\n *\n * <DataTable.HeaderCell header={header}>\n * <DataTable.HeaderContent header={header} />\n * <DataTable.ResizeHandle header={header} />\n * </DataTable.HeaderCell>\n * ```\n */\nexport const DataTableResizeHandle = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableResizeHandleProps<TFeatures, TData>,\n) => {\n const { header, render, className, ref, ...rest } = props;\n\n const handleRef = useRef<HTMLDivElement>(null);\n\n /**\n * O atom do resize muda a cada tick do arrasto, mas o booleano só no começo e no fim: o handle\n * re-renderiza duas vezes por arrasto, e só o da coluna arrastada.\n */\n const isResizing = useSelector(header.column.table.atoms.columnResizing, () =>\n header.column.getIsResizing(),\n );\n\n useDataTableResizeScroll(header.column.table, isResizing, handleRef);\n\n const onResizeStart = header.getResizeHandler();\n\n /**\n * O duplo clique pelo `detail` do `mousedown`, que conta os cliques, e não pelo `dblclick`: o\n * arrasto começa no primeiro `mousedown`, o shield cobre o handle, e o `mouseup` cai nele. O\n * navegador então não manda o `click` nem o `dblclick` ao handle.\n */\n const handleMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n if (event.detail === 2) {\n header.column.resetSize();\n\n return;\n }\n\n onResizeStart(event);\n };\n\n const baseProps = {\n 'data-component': 'DataTable.ResizeHandle',\n 'data-resizing': isResizing ? '' : undefined,\n // Só ponteiro: sem resize por teclado, um `separator` prometeria teclas que não existem.\n 'aria-hidden': true,\n onMouseDown: handleMouseDown,\n onTouchStart: onResizeStart,\n className: mergeTwClassNames(\n [\n // Sobre a linha vertical: o `right-0` é o fim do padding, e a borda de 1px que o\n // `divide-x` põe na célula vem logo depois. A última da linha não tem borda, e o\n // `right-px` põe o handle no mesmo ponto em relação ao fim dela. Antes de uma fixada do\n // fim, a célula também perde a borda, mas a linha passa a ser a da fixada, logo depois:\n // o `right-0` continua certo. Pela posição no DOM, com os seletores das bordas da\n // `DataTable.HeaderRow`, o handle e a borda não têm como discordar.\n 'absolute',\n 'top-0',\n 'right-0',\n 'in-[[role=columnheader]:last-child]:right-px',\n 'z-10',\n\n 'h-full',\n\n 'cursor-col-resize',\n // Sem isto, o arrasto no toque rola a página em vez de redimensionar.\n 'touch-none',\n 'select-none',\n\n // Área de agarre centrada na linha. Conteúdo recortado não recebe clique, então nada\n // entre o handle e o header pode ter `overflow: hidden`.\n 'before:absolute',\n 'before:top-0',\n 'before:right-0',\n 'before:h-full',\n 'before:w-3',\n 'before:translate-x-1.5',\n 'before:content-[\"\"]',\n\n // Onde a metade de fora não serve, os 12px ficam todos do lado de dentro. Na última da\n // linha, ela passaria do fim da tabela e acenderia a barra de rolagem horizontal sem\n // haver o que rolar; antes de uma fixada do fim, ficaria por baixo dela, sem pegar o\n // clique.\n 'in-[[role=columnheader]:last-child]:before:translate-x-0',\n 'in-[[role=columnheader]:has(+[data-pinned=end])]:before:translate-x-0',\n\n // A linha de 2px no cabeçalho, sobre a borda e 1px antes dela, no hover e no arrasto. Onde\n // há anchor positioning, a linha-guia cobre esta no mesmo lugar e segue pelo corpo; sem\n // ele, fica só esta.\n 'after:absolute',\n 'after:inset-y-0',\n 'after:left-0',\n 'after:w-0.5',\n 'after:-translate-x-1/2',\n 'after:content-[\"\"]',\n 'hover:after:bg-gray-9',\n 'data-resizing:after:bg-black',\n 'dark:data-resizing:after:bg-white',\n\n // A âncora da linha-guia (ver `DataTable.ScrollArea`), no hover e no arrasto. Um nome só\n // basta: no arrasto, o shield cobre os outros handles, e nenhum fica em hover junto com\n // o arrastado. Com o nome repetido, a guia iria para o último.\n 'hover:[anchor-name:--data-table-resize-handle]',\n 'data-resizing:[anchor-name:--data-table-resize-handle]',\n ],\n className,\n ),\n };\n\n const element = useRender({\n render,\n defaultTagName: 'div',\n ref: [handleRef, ref ?? null],\n props: mergeProps(baseProps, rest),\n });\n\n return header.column.getCanResize() ? (\n <>\n {element}\n <InteractionShield\n active={isResizing}\n cursor=\"col-resize\"\n />\n </>\n ) : null;\n};\n\nDataTableResizeHandle.displayName = 'DataTable.ResizeHandle';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDA,MAAa,yBAIX,UACG;CACH,MAAM,EAAE,QAAQ,QAAQ,WAAW,KAAK,GAAG,SAAS;CAEpD,MAAM,YAAY,OAAuB,IAAI;;;;;CAM7C,MAAM,aAAa,YAAY,OAAO,OAAO,MAAM,MAAM,sBACvD,OAAO,OAAO,cAAc,CAC9B;CAEA,yBAAyB,OAAO,OAAO,OAAO,YAAY,SAAS;CAEnE,MAAM,gBAAgB,OAAO,iBAAiB;;;;;;CAO9C,MAAM,mBAAmB,UAA4C;EACnE,IAAI,MAAM,WAAW,GAAG;GACtB,OAAO,OAAO,UAAU;GAExB;EACF;EAEA,cAAc,KAAK;CACrB;CAEA,MAAM,YAAY;EAChB,kBAAkB;EAClB,iBAAiB,aAAa,KAAK,KAAA;EAEnC,eAAe;EACf,aAAa;EACb,cAAc;EACd,WAAW,kBACT;GAOE;GACA;GACA;GACA;GACA;GAEA;GAEA;GAEA;GACA;GAIA;GACA;GACA;GACA;GACA;GACA;GACA;GAMA;GACA;GAKA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GAKA;GACA;EACF,GACA,SACF;CACF;CAEA,MAAM,UAAU,UAAU;EACxB;EACA,gBAAgB;EAChB,KAAK,CAAC,WAAW,OAAO,IAAI;EAC5B,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;CAED,OAAO,OAAO,OAAO,aAAa,IAChC,qBAAA,UAAA,EAAA,UAAA,CACG,SACD,oBAAC,mBAAD;EACE,QAAQ;EACR,QAAO;CACR,CAAA,CACD,EAAA,CAAA,IACA;AACN;AAEA,sBAAsB,cAAc"}
@@ -0,0 +1,18 @@
1
+ import { RowData, Table, TableFeatures } from "@tanstack/react-table";
2
+ import React from "react";
3
+ //#region src/components/data-table/resize/use-data-table-resize-scroll.d.ts
4
+ /**
5
+ * No arrasto do resize, a rolagem acompanha a borda da coluna quando ela chega à beira de uma
6
+ * fixada do fim ou ao fim da área visível: a borda para ali, e as colunas de antes andam para a
7
+ * esquerda. Sem isto, a coluna cresceria por baixo da fixada, ou fora da vista, e nada mudaria na
8
+ * tela enquanto o ponteiro anda. Coluna fixada fica de fora: a borda dela não sai da vista.
9
+ *
10
+ * Assina o store só durante o arrasto, fora do React, e mede numa microtarefa: ela roda depois de
11
+ * todas as assinaturas da mesma mudança, inclusive a do `DataTable.Root`, que escreve o template
12
+ * das colunas, e antes da pintura. A medida já tem a largura nova, e a borda não chega a aparecer
13
+ * além da beira. O viewport e as fixadas do fim são lidos no começo do arrasto: o pinning não muda
14
+ * no meio dele.
15
+ */
16
+ export declare const useDataTableResizeScroll: <TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, isResizing: boolean, ref: React.RefObject<HTMLElement | null>) => void;
17
+ //#endregion
18
+ //# sourceMappingURL=use-data-table-resize-scroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-data-table-resize-scroll.d.ts","names":[],"sources":["../../../../src/components/data-table/resize/use-data-table-resize-scroll.ts"],"mappings":";;;;;;;;;;;;;;;qBAiBa,2BACX,kBAAkB,eAClB,cAAc,SAEd,OAAO,MAAM,WAAW,QACxB,qBACA,KAAK,MAAM,UAAU"}
@@ -0,0 +1,55 @@
1
+ import { getDataTableScrollParent } from "../root/get-data-table-scroll-parent.js";
2
+ import { useEffect } from "react";
3
+ //#region src/components/data-table/resize/use-data-table-resize-scroll.ts
4
+ /**
5
+ * No arrasto do resize, a rolagem acompanha a borda da coluna quando ela chega à beira de uma
6
+ * fixada do fim ou ao fim da área visível: a borda para ali, e as colunas de antes andam para a
7
+ * esquerda. Sem isto, a coluna cresceria por baixo da fixada, ou fora da vista, e nada mudaria na
8
+ * tela enquanto o ponteiro anda. Coluna fixada fica de fora: a borda dela não sai da vista.
9
+ *
10
+ * Assina o store só durante o arrasto, fora do React, e mede numa microtarefa: ela roda depois de
11
+ * todas as assinaturas da mesma mudança, inclusive a do `DataTable.Root`, que escreve o template
12
+ * das colunas, e antes da pintura. A medida já tem a largura nova, e a borda não chega a aparecer
13
+ * além da beira. O viewport e as fixadas do fim são lidos no começo do arrasto: o pinning não muda
14
+ * no meio dele.
15
+ */
16
+ const useDataTableResizeScroll = (table, isResizing, ref) => {
17
+ const { store } = table;
18
+ useEffect(() => {
19
+ if (!isResizing) return;
20
+ const handle = ref.current;
21
+ const headerCell = handle?.closest("[role=\"columnheader\"]");
22
+ const viewport = handle ? getDataTableScrollParent(handle) : void 0;
23
+ if (!(headerCell instanceof HTMLElement && viewport) || headerCell.dataset.pinned) return;
24
+ /** As fixadas do fim, na mesma linha do cabeçalho. */
25
+ const endPinnedCells = Array.from(headerCell.parentElement?.querySelectorAll("[data-pinned=\"end\"]") ?? []);
26
+ /** Uma medida por mudança: o store pode avisar mais de uma vez antes da microtarefa. */
27
+ let isScheduled = false;
28
+ /**
29
+ * Rola o quanto a borda passou da área visível do centro: o começo da primeira fixada do fim
30
+ * ou, sem ela, o fim do viewport.
31
+ */
32
+ const scrollToEdge = () => {
33
+ isScheduled = false;
34
+ const viewportRect = viewport.getBoundingClientRect();
35
+ const visibleEnd = Math.min(viewportRect.left + viewport.clientLeft + viewport.clientWidth, ...endPinnedCells.map((cell) => cell.getBoundingClientRect().left));
36
+ const overflow = headerCell.getBoundingClientRect().right - visibleEnd;
37
+ if (overflow > 0) viewport.scrollLeft += overflow;
38
+ };
39
+ const subscription = store.subscribe(() => {
40
+ if (!isScheduled) {
41
+ isScheduled = true;
42
+ queueMicrotask(scrollToEdge);
43
+ }
44
+ });
45
+ return () => subscription.unsubscribe();
46
+ }, [
47
+ isResizing,
48
+ ref,
49
+ store
50
+ ]);
51
+ };
52
+ //#endregion
53
+ export { useDataTableResizeScroll };
54
+
55
+ //# sourceMappingURL=use-data-table-resize-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-data-table-resize-scroll.js","names":[],"sources":["../../../../src/components/data-table/resize/use-data-table-resize-scroll.ts"],"sourcesContent":["import type { RowData, Table, TableFeatures } from '@tanstack/react-table';\nimport type React from 'react';\nimport { useEffect } from 'react';\nimport { getDataTableScrollParent } from '../root/get-data-table-scroll-parent';\n\n/**\n * No arrasto do resize, a rolagem acompanha a borda da coluna quando ela chega à beira de uma\n * fixada do fim ou ao fim da área visível: a borda para ali, e as colunas de antes andam para a\n * esquerda. Sem isto, a coluna cresceria por baixo da fixada, ou fora da vista, e nada mudaria na\n * tela enquanto o ponteiro anda. Coluna fixada fica de fora: a borda dela não sai da vista.\n *\n * Assina o store só durante o arrasto, fora do React, e mede numa microtarefa: ela roda depois de\n * todas as assinaturas da mesma mudança, inclusive a do `DataTable.Root`, que escreve o template\n * das colunas, e antes da pintura. A medida já tem a largura nova, e a borda não chega a aparecer\n * além da beira. O viewport e as fixadas do fim são lidos no começo do arrasto: o pinning não muda\n * no meio dele.\n */\nexport const useDataTableResizeScroll = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: Table<TFeatures, TData>,\n isResizing: boolean,\n ref: React.RefObject<HTMLElement | null>,\n) => {\n const { store } = table;\n\n useEffect(() => {\n if (!isResizing) {\n return;\n }\n\n const handle = ref.current;\n const headerCell = handle?.closest('[role=\"columnheader\"]');\n const viewport = handle ? getDataTableScrollParent(handle) : undefined;\n\n if (\n !(headerCell instanceof HTMLElement && viewport) ||\n headerCell.dataset.pinned\n ) {\n return;\n }\n\n /** As fixadas do fim, na mesma linha do cabeçalho. */\n const endPinnedCells = Array.from(\n headerCell.parentElement?.querySelectorAll('[data-pinned=\"end\"]') ?? [],\n );\n\n /** Uma medida por mudança: o store pode avisar mais de uma vez antes da microtarefa. */\n let isScheduled = false;\n\n /**\n * Rola o quanto a borda passou da área visível do centro: o começo da primeira fixada do fim\n * ou, sem ela, o fim do viewport.\n */\n const scrollToEdge = () => {\n isScheduled = false;\n\n const viewportRect = viewport.getBoundingClientRect();\n const visibleEnd = Math.min(\n viewportRect.left + viewport.clientLeft + viewport.clientWidth,\n ...endPinnedCells.map((cell) => cell.getBoundingClientRect().left),\n );\n const overflow = headerCell.getBoundingClientRect().right - visibleEnd;\n\n if (overflow > 0) {\n viewport.scrollLeft += overflow;\n }\n };\n\n const subscription = store.subscribe(() => {\n if (!isScheduled) {\n isScheduled = true;\n queueMicrotask(scrollToEdge);\n }\n });\n\n return () => subscription.unsubscribe();\n }, [isResizing, ref, store]);\n};\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAa,4BAIX,OACA,YACA,QACG;CACH,MAAM,EAAE,UAAU;CAElB,gBAAgB;EACd,IAAI,CAAC,YACH;EAGF,MAAM,SAAS,IAAI;EACnB,MAAM,aAAa,QAAQ,QAAQ,yBAAuB;EAC1D,MAAM,WAAW,SAAS,yBAAyB,MAAM,IAAI,KAAA;EAE7D,IACE,EAAE,sBAAsB,eAAe,aACvC,WAAW,QAAQ,QAEnB;;EAIF,MAAM,iBAAiB,MAAM,KAC3B,WAAW,eAAe,iBAAiB,uBAAqB,KAAK,CAAC,CACxE;;EAGA,IAAI,cAAc;;;;;EAMlB,MAAM,qBAAqB;GACzB,cAAc;GAEd,MAAM,eAAe,SAAS,sBAAsB;GACpD,MAAM,aAAa,KAAK,IACtB,aAAa,OAAO,SAAS,aAAa,SAAS,aACnD,GAAG,eAAe,KAAK,SAAS,KAAK,sBAAsB,CAAC,CAAC,IAAI,CACnE;GACA,MAAM,WAAW,WAAW,sBAAsB,CAAC,CAAC,QAAQ;GAE5D,IAAI,WAAW,GACb,SAAS,cAAc;EAE3B;EAEA,MAAM,eAAe,MAAM,gBAAgB;GACzC,IAAI,CAAC,aAAa;IAChB,cAAc;IACd,eAAe,YAAY;GAC7B;EACF,CAAC;EAED,aAAa,aAAa,YAAY;CACxC,GAAG;EAAC;EAAY;EAAK;CAAK,CAAC;AAC7B"}
@@ -0,0 +1,10 @@
1
+ //#region src/components/data-table/root/data-table-grid-classes.d.ts
2
+ /**
3
+ * A grade de uma linha, comum à `DataTable.Row`, à `DataTable.HeaderRow` e às linhas-fantasma do
4
+ * `DataTable.Body`: o grid com o template das colunas, a linha vertical entre as células e a
5
+ * horizontal embaixo. Num lugar só, para as três não divergirem; a regra da última linha fica em
6
+ * cada uma.
7
+ */
8
+ export declare const DATA_TABLE_GRID_CLASS_NAMES: string[];
9
+ //#endregion
10
+ //# sourceMappingURL=data-table-grid-classes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-grid-classes.d.ts","names":[],"sources":["../../../../src/components/data-table/root/data-table-grid-classes.ts"],"mappings":";;;;;;;qBAMa"}
@@ -0,0 +1,22 @@
1
+ //#region src/components/data-table/root/data-table-grid-classes.ts
2
+ /**
3
+ * A grade de uma linha, comum à `DataTable.Row`, à `DataTable.HeaderRow` e às linhas-fantasma do
4
+ * `DataTable.Body`: o grid com o template das colunas, a linha vertical entre as células e a
5
+ * horizontal embaixo. Num lugar só, para as três não divergirem; a regra da última linha fica em
6
+ * cada uma.
7
+ */
8
+ const DATA_TABLE_GRID_CLASS_NAMES = [
9
+ "grid",
10
+ "grid-cols-(--data-table-template)",
11
+ "divide-x",
12
+ "divide-gray-6",
13
+ "*:data-[pinned=end]:border-s",
14
+ "*:data-[pinned=end]:border-gray-6",
15
+ "*:has-[+[data-pinned=end]]:border-e-0",
16
+ "border-b",
17
+ "border-gray-6"
18
+ ];
19
+ //#endregion
20
+ export { DATA_TABLE_GRID_CLASS_NAMES };
21
+
22
+ //# sourceMappingURL=data-table-grid-classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-grid-classes.js","names":[],"sources":["../../../../src/components/data-table/root/data-table-grid-classes.ts"],"sourcesContent":["/**\n * A grade de uma linha, comum à `DataTable.Row`, à `DataTable.HeaderRow` e às linhas-fantasma do\n * `DataTable.Body`: o grid com o template das colunas, a linha vertical entre as células e a\n * horizontal embaixo. Num lugar só, para as três não divergirem; a regra da última linha fica em\n * cada uma.\n */\nexport const DATA_TABLE_GRID_CLASS_NAMES: string[] = [\n 'grid',\n 'grid-cols-(--data-table-template)',\n\n // Linha vertical entre as células: o `divide-x` põe borda no fim de cada filho, menos no\n // último, e assim a linha não tem borda na ponta direita. Fica na linha, e não na célula, para\n // a célula não precisar saber se é a última.\n 'divide-x',\n 'divide-gray-6',\n // Na fixada do fim, a linha vertical fica do lado do início, e a célula antes dela perde a do\n // fim: o centro rola por baixo e levaria a borda junto, e as duas somariam 2px quando encostam.\n '*:data-[pinned=end]:border-s',\n '*:data-[pinned=end]:border-gray-6',\n '*:has-[+[data-pinned=end]]:border-e-0',\n\n // Linha horizontal embaixo da linha.\n 'border-b',\n 'border-gray-6',\n];\n"],"mappings":";;;;;;;AAMA,MAAa,8BAAwC;CACnD;CACA;CAKA;CACA;CAGA;CACA;CACA;CAGA;CACA;AACF"}
@@ -0,0 +1,41 @@
1
+ import { TableWith } from "../../../types/table-with.js";
2
+ import "../../../types/index.js";
3
+ import { RowData, TableFeatures } from "@tanstack/react-table";
4
+ import { useRender } from "@base-ui/react";
5
+ import { MergeOverride } from "@lucasbernardosn/utils";
6
+ //#region src/components/data-table/root/data-table-root.d.ts
7
+ export type DataTableRootProps<TFeatures extends TableFeatures, TData extends RowData> = MergeOverride<useRender.ComponentProps<'div'>, {
8
+ /** A tabela do `useTable`. Exige `columnSizingFeature`. */
9
+ table: TableWith<TFeatures, TData, 'columnSizingFeature'>;
10
+ }>;
11
+ /**
12
+ * O elemento do grid (`role="table"`; com `activeRowFeature`, `role="grid"`, que diz ao leitor
13
+ * de tela que as setas são da tabela). Escreve as variáveis das colunas, que toda
14
+ * `DataTable.Row` lê, e tem a largura exata da soma delas.
15
+ *
16
+ * Declara também a altura das linhas e dos headers e o espaçamento das células, que as partes
17
+ * leem. Com `rowDensityFeature`, marca o grid com `data-density`, e esses valores seguem a
18
+ * densidade; para outros valores, redefina as variáveis pela `className`.
19
+ *
20
+ * Com `loadingFeature`, marca `aria-busy` enquanto carrega e, depois de 200ms, `data-loading`: as
21
+ * células trocam o conteúdo por um skeleton, e o `DataTable.ScrollArea` mostra uma barra sob o
22
+ * cabeçalho. Uma resposta mais rápida que isso não mostra nada.
23
+ *
24
+ * Não rola: para rolar, e para o cabeçalho grudar, ponha-o num `DataTable.ScrollArea` ou em
25
+ * outro contêiner com `overflow`.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * <DataTable.ScrollArea>
30
+ * <DataTable.Root table={table} aria-label="Clientes">
31
+ * …
32
+ * </DataTable.Root>
33
+ * </DataTable.ScrollArea>
34
+ * ```
35
+ */
36
+ export declare const DataTableRoot: {
37
+ <TFeatures extends TableFeatures, TData extends RowData>(props: DataTableRootProps<TFeatures, TData>): import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>>;
38
+ displayName: string;
39
+ };
40
+ //#endregion
41
+ //# sourceMappingURL=data-table-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-root.d.ts","names":[],"sources":["../../../../src/components/data-table/root/data-table-root.tsx"],"mappings":";;;;;;YAWY,mBACV,kBAAkB,eAClB,cAAc,WACZ,cACF,UAAU;;EAGR,OAAO,UAAU,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA6BnB;GACX,kBAAkB,eAClB,cAAc,SAAO,OAEd,mBAAmB,WAAW,yBAAM,+CAAA"}
@@ -0,0 +1,72 @@
1
+ import { hasTableFeature } from "../../../utils/has-feature.js";
2
+ import { useDataTableLoading } from "../loading/use-data-table-loading.js";
3
+ import { useDataTableColumnLayout } from "./use-data-table-column-layout.js";
4
+ import { mergeProps, useRender } from "@base-ui/react";
5
+ import { useSelector } from "@tanstack/react-store";
6
+ import { mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
7
+ //#region src/components/data-table/root/data-table-root.tsx
8
+ /**
9
+ * O elemento do grid (`role="table"`; com `activeRowFeature`, `role="grid"`, que diz ao leitor
10
+ * de tela que as setas são da tabela). Escreve as variáveis das colunas, que toda
11
+ * `DataTable.Row` lê, e tem a largura exata da soma delas.
12
+ *
13
+ * Declara também a altura das linhas e dos headers e o espaçamento das células, que as partes
14
+ * leem. Com `rowDensityFeature`, marca o grid com `data-density`, e esses valores seguem a
15
+ * densidade; para outros valores, redefina as variáveis pela `className`.
16
+ *
17
+ * Com `loadingFeature`, marca `aria-busy` enquanto carrega e, depois de 200ms, `data-loading`: as
18
+ * células trocam o conteúdo por um skeleton, e o `DataTable.ScrollArea` mostra uma barra sob o
19
+ * cabeçalho. Uma resposta mais rápida que isso não mostra nada.
20
+ *
21
+ * Não rola: para rolar, e para o cabeçalho grudar, ponha-o num `DataTable.ScrollArea` ou em
22
+ * outro contêiner com `overflow`.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * <DataTable.ScrollArea>
27
+ * <DataTable.Root table={table} aria-label="Clientes">
28
+ * …
29
+ * </DataTable.Root>
30
+ * </DataTable.ScrollArea>
31
+ * ```
32
+ */
33
+ const DataTableRoot = (props) => {
34
+ const { table, render, className, ref, ...rest } = props;
35
+ const rootRef = useDataTableColumnLayout(table);
36
+ /**
37
+ * Re-renderiza só o `Root`, e só quando a densidade muda: as linhas chegam prontas por
38
+ * `children`, e as células mudam de tamanho pelas variáveis, sem render.
39
+ */
40
+ const density = useSelector(table.store, () => hasTableFeature(table, "rowDensityFeature") ? table.atoms.rowDensity.get() : void 0);
41
+ const loading = useDataTableLoading(table);
42
+ const baseProps = {
43
+ "data-component": "DataTable.Root",
44
+ "data-density": density,
45
+ "data-loading": loading.isLoadingVisible ? "" : void 0,
46
+ "aria-busy": loading.isLoading || void 0,
47
+ role: hasTableFeature(table, "activeRowFeature") ? "grid" : "table",
48
+ className: mergeTwClassNames([
49
+ "w-(--data-table-width)",
50
+ "data-[density=compact]:[--data-table-header-height:--spacing(7)]",
51
+ "data-[density=compact]:[--data-table-row-height:--spacing(8)]",
52
+ "data-[density=compact]:[--data-table-cell-padding:--spacing(1.5)]",
53
+ "[--data-table-header-height:--spacing(8)]",
54
+ "[--data-table-row-height:--spacing(10)]",
55
+ "[--data-table-cell-padding:--spacing(2)]",
56
+ "data-[density=comfortable]:[--data-table-header-height:--spacing(10)]",
57
+ "data-[density=comfortable]:[--data-table-row-height:--spacing(12)]",
58
+ "data-[density=comfortable]:[--data-table-cell-padding:--spacing(3)]"
59
+ ], className)
60
+ };
61
+ return useRender({
62
+ render,
63
+ ref: [rootRef, ref ?? null],
64
+ defaultTagName: "div",
65
+ props: mergeProps(baseProps, rest)
66
+ });
67
+ };
68
+ DataTableRoot.displayName = "DataTable.Root";
69
+ //#endregion
70
+ export { DataTableRoot };
71
+
72
+ //# sourceMappingURL=data-table-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-root.js","names":[],"sources":["../../../../src/components/data-table/root/data-table-root.tsx"],"sourcesContent":["import { mergeProps, useRender } from '@base-ui/react';\nimport { mergeTwClassNames } from '@lucasbernardosn/react-ui/utils';\nimport type { MergeOverride } from '@lucasbernardosn/utils';\nimport { useSelector } from '@tanstack/react-store';\nimport type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type { RowDensity } from '../../../features';\nimport type { TableWith } from '../../../types';\nimport { hasTableFeature } from '../../../utils';\nimport { useDataTableLoading } from '../loading/use-data-table-loading';\nimport { useDataTableColumnLayout } from './use-data-table-column-layout';\n\nexport type DataTableRootProps<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = MergeOverride<\n useRender.ComponentProps<'div'>,\n {\n /** A tabela do `useTable`. Exige `columnSizingFeature`. */\n table: TableWith<TFeatures, TData, 'columnSizingFeature'>;\n }\n>;\n\n/**\n * O elemento do grid (`role=\"table\"`; com `activeRowFeature`, `role=\"grid\"`, que diz ao leitor\n * de tela que as setas são da tabela). Escreve as variáveis das colunas, que toda\n * `DataTable.Row` lê, e tem a largura exata da soma delas.\n *\n * Declara também a altura das linhas e dos headers e o espaçamento das células, que as partes\n * leem. Com `rowDensityFeature`, marca o grid com `data-density`, e esses valores seguem a\n * densidade; para outros valores, redefina as variáveis pela `className`.\n *\n * Com `loadingFeature`, marca `aria-busy` enquanto carrega e, depois de 200ms, `data-loading`: as\n * células trocam o conteúdo por um skeleton, e o `DataTable.ScrollArea` mostra uma barra sob o\n * cabeçalho. Uma resposta mais rápida que isso não mostra nada.\n *\n * Não rola: para rolar, e para o cabeçalho grudar, ponha-o num `DataTable.ScrollArea` ou em\n * outro contêiner com `overflow`.\n *\n * @example\n * ```tsx\n * <DataTable.ScrollArea>\n * <DataTable.Root table={table} aria-label=\"Clientes\">\n * …\n * </DataTable.Root>\n * </DataTable.ScrollArea>\n * ```\n */\nexport const DataTableRoot = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n props: DataTableRootProps<TFeatures, TData>,\n) => {\n const { table, render, className, ref, ...rest } = props;\n\n const rootRef = useDataTableColumnLayout(table);\n\n /**\n * Re-renderiza só o `Root`, e só quando a densidade muda: as linhas chegam prontas por\n * `children`, e as células mudam de tamanho pelas variáveis, sem render.\n */\n const density = useSelector(table.store, (): RowDensity | undefined =>\n hasTableFeature(table, 'rowDensityFeature')\n ? table.atoms.rowDensity.get()\n : undefined,\n );\n\n const loading = useDataTableLoading(table);\n\n const baseProps = {\n 'data-component': 'DataTable.Root',\n 'data-density': density,\n 'data-loading': loading.isLoadingVisible ? '' : undefined,\n // Avisa o leitor de tela que o conteúdo está mudando, e que deve esperar para ler.\n 'aria-busy': loading.isLoading || undefined,\n role: hasTableFeature(table, 'activeRowFeature') ? 'grid' : 'table',\n className: mergeTwClassNames(\n [\n // Largura definida, e não `max-content`: com zoom, o px fracionário faria o conteúdo e\n // as larguras das partes se medirem em ciclo, e o cabeçalho e o corpo parariam em\n // larguras diferentes. Antes do primeiro sync, a variável não existe e vale `auto`.\n 'w-(--data-table-width)',\n\n 'data-[density=compact]:[--data-table-header-height:--spacing(7)]',\n 'data-[density=compact]:[--data-table-row-height:--spacing(8)]',\n 'data-[density=compact]:[--data-table-cell-padding:--spacing(1.5)]',\n\n // Densidade: a padrão vale também sem `rowDensityFeature`.\n '[--data-table-header-height:--spacing(8)]',\n '[--data-table-row-height:--spacing(10)]',\n '[--data-table-cell-padding:--spacing(2)]',\n\n 'data-[density=comfortable]:[--data-table-header-height:--spacing(10)]',\n 'data-[density=comfortable]:[--data-table-row-height:--spacing(12)]',\n 'data-[density=comfortable]:[--data-table-cell-padding:--spacing(3)]',\n ],\n className,\n ),\n };\n\n return useRender({\n render,\n ref: [rootRef, ref ?? null],\n defaultTagName: 'div',\n props: mergeProps(baseProps, rest),\n });\n};\n\nDataTableRoot.displayName = 'DataTable.Root';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAa,iBAIX,UACG;CACH,MAAM,EAAE,OAAO,QAAQ,WAAW,KAAK,GAAG,SAAS;CAEnD,MAAM,UAAU,yBAAyB,KAAK;;;;;CAM9C,MAAM,UAAU,YAAY,MAAM,aAChC,gBAAgB,OAAO,mBAAmB,IACtC,MAAM,MAAM,WAAW,IAAI,IAC3B,KAAA,CACN;CAEA,MAAM,UAAU,oBAAoB,KAAK;CAEzC,MAAM,YAAY;EAChB,kBAAkB;EAClB,gBAAgB;EAChB,gBAAgB,QAAQ,mBAAmB,KAAK,KAAA;EAEhD,aAAa,QAAQ,aAAa,KAAA;EAClC,MAAM,gBAAgB,OAAO,kBAAkB,IAAI,SAAS;EAC5D,WAAW,kBACT;GAIE;GAEA;GACA;GACA;GAGA;GACA;GACA;GAEA;GACA;GACA;EACF,GACA,SACF;CACF;CAEA,OAAO,UAAU;EACf;EACA,KAAK,CAAC,SAAS,OAAO,IAAI;EAC1B,gBAAgB;EAChB,OAAO,WAAW,WAAW,IAAI;CACnC,CAAC;AACH;AAEA,cAAc,cAAc"}
@@ -0,0 +1,21 @@
1
+ import { ScrollArea } from "@lucasbernardosn/react-ui/layout/scroll-area";
2
+ //#region src/components/data-table/root/data-table-scroll-area.d.ts
3
+ export type DataTableScrollAreaProps = ScrollArea.RootProps;
4
+ /**
5
+ * A área de rolagem da tabela, montada com o `ScrollArea` da lib: `Root`, uma moldura com a
6
+ * borda, `Viewport`, `Content` e as barras. Os filhos vão no `Content`, e as props no `Root`.
7
+ *
8
+ * O viewport é o ancestral que rola, e é nele que o cabeçalho sticky se ancora. Na largura,
9
+ * abraça o grid e para no pai. Na altura, tem a das linhas: dentro de um pai com altura
10
+ * limitada, encolhe e as linhas rolam por dentro; sem limite, cresce e só rola na horizontal.
11
+ *
12
+ * As barras ficam numa faixa fora da moldura, só no eixo que transborda: não passam por cima das
13
+ * linhas, da seleção nem das colunas fixadas. A vertical começa abaixo do `DataTable.Header`,
14
+ * cuja altura é medida aqui.
15
+ */
16
+ export declare const DataTableScrollArea: {
17
+ (props: DataTableScrollAreaProps): import("react").JSX.Element;
18
+ displayName: string;
19
+ };
20
+ //#endregion
21
+ //# sourceMappingURL=data-table-scroll-area.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-scroll-area.d.ts","names":[],"sources":["../../../../src/components/data-table/root/data-table-scroll-area.tsx"],"mappings":";;YASY,2BAA2B,WAAW;;;;;;;;;;;;;qBAcrC;GAA8B,OAAA,2CAAwB,IAAA"}