@allxsmith/bestax-bulma 5.54.1 → 5.55.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/bestax.css +1 -1
- package/dist/bestax.css.map +1 -1
- package/dist/esm/components/Command.js +22 -22
- package/dist/esm/components/Command.js.map +1 -1
- package/dist/esm/components/DataTable.js +215 -0
- package/dist/esm/components/DataTable.js.map +1 -0
- package/dist/esm/components/useDataTable.js +482 -0
- package/dist/esm/components/useDataTable.js.map +1 -0
- package/dist/esm/elements/ColorSwatch.js +49 -0
- package/dist/esm/elements/ColorSwatch.js.map +1 -0
- package/dist/esm/elements/RingProgress.js +3 -3
- package/dist/esm/elements/Td.js +4 -2
- package/dist/esm/elements/Td.js.map +1 -1
- package/dist/esm/elements/Th.js +13 -5
- package/dist/esm/elements/Th.js.map +1 -1
- package/dist/esm/elements/Tr.js.map +1 -1
- package/dist/esm/form/ColorPicker.js +540 -0
- package/dist/esm/form/ColorPicker.js.map +1 -0
- package/dist/esm/form/Combobox.js +18 -18
- package/dist/esm/form/Combobox.js.map +1 -1
- package/dist/esm/form/Dropzone.js +524 -0
- package/dist/esm/form/Dropzone.js.map +1 -0
- package/dist/esm/form/_colorInternals/colorMath.js +292 -0
- package/dist/esm/form/_colorInternals/colorMath.js.map +1 -0
- package/dist/esm/form/_colorInternals/pickerState.js +160 -0
- package/dist/esm/form/_colorInternals/pickerState.js.map +1 -0
- package/dist/esm/helpers/statusRegion.js +3 -3
- package/dist/esm/helpers/statusRegion.js.map +1 -1
- package/dist/esm/helpers/useFocusTrap.js +2 -2
- package/dist/extras.css +1 -1
- package/dist/extras.css.map +1 -1
- package/dist/index.cjs +2986 -796
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +5 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/types/components/DataTable.d.ts +120 -0
- package/dist/types/components/useDataTable.d.ts +445 -0
- package/dist/types/elements/ColorSwatch.d.ts +54 -0
- package/dist/types/elements/Td.d.ts +9 -1
- package/dist/types/elements/Th.d.ts +14 -2
- package/dist/types/elements/Tr.d.ts +10 -1
- package/dist/types/form/ColorPicker.d.ts +266 -0
- package/dist/types/form/Dropzone.d.ts +138 -0
- package/dist/types/form/_colorInternals/colorMath.d.ts +63 -0
- package/dist/types/form/_colorInternals/pickerState.d.ts +62 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types-cjs/components/DataTable.d.ts +120 -0
- package/dist/types-cjs/components/useDataTable.d.ts +445 -0
- package/dist/types-cjs/elements/ColorSwatch.d.ts +54 -0
- package/dist/types-cjs/elements/Td.d.ts +9 -1
- package/dist/types-cjs/elements/Th.d.ts +14 -2
- package/dist/types-cjs/elements/Tr.d.ts +10 -1
- package/dist/types-cjs/form/ColorPicker.d.ts +266 -0
- package/dist/types-cjs/form/Dropzone.d.ts +138 -0
- package/dist/types-cjs/form/_colorInternals/colorMath.d.ts +63 -0
- package/dist/types-cjs/form/_colorInternals/pickerState.d.ts +62 -0
- package/dist/types-cjs/index.d.ts +4 -0
- package/dist/versions/bestax-no-dark-mode.css +1 -1
- package/dist/versions/bestax-no-dark-mode.css.map +1 -1
- package/dist/versions/bestax-no-helpers-prefixed.css +1 -1
- package/dist/versions/bestax-no-helpers-prefixed.css.map +1 -1
- package/dist/versions/bestax-no-helpers.css +1 -1
- package/dist/versions/bestax-no-helpers.css.map +1 -1
- package/dist/versions/bestax-prefixed.css +1 -1
- package/dist/versions/bestax-prefixed.css.map +1 -1
- package/package.json +1 -1
- package/src/scss/components/_datatable.scss +152 -0
- package/src/scss/components/_index.scss +1 -0
- package/src/scss/elements/_colorswatch.scss +100 -0
- package/src/scss/elements/_index.scss +1 -0
- package/src/scss/form/_checkbox.scss +53 -0
- package/src/scss/form/_colorpicker.scss +354 -0
- package/src/scss/form/_dropzone.scss +233 -0
- package/src/scss/form/_index.scss +2 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/* @allxsmith/bestax-bulma — AI agents: see AGENTS.md in the package root, or https://bestax.io/llms.txt */
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { forwardRef, useId, useEffect, useState } from 'react';
|
|
4
|
+
import { classNames, usePrefixedClassNames } from '../helpers/classNames.js';
|
|
5
|
+
import { useBulmaClasses } from '../helpers/useBulmaClasses.js';
|
|
6
|
+
import { warnOnce } from '../helpers/devWarnings.js';
|
|
7
|
+
import { visuallyHidden } from '../helpers/statusRegion.js';
|
|
8
|
+
import { Table } from '../elements/Table.js';
|
|
9
|
+
import { Thead } from '../elements/Thead.js';
|
|
10
|
+
import { Tbody } from '../elements/Tbody.js';
|
|
11
|
+
import { Tr } from '../elements/Tr.js';
|
|
12
|
+
import { Th } from '../elements/Th.js';
|
|
13
|
+
import { Td } from '../elements/Td.js';
|
|
14
|
+
import { Skeleton } from '../elements/Skeleton.js';
|
|
15
|
+
import { Checkbox } from '../form/Checkbox.js';
|
|
16
|
+
import { Input } from '../form/Input.js';
|
|
17
|
+
import { EmptyState } from './EmptyState.js';
|
|
18
|
+
import { Pagination } from './Pagination.js';
|
|
19
|
+
import { ScrollArea } from './ScrollArea.js';
|
|
20
|
+
import { useDataTable, isFiltering } from './useDataTable.js';
|
|
21
|
+
|
|
22
|
+
/** How long the status region waits after a change before it speaks, in ms. */
|
|
23
|
+
const statusDelay = 500;
|
|
24
|
+
const noColumns = [];
|
|
25
|
+
const noRows = [];
|
|
26
|
+
/** A text signature of the search and the filters, to tell when they change. */
|
|
27
|
+
function filterSignature(search, filters) {
|
|
28
|
+
try {
|
|
29
|
+
return JSON.stringify([search, Object.entries(filters).sort()]);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return search;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Whether a node renders something. */
|
|
36
|
+
const isShown = (node) => node !== undefined && node !== null && node !== false && node !== '';
|
|
37
|
+
/**
|
|
38
|
+
* The `DataTable` component is a table of records that people can sort,
|
|
39
|
+
* search, page through and select rows from, rendered with bestax's own
|
|
40
|
+
* `Table` parts, `Checkbox` and `Pagination`.
|
|
41
|
+
*
|
|
42
|
+
* It's a native table, as in the WAI-ARIA Authoring Practices' sortable
|
|
43
|
+
* table: a sortable header holds a button, the sorted one carries
|
|
44
|
+
* `aria-sort`, and each row's checkbox is named for the row. It runs on
|
|
45
|
+
* `useDataTable`, which custom markup can use too.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* <DataTable
|
|
49
|
+
* caption="Users"
|
|
50
|
+
* columns={[
|
|
51
|
+
* { id: 'name', header: 'Name', sortable: true, isRowHeader: true },
|
|
52
|
+
* { id: 'role', header: 'Role', sortable: true },
|
|
53
|
+
* ]}
|
|
54
|
+
* data={users}
|
|
55
|
+
* selectionMode="multiple"
|
|
56
|
+
* pageSize={10}
|
|
57
|
+
* hasSearch
|
|
58
|
+
* />
|
|
59
|
+
*/
|
|
60
|
+
const DataTable = forwardRef(function DataTableRender({ columns, data, table: given, getRowId, sort, defaultSort, onSortChange, selectionMode, selected, defaultSelected, onSelectedChange, pageSize, page, defaultPage, onPageChange, search, defaultSearch, onSearchChange, filters, defaultFilters, onFiltersChange, manual, rowCount, labels, caption, isBordered, isStriped, isNarrow, isHoverable, isFullwidth, isResponsive, hasSearch, toolbar, loading, empty, noResults, rowProps, className, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledby, ...props }, ref) {
|
|
61
|
+
const own = useDataTable({
|
|
62
|
+
columns: columns ?? noColumns,
|
|
63
|
+
data: data ?? noRows,
|
|
64
|
+
getRowId,
|
|
65
|
+
sort,
|
|
66
|
+
defaultSort,
|
|
67
|
+
onSortChange,
|
|
68
|
+
selectionMode,
|
|
69
|
+
selected,
|
|
70
|
+
defaultSelected,
|
|
71
|
+
onSelectedChange,
|
|
72
|
+
pageSize,
|
|
73
|
+
page,
|
|
74
|
+
defaultPage,
|
|
75
|
+
onPageChange,
|
|
76
|
+
search,
|
|
77
|
+
defaultSearch,
|
|
78
|
+
onSearchChange,
|
|
79
|
+
filters,
|
|
80
|
+
defaultFilters,
|
|
81
|
+
onFiltersChange,
|
|
82
|
+
manual,
|
|
83
|
+
rowCount,
|
|
84
|
+
labels,
|
|
85
|
+
});
|
|
86
|
+
const table = given ?? own;
|
|
87
|
+
const { state } = table;
|
|
88
|
+
const { bulmaHelperClasses, rest } = useBulmaClasses(props);
|
|
89
|
+
const rootClass = classNames(usePrefixedClassNames('data-table'), bulmaHelperClasses, className);
|
|
90
|
+
const toolbarClass = usePrefixedClassNames('data-table-toolbar');
|
|
91
|
+
const actionsClass = usePrefixedClassNames('data-table-actions');
|
|
92
|
+
const emptyClass = usePrefixedClassNames('data-table-empty');
|
|
93
|
+
const nameId = useId();
|
|
94
|
+
const hasCaption = isShown(caption);
|
|
95
|
+
const named = hasCaption || Boolean(ariaLabel || ariaLabelledby);
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (!named) {
|
|
98
|
+
warnOnce('DataTable:unnamed', '[bestax-bulma] <DataTable> has no accessible name. Pass a caption, ' +
|
|
99
|
+
'aria-label or aria-labelledby, so a screen reader can say which ' +
|
|
100
|
+
'table it is in.');
|
|
101
|
+
}
|
|
102
|
+
}, [named]);
|
|
103
|
+
const mixed = Boolean(given) && Boolean(columns || data);
|
|
104
|
+
const bare = !given && (!columns || !data);
|
|
105
|
+
useEffect(() => {
|
|
106
|
+
if (mixed) {
|
|
107
|
+
warnOnce('DataTable:table-and-columns', '[bestax-bulma] <DataTable> was given a `table` and `columns` or ' +
|
|
108
|
+
'`data` too. It renders the `table` and leaves the rest unread, so ' +
|
|
109
|
+
'pass those to useDataTable instead.');
|
|
110
|
+
}
|
|
111
|
+
if (bare) {
|
|
112
|
+
warnOnce('DataTable:no-data', '[bestax-bulma] <DataTable> needs `columns` and `data`, or a `table` ' +
|
|
113
|
+
'from useDataTable.');
|
|
114
|
+
}
|
|
115
|
+
}, [mixed, bare]);
|
|
116
|
+
// The status region speaks only after the search, a filter or the page
|
|
117
|
+
// changes, so nothing is read out as the page loads. `kind` is what last
|
|
118
|
+
// changed, kept beside the values it changed from.
|
|
119
|
+
const signature = filterSignature(state.search, state.filters);
|
|
120
|
+
const [last, setLast] = useState({
|
|
121
|
+
signature,
|
|
122
|
+
page: state.page,
|
|
123
|
+
kind: null,
|
|
124
|
+
});
|
|
125
|
+
if (last.signature !== signature) {
|
|
126
|
+
setLast({ signature, page: state.page, kind: 'results' });
|
|
127
|
+
}
|
|
128
|
+
else if (last.page !== state.page) {
|
|
129
|
+
setLast({ signature, page: state.page, kind: 'page' });
|
|
130
|
+
}
|
|
131
|
+
const { labels: words, rowCount: total, pageCount } = table;
|
|
132
|
+
const size = state.pageSize;
|
|
133
|
+
let message = '';
|
|
134
|
+
if (last.kind && loading) {
|
|
135
|
+
message = words.loading;
|
|
136
|
+
}
|
|
137
|
+
else if (last.kind === 'results' || (last.kind === 'page' && !total)) {
|
|
138
|
+
message = words.results(total);
|
|
139
|
+
}
|
|
140
|
+
else if (last.kind === 'page') {
|
|
141
|
+
// Without a page size, as when it's just been taken away, there's one
|
|
142
|
+
// page, holding every row.
|
|
143
|
+
const per = size ?? total;
|
|
144
|
+
message = words.pageRange((state.page - 1) * per + 1, Math.min(state.page * per, total), total);
|
|
145
|
+
}
|
|
146
|
+
// Written a moment after it changes, so typing in the search is read out
|
|
147
|
+
// once it pauses rather than at every keystroke.
|
|
148
|
+
const [said, setSaid] = useState('');
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
const timer = setTimeout(() => setSaid(message), statusDelay);
|
|
151
|
+
return () => clearTimeout(timer);
|
|
152
|
+
}, [message]);
|
|
153
|
+
const selectable = table.selectionMode === 'multiple';
|
|
154
|
+
const sortable = table.columns.some(column => column.sortable);
|
|
155
|
+
const columnCount = table.columns.length + (selectable ? 1 : 0);
|
|
156
|
+
const pageRows = table.getRows('page');
|
|
157
|
+
const selectAll = table.getSelectAllProps();
|
|
158
|
+
const captionNode = hasCaption ? (jsxs("caption", { children: [jsx("span", { id: nameId, children: caption }), sortable && jsx("span", { style: visuallyHidden, children: `, ${words.sortHint}.` })] })) : sortable ? (jsx("caption", { children: jsx("span", { style: visuallyHidden, children: words.sortHint }) })) : null;
|
|
159
|
+
const header = (jsx(Thead, { children: jsxs(Tr, { children: [selectable && (jsx(Th, { scope: "col", isNarrow: true, children: jsx(Checkbox, { ...selectAll,
|
|
160
|
+
// While loading, the rows it would select aren't on screen.
|
|
161
|
+
disabled: selectAll.disabled || Boolean(loading) }) })), table.columns.map(column => (jsx(Th, { ...table.getHeaderCellProps(column), children: column.sortable ? (jsx("button", { ...table.getSortButtonProps(column), children: column.header })) : (column.header) }, column.id)))] }) }));
|
|
162
|
+
let body;
|
|
163
|
+
if (loading) {
|
|
164
|
+
body = Array.from({ length: size ?? 5 }, (_, index) => (jsx(Tr, { "aria-hidden": "true", children: Array.from({ length: columnCount }, (__, cell) => (jsx(Td, { children: jsx(Skeleton, { variant: "lines", lines: 1 }) }, cell))) }, index)));
|
|
165
|
+
}
|
|
166
|
+
else if (pageRows.length === 0) {
|
|
167
|
+
// With `manual`, no rows under a search or a filter is no match: only
|
|
168
|
+
// the server knows whether there's anything else.
|
|
169
|
+
const nothing = table.getRows('all').length === 0 &&
|
|
170
|
+
!(table.manual && isFiltering(state.search, state.filters));
|
|
171
|
+
const content = nothing
|
|
172
|
+
? isShown(empty)
|
|
173
|
+
? empty
|
|
174
|
+
: empty === undefined && (jsx(EmptyState, { size: "small", description: words.empty }))
|
|
175
|
+
: isShown(noResults)
|
|
176
|
+
? noResults
|
|
177
|
+
: noResults === undefined && (jsx(EmptyState, { size: "small", description: words.noResults }));
|
|
178
|
+
body = (jsx(Tr, { children: jsx(Td, { colSpan: columnCount, className: emptyClass, children: content }) }));
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
body = pageRows.map(row => {
|
|
182
|
+
const rowId = table.getRowId(row);
|
|
183
|
+
return (jsxs(Tr, { ...rowProps?.(row), ...table.getRowProps(row), children: [selectable && (jsx(Td, { isNarrow: true, children: jsx(Checkbox, { ...table.getSelectRowProps(row) }) })), table.columns.map(column => {
|
|
184
|
+
const text = table.getText(row, column.id);
|
|
185
|
+
const content = column.cell
|
|
186
|
+
? column.cell(row, {
|
|
187
|
+
value: table.getValue(row, column.id),
|
|
188
|
+
text,
|
|
189
|
+
rowId,
|
|
190
|
+
})
|
|
191
|
+
: text;
|
|
192
|
+
const cellProps = table.getCellProps(row, column);
|
|
193
|
+
return column.isRowHeader ? (jsx(Th, { ...cellProps, children: content }, column.id)) : (jsx(Td, { ...cellProps, children: content }, column.id));
|
|
194
|
+
})] }, rowId));
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
const tableElement = (jsxs(Table, { isBordered: isBordered, isStriped: isStriped, isNarrow: isNarrow, isHoverable: isHoverable, isFullwidth: isFullwidth, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "aria-busy": loading || undefined, children: [captionNode, header, jsx(Tbody, { children: body })] }));
|
|
198
|
+
// The name the scroll area and the pager take from the table.
|
|
199
|
+
const textName = ariaLabel || (typeof caption === 'string' ? caption : undefined);
|
|
200
|
+
const scrollName = ariaLabel
|
|
201
|
+
? { 'aria-label': ariaLabel }
|
|
202
|
+
: {
|
|
203
|
+
'aria-labelledby': ariaLabelledby || (hasCaption ? nameId : undefined),
|
|
204
|
+
};
|
|
205
|
+
// Pagination names itself "pagination" unless given another name.
|
|
206
|
+
const pagerLabel = words.pagination || (textName ? `${textName} pages` : undefined);
|
|
207
|
+
const pagerName = pagerLabel ? { 'aria-label': pagerLabel } : {};
|
|
208
|
+
const toolbarContent = toolbar?.(table);
|
|
209
|
+
const hasToolbar = hasSearch || isShown(toolbarContent);
|
|
210
|
+
return (jsxs("div", { ref: ref, className: rootClass, ...rest, children: [hasToolbar && (jsxs("div", { className: toolbarClass, children: [hasSearch && (jsx(Input, { label: words.search, ...table.getSearchProps() })), isShown(toolbarContent) && (jsx("div", { className: actionsClass, children: toolbarContent }))] })), isResponsive ? (jsx(ScrollArea, { orientation: "horizontal", ...scrollName, children: tableElement })) : (tableElement), jsx("div", { role: "status", "aria-live": "polite", style: visuallyHidden, children: said }), pageCount > 1 && (jsx(Pagination, { ...table.getPaginationProps(), ...pagerName }))] }));
|
|
211
|
+
});
|
|
212
|
+
DataTable.displayName = 'DataTable';
|
|
213
|
+
|
|
214
|
+
export { DataTable, useDataTable };
|
|
215
|
+
//# sourceMappingURL=DataTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.js","sources":["../../../src/components/DataTable.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useId, useState } from 'react';\nimport { classNames, usePrefixedClassNames } from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { warnOnce } from '../helpers/devWarnings';\nimport { visuallyHidden } from '../helpers/statusRegion';\nimport { Table } from '../elements/Table';\nimport { Thead } from '../elements/Thead';\nimport { Tbody } from '../elements/Tbody';\nimport { Tr, TrProps } from '../elements/Tr';\nimport { Th } from '../elements/Th';\nimport { Td } from '../elements/Td';\nimport { Skeleton } from '../elements/Skeleton';\nimport { Checkbox } from '../form/Checkbox';\nimport { Input } from '../form/Input';\nimport { EmptyState } from './EmptyState';\nimport { Pagination } from './Pagination';\nimport { ScrollArea } from './ScrollArea';\nimport {\n isFiltering,\n useDataTable,\n type DataTableColumn,\n type DataTableFilters,\n type DataTableModel,\n type DataTableStateOptions,\n} from './useDataTable';\n\nexport { useDataTable } from './useDataTable';\nexport type {\n DataTableCellContext,\n DataTableCellProps,\n DataTableCheckboxProps,\n DataTableColumn,\n DataTableColumnMeta,\n DataTableFilters,\n DataTableHeaderCellProps,\n DataTableLabels,\n DataTableModel,\n DataTablePaginationProps,\n DataTableResolvedLabels,\n DataTableRowScope,\n DataTableSearchProps,\n DataTableSelectionMode,\n DataTableSort,\n DataTableSortButtonProps,\n DataTableSortDirection,\n DataTableState,\n DataTableStateOptions,\n UseDataTableOptions,\n} from './useDataTable';\n\n/**\n * Props for the DataTable component. The helper props, `className`, the\n * `ref` and the other attributes go on the wrapper `<div>`, which holds the\n * toolbar, the table and the pager. `aria-label` and `aria-labelledby` name\n * the `<table>` itself.\n *\n * @extraProp {string} [aria-label] - Names the table, in place of a `caption`. A table needs a name, so pass a `caption`, this or `aria-labelledby`, and a development build warns when it has none.\n * @extraProp {string} [aria-labelledby] - The id of a visible heading that names the table, in place of a `caption`.\n * @extraProp {React.Ref<HTMLDivElement>} [ref] - Ref forwarded to the wrapper `<div>`.\n */\nexport interface DataTableProps<TRow>\n extends\n DataTableStateOptions<TRow>,\n Omit<React.HTMLAttributes<HTMLDivElement>, 'color'>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /**\n * The columns, in the order they're shown. Required unless `table` is\n * given. Keep the array the same from one render to the next, defined\n * outside the component or in `useMemo`: a new one has every cell's text\n * worked out again.\n */\n columns?: DataTableColumn<TRow>[];\n /** The rows, as records of your own. Required unless `table` is given. */\n data?: TRow[];\n /**\n * A table made by `useDataTable`, rendered in place of one made from\n * `columns`, `data` and the state props, which are then left unread. Use\n * it to put a toolbar, a count or an export button elsewhere on the page.\n */\n table?: DataTableModel<TRow>;\n /**\n * Names the table, as a visible `<caption>`. A table needs a name: this,\n * `aria-label` or `aria-labelledby`.\n */\n caption?: React.ReactNode;\n /** Adds borders to all cells. */\n isBordered?: boolean;\n /** Adds zebra-striping to rows. */\n isStriped?: boolean;\n /** Makes the table more compact by cutting cell padding in half. */\n isNarrow?: boolean;\n /** Adds a hover effect on rows. */\n isHoverable?: boolean;\n /** Makes the table span the full width of its wrapper. */\n isFullwidth?: boolean;\n /**\n * Scrolls a table wider than its wrapper sideways, in a `ScrollArea`\n * named after the table, which can be scrolled from the keyboard while it\n * overflows.\n */\n isResponsive?: boolean;\n /** Shows a search field in the toolbar, labelled by `labels.search`. */\n hasSearch?: boolean;\n /**\n * More of the toolbar, after the search field: buttons for the selected\n * rows, a filter, a download. Given the table.\n */\n toolbar?: (table: DataTableModel<TRow>) => React.ReactNode;\n /**\n * Shows a page of skeleton rows under the header in place of the rows,\n * and marks the table busy. For data on its way, as from a server with\n * `manual`.\n */\n loading?: boolean;\n /**\n * What the table shows when it has no rows at all, in one cell across\n * every column. A small `EmptyState` saying `labels.empty` by default. A\n * title of your own sits under the heading the table does, so give it the\n * next level down with `titleAs`.\n */\n empty?: React.ReactNode;\n /**\n * What the table shows when the search and filters let no row through, in\n * one cell across every column. A small `EmptyState` saying\n * `labels.noResults` by default. A button that clears the search goes\n * away with it, so send focus back to the search field when it's pressed.\n */\n noResults?: React.ReactNode;\n /**\n * Props of your own for a row's `Tr`, such as a handler or a class. The\n * table's own (`isSelected`) win. To wrap a row in a `ContextMenu`, build\n * the table from `useDataTable`'s props instead.\n */\n rowProps?: (row: TRow) => DataTableRowProps;\n /** Additional CSS classes, on the wrapper `<div>`. */\n className?: string;\n}\n\n/** What `rowProps` gives a row's `Tr`: any of its props but the ones the table sets. */\nexport type DataTableRowProps = Omit<TrProps, 'isSelected' | 'children'>;\n\n/** The type of `DataTable`, generic in the row. */\nexport type DataTableComponent = (<TRow>(\n props: DataTableProps<TRow> & React.RefAttributes<HTMLDivElement>\n) => React.ReactElement | null) & { displayName?: string };\n\n/** How long the status region waits after a change before it speaks, in ms. */\nconst statusDelay = 500;\n\nconst noColumns: never[] = [];\nconst noRows: never[] = [];\n\n/** A text signature of the search and the filters, to tell when they change. */\nfunction filterSignature(search: string, filters: DataTableFilters): string {\n try {\n return JSON.stringify([search, Object.entries(filters).sort()]);\n } catch {\n return search;\n }\n}\n\n/** Whether a node renders something. */\nconst isShown = (node: React.ReactNode) =>\n node !== undefined && node !== null && node !== false && node !== '';\n\n/**\n * The `DataTable` component is a table of records that people can sort,\n * search, page through and select rows from, rendered with bestax's own\n * `Table` parts, `Checkbox` and `Pagination`.\n *\n * It's a native table, as in the WAI-ARIA Authoring Practices' sortable\n * table: a sortable header holds a button, the sorted one carries\n * `aria-sort`, and each row's checkbox is named for the row. It runs on\n * `useDataTable`, which custom markup can use too.\n *\n * @example\n * <DataTable\n * caption=\"Users\"\n * columns={[\n * { id: 'name', header: 'Name', sortable: true, isRowHeader: true },\n * { id: 'role', header: 'Role', sortable: true },\n * ]}\n * data={users}\n * selectionMode=\"multiple\"\n * pageSize={10}\n * hasSearch\n * />\n */\nexport const DataTable = forwardRef(function DataTableRender<TRow>(\n {\n columns,\n data,\n table: given,\n getRowId,\n sort,\n defaultSort,\n onSortChange,\n selectionMode,\n selected,\n defaultSelected,\n onSelectedChange,\n pageSize,\n page,\n defaultPage,\n onPageChange,\n search,\n defaultSearch,\n onSearchChange,\n filters,\n defaultFilters,\n onFiltersChange,\n manual,\n rowCount,\n labels,\n caption,\n isBordered,\n isStriped,\n isNarrow,\n isHoverable,\n isFullwidth,\n isResponsive,\n hasSearch,\n toolbar,\n loading,\n empty,\n noResults,\n rowProps,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n ...props\n }: DataTableProps<TRow>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const own = useDataTable<TRow>({\n columns: columns ?? noColumns,\n data: data ?? noRows,\n getRowId,\n sort,\n defaultSort,\n onSortChange,\n selectionMode,\n selected,\n defaultSelected,\n onSelectedChange,\n pageSize,\n page,\n defaultPage,\n onPageChange,\n search,\n defaultSearch,\n onSearchChange,\n filters,\n defaultFilters,\n onFiltersChange,\n manual,\n rowCount,\n labels,\n });\n const table = given ?? own;\n const { state } = table;\n\n const { bulmaHelperClasses, rest } = useBulmaClasses(props);\n const rootClass = classNames(\n usePrefixedClassNames('data-table'),\n bulmaHelperClasses,\n className\n );\n const toolbarClass = usePrefixedClassNames('data-table-toolbar');\n const actionsClass = usePrefixedClassNames('data-table-actions');\n const emptyClass = usePrefixedClassNames('data-table-empty');\n\n const nameId = useId();\n const hasCaption = isShown(caption);\n const named = hasCaption || Boolean(ariaLabel || ariaLabelledby);\n useEffect(() => {\n if (!named) {\n warnOnce(\n 'DataTable:unnamed',\n '[bestax-bulma] <DataTable> has no accessible name. Pass a caption, ' +\n 'aria-label or aria-labelledby, so a screen reader can say which ' +\n 'table it is in.'\n );\n }\n }, [named]);\n const mixed = Boolean(given) && Boolean(columns || data);\n const bare = !given && (!columns || !data);\n useEffect(() => {\n if (mixed) {\n warnOnce(\n 'DataTable:table-and-columns',\n '[bestax-bulma] <DataTable> was given a `table` and `columns` or ' +\n '`data` too. It renders the `table` and leaves the rest unread, so ' +\n 'pass those to useDataTable instead.'\n );\n }\n if (bare) {\n warnOnce(\n 'DataTable:no-data',\n '[bestax-bulma] <DataTable> needs `columns` and `data`, or a `table` ' +\n 'from useDataTable.'\n );\n }\n }, [mixed, bare]);\n\n // The status region speaks only after the search, a filter or the page\n // changes, so nothing is read out as the page loads. `kind` is what last\n // changed, kept beside the values it changed from.\n const signature = filterSignature(state.search, state.filters);\n const [last, setLast] = useState({\n signature,\n page: state.page,\n kind: null as 'results' | 'page' | null,\n });\n if (last.signature !== signature) {\n setLast({ signature, page: state.page, kind: 'results' });\n } else if (last.page !== state.page) {\n setLast({ signature, page: state.page, kind: 'page' });\n }\n const { labels: words, rowCount: total, pageCount } = table;\n const size = state.pageSize;\n let message = '';\n if (last.kind && loading) {\n message = words.loading;\n } else if (last.kind === 'results' || (last.kind === 'page' && !total)) {\n message = words.results(total);\n } else if (last.kind === 'page') {\n // Without a page size, as when it's just been taken away, there's one\n // page, holding every row.\n const per = size ?? total;\n message = words.pageRange(\n (state.page - 1) * per + 1,\n Math.min(state.page * per, total),\n total\n );\n }\n // Written a moment after it changes, so typing in the search is read out\n // once it pauses rather than at every keystroke.\n const [said, setSaid] = useState('');\n useEffect(() => {\n const timer = setTimeout(() => setSaid(message), statusDelay);\n return () => clearTimeout(timer);\n }, [message]);\n\n const selectable = table.selectionMode === 'multiple';\n const sortable = table.columns.some(column => column.sortable);\n const columnCount = table.columns.length + (selectable ? 1 : 0);\n const pageRows = table.getRows('page');\n const selectAll = table.getSelectAllProps();\n\n const captionNode = hasCaption ? (\n <caption>\n <span id={nameId}>{caption}</span>\n {sortable && <span style={visuallyHidden}>{`, ${words.sortHint}.`}</span>}\n </caption>\n ) : sortable ? (\n <caption>\n <span style={visuallyHidden}>{words.sortHint}</span>\n </caption>\n ) : null;\n\n const header = (\n <Thead>\n <Tr>\n {selectable && (\n <Th scope=\"col\" isNarrow>\n <Checkbox\n {...selectAll}\n // While loading, the rows it would select aren't on screen.\n disabled={selectAll.disabled || Boolean(loading)}\n />\n </Th>\n )}\n {table.columns.map(column => (\n <Th key={column.id} {...table.getHeaderCellProps(column)}>\n {column.sortable ? (\n <button {...table.getSortButtonProps(column)}>\n {column.header}\n </button>\n ) : (\n column.header\n )}\n </Th>\n ))}\n </Tr>\n </Thead>\n );\n\n let body: React.ReactNode;\n if (loading) {\n body = Array.from({ length: size ?? 5 }, (_, index) => (\n <Tr key={index} aria-hidden=\"true\">\n {Array.from({ length: columnCount }, (__, cell) => (\n <Td key={cell}>\n <Skeleton variant=\"lines\" lines={1} />\n </Td>\n ))}\n </Tr>\n ));\n } else if (pageRows.length === 0) {\n // With `manual`, no rows under a search or a filter is no match: only\n // the server knows whether there's anything else.\n const nothing =\n table.getRows('all').length === 0 &&\n !(table.manual && isFiltering(state.search, state.filters));\n const content = nothing\n ? isShown(empty)\n ? empty\n : empty === undefined && (\n <EmptyState size=\"small\" description={words.empty} />\n )\n : isShown(noResults)\n ? noResults\n : noResults === undefined && (\n <EmptyState size=\"small\" description={words.noResults} />\n );\n body = (\n <Tr>\n <Td colSpan={columnCount} className={emptyClass}>\n {content}\n </Td>\n </Tr>\n );\n } else {\n body = pageRows.map(row => {\n const rowId = table.getRowId(row);\n return (\n <Tr key={rowId} {...rowProps?.(row)} {...table.getRowProps(row)}>\n {selectable && (\n <Td isNarrow>\n <Checkbox {...table.getSelectRowProps(row)} />\n </Td>\n )}\n {table.columns.map(column => {\n const text = table.getText(row, column.id);\n const content = column.cell\n ? column.cell(row, {\n value: table.getValue(row, column.id),\n text,\n rowId,\n })\n : text;\n const cellProps = table.getCellProps(row, column);\n return column.isRowHeader ? (\n <Th key={column.id} {...cellProps}>\n {content}\n </Th>\n ) : (\n <Td key={column.id} {...cellProps}>\n {content}\n </Td>\n );\n })}\n </Tr>\n );\n });\n }\n\n const tableElement = (\n <Table\n isBordered={isBordered}\n isStriped={isStriped}\n isNarrow={isNarrow}\n isHoverable={isHoverable}\n isFullwidth={isFullwidth}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-busy={loading || undefined}\n >\n {captionNode}\n {header}\n <Tbody>{body}</Tbody>\n </Table>\n );\n\n // The name the scroll area and the pager take from the table.\n const textName =\n ariaLabel || (typeof caption === 'string' ? caption : undefined);\n const scrollName = ariaLabel\n ? { 'aria-label': ariaLabel }\n : {\n 'aria-labelledby': ariaLabelledby || (hasCaption ? nameId : undefined),\n };\n\n // Pagination names itself \"pagination\" unless given another name.\n const pagerLabel =\n words.pagination || (textName ? `${textName} pages` : undefined);\n const pagerName = pagerLabel ? { 'aria-label': pagerLabel } : {};\n\n const toolbarContent = toolbar?.(table);\n const hasToolbar = hasSearch || isShown(toolbarContent);\n\n return (\n <div ref={ref} className={rootClass} {...rest}>\n {hasToolbar && (\n <div className={toolbarClass}>\n {hasSearch && (\n <Input label={words.search} {...table.getSearchProps()} />\n )}\n {isShown(toolbarContent) && (\n <div className={actionsClass}>{toolbarContent}</div>\n )}\n </div>\n )}\n {isResponsive ? (\n <ScrollArea orientation=\"horizontal\" {...scrollName}>\n {tableElement}\n </ScrollArea>\n ) : (\n tableElement\n )}\n {/* In the page from the start, so a change to it is announced. */}\n <div role=\"status\" aria-live=\"polite\" style={visuallyHidden}>\n {said}\n </div>\n {pageCount > 1 && (\n <Pagination {...table.getPaginationProps()} {...pagerName} />\n )}\n </div>\n );\n}) as DataTableComponent;\n\nDataTable.displayName = 'DataTable';\n\nexport default DataTable;\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAkJA;AACA,MAAM,WAAW,GAAG,GAAG;AAEvB,MAAM,SAAS,GAAY,EAAE;AAC7B,MAAM,MAAM,GAAY,EAAE;AAE1B;AACA,SAAS,eAAe,CAAC,MAAc,EAAE,OAAyB,EAAA;AAChE,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,MAAM;IACf;AACF;AAEA;AACA,MAAM,OAAO,GAAG,CAAC,IAAqB,KACpC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE;AAEtE;;;;;;;;;;;;;;;;;;;;;;AAsBG;MACU,SAAS,GAAG,UAAU,CAAC,SAAS,eAAe,CAC1D,EACE,OAAO,EACP,IAAI,EACJ,KAAK,EAAE,KAAK,EACZ,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,MAAM,EACN,aAAa,EACb,cAAc,EACd,OAAO,EACP,cAAc,EACd,eAAe,EACf,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,UAAU,EACV,SAAS,EACT,QAAQ,EACR,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,EACP,KAAK,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,GAAG,KAAK,EACa,EACvB,GAAuC,EAAA;IAEvC,MAAM,GAAG,GAAG,YAAY,CAAO;QAC7B,OAAO,EAAE,OAAO,IAAI,SAAS;QAC7B,IAAI,EAAE,IAAI,IAAI,MAAM;QACpB,QAAQ;QACR,IAAI;QACJ,WAAW;QACX,YAAY;QACZ,aAAa;QACb,QAAQ;QACR,eAAe;QACf,gBAAgB;QAChB,QAAQ;QACR,IAAI;QACJ,WAAW;QACX,YAAY;QACZ,MAAM;QACN,aAAa;QACb,cAAc;QACd,OAAO;QACP,cAAc;QACd,eAAe;QACf,MAAM;QACN,QAAQ;QACR,MAAM;AACP,KAAA,CAAC;AACF,IAAA,MAAM,KAAK,GAAG,KAAK,IAAI,GAAG;AAC1B,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK;IAEvB,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC;AAC3D,IAAA,MAAM,SAAS,GAAG,UAAU,CAC1B,qBAAqB,CAAC,YAAY,CAAC,EACnC,kBAAkB,EAClB,SAAS,CACV;AACD,IAAA,MAAM,YAAY,GAAG,qBAAqB,CAAC,oBAAoB,CAAC;AAChE,IAAA,MAAM,YAAY,GAAG,qBAAqB,CAAC,oBAAoB,CAAC;AAChE,IAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,kBAAkB,CAAC;AAE5D,IAAA,MAAM,MAAM,GAAG,KAAK,EAAE;AACtB,IAAA,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IACnC,MAAM,KAAK,GAAG,UAAU,IAAI,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC;IAChE,SAAS,CAAC,MAAK;QACb,IAAI,CAAC,KAAK,EAAE;YACV,QAAQ,CACN,mBAAmB,EACnB,qEAAqE;gBACnE,kEAAkE;AAClE,gBAAA,iBAAiB,CACpB;QACH;AACF,IAAA,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACX,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;AACxD,IAAA,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC;IAC1C,SAAS,CAAC,MAAK;QACb,IAAI,KAAK,EAAE;YACT,QAAQ,CACN,6BAA6B,EAC7B,kEAAkE;gBAChE,oEAAoE;AACpE,gBAAA,qCAAqC,CACxC;QACH;QACA,IAAI,IAAI,EAAE;YACR,QAAQ,CACN,mBAAmB,EACnB,sEAAsE;AACpE,gBAAA,oBAAoB,CACvB;QACH;AACF,IAAA,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;;;;AAKjB,IAAA,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;AAC9D,IAAA,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC;QAC/B,SAAS;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,QAAA,IAAI,EAAE,IAAiC;AACxC,KAAA,CAAC;AACF,IAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;AAChC,QAAA,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3D;SAAO,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE;AACnC,QAAA,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACxD;AACA,IAAA,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK;AAC3D,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ;IAC3B,IAAI,OAAO,GAAG,EAAE;AAChB,IAAA,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,EAAE;AACxB,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO;IACzB;AAAO,SAAA,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE;AACtE,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAChC;AAAO,SAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;;;AAG/B,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK;AACzB,QAAA,OAAO,GAAG,KAAK,CAAC,SAAS,CACvB,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC,EACjC,KAAK,CACN;IACH;;;IAGA,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;IACpC,SAAS,CAAC,MAAK;AACb,QAAA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;AAC7D,QAAA,OAAO,MAAM,YAAY,CAAC,KAAK,CAAC;AAClC,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAEb,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,KAAK,UAAU;AACrD,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC;AAC9D,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AACtC,IAAA,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,EAAE;IAE3C,MAAM,WAAW,GAAG,UAAU,IAC5BA,IAAA,CAAA,SAAA,EAAA,EAAA,QAAA,EAAA,CACEC,GAAA,CAAA,MAAA,EAAA,EAAM,EAAE,EAAE,MAAM,YAAG,OAAO,EAAA,CAAQ,EACjC,QAAQ,IAAIA,GAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAE,cAAc,EAAA,QAAA,EAAG,CAAA,EAAA,EAAK,KAAK,CAAC,QAAQ,GAAG,EAAA,CAAQ,CAAA,EAAA,CACjE,IACR,QAAQ,IACVA,GAAA,CAAA,SAAA,EAAA,EAAA,QAAA,EACEA,GAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAE,cAAc,EAAA,QAAA,EAAG,KAAK,CAAC,QAAQ,EAAA,CAAQ,EAAA,CAC5C,IACR,IAAI;IAER,MAAM,MAAM,IACVA,GAAA,CAAC,KAAK,cACJD,IAAA,CAAC,EAAE,EAAA,EAAA,QAAA,EAAA,CACA,UAAU,KACTC,IAAC,EAAE,EAAA,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAA,IAAA,EAAA,QAAA,EACtBA,GAAA,CAAC,QAAQ,EAAA,EAAA,GACH,SAAS;;AAEb,wBAAA,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,GAChD,EAAA,CACC,CACN,EACA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KACvBA,GAAA,CAAC,EAAE,EAAA,EAAA,GAAqB,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,YACrD,MAAM,CAAC,QAAQ,IACdA,GAAA,CAAA,QAAA,EAAA,EAAA,GAAY,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAA,QAAA,EACzC,MAAM,CAAC,MAAM,GACP,KAET,MAAM,CAAC,MAAM,CACd,EAAA,EAPM,MAAM,CAAC,EAAE,CAQb,CACN,CAAC,CAAA,EAAA,CACC,EAAA,CACC,CACT;AAED,IAAA,IAAI,IAAqB;IACzB,IAAI,OAAO,EAAE;AACX,QAAA,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,MAChDA,GAAA,CAAC,EAAE,EAAA,EAAA,aAAA,EAAyB,MAAM,EAAA,QAAA,EAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,MAC5CA,GAAA,CAAC,EAAE,EAAA,EAAA,QAAA,EACDA,GAAA,CAAC,QAAQ,IAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAE,CAAC,EAAA,CAAI,IAD/B,IAAI,CAER,CACN,CAAC,EAAA,EALK,KAAK,CAMT,CACN,CAAC;IACJ;AAAO,SAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;;;QAGhC,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;AACjC,YAAA,EAAE,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG;AACd,cAAE,OAAO,CAAC,KAAK;AACb,kBAAE;AACF,kBAAE,KAAK,KAAK,SAAS,KACjBA,IAAC,UAAU,EAAA,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAE,KAAK,CAAC,KAAK,GAAI;AAE3D,cAAE,OAAO,CAAC,SAAS;AACjB,kBAAE;kBACA,SAAS,KAAK,SAAS,KACrBA,GAAA,CAAC,UAAU,EAAA,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAE,KAAK,CAAC,SAAS,EAAA,CAAI,CAC1D;QACP,IAAI,IACFA,GAAA,CAAC,EAAE,cACDA,GAAA,CAAC,EAAE,IAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAA,QAAA,EAC5C,OAAO,EAAA,CACL,EAAA,CACF,CACN;IACH;SAAO;AACL,QAAA,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAG;YACxB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YACjC,QACED,KAAC,EAAE,EAAA,EAAA,GAAiB,QAAQ,GAAG,GAAG,CAAC,EAAA,GAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,aAC5D,UAAU,KACTC,GAAA,CAAC,EAAE,EAAA,EAAC,QAAQ,EAAA,IAAA,EAAA,QAAA,EACVA,GAAA,CAAC,QAAQ,EAAA,EAAA,GAAK,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAA,CAAI,GAC3C,CACN,EACA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAG;AAC1B,wBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;AAC1C,wBAAA,MAAM,OAAO,GAAG,MAAM,CAAC;AACrB,8BAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gCACf,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;gCACrC,IAAI;gCACJ,KAAK;6BACN;8BACD,IAAI;wBACR,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC;AACjD,wBAAA,OAAO,MAAM,CAAC,WAAW,IACvBA,GAAA,CAAC,EAAE,OAAqB,SAAS,EAAA,QAAA,EAC9B,OAAO,EAAA,EADD,MAAM,CAAC,EAAE,CAEb,KAELA,GAAA,CAAC,EAAE,EAAA,EAAA,GAAqB,SAAS,EAAA,QAAA,EAC9B,OAAO,IADD,MAAM,CAAC,EAAE,CAEb,CACN;AACH,oBAAA,CAAC,CAAC,CAAA,EAAA,EAzBK,KAAK,CA0BT;AAET,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,YAAY,IAChBD,IAAA,CAAC,KAAK,EAAA,EACJ,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,gBACZ,SAAS,EAAA,iBAAA,EACJ,cAAc,EAAA,WAAA,EACpB,OAAO,IAAI,SAAS,EAAA,QAAA,EAAA,CAE9B,WAAW,EACX,MAAM,EACPC,GAAA,CAAC,KAAK,cAAE,IAAI,EAAA,CAAS,CAAA,EAAA,CACf,CACT;;AAGD,IAAA,MAAM,QAAQ,GACZ,SAAS,KAAK,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IAClE,MAAM,UAAU,GAAG;AACjB,UAAE,EAAE,YAAY,EAAE,SAAS;AAC3B,UAAE;AACE,YAAA,iBAAiB,EAAE,cAAc,KAAK,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;SACvE;;AAGL,IAAA,MAAM,UAAU,GACd,KAAK,CAAC,UAAU,KAAK,QAAQ,GAAG,CAAA,EAAG,QAAQ,CAAA,MAAA,CAAQ,GAAG,SAAS,CAAC;AAClE,IAAA,MAAM,SAAS,GAAG,UAAU,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE;AAEhE,IAAA,MAAM,cAAc,GAAG,OAAO,GAAG,KAAK,CAAC;IACvC,MAAM,UAAU,GAAG,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAEvD,QACED,IAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAA,GAAM,IAAI,EAAA,QAAA,EAAA,CAC1C,UAAU,KACTA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,YAAY,EAAA,QAAA,EAAA,CACzB,SAAS,KACRC,GAAA,CAAC,KAAK,EAAA,EAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAA,GAAM,KAAK,CAAC,cAAc,EAAE,EAAA,CAAI,CAC3D,EACA,OAAO,CAAC,cAAc,CAAC,KACtBA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,YAAY,EAAA,QAAA,EAAG,cAAc,EAAA,CAAO,CACrD,CAAA,EAAA,CACG,CACP,EACA,YAAY,IACXA,GAAA,CAAC,UAAU,IAAC,WAAW,EAAC,YAAY,EAAA,GAAK,UAAU,EAAA,QAAA,EAChD,YAAY,EAAA,CACF,KAEb,YAAY,CACb,EAEDA,GAAA,CAAA,KAAA,EAAA,EAAK,IAAI,EAAC,QAAQ,EAAA,WAAA,EAAW,QAAQ,EAAC,KAAK,EAAE,cAAc,EAAA,QAAA,EACxD,IAAI,GACD,EACL,SAAS,GAAG,CAAC,KACZA,IAAC,UAAU,EAAA,EAAA,GAAK,KAAK,CAAC,kBAAkB,EAAE,EAAA,GAAM,SAAS,EAAA,CAAI,CAC9D,CAAA,EAAA,CACG;AAEV,CAAC;AAED,SAAS,CAAC,WAAW,GAAG,WAAW;;"}
|