@lucasbernardosn/react-table 0.0.0-stage → 0.2.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 (271) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +268 -2
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/components/column-menu/column-menu-check.d.ts +8 -0
  5. package/dist/components/column-menu/column-menu-check.d.ts.map +1 -0
  6. package/dist/components/column-menu/column-menu-check.js +17 -0
  7. package/dist/components/column-menu/column-menu-check.js.map +1 -0
  8. package/dist/components/column-menu/column-menu-hide-item.d.ts +23 -0
  9. package/dist/components/column-menu/column-menu-hide-item.d.ts.map +1 -0
  10. package/dist/components/column-menu/column-menu-hide-item.js +27 -0
  11. package/dist/components/column-menu/column-menu-hide-item.js.map +1 -0
  12. package/dist/components/column-menu/column-menu-labels.d.ts +21 -0
  13. package/dist/components/column-menu/column-menu-labels.d.ts.map +1 -0
  14. package/dist/components/column-menu/column-menu-labels.js +14 -0
  15. package/dist/components/column-menu/column-menu-labels.js.map +1 -0
  16. package/dist/components/column-menu/column-menu-pin-items.d.ts +25 -0
  17. package/dist/components/column-menu/column-menu-pin-items.d.ts.map +1 -0
  18. package/dist/components/column-menu/column-menu-pin-items.js +64 -0
  19. package/dist/components/column-menu/column-menu-pin-items.js.map +1 -0
  20. package/dist/components/column-menu/column-menu-popup.d.ts +40 -0
  21. package/dist/components/column-menu/column-menu-popup.d.ts.map +1 -0
  22. package/dist/components/column-menu/column-menu-popup.js +67 -0
  23. package/dist/components/column-menu/column-menu-popup.js.map +1 -0
  24. package/dist/components/column-menu/column-menu-root.d.ts +34 -0
  25. package/dist/components/column-menu/column-menu-root.d.ts.map +1 -0
  26. package/dist/components/column-menu/column-menu-root.js +36 -0
  27. package/dist/components/column-menu/column-menu-root.js.map +1 -0
  28. package/dist/components/column-menu/column-menu-sort-items.d.ts +30 -0
  29. package/dist/components/column-menu/column-menu-sort-items.d.ts.map +1 -0
  30. package/dist/components/column-menu/column-menu-sort-items.js +62 -0
  31. package/dist/components/column-menu/column-menu-sort-items.js.map +1 -0
  32. package/dist/components/column-menu/column-menu-trigger.d.ts +23 -0
  33. package/dist/components/column-menu/column-menu-trigger.d.ts.map +1 -0
  34. package/dist/components/column-menu/column-menu-trigger.js +38 -0
  35. package/dist/components/column-menu/column-menu-trigger.js.map +1 -0
  36. package/dist/components/column-menu/index.d.ts +2 -0
  37. package/dist/components/column-menu/index.js +2 -0
  38. package/dist/components/column-menu/index.parts.d.ts +13 -0
  39. package/dist/components/column-menu/index.parts.d.ts.map +1 -0
  40. package/dist/components/column-menu/index.parts.js +20 -0
  41. package/dist/components/column-menu/index.parts.js.map +1 -0
  42. package/dist/components/columns-panel/columns-panel-item.d.ts +34 -0
  43. package/dist/components/columns-panel/columns-panel-item.d.ts.map +1 -0
  44. package/dist/components/columns-panel/columns-panel-item.js +109 -0
  45. package/dist/components/columns-panel/columns-panel-item.js.map +1 -0
  46. package/dist/components/columns-panel/columns-panel-root.d.ts +51 -0
  47. package/dist/components/columns-panel/columns-panel-root.d.ts.map +1 -0
  48. package/dist/components/columns-panel/columns-panel-root.js +134 -0
  49. package/dist/components/columns-panel/columns-panel-root.js.map +1 -0
  50. package/dist/components/columns-panel/get-columns-panel-column-order.d.ts +16 -0
  51. package/dist/components/columns-panel/get-columns-panel-column-order.d.ts.map +1 -0
  52. package/dist/components/columns-panel/get-columns-panel-column-order.js +24 -0
  53. package/dist/components/columns-panel/get-columns-panel-column-order.js.map +1 -0
  54. package/dist/components/columns-panel/index.d.ts +2 -0
  55. package/dist/components/columns-panel/index.js +2 -0
  56. package/dist/components/columns-panel/index.parts.d.ts +8 -0
  57. package/dist/components/columns-panel/index.parts.d.ts.map +1 -0
  58. package/dist/components/columns-panel/index.parts.js +12 -0
  59. package/dist/components/columns-panel/index.parts.js.map +1 -0
  60. package/dist/components/data-table/body/data-table-body.d.ts +58 -0
  61. package/dist/components/data-table/body/data-table-body.d.ts.map +1 -0
  62. package/dist/components/data-table/body/data-table-body.js +99 -0
  63. package/dist/components/data-table/body/data-table-body.js.map +1 -0
  64. package/dist/components/data-table/body/data-table-cell.d.ts +26 -0
  65. package/dist/components/data-table/body/data-table-cell.d.ts.map +1 -0
  66. package/dist/components/data-table/body/data-table-cell.js +80 -0
  67. package/dist/components/data-table/body/data-table-cell.js.map +1 -0
  68. package/dist/components/data-table/body/data-table-empty.d.ts +38 -0
  69. package/dist/components/data-table/body/data-table-empty.d.ts.map +1 -0
  70. package/dist/components/data-table/body/data-table-empty.js +71 -0
  71. package/dist/components/data-table/body/data-table-empty.js.map +1 -0
  72. package/dist/components/data-table/body/data-table-row-focus.d.ts +32 -0
  73. package/dist/components/data-table/body/data-table-row-focus.d.ts.map +1 -0
  74. package/dist/components/data-table/body/data-table-row-focus.js +58 -0
  75. package/dist/components/data-table/body/data-table-row-focus.js.map +1 -0
  76. package/dist/components/data-table/body/data-table-row.d.ts +67 -0
  77. package/dist/components/data-table/body/data-table-row.d.ts.map +1 -0
  78. package/dist/components/data-table/body/data-table-row.js +154 -0
  79. package/dist/components/data-table/body/data-table-row.js.map +1 -0
  80. package/dist/components/data-table/body/use-data-table-row-focus-recovery.d.ts +19 -0
  81. package/dist/components/data-table/body/use-data-table-row-focus-recovery.d.ts.map +1 -0
  82. package/dist/components/data-table/body/use-data-table-row-focus-recovery.js +64 -0
  83. package/dist/components/data-table/body/use-data-table-row-focus-recovery.js.map +1 -0
  84. package/dist/components/data-table/header/data-table-header-button.d.ts +25 -0
  85. package/dist/components/data-table/header/data-table-header-button.d.ts.map +1 -0
  86. package/dist/components/data-table/header/data-table-header-button.js +57 -0
  87. package/dist/components/data-table/header/data-table-header-button.js.map +1 -0
  88. package/dist/components/data-table/header/data-table-header-cell.d.ts +34 -0
  89. package/dist/components/data-table/header/data-table-header-cell.d.ts.map +1 -0
  90. package/dist/components/data-table/header/data-table-header-cell.js +97 -0
  91. package/dist/components/data-table/header/data-table-header-cell.js.map +1 -0
  92. package/dist/components/data-table/header/data-table-header-content.d.ts +21 -0
  93. package/dist/components/data-table/header/data-table-header-content.d.ts.map +1 -0
  94. package/dist/components/data-table/header/data-table-header-content.js +37 -0
  95. package/dist/components/data-table/header/data-table-header-content.js.map +1 -0
  96. package/dist/components/data-table/header/data-table-header-row.d.ts +15 -0
  97. package/dist/components/data-table/header/data-table-header-row.d.ts.map +1 -0
  98. package/dist/components/data-table/header/data-table-header-row.js +28 -0
  99. package/dist/components/data-table/header/data-table-header-row.js.map +1 -0
  100. package/dist/components/data-table/header/data-table-header.d.ts +46 -0
  101. package/dist/components/data-table/header/data-table-header.d.ts.map +1 -0
  102. package/dist/components/data-table/header/data-table-header.js +80 -0
  103. package/dist/components/data-table/header/data-table-header.js.map +1 -0
  104. package/dist/components/data-table/index.d.ts +2 -0
  105. package/dist/components/data-table/index.js +2 -0
  106. package/dist/components/data-table/index.parts.d.ts +33 -0
  107. package/dist/components/data-table/index.parts.d.ts.map +1 -0
  108. package/dist/components/data-table/index.parts.js +62 -0
  109. package/dist/components/data-table/index.parts.js.map +1 -0
  110. package/dist/components/data-table/loading/get-data-table-loading-without-rows.d.ts +16 -0
  111. package/dist/components/data-table/loading/get-data-table-loading-without-rows.d.ts.map +1 -0
  112. package/dist/components/data-table/loading/get-data-table-loading-without-rows.js +18 -0
  113. package/dist/components/data-table/loading/get-data-table-loading-without-rows.js.map +1 -0
  114. package/dist/components/data-table/loading/use-data-table-loading-inert.d.ts +16 -0
  115. package/dist/components/data-table/loading/use-data-table-loading-inert.d.ts.map +1 -0
  116. package/dist/components/data-table/loading/use-data-table-loading-inert.js +54 -0
  117. package/dist/components/data-table/loading/use-data-table-loading-inert.js.map +1 -0
  118. package/dist/components/data-table/loading/use-data-table-loading.d.ts +13 -0
  119. package/dist/components/data-table/loading/use-data-table-loading.d.ts.map +1 -0
  120. package/dist/components/data-table/loading/use-data-table-loading.js +40 -0
  121. package/dist/components/data-table/loading/use-data-table-loading.js.map +1 -0
  122. package/dist/components/data-table/pagination/data-table-page-button.d.ts +45 -0
  123. package/dist/components/data-table/pagination/data-table-page-button.d.ts.map +1 -0
  124. package/dist/components/data-table/pagination/data-table-page-button.js +67 -0
  125. package/dist/components/data-table/pagination/data-table-page-button.js.map +1 -0
  126. package/dist/components/data-table/pagination/data-table-page-size-select.d.ts +47 -0
  127. package/dist/components/data-table/pagination/data-table-page-size-select.d.ts.map +1 -0
  128. package/dist/components/data-table/pagination/data-table-page-size-select.js +68 -0
  129. package/dist/components/data-table/pagination/data-table-page-size-select.js.map +1 -0
  130. package/dist/components/data-table/pagination/data-table-page-status.d.ts +43 -0
  131. package/dist/components/data-table/pagination/data-table-page-status.d.ts.map +1 -0
  132. package/dist/components/data-table/pagination/data-table-page-status.js +48 -0
  133. package/dist/components/data-table/pagination/data-table-page-status.js.map +1 -0
  134. package/dist/components/data-table/pagination/data-table-pagination.d.ts +38 -0
  135. package/dist/components/data-table/pagination/data-table-pagination.d.ts.map +1 -0
  136. package/dist/components/data-table/pagination/data-table-pagination.js +87 -0
  137. package/dist/components/data-table/pagination/data-table-pagination.js.map +1 -0
  138. package/dist/components/data-table/pagination/data-table-row-range.d.ts +49 -0
  139. package/dist/components/data-table/pagination/data-table-row-range.d.ts.map +1 -0
  140. package/dist/components/data-table/pagination/data-table-row-range.js +63 -0
  141. package/dist/components/data-table/pagination/data-table-row-range.js.map +1 -0
  142. package/dist/components/data-table/pagination/data-table-selected-count.d.ts +37 -0
  143. package/dist/components/data-table/pagination/data-table-selected-count.d.ts.map +1 -0
  144. package/dist/components/data-table/pagination/data-table-selected-count.js +44 -0
  145. package/dist/components/data-table/pagination/data-table-selected-count.js.map +1 -0
  146. package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts +15 -0
  147. package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts.map +1 -0
  148. package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.js +38 -0
  149. package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.js.map +1 -0
  150. package/dist/components/data-table/resize/data-table-resize-handle.d.ts +48 -0
  151. package/dist/components/data-table/resize/data-table-resize-handle.d.ts.map +1 -0
  152. package/dist/components/data-table/resize/data-table-resize-handle.js +116 -0
  153. package/dist/components/data-table/resize/data-table-resize-handle.js.map +1 -0
  154. package/dist/components/data-table/resize/use-data-table-resize-scroll.d.ts +18 -0
  155. package/dist/components/data-table/resize/use-data-table-resize-scroll.d.ts.map +1 -0
  156. package/dist/components/data-table/resize/use-data-table-resize-scroll.js +55 -0
  157. package/dist/components/data-table/resize/use-data-table-resize-scroll.js.map +1 -0
  158. package/dist/components/data-table/root/data-table-grid-class-names.d.ts +10 -0
  159. package/dist/components/data-table/root/data-table-grid-class-names.d.ts.map +1 -0
  160. package/dist/components/data-table/root/data-table-grid-class-names.js +22 -0
  161. package/dist/components/data-table/root/data-table-grid-class-names.js.map +1 -0
  162. package/dist/components/data-table/root/data-table-root.d.ts +41 -0
  163. package/dist/components/data-table/root/data-table-root.d.ts.map +1 -0
  164. package/dist/components/data-table/root/data-table-root.js +72 -0
  165. package/dist/components/data-table/root/data-table-root.js.map +1 -0
  166. package/dist/components/data-table/root/data-table-scroll-area.d.ts +30 -0
  167. package/dist/components/data-table/root/data-table-scroll-area.d.ts.map +1 -0
  168. package/dist/components/data-table/root/data-table-scroll-area.js +137 -0
  169. package/dist/components/data-table/root/data-table-scroll-area.js.map +1 -0
  170. package/dist/components/data-table/root/get-data-table-column-layout.d.ts +45 -0
  171. package/dist/components/data-table/root/get-data-table-column-layout.d.ts.map +1 -0
  172. package/dist/components/data-table/root/get-data-table-column-layout.js +55 -0
  173. package/dist/components/data-table/root/get-data-table-column-layout.js.map +1 -0
  174. package/dist/components/data-table/root/get-data-table-column-pinning.d.ts +46 -0
  175. package/dist/components/data-table/root/get-data-table-column-pinning.d.ts.map +1 -0
  176. package/dist/components/data-table/root/get-data-table-column-pinning.js +46 -0
  177. package/dist/components/data-table/root/get-data-table-column-pinning.js.map +1 -0
  178. package/dist/components/data-table/root/get-data-table-scroll-parent.d.ts +13 -0
  179. package/dist/components/data-table/root/get-data-table-scroll-parent.d.ts.map +1 -0
  180. package/dist/components/data-table/root/get-data-table-scroll-parent.js +20 -0
  181. package/dist/components/data-table/root/get-data-table-scroll-parent.js.map +1 -0
  182. package/dist/components/data-table/root/use-data-table-column-layout.d.ts +25 -0
  183. package/dist/components/data-table/root/use-data-table-column-layout.d.ts.map +1 -0
  184. package/dist/components/data-table/root/use-data-table-column-layout.js +106 -0
  185. package/dist/components/data-table/root/use-data-table-column-layout.js.map +1 -0
  186. package/dist/components/data-table/root/use-data-table-header-offset.d.ts +15 -0
  187. package/dist/components/data-table/root/use-data-table-header-offset.d.ts.map +1 -0
  188. package/dist/components/data-table/root/use-data-table-header-offset.js +35 -0
  189. package/dist/components/data-table/root/use-data-table-header-offset.js.map +1 -0
  190. package/dist/components/data-table/selection/data-table-row-checkbox.d.ts +33 -0
  191. package/dist/components/data-table/selection/data-table-row-checkbox.d.ts.map +1 -0
  192. package/dist/components/data-table/selection/data-table-row-checkbox.js +50 -0
  193. package/dist/components/data-table/selection/data-table-row-checkbox.js.map +1 -0
  194. package/dist/components/data-table/selection/data-table-select-all-checkbox.d.ts +31 -0
  195. package/dist/components/data-table/selection/data-table-select-all-checkbox.d.ts.map +1 -0
  196. package/dist/components/data-table/selection/data-table-select-all-checkbox.js +44 -0
  197. package/dist/components/data-table/selection/data-table-select-all-checkbox.js.map +1 -0
  198. package/dist/components/data-table/selection/data-table-selection-bar.d.ts +51 -0
  199. package/dist/components/data-table/selection/data-table-selection-bar.d.ts.map +1 -0
  200. package/dist/components/data-table/selection/data-table-selection-bar.js +58 -0
  201. package/dist/components/data-table/selection/data-table-selection-bar.js.map +1 -0
  202. package/dist/components/data-table/selection/selection-column-def.d.ts +54 -0
  203. package/dist/components/data-table/selection/selection-column-def.d.ts.map +1 -0
  204. package/dist/components/data-table/selection/selection-column-def.js +55 -0
  205. package/dist/components/data-table/selection/selection-column-def.js.map +1 -0
  206. package/dist/components/data-table/sorting/data-table-sort-indicator.d.ts +26 -0
  207. package/dist/components/data-table/sorting/data-table-sort-indicator.d.ts.map +1 -0
  208. package/dist/components/data-table/sorting/data-table-sort-indicator.js +64 -0
  209. package/dist/components/data-table/sorting/data-table-sort-indicator.js.map +1 -0
  210. package/dist/components/data-table/sorting/data-table-sort-trigger.d.ts +31 -0
  211. package/dist/components/data-table/sorting/data-table-sort-trigger.d.ts.map +1 -0
  212. package/dist/components/data-table/sorting/data-table-sort-trigger.js +46 -0
  213. package/dist/components/data-table/sorting/data-table-sort-trigger.js.map +1 -0
  214. package/dist/components/data-table/toolbar/data-table-density-select.d.ts +39 -0
  215. package/dist/components/data-table/toolbar/data-table-density-select.d.ts.map +1 -0
  216. package/dist/components/data-table/toolbar/data-table-density-select.js +60 -0
  217. package/dist/components/data-table/toolbar/data-table-density-select.js.map +1 -0
  218. package/dist/components/data-table/toolbar/data-table-sort-column-select.d.ts +48 -0
  219. package/dist/components/data-table/toolbar/data-table-sort-column-select.d.ts.map +1 -0
  220. package/dist/components/data-table/toolbar/data-table-sort-column-select.js +79 -0
  221. package/dist/components/data-table/toolbar/data-table-sort-column-select.js.map +1 -0
  222. package/dist/components/data-table/toolbar/data-table-sort-direction-select.d.ts +40 -0
  223. package/dist/components/data-table/toolbar/data-table-sort-direction-select.d.ts.map +1 -0
  224. package/dist/components/data-table/toolbar/data-table-sort-direction-select.js +66 -0
  225. package/dist/components/data-table/toolbar/data-table-sort-direction-select.js.map +1 -0
  226. package/dist/features/active-row/active-row-feature.d.ts +22 -0
  227. package/dist/features/active-row/active-row-feature.d.ts.map +1 -0
  228. package/dist/features/active-row/active-row-feature.js +55 -0
  229. package/dist/features/active-row/active-row-feature.js.map +1 -0
  230. package/dist/features/active-row/active-row-feature.types.d.ts +64 -0
  231. package/dist/features/active-row/active-row-feature.types.d.ts.map +1 -0
  232. package/dist/features/active-row/active-row-feature.types.js +0 -0
  233. package/dist/features/column-alignment/column-alignment-feature.d.ts +23 -0
  234. package/dist/features/column-alignment/column-alignment-feature.d.ts.map +1 -0
  235. package/dist/features/column-alignment/column-alignment-feature.js +34 -0
  236. package/dist/features/column-alignment/column-alignment-feature.js.map +1 -0
  237. package/dist/features/column-alignment/column-alignment-feature.types.d.ts +34 -0
  238. package/dist/features/column-alignment/column-alignment-feature.types.d.ts.map +1 -0
  239. package/dist/features/column-alignment/column-alignment-feature.types.js +0 -0
  240. package/dist/features/index.d.ts +9 -0
  241. package/dist/features/index.js +5 -0
  242. package/dist/features/loading/loading-feature.d.ts +30 -0
  243. package/dist/features/loading/loading-feature.d.ts.map +1 -0
  244. package/dist/features/loading/loading-feature.js +48 -0
  245. package/dist/features/loading/loading-feature.js.map +1 -0
  246. package/dist/features/loading/loading-feature.types.d.ts +50 -0
  247. package/dist/features/loading/loading-feature.types.d.ts.map +1 -0
  248. package/dist/features/loading/loading-feature.types.js +0 -0
  249. package/dist/features/row-density/row-density-feature.d.ts +26 -0
  250. package/dist/features/row-density/row-density-feature.d.ts.map +1 -0
  251. package/dist/features/row-density/row-density-feature.js +44 -0
  252. package/dist/features/row-density/row-density-feature.js.map +1 -0
  253. package/dist/features/row-density/row-density-feature.types.d.ts +53 -0
  254. package/dist/features/row-density/row-density-feature.types.d.ts.map +1 -0
  255. package/dist/features/row-density/row-density-feature.types.js +0 -0
  256. package/dist/types/index.d.ts +2 -0
  257. package/dist/types/index.js +0 -0
  258. package/dist/types/table-with.d.ts +96 -0
  259. package/dist/types/table-with.d.ts.map +1 -0
  260. package/dist/types/table-with.js +0 -0
  261. package/dist/utils/get-default-column-label.d.ts +17 -0
  262. package/dist/utils/get-default-column-label.d.ts.map +1 -0
  263. package/dist/utils/get-default-column-label.js +18 -0
  264. package/dist/utils/get-default-column-label.js.map +1 -0
  265. package/dist/utils/has-feature.d.ts +54 -0
  266. package/dist/utils/has-feature.d.ts.map +1 -0
  267. package/dist/utils/has-feature.js +55 -0
  268. package/dist/utils/has-feature.js.map +1 -0
  269. package/dist/utils/index.d.ts +3 -0
  270. package/dist/utils/index.js +3 -0
  271. package/package.json +80 -3
