@crispy-seed/data-table 0.11.1 → 0.12.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/dist/data-table-recipe.css +17 -2
- package/dist/data-table-recipe.layered.css +19 -2
- package/dist/index.cjs +305 -51
- package/dist/index.d.ts +27 -0
- package/dist/index.js +305 -51
- package/dist/styles.css +19 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1160,6 +1160,51 @@ function isStringArray(value) {
|
|
|
1160
1160
|
/** Removes the view with this `id`. */ function removeDataTableView(views, id) {
|
|
1161
1161
|
return views.filter((view)=>view.id !== id);
|
|
1162
1162
|
}
|
|
1163
|
+
// -- row virtualization ---------------------------------------------------------------
|
|
1164
|
+
// `virtualized` renders only the rows inside (and a little around) the scroll
|
|
1165
|
+
// container's viewport, with two spacer rows standing in for the rest so the scroll
|
|
1166
|
+
// height -- and therefore the scrollbar -- still matches the full data set. Rows are a
|
|
1167
|
+
// fixed height, so which rows are visible is plain arithmetic on `scrollTop`; no
|
|
1168
|
+
// per-row measurement, no ResizeObserver per row.
|
|
1169
|
+
/** The recipe's own row height (`--seed-dimension-x9` = 36px, `row.height`). */ const DEFAULT_VIRTUAL_ROW_HEIGHT = 36;
|
|
1170
|
+
/** Rows rendered beyond each edge of the viewport, so a fast scroll never outruns the
|
|
1171
|
+
* render and flashes an empty gap. */ const DEFAULT_VIRTUAL_OVERSCAN = 8;
|
|
1172
|
+
/** Distance from the bottom (px) at which `onLoadMore` fires in virtualized mode --
|
|
1173
|
+
* the same 160px look-ahead the IntersectionObserver's rootMargin gives a non-
|
|
1174
|
+
* virtualized table. */ const LOAD_MORE_THRESHOLD = 160;
|
|
1175
|
+
/**
|
|
1176
|
+
* Which slice `[start, end)` of `count` uniform-height rows to render for a viewport,
|
|
1177
|
+
* plus the heights of the two spacers that keep the total scroll height at
|
|
1178
|
+
* `count * rowHeight` (`topSpacer + rendered rows + bottomSpacer`). Pure -- the hook
|
|
1179
|
+
* measures the DOM, this decides.
|
|
1180
|
+
*/ function computeVirtualWindow(input) {
|
|
1181
|
+
const { count, rowHeight, viewportHeight, overscan } = input;
|
|
1182
|
+
if (count <= 0 || rowHeight <= 0) return {
|
|
1183
|
+
start: 0,
|
|
1184
|
+
end: 0,
|
|
1185
|
+
topSpacer: 0,
|
|
1186
|
+
bottomSpacer: 0
|
|
1187
|
+
};
|
|
1188
|
+
const scrollTop = Math.max(0, input.scrollTop);
|
|
1189
|
+
const firstVisible = Math.floor(scrollTop / rowHeight);
|
|
1190
|
+
const lastVisibleExclusive = Math.ceil((scrollTop + Math.max(0, viewportHeight)) / rowHeight);
|
|
1191
|
+
const start = Math.min(count, Math.max(0, firstVisible - overscan));
|
|
1192
|
+
const end = Math.min(count, Math.max(start, lastVisibleExclusive + overscan));
|
|
1193
|
+
return {
|
|
1194
|
+
start,
|
|
1195
|
+
end,
|
|
1196
|
+
topSpacer: start * rowHeight,
|
|
1197
|
+
bottomSpacer: (count - end) * rowHeight
|
|
1198
|
+
};
|
|
1199
|
+
}
|
|
1200
|
+
/**
|
|
1201
|
+
* Scroll-position replacement for the sentinel row's IntersectionObserver: a
|
|
1202
|
+
* virtualized table can't rely on a sentinel (it would be windowed out along with the
|
|
1203
|
+
* rows), so "close enough to the bottom" is read straight off the scroll container.
|
|
1204
|
+
* The 1px slop matches `useDataTableScroll`'s own sub-pixel tolerance.
|
|
1205
|
+
*/ function isNearBottom(scrollTop, clientHeight, scrollHeight, threshold = LOAD_MORE_THRESHOLD) {
|
|
1206
|
+
return scrollTop + clientHeight >= scrollHeight - threshold - 1;
|
|
1207
|
+
}
|
|
1163
1208
|
const EMPTY_STRINGS = [];
|
|
1164
1209
|
const EMPTY_RECORD = {};
|
|
1165
1210
|
/**
|
|
@@ -1491,7 +1536,7 @@ const ROOT_MARGIN = "160px";
|
|
|
1491
1536
|
* wires this to useDataTableScroll's own scroll container) so a BOUNDED table
|
|
1492
1537
|
* triggers off its own internal scroll, not the browsing viewport.
|
|
1493
1538
|
*/ function useDataTableInfiniteScroll(props) {
|
|
1494
|
-
const { onLoadMore, hasMore = true, loadingMore: loadingMoreProp, scrollRootRef } = props;
|
|
1539
|
+
const { onLoadMore, hasMore = true, loadingMore: loadingMoreProp, scrollRootRef, virtualized = false } = props;
|
|
1495
1540
|
const [internalLoadingMore, setInternalLoadingMore] = useState(false);
|
|
1496
1541
|
const loadingMore = loadingMoreProp ?? internalLoadingMore;
|
|
1497
1542
|
// Mirrors the latest props into a ref the observer callback reads -- the callback
|
|
@@ -1531,6 +1576,7 @@ const ROOT_MARGIN = "160px";
|
|
|
1531
1576
|
const [sentinelNode, setSentinelNode] = useState(null);
|
|
1532
1577
|
const sentinelRef = useCallback((node)=>setSentinelNode(node), []);
|
|
1533
1578
|
useEffect(()=>{
|
|
1579
|
+
if (virtualized) return;
|
|
1534
1580
|
if (!sentinelNode || !onLoadMore || typeof IntersectionObserver === "undefined") return;
|
|
1535
1581
|
// Effects run after every ref callback of the SAME commit (including
|
|
1536
1582
|
// `scrollRootRef`'s own, set by useDataTableScroll's `scrollAreaRef`) regardless
|
|
@@ -1551,6 +1597,23 @@ const ROOT_MARGIN = "160px";
|
|
|
1551
1597
|
sentinelNode,
|
|
1552
1598
|
onLoadMore,
|
|
1553
1599
|
scrollRootRef,
|
|
1600
|
+
triggerLoadMore,
|
|
1601
|
+
virtualized
|
|
1602
|
+
]);
|
|
1603
|
+
// Virtualized mode's trigger: near the bottom of the scroll container (same gate --
|
|
1604
|
+
// `hasMore`, not already loading -- via `triggerLoadMore`). Called on every scroll
|
|
1605
|
+
// and again after the row count / loading state changes (a page that lands while
|
|
1606
|
+
// the user is still at the bottom, or too short to overflow, must chain the next
|
|
1607
|
+
// load rather than wait for a scroll that can never come).
|
|
1608
|
+
const checkScrollPosition = useCallback(()=>{
|
|
1609
|
+
const element = scrollRootRef?.current;
|
|
1610
|
+
if (!virtualized || !element) return;
|
|
1611
|
+
if (isNearBottom(element.scrollTop, element.clientHeight, element.scrollHeight)) {
|
|
1612
|
+
triggerLoadMore();
|
|
1613
|
+
}
|
|
1614
|
+
}, [
|
|
1615
|
+
virtualized,
|
|
1616
|
+
scrollRootRef,
|
|
1554
1617
|
triggerLoadMore
|
|
1555
1618
|
]);
|
|
1556
1619
|
return {
|
|
@@ -1564,7 +1627,9 @@ const ROOT_MARGIN = "160px";
|
|
|
1564
1627
|
/** Fires `onLoadMore` directly, subject to the same `hasMore`/`loadingMore` gate
|
|
1565
1628
|
* the observer itself uses -- exposed for a consumer that wants a manual retry
|
|
1566
1629
|
* affordance (e.g. after a failed load) rather than only the observer's own
|
|
1567
|
-
* scroll trigger. */ triggerLoadMore
|
|
1630
|
+
* scroll trigger. */ triggerLoadMore,
|
|
1631
|
+
/** Virtualized mode's scroll-position check (no-op otherwise); `useDataTable`
|
|
1632
|
+
* calls it from the scroll container's `onScroll`. */ checkScrollPosition
|
|
1568
1633
|
};
|
|
1569
1634
|
}
|
|
1570
1635
|
|
|
@@ -1576,19 +1641,53 @@ const ROOT_MARGIN = "160px";
|
|
|
1576
1641
|
* real ref to a real scrollable element, re-measured on every scroll (and whenever the
|
|
1577
1642
|
* styled layer calls `remeasure`, e.g. after a column resize/reorder changes the
|
|
1578
1643
|
* scrollable width without the element itself ever firing a `scroll` event).
|
|
1579
|
-
*/ function useDataTableScroll() {
|
|
1644
|
+
*/ function useDataTableScroll(props = {}) {
|
|
1645
|
+
const { virtualized = false, rowHeight = DEFAULT_VIRTUAL_ROW_HEIGHT } = props;
|
|
1646
|
+
const overscan = props.overscan ?? DEFAULT_VIRTUAL_OVERSCAN;
|
|
1580
1647
|
const elementRef = useRef(null);
|
|
1581
1648
|
const [scrolledStart, setScrolledStart] = useState(false);
|
|
1582
1649
|
const [scrolledEnd, setScrolledEnd] = useState(false);
|
|
1650
|
+
const [viewport, setViewport] = useState({
|
|
1651
|
+
scrollTop: 0,
|
|
1652
|
+
viewportHeight: 0
|
|
1653
|
+
});
|
|
1583
1654
|
const remeasure = useCallback(()=>{
|
|
1584
1655
|
const element = elementRef.current;
|
|
1585
1656
|
if (!element) return;
|
|
1657
|
+
if (virtualized) {
|
|
1658
|
+
// Row 0 starts below the sticky header, so measure from there. Snapping to whole
|
|
1659
|
+
// rows keeps re-renders to one per row scrolled (not one per scroll event); the
|
|
1660
|
+
// extra `rowHeight` of viewport makes up for the rows the snap rounded away.
|
|
1661
|
+
const headerHeight = element.querySelector("thead")?.offsetHeight ?? 0;
|
|
1662
|
+
const scrollTop = Math.max(0, element.scrollTop - headerHeight);
|
|
1663
|
+
const snapped = Math.floor(scrollTop / rowHeight) * rowHeight;
|
|
1664
|
+
const viewportHeight = element.clientHeight + rowHeight;
|
|
1665
|
+
setViewport((prev)=>prev.scrollTop === snapped && prev.viewportHeight === viewportHeight ? prev : {
|
|
1666
|
+
scrollTop: snapped,
|
|
1667
|
+
viewportHeight
|
|
1668
|
+
});
|
|
1669
|
+
}
|
|
1586
1670
|
setScrolledStart(element.scrollLeft > 0);
|
|
1587
1671
|
// A 1px slop: sub-pixel layout can leave `scrollLeft + clientWidth` a fraction
|
|
1588
1672
|
// short of `scrollWidth` even when fully scrolled, which would otherwise leave
|
|
1589
1673
|
// the trailing shadow stuck on forever.
|
|
1590
1674
|
setScrolledEnd(element.scrollLeft + element.clientWidth < element.scrollWidth - 1);
|
|
1591
|
-
}, [
|
|
1675
|
+
}, [
|
|
1676
|
+
virtualized,
|
|
1677
|
+
rowHeight
|
|
1678
|
+
]);
|
|
1679
|
+
// The container can resize without scrolling (window resize, a bounded parent
|
|
1680
|
+
// changing height) -- the viewport height feeds the window, so re-measure then too.
|
|
1681
|
+
useEffect(()=>{
|
|
1682
|
+
const element = elementRef.current;
|
|
1683
|
+
if (!virtualized || !element || typeof ResizeObserver === "undefined") return;
|
|
1684
|
+
const observer = new ResizeObserver(()=>remeasure());
|
|
1685
|
+
observer.observe(element);
|
|
1686
|
+
return ()=>observer.disconnect();
|
|
1687
|
+
}, [
|
|
1688
|
+
virtualized,
|
|
1689
|
+
remeasure
|
|
1690
|
+
]);
|
|
1592
1691
|
const scrollAreaRef = useCallback((node)=>{
|
|
1593
1692
|
elementRef.current = node;
|
|
1594
1693
|
if (node) remeasure();
|
|
@@ -1604,6 +1703,12 @@ const ROOT_MARGIN = "160px";
|
|
|
1604
1703
|
scrolledEnd,
|
|
1605
1704
|
onScroll,
|
|
1606
1705
|
remeasure,
|
|
1706
|
+
/** Row-virtualization state; `enabled: false` (the default) means render every row. */ virtual: {
|
|
1707
|
+
enabled: virtualized,
|
|
1708
|
+
rowHeight,
|
|
1709
|
+
overscan,
|
|
1710
|
+
...viewport
|
|
1711
|
+
},
|
|
1607
1712
|
// The raw ref object itself (not just the callback ref above) -- useDataTable.ts
|
|
1608
1713
|
// hands this to useDataTableInfiniteScroll as the IntersectionObserver `root` for
|
|
1609
1714
|
// its sentinel row, so a scrolled/bounded table (DATATABLE-ATTIO-SPEC.md's
|
|
@@ -2002,7 +2107,7 @@ function useDataTable(props) {
|
|
|
2002
2107
|
const toolbarFilter = useDataTableToolbarFilter(props);
|
|
2003
2108
|
const columns = useDataTableColumns(props);
|
|
2004
2109
|
const columnCalc = useDataTableColumnCalc(props);
|
|
2005
|
-
const scroll = useDataTableScroll();
|
|
2110
|
+
const scroll = useDataTableScroll(props);
|
|
2006
2111
|
const edit = useDataTableEdit(props);
|
|
2007
2112
|
// Feature C (#12) -- which single cell (if any) is showing its read-only "show
|
|
2008
2113
|
// full content" overlay. Independent of `edit` above -- see
|
|
@@ -2016,6 +2121,28 @@ function useDataTable(props) {
|
|
|
2016
2121
|
...props,
|
|
2017
2122
|
scrollRootRef: scroll.elementRef
|
|
2018
2123
|
});
|
|
2124
|
+
// Virtualized mode swaps the sentinel's IntersectionObserver for a scroll-position
|
|
2125
|
+
// check: on every scroll (below), and again whenever the row count or loading state
|
|
2126
|
+
// changes -- new rows can leave the user still at the bottom.
|
|
2127
|
+
const { checkScrollPosition } = infiniteScroll;
|
|
2128
|
+
const rowCount = props.rowIds?.length;
|
|
2129
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: rowCount/loadingMore/hasMore are the triggers, not values read in the effect
|
|
2130
|
+
useEffect(()=>{
|
|
2131
|
+
checkScrollPosition();
|
|
2132
|
+
}, [
|
|
2133
|
+
checkScrollPosition,
|
|
2134
|
+
rowCount,
|
|
2135
|
+
infiniteScroll.loadingMore,
|
|
2136
|
+
infiniteScroll.hasMore
|
|
2137
|
+
]);
|
|
2138
|
+
const { onScroll: measureScroll } = scroll;
|
|
2139
|
+
const onScroll = useCallback(()=>{
|
|
2140
|
+
measureScroll();
|
|
2141
|
+
checkScrollPosition();
|
|
2142
|
+
}, [
|
|
2143
|
+
measureScroll,
|
|
2144
|
+
checkScrollPosition
|
|
2145
|
+
]);
|
|
2019
2146
|
// Unifies `sort` (the header's own single click-to-sort column, above) with
|
|
2020
2147
|
// `toolbarSort.toolbarSorts` (the toolbar Sort popover's ordered list, above) into
|
|
2021
2148
|
// ONE state instead of two -- before this, a header click only ever moved `sort`,
|
|
@@ -2127,6 +2254,7 @@ function useDataTable(props) {
|
|
|
2127
2254
|
...edit,
|
|
2128
2255
|
...peek,
|
|
2129
2256
|
...infiniteScroll,
|
|
2257
|
+
onScroll,
|
|
2130
2258
|
rootProps: elementProps({
|
|
2131
2259
|
role: "table"
|
|
2132
2260
|
})
|
|
@@ -2169,7 +2297,7 @@ function useDataTableRowContext({ strict = true } = {}) {
|
|
|
2169
2297
|
return context;
|
|
2170
2298
|
}
|
|
2171
2299
|
const DataTableRoot = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
2172
|
-
const { sort, defaultSort, onSortChange, rowIds, selectable, selectedIds, defaultSelectedIds, onSelectionChange, query, defaultQuery, onQueryChange, toolbarSorts, defaultToolbarSorts, onToolbarSortsChange, toolbarFilters, defaultToolbarFilters, onToolbarFiltersChange, columnKeys, actionsColumnKey, columnOrder, defaultColumnOrder, onColumnOrderChange, hiddenColumnKeys, defaultHiddenColumnKeys, onHiddenColumnKeysChange, columnWidths, defaultColumnWidths, onColumnWidthsChange, columnLabels, defaultColumnLabels, onColumnLabelsChange, pinnedColumnKeys, defaultPinnedColumnKeys, onPinnedColumnKeysChange, columnCalcOps, defaultColumnCalcOps, onColumnCalcOpsChange, onEdit, onLoadMore, hasMore, loadingMore, ...otherProps } = props;
|
|
2300
|
+
const { sort, defaultSort, onSortChange, rowIds, selectable, selectedIds, defaultSelectedIds, onSelectionChange, query, defaultQuery, onQueryChange, toolbarSorts, defaultToolbarSorts, onToolbarSortsChange, toolbarFilters, defaultToolbarFilters, onToolbarFiltersChange, columnKeys, actionsColumnKey, columnOrder, defaultColumnOrder, onColumnOrderChange, hiddenColumnKeys, defaultHiddenColumnKeys, onHiddenColumnKeysChange, columnWidths, defaultColumnWidths, onColumnWidthsChange, columnLabels, defaultColumnLabels, onColumnLabelsChange, pinnedColumnKeys, defaultPinnedColumnKeys, onPinnedColumnKeysChange, columnCalcOps, defaultColumnCalcOps, onColumnCalcOpsChange, onEdit, onLoadMore, hasMore, loadingMore, virtualized, rowHeight, overscan, ...otherProps } = props;
|
|
2173
2301
|
const api = useDataTable({
|
|
2174
2302
|
sort,
|
|
2175
2303
|
defaultSort,
|
|
@@ -2211,7 +2339,10 @@ const DataTableRoot = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
|
2211
2339
|
onEdit,
|
|
2212
2340
|
onLoadMore,
|
|
2213
2341
|
hasMore,
|
|
2214
|
-
loadingMore
|
|
2342
|
+
loadingMore,
|
|
2343
|
+
virtualized,
|
|
2344
|
+
rowHeight,
|
|
2345
|
+
overscan
|
|
2215
2346
|
});
|
|
2216
2347
|
return /*#__PURE__*/ jsx(DataTableProvider, {
|
|
2217
2348
|
value: api,
|
|
@@ -2992,6 +3123,40 @@ function EntityCell({ value, className, nameClassName, actionsClassName, actionC
|
|
|
2992
3123
|
name: String(value ?? "")
|
|
2993
3124
|
};
|
|
2994
3125
|
if (!entity.name) return null;
|
|
3126
|
+
// Click-to-navigate (your-moon/crisp, Attio parity) -- `onOpenRecord` wins over a
|
|
3127
|
+
// plain `href` when both are set (see `onOpenRecord`'s own doc comment,
|
|
3128
|
+
// `DataTable.tsx`); neither -> the original plain, non-clickable `<span>`. Both
|
|
3129
|
+
// clickable variants carry `data-clickable` -- the ONLY thing the recipe's
|
|
3130
|
+
// `entityName` hover-underline rule keys off (`data-table.ts`), so a plain name
|
|
3131
|
+
// never underlines and a clickable one always does, regardless of which variant
|
|
3132
|
+
// rendered it.
|
|
3133
|
+
const nameNode = column?.onOpenRecord && row !== undefined ? // A real `<button>`, not a `<span role="link">` -- `onOpenRecord` is an
|
|
3134
|
+
// arbitrary consumer callback (like `onOpenPreview`'s own button below), never
|
|
3135
|
+
// a genuine URL, so `<button>` is the correct semantic element (native
|
|
3136
|
+
// keyboard activation/focusability for free, no `role`/`tabIndex`/`onKeyDown`
|
|
3137
|
+
// needed) -- unlike the `href` branch just below, which IS a real URL and
|
|
3138
|
+
// gets a real `<a>`. The recipe's `entityName` slot resets this button's own
|
|
3139
|
+
// chrome (border/background/padding/font/color/text-align) back to plain
|
|
3140
|
+
// inline text (`data-table.ts`).
|
|
3141
|
+
/*#__PURE__*/ jsx("button", {
|
|
3142
|
+
type: "button",
|
|
3143
|
+
className: nameClassName,
|
|
3144
|
+
"data-clickable": "",
|
|
3145
|
+
onClick: (event)=>{
|
|
3146
|
+
event.stopPropagation();
|
|
3147
|
+
column.onOpenRecord?.(row);
|
|
3148
|
+
},
|
|
3149
|
+
children: entity.name
|
|
3150
|
+
}) : entity.href ? /*#__PURE__*/ jsx("a", {
|
|
3151
|
+
className: nameClassName,
|
|
3152
|
+
"data-clickable": "",
|
|
3153
|
+
href: entity.href,
|
|
3154
|
+
onClick: (event)=>event.stopPropagation(),
|
|
3155
|
+
children: entity.name
|
|
3156
|
+
}) : /*#__PURE__*/ jsx("span", {
|
|
3157
|
+
className: nameClassName,
|
|
3158
|
+
children: entity.name
|
|
3159
|
+
});
|
|
2995
3160
|
return /*#__PURE__*/ jsxs("span", {
|
|
2996
3161
|
className: className,
|
|
2997
3162
|
children: [
|
|
@@ -3007,10 +3172,7 @@ function EntityCell({ value, className, nameClassName, actionsClassName, actionC
|
|
|
3007
3172
|
})
|
|
3008
3173
|
]
|
|
3009
3174
|
}),
|
|
3010
|
-
|
|
3011
|
-
className: nameClassName,
|
|
3012
|
-
children: entity.name
|
|
3013
|
-
}),
|
|
3175
|
+
nameNode,
|
|
3014
3176
|
column?.onOpenPreview && row !== undefined && /*#__PURE__*/ jsx("span", {
|
|
3015
3177
|
className: actionsClassName,
|
|
3016
3178
|
children: /*#__PURE__*/ jsx("button", {
|
|
@@ -3945,7 +4107,7 @@ const TextFieldTextarea = /*#__PURE__*/ forwardRef(({ className, autoresize = tr
|
|
|
3945
4107
|
});
|
|
3946
4108
|
TextFieldTextarea.displayName = "TextFieldTextarea";
|
|
3947
4109
|
|
|
3948
|
-
__insertCSS(".seed-data-table__root{box-sizing:border-box;position:relative;display:flex;flex-direction:column;width:100%;border-width:1px;border-style:solid;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif}.seed-data-table__table{width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.seed-data-table__headerCell{box-sizing:border-box;position:sticky;top:0;z-index:2;vertical-align:middle;text-align:start;padding:0;height:var(--seed-dimension-x10);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium);letter-spacing:-.14px}.seed-data-table__headerCell:last-child{border-inline-end:none}.seed-data-table__headerCell[data-sortable]{cursor:pointer;user-select:none}.seed-data-table__headerCell [data-chevron]{opacity:0;transition:opacity .12s}.seed-data-table__headerCell[data-sortable]:hover [data-chevron]{opacity:.6}.seed-data-table__headerCell[data-sorted] [data-chevron]{opacity:1;color:var(--seed-color-fg-neutral)}.seed-data-table__headerCell:hover [data-column-menu]{opacity:1}.seed-data-table__headerCell [data-column-menu]:focus-visible,.seed-data-table__headerCell [data-column-menu][data-open]{opacity:1}.seed-data-table__headerCell[data-dragging]{opacity:.5}.seed-data-table__headerCell[data-sticky]{position:sticky;z-index:3;background-color:var(--seed-color-bg-layer-default)}.seed-data-table__headerCell{outline:var(--seed-dimension-x0_5) solid transparent;outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell:is(:focus-visible,[data-focus-visible]){outline:var(--seed-dimension-x0_5) solid var(--seed-color-stroke-focus-ring);outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell .seed-data-table-resize-handle{position:absolute;top:0;inset-inline-end:calc(7px / -2);width:7px;height:100%;z-index:4;display:flex;align-items:center;justify-content:center;cursor:col-resize;touch-action:none}.seed-data-table__headerCell .seed-data-table-resize-handle-inner{width:3px;height:100%;border-radius:3px;background-color:#0298d9;opacity:0;transition:opacity .1s}.seed-data-table__headerCell .seed-data-table-resize-handle:hover .seed-data-table-resize-handle-inner,.seed-data-table__headerCell .seed-data-table-resize-handle[data-resizing] .seed-data-table-resize-handle-inner{opacity:1}.seed-data-table__headerCellInner{box-sizing:border-box;display:flex;align-items:center;width:100%;height:100%;min-width:0;gap:var(--seed-dimension-x1_5);padding-inline:var(--seed-dimension-x3)}.seed-data-table__headerCellLabel{min-width:0;flex:1 1 0%;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__headerCellIcon{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;justify-content:center;width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-subtle);border:none;background:0 0;padding:0;font:inherit;cursor:pointer}.seed-data-table__headerCellIcon[data-active]{color:var(--seed-color-fg-neutral)}.seed-data-table__headerCellIcon[data-column-menu]{opacity:0;transition:opacity .12s}.seed-data-table__row{position:relative;background-color:var(--seed-color-bg-layer-default);--seed-data-table-row-bg:var(--seed-color-bg-layer-default)}.seed-data-table__row[data-clickable]{cursor:pointer}.seed-data-table__row:is([aria-selected=true],[data-selected]){background-color:color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default));--seed-data-table-row-bg:color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default))}.seed-data-table__row:is([aria-selected=true],[data-selected]):is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default)));--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default)))}.seed-data-table__cell{box-sizing:border-box;position:relative;vertical-align:middle;text-align:start;height:var(--seed-dimension-x9);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-top:none;border-inline-start:none;padding-block:0;padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-regular);letter-spacing:-.14px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cell:not([data-editable]){user-select:none}.seed-data-table__cell:last-child{border-inline-end:none}tbody tr:last-child .seed-data-table__cell{border-bottom:none}.seed-data-table__cell[data-numeric]{text-align:end;font-variant-numeric:tabular-nums}.seed-data-table__cell[data-sticky]{position:sticky;z-index:1;background-color:var(--seed-data-table-row-bg)}.seed-data-table__cell[data-overlay-open]{overflow:visible;z-index:20}.seed-data-table__cell[data-editable]{cursor:default}.seed-data-table__cell .seed-data-table-edit-picker{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);min-width:0}.seed-data-table__cell .seed-data-table-edit-pending{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);animation:rotate .6s linear infinite}.seed-data-table__cell .seed-data-table-edit-error{position:absolute;top:100%;inset-inline-start:var(--seed-dimension-x3);inset-inline-end:var(--seed-dimension-x3);z-index:2;padding-top:2px;font-size:12px;line-height:1.3;color:var(--seed-color-fg-critical);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entity{display:flex;align-items:center;min-width:0;gap:var(--seed-dimension-x1_5)}.seed-data-table__entityName{min-width:0;font-weight:var(--seed-font-weight-medium);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__tagList{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);overflow:hidden;min-width:0}.seed-data-table__entityActions{display:flex;align-items:center;gap:6px;margin-inline-start:auto;flex-shrink:0;opacity:0;transition:opacity .15s}tr:hover .seed-data-table__entityActions{opacity:1}.seed-data-table__entityActions:focus-within{opacity:1}.seed-data-table__entityAction{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;flex-shrink:0;transition:background-color .2s,color .2s,box-shadow .2s}.seed-data-table__entityAction:hover{background:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__link{color:var(--seed-color-fg-neutral);text-decoration:none;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__link:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__chip{box-sizing:border-box;display:inline-flex;align-items:center;flex-shrink:0;max-width:100%;height:22px;padding:0 4px;border-radius:7px;font-size:10px;font-weight:var(--seed-font-weight-regular);line-height:15px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__chipList{position:relative;display:flex;align-items:center;flex-wrap:nowrap;gap:3px;overflow:hidden;min-width:0;width:100%}.seed-data-table__chipOverflow{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:20px;padding:0 4px;border-radius:6px;background-color:#f6f7f7;color:#000;font-size:10px;font-weight:var(--seed-font-weight-regular);line-height:15px;white-space:nowrap}.seed-data-table__chipListEditor{display:flex;align-items:center;flex-wrap:wrap;gap:3px;min-width:0;width:100%}.seed-data-table__chipRemove{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:12px;height:12px;margin:0;margin-inline-start:2px;padding:0;border:none;border-radius:999px;background:0 0;color:inherit;opacity:.6;cursor:pointer;transition:opacity .12s,background-color .12s}.seed-data-table__chipRemove:hover{opacity:1;background-color:rgba(0,0,0,.08)}.seed-data-table__chipInput{flex:1 1 auto;min-width:40px;height:22px;margin:0;padding:0;border:none;outline:0;background:0 0;font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);letter-spacing:-.14px}.seed-data-table__expandOverlay{box-sizing:border-box;position:absolute;top:-1px;inset-inline-start:-1px;inset-inline-end:-1px;z-index:10;min-height:calc(100% + 2px);display:flex;align-items:flex-start;padding-inline:var(--seed-dimension-x3);padding-block:var(--seed-dimension-x3);background-color:var(--seed-color-bg-layer-floating);border-radius:4px;box-shadow:none;border:1px solid #266df0;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);letter-spacing:-.14px;cursor:default}.seed-data-table__expandOverlayText{width:100%;min-width:0;white-space:normal;word-break:break-word}.seed-data-table__cellSuffixRow{display:flex;align-items:center;gap:4px;min-width:0;width:100%}.seed-data-table__cellSuffixText{flex:1 1 0%;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cellSuffixIcon{flex-shrink:0;display:inline-flex;align-items:center;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent)}.seed-data-table__toolbar{box-sizing:border-box;display:flex;align-items:center;width:100%;flex-shrink:0;min-height:49px;gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x3);border-top:1px solid var(--seed-color-stroke-neutral-muted)}.seed-data-table__search{position:relative;display:inline-flex;align-items:center;flex:1 1 0%;max-width:280px}.seed-data-table__search svg{position:absolute;inset-inline-start:var(--seed-dimension-x2);width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-muted);pointer-events:none}.seed-data-table__search input{width:100%;height:var(--seed-dimension-x8);padding-inline-start:var(--seed-dimension-x7);padding-inline-end:var(--seed-dimension-x2);border:none;border-radius:var(--seed-radius-r2);background-color:var(--seed-color-bg-layer-default);box-shadow:inset 0 0 0 1px var(--seed-color-stroke-neutral-weak);font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);outline:0;transition:box-shadow .1s var(--seed-timing-function-easing)}.seed-data-table__search input::placeholder{color:var(--seed-color-fg-neutral-subtle)}.seed-data-table__search input:focus{box-shadow:inset 0 0 0 2px var(--seed-color-stroke-neutral-contrast)}.seed-data-table__count{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t3);font-variant-numeric:tabular-nums}.seed-data-table__toolbarEnd{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;gap:var(--seed-dimension-x2)}.seed-data-table__scrollArea{position:relative;display:flex;flex-direction:column;width:100%;min-width:0;flex:1 1 auto;min-height:0;overflow-x:auto;overflow-y:auto}.seed-data-table__scrollArea[data-scrolled-start] [data-sticky-edge]{clip-path:inset(0 -38px 0 0);box-shadow:6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__scrollArea[data-scrolled-end] [data-sticky-edge-end]{clip-path:inset(0 0 0 -38px);box-shadow:-6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__footerCell{box-sizing:border-box;position:sticky;bottom:0;z-index:2;vertical-align:middle;padding:0;height:var(--seed-dimension-x9);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none}.seed-data-table__footerCell:last-child{border-inline-end:none}.seed-data-table__footerCell .seed-data-table-column-calc-trigger{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);width:100%;height:100%;min-width:0;margin:0;padding:0 var(--seed-dimension-x3);border:none;background:0 0;color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap;overflow:clip;cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__footerCell .seed-data-table-column-calc-trigger:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__footerCell .seed-data-table-column-calc-trigger[data-align=right]{justify-content:flex-end}.seed-data-table__footerCell .seed-data-table-column-calc-trigger svg{flex-shrink:0;opacity:.7}.seed-data-table__footerCell .seed-data-table-column-calc-placeholder{overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-value{min-width:0;flex-shrink:1;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-op{min-width:0;flex-shrink:1;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__emptyState{box-sizing:border-box;text-align:center;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t4)}.seed-data-table__loadingState{box-sizing:border-box;display:flex;align-items:center;justify-content:center;gap:10px;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium)}.seed-data-table__loadingState[data-inline]{padding-block:0;padding-inline:0;height:var(--seed-dimension-x9)}.seed-data-table__loadingState .seed-data-table-loading-spinner{flex-shrink:0;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);animation:rotate .6s linear infinite}.seed-data-table__addRowCell{box-sizing:border-box;padding:0;border-top:none}.seed-data-table__addRow{box-sizing:border-box;display:flex;align-items:center;width:100%;margin:0;border:none;border-top:1px solid var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);height:var(--seed-dimension-x9);gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x2);color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__addRow:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,var(--seed-color-bg-layer-default));color:var(--seed-color-fg-neutral)}.seed-data-table__addRow svg{flex-shrink:0}.seed-data-table__selectionCell{text-align:center;padding:0}.seed-data-table__bulkBar{box-sizing:border-box;position:absolute;inset-inline-start:50%;transform:translateX(-50%);bottom:var(--seed-dimension-x4);z-index:30;display:flex;align-items:center;gap:var(--seed-dimension-x3);min-height:36px;padding-inline:var(--seed-dimension-x3_5);padding-block:var(--seed-dimension-x2);border-radius:var(--seed-radius-full);box-shadow:var(--seed-shadow-s3);background-color:var(--seed-color-bg-layer-floating);color:var(--seed-color-fg-neutral);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap}.seed-data-table__bulkBarCount{flex-shrink:0;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums}.seed-data-table__bulkBarClear{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;transition:background-color .2s,color .2s}.seed-data-table__bulkBarClear:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 8%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__bulkBarActions{display:flex;align-items:center;flex-shrink:0;gap:var(--seed-dimension-x3);padding-inline-start:var(--seed-dimension-x3);border-inline-start:1px solid color-mix(in srgb,var(--seed-color-fg-neutral) 16%,transparent)}.seed-data-table__root--surface_card{border-color:var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);border-radius:var(--seed-radius-r3)}.seed-data-table__root--surface_bleed{border-color:var(--seed-color-bg-transparent);background-color:var(--seed-color-bg-transparent)}.seed-data-table__row--interactive_true{transition:background-color .12s}.seed-data-table__row--interactive_true:is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,transparent);--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, var(--seed-color-bg-layer-default))}");
|
|
4110
|
+
__insertCSS(".seed-data-table__root{box-sizing:border-box;position:relative;display:flex;flex-direction:column;width:100%;border-width:1px;border-style:solid;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif}.seed-data-table__table{width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed}.seed-data-table__headerCell{box-sizing:border-box;position:sticky;top:0;z-index:2;vertical-align:middle;text-align:start;padding:0;height:var(--seed-dimension-x10);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium);letter-spacing:-.14px}.seed-data-table__headerCell:last-child{border-inline-end:none}.seed-data-table__headerCell[data-sortable]{cursor:pointer;user-select:none}.seed-data-table__headerCell [data-chevron]{opacity:0;transition:opacity .12s}.seed-data-table__headerCell[data-sortable]:hover [data-chevron]{opacity:.6}.seed-data-table__headerCell[data-sorted] [data-chevron]{opacity:1;color:var(--seed-color-fg-neutral)}.seed-data-table__headerCell:hover [data-column-menu]{opacity:1}.seed-data-table__headerCell [data-column-menu]:focus-visible,.seed-data-table__headerCell [data-column-menu][data-open]{opacity:1}.seed-data-table__headerCell[data-dragging]{opacity:.5}.seed-data-table__headerCell[data-sticky]{position:sticky;z-index:3;background-color:var(--seed-color-bg-layer-default)}.seed-data-table__headerCell{outline:var(--seed-dimension-x0_5) solid transparent;outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell:is(:focus-visible,[data-focus-visible]){outline:var(--seed-dimension-x0_5) solid var(--seed-color-stroke-focus-ring);outline-offset:calc(var(--seed-dimension-x0_5) * -1)}.seed-data-table__headerCell .seed-data-table-resize-handle{position:absolute;top:0;inset-inline-end:calc(7px / -2);width:7px;height:100%;z-index:4;display:flex;align-items:center;justify-content:center;cursor:col-resize;touch-action:none}.seed-data-table__headerCell .seed-data-table-resize-handle-inner{width:3px;height:100%;border-radius:3px;background-color:#0298d9;opacity:0;transition:opacity .1s}.seed-data-table__headerCell .seed-data-table-resize-handle:hover .seed-data-table-resize-handle-inner,.seed-data-table__headerCell .seed-data-table-resize-handle[data-resizing] .seed-data-table-resize-handle-inner{opacity:1}.seed-data-table__headerCellInner{box-sizing:border-box;display:flex;align-items:center;width:100%;height:100%;min-width:0;gap:var(--seed-dimension-x1_5);padding-inline:var(--seed-dimension-x3)}.seed-data-table__headerCellLabel{min-width:0;flex:1 1 0%;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__headerCellIcon{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;justify-content:center;width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-subtle);border:none;background:0 0;padding:0;font:inherit;cursor:pointer}.seed-data-table__headerCellIcon[data-active]{color:var(--seed-color-fg-neutral)}.seed-data-table__headerCellIcon[data-column-menu]{opacity:0;transition:opacity .12s}.seed-data-table__row{position:relative;background-color:var(--seed-color-bg-layer-default);--seed-data-table-row-bg:var(--seed-color-bg-layer-default)}.seed-data-table__row[data-clickable]{cursor:pointer}.seed-data-table__row:is([aria-selected=true],[data-selected]){background-color:color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default));--seed-data-table-row-bg:color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default))}.seed-data-table__row:is([aria-selected=true],[data-selected]):is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,color-mix(in srgb,#0298d9 10%,var(--seed-color-bg-layer-default)));--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, color-mix(in srgb, #0298d9 10%, var(--seed-color-bg-layer-default)))}.seed-data-table__cell{box-sizing:border-box;position:relative;vertical-align:middle;text-align:start;height:var(--seed-dimension-x9);border-bottom:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-top:none;border-inline-start:none;padding-block:0;padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-regular);letter-spacing:-.14px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cell:not([data-editable]){user-select:none}.seed-data-table__cell:last-child{border-inline-end:none}tbody tr:last-child .seed-data-table__cell{border-bottom:none}.seed-data-table__cell[data-numeric]{text-align:end;font-variant-numeric:tabular-nums}.seed-data-table__cell[data-sticky]{position:sticky;z-index:1;background-color:var(--seed-data-table-row-bg)}.seed-data-table__cell[data-overlay-open]{overflow:visible;z-index:20}.seed-data-table__cell[data-editable]{cursor:default}.seed-data-table__cell .seed-data-table-edit-picker{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);min-width:0}.seed-data-table__cell .seed-data-table-edit-pending{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);animation:rotate .6s linear infinite}.seed-data-table__cell .seed-data-table-edit-error{position:absolute;top:100%;inset-inline-start:var(--seed-dimension-x3);inset-inline-end:var(--seed-dimension-x3);z-index:2;padding-top:2px;font-size:12px;line-height:1.3;color:var(--seed-color-fg-critical);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entity{display:flex;align-items:center;min-width:0;gap:var(--seed-dimension-x1_5)}.seed-data-table__entityName{min-width:0;font-weight:var(--seed-font-weight-medium);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__entityName[data-clickable]{cursor:pointer;border:none;background:0 0;padding:0;margin:0;font-family:inherit;font-size:inherit;line-height:inherit;color:inherit;text-align:start}.seed-data-table__entityName[data-clickable]:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__tagList{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);overflow:hidden;min-width:0}.seed-data-table__entityActions{display:flex;align-items:center;gap:6px;margin-inline-start:auto;flex-shrink:0;opacity:0;transition:opacity .15s}tr:hover .seed-data-table__entityActions{opacity:1}.seed-data-table__entityActions:focus-within{opacity:1}.seed-data-table__entityAction{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;flex-shrink:0;transition:background-color .2s,color .2s,box-shadow .2s}.seed-data-table__entityAction:hover{background:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__link{color:var(--seed-color-fg-neutral);text-decoration:none;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__link:is(:hover,[data-hover]){text-decoration:underline}.seed-data-table__chip{box-sizing:border-box;display:inline-flex;align-items:center;flex-shrink:0;max-width:100%;height:22px;padding:0 4px;border-radius:7px;font-size:13px;font-weight:var(--seed-font-weight-medium);line-height:15px;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__chipList{position:relative;display:flex;align-items:center;flex-wrap:nowrap;gap:3px;overflow:hidden;min-width:0;width:100%}.seed-data-table__chipOverflow{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;height:20px;padding:0 4px;border-radius:6px;background-color:#f6f7f7;color:#000;font-size:10px;font-weight:var(--seed-font-weight-regular);line-height:15px;white-space:nowrap}.seed-data-table__chipListEditor{display:flex;align-items:center;flex-wrap:wrap;gap:3px;min-width:0;width:100%}.seed-data-table__chipRemove{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:12px;height:12px;margin:0;margin-inline-start:2px;padding:0;border:none;border-radius:999px;background:0 0;color:inherit;opacity:.6;cursor:pointer;transition:opacity .12s,background-color .12s}.seed-data-table__chipRemove:hover{opacity:1;background-color:rgba(0,0,0,.08)}.seed-data-table__chipInput{flex:1 1 auto;min-width:40px;height:22px;margin:0;padding:0;border:none;outline:0;background:0 0;font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);letter-spacing:-.14px}.seed-data-table__expandOverlay{box-sizing:border-box;position:absolute;top:-1px;inset-inline-start:-1px;inset-inline-end:-1px;z-index:10;min-height:calc(100% + 2px);display:flex;align-items:flex-start;padding-inline:var(--seed-dimension-x3);padding-block:var(--seed-dimension-x3);background-color:var(--seed-color-bg-layer-floating);border-radius:4px;box-shadow:none;border:1px solid #266df0;color:var(--seed-color-fg-neutral);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);letter-spacing:-.14px;cursor:default}.seed-data-table__expandOverlayText{width:100%;min-width:0;white-space:normal;word-break:break-word}.seed-data-table__cellSuffixRow{display:flex;align-items:center;gap:4px;min-width:0;width:100%}.seed-data-table__cellSuffixText{flex:1 1 0%;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__cellSuffixIcon{flex-shrink:0;display:inline-flex;align-items:center;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent)}.seed-data-table__toolbar{box-sizing:border-box;display:flex;align-items:center;width:100%;flex-shrink:0;min-height:49px;gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x3);border-top:1px solid var(--seed-color-stroke-neutral-muted)}.seed-data-table__search{position:relative;display:inline-flex;align-items:center;flex:1 1 0%;max-width:280px}.seed-data-table__search svg{position:absolute;inset-inline-start:var(--seed-dimension-x2);width:var(--seed-dimension-x4);height:var(--seed-dimension-x4);color:var(--seed-color-fg-neutral-muted);pointer-events:none}.seed-data-table__search input{width:100%;height:var(--seed-dimension-x8);padding-inline-start:var(--seed-dimension-x7);padding-inline-end:var(--seed-dimension-x2);border:none;border-radius:var(--seed-radius-r2);background-color:var(--seed-color-bg-layer-default);box-shadow:inset 0 0 0 1px var(--seed-color-stroke-neutral-weak);font-family:inherit;font-size:var(--seed-font-size-t4);color:var(--seed-color-fg-neutral);outline:0;transition:box-shadow .1s var(--seed-timing-function-easing)}.seed-data-table__search input::placeholder{color:var(--seed-color-fg-neutral-subtle)}.seed-data-table__search input:focus{box-shadow:inset 0 0 0 2px var(--seed-color-stroke-neutral-contrast)}.seed-data-table__count{flex-shrink:0;color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t3);font-variant-numeric:tabular-nums}.seed-data-table__toolbarEnd{flex-shrink:0;margin-inline-start:auto;display:inline-flex;align-items:center;gap:var(--seed-dimension-x2)}.seed-data-table__scrollArea{position:relative;display:flex;flex-direction:column;width:100%;min-width:0;flex:1 1 auto;min-height:0;overflow-x:auto;overflow-y:auto}.seed-data-table__scrollArea[data-scrolled-start] [data-sticky-edge]{clip-path:inset(0 -38px 0 0);box-shadow:6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__scrollArea[data-scrolled-end] [data-sticky-edge-end]{clip-path:inset(0 0 0 -38px);box-shadow:-6px 0 16px 4px rgba(0,0,0,.12)}.seed-data-table__footerCell{box-sizing:border-box;position:sticky;bottom:0;z-index:2;vertical-align:middle;padding:0;height:var(--seed-dimension-x9);background-color:var(--seed-color-bg-layer-default);border-top:1px solid var(--seed-color-stroke-neutral-muted);border-inline-end:1px solid var(--seed-color-stroke-neutral-muted);border-inline-start:none}.seed-data-table__footerCell:last-child{border-inline-end:none}.seed-data-table__footerCell .seed-data-table-column-calc-trigger{display:flex;align-items:center;gap:var(--seed-dimension-x1_5);width:100%;height:100%;min-width:0;margin:0;padding:0 var(--seed-dimension-x3);border:none;background:0 0;color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap;overflow:clip;cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__footerCell .seed-data-table-column-calc-trigger:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__footerCell .seed-data-table-column-calc-trigger[data-align=right]{justify-content:flex-end}.seed-data-table__footerCell .seed-data-table-column-calc-trigger svg{flex-shrink:0;opacity:.7}.seed-data-table__footerCell .seed-data-table-column-calc-placeholder{overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-value{min-width:0;flex-shrink:1;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums;overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__footerCell .seed-data-table-column-calc-op{min-width:0;flex-shrink:1;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);overflow:clip;text-overflow:ellipsis;white-space:nowrap}.seed-data-table__emptyState{box-sizing:border-box;text-align:center;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:var(--seed-color-fg-neutral-subtle);font-size:var(--seed-font-size-t4)}.seed-data-table__loadingState{box-sizing:border-box;display:flex;align-items:center;justify-content:center;gap:10px;padding-block:var(--seed-dimension-x8);padding-inline:var(--seed-dimension-x3);color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);font-size:var(--seed-font-size-t4);line-height:var(--seed-line-height-t4);font-weight:var(--seed-font-weight-medium)}.seed-data-table__loadingState[data-inline]{padding-block:0;padding-inline:0;height:var(--seed-dimension-x9)}.seed-data-table__loadingState .seed-data-table-loading-spinner{flex-shrink:0;color:color-mix(in srgb,var(--seed-color-fg-neutral) 63%,transparent);animation:rotate .6s linear infinite}.seed-data-table__addRowCell{box-sizing:border-box;padding:0;border-top:none}.seed-data-table__addRow{box-sizing:border-box;display:flex;align-items:center;width:100%;margin:0;border:none;border-top:1px solid var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);height:var(--seed-dimension-x9);gap:var(--seed-dimension-x2);padding-inline:var(--seed-dimension-x2);color:var(--seed-color-fg-neutral-subtle);font-family:inherit;font-size:var(--seed-font-size-t4);cursor:pointer;transition:background-color .12s,color .12s}.seed-data-table__addRow:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 4%,var(--seed-color-bg-layer-default));color:var(--seed-color-fg-neutral)}.seed-data-table__addRow svg{flex-shrink:0}.seed-data-table__selectionCell{text-align:center;padding:0}.seed-data-table__bulkBar{box-sizing:border-box;position:absolute;inset-inline-start:50%;transform:translateX(-50%);bottom:var(--seed-dimension-x4);z-index:30;display:flex;align-items:center;gap:var(--seed-dimension-x3);min-height:36px;padding-inline:var(--seed-dimension-x3_5);padding-block:var(--seed-dimension-x2);border-radius:var(--seed-radius-full);box-shadow:var(--seed-shadow-s3);background-color:var(--seed-color-bg-layer-floating);color:var(--seed-color-fg-neutral);font-family:inherit;font-size:var(--seed-font-size-t4);font-weight:var(--seed-font-weight-medium);white-space:nowrap}.seed-data-table__bulkBarCount{flex-shrink:0;color:var(--seed-color-fg-neutral);font-variant-numeric:tabular-nums}.seed-data-table__bulkBarClear{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin:0;padding:2px;border:none;border-radius:6px;background:0 0;font-family:inherit;color:color-mix(in srgb,var(--seed-color-fg-neutral) 55%,transparent);cursor:pointer;transition:background-color .2s,color .2s}.seed-data-table__bulkBarClear:hover{background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 8%,transparent);color:var(--seed-color-fg-neutral)}.seed-data-table__bulkBarActions{display:flex;align-items:center;flex-shrink:0;gap:var(--seed-dimension-x3);padding-inline-start:var(--seed-dimension-x3);border-inline-start:1px solid color-mix(in srgb,var(--seed-color-fg-neutral) 16%,transparent)}.seed-data-table__root--surface_card{border-color:var(--seed-color-stroke-neutral-muted);background-color:var(--seed-color-bg-layer-default);border-radius:var(--seed-radius-r3)}.seed-data-table__root--surface_bleed{border-color:var(--seed-color-bg-transparent);background-color:var(--seed-color-bg-transparent)}.seed-data-table__row--interactive_true{transition:background-color .12s}.seed-data-table__row--interactive_true:is(:hover,[data-hover]){background-color:color-mix(in srgb,var(--seed-color-fg-neutral) 3%,transparent);--seed-data-table-row-bg:color-mix(in srgb, var(--seed-color-fg-neutral) 3%, var(--seed-color-bg-layer-default))}");
|
|
3949
4111
|
|
|
3950
4112
|
const createClassName = (className, variants, compoundVariants = [])=>{
|
|
3951
4113
|
const variantKeys = Object.keys(variants);
|
|
@@ -5581,9 +5743,20 @@ function formatCalcValue(value, op) {
|
|
|
5581
5743
|
size: 14
|
|
5582
5744
|
})
|
|
5583
5745
|
]
|
|
5584
|
-
}) : /*#__PURE__*/
|
|
5746
|
+
}) : /*#__PURE__*/ jsxs("span", {
|
|
5585
5747
|
className: "seed-data-table-column-calc-placeholder",
|
|
5586
|
-
|
|
5748
|
+
style: {
|
|
5749
|
+
display: "inline-flex",
|
|
5750
|
+
alignItems: "center",
|
|
5751
|
+
gap: 4
|
|
5752
|
+
},
|
|
5753
|
+
children: [
|
|
5754
|
+
/*#__PURE__*/ jsx(IconPlusLine_default, {
|
|
5755
|
+
size: 13,
|
|
5756
|
+
strokeWidth: 1.75
|
|
5757
|
+
}),
|
|
5758
|
+
"Add calculation"
|
|
5759
|
+
]
|
|
5587
5760
|
})
|
|
5588
5761
|
})
|
|
5589
5762
|
}),
|
|
@@ -11649,7 +11822,7 @@ function RowCount({ shown, total, countLabel }) {
|
|
|
11649
11822
|
}
|
|
11650
11823
|
|
|
11651
11824
|
function DataTableInner(props, ref) {
|
|
11652
|
-
const { columns, data, surface, className, locale = "en-US", sort, defaultSort, onSortChange, sortIcon, selectable, selectedIds, defaultSelectedIds, onSelectionChange, selectAllLabel = "Select all rows", getRowSelectionLabel = ()=>"Select row", selectionCheckedIcon, selectionIndeterminateIcon, bulkActions, clearSelectionLabel, query, defaultQuery, onQueryChange, searchPlaceholder = "Search…", searchLabel = "Search table", toolbarSorts, defaultToolbarSorts, onToolbarSortsChange, toolbarFilters, defaultToolbarFilters, onToolbarFiltersChange, showCount = true, countLabel, toolbarActions, columnMenu = false, reorderable = true, resizable = true, columnOrder, defaultColumnOrder, onColumnOrderChange, hiddenColumnKeys, defaultHiddenColumnKeys, onHiddenColumnKeysChange, columnWidths, defaultColumnWidths, onColumnWidthsChange, columnLabels, defaultColumnLabels, onColumnLabelsChange, pinnedColumnKeys, defaultPinnedColumnKeys, onPinnedColumnKeysChange, onColumnsChange, columnCalcOps, defaultColumnCalcOps, onColumnCalcOpsChange, stickyFirst = false, stickyLast = false, onEdit, cellContextMenu = true, onViewEditHistory, cellContextMenuItems, interactive = false, onRowClick, onAddRow, addRowLabel = "New record", loading = false, loadingLabel = "Loading...", error, empty = "No results.", onLoadMore, hasMore, loadingMore, scrollProps, ...restProps } = props;
|
|
11825
|
+
const { columns, data, surface, className, locale = "en-US", sort, defaultSort, onSortChange, sortIcon, selectable, selectedIds, defaultSelectedIds, onSelectionChange, selectAllLabel = "Select all rows", getRowSelectionLabel = ()=>"Select row", selectionCheckedIcon, selectionIndeterminateIcon, bulkActions, clearSelectionLabel, query, defaultQuery, onQueryChange, searchPlaceholder = "Search…", searchLabel = "Search table", toolbarSorts, defaultToolbarSorts, onToolbarSortsChange, toolbarFilters, defaultToolbarFilters, onToolbarFiltersChange, showCount = true, countLabel, toolbarActions, columnMenu = false, reorderable = true, resizable = true, columnOrder, defaultColumnOrder, onColumnOrderChange, hiddenColumnKeys, defaultHiddenColumnKeys, onHiddenColumnKeysChange, columnWidths, defaultColumnWidths, onColumnWidthsChange, columnLabels, defaultColumnLabels, onColumnLabelsChange, pinnedColumnKeys, defaultPinnedColumnKeys, onPinnedColumnKeysChange, onColumnsChange, columnCalcOps, defaultColumnCalcOps, onColumnCalcOpsChange, stickyFirst = false, stickyLast = false, onEdit, cellContextMenu = true, onViewEditHistory, cellContextMenuItems, interactive = false, onRowClick, onAddRow, addRowLabel = "New record", loading = false, loadingLabel = "Loading...", error, empty = "No results.", onLoadMore, hasMore, loadingMore, scrollProps, virtualized = false, rowHeight, overscan, ...restProps } = props;
|
|
11653
11826
|
const classNames = dataTable({
|
|
11654
11827
|
surface,
|
|
11655
11828
|
interactive
|
|
@@ -11822,6 +11995,9 @@ function DataTableInner(props, ref) {
|
|
|
11822
11995
|
onLoadMore: onLoadMore,
|
|
11823
11996
|
hasMore: hasMore,
|
|
11824
11997
|
loadingMore: loadingMore,
|
|
11998
|
+
virtualized: virtualized,
|
|
11999
|
+
rowHeight: rowHeight,
|
|
12000
|
+
overscan: overscan,
|
|
11825
12001
|
...restProps,
|
|
11826
12002
|
children: [
|
|
11827
12003
|
onColumnsChange && /*#__PURE__*/ jsx(ColumnsChangeEffect, {
|
|
@@ -11854,7 +12030,9 @@ function DataTableInner(props, ref) {
|
|
|
11854
12030
|
}),
|
|
11855
12031
|
/*#__PURE__*/ jsx(DataTableScrollBody, {
|
|
11856
12032
|
scrollProps: scrollProps,
|
|
12033
|
+
virtualized: virtualized,
|
|
11857
12034
|
children: /*#__PURE__*/ jsxs(DataTableTable, {
|
|
12035
|
+
"aria-rowcount": virtualized ? sortedData.length + 1 : undefined,
|
|
11858
12036
|
children: [
|
|
11859
12037
|
/*#__PURE__*/ jsx(DataTableColGroup, {
|
|
11860
12038
|
columns: columns,
|
|
@@ -11910,39 +12088,47 @@ function DataTableInner(props, ref) {
|
|
|
11910
12088
|
})
|
|
11911
12089
|
}) : /*#__PURE__*/ jsxs(Fragment, {
|
|
11912
12090
|
children: [
|
|
11913
|
-
|
|
11914
|
-
|
|
11915
|
-
|
|
11916
|
-
|
|
11917
|
-
|
|
11918
|
-
|
|
11919
|
-
|
|
11920
|
-
|
|
11921
|
-
|
|
11922
|
-
|
|
11923
|
-
|
|
11924
|
-
|
|
11925
|
-
|
|
11926
|
-
|
|
11927
|
-
|
|
11928
|
-
|
|
11929
|
-
|
|
11930
|
-
|
|
11931
|
-
|
|
11932
|
-
|
|
11933
|
-
|
|
11934
|
-
|
|
11935
|
-
|
|
11936
|
-
|
|
11937
|
-
|
|
11938
|
-
|
|
11939
|
-
|
|
11940
|
-
|
|
11941
|
-
|
|
11942
|
-
|
|
11943
|
-
|
|
11944
|
-
|
|
11945
|
-
|
|
12091
|
+
/*#__PURE__*/ jsx(WindowedRows, {
|
|
12092
|
+
rows: sortedData,
|
|
12093
|
+
virtualized: virtualized,
|
|
12094
|
+
colSpan: totalCols,
|
|
12095
|
+
children: (windowRows, firstIndex)=>/*#__PURE__*/ jsx(Fragment, {
|
|
12096
|
+
children: windowRows.map((row, offset)=>/*#__PURE__*/ jsxs(DataTableRow, {
|
|
12097
|
+
rowId: row.id,
|
|
12098
|
+
"aria-rowindex": virtualized ? firstIndex + offset + 2 : undefined,
|
|
12099
|
+
"data-clickable": onRowClick ? "" : undefined,
|
|
12100
|
+
onClick: onRowClick ? ()=>onRowClick(row) : undefined,
|
|
12101
|
+
children: [
|
|
12102
|
+
selectable && /*#__PURE__*/ jsx(SelectionCell, {
|
|
12103
|
+
// The row itself carries `onClick={onRowClick}` above, and a
|
|
12104
|
+
// native click on this cell's checkbox bubbles up through it
|
|
12105
|
+
// (React attaches DataTableRow's handler on the <tr>, which
|
|
12106
|
+
// sits between the checkbox and anything a consumer could stop
|
|
12107
|
+
// it from at -- so this has to live here, not in the consumer).
|
|
12108
|
+
// Without this, checking a row's box also fires `onRowClick`.
|
|
12109
|
+
onClick: (event)=>event.stopPropagation(),
|
|
12110
|
+
stickyFirst: stickyFirst,
|
|
12111
|
+
children: /*#__PURE__*/ jsx(RowCheckbox, {
|
|
12112
|
+
label: getRowSelectionLabel(row),
|
|
12113
|
+
checkedIcon: selectionCheckedIcon ?? DEFAULT_CHECKED_ICON
|
|
12114
|
+
})
|
|
12115
|
+
}),
|
|
12116
|
+
/*#__PURE__*/ jsx(ColumnBodyCells, {
|
|
12117
|
+
columns: columns,
|
|
12118
|
+
row: row,
|
|
12119
|
+
classNames: classNames,
|
|
12120
|
+
locale: locale,
|
|
12121
|
+
selectable: !!selectable,
|
|
12122
|
+
stickyFirst: stickyFirst,
|
|
12123
|
+
stickyLast: resolvedStickyLast,
|
|
12124
|
+
cellContextMenu: cellContextMenu,
|
|
12125
|
+
onViewEditHistory: onViewEditHistory,
|
|
12126
|
+
cellContextMenuItems: cellContextMenuItems
|
|
12127
|
+
})
|
|
12128
|
+
]
|
|
12129
|
+
}, row.id))
|
|
12130
|
+
})
|
|
12131
|
+
}),
|
|
11946
12132
|
onLoadMore && /*#__PURE__*/ jsx(InfiniteScrollRow, {
|
|
11947
12133
|
colSpan: totalCols,
|
|
11948
12134
|
classNames: classNames,
|
|
@@ -12043,7 +12229,69 @@ const DataTableTable = withContext$1(DataTableTable$1, "table");
|
|
|
12043
12229
|
* out of sync between the three. A column with no explicit width gets a bare `<col>`
|
|
12044
12230
|
* (no `style`): `table-layout: fixed`'s own algorithm gives every such column an equal
|
|
12045
12231
|
* share of whatever space is left, matching the old flex grid's `flex: 1 1 0%`
|
|
12046
|
-
* default with no extra code needed here. */
|
|
12232
|
+
* default with no extra code needed here. */ /**
|
|
12233
|
+
* Row virtualization's render slice. Lives inside `DataTableRoot` (it reads the
|
|
12234
|
+
* windowing state off context, which `DataTableInner` above can't) and hands its
|
|
12235
|
+
* children the visible `[start, end)` slice of `rows` plus that slice's first index,
|
|
12236
|
+
* flanked by a spacer row each side that stands in for everything cut off -- so the
|
|
12237
|
+
* scroll height stays `rows.length * rowHeight` and the scrollbar matches the full
|
|
12238
|
+
* data set. `virtualized` off: every row, no spacers, the pre-0.12 output exactly.
|
|
12239
|
+
*/ function WindowedRows({ rows, virtualized, colSpan, children }) {
|
|
12240
|
+
const { virtual } = useDataTableContext();
|
|
12241
|
+
const windowed = React.useMemo(()=>virtualized ? computeVirtualWindow({
|
|
12242
|
+
count: rows.length,
|
|
12243
|
+
rowHeight: virtual.rowHeight,
|
|
12244
|
+
scrollTop: virtual.scrollTop,
|
|
12245
|
+
viewportHeight: virtual.viewportHeight,
|
|
12246
|
+
overscan: virtual.overscan
|
|
12247
|
+
}) : null, [
|
|
12248
|
+
virtualized,
|
|
12249
|
+
rows.length,
|
|
12250
|
+
virtual.rowHeight,
|
|
12251
|
+
virtual.scrollTop,
|
|
12252
|
+
virtual.viewportHeight,
|
|
12253
|
+
virtual.overscan
|
|
12254
|
+
]);
|
|
12255
|
+
if (!windowed) return /*#__PURE__*/ jsx(Fragment, {
|
|
12256
|
+
children: children(rows, 0)
|
|
12257
|
+
});
|
|
12258
|
+
return /*#__PURE__*/ jsxs(Fragment, {
|
|
12259
|
+
children: [
|
|
12260
|
+
windowed.topSpacer > 0 && /*#__PURE__*/ jsx(VirtualSpacerRow, {
|
|
12261
|
+
height: windowed.topSpacer,
|
|
12262
|
+
colSpan: colSpan
|
|
12263
|
+
}),
|
|
12264
|
+
children(rows.slice(windowed.start, windowed.end), windowed.start),
|
|
12265
|
+
windowed.bottomSpacer > 0 && /*#__PURE__*/ jsx(VirtualSpacerRow, {
|
|
12266
|
+
height: windowed.bottomSpacer,
|
|
12267
|
+
colSpan: colSpan
|
|
12268
|
+
})
|
|
12269
|
+
]
|
|
12270
|
+
});
|
|
12271
|
+
}
|
|
12272
|
+
/** A plain `<tr><td colSpan>` of a given height -- deliberately NOT a `DataTableRow`/
|
|
12273
|
+
* `DataTableCell` (no hover tint, no cell chrome, no border, no 36px min height).
|
|
12274
|
+
* `colSpan` covers every column, so the `<colgroup>` still drives widths and sticky
|
|
12275
|
+
* columns are unaffected. */ function VirtualSpacerRow({ height, colSpan }) {
|
|
12276
|
+
return /*#__PURE__*/ jsx("tr", {
|
|
12277
|
+
"data-virtual-spacer": "",
|
|
12278
|
+
style: {
|
|
12279
|
+
height
|
|
12280
|
+
},
|
|
12281
|
+
children: /*#__PURE__*/ jsx("td", {
|
|
12282
|
+
"aria-hidden": "true",
|
|
12283
|
+
colSpan: colSpan,
|
|
12284
|
+
style: {
|
|
12285
|
+
height,
|
|
12286
|
+
padding: 0,
|
|
12287
|
+
border: 0,
|
|
12288
|
+
display: "table-cell",
|
|
12289
|
+
lineHeight: 0
|
|
12290
|
+
}
|
|
12291
|
+
})
|
|
12292
|
+
});
|
|
12293
|
+
}
|
|
12294
|
+
function DataTableColGroup({ columns, selectable, stickyFirst }) {
|
|
12047
12295
|
// MUST use the same pinned-first ordering every OTHER row (header/body/footer)
|
|
12048
12296
|
// renders in (`useEffectiveColumns`'s own doc comment) -- a `<colgroup>`'s `<col>`s
|
|
12049
12297
|
// are matched positionally to each row's cells, so if a pinned column visually moves
|
|
@@ -12118,7 +12366,7 @@ const DataTableSelectionCell = withSelectionCell(DataTableCell$1, "cell");
|
|
|
12118
12366
|
// to clip), so it never introduces a second vertical scrollbar next to whatever
|
|
12119
12367
|
// ambient container the whole DataTable already sits in.
|
|
12120
12368
|
const DataTableScrollBodyBase = withContext$1(Primitive.div, "scrollArea");
|
|
12121
|
-
function DataTableScrollBody({ children, scrollProps }) {
|
|
12369
|
+
function DataTableScrollBody({ children, virtualized, scrollProps }) {
|
|
12122
12370
|
const { scrollAreaRef, scrolledStart, scrolledEnd, onScroll } = useDataTableContext();
|
|
12123
12371
|
const { className: scrollClassName, style: scrollStyle, ...otherScrollProps } = scrollProps ?? {};
|
|
12124
12372
|
return /*#__PURE__*/ jsx(DataTableScrollBodyBase, {
|
|
@@ -12126,7 +12374,13 @@ function DataTableScrollBody({ children, scrollProps }) {
|
|
|
12126
12374
|
ref: scrollAreaRef,
|
|
12127
12375
|
onScroll: onScroll,
|
|
12128
12376
|
className: scrollClassName,
|
|
12129
|
-
|
|
12377
|
+
// Virtualized: the browser's scroll anchoring would try to hold the visible rows
|
|
12378
|
+
// steady as the spacer heights change under it, fighting the scroll position
|
|
12379
|
+
// this windowing itself derives from -- turn it off.
|
|
12380
|
+
style: virtualized ? {
|
|
12381
|
+
...scrollStyle,
|
|
12382
|
+
overflowAnchor: "none"
|
|
12383
|
+
} : scrollStyle,
|
|
12130
12384
|
"data-scrolled-start": dataAttr(scrolledStart),
|
|
12131
12385
|
"data-scrolled-end": dataAttr(scrolledEnd),
|
|
12132
12386
|
children: children
|
package/dist/styles.css
CHANGED
|
@@ -4934,6 +4934,23 @@ tbody tr:last-child .seed-data-table__cell {
|
|
|
4934
4934
|
overflow: clip;
|
|
4935
4935
|
}
|
|
4936
4936
|
|
|
4937
|
+
.seed-data-table__entityName[data-clickable] {
|
|
4938
|
+
cursor: pointer;
|
|
4939
|
+
font-family: inherit;
|
|
4940
|
+
font-size: inherit;
|
|
4941
|
+
line-height: inherit;
|
|
4942
|
+
color: inherit;
|
|
4943
|
+
text-align: start;
|
|
4944
|
+
background: none;
|
|
4945
|
+
border: none;
|
|
4946
|
+
margin: 0;
|
|
4947
|
+
padding: 0;
|
|
4948
|
+
}
|
|
4949
|
+
|
|
4950
|
+
.seed-data-table__entityName[data-clickable]:is(:hover, [data-hover]) {
|
|
4951
|
+
text-decoration: underline;
|
|
4952
|
+
}
|
|
4953
|
+
|
|
4937
4954
|
.seed-data-table__tagList {
|
|
4938
4955
|
align-items: center;
|
|
4939
4956
|
gap: var(--seed-dimension-x1_5);
|
|
@@ -4996,8 +5013,8 @@ tr:hover .seed-data-table__entityActions, .seed-data-table__entityActions:focus-
|
|
|
4996
5013
|
box-sizing: border-box;
|
|
4997
5014
|
max-width: 100%;
|
|
4998
5015
|
height: 22px;
|
|
4999
|
-
font-size:
|
|
5000
|
-
font-weight: var(--seed-font-weight-
|
|
5016
|
+
font-size: 13px;
|
|
5017
|
+
font-weight: var(--seed-font-weight-medium);
|
|
5001
5018
|
text-overflow: ellipsis;
|
|
5002
5019
|
white-space: nowrap;
|
|
5003
5020
|
border-radius: 7px;
|