basalt-ui 1.30.2 → 1.31.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/AGENTS.md +1 -1
- package/CHANGELOG.md +31 -0
- package/MIGRATING.md +172 -12
- package/agent/rules/basalt-controls.md +19 -19
- package/agent/rules/basalt-mantine.md +1 -1
- package/configs/oxlint-plugin.js +254 -4
- package/configs/oxlint-plugin.test.ts +145 -2
- package/configs/oxlint.json +2 -1
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +41 -43
- package/dist/agent-chat/thread-workspace.d.ts +2 -2
- package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
- package/dist/agent-chat/thread-workspace.js +3 -4
- package/dist/agent-chat/use-keyboard-inset.d.ts +2 -0
- package/dist/agent-chat/use-keyboard-inset.d.ts.map +1 -0
- package/dist/agent-chat/use-keyboard-inset.js +34 -0
- package/dist/charts/cursor/touch-pin.d.ts +45 -0
- package/dist/charts/cursor/touch-pin.d.ts.map +1 -0
- package/dist/charts/cursor/touch-pin.js +79 -0
- package/dist/charts/hooks/use-discrete-cursor.d.ts +66 -0
- package/dist/charts/hooks/use-discrete-cursor.d.ts.map +1 -0
- package/dist/charts/hooks/use-discrete-cursor.js +198 -0
- package/dist/charts/hooks/use-hysteresis.d.ts +18 -0
- package/dist/charts/hooks/use-hysteresis.d.ts.map +1 -0
- package/dist/charts/hooks/use-hysteresis.js +12 -0
- package/dist/charts/hooks/useBandPlot.d.ts +7 -0
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +62 -18
- package/dist/charts/hooks/useChartCursor.d.ts +40 -11
- package/dist/charts/hooks/useChartCursor.d.ts.map +1 -1
- package/dist/charts/hooks/useChartCursor.js +102 -11
- package/dist/charts/index.d.ts +0 -1
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +0 -10
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +54 -41
- package/dist/charts/kinds/Donut.d.ts +9 -3
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +110 -48
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +145 -131
- package/dist/charts/kinds/Heatmap.d.ts +7 -0
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +37 -16
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
- package/dist/charts/kinds/MirroredBars.js +83 -68
- package/dist/charts/kinds/donut-layout.d.ts +47 -0
- package/dist/charts/kinds/donut-layout.d.ts.map +1 -0
- package/dist/charts/kinds/donut-layout.js +52 -0
- package/dist/charts/layout/auto-margin.d.ts +7 -2
- package/dist/charts/layout/auto-margin.d.ts.map +1 -1
- package/dist/charts/layout/auto-margin.js +12 -3
- package/dist/charts/layout/end-labels.d.ts +64 -0
- package/dist/charts/layout/end-labels.d.ts.map +1 -0
- package/dist/charts/layout/end-labels.js +76 -0
- package/dist/charts/primitives/Axes.d.ts +32 -4
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +62 -16
- package/dist/charts/primitives/CartesianChart.d.ts +7 -6
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +271 -125
- package/dist/charts/primitives/ChartCard.d.ts +0 -14
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +74 -21
- package/dist/charts/primitives/ChartFrame.d.ts +28 -22
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +133 -34
- package/dist/charts/primitives/ChartLegend.d.ts +19 -15
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +212 -71
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +4 -3
- package/dist/charts/primitives/Crosshair.js +2 -2
- package/dist/charts/primitives/HoverOverlay.d.ts +6 -1
- package/dist/charts/primitives/HoverOverlay.d.ts.map +1 -1
- package/dist/charts/primitives/HoverOverlay.js +37 -26
- package/dist/charts/primitives/HoverOverlay.module.css +13 -0
- package/dist/charts/primitives/HoverOverlay.module.css.d.ts +8 -0
- package/dist/charts/primitives/chart-card-context.d.ts +29 -0
- package/dist/charts/primitives/chart-card-context.d.ts.map +1 -0
- package/dist/charts/primitives/chart-card-context.js +13 -0
- package/dist/charts/primitives/chart-frame-layout.d.ts +93 -113
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -1
- package/dist/charts/primitives/chart-frame-layout.js +76 -29
- package/dist/charts/primitives/chart-layout.d.ts +112 -0
- package/dist/charts/primitives/chart-layout.d.ts.map +1 -0
- package/dist/charts/primitives/chart-layout.js +175 -0
- package/dist/charts/primitives/chart-tier.d.ts +13 -11
- package/dist/charts/primitives/chart-tier.d.ts.map +1 -1
- package/dist/charts/primitives/chart-tier.js +42 -13
- package/dist/charts/series.d.ts +4 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/utils/ticks.d.ts +27 -8
- package/dist/charts/utils/ticks.d.ts.map +1 -1
- package/dist/charts/utils/ticks.js +35 -11
- package/dist/common/errors.d.ts +11 -1
- package/dist/common/errors.d.ts.map +1 -1
- package/dist/common/errors.js +16 -2
- package/dist/common/hit-floor.d.ts +10 -0
- package/dist/common/hit-floor.d.ts.map +1 -0
- package/dist/common/hit-floor.js +6 -0
- package/dist/{shell → common}/isomorphic-layout-effect.d.ts +4 -3
- package/dist/common/isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/common/use-measured-widths.d.ts +37 -0
- package/dist/common/use-measured-widths.d.ts.map +1 -0
- package/dist/common/use-measured-widths.js +51 -0
- package/dist/common/use-media-query.d.ts +6 -0
- package/dist/common/use-media-query.d.ts.map +1 -0
- package/dist/common/use-media-query.js +40 -0
- package/dist/common/validate.d.ts +9 -0
- package/dist/common/validate.d.ts.map +1 -1
- package/dist/common/validate.js +9 -4
- package/dist/content/article-layout.d.ts +4 -2
- package/dist/content/article-layout.d.ts.map +1 -1
- package/dist/content/article-layout.js +43 -3
- package/dist/content/article-layout.module.css +45 -4
- package/dist/content/article-layout.module.css.d.ts +3 -0
- package/dist/content/code-block.d.ts.map +1 -1
- package/dist/content/code-block.js +40 -2
- package/dist/content/code-block.module.css +32 -2
- package/dist/content/prose.module.css +13 -8
- package/dist/controls/actions.d.ts +29 -6
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/actions.js +158 -27
- package/dist/controls/actions.module.css +14 -1
- package/dist/controls/actions.module.css.d.ts +1 -0
- package/dist/controls/controls.module.css +8 -31
- package/dist/controls/enum-filter.js +2 -2
- package/dist/controls/filter-context.d.ts +10 -0
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-context.js +2 -0
- package/dist/controls/filter-pill.d.ts.map +1 -1
- package/dist/controls/filter-pill.js +1 -0
- package/dist/controls/index.d.ts +1 -1
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +0 -2
- package/dist/controls/multi-select-filter.js +2 -2
- package/dist/controls/sync-button.module.css +1 -1
- package/dist/dashboard/section.d.ts.map +1 -1
- package/dist/dashboard/section.js +1 -0
- package/dist/dashboard/section.module.css +1 -26
- package/dist/dashboard/stat-card.d.ts +1 -1
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +4 -1
- package/dist/dashboard/stat-card.module.css +6 -9
- package/dist/dashboard/stat-group.module.css +16 -4
- package/dist/dashboard/widget-grid.d.ts.map +1 -1
- package/dist/dashboard/widget-header.d.ts +14 -4
- package/dist/dashboard/widget-header.d.ts.map +1 -1
- package/dist/dashboard/widget-header.js +23 -6
- package/dist/dashboard/widget-header.module.css +145 -133
- package/dist/dashboard/widget-header.module.css.d.ts +2 -0
- package/dist/data/data-table.d.ts +23 -0
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +339 -141
- package/dist/data/data-table.module.css +94 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/virtual-list.d.ts.map +1 -1
- package/dist/data/virtual-list.js +10 -0
- package/dist/forms/form-layout.d.ts.map +1 -1
- package/dist/forms/form-layout.js +3 -3
- package/dist/forms/form-layout.module.css +30 -5
- package/dist/forms/form-layout.module.css.d.ts +1 -0
- package/dist/guard/index.d.ts +8 -2
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +67 -2
- package/dist/guard/types.d.ts +3 -3
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/provider/index.d.ts +20 -1
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +22 -2
- package/dist/shell/app-brand.d.ts.map +1 -1
- package/dist/shell/app-brand.js +1 -0
- package/dist/shell/app-brand.module.css +2 -2
- package/dist/shell/app-header.module.css +18 -8
- package/dist/shell/app-main.module.css +54 -3
- package/dist/shell/app-main.module.css.d.ts +1 -0
- package/dist/shell/app-mobile-nav.module.css +16 -4
- package/dist/shell/app-sidebar.module.css +4 -6
- package/dist/shell/index.d.ts +12 -0
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +57 -16
- package/dist/shell/mobile-nav-model.d.ts +1 -1
- package/dist/shell/page-aside.d.ts +22 -3
- package/dist/shell/page-aside.d.ts.map +1 -1
- package/dist/shell/page-aside.js +27 -13
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +10 -5
- package/dist/shell/page-bar.module.css +10 -34
- package/dist/shell/use-breakpoint.d.ts +3 -4
- package/dist/shell/use-breakpoint.d.ts.map +1 -1
- package/dist/shell/use-breakpoint.js +3 -25
- package/dist/shell/use-size-class.d.ts +6 -0
- package/dist/shell/use-size-class.d.ts.map +1 -0
- package/dist/shell/use-size-class.js +19 -0
- package/dist/state/persisted-or-local.d.ts +4 -1
- package/dist/state/persisted-or-local.d.ts.map +1 -1
- package/dist/state/persisted-or-local.js +4 -3
- package/dist/state/persisted.d.ts +10 -0
- package/dist/state/persisted.d.ts.map +1 -1
- package/dist/state/persisted.js +44 -14
- package/dist/styles.css +41 -0
- package/dist/surfaces.d.ts +4 -4
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +11 -3
- package/dist/theme/controls.module.css +7 -0
- package/dist/theme/ctl-theme.d.ts +1 -0
- package/dist/theme/ctl-theme.d.ts.map +1 -1
- package/dist/theme/ctl-theme.js +12 -4
- package/dist/theme/floating.module.css +36 -0
- package/dist/theme/floating.module.css.d.ts +3 -0
- package/dist/theme/index.d.ts +2 -2
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +34 -5
- package/dist/theme/nav-link.module.css +7 -0
- package/dist/tokens/index.d.ts +7 -16
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +23 -28
- package/dist/tokens/palette.d.ts +5 -27
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +8 -30
- package/dist/tokens/size-classes.d.ts +40 -0
- package/dist/tokens/size-classes.d.ts.map +1 -0
- package/dist/tokens/size-classes.js +29 -0
- package/dist/tokens.css +8 -4
- package/llms.txt +3 -3
- package/package.json +17 -17
- package/src/agent-chat/composer.tsx +74 -47
- package/src/agent-chat/thread-workspace.tsx +8 -11
- package/src/agent-chat/use-keyboard-inset.ts +68 -0
- package/src/charts/cursor/touch-pin.ts +138 -0
- package/src/charts/hooks/use-discrete-cursor.ts +335 -0
- package/src/charts/hooks/use-hysteresis.ts +26 -0
- package/src/charts/hooks/useBandPlot.ts +90 -27
- package/src/charts/hooks/useChartCursor.ts +211 -26
- package/src/charts/index.ts +0 -8
- package/src/charts/kinds/BandStrip.tsx +11 -1
- package/src/charts/kinds/Donut.tsx +153 -62
- package/src/charts/kinds/DualPanel.tsx +19 -4
- package/src/charts/kinds/Heatmap.tsx +61 -22
- package/src/charts/kinds/MirroredBars.tsx +15 -3
- package/src/charts/kinds/donut-layout.ts +82 -0
- package/src/charts/layout/auto-margin.ts +24 -5
- package/src/charts/layout/end-labels.ts +135 -0
- package/src/charts/primitives/Axes.tsx +112 -21
- package/src/charts/primitives/CartesianChart.tsx +282 -68
- package/src/charts/primitives/ChartCard.tsx +141 -48
- package/src/charts/primitives/ChartFrame.tsx +243 -60
- package/src/charts/primitives/ChartLegend.tsx +257 -73
- package/src/charts/primitives/ChartTooltip.tsx +8 -3
- package/src/charts/primitives/Crosshair.tsx +2 -2
- package/src/charts/primitives/HoverOverlay.module.css +13 -0
- package/src/charts/primitives/HoverOverlay.module.css.d.ts +8 -0
- package/src/charts/primitives/HoverOverlay.tsx +15 -4
- package/src/charts/primitives/chart-card-context.ts +37 -0
- package/src/charts/primitives/chart-frame-layout.ts +214 -177
- package/src/charts/primitives/chart-layout.ts +318 -0
- package/src/charts/primitives/chart-tier.tsx +66 -21
- package/src/charts/series.ts +4 -1
- package/src/charts/utils/ticks.ts +95 -19
- package/src/common/errors.ts +25 -1
- package/src/common/hit-floor.ts +9 -0
- package/src/{shell → common}/isomorphic-layout-effect.ts +4 -3
- package/src/common/use-measured-widths.ts +88 -0
- package/src/common/use-media-query.ts +56 -0
- package/src/common/validate.ts +17 -4
- package/src/content/article-layout.module.css +45 -4
- package/src/content/article-layout.module.css.d.ts +3 -0
- package/src/content/article-layout.tsx +60 -5
- package/src/content/code-block.module.css +32 -2
- package/src/content/code-block.tsx +47 -3
- package/src/content/prose.module.css +13 -8
- package/src/controls/actions.module.css +14 -1
- package/src/controls/actions.module.css.d.ts +1 -0
- package/src/controls/actions.tsx +223 -75
- package/src/controls/controls.module.css +8 -31
- package/src/controls/enum-filter.tsx +2 -2
- package/src/controls/filter-context.tsx +11 -0
- package/src/controls/filter-pill.tsx +1 -0
- package/src/controls/index.ts +0 -1
- package/src/controls/multi-select-filter.tsx +2 -2
- package/src/controls/sync-button.module.css +1 -1
- package/src/dashboard/section.module.css +1 -26
- package/src/dashboard/section.tsx +1 -0
- package/src/dashboard/stat-card.module.css +6 -9
- package/src/dashboard/stat-card.tsx +6 -3
- package/src/dashboard/stat-group.module.css +16 -4
- package/src/dashboard/widget-grid.tsx +7 -6
- package/src/dashboard/widget-header.module.css +145 -133
- package/src/dashboard/widget-header.module.css.d.ts +2 -0
- package/src/dashboard/widget-header.tsx +45 -11
- package/src/data/data-table.module.css +94 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +503 -164
- package/src/data/virtual-list.tsx +31 -0
- package/src/forms/form-layout.module.css +30 -5
- package/src/forms/form-layout.module.css.d.ts +1 -0
- package/src/forms/form-layout.tsx +12 -10
- package/src/guard/index.ts +183 -3
- package/src/guard/types.ts +3 -2
- package/src/index.ts +2 -0
- package/src/provider/index.tsx +53 -1
- package/src/shell/app-brand.module.css +2 -2
- package/src/shell/app-brand.tsx +1 -0
- package/src/shell/app-header.module.css +18 -8
- package/src/shell/app-main.module.css +54 -3
- package/src/shell/app-main.module.css.d.ts +1 -0
- package/src/shell/app-mobile-nav.module.css +16 -4
- package/src/shell/app-sidebar.module.css +4 -6
- package/src/shell/index.tsx +200 -129
- package/src/shell/mobile-nav-model.ts +1 -1
- package/src/shell/page-aside.tsx +70 -21
- package/src/shell/page-bar.module.css +10 -34
- package/src/shell/page-bar.tsx +10 -5
- package/src/shell/use-breakpoint.ts +9 -45
- package/src/shell/use-size-class.ts +31 -0
- package/src/state/persisted-or-local.ts +10 -4
- package/src/state/persisted.ts +76 -17
- package/src/styles.css +41 -0
- package/src/surfaces.ts +9 -1
- package/src/theme/controls.module.css +7 -0
- package/src/theme/ctl-theme.tsx +15 -3
- package/src/theme/floating.module.css +36 -0
- package/src/theme/floating.module.css.d.ts +3 -0
- package/src/theme/index.ts +46 -8
- package/src/theme/nav-link.module.css +7 -0
- package/src/tokens/index.ts +20 -30
- package/src/tokens/palette.ts +6 -28
- package/src/tokens/size-classes.ts +46 -0
- package/dist/shell/isomorphic-layout-effect.d.ts.map +0 -1
- /package/dist/{shell → common}/isomorphic-layout-effect.js +0 -0
package/dist/data/data-table.js
CHANGED
|
@@ -18,9 +18,11 @@ import {
|
|
|
18
18
|
getSortedRowModel,
|
|
19
19
|
useReactTable
|
|
20
20
|
} from "@tanstack/react-table";
|
|
21
|
-
import { useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
21
|
+
import { Fragment, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
22
22
|
import { cx } from "../common/props.js";
|
|
23
23
|
import { BASALT_PREFIX } from "../common/errors.js";
|
|
24
|
+
import { HIT_COARSE } from "../common/hit-floor.js";
|
|
25
|
+
import { useMeasuredWidths } from "../common/use-measured-widths.js";
|
|
24
26
|
import { assertRequiredProps, useValidateProps } from "../common/validate.js";
|
|
25
27
|
import { FilterSet } from "../controls/index.js";
|
|
26
28
|
import { ActionGroup, BarActionSlot } from "../controls/actions.js";
|
|
@@ -106,26 +108,31 @@ function selectionColumn() {
|
|
|
106
108
|
return {
|
|
107
109
|
id: SELECT_COLUMN_ID,
|
|
108
110
|
enableSorting: false,
|
|
109
|
-
header: ({ table }) =>
|
|
110
|
-
Checkbox
|
|
111
|
-
{
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
111
|
+
header: ({ table }) => (
|
|
112
|
+
// oxlint-disable-next-line jsx-a11y/label-has-associated-control -- wraps <Checkbox>, which oxlint cannot see is an input
|
|
113
|
+
/* @__PURE__ */ jsx("label", { className: classes.selectHit, children: /* @__PURE__ */ jsx(
|
|
114
|
+
Checkbox,
|
|
115
|
+
{
|
|
116
|
+
size: "xs",
|
|
117
|
+
"aria-label": "Select all rows",
|
|
118
|
+
checked: table.getIsAllPageRowsSelected(),
|
|
119
|
+
indeterminate: table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected(),
|
|
120
|
+
onChange: table.getToggleAllPageRowsSelectedHandler()
|
|
121
|
+
}
|
|
122
|
+
) })
|
|
118
123
|
),
|
|
119
|
-
cell: ({ row }) =>
|
|
120
|
-
Checkbox
|
|
121
|
-
{
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
cell: ({ row }) => (
|
|
125
|
+
// oxlint-disable-next-line jsx-a11y/label-has-associated-control -- wraps <Checkbox>, which oxlint cannot see is an input
|
|
126
|
+
/* @__PURE__ */ jsx("label", { className: classes.selectHit, children: /* @__PURE__ */ jsx(
|
|
127
|
+
Checkbox,
|
|
128
|
+
{
|
|
129
|
+
size: "xs",
|
|
130
|
+
"aria-label": `Select row ${row.index + 1}`,
|
|
131
|
+
checked: row.getIsSelected(),
|
|
132
|
+
disabled: !row.getCanSelect(),
|
|
133
|
+
onChange: row.getToggleSelectedHandler()
|
|
134
|
+
}
|
|
135
|
+
) })
|
|
129
136
|
)
|
|
130
137
|
};
|
|
131
138
|
}
|
|
@@ -201,6 +208,118 @@ function getPinnedCellStyle(table, column) {
|
|
|
201
208
|
boxShadow: isEdge ? `-4px 0 6px -4px ${alpha(VX.ink, 0.18)}` : void 0
|
|
202
209
|
};
|
|
203
210
|
}
|
|
211
|
+
function columnDefId(column) {
|
|
212
|
+
if (column.id !== void 0) return column.id;
|
|
213
|
+
return "accessorKey" in column && typeof column.accessorKey === "string" ? column.accessorKey : void 0;
|
|
214
|
+
}
|
|
215
|
+
function foldOrder(columns) {
|
|
216
|
+
return columns.map((column, index) => ({
|
|
217
|
+
id: columnDefId(column),
|
|
218
|
+
priority: column.meta?.priority ?? index,
|
|
219
|
+
index
|
|
220
|
+
})).filter(
|
|
221
|
+
(candidate) => Boolean(candidate.id)
|
|
222
|
+
).toSorted((a, b) => b.priority - a.priority || b.index - a.index).map((candidate) => candidate.id);
|
|
223
|
+
}
|
|
224
|
+
const FOLD_ID_ATTR = "data-basalt-fold-id";
|
|
225
|
+
const EMPTY_FOLD_SET = /* @__PURE__ */ new Set();
|
|
226
|
+
function planColumnFold(input) {
|
|
227
|
+
const { room, toggleWidth, overhead, order, widths } = input;
|
|
228
|
+
const known = order.filter((id) => widths.has(id));
|
|
229
|
+
let unfolded = overhead + known.reduce((sum, id) => sum + (widths.get(id) ?? 0), 0);
|
|
230
|
+
const folded = /* @__PURE__ */ new Set();
|
|
231
|
+
for (const id of known) {
|
|
232
|
+
if (folded.size >= known.length - 1) break;
|
|
233
|
+
const withToggle = unfolded + (folded.size > 0 ? toggleWidth : 0);
|
|
234
|
+
if (withToggle <= room) break;
|
|
235
|
+
folded.add(id);
|
|
236
|
+
unfolded -= widths.get(id) ?? 0;
|
|
237
|
+
}
|
|
238
|
+
return folded;
|
|
239
|
+
}
|
|
240
|
+
function useColumnFold(input) {
|
|
241
|
+
const { active, order, fixedIds } = input;
|
|
242
|
+
const wrapperRef = useRef(null);
|
|
243
|
+
const [folded, setFolded] = useState(EMPTY_FOLD_SET);
|
|
244
|
+
const orderRef = useRef(order);
|
|
245
|
+
orderRef.current = order;
|
|
246
|
+
const fixedIdsRef = useRef(fixedIds);
|
|
247
|
+
fixedIdsRef.current = fixedIds;
|
|
248
|
+
useLayoutEffect(() => {
|
|
249
|
+
if (!active || order.length === 0) {
|
|
250
|
+
setFolded((current) => current.size === 0 ? current : EMPTY_FOLD_SET);
|
|
251
|
+
}
|
|
252
|
+
}, [active, order.length]);
|
|
253
|
+
useMeasuredWidths({
|
|
254
|
+
resolveRoot: () => wrapperRef.current,
|
|
255
|
+
signature: `${order.join("|")}::${fixedIds.join("|")}`,
|
|
256
|
+
enabled: active && order.length > 0,
|
|
257
|
+
// The table too, not only the wrapper: a re-measured column set moves its min-content width
|
|
258
|
+
// while the wrapper's own box never changes.
|
|
259
|
+
extra: (root) => [root.querySelector("table")],
|
|
260
|
+
onMeasure: (root, boxes) => {
|
|
261
|
+
for (const cell of root.querySelectorAll(`[${FOLD_ID_ATTR}]`)) {
|
|
262
|
+
const id = cell.getAttribute(FOLD_ID_ATTR);
|
|
263
|
+
if (id !== null && cell.offsetWidth > 0) {
|
|
264
|
+
boxes.current.set(id, { width: cell.offsetWidth, height: cell.offsetHeight });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const room = root.clientWidth;
|
|
268
|
+
if (room === 0) return;
|
|
269
|
+
const widths = new Map([...boxes.current].map(([id, box]) => [id, box.width]));
|
|
270
|
+
const overhead = fixedIdsRef.current.reduce((sum, id) => sum + (widths.get(id) ?? 0), 0);
|
|
271
|
+
const next = planColumnFold({
|
|
272
|
+
room,
|
|
273
|
+
// The disclosure toggle is a fixed icon-button cell matched to the coarse hit floor, so it
|
|
274
|
+
// reads as one more `--vx-hit` control rather than a narrower afterthought.
|
|
275
|
+
toggleWidth: HIT_COARSE,
|
|
276
|
+
overhead,
|
|
277
|
+
order: orderRef.current,
|
|
278
|
+
widths
|
|
279
|
+
});
|
|
280
|
+
setFolded(
|
|
281
|
+
(current) => current.size === next.size && [...current].every((id) => next.has(id)) ? current : next
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
return { wrapperRef, folded: active ? folded : EMPTY_FOLD_SET };
|
|
286
|
+
}
|
|
287
|
+
function columnLabel(column) {
|
|
288
|
+
const header = column.columnDef.header;
|
|
289
|
+
return typeof header === "string" ? header : column.id;
|
|
290
|
+
}
|
|
291
|
+
function RowDisclosure({
|
|
292
|
+
row,
|
|
293
|
+
folded
|
|
294
|
+
}) {
|
|
295
|
+
const cells = row.getAllCells().filter((cell) => folded.has(cell.column.id));
|
|
296
|
+
return /* @__PURE__ */ jsx("div", { className: classes.foldDisclosure, children: cells.map((cell) => /* @__PURE__ */ jsxs("div", { className: classes.foldDisclosureRow, children: [
|
|
297
|
+
/* @__PURE__ */ jsx(Text, { className: classes.foldDisclosureLabel, children: columnLabel(cell.column) }),
|
|
298
|
+
/* @__PURE__ */ jsx("div", { className: classes.foldDisclosureValue, children: flexRender(cell.column.columnDef.cell, cell.getContext()) })
|
|
299
|
+
] }, cell.id)) });
|
|
300
|
+
}
|
|
301
|
+
function FoldToggle({
|
|
302
|
+
expanded,
|
|
303
|
+
controlsId,
|
|
304
|
+
onToggle
|
|
305
|
+
}) {
|
|
306
|
+
return /* @__PURE__ */ jsx(
|
|
307
|
+
"button",
|
|
308
|
+
{
|
|
309
|
+
type: "button",
|
|
310
|
+
className: classes.foldToggle,
|
|
311
|
+
"data-basalt-hit": true,
|
|
312
|
+
"aria-expanded": expanded,
|
|
313
|
+
"aria-controls": controlsId,
|
|
314
|
+
"aria-label": expanded ? "Hide row details" : "Show row details",
|
|
315
|
+
onClick: (event) => {
|
|
316
|
+
event.stopPropagation();
|
|
317
|
+
onToggle();
|
|
318
|
+
},
|
|
319
|
+
children: /* @__PURE__ */ jsx(Box, { component: "span", "aria-hidden": true, children: expanded ? "\u25BE" : "\u25B8" })
|
|
320
|
+
}
|
|
321
|
+
);
|
|
322
|
+
}
|
|
204
323
|
const BREACH_REMEDY = {
|
|
205
324
|
inert: "`enablePagination` is not set, so `manualPagination` never reaches the table and the server page renders as if it were the whole set, with no bar to say otherwise. Pass `enablePagination`, or drop `manualPagination`.",
|
|
206
325
|
total: 'neither `rowCount` nor `pageCount` was given, so "of N" counts only the rows on this page and the pager collapses to one page nobody can leave. Pass `rowCount={total}`.',
|
|
@@ -233,35 +352,21 @@ function enforceManualPaginationContract(breaches) {
|
|
|
233
352
|
function useMeasuredContainment(active) {
|
|
234
353
|
const wrapperRef = useRef(null);
|
|
235
354
|
const [contained, setContained] = useState(false);
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
const
|
|
248
|
-
if (result === "unknown") return;
|
|
249
|
-
const next = result === "contained";
|
|
355
|
+
useMeasuredWidths({
|
|
356
|
+
resolveRoot: () => wrapperRef.current,
|
|
357
|
+
signature: String(active),
|
|
358
|
+
enabled: active,
|
|
359
|
+
// The TABLE too, not only the wrapper: a column set that re-measures (a facet filter changing
|
|
360
|
+
// the widest cell, a font settling) moves the table's min-content width while the wrapper's
|
|
361
|
+
// box never changes at all.
|
|
362
|
+
extra: (root) => [root.querySelector("table")],
|
|
363
|
+
onMeasure: (root) => {
|
|
364
|
+
const table = root.querySelector("table");
|
|
365
|
+
if (table === null || root.clientWidth === 0 || table.offsetWidth === 0) return;
|
|
366
|
+
const next = table.offsetWidth > root.clientWidth;
|
|
250
367
|
setContained((current) => current === next ? current : next);
|
|
251
|
-
};
|
|
252
|
-
if (typeof ResizeObserver === "undefined") {
|
|
253
|
-
apply();
|
|
254
|
-
return;
|
|
255
368
|
}
|
|
256
|
-
|
|
257
|
-
observer.observe(wrapper);
|
|
258
|
-
const table = wrapper.querySelector("table");
|
|
259
|
-
if (table !== null) observer.observe(table);
|
|
260
|
-
apply();
|
|
261
|
-
return () => {
|
|
262
|
-
observer.disconnect();
|
|
263
|
-
};
|
|
264
|
-
}, [active]);
|
|
369
|
+
});
|
|
265
370
|
return { wrapperRef, contained: active && contained };
|
|
266
371
|
}
|
|
267
372
|
function BasaltDataTable(props) {
|
|
@@ -401,7 +506,7 @@ function BasaltDataTable(props) {
|
|
|
401
506
|
if (!facets || facets.length === 0) return columns;
|
|
402
507
|
const facetById = new Map(facets.map((facet) => [facet.columnId, facet]));
|
|
403
508
|
return columns.map((column) => {
|
|
404
|
-
const id = column
|
|
509
|
+
const id = columnDefId(column);
|
|
405
510
|
const facet = id === void 0 ? void 0 : facetById.get(id);
|
|
406
511
|
if (!facet) return column;
|
|
407
512
|
const filterFn = facet.multiple ? (row, columnId, filterValue) => !Array.isArray(filterValue) || filterValue.length === 0 ? true : filterValue.includes(String(row.getValue(columnId))) : (row, columnId, filterValue) => filterValue === null || filterValue === void 0 || filterValue === "" ? true : String(row.getValue(columnId)) === filterValue;
|
|
@@ -430,6 +535,62 @@ function BasaltDataTable(props) {
|
|
|
430
535
|
const sortingEnabled = enableSorting && !breaches.includes("sorting");
|
|
431
536
|
const filteringEnabled = !breaches.includes("filtering");
|
|
432
537
|
const totalIsAuthoritative = !breaches.includes("total");
|
|
538
|
+
const scrolls = maxHeight !== void 0 || minWidth !== void 0;
|
|
539
|
+
const foldEligible = minWidth === void 0;
|
|
540
|
+
const { columnFoldOrder, columnFoldFixedIds } = useMemo(() => {
|
|
541
|
+
const pinnedIds = /* @__PURE__ */ new Set([...columnPinning.left ?? [], ...columnPinning.right ?? []]);
|
|
542
|
+
const excluded = new Set(
|
|
543
|
+
columns.flatMap((column) => {
|
|
544
|
+
const id = columnDefId(column);
|
|
545
|
+
if (id === void 0) return [];
|
|
546
|
+
return column.enableHiding === false || pinnedIds.has(id) ? [id] : [];
|
|
547
|
+
})
|
|
548
|
+
);
|
|
549
|
+
return {
|
|
550
|
+
columnFoldOrder: foldOrder(columns).filter((id) => !excluded.has(id)),
|
|
551
|
+
columnFoldFixedIds: [...excluded]
|
|
552
|
+
};
|
|
553
|
+
}, [columns, columnPinning]);
|
|
554
|
+
const columnFold = useColumnFold({
|
|
555
|
+
active: foldEligible,
|
|
556
|
+
order: columnFoldOrder,
|
|
557
|
+
fixedIds: columnFoldFixedIds
|
|
558
|
+
});
|
|
559
|
+
const columnVisibility = useMemo(
|
|
560
|
+
() => Object.fromEntries([...columnFold.folded].map((id) => [id, false])),
|
|
561
|
+
[columnFold.folded]
|
|
562
|
+
);
|
|
563
|
+
const hasFolded = columnFold.folded.size > 0;
|
|
564
|
+
const [expandedFoldRows, setExpandedFoldRows] = useState(EMPTY_FOLD_SET);
|
|
565
|
+
const toggleFoldRow = useCallback((rowId) => {
|
|
566
|
+
setExpandedFoldRows((current) => {
|
|
567
|
+
const next = new Set(current);
|
|
568
|
+
if (next.has(rowId)) next.delete(rowId);
|
|
569
|
+
else next.add(rowId);
|
|
570
|
+
return next;
|
|
571
|
+
});
|
|
572
|
+
}, []);
|
|
573
|
+
const prevDataRef = useRef(data);
|
|
574
|
+
useEffect(() => {
|
|
575
|
+
const prevData = prevDataRef.current;
|
|
576
|
+
prevDataRef.current = data;
|
|
577
|
+
setExpandedFoldRows((current) => {
|
|
578
|
+
if (current.size === 0) return current;
|
|
579
|
+
let next;
|
|
580
|
+
if (getRowId === void 0) {
|
|
581
|
+
next = new Set(
|
|
582
|
+
[...current].filter((id) => {
|
|
583
|
+
const index = Number(id);
|
|
584
|
+
return data[index] !== void 0 && data[index] === prevData[index];
|
|
585
|
+
})
|
|
586
|
+
);
|
|
587
|
+
} else {
|
|
588
|
+
const liveIds = new Set(data.map((row, index) => getRowId(row, index)));
|
|
589
|
+
next = new Set([...current].filter((id) => liveIds.has(id)));
|
|
590
|
+
}
|
|
591
|
+
return next.size === current.size ? current : next;
|
|
592
|
+
});
|
|
593
|
+
}, [data, getRowId]);
|
|
433
594
|
const table = useReactTable({
|
|
434
595
|
data,
|
|
435
596
|
columns: tableColumns,
|
|
@@ -438,6 +599,7 @@ function BasaltDataTable(props) {
|
|
|
438
599
|
globalFilter,
|
|
439
600
|
columnFilters,
|
|
440
601
|
columnPinning,
|
|
602
|
+
columnVisibility,
|
|
441
603
|
...enablePagination && { pagination },
|
|
442
604
|
...enableRowSelection && { rowSelection: rowSelectionState }
|
|
443
605
|
},
|
|
@@ -476,7 +638,7 @@ function BasaltDataTable(props) {
|
|
|
476
638
|
const branch = query === void 0 ? void 0 : dataQueryBranch("BasaltDataTable", query);
|
|
477
639
|
const showSkeleton = branch === void 0 ? isLoading : branch === "pending";
|
|
478
640
|
const queryError = branch === "error" && query !== void 0 ? query : void 0;
|
|
479
|
-
const columnCount = columns.length + (enableRowSelection ? 1 : 0);
|
|
641
|
+
const columnCount = columns.length + (enableRowSelection ? 1 : 0) + (hasFolded ? 1 : 0) - columnFold.folded.size;
|
|
480
642
|
const selectedModelRows = enableRowSelection ? table.getSelectedRowModel().rows : void 0;
|
|
481
643
|
const selectedRows = useMemo(
|
|
482
644
|
() => selectedModelRows?.map((row) => row.original) ?? [],
|
|
@@ -488,7 +650,6 @@ function BasaltDataTable(props) {
|
|
|
488
650
|
);
|
|
489
651
|
const headerGroups = enablePinning ? getOrderedHeaderGroups(table) : table.getHeaderGroups();
|
|
490
652
|
const rows = table.getRowModel().rows;
|
|
491
|
-
const scrolls = maxHeight !== void 0 || minWidth !== void 0;
|
|
492
653
|
const pageStickyHeader = !scrolls && stickyHeader === true;
|
|
493
654
|
const containment = useMeasuredContainment(pageStickyHeader);
|
|
494
655
|
const resolvedStickyHeaderOffset = scrolls ? void 0 : stickyHeaderOffset;
|
|
@@ -507,36 +668,42 @@ function BasaltDataTable(props) {
|
|
|
507
668
|
...withRowBorders !== void 0 && { withRowBorders },
|
|
508
669
|
withTableBorder,
|
|
509
670
|
children: [
|
|
510
|
-
/* @__PURE__ */ jsx(Table.Thead, { children: headerGroups.map((headerGroup) => /* @__PURE__ */
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
671
|
+
/* @__PURE__ */ jsx(Table.Thead, { children: headerGroups.map((headerGroup) => /* @__PURE__ */ jsxs(Table.Tr, { children: [
|
|
672
|
+
hasFolded && /* @__PURE__ */ jsx(Table.Th, { className: classes.foldToggleCell, "aria-hidden": true }),
|
|
673
|
+
headerGroup.headers.map((header) => {
|
|
674
|
+
const canSort = sortingEnabled && header.column.getCanSort();
|
|
675
|
+
const sorted = header.column.getIsSorted();
|
|
676
|
+
const toggleSorting = header.column.getToggleSortingHandler();
|
|
677
|
+
const pinnedStyle = enablePinning ? getPinnedCellStyle(table, header.column) : void 0;
|
|
678
|
+
const align = resolveAlign(header.column);
|
|
679
|
+
const isSelectColumn = header.column.id === SELECT_COLUMN_ID;
|
|
680
|
+
return /* @__PURE__ */ jsxs(
|
|
681
|
+
Table.Th,
|
|
682
|
+
{
|
|
683
|
+
...isSelectColumn && { className: classes.selectCell },
|
|
684
|
+
...!isSelectColumn && { [FOLD_ID_ATTR]: header.column.id },
|
|
685
|
+
onClick: canSort ? toggleSorting : void 0,
|
|
686
|
+
onKeyDown: canSort ? (event) => {
|
|
687
|
+
if (event.key !== "Enter" && event.key !== " ") return;
|
|
688
|
+
event.preventDefault();
|
|
689
|
+
toggleSorting?.(event);
|
|
690
|
+
} : void 0,
|
|
691
|
+
tabIndex: canSort ? 0 : void 0,
|
|
692
|
+
"aria-sort": canSort ? sorted === "asc" ? "ascending" : sorted === "desc" ? "descending" : "none" : void 0,
|
|
693
|
+
style: {
|
|
694
|
+
...canSort ? { cursor: "pointer", userSelect: "none" } : void 0,
|
|
695
|
+
...align !== void 0 && { textAlign: align },
|
|
696
|
+
...pinnedStyle
|
|
697
|
+
},
|
|
698
|
+
children: [
|
|
699
|
+
header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()),
|
|
700
|
+
canSort && /* @__PURE__ */ jsx(SortIndicator, { direction: sorted })
|
|
701
|
+
]
|
|
531
702
|
},
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
},
|
|
537
|
-
header.id
|
|
538
|
-
);
|
|
539
|
-
}) }, headerGroup.id)) }),
|
|
703
|
+
header.id
|
|
704
|
+
);
|
|
705
|
+
})
|
|
706
|
+
] }, headerGroup.id)) }),
|
|
540
707
|
/* @__PURE__ */ jsx(Table.Tbody, { children: queryError !== void 0 ? (
|
|
541
708
|
// The branch the table did not have (components audit #3). It spans every rendered
|
|
542
709
|
// column and carries the query's OWN `refetch` behind Retry, so the failure is reported
|
|
@@ -557,44 +724,65 @@ function BasaltDataTable(props) {
|
|
|
557
724
|
...row.getCenterVisibleCells(),
|
|
558
725
|
...row.getRightVisibleCells()
|
|
559
726
|
] : row.getVisibleCells();
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
727
|
+
const rowExpanded = hasFolded && expandedFoldRows.has(row.id);
|
|
728
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
729
|
+
/* @__PURE__ */ jsxs(
|
|
730
|
+
Table.Tr,
|
|
731
|
+
{
|
|
732
|
+
...enableRowSelection && row.getIsSelected() && { "data-selected": true },
|
|
733
|
+
...onRowActivate !== void 0 && {
|
|
734
|
+
className: classes.activatable,
|
|
735
|
+
"data-activatable": true,
|
|
736
|
+
tabIndex: 0,
|
|
737
|
+
onClick: () => onRowActivate(row.original),
|
|
738
|
+
// Enter only. Space is the browser's own page-scroll on a focused non-button, and
|
|
739
|
+
// stealing it from a keyboard reader moving down a long table costs more than the
|
|
740
|
+
// second activation key buys.
|
|
741
|
+
onKeyDown: (event) => {
|
|
742
|
+
if (event.key !== "Enter") return;
|
|
743
|
+
if (event.target !== event.currentTarget) return;
|
|
744
|
+
event.preventDefault();
|
|
745
|
+
onRowActivate(row.original);
|
|
746
|
+
}
|
|
747
|
+
},
|
|
748
|
+
children: [
|
|
749
|
+
hasFolded && /* @__PURE__ */ jsx(Table.Td, { className: classes.foldToggleCell, children: /* @__PURE__ */ jsx(
|
|
750
|
+
FoldToggle,
|
|
751
|
+
{
|
|
752
|
+
expanded: rowExpanded,
|
|
753
|
+
controlsId: `${row.id}-fold`,
|
|
754
|
+
onToggle: () => toggleFoldRow(row.id)
|
|
755
|
+
}
|
|
756
|
+
) }),
|
|
757
|
+
cells.map((cell) => {
|
|
758
|
+
const pinnedStyle = enablePinning ? getPinnedCellStyle(table, cell.column) : void 0;
|
|
759
|
+
const align = resolveAlign(cell.column);
|
|
760
|
+
return /* @__PURE__ */ jsx(
|
|
761
|
+
Table.Td,
|
|
762
|
+
{
|
|
763
|
+
...cell.column.id === SELECT_COLUMN_ID && {
|
|
764
|
+
className: classes.selectCell,
|
|
765
|
+
// The label's ::after fills the cell, so a tap on it bubbles to the row —
|
|
766
|
+
// stop it only where a tick is possible; a disabled row's tap is a row tap.
|
|
767
|
+
...cell.row.getCanSelect() && {
|
|
768
|
+
onClick: (event) => event.stopPropagation()
|
|
769
|
+
}
|
|
770
|
+
},
|
|
771
|
+
style: {
|
|
772
|
+
...typeof cell.getValue() === "number" && cell.column.columnDef.meta?.numeral !== false ? NUMERIC_CELL_STYLE : void 0,
|
|
773
|
+
...align !== void 0 && { textAlign: align },
|
|
774
|
+
...pinnedStyle
|
|
775
|
+
},
|
|
776
|
+
children: flexRender(cell.column.columnDef.cell, cell.getContext())
|
|
777
|
+
},
|
|
778
|
+
cell.id
|
|
779
|
+
);
|
|
780
|
+
})
|
|
781
|
+
]
|
|
782
|
+
}
|
|
783
|
+
),
|
|
784
|
+
rowExpanded && /* @__PURE__ */ jsx(Table.Tr, { id: `${row.id}-fold`, className: classes.foldDisclosureRowTr, children: /* @__PURE__ */ jsx(Table.Td, { colSpan: columnCount, className: classes.foldDisclosureCell, children: /* @__PURE__ */ jsx(RowDisclosure, { row, folded: columnFold.folded }) }) })
|
|
785
|
+
] }, row.id);
|
|
598
786
|
}) })
|
|
599
787
|
]
|
|
600
788
|
}
|
|
@@ -661,27 +849,36 @@ function BasaltDataTable(props) {
|
|
|
661
849
|
) })
|
|
662
850
|
] }),
|
|
663
851
|
bulkBarActions !== void 0 && /* @__PURE__ */ jsx(BulkActionBar, { count: selectedRows.length, actions: bulkBarActions }),
|
|
664
|
-
|
|
665
|
-
//
|
|
666
|
-
//
|
|
667
|
-
//
|
|
668
|
-
/* @__PURE__ */ jsx(
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
852
|
+
!foldEligible ? (
|
|
853
|
+
// An explicit `minWidth` is the one genuinely DECLARED horizontal floor — the column fold
|
|
854
|
+
// never engages here (see `foldEligible`, above), so this shape keeps its exact
|
|
855
|
+
// pre-existing DOM: no extra measuring wrapper for a table nothing folds.
|
|
856
|
+
/* @__PURE__ */ jsx(Table.ScrollContainer, { type: "native", minWidth: minWidth ?? 0, maxHeight, children: tableNode })
|
|
857
|
+
) : (
|
|
858
|
+
// The column fold's own measuring box (`useColumnFold`) — wraps every remaining shape,
|
|
859
|
+
// `maxHeight`-only included: a vertical cap is orthogonal to column width, so a
|
|
860
|
+
// `stickyHeader` + `maxHeight` table (the pairing this package's own docs recommend) still
|
|
861
|
+
// folds instead of silently regressing to horizontal scroll. A plain block box, so it
|
|
862
|
+
// constrains nothing on its own; `columnFold.wrapperRef` only reads it.
|
|
863
|
+
/* @__PURE__ */ jsx("div", { ref: columnFold.wrapperRef, className: classes.foldWrapper, children: pageStickyHeader ? (
|
|
864
|
+
// Pinning takes this wrapper too — a pinned column's offsets are `position: sticky` on
|
|
865
|
+
// the cells and need no overflow box of their own, so the `overflow-x: auto` Box that
|
|
866
|
+
// used to sit here was the exact inert-sticky defect this shape exists to avoid.
|
|
867
|
+
/* @__PURE__ */ jsx(
|
|
868
|
+
"div",
|
|
869
|
+
{
|
|
870
|
+
ref: containment.wrapperRef,
|
|
871
|
+
className: classes.containment,
|
|
872
|
+
"data-contained": containment.contained ? "true" : "false",
|
|
873
|
+
children: tableNode
|
|
874
|
+
}
|
|
875
|
+
)
|
|
876
|
+
) : maxHeight !== void 0 ? (
|
|
877
|
+
// `pageStickyHeader` is already false whenever `maxHeight` is set (`scrolls` above), so
|
|
878
|
+
// this is the ONE remaining case: a vertical cap with no sticky header to measure —
|
|
879
|
+
// still wants its own `ScrollArea` scrollport, just with no `minWidth` floor.
|
|
880
|
+
/* @__PURE__ */ jsx(Table.ScrollContainer, { type: "native", minWidth: 0, maxHeight, children: tableNode })
|
|
881
|
+
) : /* @__PURE__ */ jsx(Table.ScrollContainer, { type: "native", minWidth: 0, children: tableNode }) })
|
|
685
882
|
),
|
|
686
883
|
enablePagination && /* @__PURE__ */ jsxs(
|
|
687
884
|
Group,
|
|
@@ -713,7 +910,7 @@ function BasaltDataTable(props) {
|
|
|
713
910
|
allowDeselect: false
|
|
714
911
|
}
|
|
715
912
|
),
|
|
716
|
-
/* @__PURE__ */ jsx(
|
|
913
|
+
/* @__PURE__ */ jsx(CtlSlot, { children: /* @__PURE__ */ jsx(
|
|
717
914
|
Pagination,
|
|
718
915
|
{
|
|
719
916
|
size: "sm",
|
|
@@ -722,7 +919,7 @@ function BasaltDataTable(props) {
|
|
|
722
919
|
value: paginationState.pageIndex + 1,
|
|
723
920
|
onChange: (page) => table.setPageIndex(page - 1)
|
|
724
921
|
}
|
|
725
|
-
)
|
|
922
|
+
) })
|
|
726
923
|
] })
|
|
727
924
|
]
|
|
728
925
|
}
|
|
@@ -730,5 +927,6 @@ function BasaltDataTable(props) {
|
|
|
730
927
|
] });
|
|
731
928
|
}
|
|
732
929
|
export {
|
|
733
|
-
BasaltDataTable
|
|
930
|
+
BasaltDataTable,
|
|
931
|
+
planColumnFold
|
|
734
932
|
};
|