@optimum-intelligence/opti-ui 0.2.0 → 0.4.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/README.md +105 -3
- package/dist/components/accordion/Accordion.d.ts +12 -0
- package/dist/components/accordion/Accordion.js +12 -0
- package/dist/components/accordion/Accordion.js.map +1 -1
- package/dist/components/alert/Alert.d.ts +4 -0
- package/dist/components/alert/Alert.js.map +1 -1
- package/dist/components/app-shell/AppShell.d.ts +22 -0
- package/dist/components/app-shell/AppShell.js +6 -0
- package/dist/components/app-shell/AppShell.js.map +1 -1
- package/dist/components/avatar/Avatar.d.ts +8 -0
- package/dist/components/avatar/Avatar.js +2 -0
- package/dist/components/avatar/Avatar.js.map +1 -1
- package/dist/components/badge/Badge.d.ts +9 -0
- package/dist/components/badge/Badge.js +6 -0
- package/dist/components/badge/Badge.js.map +1 -1
- package/dist/components/breadcrumbs/Breadcrumbs.d.ts +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/button/Button.d.ts +8 -0
- package/dist/components/button/Button.js +6 -0
- package/dist/components/button/Button.js.map +1 -1
- package/dist/components/calendar/Calendar.d.ts +3 -0
- package/dist/components/calendar/Calendar.js.map +1 -1
- package/dist/components/card/Card.d.ts +14 -1
- package/dist/components/card/Card.js +13 -0
- package/dist/components/card/Card.js.map +1 -1
- package/dist/components/choice/Choice.d.ts +13 -0
- package/dist/components/choice/Choice.js +10 -0
- package/dist/components/choice/Choice.js.map +1 -1
- package/dist/components/combobox/Combobox.d.ts +12 -0
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/command-palette/CommandPalette.d.ts +10 -0
- package/dist/components/command-palette/CommandPalette.js.map +1 -1
- package/dist/components/data-table/DataTable.d.ts +62 -96
- package/dist/components/data-table/DataTable.js +452 -418
- package/dist/components/data-table/DataTable.js.map +1 -1
- package/dist/components/data-table/DataTableContent.d.ts +36 -0
- package/dist/components/data-table/DataTableContent.js +550 -0
- package/dist/components/data-table/DataTableContent.js.map +1 -0
- package/dist/components/data-table/DataTableFilters.d.ts +18 -0
- package/dist/components/data-table/DataTableFilters.js +284 -0
- package/dist/components/data-table/DataTableFilters.js.map +1 -0
- package/dist/components/data-table/DataTableRow.d.ts +33 -0
- package/dist/components/data-table/DataTableRow.js +552 -0
- package/dist/components/data-table/DataTableRow.js.map +1 -0
- package/dist/components/data-table/context.d.ts +5 -0
- package/dist/components/data-table/context.js +14 -0
- package/dist/components/data-table/context.js.map +1 -0
- package/dist/components/data-table/layout.d.ts +60 -0
- package/dist/components/data-table/layout.js +272 -0
- package/dist/components/data-table/layout.js.map +1 -0
- package/dist/components/data-table/types.d.ts +335 -0
- package/dist/components/data-table/useDataTable.d.ts +9 -0
- package/dist/components/data-table/useDataTable.js +666 -0
- package/dist/components/data-table/useDataTable.js.map +1 -0
- package/dist/components/date-picker/DateRangePicker.d.ts +1 -0
- package/dist/components/date-picker/DateRangePicker.js.map +1 -1
- package/dist/components/date-picker/PickerField.d.ts +13 -0
- package/dist/components/date-picker/PickerField.js.map +1 -1
- package/dist/components/dialog/Dialog.d.ts +5 -0
- package/dist/components/dialog/Dialog.js.map +1 -1
- package/dist/components/drawer/Drawer.d.ts +10 -0
- package/dist/components/drawer/Drawer.js.map +1 -1
- package/dist/components/empty-state/EmptyState.d.ts +5 -0
- package/dist/components/empty-state/EmptyState.js.map +1 -1
- package/dist/components/file-upload/FileUpload.d.ts +21 -0
- package/dist/components/file-upload/FileUpload.js.map +1 -1
- package/dist/components/input/Input.d.ts +7 -0
- package/dist/components/input/Input.js +3 -0
- package/dist/components/input/Input.js.map +1 -1
- package/dist/components/link/Link.d.ts +1 -0
- package/dist/components/link/Link.js.map +1 -1
- package/dist/components/menu/Menu.d.ts +6 -0
- package/dist/components/menu/Menu.js.map +1 -1
- package/dist/components/number-field/NumberField.d.ts +7 -0
- package/dist/components/number-field/NumberField.js.map +1 -1
- package/dist/components/pagination/Pagination.d.ts +4 -0
- package/dist/components/pagination/Pagination.js.map +1 -1
- package/dist/components/popover/Popover.d.ts +4 -0
- package/dist/components/popover/Popover.js.map +1 -1
- package/dist/components/preview-card/PreviewCard.d.ts +4 -0
- package/dist/components/preview-card/PreviewCard.js.map +1 -1
- package/dist/components/progress/Progress.d.ts +8 -0
- package/dist/components/progress/Progress.js.map +1 -1
- package/dist/components/scroll-area/ScrollArea.d.ts +1 -0
- package/dist/components/scroll-area/ScrollArea.js.map +1 -1
- package/dist/components/search-input/SearchInput.d.ts +2 -0
- package/dist/components/search-input/SearchInput.js.map +1 -1
- package/dist/components/select/Select.d.ts +11 -0
- package/dist/components/select/Select.js.map +1 -1
- package/dist/components/separator/Separator.d.ts +1 -0
- package/dist/components/separator/Separator.js +1 -0
- package/dist/components/separator/Separator.js.map +1 -1
- package/dist/components/skeleton/Skeleton.d.ts +7 -0
- package/dist/components/skeleton/Skeleton.js +1 -0
- package/dist/components/skeleton/Skeleton.js.map +1 -1
- package/dist/components/slider/Slider.d.ts +1 -0
- package/dist/components/slider/Slider.js.map +1 -1
- package/dist/components/spinner/Spinner.d.ts +2 -0
- package/dist/components/spinner/Spinner.js +1 -0
- package/dist/components/spinner/Spinner.js.map +1 -1
- package/dist/components/stat-card/StatCard.d.ts +5 -1
- package/dist/components/stat-card/StatCard.js.map +1 -1
- package/dist/components/stepper/Stepper.d.ts +4 -0
- package/dist/components/stepper/Stepper.js.map +1 -1
- package/dist/components/table/Table.d.ts +23 -0
- package/dist/components/table/Table.js +17 -0
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/tabs/Tabs.d.ts +1 -0
- package/dist/components/tabs/Tabs.js.map +1 -1
- package/dist/components/tag/Tag.d.ts +3 -0
- package/dist/components/tag/Tag.js.map +1 -1
- package/dist/components/toast/Toast.d.ts +2 -0
- package/dist/components/toast/Toast.js.map +1 -1
- package/dist/components/toggle/Toggle.d.ts +7 -0
- package/dist/components/toggle/Toggle.js +1 -0
- package/dist/components/toggle/Toggle.js.map +1 -1
- package/dist/components/tooltip/Tooltip.d.ts +8 -0
- package/dist/components/tooltip/Tooltip.js.map +1 -1
- package/dist/components/typography/Typography.d.ts +5 -0
- package/dist/components/typography/Typography.js +2 -0
- package/dist/components/typography/Typography.js.map +1 -1
- package/dist/components.json +5375 -0
- package/dist/icons/index.d.ts +8 -0
- package/dist/icons/index.js +9 -1
- package/dist/icons/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -2
- package/dist/llms-full.txt +2590 -0
- package/dist/llms.txt +175 -0
- package/dist/opti-ui.css +494 -167
- package/dist/theme/ThemeProvider.d.ts +1 -0
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/utils/portal.d.ts +4 -0
- package/dist/utils/portal.js +4 -0
- package/dist/utils/portal.js.map +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { DataTableColumn, DataTableEntry } from './types';
|
|
3
|
+
/** Column widths taken from the browser's own layout, then held. */
|
|
4
|
+
export interface ColumnLock {
|
|
5
|
+
key: string;
|
|
6
|
+
/** Width of the wrapper when measured; another one asks for a new measurement. */
|
|
7
|
+
container: number;
|
|
8
|
+
table: number;
|
|
9
|
+
widths: number[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Lets the browser lay the columns out once, then holds their widths, so
|
|
13
|
+
* paging, sorting, scrolling and editing cannot move them. The widths are
|
|
14
|
+
* measured again when the table is resized or `key` (the column set) changes.
|
|
15
|
+
* `measuring` is true for the render the widths are read from; it is replaced
|
|
16
|
+
* before the browser paints.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useColumnLock(anchor: HTMLElement | null, enabled: boolean, key: string, ready: boolean): {
|
|
19
|
+
lock: ColumnLock | null;
|
|
20
|
+
measuring: boolean;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Rows the column widths are measured with, next to the ones on screen: the
|
|
24
|
+
* row with the longest text of each column, and a few spread over the data.
|
|
25
|
+
* Without them the widths would fit the first page only.
|
|
26
|
+
*/
|
|
27
|
+
export declare function pickSizerRows<T>(entries: DataTableEntry<T>[], columns: DataTableColumn<T>[]): DataTableEntry<T>[];
|
|
28
|
+
/**
|
|
29
|
+
* Height of the table with a full page of rows, so a shorter last page can keep
|
|
30
|
+
* it and the pagination below stays where the pointer is.
|
|
31
|
+
*/
|
|
32
|
+
export declare function usePageHeight(anchor: HTMLElement | null, enabled: boolean, full: boolean, key: string): number | undefined;
|
|
33
|
+
export interface VirtualRowsOptions {
|
|
34
|
+
enabled: boolean;
|
|
35
|
+
/** Number of rows in the list. */
|
|
36
|
+
count: number;
|
|
37
|
+
/** Height every row has. Left out, it is the tallest row seen. */
|
|
38
|
+
rowHeight?: number;
|
|
39
|
+
/** Rows rendered beyond each edge of the view. */
|
|
40
|
+
overscan: number;
|
|
41
|
+
/** Row height assumed before the first row is measured. */
|
|
42
|
+
estimate: number;
|
|
43
|
+
/** Height of the view assumed before it is measured, and on the server. */
|
|
44
|
+
viewport: number;
|
|
45
|
+
/** Changes when the row height may (density): forgets the measured one. */
|
|
46
|
+
key: string;
|
|
47
|
+
}
|
|
48
|
+
export interface VirtualRows {
|
|
49
|
+
/** Rows `start` (included) to `end` (excluded) are rendered. */
|
|
50
|
+
start: number;
|
|
51
|
+
end: number;
|
|
52
|
+
/** Heights standing in for the rows above and below them. */
|
|
53
|
+
before: number;
|
|
54
|
+
after: number;
|
|
55
|
+
/** Height to give every row, once known: equal rows keep the scrollbar steady. */
|
|
56
|
+
rowHeight?: number;
|
|
57
|
+
onScroll: (event: React.UIEvent<HTMLElement>) => void;
|
|
58
|
+
}
|
|
59
|
+
/** Renders only the rows in view of the scrolling wrapper, and stands in for the rest with empty space. */
|
|
60
|
+
export declare function useVirtualRows(anchor: HTMLElement | null, { enabled, count, rowHeight, overscan, estimate, viewport: assumed, key }: VirtualRowsOptions): VirtualRows;
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { getColumnValue } from "./useDataTable.js";
|
|
3
|
+
import { c } from "react/compiler-runtime";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
//#region src/components/data-table/layout.ts
|
|
6
|
+
function tableOf(anchor) {
|
|
7
|
+
return anchor?.closest("table") ?? null;
|
|
8
|
+
}
|
|
9
|
+
function wrapperOf(anchor) {
|
|
10
|
+
return tableOf(anchor)?.parentElement ?? null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Lets the browser lay the columns out once, then holds their widths, so
|
|
14
|
+
* paging, sorting, scrolling and editing cannot move them. The widths are
|
|
15
|
+
* measured again when the table is resized or `key` (the column set) changes.
|
|
16
|
+
* `measuring` is true for the render the widths are read from; it is replaced
|
|
17
|
+
* before the browser paints.
|
|
18
|
+
*/
|
|
19
|
+
function useColumnLock(anchor, enabled, key, ready) {
|
|
20
|
+
const $ = c(16);
|
|
21
|
+
const [lock, setLock] = React.useState(null);
|
|
22
|
+
const [shown, setShown] = React.useState(true);
|
|
23
|
+
const held = enabled && lock?.key === key ? lock : null;
|
|
24
|
+
const measuring = enabled && ready && !held && anchor !== null;
|
|
25
|
+
let t0;
|
|
26
|
+
if ($[0] !== anchor || $[1] !== key || $[2] !== measuring) {
|
|
27
|
+
t0 = () => {
|
|
28
|
+
const table = tableOf(anchor);
|
|
29
|
+
const wrapper = table?.parentElement;
|
|
30
|
+
if (!measuring || !table || !wrapper || !wrapper.clientWidth) return;
|
|
31
|
+
const heads = table.querySelectorAll(":scope > thead > tr > th");
|
|
32
|
+
setLock({
|
|
33
|
+
key,
|
|
34
|
+
container: wrapper.clientWidth,
|
|
35
|
+
table: table.getBoundingClientRect().width,
|
|
36
|
+
widths: Array.from(heads, _temp)
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
$[0] = anchor;
|
|
40
|
+
$[1] = key;
|
|
41
|
+
$[2] = measuring;
|
|
42
|
+
$[3] = t0;
|
|
43
|
+
} else t0 = $[3];
|
|
44
|
+
let t1;
|
|
45
|
+
if ($[4] !== anchor || $[5] !== key || $[6] !== measuring || $[7] !== shown) {
|
|
46
|
+
t1 = [
|
|
47
|
+
anchor,
|
|
48
|
+
measuring,
|
|
49
|
+
key,
|
|
50
|
+
shown
|
|
51
|
+
];
|
|
52
|
+
$[4] = anchor;
|
|
53
|
+
$[5] = key;
|
|
54
|
+
$[6] = measuring;
|
|
55
|
+
$[7] = shown;
|
|
56
|
+
$[8] = t1;
|
|
57
|
+
} else t1 = $[8];
|
|
58
|
+
React.useLayoutEffect(t0, t1);
|
|
59
|
+
let t2;
|
|
60
|
+
let t3;
|
|
61
|
+
if ($[9] !== anchor || $[10] !== enabled) {
|
|
62
|
+
t2 = () => {
|
|
63
|
+
const wrapper_0 = wrapperOf(anchor);
|
|
64
|
+
if (!enabled || !wrapper_0 || typeof ResizeObserver === "undefined") return;
|
|
65
|
+
const observer = new ResizeObserver(() => {
|
|
66
|
+
const width = wrapper_0.clientWidth;
|
|
67
|
+
setShown(width > 0);
|
|
68
|
+
if (width > 0) setLock((current) => current && Math.abs(current.container - width) >= 1 ? null : current);
|
|
69
|
+
});
|
|
70
|
+
observer.observe(wrapper_0);
|
|
71
|
+
return () => observer.disconnect();
|
|
72
|
+
};
|
|
73
|
+
t3 = [anchor, enabled];
|
|
74
|
+
$[9] = anchor;
|
|
75
|
+
$[10] = enabled;
|
|
76
|
+
$[11] = t2;
|
|
77
|
+
$[12] = t3;
|
|
78
|
+
} else {
|
|
79
|
+
t2 = $[11];
|
|
80
|
+
t3 = $[12];
|
|
81
|
+
}
|
|
82
|
+
React.useEffect(t2, t3);
|
|
83
|
+
let t4;
|
|
84
|
+
if ($[13] !== held || $[14] !== measuring) {
|
|
85
|
+
t4 = {
|
|
86
|
+
lock: held,
|
|
87
|
+
measuring
|
|
88
|
+
};
|
|
89
|
+
$[13] = held;
|
|
90
|
+
$[14] = measuring;
|
|
91
|
+
$[15] = t4;
|
|
92
|
+
} else t4 = $[15];
|
|
93
|
+
return t4;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Rows the column widths are measured with, next to the ones on screen: the
|
|
97
|
+
* row with the longest text of each column, and a few spread over the data.
|
|
98
|
+
* Without them the widths would fit the first page only.
|
|
99
|
+
*/
|
|
100
|
+
function _temp(head) {
|
|
101
|
+
return head.getBoundingClientRect().width;
|
|
102
|
+
}
|
|
103
|
+
function pickSizerRows(entries, columns) {
|
|
104
|
+
const picked = /* @__PURE__ */ new Set();
|
|
105
|
+
const step = Math.max(1, Math.ceil(entries.length / 12));
|
|
106
|
+
for (let index = 0; index < entries.length; index += step) picked.add(entries[index]);
|
|
107
|
+
for (const column of columns) {
|
|
108
|
+
let longest = null;
|
|
109
|
+
let length = 0;
|
|
110
|
+
for (const entry of entries) {
|
|
111
|
+
const value = getColumnValue(column, entry.row);
|
|
112
|
+
const size = value === null || value === void 0 ? 0 : String(value).length;
|
|
113
|
+
if (size > length) {
|
|
114
|
+
longest = entry;
|
|
115
|
+
length = size;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (longest) picked.add(longest);
|
|
119
|
+
}
|
|
120
|
+
return [...picked];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Height of the table with a full page of rows, so a shorter last page can keep
|
|
124
|
+
* it and the pagination below stays where the pointer is.
|
|
125
|
+
*/
|
|
126
|
+
function usePageHeight(anchor, enabled, full, key) {
|
|
127
|
+
const $ = c(5);
|
|
128
|
+
const [held, setHeld] = React.useState(null);
|
|
129
|
+
let t0;
|
|
130
|
+
if ($[0] !== anchor || $[1] !== enabled || $[2] !== full || $[3] !== key) {
|
|
131
|
+
t0 = () => {
|
|
132
|
+
const wrapper = wrapperOf(anchor);
|
|
133
|
+
if (!enabled || !full || !wrapper) return;
|
|
134
|
+
const height = wrapper.getBoundingClientRect().height;
|
|
135
|
+
if (height) setHeld((current) => current?.key === key && Math.abs(current.height - height) < 1 ? current : {
|
|
136
|
+
key,
|
|
137
|
+
height
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
$[0] = anchor;
|
|
141
|
+
$[1] = enabled;
|
|
142
|
+
$[2] = full;
|
|
143
|
+
$[3] = key;
|
|
144
|
+
$[4] = t0;
|
|
145
|
+
} else t0 = $[4];
|
|
146
|
+
React.useLayoutEffect(t0);
|
|
147
|
+
return enabled && held?.key === key ? held.height : void 0;
|
|
148
|
+
}
|
|
149
|
+
/** Renders only the rows in view of the scrolling wrapper, and stands in for the rest with empty space. */
|
|
150
|
+
function useVirtualRows(anchor, t0) {
|
|
151
|
+
const $ = c(28);
|
|
152
|
+
const { enabled, count, rowHeight, overscan, estimate, viewport: assumed, key } = t0;
|
|
153
|
+
const [first, setFirst] = React.useState(0);
|
|
154
|
+
const [viewport, setViewport] = React.useState(null);
|
|
155
|
+
const [tallest, setTallest] = React.useState(null);
|
|
156
|
+
const measured = tallest?.key === key ? tallest.height : void 0;
|
|
157
|
+
const height = rowHeight ?? measured ?? estimate;
|
|
158
|
+
const visible = Math.ceil((viewport ?? assumed) / height) + 1;
|
|
159
|
+
const top = Math.max(0, Math.min(first, count - 1));
|
|
160
|
+
const from = Math.max(0, top - overscan);
|
|
161
|
+
const start = from - from % 2;
|
|
162
|
+
const end = Math.min(count, top + visible + overscan);
|
|
163
|
+
let t1;
|
|
164
|
+
if ($[0] !== anchor || $[1] !== enabled || $[2] !== key || $[3] !== rowHeight) {
|
|
165
|
+
t1 = () => {
|
|
166
|
+
const table = tableOf(anchor);
|
|
167
|
+
if (!enabled || rowHeight !== void 0 || !table) return;
|
|
168
|
+
let max = 0;
|
|
169
|
+
for (const row of table.querySelectorAll(":scope > tbody > tr[aria-rowindex]")) max = Math.max(max, row.getBoundingClientRect().height);
|
|
170
|
+
if (max) setTallest((current) => current?.key === key && max - current.height < .5 ? current : {
|
|
171
|
+
key,
|
|
172
|
+
height: max
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
$[0] = anchor;
|
|
176
|
+
$[1] = enabled;
|
|
177
|
+
$[2] = key;
|
|
178
|
+
$[3] = rowHeight;
|
|
179
|
+
$[4] = t1;
|
|
180
|
+
} else t1 = $[4];
|
|
181
|
+
let t2;
|
|
182
|
+
if ($[5] !== anchor || $[6] !== count || $[7] !== enabled || $[8] !== end || $[9] !== key || $[10] !== rowHeight || $[11] !== start) {
|
|
183
|
+
t2 = [
|
|
184
|
+
anchor,
|
|
185
|
+
enabled,
|
|
186
|
+
rowHeight,
|
|
187
|
+
key,
|
|
188
|
+
start,
|
|
189
|
+
end,
|
|
190
|
+
count
|
|
191
|
+
];
|
|
192
|
+
$[5] = anchor;
|
|
193
|
+
$[6] = count;
|
|
194
|
+
$[7] = enabled;
|
|
195
|
+
$[8] = end;
|
|
196
|
+
$[9] = key;
|
|
197
|
+
$[10] = rowHeight;
|
|
198
|
+
$[11] = start;
|
|
199
|
+
$[12] = t2;
|
|
200
|
+
} else t2 = $[12];
|
|
201
|
+
React.useLayoutEffect(t1, t2);
|
|
202
|
+
let t3;
|
|
203
|
+
let t4;
|
|
204
|
+
if ($[13] !== anchor || $[14] !== enabled) {
|
|
205
|
+
t3 = () => {
|
|
206
|
+
const wrapper = wrapperOf(anchor);
|
|
207
|
+
if (!enabled || !wrapper) return;
|
|
208
|
+
setViewport(wrapper.clientHeight);
|
|
209
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
210
|
+
const observer = new ResizeObserver(() => setViewport(wrapper.clientHeight));
|
|
211
|
+
observer.observe(wrapper);
|
|
212
|
+
return () => observer.disconnect();
|
|
213
|
+
};
|
|
214
|
+
t4 = [anchor, enabled];
|
|
215
|
+
$[13] = anchor;
|
|
216
|
+
$[14] = enabled;
|
|
217
|
+
$[15] = t3;
|
|
218
|
+
$[16] = t4;
|
|
219
|
+
} else {
|
|
220
|
+
t3 = $[15];
|
|
221
|
+
t4 = $[16];
|
|
222
|
+
}
|
|
223
|
+
React.useEffect(t3, t4);
|
|
224
|
+
if (!enabled) {
|
|
225
|
+
let t5;
|
|
226
|
+
if ($[17] !== count) {
|
|
227
|
+
t5 = {
|
|
228
|
+
start: 0,
|
|
229
|
+
end: count,
|
|
230
|
+
before: 0,
|
|
231
|
+
after: 0,
|
|
232
|
+
onScroll: _temp2
|
|
233
|
+
};
|
|
234
|
+
$[17] = count;
|
|
235
|
+
$[18] = t5;
|
|
236
|
+
} else t5 = $[18];
|
|
237
|
+
return t5;
|
|
238
|
+
}
|
|
239
|
+
const t5 = start * height;
|
|
240
|
+
const t6 = (count - end) * height;
|
|
241
|
+
const t7 = rowHeight ?? measured;
|
|
242
|
+
let t8;
|
|
243
|
+
if ($[19] !== height) {
|
|
244
|
+
t8 = (event) => setFirst(Math.floor(event.currentTarget.scrollTop / height));
|
|
245
|
+
$[19] = height;
|
|
246
|
+
$[20] = t8;
|
|
247
|
+
} else t8 = $[20];
|
|
248
|
+
let t9;
|
|
249
|
+
if ($[21] !== end || $[22] !== start || $[23] !== t5 || $[24] !== t6 || $[25] !== t7 || $[26] !== t8) {
|
|
250
|
+
t9 = {
|
|
251
|
+
start,
|
|
252
|
+
end,
|
|
253
|
+
before: t5,
|
|
254
|
+
after: t6,
|
|
255
|
+
rowHeight: t7,
|
|
256
|
+
onScroll: t8
|
|
257
|
+
};
|
|
258
|
+
$[21] = end;
|
|
259
|
+
$[22] = start;
|
|
260
|
+
$[23] = t5;
|
|
261
|
+
$[24] = t6;
|
|
262
|
+
$[25] = t7;
|
|
263
|
+
$[26] = t8;
|
|
264
|
+
$[27] = t9;
|
|
265
|
+
} else t9 = $[27];
|
|
266
|
+
return t9;
|
|
267
|
+
}
|
|
268
|
+
function _temp2() {}
|
|
269
|
+
//#endregion
|
|
270
|
+
export { pickSizerRows, useColumnLock, usePageHeight, useVirtualRows };
|
|
271
|
+
|
|
272
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","names":["React","getColumnValue","DataTableColumn","DataTableEntry","tableOf","anchor","HTMLElement","closest","wrapperOf","parentElement","ColumnLock","key","container","table","widths","useColumnLock","enabled","ready","$","_c","lock","setLock","useState","shown","setShown","held","measuring","t0","wrapper","clientWidth","heads","querySelectorAll","getBoundingClientRect","width","Array","from","_temp","t1","useLayoutEffect","t2","t3","wrapper_0","ResizeObserver","observer","current","Math","abs","observe","disconnect","useEffect","t4","head","pickSizerRows","entries","T","columns","picked","Set","step","max","ceil","length","index","add","column","longest","entry","value","row","size","undefined","String","usePageHeight","full","setHeld","height","VirtualRowsOptions","count","rowHeight","overscan","estimate","viewport","VirtualRows","start","end","before","after","onScroll","event","UIEvent","useVirtualRows","assumed","first","setFirst","setViewport","tallest","setTallest","measured","visible","top","min","clientHeight","t5","_temp2","t6","t7","t8","floor","currentTarget","scrollTop","t9","_c"],"sources":["../../../src/components/data-table/layout.ts"],"sourcesContent":["import * as React from 'react';\nimport { getColumnValue } from './useDataTable';\nimport type { DataTableColumn, DataTableEntry } from './types';\n\n// The hooks here find the table through an element rendered inside it (its\n// `<colgroup>`), so `tableProps` keeps its own `ref` for the consumer.\nfunction tableOf(anchor: HTMLElement | null) {\n return anchor?.closest('table') ?? null;\n}\n\nfunction wrapperOf(anchor: HTMLElement | null) {\n return tableOf(anchor)?.parentElement ?? null;\n}\n\n// ─── Column widths ───────────────────────────────────────────────────────────\n\n/** Column widths taken from the browser's own layout, then held. */\nexport interface ColumnLock {\n key: string;\n /** Width of the wrapper when measured; another one asks for a new measurement. */\n container: number;\n table: number;\n widths: number[];\n}\n\n/**\n * Lets the browser lay the columns out once, then holds their widths, so\n * paging, sorting, scrolling and editing cannot move them. The widths are\n * measured again when the table is resized or `key` (the column set) changes.\n * `measuring` is true for the render the widths are read from; it is replaced\n * before the browser paints.\n */\nexport function useColumnLock(anchor: HTMLElement | null, enabled: boolean, key: string, ready: boolean) {\n const [lock, setLock] = React.useState<ColumnLock | null>(null);\n const [shown, setShown] = React.useState(true);\n const held = enabled && lock?.key === key ? lock : null;\n const measuring = enabled && ready && !held && anchor !== null;\n\n React.useLayoutEffect(() => {\n const table = tableOf(anchor);\n const wrapper = table?.parentElement;\n // A hidden table (a closed tab) has no widths to read: it is measured when it shows.\n if (!measuring || !table || !wrapper || !wrapper.clientWidth) return;\n const heads = table.querySelectorAll<HTMLElement>(':scope > thead > tr > th');\n setLock({\n key,\n container: wrapper.clientWidth,\n table: table.getBoundingClientRect().width,\n widths: Array.from(heads, (head) => head.getBoundingClientRect().width),\n });\n }, [anchor, measuring, key, shown]);\n\n React.useEffect(() => {\n const wrapper = wrapperOf(anchor);\n if (!enabled || !wrapper || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(() => {\n const width = wrapper.clientWidth;\n setShown(width > 0);\n if (width > 0) setLock((current) => (current && Math.abs(current.container - width) >= 1 ? null : current));\n });\n observer.observe(wrapper);\n return () => observer.disconnect();\n }, [anchor, enabled]);\n\n return { lock: held, measuring };\n}\n\n/**\n * Rows the column widths are measured with, next to the ones on screen: the\n * row with the longest text of each column, and a few spread over the data.\n * Without them the widths would fit the first page only.\n */\nexport function pickSizerRows<T>(entries: DataTableEntry<T>[], columns: DataTableColumn<T>[]): DataTableEntry<T>[] {\n const picked = new Set<DataTableEntry<T>>();\n const step = Math.max(1, Math.ceil(entries.length / 12));\n for (let index = 0; index < entries.length; index += step) picked.add(entries[index]!);\n for (const column of columns) {\n let longest: DataTableEntry<T> | null = null;\n let length = 0;\n for (const entry of entries) {\n const value = getColumnValue(column, entry.row);\n const size = value === null || value === undefined ? 0 : String(value).length;\n if (size > length) {\n longest = entry;\n length = size;\n }\n }\n if (longest) picked.add(longest);\n }\n return [...picked];\n}\n\n// ─── Page height ─────────────────────────────────────────────────────────────\n\n/**\n * Height of the table with a full page of rows, so a shorter last page can keep\n * it and the pagination below stays where the pointer is.\n */\nexport function usePageHeight(anchor: HTMLElement | null, enabled: boolean, full: boolean, key: string) {\n const [held, setHeld] = React.useState<{ key: string; height: number } | null>(null);\n\n React.useLayoutEffect(() => {\n const wrapper = wrapperOf(anchor);\n if (!enabled || !full || !wrapper) return;\n const height = wrapper.getBoundingClientRect().height;\n if (height) setHeld((current) => (current?.key === key && Math.abs(current.height - height) < 1 ? current : { key, height }));\n });\n\n return enabled && held?.key === key ? held.height : undefined;\n}\n\n// ─── Virtual rows ────────────────────────────────────────────────────────────\n\nexport interface VirtualRowsOptions {\n enabled: boolean;\n /** Number of rows in the list. */\n count: number;\n /** Height every row has. Left out, it is the tallest row seen. */\n rowHeight?: number;\n /** Rows rendered beyond each edge of the view. */\n overscan: number;\n /** Row height assumed before the first row is measured. */\n estimate: number;\n /** Height of the view assumed before it is measured, and on the server. */\n viewport: number;\n /** Changes when the row height may (density): forgets the measured one. */\n key: string;\n}\n\nexport interface VirtualRows {\n /** Rows `start` (included) to `end` (excluded) are rendered. */\n start: number;\n end: number;\n /** Heights standing in for the rows above and below them. */\n before: number;\n after: number;\n /** Height to give every row, once known: equal rows keep the scrollbar steady. */\n rowHeight?: number;\n onScroll: (event: React.UIEvent<HTMLElement>) => void;\n}\n\n/** Renders only the rows in view of the scrolling wrapper, and stands in for the rest with empty space. */\nexport function useVirtualRows(\n anchor: HTMLElement | null,\n { enabled, count, rowHeight, overscan, estimate, viewport: assumed, key }: VirtualRowsOptions,\n): VirtualRows {\n const [first, setFirst] = React.useState(0);\n const [viewport, setViewport] = React.useState<number | null>(null);\n const [tallest, setTallest] = React.useState<{ key: string; height: number } | null>(null);\n\n const measured = tallest?.key === key ? tallest.height : undefined;\n const height = rowHeight ?? measured ?? estimate;\n const visible = Math.ceil((viewport ?? assumed) / height) + 1;\n const top = Math.max(0, Math.min(first, count - 1));\n const from = Math.max(0, top - overscan);\n // An even start keeps the stripes of a striped table on the same rows.\n const start = from - (from % 2);\n const end = Math.min(count, top + visible + overscan);\n\n React.useLayoutEffect(() => {\n const table = tableOf(anchor);\n if (!enabled || rowHeight !== undefined || !table) return;\n let max = 0;\n for (const row of table.querySelectorAll(':scope > tbody > tr[aria-rowindex]')) {\n max = Math.max(max, row.getBoundingClientRect().height);\n }\n // Only ever grows: rows are given this height, so a smaller reading is the height itself.\n if (max) setTallest((current) => (current?.key === key && max - current.height < 0.5 ? current : { key, height: max }));\n }, [anchor, enabled, rowHeight, key, start, end, count]);\n\n React.useEffect(() => {\n const wrapper = wrapperOf(anchor);\n if (!enabled || !wrapper) return;\n setViewport(wrapper.clientHeight);\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(() => setViewport(wrapper.clientHeight));\n observer.observe(wrapper);\n return () => observer.disconnect();\n }, [anchor, enabled]);\n\n if (!enabled) return { start: 0, end: count, before: 0, after: 0, onScroll: () => undefined };\n return {\n start,\n end,\n before: start * height,\n after: (count - end) * height,\n rowHeight: rowHeight ?? measured,\n onScroll: (event) => setFirst(Math.floor(event.currentTarget.scrollTop / height)),\n };\n}\n"],"mappings":"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"}
|