@@ -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-class-names.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 dataTableGridClassNames: string[];
9
+ //#endregion
10
+ //# sourceMappingURL=data-table-grid-class-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-grid-class-names.d.ts","names":[],"sources":["../../../../src/components/data-table/root/data-table-grid-class-names.ts"],"mappings":";;;;;;;qBAMa"}
@@ -0,0 +1,22 @@
1
+ //#region src/components/data-table/root/data-table-grid-class-names.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 dataTableGridClassNames = [
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 { dataTableGridClassNames };
21
+
22
+ //# sourceMappingURL=data-table-grid-class-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-grid-class-names.js","names":[],"sources":["../../../../src/components/data-table/root/data-table-grid-class-names.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 dataTableGridClassNames = [\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,0BAA0B;CACrC;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)]",
53
+ "[--data-table-header-height:--spacing(8)]",
54
+ "[--data-table-row-height:--spacing(9)]",
55
+ "[--data-table-cell-padding:--spacing(2)]",
56
+ "data-[density=airy]:[--data-table-header-height:--spacing(9)]",
57
+ "data-[density=airy]:[--data-table-row-height:--spacing(10)]",
58
+ "data-[density=airy]:[--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)]',\n\n // Densidade: a padrão vale também sem `rowDensityFeature`.\n '[--data-table-header-height:--spacing(8)]',\n '[--data-table-row-height:--spacing(9)]',\n '[--data-table-cell-padding:--spacing(2)]',\n\n 'data-[density=airy]:[--data-table-header-height:--spacing(9)]',\n 'data-[density=airy]:[--data-table-row-height:--spacing(10)]',\n 'data-[density=airy]:[--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,30 @@
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 definida
10
+ * (`h-*`, ou um pai flex com altura definida), encolhe e as linhas rolam por dentro; sem limite,
11
+ * cresce e só rola na horizontal. Um pai só com `max-height` não basta: o viewport não resolve a
12
+ * altura dele, e as linhas além do limite ficam cortadas, sem rolagem.
13
+ *
14
+ * As barras ficam numa faixa fora da moldura: não passam por cima das linhas, da seleção nem das
15
+ * colunas fixadas. A faixa fica reservada nos dois eixos mesmo sem transbordo, e fica vazia
16
+ * quando não há o que rolar. A vertical começa abaixo do `DataTable.Header`, cuja altura é medida
17
+ * aqui.
18
+ *
19
+ * Monta também a barra de carga (`data-loading` do `DataTable.Root`) e a guia do resize, a linha
20
+ * que o `DataTable.ResizeHandle` mostra na altura toda da moldura (no vazio, só no cabeçalho). Os
21
+ * dois são internos: o
22
+ * `data-component="DataTable.ResizeGuide"` da guia não é uma parte pública, e ninguém precisa
23
+ * lê-lo.
24
+ */
25
+ export declare const DataTableScrollArea: {
26
+ (props: DataTableScrollAreaProps): import("react").JSX.Element;
27
+ displayName: string;
28
+ };
29
+ //#endregion
30
+ //# 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;;;;;;;;;;;;;;;;;;;;;;qBAuBrC;GAA8B,OAAA,2CAAwB,IAAA"}
@@ -0,0 +1,137 @@
1
+ import { useDataTableHeaderOffset } from "./use-data-table-header-offset.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { mergeStateClassNames, mergeTwClassNames } from "@lucasbernardosn/react-ui/utils";
4
+ import { useMemo } from "react";
5
+ import { ScrollArea } from "@lucasbernardosn/react-ui/layout/scroll-area";
6
+ import { mergeRefs } from "@lucasbernardosn/react-utils";
7
+ //#region src/components/data-table/root/data-table-scroll-area.tsx
8
+ /**
9
+ * A área de rolagem da tabela, montada com o `ScrollArea` da lib: `Root`, uma moldura com a
10
+ * borda, `Viewport`, `Content` e as barras. Os filhos vão no `Content`, e as props no `Root`.
11
+ *
12
+ * O viewport é o ancestral que rola, e é nele que o cabeçalho sticky se ancora. Na largura,
13
+ * abraça o grid e para no pai. Na altura, tem a das linhas: dentro de um pai com altura definida
14
+ * (`h-*`, ou um pai flex com altura definida), encolhe e as linhas rolam por dentro; sem limite,
15
+ * cresce e só rola na horizontal. Um pai só com `max-height` não basta: o viewport não resolve a
16
+ * altura dele, e as linhas além do limite ficam cortadas, sem rolagem.
17
+ *
18
+ * As barras ficam numa faixa fora da moldura: não passam por cima das linhas, da seleção nem das
19
+ * colunas fixadas. A faixa fica reservada nos dois eixos mesmo sem transbordo, e fica vazia
20
+ * quando não há o que rolar. A vertical começa abaixo do `DataTable.Header`, cuja altura é medida
21
+ * aqui.
22
+ *
23
+ * Monta também a barra de carga (`data-loading` do `DataTable.Root`) e a guia do resize, a linha
24
+ * que o `DataTable.ResizeHandle` mostra na altura toda da moldura (no vazio, só no cabeçalho). Os
25
+ * dois são internos: o
26
+ * `data-component="DataTable.ResizeGuide"` da guia não é uma parte pública, e ninguém precisa
27
+ * lê-lo.
28
+ */
29
+ const DataTableScrollArea = (props) => {
30
+ const { className, children, ref, ...rest } = props;
31
+ const headerOffsetRef = useDataTableHeaderOffset();
32
+ /**
33
+ * O ref de quem usa e o da medida do cabeçalho, no mesmo elemento. Memoizado: um callback novo
34
+ * a cada render desligaria e religaria o observer.
35
+ */
36
+ const rootRef = useMemo(() => mergeRefs(headerOffsetRef, ref), [headerOffsetRef, ref]);
37
+ return /* @__PURE__ */ jsxs(ScrollArea.Root, {
38
+ ref: rootRef,
39
+ "data-component": "DataTable.ScrollArea",
40
+ className: mergeStateClassNames([
41
+ "w-max",
42
+ "max-w-full",
43
+ "[--scroll-area-scrollbar-size:--spacing(3)]",
44
+ "[--scroll-area-scrollbar-inset:0px]",
45
+ "[--scroll-area-thumb-size:--spacing(1)]",
46
+ "pointer-fine:[--scroll-area-thumb-size:--spacing(1.5)]",
47
+ "pe-(--scroll-area-scrollbar-size)",
48
+ "pb-(--scroll-area-scrollbar-size)"
49
+ ], className),
50
+ ...rest,
51
+ children: [
52
+ /* @__PURE__ */ jsxs("div", {
53
+ className: mergeTwClassNames([
54
+ "h-full",
55
+ "relative",
56
+ "group/data-table-frame",
57
+ "overflow-clip",
58
+ "rounded-md",
59
+ "corner-squircle",
60
+ "border",
61
+ "border-gray-6",
62
+ "focus-ring-inside",
63
+ "[--focus-ring-offset:-1px]",
64
+ "ring-gray-12"
65
+ ]),
66
+ children: [
67
+ /* @__PURE__ */ jsx(ScrollArea.Viewport, {
68
+ focusRing: true,
69
+ className: "overscroll-x-contain scroll-pt-(--data-table-header-offset)",
70
+ children: /* @__PURE__ */ jsx(ScrollArea.Content, { children })
71
+ }),
72
+ /* @__PURE__ */ jsx("div", {
73
+ "aria-hidden": true,
74
+ "data-component": "DataTable.LoadingBar",
75
+ className: mergeTwClassNames([
76
+ "hidden",
77
+ "group-has-[[data-component='DataTable.Root'][data-loading]]/data-table-frame:block",
78
+ "pointer-events-none",
79
+ "absolute",
80
+ "inset-x-0",
81
+ "top-[calc(var(--data-table-header-offset,0px)-1px)]",
82
+ "z-30",
83
+ "h-0.5",
84
+ "overflow-hidden",
85
+ "before:content-['']",
86
+ "before:absolute",
87
+ "before:inset-y-0",
88
+ "before:w-2/5",
89
+ "before:rounded-full",
90
+ "before:bg-gray-11",
91
+ "not-motion-reduced:before:animate-progress-indeterminate",
92
+ "motion-reduced:before:w-full",
93
+ "motion-reduced:before:bg-gray-8"
94
+ ])
95
+ }),
96
+ /* @__PURE__ */ jsx("div", {
97
+ "aria-hidden": true,
98
+ "data-component": "DataTable.ResizeGuide",
99
+ className: mergeTwClassNames([
100
+ "hidden",
101
+ "group-has-[[data-component='DataTable.ResizeHandle']:hover]/data-table-frame:block",
102
+ "group-has-[[data-component='DataTable.ResizeHandle'][data-resizing]]/data-table-frame:block",
103
+ "not-supports-[anchor-name:--a]:hidden!",
104
+ "group-has-[[data-component='DataTable.Empty']]/data-table-frame:hidden!",
105
+ "pointer-events-none",
106
+ "absolute",
107
+ "inset-y-0",
108
+ "z-30",
109
+ "w-0.5",
110
+ "left-[anchor(left)]",
111
+ "-translate-x-1/2",
112
+ "[position-anchor:--data-table-resize-handle]",
113
+ "bg-gray-9",
114
+ "group-has-[[data-component='DataTable.ResizeHandle'][data-resizing]]/data-table-frame:bg-black",
115
+ "dark:group-has-[[data-component='DataTable.ResizeHandle'][data-resizing]]/data-table-frame:bg-white"
116
+ ])
117
+ })
118
+ ]
119
+ }),
120
+ /* @__PURE__ */ jsx(ScrollArea.Scrollbar, {
121
+ orientation: "vertical",
122
+ className: "mt-[calc(var(--data-table-header-offset,0px)+1px)]",
123
+ children: /* @__PURE__ */ jsx(ScrollArea.Thumb, {})
124
+ }),
125
+ /* @__PURE__ */ jsx(ScrollArea.Scrollbar, {
126
+ orientation: "horizontal",
127
+ children: /* @__PURE__ */ jsx(ScrollArea.Thumb, {})
128
+ }),
129
+ /* @__PURE__ */ jsx(ScrollArea.Corner, {})
130
+ ]
131
+ });
132
+ };
133
+ DataTableScrollArea.displayName = "DataTable.ScrollArea";
134
+ //#endregion
135
+ export { DataTableScrollArea };
136
+
137
+ //# sourceMappingURL=data-table-scroll-area.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-scroll-area.js","names":[],"sources":["../../../../src/components/data-table/root/data-table-scroll-area.tsx"],"sourcesContent":["import { ScrollArea } from '@lucasbernardosn/react-ui/layout/scroll-area';\nimport {\n mergeStateClassNames,\n mergeTwClassNames,\n} from '@lucasbernardosn/react-ui/utils';\nimport { mergeRefs } from '@lucasbernardosn/react-utils';\nimport { useMemo } from 'react';\nimport { useDataTableHeaderOffset } from './use-data-table-header-offset';\n\nexport type DataTableScrollAreaProps = ScrollArea.RootProps;\n\n/**\n * A área de rolagem da tabela, montada com o `ScrollArea` da lib: `Root`, uma moldura com a\n * borda, `Viewport`, `Content` e as barras. Os filhos vão no `Content`, e as props no `Root`.\n *\n * O viewport é o ancestral que rola, e é nele que o cabeçalho sticky se ancora. Na largura,\n * abraça o grid e para no pai. Na altura, tem a das linhas: dentro de um pai com altura definida\n * (`h-*`, ou um pai flex com altura definida), encolhe e as linhas rolam por dentro; sem limite,\n * cresce e só rola na horizontal. Um pai só com `max-height` não basta: o viewport não resolve a\n * altura dele, e as linhas além do limite ficam cortadas, sem rolagem.\n *\n * As barras ficam numa faixa fora da moldura: não passam por cima das linhas, da seleção nem das\n * colunas fixadas. A faixa fica reservada nos dois eixos mesmo sem transbordo, e fica vazia\n * quando não há o que rolar. A vertical começa abaixo do `DataTable.Header`, cuja altura é medida\n * aqui.\n *\n * Monta também a barra de carga (`data-loading` do `DataTable.Root`) e a guia do resize, a linha\n * que o `DataTable.ResizeHandle` mostra na altura toda da moldura (no vazio, só no cabeçalho). Os\n * dois são internos: o\n * `data-component=\"DataTable.ResizeGuide\"` da guia não é uma parte pública, e ninguém precisa\n * lê-lo.\n */\nexport const DataTableScrollArea = (props: DataTableScrollAreaProps) => {\n const { className, children, ref, ...rest } = props;\n\n const headerOffsetRef = useDataTableHeaderOffset();\n\n /**\n * O ref de quem usa e o da medida do cabeçalho, no mesmo elemento. Memoizado: um callback novo\n * a cada render desligaria e religaria o observer.\n */\n const rootRef = useMemo(\n () => mergeRefs(headerOffsetRef, ref),\n [headerOffsetRef, ref],\n );\n\n return (\n <ScrollArea.Root\n ref={rootRef}\n data-component=\"DataTable.ScrollArea\"\n className={mergeStateClassNames(\n [\n // Sem `flex-1`: a altura é a das linhas, e o `flex-shrink` do item para no pai. O\n // `overflow-hidden` do `ScrollArea.Root` zera o mínimo, e as linhas passam a rolar.\n\n // Abraça o grid, que mede pelo `min-width: fit-content` do `Content`, mais a faixa das\n // barras, e para no pai.\n 'w-max',\n 'max-w-full',\n\n // A faixa das barras: 12px sem recuo, com o polegar mais fino centralizado nela.\n '[--scroll-area-scrollbar-size:--spacing(3)]',\n '[--scroll-area-scrollbar-inset:0px]',\n '[--scroll-area-thumb-size:--spacing(1)]',\n 'pointer-fine:[--scroll-area-thumb-size:--spacing(1.5)]',\n\n // A faixa reservada nos dois eixos, com ou sem transbordo: só no eixo que transborda, ela\n // entraria quando as linhas ou as colunas passam do espaço, e a moldura saltaria 12px. O\n // Base UI põe as barras nas bordas do `Root`, que com o padding caem fora da moldura.\n 'pe-(--scroll-area-scrollbar-size)',\n 'pb-(--scroll-area-scrollbar-size)',\n ],\n className,\n )}\n {...rest}\n >\n <div\n className={mergeTwClassNames([\n // A altura do `Root` sem a faixa de baixo, para o viewport rolar dentro dela.\n 'h-full',\n\n // Referência da barra do carregamento, que se posiciona aqui e lê o `data-loading` do grid.\n 'relative',\n 'group/data-table-frame',\n\n // A borda cerca só a tabela, e não a faixa das barras. Num elemento que não rola: no\n // viewport, ela subiria junto com as linhas. O `overflow-clip` recorta o cabeçalho\n // sticky contra o raio sem virar contêiner de rolagem, e o sticky segue no viewport.\n 'overflow-clip',\n 'rounded-md',\n 'corner-squircle',\n 'border',\n 'border-gray-6',\n\n // O anel do viewport, que se marca com `data-focus-ring`: o tema o pinta no pai\n // direto, que é esta moldura, e não mais o `Root`.\n 'focus-ring-inside',\n '[--focus-ring-offset:-1px]',\n 'ring-gray-12',\n ])}\n >\n <ScrollArea.Viewport\n focusRing={true}\n // O arrasto horizontal no fim do curso não vira \"voltar página\"; o eixo Y fica livre\n // para o pull to refresh. O `scroll-padding-top` faz a linha que recebe o foco parar\n // abaixo do cabeçalho sticky, e não embaixo dele.\n className=\"overscroll-x-contain scroll-pt-(--data-table-header-offset)\"\n >\n <ScrollArea.Content>{children}</ScrollArea.Content>\n </ScrollArea.Viewport>\n\n <div\n aria-hidden={true}\n data-component=\"DataTable.LoadingBar\"\n className={mergeTwClassNames([\n // A barra do carregamento (`data-loading` no `DataTable.Root`), na borda de baixo do\n // cabeçalho. Na moldura, e não no cabeçalho: não acompanha a rolagem horizontal e\n // cobre sempre a largura visível. O seletor nomeia o `Root`: o `Skeleton` do `ui`\n // também marca `data-loading`, e um dentro de uma célula acenderia a barra.\n 'hidden',\n \"group-has-[[data-component='DataTable.Root'][data-loading]]/data-table-frame:block\",\n 'pointer-events-none',\n 'absolute',\n 'inset-x-0',\n 'top-[calc(var(--data-table-header-offset,0px)-1px)]',\n 'z-30',\n 'h-0.5',\n 'overflow-hidden',\n\n // Sem progresso real, um trecho corre de um lado ao outro, sem pausa. A animação do\n // tema pede o trecho com 2/5 da largura. Com movimento reduzido, a barra fica parada\n // e inteira.\n \"before:content-['']\",\n 'before:absolute',\n 'before:inset-y-0',\n 'before:w-2/5',\n 'before:rounded-full',\n 'before:bg-gray-11',\n 'not-motion-reduced:before:animate-progress-indeterminate',\n 'motion-reduced:before:w-full',\n 'motion-reduced:before:bg-gray-8',\n ])}\n />\n\n <div\n aria-hidden={true}\n data-component=\"DataTable.ResizeGuide\"\n className={mergeTwClassNames([\n // A linha-guia do resize, na altura toda da tabela, presa à linha vertical da coluna\n // pela âncora que o `DataTable.ResizeHandle` marca no hover e no arrasto. Na moldura e\n // acima das fixadas: a borda da coluna pode passar por baixo de uma fixada, e a guia\n // segue à vista.\n 'hidden',\n \"group-has-[[data-component='DataTable.ResizeHandle']:hover]/data-table-frame:block\",\n \"group-has-[[data-component='DataTable.ResizeHandle'][data-resizing]]/data-table-frame:block\",\n // Sem anchor positioning, a guia ficaria no canto da moldura: fica só a linha do\n // handle, no cabeçalho. No vazio também: sem linhas, a guia cortaria a mensagem ao meio.\n 'not-supports-[anchor-name:--a]:hidden!',\n \"group-has-[[data-component='DataTable.Empty']]/data-table-frame:hidden!\",\n 'pointer-events-none',\n 'absolute',\n 'inset-y-0',\n 'z-30',\n // No lugar da linha do handle: centrada nele, sobre a borda e 1px antes dela.\n 'w-0.5',\n 'left-[anchor(left)]',\n '-translate-x-1/2',\n '[position-anchor:--data-table-resize-handle]',\n 'bg-gray-9',\n \"group-has-[[data-component='DataTable.ResizeHandle'][data-resizing]]/data-table-frame:bg-black\",\n \"dark:group-has-[[data-component='DataTable.ResizeHandle'][data-resizing]]/data-table-frame:bg-white\",\n ])}\n />\n </div>\n\n <ScrollArea.Scrollbar\n orientation=\"vertical\"\n // Começa abaixo do cabeçalho sticky, na altura da primeira linha: a do cabeçalho mais a\n // borda de cima da moldura.\n className=\"mt-[calc(var(--data-table-header-offset,0px)+1px)]\"\n >\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n\n <ScrollArea.Scrollbar orientation=\"horizontal\">\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n\n <ScrollArea.Corner />\n </ScrollArea.Root>\n );\n};\n\nDataTableScrollArea.displayName = 'DataTable.ScrollArea';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAa,uBAAuB,UAAoC;CACtE,MAAM,EAAE,WAAW,UAAU,KAAK,GAAG,SAAS;CAE9C,MAAM,kBAAkB,yBAAyB;;;;;CAMjD,MAAM,UAAU,cACR,UAAU,iBAAiB,GAAG,GACpC,CAAC,iBAAiB,GAAG,CACvB;CAEA,OACE,qBAAC,WAAW,MAAZ;EACE,KAAK;EACL,kBAAe;EACf,WAAW,qBACT;GAME;GACA;GAGA;GACA;GACA;GACA;GAKA;GACA;EACF,GACA,SACF;EACA,GAAI;EA3BN,UAAA;GA6BE,qBAAC,OAAD;IACE,WAAW,kBAAkB;KAE3B;KAGA;KACA;KAKA;KACA;KACA;KACA;KACA;KAIA;KACA;KACA;IACF,CAAC;IAvBH,UAAA;KAyBE,oBAAC,WAAW,UAAZ;MACE,WAAW;MAIX,WAAU;MAEV,UAAA,oBAAC,WAAW,SAAZ,EAAqB,SAA6B,CAAA;KAC/B,CAAA;KAErB,oBAAC,OAAD;MACE,eAAa;MACb,kBAAe;MACf,WAAW,kBAAkB;OAK3B;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OAKA;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OACA;MACF,CAAC;KACF,CAAA;KAED,oBAAC,OAAD;MACE,eAAa;MACb,kBAAe;MACf,WAAW,kBAAkB;OAK3B;OACA;OACA;OAGA;OACA;OACA;OACA;OACA;OACA;OAEA;OACA;OACA;OACA;OACA;OACA;OACA;MACF,CAAC;KACF,CAAA;IACE;;GAEL,oBAAC,WAAW,WAAZ;IACE,aAAY;IAGZ,WAAU;IAEV,UAAA,oBAAC,WAAW,OAAZ,CAAmB,CAAA;GACC,CAAA;GAEtB,oBAAC,WAAW,WAAZ;IAAsB,aAAY;IAChC,UAAA,oBAAC,WAAW,OAAZ,CAAmB,CAAA;GACC,CAAA;GAEtB,oBAAC,WAAW,QAAZ,CAAoB,CAAA;EACL;;AAErB;AAEA,oBAAoB,cAAc"}
@@ -0,0 +1,45 @@
1
+ import { TableWith } from "../../../types/table-with.js";
2
+ import "../../../types/index.js";
3
+ import { RowData, TableFeatures } from "@tanstack/react-table";
4
+ //#region src/components/data-table/root/get-data-table-column-layout.d.ts
5
+ /** O layout das colunas do grid, nos valores que o `Root` põe nas variáveis CSS. */
6
+ export type DataTableColumnLayout = {
7
+ /** A largura de cada coluna visível, em px, na ordem das células. */
8
+ template: string;
9
+ /** A soma das larguras, em px. */
10
+ width: string;
11
+ /**
12
+ * O deslocamento de cada coluna fixada, em px, pelo nome da variável que a célula dela lê: no
13
+ * início, a soma das fixadas antes dela; no fim, a das fixadas depois.
14
+ */
15
+ offsets: Record<string, string>;
16
+ /**
17
+ * A largura das colunas fixadas de cada lado, em px: o `scroll-padding` lateral do contêiner que
18
+ * rola. Sem ele, o foco num elemento coberto por uma fixada não rola até ele, porque para o
19
+ * navegador o elemento já está na área visível.
20
+ */
21
+ scrollPadding: {
22
+ start: string;
23
+ end: string;
24
+ };
25
+ };
26
+ /**
27
+ * O layout das colunas visíveis, a partir dos headers folha: a linha de headers que
28
+ * particiona as colunas fixadas na mesma ordem de `row.getVisibleCells()`, então os tracks
29
+ * batem com as células.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * // Colunas visíveis de 44, 150 e 100px, com a primeira e a segunda fixadas no início:
34
+ * getDataTableColumnLayout(table);
35
+ * // → {
36
+ * // template: '44px 150px 100px',
37
+ * // width: '294px',
38
+ * // offsets: { '--data-table-pin-start-0': '0px', '--data-table-pin-start-1': '44px' },
39
+ * // scrollPadding: { start: '194px', end: '0px' },
40
+ * // }
41
+ * ```
42
+ */
43
+ export declare const getDataTableColumnLayout: <TFeatures extends TableFeatures, TData extends RowData>(table: TableWith<TFeatures, TData, "columnSizingFeature">) => DataTableColumnLayout;
44
+ //#endregion
45
+ //# sourceMappingURL=get-data-table-column-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-data-table-column-layout.d.ts","names":[],"sources":["../../../../src/components/data-table/root/get-data-table-column-layout.ts"],"mappings":";;;;;YASY;;EAEV;;EAEA;;;;;EAKA,SAAS;;;;;;EAMT;IAAiB;IAAe;;;;;;;;;;;;;;;;;;;;qBAoBrB,2BACX,kBAAkB,eAClB,cAAc,SAEd,OAAO,UAAU,WAAW,kCAC3B"}
@@ -0,0 +1,55 @@
1
+ import { hasHeaderFeature, hasTableFeature } from "../../../utils/has-feature.js";
2
+ import { getDataTableColumnPinning, getDataTablePinnedOffsetVariable } from "./get-data-table-column-pinning.js";
3
+ //#region src/components/data-table/root/get-data-table-column-layout.ts
4
+ /**
5
+ * O layout das colunas visíveis, a partir dos headers folha: a linha de headers que
6
+ * particiona as colunas fixadas na mesma ordem de `row.getVisibleCells()`, então os tracks
7
+ * batem com as células.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // Colunas visíveis de 44, 150 e 100px, com a primeira e a segunda fixadas no início:
12
+ * getDataTableColumnLayout(table);
13
+ * // → {
14
+ * // template: '44px 150px 100px',
15
+ * // width: '294px',
16
+ * // offsets: { '--data-table-pin-start-0': '0px', '--data-table-pin-start-1': '44px' },
17
+ * // scrollPadding: { start: '194px', end: '0px' },
18
+ * // }
19
+ * ```
20
+ */
21
+ const getDataTableColumnLayout = (table) => {
22
+ /**
23
+ * O tipo já exige `columnSizingFeature`: isto é o caso sem TypeScript, em que uma coluna fora
24
+ * do template desalinharia o grid em silêncio.
25
+ */
26
+ if (!hasTableFeature(table, "columnSizingFeature")) throw new Error("DataTable.Root: a tabela precisa de `columnSizingFeature` nas features.");
27
+ /**
28
+ * Com a feature registrada, todo header passa: o guard só estreita o header, que sai da tabela
29
+ * sem as features.
30
+ */
31
+ const leafHeaders = (table.getHeaderGroups().at(-1)?.headers ?? []).filter((header) => hasHeaderFeature(header, "columnSizingFeature"));
32
+ /**
33
+ * Só das colunas visíveis, que são as que têm célula. O índice da variável é o da fixação, que
34
+ * a célula também lê.
35
+ */
36
+ const offsets = leafHeaders.flatMap((header) => {
37
+ const pinning = getDataTableColumnPinning(header.column);
38
+ return pinning.position === "start" ? [[getDataTablePinnedOffsetVariable("start", pinning.index), `${header.column.getStart("start")}px`]] : pinning.position === "end" ? [[getDataTablePinnedOffsetVariable("end", pinning.index), `${header.column.getAfter("end")}px`]] : [];
39
+ });
40
+ /** A soma das larguras das colunas visíveis fixadas de um lado. */
41
+ const getPinnedWidth = (position) => leafHeaders.filter((header) => getDataTableColumnPinning(header.column).position === position).reduce((width, header) => width + header.getSize(), 0);
42
+ return {
43
+ template: leafHeaders.map((header) => `${header.getSize()}px`).join(" "),
44
+ width: `${table.getTotalSize()}px`,
45
+ offsets: Object.fromEntries(offsets),
46
+ scrollPadding: {
47
+ start: `${getPinnedWidth("start")}px`,
48
+ end: `${getPinnedWidth("end")}px`
49
+ }
50
+ };
51
+ };
52
+ //#endregion
53
+ export { getDataTableColumnLayout };
54
+
55
+ //# sourceMappingURL=get-data-table-column-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-data-table-column-layout.js","names":[],"sources":["../../../../src/components/data-table/root/get-data-table-column-layout.ts"],"sourcesContent":["import type { RowData, TableFeatures } from '@tanstack/react-table';\nimport type { TableWith } from '../../../types';\nimport { hasHeaderFeature, hasTableFeature } from '../../../utils';\nimport {\n getDataTableColumnPinning,\n getDataTablePinnedOffsetVariable,\n} from './get-data-table-column-pinning';\n\n/** O layout das colunas do grid, nos valores que o `Root` põe nas variáveis CSS. */\nexport type DataTableColumnLayout = {\n /** A largura de cada coluna visível, em px, na ordem das células. */\n template: string;\n /** A soma das larguras, em px. */\n width: string;\n /**\n * O deslocamento de cada coluna fixada, em px, pelo nome da variável que a célula dela lê: no\n * início, a soma das fixadas antes dela; no fim, a das fixadas depois.\n */\n offsets: Record<string, string>;\n /**\n * A largura das colunas fixadas de cada lado, em px: o `scroll-padding` lateral do contêiner que\n * rola. Sem ele, o foco num elemento coberto por uma fixada não rola até ele, porque para o\n * navegador o elemento já está na área visível.\n */\n scrollPadding: { start: string; end: string };\n};\n\n/**\n * O layout das colunas visíveis, a partir dos headers folha: a linha de headers que\n * particiona as colunas fixadas na mesma ordem de `row.getVisibleCells()`, então os tracks\n * batem com as células.\n *\n * @example\n * ```ts\n * // Colunas visíveis de 44, 150 e 100px, com a primeira e a segunda fixadas no início:\n * getDataTableColumnLayout(table);\n * // → {\n * // template: '44px 150px 100px',\n * // width: '294px',\n * // offsets: { '--data-table-pin-start-0': '0px', '--data-table-pin-start-1': '44px' },\n * // scrollPadding: { start: '194px', end: '0px' },\n * // }\n * ```\n */\nexport const getDataTableColumnLayout = <\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n table: TableWith<TFeatures, TData, 'columnSizingFeature'>,\n): DataTableColumnLayout => {\n /**\n * O tipo já exige `columnSizingFeature`: isto é o caso sem TypeScript, em que uma coluna fora\n * do template desalinharia o grid em silêncio.\n */\n if (!hasTableFeature(table, 'columnSizingFeature')) {\n throw new Error(\n 'DataTable.Root: a tabela precisa de `columnSizingFeature` nas features.',\n );\n }\n\n /**\n * Com a feature registrada, todo header passa: o guard só estreita o header, que sai da tabela\n * sem as features.\n */\n const leafHeaders = (table.getHeaderGroups().at(-1)?.headers ?? []).filter(\n (header) => hasHeaderFeature(header, 'columnSizingFeature'),\n );\n\n /**\n * Só das colunas visíveis, que são as que têm célula. O índice da variável é o da fixação, que\n * a célula também lê.\n */\n const offsets = leafHeaders.flatMap((header): [string, string][] => {\n const pinning = getDataTableColumnPinning(header.column);\n\n return pinning.position === 'start'\n ? [\n [\n getDataTablePinnedOffsetVariable('start', pinning.index),\n `${header.column.getStart('start')}px`,\n ],\n ]\n : pinning.position === 'end'\n ? [\n [\n getDataTablePinnedOffsetVariable('end', pinning.index),\n `${header.column.getAfter('end')}px`,\n ],\n ]\n : [];\n });\n\n /** A soma das larguras das colunas visíveis fixadas de um lado. */\n const getPinnedWidth = (position: 'start' | 'end') =>\n leafHeaders\n .filter(\n (header) =>\n getDataTableColumnPinning(header.column).position === position,\n )\n .reduce((width, header) => width + header.getSize(), 0);\n\n return {\n template: leafHeaders.map((header) => `${header.getSize()}px`).join(' '),\n width: `${table.getTotalSize()}px`,\n offsets: Object.fromEntries(offsets),\n scrollPadding: {\n start: `${getPinnedWidth('start')}px`,\n end: `${getPinnedWidth('end')}px`,\n },\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA4CA,MAAa,4BAIX,UAC0B;;;;;CAK1B,IAAI,CAAC,gBAAgB,OAAO,qBAAqB,GAC/C,MAAM,IAAI,MACR,yEACF;;;;;CAOF,MAAM,eAAe,MAAM,gBAAgB,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,CAAC,EAAA,CAAG,QACjE,WAAW,iBAAiB,QAAQ,qBAAqB,CAC5D;;;;;CAMA,MAAM,UAAU,YAAY,SAAS,WAA+B;EAClE,MAAM,UAAU,0BAA0B,OAAO,MAAM;EAEvD,OAAO,QAAQ,aAAa,UACxB,CACE,CACE,iCAAiC,SAAS,QAAQ,KAAK,GACvD,GAAG,OAAO,OAAO,SAAS,OAAO,EAAE,GACrC,CACF,IACA,QAAQ,aAAa,QACnB,CACE,CACE,iCAAiC,OAAO,QAAQ,KAAK,GACrD,GAAG,OAAO,OAAO,SAAS,KAAK,EAAE,GACnC,CACF,IACA,CAAC;CACT,CAAC;;CAGD,MAAM,kBAAkB,aACtB,YACG,QACE,WACC,0BAA0B,OAAO,MAAM,CAAC,CAAC,aAAa,QAC1D,CAAC,CACA,QAAQ,OAAO,WAAW,QAAQ,OAAO,QAAQ,GAAG,CAAC;CAE1D,OAAO;EACL,UAAU,YAAY,KAAK,WAAW,GAAG,OAAO,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG;EACvE,OAAO,GAAG,MAAM,aAAa,EAAE;EAC/B,SAAS,OAAO,YAAY,OAAO;EACnC,eAAe;GACb,OAAO,GAAG,eAAe,OAAO,EAAE;GAClC,KAAK,GAAG,eAAe,KAAK,EAAE;EAChC;CACF;AACF"}
@@ -0,0 +1,46 @@
1
+ import { Column, ColumnPinningPosition, RowData, TableFeatures } from "@tanstack/react-table";
2
+ import React from "react";
3
+ //#region src/components/data-table/root/get-data-table-column-pinning.d.ts
4
+ /** Onde uma coluna está fixada, e a posição dela entre as fixadas do mesmo lado. */
5
+ export type DataTableColumnPinning = {
6
+ /** O lado da fixação, ou `false` fora dela. */
7
+ position: ColumnPinningPosition;
8
+ /** O `column.getPinnedIndex()`: a posição no estado do pinning, que conta as escondidas. */
9
+ index: number;
10
+ };
11
+ /**
12
+ * A fixação de uma coluna. Sem `columnPinningFeature`, a coluna não está fixada.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // Com `columnPinning: { start: ['select', 'name'], end: [] }`:
17
+ * getDataTableColumnPinning(table.getColumn('name'));
18
+ * // → { position: 'start', index: 1 }
19
+ * ```
20
+ */
21
+ export declare const getDataTableColumnPinning: <TFeatures extends TableFeatures, TData extends RowData, TValue>(column: Column<TFeatures, TData, TValue>) => DataTableColumnPinning;
22
+ /**
23
+ * O nome da variável com o deslocamento de uma coluna fixada: o `DataTable.Root` escreve, e a
24
+ * célula e o header da coluna leem. Os dois lados usam o mesmo índice, o da fixação, e batem
25
+ * mesmo com uma coluna fixada escondida.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * getDataTablePinnedOffsetVariable('start', 1);
30
+ * // → '--data-table-pin-start-1'
31
+ * ```
32
+ */
33
+ export declare const getDataTablePinnedOffsetVariable: (position: "start" | "end", index: number) => string;
34
+ /**
35
+ * O estilo de uma célula fixada: o deslocamento do lado dela, pela variável que o
36
+ * `DataTable.Root` escreve. Fora da fixação, nenhum.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * getDataTablePinnedStyle({ position: 'start', index: 1 });
41
+ * // → { insetInlineStart: 'var(--data-table-pin-start-1)' }
42
+ * ```
43
+ */
44
+ export declare const getDataTablePinnedStyle: (pinning: DataTableColumnPinning) => React.CSSProperties | undefined;
45
+ //#endregion
46
+ //# sourceMappingURL=get-data-table-column-pinning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-data-table-column-pinning.d.ts","names":[],"sources":["../../../../src/components/data-table/root/get-data-table-column-pinning.ts"],"mappings":";;;;YAUY;;EAEV,UAAU;;EAEV;;;;;;;;;;;;qBAaW,4BACX,kBAAkB,eAClB,cAAc,SACd,QAEA,QAAQ,OAAO,WAAW,OAAO,YAChC;;;;;;;;;;;;qBAgBU,mCACX,2BACA;;;;;;;;;;;qBAaW,0BACX,SAAS,2BACR,MAAM"}