@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.
- package/LICENSE +21 -0
- package/README.md +268 -2
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/components/column-menu/column-menu-check.d.ts +8 -0
- package/dist/components/column-menu/column-menu-check.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-check.js +17 -0
- package/dist/components/column-menu/column-menu-check.js.map +1 -0
- package/dist/components/column-menu/column-menu-hide-item.d.ts +23 -0
- package/dist/components/column-menu/column-menu-hide-item.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-hide-item.js +27 -0
- package/dist/components/column-menu/column-menu-hide-item.js.map +1 -0
- package/dist/components/column-menu/column-menu-labels.d.ts +21 -0
- package/dist/components/column-menu/column-menu-labels.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-labels.js +14 -0
- package/dist/components/column-menu/column-menu-labels.js.map +1 -0
- package/dist/components/column-menu/column-menu-pin-items.d.ts +25 -0
- package/dist/components/column-menu/column-menu-pin-items.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-pin-items.js +64 -0
- package/dist/components/column-menu/column-menu-pin-items.js.map +1 -0
- package/dist/components/column-menu/column-menu-popup.d.ts +40 -0
- package/dist/components/column-menu/column-menu-popup.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-popup.js +67 -0
- package/dist/components/column-menu/column-menu-popup.js.map +1 -0
- package/dist/components/column-menu/column-menu-root.d.ts +34 -0
- package/dist/components/column-menu/column-menu-root.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-root.js +36 -0
- package/dist/components/column-menu/column-menu-root.js.map +1 -0
- package/dist/components/column-menu/column-menu-sort-items.d.ts +30 -0
- package/dist/components/column-menu/column-menu-sort-items.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-sort-items.js +62 -0
- package/dist/components/column-menu/column-menu-sort-items.js.map +1 -0
- package/dist/components/column-menu/column-menu-trigger.d.ts +23 -0
- package/dist/components/column-menu/column-menu-trigger.d.ts.map +1 -0
- package/dist/components/column-menu/column-menu-trigger.js +38 -0
- package/dist/components/column-menu/column-menu-trigger.js.map +1 -0
- package/dist/components/column-menu/index.d.ts +2 -0
- package/dist/components/column-menu/index.js +2 -0
- package/dist/components/column-menu/index.parts.d.ts +13 -0
- package/dist/components/column-menu/index.parts.d.ts.map +1 -0
- package/dist/components/column-menu/index.parts.js +20 -0
- package/dist/components/column-menu/index.parts.js.map +1 -0
- package/dist/components/columns-panel/columns-panel-item.d.ts +34 -0
- package/dist/components/columns-panel/columns-panel-item.d.ts.map +1 -0
- package/dist/components/columns-panel/columns-panel-item.js +109 -0
- package/dist/components/columns-panel/columns-panel-item.js.map +1 -0
- package/dist/components/columns-panel/columns-panel-root.d.ts +51 -0
- package/dist/components/columns-panel/columns-panel-root.d.ts.map +1 -0
- package/dist/components/columns-panel/columns-panel-root.js +134 -0
- package/dist/components/columns-panel/columns-panel-root.js.map +1 -0
- package/dist/components/columns-panel/get-columns-panel-column-order.d.ts +16 -0
- package/dist/components/columns-panel/get-columns-panel-column-order.d.ts.map +1 -0
- package/dist/components/columns-panel/get-columns-panel-column-order.js +24 -0
- package/dist/components/columns-panel/get-columns-panel-column-order.js.map +1 -0
- package/dist/components/columns-panel/index.d.ts +2 -0
- package/dist/components/columns-panel/index.js +2 -0
- package/dist/components/columns-panel/index.parts.d.ts +8 -0
- package/dist/components/columns-panel/index.parts.d.ts.map +1 -0
- package/dist/components/columns-panel/index.parts.js +12 -0
- package/dist/components/columns-panel/index.parts.js.map +1 -0
- package/dist/components/data-table/body/data-table-body.d.ts +58 -0
- package/dist/components/data-table/body/data-table-body.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-body.js +99 -0
- package/dist/components/data-table/body/data-table-body.js.map +1 -0
- package/dist/components/data-table/body/data-table-cell.d.ts +26 -0
- package/dist/components/data-table/body/data-table-cell.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-cell.js +80 -0
- package/dist/components/data-table/body/data-table-cell.js.map +1 -0
- package/dist/components/data-table/body/data-table-empty.d.ts +38 -0
- package/dist/components/data-table/body/data-table-empty.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-empty.js +71 -0
- package/dist/components/data-table/body/data-table-empty.js.map +1 -0
- package/dist/components/data-table/body/data-table-row-focus.d.ts +32 -0
- package/dist/components/data-table/body/data-table-row-focus.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-row-focus.js +58 -0
- package/dist/components/data-table/body/data-table-row-focus.js.map +1 -0
- package/dist/components/data-table/body/data-table-row.d.ts +67 -0
- package/dist/components/data-table/body/data-table-row.d.ts.map +1 -0
- package/dist/components/data-table/body/data-table-row.js +154 -0
- package/dist/components/data-table/body/data-table-row.js.map +1 -0
- package/dist/components/data-table/body/use-data-table-row-focus-recovery.d.ts +19 -0
- package/dist/components/data-table/body/use-data-table-row-focus-recovery.d.ts.map +1 -0
- package/dist/components/data-table/body/use-data-table-row-focus-recovery.js +64 -0
- package/dist/components/data-table/body/use-data-table-row-focus-recovery.js.map +1 -0
- package/dist/components/data-table/header/data-table-header-button.d.ts +25 -0
- package/dist/components/data-table/header/data-table-header-button.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header-button.js +57 -0
- package/dist/components/data-table/header/data-table-header-button.js.map +1 -0
- package/dist/components/data-table/header/data-table-header-cell.d.ts +34 -0
- package/dist/components/data-table/header/data-table-header-cell.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header-cell.js +97 -0
- package/dist/components/data-table/header/data-table-header-cell.js.map +1 -0
- package/dist/components/data-table/header/data-table-header-content.d.ts +21 -0
- package/dist/components/data-table/header/data-table-header-content.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header-content.js +37 -0
- package/dist/components/data-table/header/data-table-header-content.js.map +1 -0
- package/dist/components/data-table/header/data-table-header-row.d.ts +15 -0
- package/dist/components/data-table/header/data-table-header-row.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header-row.js +28 -0
- package/dist/components/data-table/header/data-table-header-row.js.map +1 -0
- package/dist/components/data-table/header/data-table-header.d.ts +46 -0
- package/dist/components/data-table/header/data-table-header.d.ts.map +1 -0
- package/dist/components/data-table/header/data-table-header.js +80 -0
- package/dist/components/data-table/header/data-table-header.js.map +1 -0
- package/dist/components/data-table/index.d.ts +2 -0
- package/dist/components/data-table/index.js +2 -0
- package/dist/components/data-table/index.parts.d.ts +33 -0
- package/dist/components/data-table/index.parts.d.ts.map +1 -0
- package/dist/components/data-table/index.parts.js +62 -0
- package/dist/components/data-table/index.parts.js.map +1 -0
- package/dist/components/data-table/loading/get-data-table-loading-without-rows.d.ts +16 -0
- package/dist/components/data-table/loading/get-data-table-loading-without-rows.d.ts.map +1 -0
- package/dist/components/data-table/loading/get-data-table-loading-without-rows.js +18 -0
- package/dist/components/data-table/loading/get-data-table-loading-without-rows.js.map +1 -0
- package/dist/components/data-table/loading/use-data-table-loading-inert.d.ts +16 -0
- package/dist/components/data-table/loading/use-data-table-loading-inert.d.ts.map +1 -0
- package/dist/components/data-table/loading/use-data-table-loading-inert.js +54 -0
- package/dist/components/data-table/loading/use-data-table-loading-inert.js.map +1 -0
- package/dist/components/data-table/loading/use-data-table-loading.d.ts +13 -0
- package/dist/components/data-table/loading/use-data-table-loading.d.ts.map +1 -0
- package/dist/components/data-table/loading/use-data-table-loading.js +40 -0
- package/dist/components/data-table/loading/use-data-table-loading.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-button.d.ts +45 -0
- package/dist/components/data-table/pagination/data-table-page-button.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-button.js +67 -0
- package/dist/components/data-table/pagination/data-table-page-button.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-size-select.d.ts +47 -0
- package/dist/components/data-table/pagination/data-table-page-size-select.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-size-select.js +68 -0
- package/dist/components/data-table/pagination/data-table-page-size-select.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-status.d.ts +43 -0
- package/dist/components/data-table/pagination/data-table-page-status.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-page-status.js +48 -0
- package/dist/components/data-table/pagination/data-table-page-status.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-pagination.d.ts +38 -0
- package/dist/components/data-table/pagination/data-table-pagination.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-pagination.js +87 -0
- package/dist/components/data-table/pagination/data-table-pagination.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-row-range.d.ts +49 -0
- package/dist/components/data-table/pagination/data-table-row-range.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-row-range.js +63 -0
- package/dist/components/data-table/pagination/data-table-row-range.js.map +1 -0
- package/dist/components/data-table/pagination/data-table-selected-count.d.ts +37 -0
- package/dist/components/data-table/pagination/data-table-selected-count.d.ts.map +1 -0
- package/dist/components/data-table/pagination/data-table-selected-count.js +44 -0
- package/dist/components/data-table/pagination/data-table-selected-count.js.map +1 -0
- package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts +15 -0
- package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.d.ts.map +1 -0
- package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.js +38 -0
- package/dist/components/data-table/pagination/use-data-table-page-scroll-reset.js.map +1 -0
- package/dist/components/data-table/resize/data-table-resize-handle.d.ts +48 -0
- package/dist/components/data-table/resize/data-table-resize-handle.d.ts.map +1 -0
- package/dist/components/data-table/resize/data-table-resize-handle.js +116 -0
- package/dist/components/data-table/resize/data-table-resize-handle.js.map +1 -0
- package/dist/components/data-table/resize/use-data-table-resize-scroll.d.ts +18 -0
- package/dist/components/data-table/resize/use-data-table-resize-scroll.d.ts.map +1 -0
- package/dist/components/data-table/resize/use-data-table-resize-scroll.js +55 -0
- package/dist/components/data-table/resize/use-data-table-resize-scroll.js.map +1 -0
- package/dist/components/data-table/root/data-table-grid-class-names.d.ts +10 -0
- package/dist/components/data-table/root/data-table-grid-class-names.d.ts.map +1 -0
- package/dist/components/data-table/root/data-table-grid-class-names.js +22 -0
- package/dist/components/data-table/root/data-table-grid-class-names.js.map +1 -0
- package/dist/components/data-table/root/data-table-root.d.ts +41 -0
- package/dist/components/data-table/root/data-table-root.d.ts.map +1 -0
- package/dist/components/data-table/root/data-table-root.js +72 -0
- package/dist/components/data-table/root/data-table-root.js.map +1 -0
- package/dist/components/data-table/root/data-table-scroll-area.d.ts +30 -0
- package/dist/components/data-table/root/data-table-scroll-area.d.ts.map +1 -0
- package/dist/components/data-table/root/data-table-scroll-area.js +137 -0
- package/dist/components/data-table/root/data-table-scroll-area.js.map +1 -0
- package/dist/components/data-table/root/get-data-table-column-layout.d.ts +45 -0
- package/dist/components/data-table/root/get-data-table-column-layout.d.ts.map +1 -0
- package/dist/components/data-table/root/get-data-table-column-layout.js +55 -0
- package/dist/components/data-table/root/get-data-table-column-layout.js.map +1 -0
- package/dist/components/data-table/root/get-data-table-column-pinning.d.ts +46 -0
- package/dist/components/data-table/root/get-data-table-column-pinning.d.ts.map +1 -0
- package/dist/components/data-table/root/get-data-table-column-pinning.js +46 -0
- package/dist/components/data-table/root/get-data-table-column-pinning.js.map +1 -0
- package/dist/components/data-table/root/get-data-table-scroll-parent.d.ts +13 -0
- package/dist/components/data-table/root/get-data-table-scroll-parent.d.ts.map +1 -0
- package/dist/components/data-table/root/get-data-table-scroll-parent.js +20 -0
- package/dist/components/data-table/root/get-data-table-scroll-parent.js.map +1 -0
- package/dist/components/data-table/root/use-data-table-column-layout.d.ts +25 -0
- package/dist/components/data-table/root/use-data-table-column-layout.d.ts.map +1 -0
- package/dist/components/data-table/root/use-data-table-column-layout.js +106 -0
- package/dist/components/data-table/root/use-data-table-column-layout.js.map +1 -0
- package/dist/components/data-table/root/use-data-table-header-offset.d.ts +15 -0
- package/dist/components/data-table/root/use-data-table-header-offset.d.ts.map +1 -0
- package/dist/components/data-table/root/use-data-table-header-offset.js +35 -0
- package/dist/components/data-table/root/use-data-table-header-offset.js.map +1 -0
- package/dist/components/data-table/selection/data-table-row-checkbox.d.ts +33 -0
- package/dist/components/data-table/selection/data-table-row-checkbox.d.ts.map +1 -0
- package/dist/components/data-table/selection/data-table-row-checkbox.js +50 -0
- package/dist/components/data-table/selection/data-table-row-checkbox.js.map +1 -0
- package/dist/components/data-table/selection/data-table-select-all-checkbox.d.ts +31 -0
- package/dist/components/data-table/selection/data-table-select-all-checkbox.d.ts.map +1 -0
- package/dist/components/data-table/selection/data-table-select-all-checkbox.js +44 -0
- package/dist/components/data-table/selection/data-table-select-all-checkbox.js.map +1 -0
- package/dist/components/data-table/selection/data-table-selection-bar.d.ts +51 -0
- package/dist/components/data-table/selection/data-table-selection-bar.d.ts.map +1 -0
- package/dist/components/data-table/selection/data-table-selection-bar.js +58 -0
- package/dist/components/data-table/selection/data-table-selection-bar.js.map +1 -0
- package/dist/components/data-table/selection/selection-column-def.d.ts +54 -0
- package/dist/components/data-table/selection/selection-column-def.d.ts.map +1 -0
- package/dist/components/data-table/selection/selection-column-def.js +55 -0
- package/dist/components/data-table/selection/selection-column-def.js.map +1 -0
- package/dist/components/data-table/sorting/data-table-sort-indicator.d.ts +26 -0
- package/dist/components/data-table/sorting/data-table-sort-indicator.d.ts.map +1 -0
- package/dist/components/data-table/sorting/data-table-sort-indicator.js +64 -0
- package/dist/components/data-table/sorting/data-table-sort-indicator.js.map +1 -0
- package/dist/components/data-table/sorting/data-table-sort-trigger.d.ts +31 -0
- package/dist/components/data-table/sorting/data-table-sort-trigger.d.ts.map +1 -0
- package/dist/components/data-table/sorting/data-table-sort-trigger.js +46 -0
- package/dist/components/data-table/sorting/data-table-sort-trigger.js.map +1 -0
- package/dist/components/data-table/toolbar/data-table-density-select.d.ts +39 -0
- package/dist/components/data-table/toolbar/data-table-density-select.d.ts.map +1 -0
- package/dist/components/data-table/toolbar/data-table-density-select.js +60 -0
- package/dist/components/data-table/toolbar/data-table-density-select.js.map +1 -0
- package/dist/components/data-table/toolbar/data-table-sort-column-select.d.ts +48 -0
- package/dist/components/data-table/toolbar/data-table-sort-column-select.d.ts.map +1 -0
- package/dist/components/data-table/toolbar/data-table-sort-column-select.js +79 -0
- package/dist/components/data-table/toolbar/data-table-sort-column-select.js.map +1 -0
- package/dist/components/data-table/toolbar/data-table-sort-direction-select.d.ts +40 -0
- package/dist/components/data-table/toolbar/data-table-sort-direction-select.d.ts.map +1 -0
- package/dist/components/data-table/toolbar/data-table-sort-direction-select.js +66 -0
- package/dist/components/data-table/toolbar/data-table-sort-direction-select.js.map +1 -0
- package/dist/features/active-row/active-row-feature.d.ts +22 -0
- package/dist/features/active-row/active-row-feature.d.ts.map +1 -0
- package/dist/features/active-row/active-row-feature.js +55 -0
- package/dist/features/active-row/active-row-feature.js.map +1 -0
- package/dist/features/active-row/active-row-feature.types.d.ts +64 -0
- package/dist/features/active-row/active-row-feature.types.d.ts.map +1 -0
- package/dist/features/active-row/active-row-feature.types.js +0 -0
- package/dist/features/column-alignment/column-alignment-feature.d.ts +23 -0
- package/dist/features/column-alignment/column-alignment-feature.d.ts.map +1 -0
- package/dist/features/column-alignment/column-alignment-feature.js +34 -0
- package/dist/features/column-alignment/column-alignment-feature.js.map +1 -0
- package/dist/features/column-alignment/column-alignment-feature.types.d.ts +34 -0
- package/dist/features/column-alignment/column-alignment-feature.types.d.ts.map +1 -0
- package/dist/features/column-alignment/column-alignment-feature.types.js +0 -0
- package/dist/features/index.d.ts +9 -0
- package/dist/features/index.js +5 -0
- package/dist/features/loading/loading-feature.d.ts +30 -0
- package/dist/features/loading/loading-feature.d.ts.map +1 -0
- package/dist/features/loading/loading-feature.js +48 -0
- package/dist/features/loading/loading-feature.js.map +1 -0
- package/dist/features/loading/loading-feature.types.d.ts +50 -0
- package/dist/features/loading/loading-feature.types.d.ts.map +1 -0
- package/dist/features/loading/loading-feature.types.js +0 -0
- package/dist/features/row-density/row-density-feature.d.ts +26 -0
- package/dist/features/row-density/row-density-feature.d.ts.map +1 -0
- package/dist/features/row-density/row-density-feature.js +44 -0
- package/dist/features/row-density/row-density-feature.js.map +1 -0
- package/dist/features/row-density/row-density-feature.types.d.ts +53 -0
- package/dist/features/row-density/row-density-feature.types.d.ts.map +1 -0
- package/dist/features/row-density/row-density-feature.types.js +0 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +0 -0
- package/dist/types/table-with.d.ts +96 -0
- package/dist/types/table-with.d.ts.map +1 -0
- package/dist/types/table-with.js +0 -0
- package/dist/utils/get-default-column-label.d.ts +17 -0
- package/dist/utils/get-default-column-label.d.ts.map +1 -0
- package/dist/utils/get-default-column-label.js +18 -0
- package/dist/utils/get-default-column-label.js.map +1 -0
- package/dist/utils/has-feature.d.ts +54 -0
- package/dist/utils/has-feature.d.ts.map +1 -0
- package/dist/utils/has-feature.js +55 -0
- package/dist/utils/has-feature.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +3 -0
- 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"}
|