From 08cd1f02b49c2ec91df6916e7f8c44f22363b005 Mon Sep 17 00:00:00 2001 From: Michael Chow Date: Mon, 8 Jul 2024 23:42:58 -0400 Subject: [PATCH] feat(data frame): Support `polars` (#1474) Co-authored-by: Barret Schloerke --- js/data-frame/cell.tsx | 8 +- js/data-frame/index.tsx | 23 +- js/data-frame/style-info.ts | 36 +- js/data-frame/types.ts | 2 +- setup.cfg | 1 + shiny/playwright/controller/_controls.py | 17 +- shiny/playwright/expect/_expect.py | 3 + shiny/render/__init__.py | 4 +- shiny/render/_data_frame.py | 184 +++------ shiny/render/_data_frame_utils/__init__.py | 8 +- .../render/_data_frame_utils/_databackend.py | 50 +++ .../_data_frame_utils/_datagridtable.py | 224 +++------- shiny/render/_data_frame_utils/_html.py | 36 ++ shiny/render/_data_frame_utils/_pandas.py | 130 ++++++ shiny/render/_data_frame_utils/_patch.py | 30 +- shiny/render/_data_frame_utils/_selection.py | 20 +- shiny/render/_data_frame_utils/_styles.py | 66 +-- shiny/render/_data_frame_utils/_tbl_data.py | 381 ++++++++++++++++++ shiny/render/_data_frame_utils/_types.py | 267 ++++++++++++ shiny/render/_data_frame_utils/_unsafe.py | 98 ----- shiny/render/_express.py | 8 +- shiny/render/_render.py | 23 +- shiny/types.py | 4 +- shiny/www/py-shiny/data-frame/data-frame.js | 8 +- .../www/py-shiny/data-frame/data-frame.js.map | 6 +- .../test_1390_selected_row_filtered.py | 2 +- .../components/data_frame/column_types/app.py | 34 ++ .../data_frame/data_view_info/app.py | 34 +- .../data_view_info/test_df_data_view_info.py | 32 +- .../shiny/components/data_frame/edit/app.py | 25 +- .../data_frame/html_columns_df/app.py | 178 +++++++- .../html_columns_df/df_organization/app.py | 123 ++++-- .../df_organization/test_df_organization.py | 59 ++- .../data_frame/html_columns_df/tabbing/app.py | 41 +- .../html_columns_df/tabbing/test_tabbing.py | 12 +- .../html_columns_df/test_html_columns.py | 15 +- .../data_frame/pandas_compatible/app.py | 40 ++ .../test_df_pandas_compatible.py | 17 + .../data_frame/row_selection/app.py | 49 ++- .../row_selection/test_row_selection.py | 7 +- .../shiny/components/data_frame/styles/app.py | 109 +++-- .../data_frame/styles/test_df_styles.py | 22 +- .../components/data_frame/styles_class/app.py | 82 ++++ .../styles_class/test_df_styles_class.py | 64 +++ .../data_frame/validate_column_labels/app.py | 56 ++- .../test_validate_column_labels.py | 10 +- .../data_frame/validate_data_save/app.py | 7 - .../pytest/test_render_data_frame_tbl_data.py | 190 +++++++++ 48 files changed, 2084 insertions(+), 761 deletions(-) create mode 100644 shiny/render/_data_frame_utils/_databackend.py create mode 100644 shiny/render/_data_frame_utils/_html.py create mode 100644 shiny/render/_data_frame_utils/_pandas.py create mode 100644 shiny/render/_data_frame_utils/_tbl_data.py create mode 100644 shiny/render/_data_frame_utils/_types.py delete mode 100644 shiny/render/_data_frame_utils/_unsafe.py create mode 100644 tests/playwright/shiny/components/data_frame/column_types/app.py create mode 100644 tests/playwright/shiny/components/data_frame/pandas_compatible/app.py create mode 100644 tests/playwright/shiny/components/data_frame/pandas_compatible/test_df_pandas_compatible.py create mode 100644 tests/playwright/shiny/components/data_frame/styles_class/app.py create mode 100644 tests/playwright/shiny/components/data_frame/styles_class/test_df_styles_class.py create mode 100644 tests/pytest/test_render_data_frame_tbl_data.py diff --git a/js/data-frame/cell.tsx b/js/data-frame/cell.tsx index fae5d73f1..885a70306 100644 --- a/js/data-frame/cell.tsx +++ b/js/data-frame/cell.tsx @@ -54,8 +54,8 @@ type CellHtmlValue = { // eslint-disable-next-line @typescript-eslint/no-explicit-any const isShinyHtml = (x: any): x is CellHtmlValue => { return ( - x !== null && - typeof x !== "string" && + x !== null && // Note: x === null has `typeof x === "object"` + typeof x === "object" && Object.prototype.hasOwnProperty.call(x, "isShinyHtml") && x.isShinyHtml === true ); @@ -83,6 +83,7 @@ interface TableBodyCellProps { setData: (fn: (draft: unknown[][]) => void) => void; cellEditInfo: CellEdit | undefined; cellStyle: CellStyle | undefined; + cellClassName: string | undefined; setCellEditMapAtLoc: SetCellEditMapAtLoc; selection: SelectionSet; } @@ -100,6 +101,7 @@ export const TableBodyCell: FC = ({ getSortedRowModel, cellEditInfo, cellStyle, + cellClassName, setData, setCellEditMapAtLoc, selection, @@ -402,7 +404,7 @@ export const TableBodyCell: FC = ({ let content: ReactElement | ReturnType | undefined = undefined; const cellTitle = errorTitle; - let tableCellClass: string | undefined = undefined; + let tableCellClass: string | undefined = cellClassName; const addToTableCellClass = (x: string | undefined) => { if (!x) return; if (tableCellClass) { diff --git a/js/data-frame/index.tsx b/js/data-frame/index.tsx index be6a17321..99b5d0c75 100644 --- a/js/data-frame/index.tsx +++ b/js/data-frame/index.tsx @@ -109,16 +109,27 @@ const ShinyDataGrid: FC> = ({ columns, typeHints, data: tableDataProp, - options: payloadOptions, + options: payloadOptions = { + width: undefined, + height: undefined, + fill: false, + styles: [], + }, } = payload; - const { width, height, fill, filters: withFilters } = payloadOptions; + const { + width, + height, + fill, + filters: withFilters, + styles: initStyleInfos, + } = payloadOptions; const containerRef = useRef(null); const theadRef = useRef(null); const tbodyRef = useRef(null); const _useStyleInfo = useStyleInfoMap({ - initStyleInfos: payloadOptions["styles"], + initStyleInfos: initStyleInfos ?? [], nrow: tableDataProp.length, ncol: columns.length, }); @@ -486,7 +497,6 @@ const ShinyDataGrid: FC> = ({ useEffect(() => { const handleStyles = (event: CustomEvent<{ styles: StyleInfo[] }>) => { const styles = event.detail.styles; - resetStyleInfos(); setStyleInfos(styles); }; @@ -503,7 +513,7 @@ const ShinyDataGrid: FC> = ({ handleStyles as EventListener ); }; - }, [setStyleInfos]); + }, [id, setStyleInfos]); useEffect(() => { if (!id) return; @@ -765,7 +775,7 @@ const ShinyDataGrid: FC> = ({ rowIndex, columnIndex ); - const cellStyle = getCellStyle( + const { cellStyle, cellClassName } = getCellStyle( styleInfoMap, "body", rowIndex, @@ -787,6 +797,7 @@ const ShinyDataGrid: FC> = ({ getSortedRowModel={table.getSortedRowModel} cellEditInfo={cellEditInfo} cellStyle={cellStyle} + cellClassName={cellClassName} setData={setTableData} setCellEditMapAtLoc={setCellEditMapAtLoc} selection={selection} diff --git a/js/data-frame/style-info.ts b/js/data-frame/style-info.ts index 420051668..e9d475753 100644 --- a/js/data-frame/style-info.ts +++ b/js/data-frame/style-info.ts @@ -83,12 +83,30 @@ export const useStyleInfoMap = ({ rowIndex, columnIndex, }); + const prevObj = draft.get(key) ?? { style: {}, class: undefined }; + let newClass: string | undefined = undefined; + if (prevObj.class) { + if (styleInfo.class) { + newClass = `${prevObj.class} ${styleInfo.class}`; + } else { + newClass = prevObj.class; + } + } else { + if (styleInfo.class) { + newClass = styleInfo.class; + } else { + newClass = undefined; + } + } draft.set(key, { - location: styleInfo.location, + location, rowIndex, columnIndex, - style: styleInfo.style, - class: styleInfo.class, + style: { + ...prevObj.style, + ...styleInfo.style, + }, + class: newClass, }); } } @@ -105,11 +123,13 @@ export const useStyleInfoMap = ({ const setStyleInfos = useCallback( (styleInfos: StyleInfo[]) => { + // When settings styleInfos, reset all style infos + resetStyleInfos(); for (const styleInfo of styleInfos) { setStyleInfo(styleInfo); } }, - [setStyleInfo] + [setStyleInfo, resetStyleInfos] ); // Init all style infos @@ -138,9 +158,13 @@ export const getCellStyle = ( location: StyleLocation, rowIndex: number, columnIndex: number -): CellStyle | undefined => { +): { cellStyle: CellStyle | undefined; cellClassName: string | undefined } => { const key = makeStyleInfoMapKey({ location, rowIndex, columnIndex }); - return x.get(key)?.style; + const obj = x.get(key); + return { + cellStyle: obj?.style, + cellClassName: obj?.class, + }; }; // Use a DOM element to convert CSS string to object diff --git a/js/data-frame/types.ts b/js/data-frame/types.ts index b83e2f674..02d327add 100644 --- a/js/data-frame/types.ts +++ b/js/data-frame/types.ts @@ -24,6 +24,7 @@ export interface DataGridOptions { width?: string; height?: string; fill?: boolean; + styles: StyleInfo[]; } export interface PandasData { @@ -33,7 +34,6 @@ export interface PandasData { options: DataGridOptions; typeHints?: ReadonlyArray; editable?: boolean; - styles: StyleInfo[]; } export interface PatchInfo { diff --git a/setup.cfg b/setup.cfg index a042149ad..6c4ba86fb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -114,6 +114,7 @@ dev = matplotlib pandas pandas-stubs + polars numpy shinyswatch>=0.2.4 # Chat() provider types diff --git a/shiny/playwright/controller/_controls.py b/shiny/playwright/controller/_controls.py index 42cc5c5df..fb20d77bf 100644 --- a/shiny/playwright/controller/_controls.py +++ b/shiny/playwright/controller/_controls.py @@ -6255,10 +6255,12 @@ def set_sort( ---------- sort The sorting configuration to apply. Can be one of the following: - int: Index of the column to sort by (ascending order by default). - ColumnSort: A dictionary specifying a single column sort with 'col' and 'desc' keys. - list[ColumnSort]: A list of dictionaries for multi-column sorting. - None: No sorting applied (not implemented in the current code). + * `int`: Index of the column to sort by (ascending order by default). + * `ColumnSort`: A dictionary specifying a single column sort with 'col' and 'desc' keys. + * `list[int | ColumnSort]`: A list of ints or dictionaries for multi-column sorting. + * `None`: No sorting applied (not implemented in the current code). + + If a `desc` values is provided within your `ColumnSort` shaped dictionary, then the direction will be set to that value. If no `desc` value is provided, the column will be sorted in the default sorting order. timeout The maximum time to wait for the action to complete. Defaults to `None`. """ @@ -6348,10 +6350,9 @@ def set_filter( ---------- filter The filter to apply. Can be one of the following: - None: Resets all filters. - str: A string filter (deprecated, use ColumnFilterStr instead). - ColumnFilterStr: A dictionary specifying a string filter with 'col' and 'value' keys. - ColumnFilterNumber: A dictionary specifying a numeric range filter with 'col' and 'value' keys. + * `None`: Resets all filters. + * `ColumnFilterStr`: A dictionary specifying a string filter with 'col' and 'value' keys. + * `ColumnFilterNumber`: A dictionary specifying a numeric range filter with 'col' and 'value' keys. timeout The maximum time to wait for the action to complete. Defaults to `None`. """ diff --git a/shiny/playwright/expect/_expect.py b/shiny/playwright/expect/_expect.py index dd83a6899..5af8d013b 100644 --- a/shiny/playwright/expect/_expect.py +++ b/shiny/playwright/expect/_expect.py @@ -45,6 +45,7 @@ def expect_attribute_to_have_value( def expect_to_have_class( loc: Locator, cls: str, + *, timeout: Timeout = None, ) -> None: """Expect a locator to contain a class value""" @@ -56,6 +57,7 @@ def expect_to_have_class( def expect_not_to_have_class( loc: Locator, cls: str, + *, timeout: Timeout = None, ) -> None: """Expect a locator not to contain a class value""" @@ -69,6 +71,7 @@ def expect_to_have_style( css_key: str, # Str representation for value. Will be put in a regex with `css_key` css_value: StyleValue, + *, timeout: Timeout = None, ) -> None: """Expect the `style` attribute to have a value. If `value` is `None`, then the style attribute should not exist.""" diff --git a/shiny/render/__init__.py b/shiny/render/__init__.py index 721b3634c..3a2678d45 100644 --- a/shiny/render/__init__.py +++ b/shiny/render/__init__.py @@ -12,7 +12,8 @@ DataTable, data_frame, ) -from ._data_frame_utils import CellSelection, StyleInfo +from ._data_frame_utils import CellSelection +from ._data_frame_utils._types import DataFrameLike, StyleInfo from ._deprecated import ( # noqa: F401 RenderFunction, # pyright: ignore[reportUnusedImport] RenderFunctionAsync, # pyright: ignore[reportUnusedImport] @@ -47,4 +48,5 @@ "CellValue", "CellSelection", "StyleInfo", + "DataFrameLike", ) diff --git a/shiny/render/_data_frame.py b/shiny/render/_data_frame.py index 157ead9e8..1ff97b4be 100644 --- a/shiny/render/_data_frame.py +++ b/shiny/render/_data_frame.py @@ -2,36 +2,25 @@ import warnings +# TODO-barret; Make DataFrameLikeT generic bound to DataFrameLike. Add this generic type to the DataGrid and DataTable # TODO-barret; Should `.input_cell_selection()` ever return None? Is that value even helpful? Empty lists would be much more user friendly. # * For next release: Agreed to remove `None` type. # * For this release: Immediately make PR to remove `.input_` from `.input_cell_selection()` # TODO-barret-render.data_frame; Docs # TODO-barret-render.data_frame; Add examples! -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Dict, - Literal, - TypeVar, - Union, - cast, -) +from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Literal, Union, cast from htmltools import Tag from .. import reactive, ui from .._docstring import add_example -from .._typing_extensions import Annotated, TypedDict from .._utils import wrap_async from ..session._utils import require_active_session, session_context -from ..types import ListOrTuple +from ..types import JsonifiableDict, ListOrTuple from ._data_frame_utils import ( AbstractTabularData, BrowserCellSelection, CellPatch, - CellPatchProcessed, CellSelection, CellValue, DataGrid, @@ -43,60 +32,35 @@ SelectionModes, as_cell_selection, assert_patches_shape, - cast_to_pandas, - cell_patch_processed_to_jsonifiable, wrap_shiny_html, ) from ._data_frame_utils._styles import as_browser_style_infos -from ._data_frame_utils._unsafe import serialize_numpy_dtype +from ._data_frame_utils._tbl_data import ( + apply_frame_patches, + as_data_frame_like, + frame_columns, + frame_shape, + serialize_dtype, + subset_frame, +) +from ._data_frame_utils._types import ( + CellPatchProcessed, + ColumnFilter, + ColumnSort, + DataFrameLike, + FrameRender, + cell_patch_processed_to_jsonifiable, + frame_render_to_jsonifiable, +) # as_selection_location_js, from .renderer import Jsonifiable, Renderer, ValueFn if TYPE_CHECKING: - import pandas as pd - from ..session import Session - DataFrameT = TypeVar("DataFrameT", bound=pd.DataFrame) - # TODO-barret-render.data_frame; Pandas, Polars, api compat, etc.; Today, we only support Pandas - - from ._data_frame_utils._datagridtable import DataFrameResult - -class ColumnSort(TypedDict): - col: int - desc: bool - - -class ColumnFilterStr(TypedDict): - col: int - value: str - - -class ColumnFilterNumber(TypedDict): - col: int - value: ( - tuple[int | float, int | float] - | tuple[int | float, None] - | tuple[None, int | float] - | Annotated[list[int | float | None], 2] - ) - - -ColumnFilter = Union[ColumnFilterStr, ColumnFilterNumber] - - -class DataViewInfo(TypedDict): - sort: tuple[ColumnSort, ...] - filter: tuple[ColumnFilter, ...] - - rows: tuple[int, ...] # sorted and filtered row number - selected_rows: tuple[int, ...] # selected and sorted and filtered row number - # selected_columns: tuple[int, ...] # selected and sorted and filtered row number - - # # TODO-future; Use `dataframe-api-compat>=0.2.6` to injest dataframes and return standardized dataframe structures # # TODO-future: Find this type definition: https://github.com/data-apis/dataframe-api-compat/blob/273c0be45962573985b3a420869d0505a3f9f55d/dataframe_api_compat/polars_standard/dataframe_object.py#L22 # # Related: https://data-apis.org/dataframe-api-compat/quick_start/ @@ -242,7 +206,7 @@ class data_frame(Renderer[DataFrameResult]): Reactive value of the data frame's edits provided by the user. """ - data: reactive.Calc_[pd.DataFrame] + data: reactive.Calc_[DataFrameLike] """ Reactive value of the data frame's output data. @@ -250,20 +214,20 @@ class data_frame(Renderer[DataFrameResult]): app's render function. If it is mutated in place, it **will** modify the original data. - Even if the rendered data value was not `pd.DataFrame`, this method currently - returns the converted `pd.DataFrame`. + Even if the rendered data value was not of type `pd.DataFrame` or `pl.DataFrame`, this method currently + converts it to a `pd.DataFrame`. """ - _data_view_all: reactive.Calc_[pd.DataFrame] + _data_view_all: reactive.Calc_[DataFrameLike] """ Reactive value of the full (sorted and filtered) data. """ - _data_view_selected: reactive.Calc_[pd.DataFrame] + _data_view_selected: reactive.Calc_[DataFrameLike] """ Reactive value of the selected rows of the (sorted and filtered) data. """ @add_example(ex_dir="../api-examples/data_frame_data_view") - def data_view(self, *, selected: bool = False) -> pd.DataFrame: + def data_view(self, *, selected: bool = False) -> DataFrameLike: """ Reactive function that retrieves the data how it is viewed within the browser. @@ -283,7 +247,7 @@ def data_view(self, *, selected: bool = False) -> pd.DataFrame: ------- : A view of the data frame as seen in the browser. Even if the rendered data - value was not `pd.DataFrame`, this method currently returns the converted + value was not of type `pd.DataFrame` or `pl.DataFrame`, this method currently returns the converted `pd.DataFrame`. See Also @@ -335,7 +299,7 @@ def data_view(self, *, selected: bool = False) -> pd.DataFrame: The row numbers of the data frame that are currently being viewed in the browser after sorting and filtering has been applied. """ - _data_patched: reactive.Calc_[pd.DataFrame] + _data_patched: reactive.Calc_[DataFrameLike] """ Reactive value of the data frame's patched data. @@ -372,8 +336,6 @@ def _reset_reactives(self) -> None: def _init_reactives(self) -> None: - import pandas as pd - from .. import req # Init @@ -388,7 +350,7 @@ def self_cell_patches() -> list[CellPatchProcessed]: self.cell_patches = self_cell_patches @reactive.calc - def self_data() -> pd.DataFrame: + def self_data() -> DataFrameLike: value = self._value() req(value) @@ -397,9 +359,6 @@ def self_data() -> pd.DataFrame: f"Unsupported type returned from render function: {type(value)}. Expected `DataGrid` or `DataTable`" ) - if not isinstance(value.data, pd.DataFrame): - raise TypeError(f"Unexpected type for self._data: {type(value.data)}") - return value.data self.data = self_data @@ -429,7 +388,9 @@ def self_cell_selection() -> CellSelection: selection_modes=self.selection_modes(), data=self.data(), data_view_rows=self.data_view_rows(), - data_view_cols=tuple(range(self.data().shape[1])), + # TODO-barret: replace methods like .shape, .loc. .iat with those from + # _tbl_data.py, test in the playright app. + data_view_cols=tuple(range(frame_shape(self.data())[1])), ) return cell_selection @@ -461,55 +422,15 @@ def self_data_view_rows() -> tuple[int, ...]: self.data_view_rows = self_data_view_rows - # @reactive.calc - # def self__data_selected() -> pd.DataFrame: - # # browser_cell_selection - # bcs = self.cell_selection() - # if bcs is None: - # req(False) - # raise RuntimeError("This should never be reached for typing purposes") - # data_selected = self.data_view(selected=False) - # if bcs["type"] == "none": - # # Empty subset - # return data_selected.iloc[[]] - # elif bcs["type"] == "row": - # # Seems to not work with `tuple[int, ...]`, - # # but converting to a list does! - # rows = list(bcs["rows"]) - # return data_selected.iloc[rows] - # elif bcs["type"] == "col": - # # Seems to not work with `tuple[int, ...]`, - # # but converting to a list does! - # cols = list(bcs["cols"]) - # return data_selected.iloc[:, cols] - # elif bcs["type"] == "rect": - # return data_selected.iloc[ - # bcs["rows"][0] : bcs["rows"][1], - # bcs["cols"][0] : bcs["cols"][1], - # ] - # raise RuntimeError(f"Unhandled selection type: {bcs['type']}") - # # self._data_selected = self__data_selected - @reactive.calc - def self__data_patched() -> pd.DataFrame: - # Enable copy-on-write mode for the data; - # Use `deep=False` to avoid copying the full data; CoW will copy the necessary data when modified - with pd.option_context("mode.copy_on_write", True): - # Apply patches! - data = self.data().copy(deep=False) - for cell_patch in self.cell_patches(): - data.iat[ # pyright: ignore[reportUnknownMemberType] - cell_patch["row_index"], - cell_patch["column_index"], - ] = cell_patch["value"] - - return data + def self__data_patched() -> DataFrameLike: + return apply_frame_patches(self.data(), self.cell_patches()) self._data_patched = self__data_patched # Apply filtering and sorting # https://github.com/posit-dev/py-shiny/issues/1240 - def _subset_data_view(selected: bool) -> pd.DataFrame: + def _subset_data_view(selected: bool) -> DataFrameLike: """ Helper method to subset data according to what is viewed in the browser; @@ -528,28 +449,20 @@ def _subset_data_view(selected: bool) -> pd.DataFrame: would require tuple info of all cells selected. """ - # Enable copy-on-write mode for the data; - # Use `deep=False` to avoid copying the full data; CoW will copy the necessary data when modified - with pd.option_context("mode.copy_on_write", True): - # Get patched data - data = self._data_patched().copy(deep=False) + if selected: + rows = self.cell_selection()["rows"] + else: + rows = self.data_view_rows() - if selected: - rows = self.cell_selection()["rows"] - else: - rows = self.data_view_rows() - - # Turn into list for pandas compatibility - rows = list(rows) - return data.iloc[rows] + return subset_frame(self._data_patched(), rows=rows) # Helper reactives so that internal calculations can be cached for use in other calculations @reactive.calc - def self__data_view() -> pd.DataFrame: + def self__data_view() -> DataFrameLike: return _subset_data_view(selected=False) @reactive.calc - def self__data_view_selected() -> pd.DataFrame: + def self__data_view_selected() -> DataFrameLike: return _subset_data_view(selected=True) self._data_view_all = self__data_view @@ -835,7 +748,7 @@ def _set_output_metadata(self, *, output_id: str) -> None: "We would be curious to know your use case!" ) - async def render(self) -> Jsonifiable: + async def render(self) -> JsonifiableDict | None: # Reset value self._reset_reactives() self._reset_patches_handler() @@ -846,7 +759,7 @@ async def render(self) -> Jsonifiable: if not isinstance(value, AbstractTabularData): value = DataGrid( - cast_to_pandas( + as_data_frame_like( value, "@render.data_frame doesn't know how to render objects of type", ) @@ -866,13 +779,14 @@ async def render(self) -> Jsonifiable: ) self._type_hints.set(type_hints) - return { + ret: FrameRender = { "payload": payload, "patchInfo": { "key": patch_key, }, "selectionModes": self.selection_modes().as_dict(), } + return frame_render_to_jsonifiable(ret) async def _send_message_to_browser(self, handler: str, obj: dict[str, Any]): @@ -989,13 +903,13 @@ async def update_sort( if len(sort) > 0: with reactive.isolate(): data = self.data() - ncol = len(data.columns) + ncol = frame_shape(data)[1] for val in sort: val_dict: ColumnSort if isinstance(val, int): - col: pd.Series[Any] = data.iloc[:, val] - desc = serialize_numpy_dtype(col)["type"] == "numeric" + col = frame_columns(data)[val] + desc = serialize_dtype(col)["type"] == "numeric" val_dict = {"col": val, "desc": desc} val_dict: ColumnSort = ( val if isinstance(val, dict) else {"col": val, "desc": True} diff --git a/shiny/render/_data_frame_utils/__init__.py b/shiny/render/_data_frame_utils/__init__.py index a7f2edfb1..32dacc67d 100644 --- a/shiny/render/_data_frame_utils/__init__.py +++ b/shiny/render/_data_frame_utils/__init__.py @@ -1,21 +1,17 @@ from ._datagridtable import ( AbstractTabularData, - CellHtml, DataGrid, DataTable, - cast_to_pandas, - wrap_shiny_html, ) +from ._html import wrap_shiny_html from ._patch import ( CellPatch, - CellPatchProcessed, CellValue, PatchesFn, PatchesFnSync, PatchFn, PatchFnSync, assert_patches_shape, - cell_patch_processed_to_jsonifiable, ) from ._selection import ( BrowserCellSelection, @@ -25,12 +21,12 @@ as_cell_selection, ) from ._styles import StyleInfo +from ._types import CellHtml, CellPatchProcessed, cell_patch_processed_to_jsonifiable __all__ = ( "AbstractTabularData", "DataGrid", "DataTable", - "cast_to_pandas", "wrap_shiny_html", "CellHtml", "CellPatch", diff --git a/shiny/render/_data_frame_utils/_databackend.py b/shiny/render/_data_frame_utils/_databackend.py new file mode 100644 index 000000000..0f0f0819a --- /dev/null +++ b/shiny/render/_data_frame_utils/_databackend.py @@ -0,0 +1,50 @@ +# Copyright (c) 2024 databackend contributors (MIT License) +# +# See https://github.com/machow/databackend + +# pyright: reportMissingTypeArgument=false +# pyright: reportUnknownArgumentType=false +# pyright: reportUnknownMemberType=false +# pyright: reportUnknownParameterType=false +# pyright: reportUnknownVariableType=false + +import importlib +import sys +from abc import ABCMeta + + +def _load_class(mod_name: str, cls_name: str): + mod = importlib.import_module(mod_name) + return getattr(mod, cls_name) + + +class _AbstractBackendMeta(ABCMeta): + def register_backend(cls, mod_name: str, cls_name: str): + cls._backends.append( # pyright: ignore[reportGeneralTypeIssues, reportAttributeAccessIssue] + (mod_name, cls_name) + ) + + # """Clear the caches (for debugging or testing)""" + cls._abc_caches_clear() # pyright: ignore[reportGeneralTypeIssues,reportAttributeAccessIssue] + + +class AbstractBackend(metaclass=_AbstractBackendMeta): + @classmethod + def __init_subclass__(cls): + if not hasattr(cls, "_backends"): + cls._backends = [] + + @classmethod + def __subclasshook__(cls, subclass: type): + for mod_name, cls_name in cls._backends: + if mod_name not in sys.modules: + # module isn't loaded, so it can't be the subclass + # we don't want to import the module to explicitly run the check + # so skip here. + continue + else: + parent_candidate = _load_class(mod_name, cls_name) + if issubclass(subclass, parent_candidate): + return True + + return NotImplemented diff --git a/shiny/render/_data_frame_utils/_datagridtable.py b/shiny/render/_data_frame_utils/_datagridtable.py index 5d8f4df51..1bda4163a 100644 --- a/shiny/render/_data_frame_utils/_datagridtable.py +++ b/shiny/render/_data_frame_utils/_datagridtable.py @@ -1,27 +1,11 @@ from __future__ import annotations import abc -import json # TODO-barret-future; make DataTable and DataGrid generic? By currently accepting `object`, it is difficult to capture the generic type of the data. -from typing import ( - TYPE_CHECKING, - Any, - Literal, - Protocol, - TypeVar, - Union, - cast, - overload, - runtime_checkable, -) - -from htmltools import TagNode +from typing import TYPE_CHECKING, Literal, Union from ..._docstring import add_example, no_example -from ..._typing_extensions import TypedDict -from ...session._utils import RenderedDeps, require_active_session -from ...types import Jsonifiable from ._selection import ( RowSelectionModeDeprecated, SelectionModeInput, @@ -29,32 +13,28 @@ as_selection_modes, ) from ._styles import StyleFn, StyleInfo, as_browser_style_infos, as_style_infos -from ._unsafe import is_shiny_html, serialize_numpy_dtypes +from ._tbl_data import as_data_frame_like, serialize_frame +from ._types import DataFrameLike, FrameJson, PandasCompatible if TYPE_CHECKING: - import pandas as pd - - from ...session import Session - - DataFrameT = TypeVar("DataFrameT", bound=pd.DataFrame) - # TODO-future; Pandas, Polars, api compat, etc.; Today, we only support Pandas DataFrameResult = Union[ None, - pd.DataFrame, + DataFrameLike, "DataGrid", "DataTable", + PandasCompatible, ] else: # The parent class of `data_frame` needs something to hold onto # To avoid loading pandas, we use `object` as a placeholder - DataFrameResult = Union[None, object, "DataGrid", "DataTable"] + DataFrameResult = Union[None, object] class AbstractTabularData(abc.ABC): @abc.abstractmethod - def to_payload(self) -> dict[str, Jsonifiable]: ... + def to_payload(self) -> FrameJson: ... @add_example(ex_dir="../../api-examples/data_frame") @@ -120,7 +100,7 @@ class DataGrid(AbstractTabularData): * :class:`~shiny.render.DataTable` """ - data: pd.DataFrame + data: DataFrameLike width: str | float | None height: str | float | None summary: bool | str @@ -131,7 +111,7 @@ class DataGrid(AbstractTabularData): def __init__( self, - data: pd.DataFrame | PandasCompatible, + data: DataFrameLike | PandasCompatible, *, width: str | float | None = "fit-content", height: str | float | None = None, @@ -143,7 +123,7 @@ def __init__( row_selection_mode: RowSelectionModeDeprecated = "deprecated", ): - self.data = cast_to_pandas( + self.data = as_data_frame_like( data, "The DataGrid() constructor didn't expect a 'data' argument of type", ) @@ -156,27 +136,27 @@ def __init__( self.selection_modes = as_selection_modes( selection_mode, name="DataGrid", - editable=self.editable, row_selection_mode=row_selection_mode, ) self.styles = as_style_infos(styles) - def to_payload(self) -> dict[str, Jsonifiable]: - res = serialize_pandas_df(self.data) - - res["options"] = dict( - width=self.width, - height=self.height, - summary=self.summary, - filters=self.filters, - editable=self.editable, - style="grid", - fill=self.height is None, - styles=as_browser_style_infos( - self.styles, - data=self.data, - ), - ) + def to_payload(self) -> FrameJson: + res: FrameJson = { + **serialize_frame(self.data), + "options": { + "width": self.width, + "height": self.height, + "summary": self.summary, + "filters": self.filters, + "editable": self.editable, + "style": "grid", + "fill": self.height is None, + "styles": as_browser_style_infos( + self.styles, + data=self.data, + ), + }, + } return res @@ -243,7 +223,7 @@ class DataTable(AbstractTabularData): * :class:`~shiny.render.DataGrid` """ - data: pd.DataFrame + data: DataFrameLike width: str | float | None height: str | float | None summary: bool | str @@ -253,7 +233,7 @@ class DataTable(AbstractTabularData): def __init__( self, - data: pd.DataFrame | PandasCompatible, + data: DataFrameLike | PandasCompatible, *, width: str | float | None = "fit-content", height: str | float | None = "500px", @@ -265,7 +245,7 @@ def __init__( styles: StyleInfo | list[StyleInfo] | StyleFn | None = None, ): - self.data = cast_to_pandas( + self.data = as_data_frame_like( data, "The DataTable() constructor didn't expect a 'data' argument of type", ) @@ -278,136 +258,24 @@ def __init__( self.selection_modes = as_selection_modes( selection_mode, name="DataTable", - editable=self.editable, row_selection_mode=row_selection_mode, ) self.styles = as_style_infos(styles) - def to_payload(self) -> dict[str, Jsonifiable]: - res = serialize_pandas_df(self.data) - res["options"] = dict( - width=self.width, - height=self.height, - summary=self.summary, - filters=self.filters, - editable=self.editable, - style="table", - styles=as_browser_style_infos( - self.styles, - data=self.data, - ), - ) + def to_payload(self) -> FrameJson: + res: FrameJson = { + **serialize_frame(self.data), + "options": { + "width": self.width, + "height": self.height, + "summary": self.summary, + "filters": self.filters, + "editable": self.editable, + "style": "table", + "styles": as_browser_style_infos( + self.styles, + data=self.data, + ), + }, + } return res - - -def serialize_pandas_df(df: "pd.DataFrame") -> dict[str, Any]: - - columns = df.columns.tolist() - columns_set = set(columns) - if len(columns_set) != len(columns): - raise ValueError( - "The column names of the pandas DataFrame are not unique." - " This is not supported by the data_frame renderer." - ) - - # Currently, we don't make use of the index; drop it so we don't error trying to - # serialize it or something - df = df.reset_index(drop=True) - - # # Can we keep the original column information? - # # Maybe we need to inspect the original columns for any "unknown" column type. See if it contains any HTML or Tag objects - # for col in columns: - # if df[col].dtype.name == "unknown": - # print(df[col].to_list()) - # raise ValueError( - # "The pandas DataFrame contains columns of type 'object'." - # " This is not supported by the data_frame renderer." - # ) - - type_hints = serialize_numpy_dtypes(df) - - # Auto opt-in for html columns - html_columns = [ - i for i, type_hint in enumerate(type_hints) if type_hint["type"] == "html" - ] - - if len(html_columns) > 0: - # Enable copy-on-write mode for the data; - # Use `deep=False` to avoid copying the full data; CoW will copy the necessary data when modified - import pandas as pd - - with pd.option_context("mode.copy_on_write", True): - df = df.copy(deep=False) - session = require_active_session(None) - - def wrap_shiny_html_with_session(x: TagNode): - return wrap_shiny_html(x, session=session) - - for html_column in html_columns: - # _upgrade_ all the HTML columns to `CellHtml` json objects - df[df.columns[html_column]] = df[ - df.columns[html_column] - ].apply( # pyright: ignore[reportUnknownMemberType] - wrap_shiny_html_with_session - ) - - res = json.loads( - # {index: [index], columns: [columns], data: [values]} - df.to_json(None, orient="split") # pyright: ignore[reportUnknownMemberType] - ) - - res["typeHints"] = type_hints - - # print(json.dumps(res, indent=4)) - return res - - -@runtime_checkable -class PandasCompatible(Protocol): - # Signature doesn't matter, runtime_checkable won't look at it anyway - def to_pandas(self) -> pd.DataFrame: ... - - -@overload -def cast_to_pandas(x: DataFrameT, error_message_begin: str) -> DataFrameT: ... - - -@overload -def cast_to_pandas(x: PandasCompatible, error_message_begin: str) -> pd.DataFrame: ... - - -def cast_to_pandas( - x: DataFrameT | PandasCompatible, error_message_begin: str -) -> DataFrameT | pd.DataFrame: - import pandas as pd - - if isinstance(x, pd.DataFrame): - return x - - if isinstance(x, PandasCompatible): - return x.to_pandas() - - raise TypeError( - error_message_begin - + f" '{str(type(x))}'. Use either a pandas.DataFrame, or an object" - " that has a .to_pandas() method." - ) - - -class CellHtml(TypedDict): - isShinyHtml: bool - obj: RenderedDeps - - -@overload -def wrap_shiny_html( # pyright: ignore[reportOverlappingOverload] - x: TagNode, *, session: Session -) -> CellHtml: ... -@overload -def wrap_shiny_html(x: Jsonifiable, *, session: Session) -> Jsonifiable: ... -def wrap_shiny_html( - x: Jsonifiable | TagNode, *, session: Session -) -> Jsonifiable | CellHtml: - if is_shiny_html(x): - return {"isShinyHtml": True, "obj": session._process_ui(x)} - return cast(Jsonifiable, x) diff --git a/shiny/render/_data_frame_utils/_html.py b/shiny/render/_data_frame_utils/_html.py new file mode 100644 index 000000000..493fca7c0 --- /dev/null +++ b/shiny/render/_data_frame_utils/_html.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, cast, overload + +from htmltools import HTML, MetadataNode, Tagifiable, TagNode + +from ..._typing_extensions import TypeGuard +from ...types import Jsonifiable +from ._types import CellHtml, ReprHtml, SeriesLike + +if TYPE_CHECKING: + from ...session import Session + + +@overload +def wrap_shiny_html( # pyright: ignore[reportOverlappingOverload] + x: TagNode, *, session: Session +) -> CellHtml: ... +@overload +def wrap_shiny_html(x: Jsonifiable, *, session: Session) -> Jsonifiable: ... +def wrap_shiny_html( + x: Jsonifiable | TagNode, *, session: Session +) -> Jsonifiable | CellHtml: + if is_shiny_html(x): + return {"isShinyHtml": True, "obj": session._process_ui(x)} + return cast(Jsonifiable, x) + + +def col_contains_shiny_html(col: SeriesLike) -> bool: + return any(is_shiny_html(val) for _, val in enumerate(col)) + + +# TODO-barret-test; Add test to assert the union type of `TagNode` contains `str` and (HTML | Tagifiable | MetadataNode | ReprHtml). Until a `is tag renderable` method is available in htmltools, we need to check for these types manually and must stay in sync with the `TagNode` union type. +# TODO-barret-future; Use `TypeIs[HTML | Tagifiable | MetadataNode | ReprHtml]` when it is available from typing_extensions +def is_shiny_html(val: Any) -> TypeGuard[HTML | Tagifiable | MetadataNode | ReprHtml]: + return isinstance(val, (HTML, Tagifiable, MetadataNode, ReprHtml)) diff --git a/shiny/render/_data_frame_utils/_pandas.py b/shiny/render/_data_frame_utils/_pandas.py new file mode 100644 index 000000000..db40da73a --- /dev/null +++ b/shiny/render/_data_frame_utils/_pandas.py @@ -0,0 +1,130 @@ +from __future__ import annotations + +import json +from typing import TYPE_CHECKING, Any + +from htmltools import TagNode + +from ...session._utils import require_active_session +from ._html import col_contains_shiny_html, wrap_shiny_html +from ._tbl_data import PdDataFrame, frame_column_names +from ._types import FrameDtype, FrameJson + +if TYPE_CHECKING: + import pandas as pd + + +def serialize_frame_pd(df: "pd.DataFrame") -> FrameJson: + import pandas as pd + + columns = frame_column_names(df) + columns_set = set(columns) + if len(columns_set) != len(columns): + raise ValueError( + "The column names of the pandas DataFrame are not unique." + " This is not supported by the data_frame renderer." + ) + + # Currently, we don't make use of the index; drop it so we don't error trying to + # serialize it or something + df = df.reset_index(drop=True) + + # # Can we keep the original column information? + # # Maybe we need to inspect the original columns for any "unknown" column type. See if it contains any HTML or Tag objects + # for col in columns: + # if df[col].dtype.name == "unknown": + # print(df[col].to_list()) + # raise ValueError( + # "The pandas DataFrame contains columns of type 'object'." + # " This is not supported by the data_frame renderer." + # ) + + type_hints = serialize_numpy_dtypes(df) + + # Auto opt-in for html columns + html_columns = [ + i for i, type_hint in enumerate(type_hints) if type_hint["type"] == "html" + ] + + if len(html_columns) > 0: + # Enable copy-on-write mode for the data; + # Use `deep=False` to avoid copying the full data; CoW will copy the necessary data when modified + + with pd.option_context("mode.copy_on_write", True): + df = df.copy(deep=False) + session = require_active_session(None) + + def wrap_shiny_html_with_session(x: TagNode): + return wrap_shiny_html(x, session=session) + + for html_column in html_columns: + # _upgrade_ all the HTML columns to `CellHtml` json objects + df[df.columns[html_column]] = df[ + df.columns[html_column] + ].apply( # pyright: ignore[reportUnknownMemberType] + wrap_shiny_html_with_session + ) + + res = json.loads( + # {index: [index], columns: [columns], data: [values]} + df.to_json( # pyright: ignore[reportUnknownMemberType] + None, + orient="split", + # note that date_format iso converts durations to ISO8601 Durations. + # e.g. 1 Day -> P1DT0H0M0S + # see https://en.wikipedia.org/wiki/ISO_8601#Durations + date_format="iso", + default_handler=str, + ) + ) + + res["typeHints"] = type_hints + + # print(json.dumps(res, indent=4)) + return res + + +def serialize_numpy_dtypes(df: PdDataFrame) -> list[FrameDtype]: + return [ + serialize_pd_dtype(df[col]) # pyright: ignore[reportUnknownArgumentType] + for col in df.columns + ] + + +def serialize_pd_dtype( + col: "pd.Series[Any]", +) -> FrameDtype: + import pandas as pd + + t = pd.api.types.infer_dtype(col) + # t can be any of: string, bytes, floating, integer, mixed-integer, + # mixed-integer-float, decimal, complex, categorical, boolean, datetime64, + # datetime, date, timedelta64, timedelta, time, period, mixed, unknown-array + + if t == "string": + if col_contains_shiny_html(col): + t = "html" + else: + pass + # If no HTML (which is a str) is found, then it is a string! (Keep t as `"string"`) + elif t in ["bytes", "floating", "integer", "decimal", "mixed-integer-float"]: + t = "numeric" + elif t == "categorical": + return { + "type": "categorical", + "categories": [ + str(x) # pyright: ignore[reportUnknownArgumentType] + for x in col.cat.categories.to_list() # pyright: ignore[reportUnknownVariableType, reportUnknownMemberType] + ], + } + elif t in {"datetime64", "datetime"}: + t = "datetime" + elif t in {"timedelta", "timedelta64"}: + t = "timedelta" + else: + if col_contains_shiny_html(col): + t = "html" + else: + t = "unknown" + + return {"type": t} diff --git a/shiny/render/_data_frame_utils/_patch.py b/shiny/render/_data_frame_utils/_patch.py index e6fad7718..944d3df3f 100644 --- a/shiny/render/_data_frame_utils/_patch.py +++ b/shiny/render/_data_frame_utils/_patch.py @@ -2,35 +2,9 @@ # TODO-barret-render.data_frame; Docs # TODO-barret-render.data_frame; Add examples of patch! -from typing import Protocol, Sequence, cast +from typing import Protocol, Sequence -from htmltools import TagNode - -from ..._typing_extensions import TypedDict -from ..renderer._utils import JsonifiableDict -from ._datagridtable import CellHtml - -# CellValue = str | TagList | Tag | HTML -CellValue = TagNode - - -class CellPatch(TypedDict): - row_index: int - column_index: int - value: CellValue - - -class CellPatchProcessed(TypedDict): - row_index: int - column_index: int - value: str | CellHtml - # prev_value: CellValue - - -def cell_patch_processed_to_jsonifiable( - cell_patch_processed: CellPatchProcessed, -) -> JsonifiableDict: - return cast(JsonifiableDict, dict(cell_patch_processed)) +from ._types import CellPatch, CellValue class PatchFn(Protocol): diff --git a/shiny/render/_data_frame_utils/_selection.py b/shiny/render/_data_frame_utils/_selection.py index 2fe22a70f..fb86a3175 100644 --- a/shiny/render/_data_frame_utils/_selection.py +++ b/shiny/render/_data_frame_utils/_selection.py @@ -3,14 +3,13 @@ # TODO-barret-render.data_frame; Docs # TODO-barret-render.data_frame; Add examples of selection! import warnings -from typing import TYPE_CHECKING, Literal, Set, Union, cast +from typing import Literal, Set, Union, cast from ..._deprecated import warn_deprecated from ..._typing_extensions import TypedDict -from ...types import Jsonifiable, ListOrTuple - -if TYPE_CHECKING: - import pandas as pd +from ...types import ListOrTuple +from ._tbl_data import frame_shape +from ._types import DataFrameLike, FrameRenderSelectionModes NoneSelectionMode = Literal["none"] RowSelectionMode = Literal["row", "rows"] @@ -39,7 +38,7 @@ class SelectionModes: col: Literal["none", "single", "multiple"] rect: Literal["none", "cell", "region"] - def as_dict(self) -> dict[str, Jsonifiable]: + def as_dict(self) -> FrameRenderSelectionModes: return { "row": self.row, "col": self.col, @@ -234,14 +233,14 @@ def as_browser_cell_selection( x: BrowserCellSelection | CellSelection | Literal["all"] | None, *, selection_modes: SelectionModes, - data: pd.DataFrame, + data: DataFrameLike, ) -> BrowserCellSelection: if x is None or selection_modes._is_none(): return {"type": "none"} if x == "all": - row_len, col_len = data.shape + row_len, col_len = frame_shape(data) # Look at the selection modes to determine what to do if selection_modes._has_rect(): if selection_modes.rect == "cell": @@ -335,7 +334,7 @@ def as_cell_selection( x: CellSelection | Literal["all"] | None | BrowserCellSelection, *, selection_modes: SelectionModes, - data: pd.DataFrame, + data: DataFrameLike, data_view_rows: ListOrTuple[int], data_view_cols: ListOrTuple[int], ) -> CellSelection: @@ -380,7 +379,7 @@ def as_cell_selection( ) # Make sure the rows are within the data - nrow, ncol = data.shape + nrow, ncol = frame_shape(data) ret["rows"] = tuple(row for row in ret["rows"] if row < nrow) ret["cols"] = tuple(col for col in ret["cols"] if col < ncol) @@ -394,7 +393,6 @@ def as_selection_modes( selection_mode: SelectionModeInput, *, name: str, - editable: bool, row_selection_mode: RowSelectionModeDeprecated = "deprecated", ) -> SelectionModes: # TODO-barret; Test that as _selection_modes can take and return a SelectionModes object diff --git a/shiny/render/_data_frame_utils/_styles.py b/shiny/render/_data_frame_utils/_styles.py index 6e338d9d9..6a471da9f 100644 --- a/shiny/render/_data_frame_utils/_styles.py +++ b/shiny/render/_data_frame_utils/_styles.py @@ -1,68 +1,26 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Callable, Dict, List, Literal, Tuple, Union +from typing import TYPE_CHECKING, Callable, List -from ..._typing_extensions import NotRequired, Required, TypedDict -from ...types import Jsonifiable, ListOrTuple +from ...types import ListOrTuple +from ._tbl_data import frame_column_names +from ._types import BrowserStyleInfo, DataFrameLike, StyleInfo if TYPE_CHECKING: - import pandas as pd - DataFrameValue = pd.DataFrame - - StyleFn = Callable[[DataFrameValue], List["StyleInfo"]] + StyleFn = Callable[[DataFrameLike], List["StyleInfo"]] else: StyleFn = Callable DataFrameValue = object -# great_tables's StyleInfo -# @dataclass(frozen=True) -# class StyleInfo: -# locname: str -# locnum: int -# grpname: str | None = None -# colname: str | None = None -# rownum: int | None = None -# colnum: int | None = None -# styles: list[CellStyle] = field(default_factory=list) - - -# https://typing.readthedocs.io/en/latest/spec/typeddict.html#alternative-syntax -# Use alternative syntax for TypedDict to avoid key error with `class`: -StyleInfoBody = TypedDict( - "StyleInfoBody", - { - "location": Required[Literal["body"]], - "rows": NotRequired[Union[int, ListOrTuple[int], ListOrTuple[bool], None]], - "cols": NotRequired[ - Union[str, int, ListOrTuple[str], ListOrTuple[int], ListOrTuple[bool], None] - ], - "style": NotRequired[Union[Dict[str, Jsonifiable], None]], - "class": NotRequired[Union[str, None]], - }, -) -StyleInfo = StyleInfoBody - -BrowserStyleInfoBody = TypedDict( - "BrowserStyleInfoBody", - { - "location": Required[Literal["body"]], - "rows": Required[Union[Tuple[int, ...], None]], - "cols": Required[Union[Tuple[int, ...], None]], - "style": Required[Union[Dict[str, Jsonifiable], None]], - "class": Required[Union[str, None]], - }, -) -BrowserStyleInfo = BrowserStyleInfoBody - def style_info_to_browser_style_info( info: StyleInfo, *, nrow: int, browser_column_names: ListOrTuple[str], -) -> BrowserStyleInfo: +) -> BrowserStyleInfo | None: if not isinstance(info, dict): raise TypeError("`StyleInfo` objects must be a dictionary. Received: ", info) @@ -81,12 +39,12 @@ def style_info_to_browser_style_info( ) assert isinstance(style, dict) - class_ = info.get("class_", None) + class_ = info.get("class", None) if class_ is not None: assert isinstance(class_, str), "`StyleInfo` `class` value must be a string" if style is None and class_ is None: - raise ValueError("`StyleInfo` objects must at least have `style` or `class`") + return None return { "location": location, @@ -224,9 +182,9 @@ def as_style_infos( def as_browser_style_infos( infos: list[StyleInfo] | StyleFn, *, - data: DataFrameValue, + data: DataFrameLike, ) -> list[BrowserStyleInfo]: - browser_column_names = data.columns.tolist() + browser_column_names = frame_column_names(data) if callable(infos): style_infos = infos(data) @@ -239,7 +197,8 @@ def as_browser_style_infos( if not isinstance(style_infos, list): style_infos = [style_infos] nrow = data.shape[0] - return [ + + browser_infos = [ style_info_to_browser_style_info( info, nrow=nrow, @@ -247,3 +206,4 @@ def as_browser_style_infos( ) for info in style_infos ] + return [browser_info for browser_info in browser_infos if browser_info is not None] diff --git a/shiny/render/_data_frame_utils/_tbl_data.py b/shiny/render/_data_frame_utils/_tbl_data.py new file mode 100644 index 000000000..85ea5ef56 --- /dev/null +++ b/shiny/render/_data_frame_utils/_tbl_data.py @@ -0,0 +1,381 @@ +# Note - barret 2024-07-08; When we adopt `narwhals` support, we should remove the singledispatch and instead always use `narwhals`. In addition, we should return the native type of a native type was originally provided. (Or maintain the narwhals object, if a narwhals object was provided.) + +from __future__ import annotations + +from functools import singledispatch +from typing import Any, List, Tuple, cast + +from htmltools import TagNode + +from ...session import require_active_session +from ._html import wrap_shiny_html + +# from ...types import Jsonifiable +from ._types import ( + CellPatchProcessed, + ColsList, + DataFrameLike, + FrameDtype, + FrameJson, + ListSeriesLike, + PandasCompatible, + PdDataFrame, + PdSeries, + PlDataFrame, + PlSeries, + RowsList, + SeriesLike, +) + +__all__ = ( + "is_data_frame_like", + "as_data_frame_like", + "frame_columns", + "apply_frame_patches", + "serialize_dtype", + "serialize_frame", + "subset_frame", + "get_frame_cell", + "frame_shape", + "copy_frame", + "frame_column_names", +) + +# as_frame ----------------------------------------------------------------------------- + + +@singledispatch +def is_data_frame_like( + data: object, +) -> bool: + return False + + +@is_data_frame_like.register +def _(data: PdDataFrame) -> bool: + return True + + +@is_data_frame_like.register +def _(data: PlDataFrame) -> bool: + return True + + +@singledispatch +def as_data_frame_like( + data: DataFrameLike | PandasCompatible, + error_message_begin: str = "Unsupported type:", +) -> DataFrameLike: + raise TypeError( + f"{error_message_begin} {str(type(data))}\n" + "Please use either a `pandas.DataFrame`, a `polars.DataFrame`, " + "or an object that has a `.to_pandas()` method." + ) + + +@as_data_frame_like.register +def _(data: PdDataFrame, error_message_begin: str = "ignored") -> DataFrameLike: + return data + + +@as_data_frame_like.register +def _(data: PlDataFrame, error_message_begin: str = "ignored") -> DataFrameLike: + return data + + +@as_data_frame_like.register +def _(data: PandasCompatible, error_message_begin: str = "ignored") -> DataFrameLike: + return data.to_pandas() + + +# frame_columns ------------------------------------------------------------------------ + + +@singledispatch +def frame_columns(data: DataFrameLike) -> ListSeriesLike: + raise TypeError(f"Unsupported type: {type(data)}") + + +@frame_columns.register +def _(data: PdDataFrame) -> ListSeriesLike: + ret = [cast(PlSeries, data[col]) for col in data.columns] + return ret + + +@frame_columns.register +def _(data: PlDataFrame) -> ListSeriesLike: + return data.get_columns() + + +# apply_frame_patches -------------------------------------------------------------------- + + +@singledispatch +def apply_frame_patches( + data: DataFrameLike, + patches: List[CellPatchProcessed], +) -> DataFrameLike: + raise TypeError(f"Unsupported type: {type(data)}") + + +@apply_frame_patches.register +def _(data: PdDataFrame, patches: List[CellPatchProcessed]) -> PdDataFrame: + import pandas as pd + + # Enable copy-on-write mode for the data; + # Use `deep=False` to avoid copying the full data; CoW will copy the necessary data when modified + with pd.option_context("mode.copy_on_write", True): + # Apply patches! + data = data.copy(deep=False) + for cell_patch in patches: + data.iat[ # pyright: ignore[reportUnknownMemberType] + cell_patch["row_index"], + cell_patch["column_index"], + ] = cell_patch["value"] + + return data + + +@apply_frame_patches.register +def _(data: PlDataFrame, patches: List[CellPatchProcessed]) -> PlDataFrame: + data = data.clone() + for cell_patch in patches: + data[cell_patch["row_index"], cell_patch["column_index"]] = cell_patch["value"] + + return data + + +# serialize_dtype ---------------------------------------------------------------------- + + +@singledispatch +def serialize_dtype(col: SeriesLike) -> FrameDtype: + raise TypeError(f"Unsupported type: {type(col)}") + + +# TODO: we can't import DataFrameDtype at runtime, due to circular dependency. So +# we import it during type checking. But this means we have to explicitly register +# the dispatch type below. + + +@serialize_dtype.register +def _(col: PdSeries) -> FrameDtype: + from ._pandas import serialize_pd_dtype + + return serialize_pd_dtype(col) + + +@serialize_dtype.register +def _(col: PlSeries) -> FrameDtype: + import polars as pl + + from ._html import col_contains_shiny_html + + if col.dtype.is_(pl.String): + if col_contains_shiny_html(col): + type_ = "html" + else: + type_ = "string" + elif col.dtype.is_numeric(): + type_ = "numeric" + + elif col.dtype.is_(pl.Categorical()): + categories = col.cat.get_categories().to_list() + return {"type": "categorical", "categories": categories} + else: + type_ = "unknown" + if col_contains_shiny_html(col): + type_ = "html" + + return {"type": type_} + + +# serialize_frame ---------------------------------------------------------------------- + + +@singledispatch +def serialize_frame(data: DataFrameLike) -> FrameJson: + raise TypeError(f"Unsupported type: {type(data)}") + + +@serialize_frame.register +def _(data: PdDataFrame) -> FrameJson: + from ._pandas import serialize_frame_pd + + return serialize_frame_pd(data) + + +@serialize_frame.register +def _(data: PlDataFrame) -> FrameJson: + import json + + type_hints = list(map(serialize_dtype, data)) + data_by_row = list(map(list, data.rows())) + + # Shiny tag support + type_hints_type = [type_hint["type"] for type_hint in type_hints] + if "html" in type_hints_type: + session = require_active_session(None) + + def wrap_shiny_html_with_session(x: TagNode): + return wrap_shiny_html(x, session=session) + + html_columns = [i for i, x in enumerate(type_hints_type) if x == "html"] + + for html_column in html_columns: + for row in data_by_row: + row[html_column] = wrap_shiny_html_with_session(row[html_column]) + + data_val = json.loads(json.dumps(data_by_row, default=str)) + + return { + # "index": list(range(len(data))), + "columns": data.columns, + "data": data_val, + "typeHints": type_hints, + } + + +# subset_frame ------------------------------------------------------------------------- + + +@singledispatch +def subset_frame( + data: DataFrameLike, *, rows: RowsList = None, cols: ColsList = None +) -> DataFrameLike: + """Return a subsetted DataFrame, based on row positions and column names. + + Note that when None is passed, all rows or columns get included. + """ + # Note that this type signature assumes column names are strings things. + # This is always true in Polars, but not in Pandas (e.g. a column name could be an + # int, or even a tuple of ints) + raise TypeError(f"Unsupported type: {type(data)}") + + +@subset_frame.register +def _( + data: PdDataFrame, + *, + rows: RowsList = None, + cols: ColsList = None, +) -> PdDataFrame: + # Enable copy-on-write mode for the data; + # Use `deep=False` to avoid copying the full data; CoW will copy the necessary data when modified + import pandas as pd + + with pd.option_context("mode.copy_on_write", True): + # iloc requires integer positions, so we convert column name strings to ints, or + # the slice default. + indx_cols = ( # pyright: ignore[reportUnknownVariableType] + slice(None) + if cols is None + else [ + ( + # Send in an array of size 1 and retrieve the first element + data.columns.get_indexer_for( # pyright: ignore[reportUnknownMemberType] + [col] + )[ + 0 + ] + if isinstance(col, str) + else col + ) + for col in cols + ] + ) + + # Force list when using a non-None value for pandas compatibility + indx_rows = list(rows) if rows is not None else slice(None) + + return data.iloc[indx_rows, indx_cols] + + +@subset_frame.register +def _( + data: PlDataFrame, + *, + rows: RowsList = None, + cols: ColsList = None, +) -> PlDataFrame: + indx_cols = ( + [col if isinstance(col, str) else data.columns[col] for col in cols] + if cols is not None + else slice(None) + ) + indx_rows = rows if rows is not None else slice(None) + return data[indx_rows, indx_cols] + + +# get_frame_cell ----------------------------------------------------------------------- + + +@singledispatch +def get_frame_cell(data: DataFrameLike, row: int, col: int) -> Any: + raise TypeError(f"Unsupported type: {type(data)}") + + +@get_frame_cell.register +def _(data: PdDataFrame, row: int, col: int) -> Any: + return ( + data.iat[ # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType] + row, col + ] + ) + + +@get_frame_cell.register +def _(data: PlDataFrame, row: int, col: int) -> Any: + return data[row, col] + + +# shape -------------------------------------------------------------------------------- + + +@singledispatch +def frame_shape(data: DataFrameLike) -> Tuple[int, ...]: + raise TypeError(f"Unsupported type: {type(data)}") + + +@frame_shape.register +def _(data: PdDataFrame) -> Tuple[int, ...]: + return data.shape + + +@frame_shape.register +def _(data: PlDataFrame) -> Tuple[int, ...]: + return data.shape + + +# copy_frame --------------------------------------------------------------------------- + + +@singledispatch +def copy_frame(data: DataFrameLike) -> DataFrameLike: + raise TypeError(f"Unsupported type: {type(data)}") + + +@copy_frame.register +def _(data: PdDataFrame) -> PdDataFrame: + return data.copy() + + +@copy_frame.register +def _(data: PlDataFrame) -> PlDataFrame: + return data.clone() + + +# column_names ------------------------------------------------------------------------- +@singledispatch +def frame_column_names(data: DataFrameLike) -> List[str]: + raise TypeError(f"Unsupported type: {type(data)}") + + +@frame_column_names.register +def _(data: PdDataFrame) -> List[str]: + return data.columns.to_list() + + +@frame_column_names.register +def _(data: PlDataFrame) -> List[str]: + return data.columns diff --git a/shiny/render/_data_frame_utils/_types.py b/shiny/render/_data_frame_utils/_types.py new file mode 100644 index 000000000..163e37bbc --- /dev/null +++ b/shiny/render/_data_frame_utils/_types.py @@ -0,0 +1,267 @@ +from __future__ import annotations + +from abc import ABC +from typing import ( + TYPE_CHECKING, + Any, + Dict, + List, + Literal, + Optional, + Protocol, + Tuple, + Union, + cast, + runtime_checkable, +) + +from htmltools import TagNode + +from ..._typing_extensions import Annotated, NotRequired, Required, TypedDict +from ...types import Jsonifiable, JsonifiableDict, ListOrTuple +from ._databackend import AbstractBackend + +# --------------------------------------------------------------------- + +if TYPE_CHECKING: + import pandas as pd + import polars as pl + + from ...session._utils import RenderedDeps + + PdDataFrame = pd.DataFrame + PlDataFrame = pl.DataFrame + PdSeries = pd.Series[Any] + PlSeries = pl.Series + + ListSeriesLike = Union[List[PdSeries], List[PlSeries]] + SeriesLike = Union[PdSeries, PlSeries] + DataFrameLike = Union[PdDataFrame, PlDataFrame] + + +else: + + class PdDataFrame(AbstractBackend): + _backends = [("pandas", "DataFrame")] + + class PlDataFrame(AbstractBackend): + _backends = [("polars", "DataFrame")] + + class PdSeries(AbstractBackend): + _backends = [("pandas", "Series")] + + class PlSeries(AbstractBackend): + _backends = [("polars", "Series")] + + class ListSeriesLike(ABC): ... + + class SeriesLike(ABC): ... + + class DataFrameLike(ABC): ... + + ListSeriesLike.register(PdSeries) + ListSeriesLike.register(PlSeries) + + SeriesLike.register(PdSeries) + SeriesLike.register(PlSeries) + + DataFrameLike.register(PdDataFrame) + DataFrameLike.register(PlDataFrame) + +# --------------------------------------------------------------------- + + +@runtime_checkable +class PandasCompatible(Protocol): + # Signature doesn't matter, runtime_checkable won't look at it anyway + def to_pandas(self) -> pd.DataFrame: ... + + +class CellHtml(TypedDict): + isShinyHtml: bool + obj: RenderedDeps + + +# --------------------------------------------------------------------- + + +class ColumnSort(TypedDict): + col: int + desc: bool + + +class ColumnFilterStr(TypedDict): + col: int + value: str + + +class ColumnFilterNumber(TypedDict): + col: int + value: ( + tuple[int | float, int | float] + | tuple[int | float, None] + | tuple[None, int | float] + | Annotated[list[int | float | None], 2] + ) + + +ColumnFilter = Union[ColumnFilterStr, ColumnFilterNumber] + + +class DataViewInfo(TypedDict): + sort: tuple[ColumnSort, ...] + filter: tuple[ColumnFilter, ...] + + rows: tuple[int, ...] # sorted and filtered row number + selected_rows: tuple[int, ...] # selected and sorted and filtered row number + # selected_columns: tuple[int, ...] # selected and sorted and filtered row number + + +# --------------------------------------------------------------------- + + +class FrameRenderPatchInfo(TypedDict): + key: str + + +class FrameRenderSelectionModes(TypedDict): + row: Literal["single", "multiple", "none"] + col: Literal["single", "multiple", "none"] + rect: Literal["cell", "region", "none"] + + +class FrameRender(TypedDict): + payload: FrameJson + patchInfo: FrameRenderPatchInfo + selectionModes: FrameRenderSelectionModes + + +def frame_render_to_jsonifiable(frame_render: FrameRender) -> JsonifiableDict: + return cast(JsonifiableDict, dict(frame_render)) + + +# --------------------------------------------------------------------- + + +class FrameJsonOptions(TypedDict): + width: NotRequired[str | float | None] + height: NotRequired[str | float | None] + summary: NotRequired[bool | str] + filters: NotRequired[bool] + editable: NotRequired[bool] + style: NotRequired[str] + fill: NotRequired[bool] + styles: NotRequired[list[BrowserStyleInfo]] + + +class FrameJson(TypedDict): + columns: Required[list[str]] # column names + # index: Required[list[Any]] # pandas index values + data: Required[list[list[Jsonifiable]]] # each entry is a row of len(columns) + typeHints: Required[ + list[FrameDtype] + ] # each entry is a hint for the type of the column + options: NotRequired[FrameJsonOptions] + + +RowsList = Optional[List[int]] +ColsList = Optional[List[Union[str, int]]] + + +# --------------------------------------------------------------------- + + +class FrameDtypeSubset(TypedDict): + type: Literal["numeric", "string", "html", "datetime", "timedelta", "unknown"] + + +class FrameDtypeCategories(TypedDict): + type: Literal["categorical"] + categories: list[str] + + +FrameDtype = Union[ + FrameDtypeSubset, + FrameDtypeCategories, +] + + +# --------------------------------------------------------------------- + +# great_tables's StyleInfo +# @dataclass(frozen=True) +# class StyleInfo: +# locname: str +# locnum: int +# grpname: str | None = None +# colname: str | None = None +# rownum: int | None = None +# colnum: int | None = None +# styles: list[CellStyle] = field(default_factory=list) + + +# https://typing.readthedocs.io/en/latest/spec/typeddict.html#alternative-syntax +# Use alternative syntax for TypedDict to avoid key error with `class`: +StyleInfoBody = TypedDict( + "StyleInfoBody", + { + "location": Required[Literal["body"]], + "rows": NotRequired[Union[int, ListOrTuple[int], ListOrTuple[bool], None]], + "cols": NotRequired[ + Union[str, int, ListOrTuple[str], ListOrTuple[int], ListOrTuple[bool], None] + ], + "style": NotRequired[Union[Dict[str, Jsonifiable], None]], + "class": NotRequired[Union[str, None]], + }, +) +StyleInfo = StyleInfoBody + + +BrowserStyleInfoBody = TypedDict( + "BrowserStyleInfoBody", + { + "location": Required[Literal["body"]], + "rows": Required[Union[Tuple[int, ...], None]], + "cols": Required[Union[Tuple[int, ...], None]], + "style": Required[Union[Dict[str, Jsonifiable], None]], + "class": Required[Union[str, None]], + }, +) +BrowserStyleInfo = BrowserStyleInfoBody + +# --------------------------------------------------------------------- + + +# TODO-future; Replace this class with `htmltools.ReprHtml` when it is publically available. Even better... there should be a "is tag-like" method in htmltools that determines if the object could be enhanced by rendering +@runtime_checkable +class ReprHtml(Protocol): + """ + Objects with a `_repr_html_()` method. + """ + + def _repr_html_(self) -> str: ... + + +# Cell patches ---------------------------------------------------------- + +# CellValue = str | TagList | Tag | HTML +CellValue = TagNode + + +class CellPatch(TypedDict): + row_index: int + column_index: int + value: CellValue + + +class CellPatchProcessed(TypedDict): + row_index: int + column_index: int + value: str | CellHtml + # prev_value: CellValue + + +def cell_patch_processed_to_jsonifiable( + cell_patch_processed: CellPatchProcessed, +) -> JsonifiableDict: + return cast(JsonifiableDict, dict(cell_patch_processed)) diff --git a/shiny/render/_data_frame_utils/_unsafe.py b/shiny/render/_data_frame_utils/_unsafe.py deleted file mode 100644 index 673d03922..000000000 --- a/shiny/render/_data_frame_utils/_unsafe.py +++ /dev/null @@ -1,98 +0,0 @@ -# This file exists solely because I found it hard to write typesafe code for -# manipulating numpy dtypes. Rather than litter many lines of code with pyright ignore -# directives, I've moved the problematic code here and disabled some pyright checks at -# the file level. If anyone knows how to make this code typesafe, we can get rid of this -# file. - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Protocol, Union, runtime_checkable - -from htmltools import HTML, MetadataNode, Tagifiable - -from ..._typing_extensions import TypedDict, TypeGuard - -if TYPE_CHECKING: - import pandas as pd - -# pyright: reportMissingTypeArgument=false -# pyright: reportUnknownArgumentType=false -# pyright: reportUnknownMemberType=false -# pyright: reportUnknownParameterType=false -# pyright: reportUnknownVariableType=false - - -class DataFrameDtypeOriginal(TypedDict): - type: str - - -class DataFrameDtypeSubset(TypedDict): - type: Literal["numeric", "string", "html", "unknown"] - - -class DataFrameDtypeCategories(TypedDict): - type: Literal["categorical"] - categories: list[str] - - -DataFrameDtype = Union[ - DataFrameDtypeOriginal, - DataFrameDtypeSubset, - DataFrameDtypeCategories, -] - - -def serialize_numpy_dtypes(df: "pd.DataFrame") -> list[DataFrameDtype]: - return [serialize_numpy_dtype(col) for _, col in df.items()] - - -def col_contains_shiny_html(col: "pd.Series") -> bool: - return any(is_shiny_html(val) for _, val in enumerate(col)) - - -def serialize_numpy_dtype( - col: "pd.Series[Any]", -) -> DataFrameDtypeOriginal | DataFrameDtypeSubset | DataFrameDtypeCategories: - import pandas as pd - - t = pd.api.types.infer_dtype(col) - # t can be any of: string, bytes, floating, integer, mixed-integer, - # mixed-integer-float, decimal, complex, categorical, boolean, datetime64, - # datetime, date, timedelta64, timedelta, time, period, mixed, unknown-array - - if t == "string": - if col_contains_shiny_html(col): - t = "html" - else: - pass - # If no HTML (which is a str) is found, then it is a string! (Keep t as `"string"`) - elif t in ["bytes", "floating", "integer", "decimal", "mixed-integer-float"]: - t = "numeric" - elif t == "categorical": - return { - "type": "categorical", - "categories": [str(x) for x in col.cat.categories.to_list()], - } - else: - if col_contains_shiny_html(col): - t = "html" - else: - t = "unknown" - - return {"type": t} - - -# TODO-future; Replace this class with `htmltools.ReprHtml` when it is publically available. Even better... there should be a "is tag-like" method in htmltools that determines if the object could be enhanced by rendering -@runtime_checkable -class ReprHtml(Protocol): - """ - Objects with a `_repr_html_()` method. - """ - - def _repr_html_(self) -> str: ... - - -# TODO-barret-test; Add test to assert the union type of `TagNode` contains `str` and (HTML | Tagifiable | MetadataNode | ReprHtml). Until a `is tag renderable` method is available in htmltools, we need to check for these types manually and must stay in sync with the `TagNode` union type. -# TODO-barret-future; Use `TypeIs[HTML | Tagifiable | MetadataNode | ReprHtml]` when it is available from typing_extensions -def is_shiny_html(val: Any) -> TypeGuard[HTML | Tagifiable | MetadataNode | ReprHtml]: - return isinstance(val, (HTML, Tagifiable, MetadataNode, ReprHtml)) diff --git a/shiny/render/_express.py b/shiny/render/_express.py index 719d25706..f8838e5f4 100644 --- a/shiny/render/_express.py +++ b/shiny/render/_express.py @@ -8,13 +8,9 @@ from .. import ui as _ui from .._typing_extensions import Self from ..session._utils import require_active_session -from ..types import MISSING, MISSING_TYPE +from ..types import MISSING, MISSING_TYPE, JsonifiableDict from .renderer import AsyncValueFn, Renderer, ValueFn -from .renderer._utils import ( - JsonifiableDict, - rendered_deps_to_jsonifiable, - set_kwargs_value, -) +from .renderer._utils import rendered_deps_to_jsonifiable, set_kwargs_value class express(Renderer[None]): diff --git a/shiny/render/_render.py b/shiny/render/_render.py index 0fec8ac0d..fd00d4af9 100644 --- a/shiny/render/_render.py +++ b/shiny/render/_render.py @@ -7,22 +7,13 @@ # `typing.Dict` sed for python 3.8 compatibility # Can use `dict` in python >= 3.9 -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Literal, - Optional, - Protocol, - Union, - cast, - runtime_checkable, -) +from typing import TYPE_CHECKING, Any, Callable, Literal, Optional, Union, cast from htmltools import Tag, TagAttrValue, TagChild +from ._data_frame_utils._types import PandasCompatible, PdDataFrame + if TYPE_CHECKING: - import pandas as pd from ..session._utils import RenderedDeps @@ -455,13 +446,7 @@ async def transform(self, value: ImgData) -> dict[str, Jsonifiable] | None: # ====================================================================================== -@runtime_checkable -class PandasCompatible(Protocol): - # Signature doesn't matter, runtime_checkable won't look at it anyway - def to_pandas(self) -> "pd.DataFrame": ... - - -TableResult = Union["pd.DataFrame", PandasCompatible, None] +TableResult = Union[PdDataFrame, PandasCompatible, None] @add_example(ex_dir="../api-examples/output_table") diff --git a/shiny/types.py b/shiny/types.py index 236dfa792..4680faf68 100644 --- a/shiny/types.py +++ b/shiny/types.py @@ -380,5 +380,7 @@ class BrushInfo(TypedDict): None, List["Jsonifiable"], Tuple["Jsonifiable"], - Dict[str, "Jsonifiable"], + "JsonifiableDict", ] + +JsonifiableDict = Dict[str, Jsonifiable] diff --git a/shiny/www/py-shiny/data-frame/data-frame.js b/shiny/www/py-shiny/data-frame/data-frame.js index dcf5e89a5..7143b244c 100644 --- a/shiny/www/py-shiny/data-frame/data-frame.js +++ b/shiny/www/py-shiny/data-frame/data-frame.js @@ -1,10 +1,10 @@ -var He,y,En,Lo,ye,Sn,Rn,vt,xn,Ye={},Mn=[],Ho=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Ze=Array.isArray;function ae(e,n){for(var t in n)e[t]=n[t];return e}function Fn(e){var n=e.parentNode;n&&n.removeChild(e)}function j(e,n,t){var r,o,i,l={};for(i in n)i=="key"?r=n[i]:i=="ref"?o=n[i]:l[i]=n[i];if(arguments.length>2&&(l.children=arguments.length>3?He.call(arguments,2):t),typeof e=="function"&&e.defaultProps!=null)for(i in e.defaultProps)l[i]===void 0&&(l[i]=e.defaultProps[i]);return ke(e,l,r,o,null)}function ke(e,n,t,r,o){var i={type:e,props:n,key:t,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:o??++En};return o==null&&y.vnode!=null&&y.vnode(i),i}function bt(){return{current:null}}function oe(e){return e.children}function Y(e,n){this.props=e,this.context=n}function Le(e,n){if(n==null)return e.__?Le(e.__,e.__.__k.indexOf(e)+1):null;for(var t;nn&&ye.sort(vt));Je.__r=0}function $n(e,n,t,r,o,i,l,u,s,d){var a,g,f,c,m,p,h,_=r&&r.__k||Mn,x=_.length;for(t.__k=[],a=0;a0?ke(c.type,c.props,c.key,c.ref?c.ref:null,c.__v):c)!=null){if(c.__=t,c.__b=t.__b+1,(f=_[a])===null||f&&c.key==f.key&&c.type===f.type)_[a]=void 0;else for(g=0;g=0;n--)if((t=e.__k[n])&&(r=Dn(t)))return r}return null}function zo(e,n,t,r,o){var i;for(i in t)i==="children"||i==="key"||i in n||Qe(e,i,null,t[i],r);for(i in n)o&&typeof n[i]!="function"||i==="children"||i==="key"||i==="value"||i==="checked"||t[i]===n[i]||Qe(e,i,n[i],t[i],r)}function bn(e,n,t){n[0]==="-"?e.setProperty(n,t??""):e[n]=t==null?"":typeof t!="number"||Ho.test(n)?t:t+"px"}function Qe(e,n,t,r,o){var i;e:if(n==="style")if(typeof t=="string")e.style.cssText=t;else{if(typeof r=="string"&&(e.style.cssText=r=""),r)for(n in r)t&&n in t||bn(e.style,n,"");if(t)for(n in t)r&&t[n]===r[n]||bn(e.style,n,t[n])}else if(n[0]==="o"&&n[1]==="n")i=n!==(n=n.replace(/Capture$/,"")),n=n.toLowerCase()in e?n.toLowerCase().slice(2):n.slice(2),e.l||(e.l={}),e.l[n+i]=t,t?r||e.addEventListener(n,i?Cn:wn,i):e.removeEventListener(n,i?Cn:wn,i);else if(n!=="dangerouslySetInnerHTML"){if(o)n=n.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(n!=="width"&&n!=="height"&&n!=="href"&&n!=="list"&&n!=="form"&&n!=="tabIndex"&&n!=="download"&&n!=="rowSpan"&&n!=="colSpan"&&n in e)try{e[n]=t??"";break e}catch{}typeof t=="function"||(t==null||t===!1&&n[4]!=="-"?e.removeAttribute(n):e.setAttribute(n,t))}}function wn(e){return this.l[e.type+!1](y.event?y.event(e):e)}function Cn(e){return this.l[e.type+!0](y.event?y.event(e):e)}function wt(e,n,t,r,o,i,l,u,s){var d,a,g,f,c,m,p,h,_,x,V,I,O,L,G,T=n.type;if(n.constructor!==void 0)return null;t.__h!=null&&(s=t.__h,u=n.__e=t.__e,n.__h=null,i=[u]),(d=y.__b)&&d(n);try{e:if(typeof T=="function"){if(h=n.props,_=(d=T.contextType)&&r[d.__c],x=d?_?_.props.value:d.__:r,t.__c?p=(a=n.__c=t.__c).__=a.__E:("prototype"in T&&T.prototype.render?n.__c=a=new T(h,x):(n.__c=a=new Y(h,x),a.constructor=T,a.render=Bo),_&&_.sub(a),a.props=h,a.state||(a.state={}),a.context=x,a.__n=r,g=a.__d=!0,a.__h=[],a._sb=[]),a.__s==null&&(a.__s=a.state),T.getDerivedStateFromProps!=null&&(a.__s==a.state&&(a.__s=ae({},a.__s)),ae(a.__s,T.getDerivedStateFromProps(h,a.__s))),f=a.props,c=a.state,a.__v=n,g)T.getDerivedStateFromProps==null&&a.componentWillMount!=null&&a.componentWillMount(),a.componentDidMount!=null&&a.__h.push(a.componentDidMount);else{if(T.getDerivedStateFromProps==null&&h!==f&&a.componentWillReceiveProps!=null&&a.componentWillReceiveProps(h,x),!a.__e&&a.shouldComponentUpdate!=null&&a.shouldComponentUpdate(h,a.__s,x)===!1||n.__v===t.__v){for(n.__v!==t.__v&&(a.props=h,a.state=a.__s,a.__d=!1),a.__e=!1,n.__e=t.__e,n.__k=t.__k,n.__k.forEach(function(re){re&&(re.__=n)}),V=0;V2&&(u.children=arguments.length>3?He.call(arguments,2):t),ke(e.type,u,r||e.key,o||e.ref,null)}function Et(e,n){var t={__c:n="__cC"+xn++,__:e,Consumer:function(r,o){return r.children(o)},Provider:function(r){var o,i;return this.getChildContext||(o=[],(i={})[n]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(l){this.props.value!==l.value&&o.some(function(u){u.__e=!0,St(u)})},this.sub=function(l){o.push(l);var u=l.componentWillUnmount;l.componentWillUnmount=function(){o.splice(o.indexOf(l),1),u&&u.call(l)}}),r.children}};return t.Provider.__=t.Consumer.contextType=t}He=Mn.slice,y={__e:function(e,n,t,r){for(var o,i,l;n=n.__;)if((o=n.__c)&&!o.__)try{if((i=o.constructor)&&i.getDerivedStateFromError!=null&&(o.setState(i.getDerivedStateFromError(e)),l=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(e,r||{}),l=o.__d),l)return o.__E=o}catch(u){e=u}throw e}},En=0,Lo=function(e){return e!=null&&e.constructor===void 0},Y.prototype.setState=function(e,n){var t;t=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=ae({},this.state),typeof e=="function"&&(e=e(ae({},t),this.props)),e&&ae(t,e),e!=null&&this.__v&&(n&&this._sb.push(n),St(this))},Y.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),St(this))},Y.prototype.render=oe,ye=[],Rn=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,vt=function(e,n){return e.__v.__b-n.__v.__b},Je.__r=0,xn=0;var pe,D,Rt,kn,Me=0,jn=[],et=[],Ln=y.__b,Hn=y.__r,zn=y.diffed,Gn=y.__c,Bn=y.unmount;function Fe(e,n){y.__h&&y.__h(D,e,Me||n),Me=0;var t=D.__H||(D.__H={__:[],__h:[]});return e>=t.__.length&&t.__.push({__V:et}),t.__[e]}function P(e){return Me=1,Ie(Yn,e)}function Ie(e,n,t){var r=Fe(pe++,2);if(r.t=e,!r.__c&&(r.__=[t?t(n):Yn(void 0,n),function(u){var s=r.__N?r.__N[0]:r.__[0],d=r.t(s,u);s!==d&&(r.__N=[d,r.__[1]],r.__c.setState({}))}],r.__c=D,!D.u)){var o=function(u,s,d){if(!r.__c.__H)return!0;var a=r.__c.__H.__.filter(function(f){return f.__c});if(a.every(function(f){return!f.__N}))return!i||i.call(this,u,s,d);var g=!1;return a.forEach(function(f){if(f.__N){var c=f.__[0];f.__=f.__N,f.__N=void 0,c!==f.__[0]&&(g=!0)}}),!(!g&&r.__c.props===u)&&(!i||i.call(this,u,s,d))};D.u=!0;var i=D.shouldComponentUpdate,l=D.componentWillUpdate;D.componentWillUpdate=function(u,s,d){if(this.__e){var a=i;i=void 0,o(u,s,d),i=a}l&&l.call(this,u,s,d)},D.shouldComponentUpdate=o}return r.__N||r.__}function N(e,n){var t=Fe(pe++,3);!y.__s&&Mt(t.__H,n)&&(t.__=e,t.i=n,D.__H.__h.push(t))}function le(e,n){var t=Fe(pe++,4);!y.__s&&Mt(t.__H,n)&&(t.__=e,t.i=n,D.__h.push(t))}function K(e){return Me=5,te(function(){return{current:e}},[])}function Kn(e,n,t){Me=6,le(function(){return typeof e=="function"?(e(n()),function(){return e(null)}):e?(e.current=n(),function(){return e.current=null}):void 0},t==null?t:t.concat(e))}function te(e,n){var t=Fe(pe++,7);return Mt(t.__H,n)?(t.__V=e(),t.i=n,t.__h=e,t.__V):t.__}function q(e,n){return Me=8,te(function(){return e},n)}function qn(e){var n=D.context[e.__c],t=Fe(pe++,9);return t.c=e,n?(t.__==null&&(t.__=!0,n.sub(D)),n.props.value):e.__}function Wn(e,n){y.useDebugValue&&y.useDebugValue(n?n(e):e)}function Xn(){var e=Fe(pe++,11);if(!e.__){for(var n=D.__v;n!==null&&!n.__m&&n.__!==null;)n=n.__;var t=n.__m||(n.__m=[0,0]);e.__="P"+t[0]+"-"+t[1]++}return e.__}function Uo(){for(var e;e=jn.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(tt),e.__H.__h.forEach(xt),e.__H.__h=[]}catch(n){e.__H.__h=[],y.__e(n,e.__v)}}y.__b=function(e){D=null,Ln&&Ln(e)},y.__r=function(e){Hn&&Hn(e),pe=0;var n=(D=e.__c).__H;n&&(Rt===D?(n.__h=[],D.__h=[],n.__.forEach(function(t){t.__N&&(t.__=t.__N),t.__V=et,t.__N=t.i=void 0})):(n.__h.forEach(tt),n.__h.forEach(xt),n.__h=[],pe=0)),Rt=D},y.diffed=function(e){zn&&zn(e);var n=e.__c;n&&n.__H&&(n.__H.__h.length&&(jn.push(n)!==1&&kn===y.requestAnimationFrame||((kn=y.requestAnimationFrame)||jo)(Uo)),n.__H.__.forEach(function(t){t.i&&(t.__H=t.i),t.__V!==et&&(t.__=t.__V),t.i=void 0,t.__V=et})),Rt=D=null},y.__c=function(e,n){n.some(function(t){try{t.__h.forEach(tt),t.__h=t.__h.filter(function(r){return!r.__||xt(r)})}catch(r){n.some(function(o){o.__h&&(o.__h=[])}),n=[],y.__e(r,t.__v)}}),Gn&&Gn(e,n)},y.unmount=function(e){Bn&&Bn(e);var n,t=e.__c;t&&t.__H&&(t.__H.__.forEach(function(r){try{tt(r)}catch(o){n=o}}),t.__H=void 0,n&&y.__e(n,t.__v))};var Un=typeof requestAnimationFrame=="function";function jo(e){var n,t=function(){clearTimeout(r),Un&&cancelAnimationFrame(n),setTimeout(e)},r=setTimeout(t,100);Un&&(n=requestAnimationFrame(t))}function tt(e){var n=D,t=e.__c;typeof t=="function"&&(e.__c=void 0,t()),D=n}function xt(e){var n=D;e.__c=e.__(),D=n}function Mt(e,n){return!e||e.length!==n.length||n.some(function(t,r){return t!==e[r]})}function Yn(e,n){return typeof n=="function"?n(e):n}function ir(e,n){for(var t in n)e[t]=n[t];return e}function It(e,n){for(var t in e)if(t!=="__source"&&!(t in n))return!0;for(var r in n)if(r!=="__source"&&e[r]!==n[r])return!0;return!1}function Ft(e,n){return e===n&&(e!==0||1/e==1/n)||e!=e&&n!=n}function $t(e){this.props=e}function Ko(e,n){function t(o){var i=this.props.ref,l=i==o.ref;return!l&&i&&(i.call?i(null):i.current=null),n?!n(this.props,o)||!l:It(this.props,o)}function r(o){return this.shouldComponentUpdate=t,j(e,o)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}($t.prototype=new Y).isPureReactComponent=!0,$t.prototype.shouldComponentUpdate=function(e,n){return It(this.props,e)||It(this.state,n)};var Jn=y.__b;y.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),Jn&&Jn(e)};var qo=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function Wo(e){function n(t){var r=ir({},t);return delete r.ref,e(r,t.ref||null)}return n.$$typeof=qo,n.render=n,n.prototype.isReactComponent=n.__f=!0,n.displayName="ForwardRef("+(e.displayName||e.name)+")",n}var Qn=function(e,n){return e==null?null:ie(ie(e).map(n))},Xo={map:Qn,forEach:Qn,count:function(e){return e?ie(e).length:0},only:function(e){var n=ie(e);if(n.length!==1)throw"Children.only";return n[0]},toArray:ie},Yo=y.__e;y.__e=function(e,n,t,r){if(e.then){for(var o,i=n;i=i.__;)if((o=i.__c)&&o.__c)return n.__e==null&&(n.__e=t.__e,n.__k=t.__k),o.__c(e,n)}Yo(e,n,t,r)};var Zn=y.unmount;function lr(e,n,t){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach(function(r){typeof r.__c=="function"&&r.__c()}),e.__c.__H=null),(e=ir({},e)).__c!=null&&(e.__c.__P===t&&(e.__c.__P=n),e.__c=null),e.__k=e.__k&&e.__k.map(function(r){return lr(r,n,t)})),e}function sr(e,n,t){return e&&(e.__v=null,e.__k=e.__k&&e.__k.map(function(r){return sr(r,n,t)}),e.__c&&e.__c.__P===n&&(e.__e&&t.insertBefore(e.__e,e.__d),e.__c.__e=!0,e.__c.__P=t)),e}function nt(){this.__u=0,this.t=null,this.__b=null}function ar(e){var n=e.__.__c;return n&&n.__a&&n.__a(e)}function Jo(e){var n,t,r;function o(i){if(n||(n=e()).then(function(l){t=l.default||l},function(l){r=l}),r)throw r;if(!t)throw n;return j(t,i)}return o.displayName="Lazy",o.__f=!0,o}function ze(){this.u=null,this.o=null}y.unmount=function(e){var n=e.__c;n&&n.__R&&n.__R(),n&&e.__h===!0&&(e.type=null),Zn&&Zn(e)},(nt.prototype=new Y).__c=function(e,n){var t=n.__c,r=this;r.t==null&&(r.t=[]),r.t.push(t);var o=ar(r.__v),i=!1,l=function(){i||(i=!0,t.__R=null,o?o(u):u())};t.__R=l;var u=function(){if(!--r.__u){if(r.state.__a){var d=r.state.__a;r.__v.__k[0]=sr(d,d.__c.__P,d.__c.__O)}var a;for(r.setState({__a:r.__b=null});a=r.t.pop();)a.forceUpdate()}},s=n.__h===!0;r.__u++||s||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(l,l)},nt.prototype.componentWillUnmount=function(){this.t=[]},nt.prototype.render=function(e,n){if(this.__b){if(this.__v.__k){var t=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=lr(this.__b,t,r.__O=r.__P)}this.__b=null}var o=n.__a&&j(oe,null,e.fallback);return o&&(o.__h=null),[j(oe,null,n.__a?null:e.children),o]};var er=function(e,n,t){if(++t[1]===t[0]&&e.o.delete(n),e.props.revealOrder&&(e.props.revealOrder[0]!=="t"||!e.o.size))for(t=e.u;t;){for(;t.length>3;)t.pop()();if(t[1]>>1,1),n.i.removeChild(r)}}),xe(j(Qo,{context:n.context},e.__v),n.l)):n.l&&n.componentWillUnmount()}function ei(e,n){var t=j(Zo,{__v:e,i:n});return t.containerInfo=n,t}(ze.prototype=new Y).__a=function(e){var n=this,t=ar(n.__v),r=n.o.get(e);return r[0]++,function(o){var i=function(){n.props.revealOrder?(r.push(o),er(n,e,r)):o()};t?t(i):i()}},ze.prototype.render=function(e){this.u=null,this.o=new Map;var n=ie(e.children);e.revealOrder&&e.revealOrder[0]==="b"&&n.reverse();for(var t=n.length;t--;)this.o.set(n[t],this.u=[1,0,this.u]);return e.children},ze.prototype.componentDidUpdate=ze.prototype.componentDidMount=function(){var e=this;this.o.forEach(function(n,t){er(e,t,n)})};var ur=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,ti=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,ni=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,ri=/[A-Z0-9]/g,oi=typeof document<"u",ii=function(e){return(typeof Symbol<"u"&&typeof Symbol()=="symbol"?/fil|che|rad/:/fil|che|ra/).test(e)};function Vt(e,n,t){return n.__k==null&&(n.textContent=""),xe(e,n),typeof t=="function"&&t(),e?e.__c:null}function dr(e,n,t){return Ct(e,n),typeof t=="function"&&t(),e?e.__c:null}Y.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(e){Object.defineProperty(Y.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(n){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:n})}})});var tr=y.event;function li(){}function si(){return this.cancelBubble}function ai(){return this.defaultPrevented}y.event=function(e){return tr&&(e=tr(e)),e.persist=li,e.isPropagationStopped=si,e.isDefaultPrevented=ai,e.nativeEvent=e};var Tt,ui={enumerable:!1,configurable:!0,get:function(){return this.class}},nr=y.vnode;y.vnode=function(e){typeof e.type=="string"&&function(n){var t=n.props,r=n.type,o={};for(var i in t){var l=t[i];if(!(i==="value"&&"defaultValue"in t&&l==null||oi&&i==="children"&&r==="noscript"||i==="class"||i==="className")){var u=i.toLowerCase();i==="defaultValue"&&"value"in t&&t.value==null?i="value":i==="download"&&l===!0?l="":u==="ondoubleclick"?i="ondblclick":u!=="onchange"||r!=="input"&&r!=="textarea"||ii(t.type)?u==="onfocus"?i="onfocusin":u==="onblur"?i="onfocusout":ni.test(i)?i=u:r.indexOf("-")===-1&&ti.test(i)?i=i.replace(ri,"-$&").toLowerCase():l===null&&(l=void 0):u=i="oninput",u==="oninput"&&o[i=u]&&(i="oninputCapture"),o[i]=l}}r=="select"&&o.multiple&&Array.isArray(o.value)&&(o.value=ie(t.children).forEach(function(s){s.props.selected=o.value.indexOf(s.props.value)!=-1})),r=="select"&&o.defaultValue!=null&&(o.value=ie(t.children).forEach(function(s){s.props.selected=o.multiple?o.defaultValue.indexOf(s.props.value)!=-1:o.defaultValue==s.props.value})),t.class&&!t.className?(o.class=t.class,Object.defineProperty(o,"className",ui)):(t.className&&!t.class||t.class&&t.className)&&(o.class=o.className=t.className),n.props=o}(e),e.$$typeof=ur,nr&&nr(e)};var rr=y.__r;y.__r=function(e){rr&&rr(e),Tt=e.__c};var or=y.diffed;y.diffed=function(e){or&&or(e);var n=e.props,t=e.__e;t!=null&&e.type==="textarea"&&"value"in n&&n.value!==t.value&&(t.value=n.value==null?"":n.value),Tt=null};var di={ReactCurrentDispatcher:{current:{readContext:function(e){return Tt.__n[e.__c].props.value}}}};function ci(e){return j.bind(null,e)}function cr(e){return!!e&&e.$$typeof===ur}function fi(e){return cr(e)?Pn.apply(null,arguments):e}function Dt(e){return!!e.__k&&(xe(null,e),!0)}function gi(e){return e&&(e.base||e.nodeType===1&&e)||null}var pi=function(e,n){return e(n)},mi=function(e,n){return e(n)},Ot=oe;function fr(e){e()}function hi(e){return e}function _i(){return[!1,fr]}var yi=le;function vi(e,n){var t=n(),r=P({h:{__:t,v:n}}),o=r[0].h,i=r[1];return le(function(){o.__=t,o.v=n,Ft(o.__,n())||i({h:o})},[e,t,n]),N(function(){return Ft(o.__,o.v())||i({h:o}),e(function(){Ft(o.__,o.v())||i({h:o})})},[e]),t}var C={useState:P,useId:Xn,useReducer:Ie,useEffect:N,useLayoutEffect:le,useInsertionEffect:yi,useTransition:_i,useDeferredValue:hi,useSyncExternalStore:vi,startTransition:fr,useRef:K,useImperativeHandle:Kn,useMemo:te,useCallback:q,useContext:qn,useDebugValue:Wn,version:"17.0.2",Children:Xo,render:Vt,hydrate:dr,unmountComponentAtNode:Dt,createPortal:ei,createElement:j,createContext:Et,createFactory:ci,cloneElement:fi,createRef:bt,Fragment:oe,isValidElement:cr,findDOMNode:gi,Component:Y,PureComponent:$t,memo:Ko,forwardRef:Wo,flushSync:mi,unstable_batchedUpdates:pi,StrictMode:Ot,Suspense:nt,SuspenseList:ze,lazy:Jo,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:di};function me(e,n){return typeof e=="function"?e(n):e}function J(e,n){return t=>{n.setState(r=>({...r,[e]:me(t,r[e])}))}}function lt(e){return e instanceof Function}function Si(e){return Array.isArray(e)&&e.every(n=>typeof n=="number")}function bi(e,n){let t=[],r=o=>{o.forEach(i=>{t.push(i);let l=n(i);l!=null&&l.length&&r(l)})};return r(e),t}function w(e,n,t){let r=[],o;return()=>{let i;t.key&&t.debug&&(i=Date.now());let l=e();if(!(l.length!==r.length||l.some((d,a)=>r[a]!==d)))return o;r=l;let s;if(t.key&&t.debug&&(s=Date.now()),o=n(...l),t==null||t.onChange==null||t.onChange(o),t.key&&t.debug&&t!=null&&t.debug()){let d=Math.round((Date.now()-i)*100)/100,a=Math.round((Date.now()-s)*100)/100,g=a/16,f=(c,m)=>{for(c=String(c);c.length2&&(l.children=arguments.length>3?ze.call(arguments,2):t),typeof e=="function"&&e.defaultProps!=null)for(i in e.defaultProps)l[i]===void 0&&(l[i]=e.defaultProps[i]);return Le(e,l,r,o,null)}function Le(e,n,t,r,o){var i={type:e,props:n,key:t,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:o??++Rn};return o==null&&y.vnode!=null&&y.vnode(i),i}function Ct(){return{current:null}}function oe(e){return e.children}function J(e,n){this.props=e,this.context=n}function He(e,n){if(n==null)return e.__?He(e.__,e.__.__k.indexOf(e)+1):null;for(var t;nn&&ye.sort(St));Qe.__r=0}function Vn(e,n,t,r,o,i,l,u,s,d){var a,g,f,c,p,m,h,_=r&&r.__k||Fn,E=_.length;for(t.__k=[],a=0;a0?Le(c.type,c.props,c.key,c.ref?c.ref:null,c.__v):c)!=null){if(c.__=t,c.__b=t.__b+1,(f=_[a])===null||f&&c.key==f.key&&c.type===f.type)_[a]=void 0;else for(g=0;g=0;n--)if((t=e.__k[n])&&(r=On(t)))return r}return null}function Bo(e,n,t,r,o){var i;for(i in t)i==="children"||i==="key"||i in n||Ze(e,i,null,t[i],r);for(i in n)o&&typeof n[i]!="function"||i==="children"||i==="key"||i==="value"||i==="checked"||t[i]===n[i]||Ze(e,i,n[i],t[i],r)}function Cn(e,n,t){n[0]==="-"?e.setProperty(n,t??""):e[n]=t==null?"":typeof t!="number"||Go.test(n)?t:t+"px"}function Ze(e,n,t,r,o){var i;e:if(n==="style")if(typeof t=="string")e.style.cssText=t;else{if(typeof r=="string"&&(e.style.cssText=r=""),r)for(n in r)t&&n in t||Cn(e.style,n,"");if(t)for(n in t)r&&t[n]===r[n]||Cn(e.style,n,t[n])}else if(n[0]==="o"&&n[1]==="n")i=n!==(n=n.replace(/Capture$/,"")),n=n.toLowerCase()in e?n.toLowerCase().slice(2):n.slice(2),e.l||(e.l={}),e.l[n+i]=t,t?r||e.addEventListener(n,i?En:wn,i):e.removeEventListener(n,i?En:wn,i);else if(n!=="dangerouslySetInnerHTML"){if(o)n=n.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(n!=="width"&&n!=="height"&&n!=="href"&&n!=="list"&&n!=="form"&&n!=="tabIndex"&&n!=="download"&&n!=="rowSpan"&&n!=="colSpan"&&n in e)try{e[n]=t??"";break e}catch{}typeof t=="function"||(t==null||t===!1&&n[4]!=="-"?e.removeAttribute(n):e.setAttribute(n,t))}}function wn(e){return this.l[e.type+!1](y.event?y.event(e):e)}function En(e){return this.l[e.type+!0](y.event?y.event(e):e)}function wt(e,n,t,r,o,i,l,u,s){var d,a,g,f,c,p,m,h,_,E,M,O,D,L,G,V=n.type;if(n.constructor!==void 0)return null;t.__h!=null&&(s=t.__h,u=n.__e=t.__e,n.__h=null,i=[u]),(d=y.__b)&&d(n);try{e:if(typeof V=="function"){if(h=n.props,_=(d=V.contextType)&&r[d.__c],E=d?_?_.props.value:d.__:r,t.__c?m=(a=n.__c=t.__c).__=a.__E:("prototype"in V&&V.prototype.render?n.__c=a=new V(h,E):(n.__c=a=new J(h,E),a.constructor=V,a.render=jo),_&&_.sub(a),a.props=h,a.state||(a.state={}),a.context=E,a.__n=r,g=a.__d=!0,a.__h=[],a._sb=[]),a.__s==null&&(a.__s=a.state),V.getDerivedStateFromProps!=null&&(a.__s==a.state&&(a.__s=ae({},a.__s)),ae(a.__s,V.getDerivedStateFromProps(h,a.__s))),f=a.props,c=a.state,a.__v=n,g)V.getDerivedStateFromProps==null&&a.componentWillMount!=null&&a.componentWillMount(),a.componentDidMount!=null&&a.__h.push(a.componentDidMount);else{if(V.getDerivedStateFromProps==null&&h!==f&&a.componentWillReceiveProps!=null&&a.componentWillReceiveProps(h,E),!a.__e&&a.shouldComponentUpdate!=null&&a.shouldComponentUpdate(h,a.__s,E)===!1||n.__v===t.__v){for(n.__v!==t.__v&&(a.props=h,a.state=a.__s,a.__d=!1),a.__e=!1,n.__e=t.__e,n.__k=t.__k,n.__k.forEach(function(B){B&&(B.__=n)}),M=0;M2&&(u.children=arguments.length>3?ze.call(arguments,2):t),Le(e.type,u,r||e.key,o||e.ref,null)}function Rt(e,n){var t={__c:n="__cC"+Mn++,__:e,Consumer:function(r,o){return r.children(o)},Provider:function(r){var o,i;return this.getChildContext||(o=[],(i={})[n]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(l){this.props.value!==l.value&&o.some(function(u){u.__e=!0,bt(u)})},this.sub=function(l){o.push(l);var u=l.componentWillUnmount;l.componentWillUnmount=function(){o.splice(o.indexOf(l),1),u&&u.call(l)}}),r.children}};return t.Provider.__=t.Consumer.contextType=t}ze=Fn.slice,y={__e:function(e,n,t,r){for(var o,i,l;n=n.__;)if((o=n.__c)&&!o.__)try{if((i=o.constructor)&&i.getDerivedStateFromError!=null&&(o.setState(i.getDerivedStateFromError(e)),l=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(e,r||{}),l=o.__d),l)return o.__E=o}catch(u){e=u}throw e}},Rn=0,zo=function(e){return e!=null&&e.constructor===void 0},J.prototype.setState=function(e,n){var t;t=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=ae({},this.state),typeof e=="function"&&(e=e(ae({},t),this.props)),e&&ae(t,e),e!=null&&this.__v&&(n&&this._sb.push(n),bt(this))},J.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),bt(this))},J.prototype.render=oe,ye=[],xn=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,St=function(e,n){return e.__v.__b-n.__v.__b},Qe.__r=0,Mn=0;var pe,T,xt,Ln,Me=0,Kn=[],tt=[],Hn=y.__b,zn=y.__r,Gn=y.diffed,Bn=y.__c,Un=y.unmount;function Fe(e,n){y.__h&&y.__h(T,e,Me||n),Me=0;var t=T.__H||(T.__H={__:[],__h:[]});return e>=t.__.length&&t.__.push({__V:tt}),t.__[e]}function P(e){return Me=1,Ie(Jn,e)}function Ie(e,n,t){var r=Fe(pe++,2);if(r.t=e,!r.__c&&(r.__=[t?t(n):Jn(void 0,n),function(u){var s=r.__N?r.__N[0]:r.__[0],d=r.t(s,u);s!==d&&(r.__N=[d,r.__[1]],r.__c.setState({}))}],r.__c=T,!T.u)){var o=function(u,s,d){if(!r.__c.__H)return!0;var a=r.__c.__H.__.filter(function(f){return f.__c});if(a.every(function(f){return!f.__N}))return!i||i.call(this,u,s,d);var g=!1;return a.forEach(function(f){if(f.__N){var c=f.__[0];f.__=f.__N,f.__N=void 0,c!==f.__[0]&&(g=!0)}}),!(!g&&r.__c.props===u)&&(!i||i.call(this,u,s,d))};T.u=!0;var i=T.shouldComponentUpdate,l=T.componentWillUpdate;T.componentWillUpdate=function(u,s,d){if(this.__e){var a=i;i=void 0,o(u,s,d),i=a}l&&l.call(this,u,s,d)},T.shouldComponentUpdate=o}return r.__N||r.__}function N(e,n){var t=Fe(pe++,3);!y.__s&&Ft(t.__H,n)&&(t.__=e,t.i=n,T.__H.__h.push(t))}function le(e,n){var t=Fe(pe++,4);!y.__s&&Ft(t.__H,n)&&(t.__=e,t.i=n,T.__h.push(t))}function q(e){return Me=5,ne(function(){return{current:e}},[])}function qn(e,n,t){Me=6,le(function(){return typeof e=="function"?(e(n()),function(){return e(null)}):e?(e.current=n(),function(){return e.current=null}):void 0},t==null?t:t.concat(e))}function ne(e,n){var t=Fe(pe++,7);return Ft(t.__H,n)?(t.__V=e(),t.i=n,t.__h=e,t.__V):t.__}function W(e,n){return Me=8,ne(function(){return e},n)}function Wn(e){var n=T.context[e.__c],t=Fe(pe++,9);return t.c=e,n?(t.__==null&&(t.__=!0,n.sub(T)),n.props.value):e.__}function Xn(e,n){y.useDebugValue&&y.useDebugValue(n?n(e):e)}function Yn(){var e=Fe(pe++,11);if(!e.__){for(var n=T.__v;n!==null&&!n.__m&&n.__!==null;)n=n.__;var t=n.__m||(n.__m=[0,0]);e.__="P"+t[0]+"-"+t[1]++}return e.__}function Ko(){for(var e;e=Kn.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(nt),e.__H.__h.forEach(Mt),e.__H.__h=[]}catch(n){e.__H.__h=[],y.__e(n,e.__v)}}y.__b=function(e){T=null,Hn&&Hn(e)},y.__r=function(e){zn&&zn(e),pe=0;var n=(T=e.__c).__H;n&&(xt===T?(n.__h=[],T.__h=[],n.__.forEach(function(t){t.__N&&(t.__=t.__N),t.__V=tt,t.__N=t.i=void 0})):(n.__h.forEach(nt),n.__h.forEach(Mt),n.__h=[],pe=0)),xt=T},y.diffed=function(e){Gn&&Gn(e);var n=e.__c;n&&n.__H&&(n.__H.__h.length&&(Kn.push(n)!==1&&Ln===y.requestAnimationFrame||((Ln=y.requestAnimationFrame)||qo)(Ko)),n.__H.__.forEach(function(t){t.i&&(t.__H=t.i),t.__V!==tt&&(t.__=t.__V),t.i=void 0,t.__V=tt})),xt=T=null},y.__c=function(e,n){n.some(function(t){try{t.__h.forEach(nt),t.__h=t.__h.filter(function(r){return!r.__||Mt(r)})}catch(r){n.some(function(o){o.__h&&(o.__h=[])}),n=[],y.__e(r,t.__v)}}),Bn&&Bn(e,n)},y.unmount=function(e){Un&&Un(e);var n,t=e.__c;t&&t.__H&&(t.__H.__.forEach(function(r){try{nt(r)}catch(o){n=o}}),t.__H=void 0,n&&y.__e(n,t.__v))};var jn=typeof requestAnimationFrame=="function";function qo(e){var n,t=function(){clearTimeout(r),jn&&cancelAnimationFrame(n),setTimeout(e)},r=setTimeout(t,100);jn&&(n=requestAnimationFrame(t))}function nt(e){var n=T,t=e.__c;typeof t=="function"&&(e.__c=void 0,t()),T=n}function Mt(e){var n=T;e.__c=e.__(),T=n}function Ft(e,n){return!e||e.length!==n.length||n.some(function(t,r){return t!==e[r]})}function Jn(e,n){return typeof n=="function"?n(e):n}function lr(e,n){for(var t in n)e[t]=n[t];return e}function $t(e,n){for(var t in e)if(t!=="__source"&&!(t in n))return!0;for(var r in n)if(r!=="__source"&&e[r]!==n[r])return!0;return!1}function It(e,n){return e===n&&(e!==0||1/e==1/n)||e!=e&&n!=n}function Vt(e){this.props=e}function Wo(e,n){function t(o){var i=this.props.ref,l=i==o.ref;return!l&&i&&(i.call?i(null):i.current=null),n?!n(this.props,o)||!l:$t(this.props,o)}function r(o){return this.shouldComponentUpdate=t,K(e,o)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}(Vt.prototype=new J).isPureReactComponent=!0,Vt.prototype.shouldComponentUpdate=function(e,n){return $t(this.props,e)||$t(this.state,n)};var Qn=y.__b;y.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),Qn&&Qn(e)};var Xo=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function Yo(e){function n(t){var r=lr({},t);return delete r.ref,e(r,t.ref||null)}return n.$$typeof=Xo,n.render=n,n.prototype.isReactComponent=n.__f=!0,n.displayName="ForwardRef("+(e.displayName||e.name)+")",n}var Zn=function(e,n){return e==null?null:ie(ie(e).map(n))},Jo={map:Zn,forEach:Zn,count:function(e){return e?ie(e).length:0},only:function(e){var n=ie(e);if(n.length!==1)throw"Children.only";return n[0]},toArray:ie},Qo=y.__e;y.__e=function(e,n,t,r){if(e.then){for(var o,i=n;i=i.__;)if((o=i.__c)&&o.__c)return n.__e==null&&(n.__e=t.__e,n.__k=t.__k),o.__c(e,n)}Qo(e,n,t,r)};var er=y.unmount;function sr(e,n,t){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach(function(r){typeof r.__c=="function"&&r.__c()}),e.__c.__H=null),(e=lr({},e)).__c!=null&&(e.__c.__P===t&&(e.__c.__P=n),e.__c=null),e.__k=e.__k&&e.__k.map(function(r){return sr(r,n,t)})),e}function ar(e,n,t){return e&&(e.__v=null,e.__k=e.__k&&e.__k.map(function(r){return ar(r,n,t)}),e.__c&&e.__c.__P===n&&(e.__e&&t.insertBefore(e.__e,e.__d),e.__c.__e=!0,e.__c.__P=t)),e}function rt(){this.__u=0,this.t=null,this.__b=null}function ur(e){var n=e.__.__c;return n&&n.__a&&n.__a(e)}function Zo(e){var n,t,r;function o(i){if(n||(n=e()).then(function(l){t=l.default||l},function(l){r=l}),r)throw r;if(!t)throw n;return K(t,i)}return o.displayName="Lazy",o.__f=!0,o}function Ge(){this.u=null,this.o=null}y.unmount=function(e){var n=e.__c;n&&n.__R&&n.__R(),n&&e.__h===!0&&(e.type=null),er&&er(e)},(rt.prototype=new J).__c=function(e,n){var t=n.__c,r=this;r.t==null&&(r.t=[]),r.t.push(t);var o=ur(r.__v),i=!1,l=function(){i||(i=!0,t.__R=null,o?o(u):u())};t.__R=l;var u=function(){if(!--r.__u){if(r.state.__a){var d=r.state.__a;r.__v.__k[0]=ar(d,d.__c.__P,d.__c.__O)}var a;for(r.setState({__a:r.__b=null});a=r.t.pop();)a.forceUpdate()}},s=n.__h===!0;r.__u++||s||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(l,l)},rt.prototype.componentWillUnmount=function(){this.t=[]},rt.prototype.render=function(e,n){if(this.__b){if(this.__v.__k){var t=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=sr(this.__b,t,r.__O=r.__P)}this.__b=null}var o=n.__a&&K(oe,null,e.fallback);return o&&(o.__h=null),[K(oe,null,n.__a?null:e.children),o]};var tr=function(e,n,t){if(++t[1]===t[0]&&e.o.delete(n),e.props.revealOrder&&(e.props.revealOrder[0]!=="t"||!e.o.size))for(t=e.u;t;){for(;t.length>3;)t.pop()();if(t[1]>>1,1),n.i.removeChild(r)}}),xe(K(ei,{context:n.context},e.__v),n.l)):n.l&&n.componentWillUnmount()}function ni(e,n){var t=K(ti,{__v:e,i:n});return t.containerInfo=n,t}(Ge.prototype=new J).__a=function(e){var n=this,t=ur(n.__v),r=n.o.get(e);return r[0]++,function(o){var i=function(){n.props.revealOrder?(r.push(o),tr(n,e,r)):o()};t?t(i):i()}},Ge.prototype.render=function(e){this.u=null,this.o=new Map;var n=ie(e.children);e.revealOrder&&e.revealOrder[0]==="b"&&n.reverse();for(var t=n.length;t--;)this.o.set(n[t],this.u=[1,0,this.u]);return e.children},Ge.prototype.componentDidUpdate=Ge.prototype.componentDidMount=function(){var e=this;this.o.forEach(function(n,t){tr(e,t,n)})};var dr=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,ri=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,oi=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,ii=/[A-Z0-9]/g,li=typeof document<"u",si=function(e){return(typeof Symbol<"u"&&typeof Symbol()=="symbol"?/fil|che|rad/:/fil|che|ra/).test(e)};function Tt(e,n,t){return n.__k==null&&(n.textContent=""),xe(e,n),typeof t=="function"&&t(),e?e.__c:null}function cr(e,n,t){return Et(e,n),typeof t=="function"&&t(),e?e.__c:null}J.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(e){Object.defineProperty(J.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(n){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:n})}})});var nr=y.event;function ai(){}function ui(){return this.cancelBubble}function di(){return this.defaultPrevented}y.event=function(e){return nr&&(e=nr(e)),e.persist=ai,e.isPropagationStopped=ui,e.isDefaultPrevented=di,e.nativeEvent=e};var Dt,ci={enumerable:!1,configurable:!0,get:function(){return this.class}},rr=y.vnode;y.vnode=function(e){typeof e.type=="string"&&function(n){var t=n.props,r=n.type,o={};for(var i in t){var l=t[i];if(!(i==="value"&&"defaultValue"in t&&l==null||li&&i==="children"&&r==="noscript"||i==="class"||i==="className")){var u=i.toLowerCase();i==="defaultValue"&&"value"in t&&t.value==null?i="value":i==="download"&&l===!0?l="":u==="ondoubleclick"?i="ondblclick":u!=="onchange"||r!=="input"&&r!=="textarea"||si(t.type)?u==="onfocus"?i="onfocusin":u==="onblur"?i="onfocusout":oi.test(i)?i=u:r.indexOf("-")===-1&&ri.test(i)?i=i.replace(ii,"-$&").toLowerCase():l===null&&(l=void 0):u=i="oninput",u==="oninput"&&o[i=u]&&(i="oninputCapture"),o[i]=l}}r=="select"&&o.multiple&&Array.isArray(o.value)&&(o.value=ie(t.children).forEach(function(s){s.props.selected=o.value.indexOf(s.props.value)!=-1})),r=="select"&&o.defaultValue!=null&&(o.value=ie(t.children).forEach(function(s){s.props.selected=o.multiple?o.defaultValue.indexOf(s.props.value)!=-1:o.defaultValue==s.props.value})),t.class&&!t.className?(o.class=t.class,Object.defineProperty(o,"className",ci)):(t.className&&!t.class||t.class&&t.className)&&(o.class=o.className=t.className),n.props=o}(e),e.$$typeof=dr,rr&&rr(e)};var or=y.__r;y.__r=function(e){or&&or(e),Dt=e.__c};var ir=y.diffed;y.diffed=function(e){ir&&ir(e);var n=e.props,t=e.__e;t!=null&&e.type==="textarea"&&"value"in n&&n.value!==t.value&&(t.value=n.value==null?"":n.value),Dt=null};var fi={ReactCurrentDispatcher:{current:{readContext:function(e){return Dt.__n[e.__c].props.value}}}};function gi(e){return K.bind(null,e)}function fr(e){return!!e&&e.$$typeof===dr}function pi(e){return fr(e)?kn.apply(null,arguments):e}function Ot(e){return!!e.__k&&(xe(null,e),!0)}function mi(e){return e&&(e.base||e.nodeType===1&&e)||null}var hi=function(e,n){return e(n)},_i=function(e,n){return e(n)},Nt=oe;function gr(e){e()}function yi(e){return e}function vi(){return[!1,gr]}var Si=le;function bi(e,n){var t=n(),r=P({h:{__:t,v:n}}),o=r[0].h,i=r[1];return le(function(){o.__=t,o.v=n,It(o.__,n())||i({h:o})},[e,t,n]),N(function(){return It(o.__,o.v())||i({h:o}),e(function(){It(o.__,o.v())||i({h:o})})},[e]),t}var w={useState:P,useId:Yn,useReducer:Ie,useEffect:N,useLayoutEffect:le,useInsertionEffect:Si,useTransition:vi,useDeferredValue:yi,useSyncExternalStore:bi,startTransition:gr,useRef:q,useImperativeHandle:qn,useMemo:ne,useCallback:W,useContext:Wn,useDebugValue:Xn,version:"17.0.2",Children:Jo,render:Tt,hydrate:cr,unmountComponentAtNode:Ot,createPortal:ni,createElement:K,createContext:Rt,createFactory:gi,cloneElement:pi,createRef:Ct,Fragment:oe,isValidElement:fr,findDOMNode:mi,Component:J,PureComponent:Vt,memo:Wo,forwardRef:Yo,flushSync:_i,unstable_batchedUpdates:hi,StrictMode:Nt,Suspense:rt,SuspenseList:Ge,lazy:Zo,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:fi};function me(e,n){return typeof e=="function"?e(n):e}function Q(e,n){return t=>{n.setState(r=>({...r,[e]:me(t,r[e])}))}}function st(e){return e instanceof Function}function Ci(e){return Array.isArray(e)&&e.every(n=>typeof n=="number")}function wi(e,n){let t=[],r=o=>{o.forEach(i=>{t.push(i);let l=n(i);l!=null&&l.length&&r(l)})};return r(e),t}function C(e,n,t){let r=[],o;return()=>{let i;t.key&&t.debug&&(i=Date.now());let l=e();if(!(l.length!==r.length||l.some((d,a)=>r[a]!==d)))return o;r=l;let s;if(t.key&&t.debug&&(s=Date.now()),o=n(...l),t==null||t.onChange==null||t.onChange(o),t.key&&t.debug&&t!=null&&t.debug()){let d=Math.round((Date.now()-i)*100)/100,a=Math.round((Date.now()-s)*100)/100,g=a/16,f=(c,p)=>{for(c=String(c);c.length{let c=f;for(let p of s.split(".")){var m;c=(m=c)==null?void 0:m[p]}return c}:a=f=>f[u.accessorKey]),!d)throw new Error;let g={id:`${String(d)}`,accessorFn:a,parent:r,depth:t,columnDef:u,columns:[],getFlatColumns:w(()=>[!0],()=>{var f;return[g,...(f=g.columns)==null?void 0:f.flatMap(c=>c.getFlatColumns())]},{key:"column.getFlatColumns",debug:()=>{var f;return(f=e.options.debugAll)!=null?f:e.options.debugColumns}}),getLeafColumns:w(()=>[e._getOrderColumnsFn()],f=>{var c;if((c=g.columns)!=null&&c.length){let m=g.columns.flatMap(p=>p.getLeafColumns());return f(m)}return[g]},{key:"column.getLeafColumns",debug:()=>{var f;return(f=e.options.debugAll)!=null?f:e.options.debugColumns}})};return g=e._features.reduce((f,c)=>Object.assign(f,c.createColumn==null?void 0:c.createColumn(g,e)),g),g}function pr(e,n,t){var r;let i={id:(r=t.id)!=null?r:n.id,column:n,index:t.index,isPlaceholder:!!t.isPlaceholder,placeholderId:t.placeholderId,depth:t.depth,subHeaders:[],colSpan:0,rowSpan:0,headerGroup:null,getLeafHeaders:()=>{let l=[],u=s=>{s.subHeaders&&s.subHeaders.length&&s.subHeaders.map(u),l.push(s)};return u(i),l},getContext:()=>({table:e,header:i,column:n})};return e._features.forEach(l=>{Object.assign(i,l.createHeader==null?void 0:l.createHeader(i,e))}),i}var Ci={createTable:e=>({getHeaderGroups:w(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(n,t,r,o)=>{var i,l;let u=(i=r?.map(g=>t.find(f=>f.id===g)).filter(Boolean))!=null?i:[],s=(l=o?.map(g=>t.find(f=>f.id===g)).filter(Boolean))!=null?l:[],d=t.filter(g=>!(r!=null&&r.includes(g.id))&&!(o!=null&&o.includes(g.id)));return rt(n,[...u,...d,...s],e)},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getCenterHeaderGroups:w(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(n,t,r,o)=>(t=t.filter(i=>!(r!=null&&r.includes(i.id))&&!(o!=null&&o.includes(i.id))),rt(n,t,e,"center")),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeftHeaderGroups:w(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left],(n,t,r)=>{var o;let i=(o=r?.map(l=>t.find(u=>u.id===l)).filter(Boolean))!=null?o:[];return rt(n,i,e,"left")},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getRightHeaderGroups:w(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.right],(n,t,r)=>{var o;let i=(o=r?.map(l=>t.find(u=>u.id===l)).filter(Boolean))!=null?o:[];return rt(n,i,e,"right")},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getFooterGroups:w(()=>[e.getHeaderGroups()],n=>[...n].reverse(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeftFooterGroups:w(()=>[e.getLeftHeaderGroups()],n=>[...n].reverse(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getCenterFooterGroups:w(()=>[e.getCenterHeaderGroups()],n=>[...n].reverse(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getRightFooterGroups:w(()=>[e.getRightHeaderGroups()],n=>[...n].reverse(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getFlatHeaders:w(()=>[e.getHeaderGroups()],n=>n.map(t=>t.headers).flat(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeftFlatHeaders:w(()=>[e.getLeftHeaderGroups()],n=>n.map(t=>t.headers).flat(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getCenterFlatHeaders:w(()=>[e.getCenterHeaderGroups()],n=>n.map(t=>t.headers).flat(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getRightFlatHeaders:w(()=>[e.getRightHeaderGroups()],n=>n.map(t=>t.headers).flat(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getCenterLeafHeaders:w(()=>[e.getCenterFlatHeaders()],n=>n.filter(t=>{var r;return!((r=t.subHeaders)!=null&&r.length)}),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeftLeafHeaders:w(()=>[e.getLeftFlatHeaders()],n=>n.filter(t=>{var r;return!((r=t.subHeaders)!=null&&r.length)}),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getRightLeafHeaders:w(()=>[e.getRightFlatHeaders()],n=>n.filter(t=>{var r;return!((r=t.subHeaders)!=null&&r.length)}),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeafHeaders:w(()=>[e.getLeftHeaderGroups(),e.getCenterHeaderGroups(),e.getRightHeaderGroups()],(n,t,r)=>{var o,i,l,u,s,d;return[...(o=(i=n[0])==null?void 0:i.headers)!=null?o:[],...(l=(u=t[0])==null?void 0:u.headers)!=null?l:[],...(s=(d=r[0])==null?void 0:d.headers)!=null?s:[]].map(a=>a.getLeafHeaders()).flat()},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}})})};function rt(e,n,t,r){var o,i;let l=0,u=function(f,c){c===void 0&&(c=1),l=Math.max(l,c),f.filter(m=>m.getIsVisible()).forEach(m=>{var p;(p=m.columns)!=null&&p.length&&u(m.columns,c+1)},0)};u(e);let s=[],d=(f,c)=>{let m={depth:c,id:[r,`${c}`].filter(Boolean).join("_"),headers:[]},p=[];f.forEach(h=>{let _=[...p].reverse()[0],x=h.column.depth===m.depth,V,I=!1;if(x&&h.column.parent?V=h.column.parent:(V=h.column,I=!0),_&&_?.column===V)_.subHeaders.push(h);else{let O=pr(t,V,{id:[r,c,V.id,h?.id].filter(Boolean).join("_"),isPlaceholder:I,placeholderId:I?`${p.filter(L=>L.column===V).length}`:void 0,depth:c,index:p.length});O.subHeaders.push(h),p.push(O)}m.headers.push(h),h.headerGroup=m}),s.push(m),c>0&&d(p,c-1)},a=n.map((f,c)=>pr(t,f,{depth:l,index:c}));d(a,l-1),s.reverse();let g=f=>f.filter(m=>m.column.getIsVisible()).map(m=>{let p=0,h=0,_=[0];m.subHeaders&&m.subHeaders.length?(_=[],g(m.subHeaders).forEach(V=>{let{colSpan:I,rowSpan:O}=V;p+=I,_.push(O)})):p=1;let x=Math.min(..._);return h=h+x,m.colSpan=p,m.rowSpan=h,{colSpan:p,rowSpan:h}});return g((o=(i=s[0])==null?void 0:i.headers)!=null?o:[]),s}var ot={size:150,minSize:20,maxSize:Number.MAX_SAFE_INTEGER},Nt=()=>({startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,isResizingColumn:!1,columnSizingStart:[]}),Ei={getDefaultColumnDef:()=>ot,getInitialState:e=>({columnSizing:{},columnSizingInfo:Nt(),...e}),getDefaultOptions:e=>({columnResizeMode:"onEnd",onColumnSizingChange:J("columnSizing",e),onColumnSizingInfoChange:J("columnSizingInfo",e)}),createColumn:(e,n)=>({getSize:()=>{var t,r,o;let i=n.getState().columnSizing[e.id];return Math.min(Math.max((t=e.columnDef.minSize)!=null?t:ot.minSize,(r=i??e.columnDef.size)!=null?r:ot.size),(o=e.columnDef.maxSize)!=null?o:ot.maxSize)},getStart:t=>{let r=t?t==="left"?n.getLeftVisibleLeafColumns():n.getRightVisibleLeafColumns():n.getVisibleLeafColumns(),o=r.findIndex(i=>i.id===e.id);if(o>0){let i=r[o-1];return i.getStart(t)+i.getSize()}return 0},resetSize:()=>{n.setColumnSizing(t=>{let{[e.id]:r,...o}=t;return o})},getCanResize:()=>{var t,r;return((t=e.columnDef.enableResizing)!=null?t:!0)&&((r=n.options.enableColumnResizing)!=null?r:!0)},getIsResizing:()=>n.getState().columnSizingInfo.isResizingColumn===e.id}),createHeader:(e,n)=>({getSize:()=>{let t=0,r=o=>{if(o.subHeaders.length)o.subHeaders.forEach(r);else{var i;t+=(i=o.column.getSize())!=null?i:0}};return r(e),t},getStart:()=>{if(e.index>0){let t=e.headerGroup.headers[e.index-1];return t.getStart()+t.getSize()}return 0},getResizeHandler:()=>{let t=n.getColumn(e.column.id),r=t?.getCanResize();return o=>{if(!t||!r||(o.persist==null||o.persist(),At(o)&&o.touches&&o.touches.length>1))return;let i=e.getSize(),l=e?e.getLeafHeaders().map(p=>[p.column.id,p.column.getSize()]):[[t.id,t.getSize()]],u=At(o)?Math.round(o.touches[0].clientX):o.clientX,s={},d=(p,h)=>{typeof h=="number"&&(n.setColumnSizingInfo(_=>{var x,V;let I=h-((x=_?.startOffset)!=null?x:0),O=Math.max(I/((V=_?.startSize)!=null?V:0),-.999999);return _.columnSizingStart.forEach(L=>{let[G,T]=L;s[G]=Math.round(Math.max(T+T*O,0)*100)/100}),{..._,deltaOffset:I,deltaPercentage:O}}),(n.options.columnResizeMode==="onChange"||p==="end")&&n.setColumnSizing(_=>({..._,...s})))},a=p=>d("move",p),g=p=>{d("end",p),n.setColumnSizingInfo(h=>({...h,isResizingColumn:!1,startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,columnSizingStart:[]}))},f={moveHandler:p=>a(p.clientX),upHandler:p=>{document.removeEventListener("mousemove",f.moveHandler),document.removeEventListener("mouseup",f.upHandler),g(p.clientX)}},c={moveHandler:p=>(p.cancelable&&(p.preventDefault(),p.stopPropagation()),a(p.touches[0].clientX),!1),upHandler:p=>{var h;document.removeEventListener("touchmove",c.moveHandler),document.removeEventListener("touchend",c.upHandler),p.cancelable&&(p.preventDefault(),p.stopPropagation()),g((h=p.touches[0])==null?void 0:h.clientX)}},m=Ri()?{passive:!1}:!1;At(o)?(document.addEventListener("touchmove",c.moveHandler,m),document.addEventListener("touchend",c.upHandler,m)):(document.addEventListener("mousemove",f.moveHandler,m),document.addEventListener("mouseup",f.upHandler,m)),n.setColumnSizingInfo(p=>({...p,startOffset:u,startSize:i,deltaOffset:0,deltaPercentage:0,columnSizingStart:l,isResizingColumn:t.id}))}}}),createTable:e=>({setColumnSizing:n=>e.options.onColumnSizingChange==null?void 0:e.options.onColumnSizingChange(n),setColumnSizingInfo:n=>e.options.onColumnSizingInfoChange==null?void 0:e.options.onColumnSizingInfoChange(n),resetColumnSizing:n=>{var t;e.setColumnSizing(n?{}:(t=e.initialState.columnSizing)!=null?t:{})},resetHeaderSizeInfo:n=>{var t;e.setColumnSizingInfo(n?Nt():(t=e.initialState.columnSizingInfo)!=null?t:Nt())},getTotalSize:()=>{var n,t;return(n=(t=e.getHeaderGroups()[0])==null?void 0:t.headers.reduce((r,o)=>r+o.getSize(),0))!=null?n:0},getLeftTotalSize:()=>{var n,t;return(n=(t=e.getLeftHeaderGroups()[0])==null?void 0:t.headers.reduce((r,o)=>r+o.getSize(),0))!=null?n:0},getCenterTotalSize:()=>{var n,t;return(n=(t=e.getCenterHeaderGroups()[0])==null?void 0:t.headers.reduce((r,o)=>r+o.getSize(),0))!=null?n:0},getRightTotalSize:()=>{var n,t;return(n=(t=e.getRightHeaderGroups()[0])==null?void 0:t.headers.reduce((r,o)=>r+o.getSize(),0))!=null?n:0}})},it=null;function Ri(){if(typeof it=="boolean")return it;let e=!1;try{let n={get passive(){return e=!0,!1}},t=()=>{};window.addEventListener("test",t,n),window.removeEventListener("test",t)}catch{e=!1}return it=e,it}function At(e){return e.type==="touchstart"}var xi={getInitialState:e=>({expanded:{},...e}),getDefaultOptions:e=>({onExpandedChange:J("expanded",e),paginateExpandedRows:!0}),createTable:e=>{let n=!1,t=!1;return{_autoResetExpanded:()=>{var r,o;if(!n){e._queue(()=>{n=!0});return}if((r=(o=e.options.autoResetAll)!=null?o:e.options.autoResetExpanded)!=null?r:!e.options.manualExpanding){if(t)return;t=!0,e._queue(()=>{e.resetExpanded(),t=!1})}},setExpanded:r=>e.options.onExpandedChange==null?void 0:e.options.onExpandedChange(r),toggleAllRowsExpanded:r=>{r??!e.getIsAllRowsExpanded()?e.setExpanded(!0):e.setExpanded({})},resetExpanded:r=>{var o,i;e.setExpanded(r?{}:(o=(i=e.initialState)==null?void 0:i.expanded)!=null?o:{})},getCanSomeRowsExpand:()=>e.getPrePaginationRowModel().flatRows.some(r=>r.getCanExpand()),getToggleAllRowsExpandedHandler:()=>r=>{r.persist==null||r.persist(),e.toggleAllRowsExpanded()},getIsSomeRowsExpanded:()=>{let r=e.getState().expanded;return r===!0||Object.values(r).some(Boolean)},getIsAllRowsExpanded:()=>{let r=e.getState().expanded;return typeof r=="boolean"?r===!0:!(!Object.keys(r).length||e.getRowModel().flatRows.some(o=>!o.getIsExpanded()))},getExpandedDepth:()=>{let r=0;return(e.getState().expanded===!0?Object.keys(e.getRowModel().rowsById):Object.keys(e.getState().expanded)).forEach(i=>{let l=i.split(".");r=Math.max(r,l.length)}),r},getPreExpandedRowModel:()=>e.getSortedRowModel(),getExpandedRowModel:()=>(!e._getExpandedRowModel&&e.options.getExpandedRowModel&&(e._getExpandedRowModel=e.options.getExpandedRowModel(e)),e.options.manualExpanding||!e._getExpandedRowModel?e.getPreExpandedRowModel():e._getExpandedRowModel())}},createRow:(e,n)=>({toggleExpanded:t=>{n.setExpanded(r=>{var o;let i=r===!0?!0:!!(r!=null&&r[e.id]),l={};if(r===!0?Object.keys(n.getRowModel().rowsById).forEach(u=>{l[u]=!0}):l=r,t=(o=t)!=null?o:!i,!i&&t)return{...l,[e.id]:!0};if(i&&!t){let{[e.id]:u,...s}=l;return s}return r})},getIsExpanded:()=>{var t;let r=n.getState().expanded;return!!((t=n.options.getIsRowExpanded==null?void 0:n.options.getIsRowExpanded(e))!=null?t:r===!0||r?.[e.id])},getCanExpand:()=>{var t,r,o;return(t=n.options.getRowCanExpand==null?void 0:n.options.getRowCanExpand(e))!=null?t:((r=n.options.enableExpanding)!=null?r:!0)&&!!((o=e.subRows)!=null&&o.length)},getToggleExpandedHandler:()=>{let t=e.getCanExpand();return()=>{t&&e.toggleExpanded()}}})},yr=(e,n,t)=>{var r,o,i;let l=t.toLowerCase();return!!(!((r=e.getValue(n))==null||(o=r.toString())==null||(i=o.toLowerCase())==null)&&i.includes(l))};yr.autoRemove=e=>ne(e);var vr=(e,n,t)=>{var r,o;return!!(!((r=e.getValue(n))==null||(o=r.toString())==null)&&o.includes(t))};vr.autoRemove=e=>ne(e);var Sr=(e,n,t)=>{var r,o;return((r=e.getValue(n))==null||(o=r.toString())==null?void 0:o.toLowerCase())===t?.toLowerCase()};Sr.autoRemove=e=>ne(e);var br=(e,n,t)=>{var r;return(r=e.getValue(n))==null?void 0:r.includes(t)};br.autoRemove=e=>ne(e)||!(e!=null&&e.length);var wr=(e,n,t)=>!t.some(r=>{var o;return!((o=e.getValue(n))!=null&&o.includes(r))});wr.autoRemove=e=>ne(e)||!(e!=null&&e.length);var Cr=(e,n,t)=>t.some(r=>{var o;return(o=e.getValue(n))==null?void 0:o.includes(r)});Cr.autoRemove=e=>ne(e)||!(e!=null&&e.length);var Er=(e,n,t)=>e.getValue(n)===t;Er.autoRemove=e=>ne(e);var Rr=(e,n,t)=>e.getValue(n)==t;Rr.autoRemove=e=>ne(e);var jt=(e,n,t)=>{let[r,o]=t,i=e.getValue(n);return i>=r&&i<=o};jt.resolveFilterValue=e=>{let[n,t]=e,r=typeof n!="number"?parseFloat(n):n,o=typeof t!="number"?parseFloat(t):t,i=n===null||Number.isNaN(r)?-1/0:r,l=t===null||Number.isNaN(o)?1/0:o;if(i>l){let u=i;i=l,l=u}return[i,l]};jt.autoRemove=e=>ne(e)||ne(e[0])&&ne(e[1]);var ue={includesString:yr,includesStringSensitive:vr,equalsString:Sr,arrIncludes:br,arrIncludesAll:wr,arrIncludesSome:Cr,equals:Er,weakEquals:Rr,inNumberRange:jt};function ne(e){return e==null||e===""}var Mi={getDefaultColumnDef:()=>({filterFn:"auto"}),getInitialState:e=>({columnFilters:[],globalFilter:void 0,...e}),getDefaultOptions:e=>({onColumnFiltersChange:J("columnFilters",e),onGlobalFilterChange:J("globalFilter",e),filterFromLeafRows:!1,maxLeafRowFilterDepth:100,globalFilterFn:"auto",getColumnCanGlobalFilter:n=>{var t,r;let o=(t=e.getCoreRowModel().flatRows[0])==null||(r=t._getAllCellsByColumnId()[n.id])==null?void 0:r.getValue();return typeof o=="string"||typeof o=="number"}}),createColumn:(e,n)=>({getAutoFilterFn:()=>{let t=n.getCoreRowModel().flatRows[0],r=t?.getValue(e.id);return typeof r=="string"?ue.includesString:typeof r=="number"?ue.inNumberRange:typeof r=="boolean"||r!==null&&typeof r=="object"?ue.equals:Array.isArray(r)?ue.arrIncludes:ue.weakEquals},getFilterFn:()=>{var t,r;return lt(e.columnDef.filterFn)?e.columnDef.filterFn:e.columnDef.filterFn==="auto"?e.getAutoFilterFn():(t=(r=n.options.filterFns)==null?void 0:r[e.columnDef.filterFn])!=null?t:ue[e.columnDef.filterFn]},getCanFilter:()=>{var t,r,o;return((t=e.columnDef.enableColumnFilter)!=null?t:!0)&&((r=n.options.enableColumnFilters)!=null?r:!0)&&((o=n.options.enableFilters)!=null?o:!0)&&!!e.accessorFn},getCanGlobalFilter:()=>{var t,r,o,i;return((t=e.columnDef.enableGlobalFilter)!=null?t:!0)&&((r=n.options.enableGlobalFilter)!=null?r:!0)&&((o=n.options.enableFilters)!=null?o:!0)&&((i=n.options.getColumnCanGlobalFilter==null?void 0:n.options.getColumnCanGlobalFilter(e))!=null?i:!0)&&!!e.accessorFn},getIsFiltered:()=>e.getFilterIndex()>-1,getFilterValue:()=>{var t,r;return(t=n.getState().columnFilters)==null||(r=t.find(o=>o.id===e.id))==null?void 0:r.value},getFilterIndex:()=>{var t,r;return(t=(r=n.getState().columnFilters)==null?void 0:r.findIndex(o=>o.id===e.id))!=null?t:-1},setFilterValue:t=>{n.setColumnFilters(r=>{let o=e.getFilterFn(),i=r?.find(a=>a.id===e.id),l=me(t,i?i.value:void 0);if(mr(o,l,e)){var u;return(u=r?.filter(a=>a.id!==e.id))!=null?u:[]}let s={id:e.id,value:l};if(i){var d;return(d=r?.map(a=>a.id===e.id?s:a))!=null?d:[]}return r!=null&&r.length?[...r,s]:[s]})},_getFacetedRowModel:n.options.getFacetedRowModel&&n.options.getFacetedRowModel(n,e.id),getFacetedRowModel:()=>e._getFacetedRowModel?e._getFacetedRowModel():n.getPreFilteredRowModel(),_getFacetedUniqueValues:n.options.getFacetedUniqueValues&&n.options.getFacetedUniqueValues(n,e.id),getFacetedUniqueValues:()=>e._getFacetedUniqueValues?e._getFacetedUniqueValues():new Map,_getFacetedMinMaxValues:n.options.getFacetedMinMaxValues&&n.options.getFacetedMinMaxValues(n,e.id),getFacetedMinMaxValues:()=>{if(e._getFacetedMinMaxValues)return e._getFacetedMinMaxValues()}}),createRow:(e,n)=>({columnFilters:{},columnFiltersMeta:{}}),createTable:e=>({getGlobalAutoFilterFn:()=>ue.includesString,getGlobalFilterFn:()=>{var n,t;let{globalFilterFn:r}=e.options;return lt(r)?r:r==="auto"?e.getGlobalAutoFilterFn():(n=(t=e.options.filterFns)==null?void 0:t[r])!=null?n:ue[r]},setColumnFilters:n=>{let t=e.getAllLeafColumns(),r=o=>{var i;return(i=me(n,o))==null?void 0:i.filter(l=>{let u=t.find(s=>s.id===l.id);if(u){let s=u.getFilterFn();if(mr(s,l.value,u))return!1}return!0})};e.options.onColumnFiltersChange==null||e.options.onColumnFiltersChange(r)},setGlobalFilter:n=>{e.options.onGlobalFilterChange==null||e.options.onGlobalFilterChange(n)},resetGlobalFilter:n=>{e.setGlobalFilter(n?void 0:e.initialState.globalFilter)},resetColumnFilters:n=>{var t,r;e.setColumnFilters(n?[]:(t=(r=e.initialState)==null?void 0:r.columnFilters)!=null?t:[])},getPreFilteredRowModel:()=>e.getCoreRowModel(),getFilteredRowModel:()=>(!e._getFilteredRowModel&&e.options.getFilteredRowModel&&(e._getFilteredRowModel=e.options.getFilteredRowModel(e)),e.options.manualFiltering||!e._getFilteredRowModel?e.getPreFilteredRowModel():e._getFilteredRowModel()),_getGlobalFacetedRowModel:e.options.getFacetedRowModel&&e.options.getFacetedRowModel(e,"__global__"),getGlobalFacetedRowModel:()=>e.options.manualFiltering||!e._getGlobalFacetedRowModel?e.getPreFilteredRowModel():e._getGlobalFacetedRowModel(),_getGlobalFacetedUniqueValues:e.options.getFacetedUniqueValues&&e.options.getFacetedUniqueValues(e,"__global__"),getGlobalFacetedUniqueValues:()=>e._getGlobalFacetedUniqueValues?e._getGlobalFacetedUniqueValues():new Map,_getGlobalFacetedMinMaxValues:e.options.getFacetedMinMaxValues&&e.options.getFacetedMinMaxValues(e,"__global__"),getGlobalFacetedMinMaxValues:()=>{if(e._getGlobalFacetedMinMaxValues)return e._getGlobalFacetedMinMaxValues()}})};function mr(e,n,t){return(e&&e.autoRemove?e.autoRemove(n,t):!1)||typeof n>"u"||typeof n=="string"&&!n}var Fi=(e,n,t)=>t.reduce((r,o)=>{let i=o.getValue(e);return r+(typeof i=="number"?i:0)},0),Ii=(e,n,t)=>{let r;return t.forEach(o=>{let i=o.getValue(e);i!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}),r},$i=(e,n,t)=>{let r;return t.forEach(o=>{let i=o.getValue(e);i!=null&&(r=i)&&(r=i)}),r},Vi=(e,n,t)=>{let r,o;return t.forEach(i=>{let l=i.getValue(e);l!=null&&(r===void 0?l>=l&&(r=o=l):(r>l&&(r=l),o{let t=0,r=0;if(n.forEach(o=>{let i=o.getValue(e);i!=null&&(i=+i)>=i&&(++t,r+=i)}),t)return r/t},Di=(e,n)=>{if(!n.length)return;let t=n.map(i=>i.getValue(e));if(!Si(t))return;if(t.length===1)return t[0];let r=Math.floor(t.length/2),o=t.sort((i,l)=>i-l);return t.length%2!==0?o[r]:(o[r-1]+o[r])/2},Oi=(e,n)=>Array.from(new Set(n.map(t=>t.getValue(e))).values()),Ni=(e,n)=>new Set(n.map(t=>t.getValue(e))).size,Ai=(e,n)=>n.length,Pt={sum:Fi,min:Ii,max:$i,extent:Vi,mean:Ti,median:Di,unique:Oi,uniqueCount:Ni,count:Ai},Pi={getDefaultColumnDef:()=>({aggregatedCell:e=>{var n,t;return(n=(t=e.getValue())==null||t.toString==null?void 0:t.toString())!=null?n:null},aggregationFn:"auto"}),getInitialState:e=>({grouping:[],...e}),getDefaultOptions:e=>({onGroupingChange:J("grouping",e),groupedColumnMode:"reorder"}),createColumn:(e,n)=>({toggleGrouping:()=>{n.setGrouping(t=>t!=null&&t.includes(e.id)?t.filter(r=>r!==e.id):[...t??[],e.id])},getCanGroup:()=>{var t,r,o,i;return(t=(r=(o=(i=e.columnDef.enableGrouping)!=null?i:!0)!=null?o:n.options.enableGrouping)!=null?r:!0)!=null?t:!!e.accessorFn},getIsGrouped:()=>{var t;return(t=n.getState().grouping)==null?void 0:t.includes(e.id)},getGroupedIndex:()=>{var t;return(t=n.getState().grouping)==null?void 0:t.indexOf(e.id)},getToggleGroupingHandler:()=>{let t=e.getCanGroup();return()=>{t&&e.toggleGrouping()}},getAutoAggregationFn:()=>{let t=n.getCoreRowModel().flatRows[0],r=t?.getValue(e.id);if(typeof r=="number")return Pt.sum;if(Object.prototype.toString.call(r)==="[object Date]")return Pt.extent},getAggregationFn:()=>{var t,r;if(!e)throw new Error;return lt(e.columnDef.aggregationFn)?e.columnDef.aggregationFn:e.columnDef.aggregationFn==="auto"?e.getAutoAggregationFn():(t=(r=n.options.aggregationFns)==null?void 0:r[e.columnDef.aggregationFn])!=null?t:Pt[e.columnDef.aggregationFn]}}),createTable:e=>({setGrouping:n=>e.options.onGroupingChange==null?void 0:e.options.onGroupingChange(n),resetGrouping:n=>{var t,r;e.setGrouping(n?[]:(t=(r=e.initialState)==null?void 0:r.grouping)!=null?t:[])},getPreGroupedRowModel:()=>e.getFilteredRowModel(),getGroupedRowModel:()=>(!e._getGroupedRowModel&&e.options.getGroupedRowModel&&(e._getGroupedRowModel=e.options.getGroupedRowModel(e)),e.options.manualGrouping||!e._getGroupedRowModel?e.getPreGroupedRowModel():e._getGroupedRowModel())}),createRow:(e,n)=>({getIsGrouped:()=>!!e.groupingColumnId,getGroupingValue:t=>{if(e._groupingValuesCache.hasOwnProperty(t))return e._groupingValuesCache[t];let r=n.getColumn(t);return r!=null&&r.columnDef.getGroupingValue?(e._groupingValuesCache[t]=r.columnDef.getGroupingValue(e.original),e._groupingValuesCache[t]):e.getValue(t)},_groupingValuesCache:{}}),createCell:(e,n,t,r)=>({getIsGrouped:()=>n.getIsGrouped()&&n.id===t.groupingColumnId,getIsPlaceholder:()=>!e.getIsGrouped()&&n.getIsGrouped(),getIsAggregated:()=>{var o;return!e.getIsGrouped()&&!e.getIsPlaceholder()&&!!((o=t.subRows)!=null&&o.length)}})};function ki(e,n,t){if(!(n!=null&&n.length)||!t)return e;let r=e.filter(i=>!n.includes(i.id));return t==="remove"?r:[...n.map(i=>e.find(l=>l.id===i)).filter(Boolean),...r]}var Li={getInitialState:e=>({columnOrder:[],...e}),getDefaultOptions:e=>({onColumnOrderChange:J("columnOrder",e)}),createTable:e=>({setColumnOrder:n=>e.options.onColumnOrderChange==null?void 0:e.options.onColumnOrderChange(n),resetColumnOrder:n=>{var t;e.setColumnOrder(n?[]:(t=e.initialState.columnOrder)!=null?t:[])},_getOrderColumnsFn:w(()=>[e.getState().columnOrder,e.getState().grouping,e.options.groupedColumnMode],(n,t,r)=>o=>{let i=[];if(!(n!=null&&n.length))i=o;else{let l=[...n],u=[...o];for(;u.length&&l.length;){let s=l.shift(),d=u.findIndex(a=>a.id===s);d>-1&&i.push(u.splice(d,1)[0])}i=[...i,...u]}return ki(i,t,r)},{key:!1})})},zt=0,Gt=10,kt=()=>({pageIndex:zt,pageSize:Gt}),Hi={getInitialState:e=>({...e,pagination:{...kt(),...e?.pagination}}),getDefaultOptions:e=>({onPaginationChange:J("pagination",e)}),createTable:e=>{let n=!1,t=!1;return{_autoResetPageIndex:()=>{var r,o;if(!n){e._queue(()=>{n=!0});return}if((r=(o=e.options.autoResetAll)!=null?o:e.options.autoResetPageIndex)!=null?r:!e.options.manualPagination){if(t)return;t=!0,e._queue(()=>{e.resetPageIndex(),t=!1})}},setPagination:r=>{let o=i=>me(r,i);return e.options.onPaginationChange==null?void 0:e.options.onPaginationChange(o)},resetPagination:r=>{var o;e.setPagination(r?kt():(o=e.initialState.pagination)!=null?o:kt())},setPageIndex:r=>{e.setPagination(o=>{let i=me(r,o.pageIndex),l=typeof e.options.pageCount>"u"||e.options.pageCount===-1?Number.MAX_SAFE_INTEGER:e.options.pageCount-1;return i=Math.max(0,Math.min(i,l)),{...o,pageIndex:i}})},resetPageIndex:r=>{var o,i,l;e.setPageIndex(r?zt:(o=(i=e.initialState)==null||(l=i.pagination)==null?void 0:l.pageIndex)!=null?o:zt)},resetPageSize:r=>{var o,i,l;e.setPageSize(r?Gt:(o=(i=e.initialState)==null||(l=i.pagination)==null?void 0:l.pageSize)!=null?o:Gt)},setPageSize:r=>{e.setPagination(o=>{let i=Math.max(1,me(r,o.pageSize)),l=o.pageSize*o.pageIndex,u=Math.floor(l/i);return{...o,pageIndex:u,pageSize:i}})},setPageCount:r=>e.setPagination(o=>{var i;let l=me(r,(i=e.options.pageCount)!=null?i:-1);return typeof l=="number"&&(l=Math.max(-1,l)),{...o,pageCount:l}}),getPageOptions:w(()=>[e.getPageCount()],r=>{let o=[];return r&&r>0&&(o=[...new Array(r)].fill(null).map((i,l)=>l)),o},{key:!1,debug:()=>{var r;return(r=e.options.debugAll)!=null?r:e.options.debugTable}}),getCanPreviousPage:()=>e.getState().pagination.pageIndex>0,getCanNextPage:()=>{let{pageIndex:r}=e.getState().pagination,o=e.getPageCount();return o===-1?!0:o===0?!1:re.setPageIndex(r=>r-1),nextPage:()=>e.setPageIndex(r=>r+1),getPrePaginationRowModel:()=>e.getExpandedRowModel(),getPaginationRowModel:()=>(!e._getPaginationRowModel&&e.options.getPaginationRowModel&&(e._getPaginationRowModel=e.options.getPaginationRowModel(e)),e.options.manualPagination||!e._getPaginationRowModel?e.getPrePaginationRowModel():e._getPaginationRowModel()),getPageCount:()=>{var r;return(r=e.options.pageCount)!=null?r:Math.ceil(e.getPrePaginationRowModel().rows.length/e.getState().pagination.pageSize)}}}},Lt=()=>({left:[],right:[]}),zi={getInitialState:e=>({columnPinning:Lt(),...e}),getDefaultOptions:e=>({onColumnPinningChange:J("columnPinning",e)}),createColumn:(e,n)=>({pin:t=>{let r=e.getLeafColumns().map(o=>o.id).filter(Boolean);n.setColumnPinning(o=>{var i,l;if(t==="right"){var u,s;return{left:((u=o?.left)!=null?u:[]).filter(g=>!(r!=null&&r.includes(g))),right:[...((s=o?.right)!=null?s:[]).filter(g=>!(r!=null&&r.includes(g))),...r]}}if(t==="left"){var d,a;return{left:[...((d=o?.left)!=null?d:[]).filter(g=>!(r!=null&&r.includes(g))),...r],right:((a=o?.right)!=null?a:[]).filter(g=>!(r!=null&&r.includes(g)))}}return{left:((i=o?.left)!=null?i:[]).filter(g=>!(r!=null&&r.includes(g))),right:((l=o?.right)!=null?l:[]).filter(g=>!(r!=null&&r.includes(g)))}})},getCanPin:()=>e.getLeafColumns().some(r=>{var o,i;return((o=r.columnDef.enablePinning)!=null?o:!0)&&((i=n.options.enablePinning)!=null?i:!0)}),getIsPinned:()=>{let t=e.getLeafColumns().map(u=>u.id),{left:r,right:o}=n.getState().columnPinning,i=t.some(u=>r?.includes(u)),l=t.some(u=>o?.includes(u));return i?"left":l?"right":!1},getPinnedIndex:()=>{var t,r,o;let i=e.getIsPinned();return i?(t=(r=n.getState().columnPinning)==null||(o=r[i])==null?void 0:o.indexOf(e.id))!=null?t:-1:0}}),createRow:(e,n)=>({getCenterVisibleCells:w(()=>[e._getAllVisibleCells(),n.getState().columnPinning.left,n.getState().columnPinning.right],(t,r,o)=>{let i=[...r??[],...o??[]];return t.filter(l=>!i.includes(l.column.id))},{key:"row.getCenterVisibleCells",debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}}),getLeftVisibleCells:w(()=>[e._getAllVisibleCells(),n.getState().columnPinning.left,,],(t,r)=>(r??[]).map(i=>t.find(l=>l.column.id===i)).filter(Boolean).map(i=>({...i,position:"left"})),{key:"row.getLeftVisibleCells",debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}}),getRightVisibleCells:w(()=>[e._getAllVisibleCells(),n.getState().columnPinning.right],(t,r)=>(r??[]).map(i=>t.find(l=>l.column.id===i)).filter(Boolean).map(i=>({...i,position:"right"})),{key:"row.getRightVisibleCells",debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}})}),createTable:e=>({setColumnPinning:n=>e.options.onColumnPinningChange==null?void 0:e.options.onColumnPinningChange(n),resetColumnPinning:n=>{var t,r;return e.setColumnPinning(n?Lt():(t=(r=e.initialState)==null?void 0:r.columnPinning)!=null?t:Lt())},getIsSomeColumnsPinned:n=>{var t;let r=e.getState().columnPinning;if(!n){var o,i;return!!((o=r.left)!=null&&o.length||(i=r.right)!=null&&i.length)}return!!((t=r[n])!=null&&t.length)},getLeftLeafColumns:w(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left],(n,t)=>(t??[]).map(r=>n.find(o=>o.id===r)).filter(Boolean),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugColumns}}),getRightLeafColumns:w(()=>[e.getAllLeafColumns(),e.getState().columnPinning.right],(n,t)=>(t??[]).map(r=>n.find(o=>o.id===r)).filter(Boolean),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugColumns}}),getCenterLeafColumns:w(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(n,t,r)=>{let o=[...t??[],...r??[]];return n.filter(i=>!o.includes(i.id))},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugColumns}})})},Gi={getInitialState:e=>({rowSelection:{},...e}),getDefaultOptions:e=>({onRowSelectionChange:J("rowSelection",e),enableRowSelection:!0,enableMultiRowSelection:!0,enableSubRowSelection:!0}),createTable:e=>({setRowSelection:n=>e.options.onRowSelectionChange==null?void 0:e.options.onRowSelectionChange(n),resetRowSelection:n=>{var t;return e.setRowSelection(n?{}:(t=e.initialState.rowSelection)!=null?t:{})},toggleAllRowsSelected:n=>{e.setRowSelection(t=>{n=typeof n<"u"?n:!e.getIsAllRowsSelected();let r={...t},o=e.getPreGroupedRowModel().flatRows;return n?o.forEach(i=>{i.getCanSelect()&&(r[i.id]=!0)}):o.forEach(i=>{delete r[i.id]}),r})},toggleAllPageRowsSelected:n=>e.setRowSelection(t=>{let r=typeof n<"u"?n:!e.getIsAllPageRowsSelected(),o={...t};return e.getRowModel().rows.forEach(i=>{Bt(o,i.id,r,e)}),o}),getPreSelectedRowModel:()=>e.getCoreRowModel(),getSelectedRowModel:w(()=>[e.getState().rowSelection,e.getCoreRowModel()],(n,t)=>Object.keys(n).length?Ht(e,t):{rows:[],flatRows:[],rowsById:{}},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable}}),getFilteredSelectedRowModel:w(()=>[e.getState().rowSelection,e.getFilteredRowModel()],(n,t)=>Object.keys(n).length?Ht(e,t):{rows:[],flatRows:[],rowsById:{}},{key:"getFilteredSelectedRowModel",debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable}}),getGroupedSelectedRowModel:w(()=>[e.getState().rowSelection,e.getSortedRowModel()],(n,t)=>Object.keys(n).length?Ht(e,t):{rows:[],flatRows:[],rowsById:{}},{key:"getGroupedSelectedRowModel",debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable}}),getIsAllRowsSelected:()=>{let n=e.getFilteredRowModel().flatRows,{rowSelection:t}=e.getState(),r=!!(n.length&&Object.keys(t).length);return r&&n.some(o=>o.getCanSelect()&&!t[o.id])&&(r=!1),r},getIsAllPageRowsSelected:()=>{let n=e.getPaginationRowModel().flatRows.filter(o=>o.getCanSelect()),{rowSelection:t}=e.getState(),r=!!n.length;return r&&n.some(o=>!t[o.id])&&(r=!1),r},getIsSomeRowsSelected:()=>{var n;let t=Object.keys((n=e.getState().rowSelection)!=null?n:{}).length;return t>0&&t{let n=e.getPaginationRowModel().flatRows;return e.getIsAllPageRowsSelected()?!1:n.filter(t=>t.getCanSelect()).some(t=>t.getIsSelected()||t.getIsSomeSelected())},getToggleAllRowsSelectedHandler:()=>n=>{e.toggleAllRowsSelected(n.target.checked)},getToggleAllPageRowsSelectedHandler:()=>n=>{e.toggleAllPageRowsSelected(n.target.checked)}}),createRow:(e,n)=>({toggleSelected:t=>{let r=e.getIsSelected();n.setRowSelection(o=>{if(t=typeof t<"u"?t:!r,r===t)return o;let i={...o};return Bt(i,e.id,t,n),i})},getIsSelected:()=>{let{rowSelection:t}=n.getState();return Kt(e,t)},getIsSomeSelected:()=>{let{rowSelection:t}=n.getState();return hr(e,t)==="some"},getIsAllSubRowsSelected:()=>{let{rowSelection:t}=n.getState();return hr(e,t)==="all"},getCanSelect:()=>{var t;return typeof n.options.enableRowSelection=="function"?n.options.enableRowSelection(e):(t=n.options.enableRowSelection)!=null?t:!0},getCanSelectSubRows:()=>{var t;return typeof n.options.enableSubRowSelection=="function"?n.options.enableSubRowSelection(e):(t=n.options.enableSubRowSelection)!=null?t:!0},getCanMultiSelect:()=>{var t;return typeof n.options.enableMultiRowSelection=="function"?n.options.enableMultiRowSelection(e):(t=n.options.enableMultiRowSelection)!=null?t:!0},getToggleSelectedHandler:()=>{let t=e.getCanSelect();return r=>{var o;t&&e.toggleSelected((o=r.target)==null?void 0:o.checked)}}})},Bt=(e,n,t,r)=>{var o;let i=r.getRow(n);t?(i.getCanMultiSelect()||Object.keys(e).forEach(l=>delete e[l]),i.getCanSelect()&&(e[n]=!0)):delete e[n],(o=i.subRows)!=null&&o.length&&i.getCanSelectSubRows()&&i.subRows.forEach(l=>Bt(e,l.id,t,r))};function Ht(e,n){let t=e.getState().rowSelection,r=[],o={},i=function(l,u){return l.map(s=>{var d;let a=Kt(s,t);if(a&&(r.push(s),o[s.id]=s),(d=s.subRows)!=null&&d.length&&(s={...s,subRows:i(s.subRows)}),a)return s}).filter(Boolean)};return{rows:i(n.rows),flatRows:r,rowsById:o}}function Kt(e,n){var t;return(t=n[e.id])!=null?t:!1}function hr(e,n,t){if(e.subRows&&e.subRows.length){let r=!0,o=!1;return e.subRows.forEach(i=>{o&&!r||(Kt(i,n)?o=!0:r=!1)}),r?"all":o?"some":!1}return!1}var Ut=/([0-9]+)/gm,Bi=(e,n,t)=>xr(he(e.getValue(t)).toLowerCase(),he(n.getValue(t)).toLowerCase()),Ui=(e,n,t)=>xr(he(e.getValue(t)),he(n.getValue(t))),ji=(e,n,t)=>qt(he(e.getValue(t)).toLowerCase(),he(n.getValue(t)).toLowerCase()),Ki=(e,n,t)=>qt(he(e.getValue(t)),he(n.getValue(t))),qi=(e,n,t)=>{let r=e.getValue(t),o=n.getValue(t);return r>o?1:rqt(e.getValue(t),n.getValue(t));function qt(e,n){return e===n?0:e>n?1:-1}function he(e){return typeof e=="number"?isNaN(e)||e===1/0||e===-1/0?"":String(e):typeof e=="string"?e:""}function xr(e,n){let t=e.split(Ut).filter(Boolean),r=n.split(Ut).filter(Boolean);for(;t.length&&r.length;){let o=t.shift(),i=r.shift(),l=parseInt(o,10),u=parseInt(i,10),s=[l,u].sort();if(isNaN(s[0])){if(o>i)return 1;if(i>o)return-1;continue}if(isNaN(s[1]))return isNaN(l)?-1:1;if(l>u)return 1;if(u>l)return-1}return t.length-r.length}var Ge={alphanumeric:Bi,alphanumericCaseSensitive:Ui,text:ji,textCaseSensitive:Ki,datetime:qi,basic:Wi},Xi={getInitialState:e=>({sorting:[],...e}),getDefaultColumnDef:()=>({sortingFn:"auto",sortUndefined:1}),getDefaultOptions:e=>({onSortingChange:J("sorting",e),isMultiSortEvent:n=>n.shiftKey}),createColumn:(e,n)=>({getAutoSortingFn:()=>{let t=n.getFilteredRowModel().flatRows.slice(10),r=!1;for(let o of t){let i=o?.getValue(e.id);if(Object.prototype.toString.call(i)==="[object Date]")return Ge.datetime;if(typeof i=="string"&&(r=!0,i.split(Ut).length>1))return Ge.alphanumeric}return r?Ge.text:Ge.basic},getAutoSortDir:()=>{let t=n.getFilteredRowModel().flatRows[0];return typeof t?.getValue(e.id)=="string"?"asc":"desc"},getSortingFn:()=>{var t,r;if(!e)throw new Error;return lt(e.columnDef.sortingFn)?e.columnDef.sortingFn:e.columnDef.sortingFn==="auto"?e.getAutoSortingFn():(t=(r=n.options.sortingFns)==null?void 0:r[e.columnDef.sortingFn])!=null?t:Ge[e.columnDef.sortingFn]},toggleSorting:(t,r)=>{let o=e.getNextSortingOrder(),i=typeof t<"u"&&t!==null;n.setSorting(l=>{let u=l?.find(c=>c.id===e.id),s=l?.findIndex(c=>c.id===e.id),d=[],a,g=i?t:o==="desc";if(l!=null&&l.length&&e.getCanMultiSort()&&r?u?a="toggle":a="add":l!=null&&l.length&&s!==l.length-1?a="replace":u?a="toggle":a="replace",a==="toggle"&&(i||o||(a="remove")),a==="add"){var f;d=[...l,{id:e.id,desc:g}],d.splice(0,d.length-((f=n.options.maxMultiSortColCount)!=null?f:Number.MAX_SAFE_INTEGER))}else a==="toggle"?d=l.map(c=>c.id===e.id?{...c,desc:g}:c):a==="remove"?d=l.filter(c=>c.id!==e.id):d=[{id:e.id,desc:g}];return d})},getFirstSortDir:()=>{var t,r;return((t=(r=e.columnDef.sortDescFirst)!=null?r:n.options.sortDescFirst)!=null?t:e.getAutoSortDir()==="desc")?"desc":"asc"},getNextSortingOrder:t=>{var r,o;let i=e.getFirstSortDir(),l=e.getIsSorted();return l?l!==i&&((r=n.options.enableSortingRemoval)==null||r)&&(!(t&&(o=n.options.enableMultiRemove)!=null)||o)?!1:l==="desc"?"asc":"desc":i},getCanSort:()=>{var t,r;return((t=e.columnDef.enableSorting)!=null?t:!0)&&((r=n.options.enableSorting)!=null?r:!0)&&!!e.accessorFn},getCanMultiSort:()=>{var t,r;return(t=(r=e.columnDef.enableMultiSort)!=null?r:n.options.enableMultiSort)!=null?t:!!e.accessorFn},getIsSorted:()=>{var t;let r=(t=n.getState().sorting)==null?void 0:t.find(o=>o.id===e.id);return r?r.desc?"desc":"asc":!1},getSortIndex:()=>{var t,r;return(t=(r=n.getState().sorting)==null?void 0:r.findIndex(o=>o.id===e.id))!=null?t:-1},clearSorting:()=>{n.setSorting(t=>t!=null&&t.length?t.filter(r=>r.id!==e.id):[])},getToggleSortingHandler:()=>{let t=e.getCanSort();return r=>{t&&(r.persist==null||r.persist(),e.toggleSorting==null||e.toggleSorting(void 0,e.getCanMultiSort()?n.options.isMultiSortEvent==null?void 0:n.options.isMultiSortEvent(r):!1))}}}),createTable:e=>({setSorting:n=>e.options.onSortingChange==null?void 0:e.options.onSortingChange(n),resetSorting:n=>{var t,r;e.setSorting(n?[]:(t=(r=e.initialState)==null?void 0:r.sorting)!=null?t:[])},getPreSortedRowModel:()=>e.getGroupedRowModel(),getSortedRowModel:()=>(!e._getSortedRowModel&&e.options.getSortedRowModel&&(e._getSortedRowModel=e.options.getSortedRowModel(e)),e.options.manualSorting||!e._getSortedRowModel?e.getPreSortedRowModel():e._getSortedRowModel())})},Yi={getInitialState:e=>({columnVisibility:{},...e}),getDefaultOptions:e=>({onColumnVisibilityChange:J("columnVisibility",e)}),createColumn:(e,n)=>({toggleVisibility:t=>{e.getCanHide()&&n.setColumnVisibility(r=>({...r,[e.id]:t??!e.getIsVisible()}))},getIsVisible:()=>{var t,r;return(t=(r=n.getState().columnVisibility)==null?void 0:r[e.id])!=null?t:!0},getCanHide:()=>{var t,r;return((t=e.columnDef.enableHiding)!=null?t:!0)&&((r=n.options.enableHiding)!=null?r:!0)},getToggleVisibilityHandler:()=>t=>{e.toggleVisibility==null||e.toggleVisibility(t.target.checked)}}),createRow:(e,n)=>({_getAllVisibleCells:w(()=>[e.getAllCells(),n.getState().columnVisibility],t=>t.filter(r=>r.column.getIsVisible()),{key:"row._getAllVisibleCells",debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}}),getVisibleCells:w(()=>[e.getLeftVisibleCells(),e.getCenterVisibleCells(),e.getRightVisibleCells()],(t,r,o)=>[...t,...r,...o],{key:!1,debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}})}),createTable:e=>{let n=(t,r)=>w(()=>[r(),r().filter(o=>o.getIsVisible()).map(o=>o.id).join("_")],o=>o.filter(i=>i.getIsVisible==null?void 0:i.getIsVisible()),{key:t,debug:()=>{var o;return(o=e.options.debugAll)!=null?o:e.options.debugColumns}});return{getVisibleFlatColumns:n("getVisibleFlatColumns",()=>e.getAllFlatColumns()),getVisibleLeafColumns:n("getVisibleLeafColumns",()=>e.getAllLeafColumns()),getLeftVisibleLeafColumns:n("getLeftVisibleLeafColumns",()=>e.getLeftLeafColumns()),getRightVisibleLeafColumns:n("getRightVisibleLeafColumns",()=>e.getRightLeafColumns()),getCenterVisibleLeafColumns:n("getCenterVisibleLeafColumns",()=>e.getCenterLeafColumns()),setColumnVisibility:t=>e.options.onColumnVisibilityChange==null?void 0:e.options.onColumnVisibilityChange(t),resetColumnVisibility:t=>{var r;e.setColumnVisibility(t?{}:(r=e.initialState.columnVisibility)!=null?r:{})},toggleAllColumnsVisible:t=>{var r;t=(r=t)!=null?r:!e.getIsAllColumnsVisible(),e.setColumnVisibility(e.getAllLeafColumns().reduce((o,i)=>({...o,[i.id]:t||!(i.getCanHide!=null&&i.getCanHide())}),{}))},getIsAllColumnsVisible:()=>!e.getAllLeafColumns().some(t=>!(t.getIsVisible!=null&&t.getIsVisible())),getIsSomeColumnsVisible:()=>e.getAllLeafColumns().some(t=>t.getIsVisible==null?void 0:t.getIsVisible()),getToggleAllColumnsVisibilityHandler:()=>t=>{var r;e.toggleAllColumnsVisible((r=t.target)==null?void 0:r.checked)}}}},_r=[Ci,Yi,Li,zi,Mi,Xi,Pi,xi,Hi,Gi,Ei];function Mr(e){var n;(e.debugAll||e.debugTable)&&console.info("Creating Table Instance...");let t={_features:_r},r=t._features.reduce((a,g)=>Object.assign(a,g.getDefaultOptions==null?void 0:g.getDefaultOptions(t)),{}),o=a=>t.options.mergeOptions?t.options.mergeOptions(r,a):{...r,...a},l={...{},...(n=e.initialState)!=null?n:{}};t._features.forEach(a=>{var g;l=(g=a.getInitialState==null?void 0:a.getInitialState(l))!=null?g:l});let u=[],s=!1,d={_features:_r,options:{...r,...e},initialState:l,_queue:a=>{u.push(a),s||(s=!0,Promise.resolve().then(()=>{for(;u.length;)u.shift()();s=!1}).catch(g=>setTimeout(()=>{throw g})))},reset:()=>{t.setState(t.initialState)},setOptions:a=>{let g=me(a,t.options);t.options=o(g)},getState:()=>t.options.state,setState:a=>{t.options.onStateChange==null||t.options.onStateChange(a)},_getRowId:(a,g,f)=>{var c;return(c=t.options.getRowId==null?void 0:t.options.getRowId(a,g,f))!=null?c:`${f?[f.id,g].join("."):g}`},getCoreRowModel:()=>(t._getCoreRowModel||(t._getCoreRowModel=t.options.getCoreRowModel(t)),t._getCoreRowModel()),getRowModel:()=>t.getPaginationRowModel(),getRow:a=>{let g=t.getRowModel().rowsById[a];if(!g)throw new Error;return g},_getDefaultColumnDef:w(()=>[t.options.defaultColumn],a=>{var g;return a=(g=a)!=null?g:{},{header:f=>{let c=f.header.column.columnDef;return c.accessorKey?c.accessorKey:c.accessorFn?c.id:null},cell:f=>{var c,m;return(c=(m=f.renderValue())==null||m.toString==null?void 0:m.toString())!=null?c:null},...t._features.reduce((f,c)=>Object.assign(f,c.getDefaultColumnDef==null?void 0:c.getDefaultColumnDef()),{}),...a}},{debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns},key:!1}),_getColumnDefs:()=>t.options.columns,getAllColumns:w(()=>[t._getColumnDefs()],a=>{let g=function(f,c,m){return m===void 0&&(m=0),f.map(p=>{let h=wi(t,p,m,c),_=p;return h.columns=_.columns?g(_.columns,h,m+1):[],h})};return g(a)},{key:!1,debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns}}),getAllFlatColumns:w(()=>[t.getAllColumns()],a=>a.flatMap(g=>g.getFlatColumns()),{key:!1,debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns}}),_getAllFlatColumnsById:w(()=>[t.getAllFlatColumns()],a=>a.reduce((g,f)=>(g[f.id]=f,g),{}),{key:!1,debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns}}),getAllLeafColumns:w(()=>[t.getAllColumns(),t._getOrderColumnsFn()],(a,g)=>{let f=a.flatMap(c=>c.getLeafColumns());return g(f)},{key:!1,debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns}}),getColumn:a=>t._getAllFlatColumnsById()[a]};return Object.assign(t,d),t._features.forEach(a=>Object.assign(t,a.createTable==null?void 0:a.createTable(t))),t}function Ji(e,n,t,r){let o=()=>{var l;return(l=i.getValue())!=null?l:e.options.renderFallbackValue},i={id:`${n.id}_${t.id}`,row:n,column:t,getValue:()=>n.getValue(r),renderValue:o,getContext:w(()=>[e,t,n,i],(l,u,s,d)=>({table:l,column:u,row:s,cell:d,getValue:d.getValue,renderValue:d.renderValue}),{key:!1,debug:()=>e.options.debugAll})};return e._features.forEach(l=>{Object.assign(i,l.createCell==null?void 0:l.createCell(i,t,n,e))},{}),i}var Wt=(e,n,t,r,o,i,l)=>{let u={id:n,index:r,original:t,depth:o,parentId:l,_valuesCache:{},_uniqueValuesCache:{},getValue:s=>{if(u._valuesCache.hasOwnProperty(s))return u._valuesCache[s];let d=e.getColumn(s);if(d!=null&&d.accessorFn)return u._valuesCache[s]=d.accessorFn(u.original,r),u._valuesCache[s]},getUniqueValues:s=>{if(u._uniqueValuesCache.hasOwnProperty(s))return u._uniqueValuesCache[s];let d=e.getColumn(s);if(d!=null&&d.accessorFn)return d.columnDef.getUniqueValues?(u._uniqueValuesCache[s]=d.columnDef.getUniqueValues(u.original,r),u._uniqueValuesCache[s]):(u._uniqueValuesCache[s]=[u.getValue(s)],u._uniqueValuesCache[s])},renderValue:s=>{var d;return(d=u.getValue(s))!=null?d:e.options.renderFallbackValue},subRows:i??[],getLeafRows:()=>bi(u.subRows,s=>s.subRows),getParentRow:()=>u.parentId?e.getRow(u.parentId):void 0,getParentRows:()=>{let s=[],d=u;for(;;){let a=d.getParentRow();if(!a)break;s.push(a),d=a}return s.reverse()},getAllCells:w(()=>[e.getAllLeafColumns()],s=>s.map(d=>Ji(e,u,d,d.id)),{key:!1,debug:()=>{var s;return(s=e.options.debugAll)!=null?s:e.options.debugRows}}),_getAllCellsByColumnId:w(()=>[u.getAllCells()],s=>s.reduce((d,a)=>(d[a.column.id]=a,d),{}),{key:"row.getAllCellsByColumnId",debug:()=>{var s;return(s=e.options.debugAll)!=null?s:e.options.debugRows}})};for(let s=0;sw(()=>[e.options.data],n=>{let t={rows:[],flatRows:[],rowsById:{}},r=function(o,i,l){i===void 0&&(i=0);let u=[];for(let d=0;d{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable},onChange:()=>{e._autoResetPageIndex()}})}function Ir(e,n,t){return t.options.filterFromLeafRows?Qi(e,n,t):Zi(e,n,t)}function Qi(e,n,t){var r;let o=[],i={},l=(r=t.options.maxLeafRowFilterDepth)!=null?r:100,u=function(s,d){d===void 0&&(d=0);let a=[];for(let f=0;fw(()=>[e.getPreFilteredRowModel(),e.getState().columnFilters,e.getState().globalFilter],(n,t,r)=>{if(!n.rows.length||!(t!=null&&t.length)&&!r){for(let f=0;f{var c;let m=e.getColumn(f.id);if(!m)return;let p=m.getFilterFn();p&&o.push({id:f.id,filterFn:p,resolvedValue:(c=p.resolveFilterValue==null?void 0:p.resolveFilterValue(f.value))!=null?c:f.value})});let l=t.map(f=>f.id),u=e.getGlobalFilterFn(),s=e.getAllLeafColumns().filter(f=>f.getCanGlobalFilter());r&&u&&s.length&&(l.push("__global__"),s.forEach(f=>{var c;i.push({id:f.id,filterFn:u,resolvedValue:(c=u.resolveFilterValue==null?void 0:u.resolveFilterValue(r))!=null?c:r})}));let d,a;for(let f=0;f{c.columnFiltersMeta[p]=h})}if(i.length){for(let m=0;m{c.columnFiltersMeta[p]=h})){c.columnFilters.__global__=!0;break}}c.columnFilters.__global__!==!0&&(c.columnFilters.__global__=!1)}}let g=f=>{for(let c=0;c{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable},onChange:()=>{e._autoResetPageIndex()}})}function Vr(){return(e,n)=>w(()=>[e.getPreFilteredRowModel(),e.getState().columnFilters,e.getState().globalFilter,e.getFilteredRowModel()],(t,r,o)=>{if(!t.rows.length||!(r!=null&&r.length)&&!o)return t;let i=[...r.map(u=>u.id).filter(u=>u!==n),o?"__global__":void 0].filter(Boolean),l=u=>{for(let s=0;s{var t;return(t=e.options.debugAll)!=null?t:e.options.debugTable},onChange:()=>{}})}function Tr(){return(e,n)=>w(()=>{var t;return[(t=e.getColumn(n))==null?void 0:t.getFacetedRowModel()]},t=>{if(!t)return new Map;let r=new Map;for(let i=0;i{var t;return(t=e.options.debugAll)!=null?t:e.options.debugTable},onChange:()=>{}})}function Dr(){return(e,n)=>w(()=>{var t;return[(t=e.getColumn(n))==null?void 0:t.getFacetedRowModel()]},t=>{var r;if(!t)return;let o=(r=t.flatRows[0])==null?void 0:r.getUniqueValues(n);if(typeof o>"u")return;let i=[o,o];for(let l=0;li[1]&&(i[1]=d)}}return i},{key:!1,debug:()=>{var t;return(t=e.options.debugAll)!=null?t:e.options.debugTable},onChange:()=>{}})}function Or(){return e=>w(()=>[e.getState().sorting,e.getPreSortedRowModel()],(n,t)=>{if(!t.rows.length||!(n!=null&&n.length))return t;let r=e.getState().sorting,o=[],i=r.filter(s=>{var d;return(d=e.getColumn(s.id))==null?void 0:d.getCanSort()}),l={};i.forEach(s=>{let d=e.getColumn(s.id);d&&(l[s.id]={sortUndefined:d.columnDef.sortUndefined,invertSorting:d.columnDef.invertSorting,sortingFn:d.getSortingFn()})});let u=s=>{let d=[...s];return d.sort((a,g)=>{for(let c=0;c{var g;o.push(a),(g=a.subRows)!=null&&g.length&&(a.subRows=u(a.subRows))}),d};return{rows:u(t.rows),flatRows:o,rowsById:t.rowsById}},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable},onChange:()=>{e._autoResetPageIndex()}})}function st(e,n){return e?el(e)?j(e,n):e:null}function el(e){return tl(e)||typeof e=="function"||nl(e)}function tl(e){return typeof e=="function"&&(()=>{let n=Object.getPrototypeOf(e);return n.prototype&&n.prototype.isReactComponent})()}function nl(e){return typeof e=="object"&&typeof e.$$typeof=="symbol"&&["react.memo","react.forward_ref"].includes(e.$$typeof.description)}function Nr(e){let n={state:{},onStateChange:()=>{},renderFallbackValue:null,...e},[t]=P(()=>({current:Mr(n)})),[r,o]=P(()=>t.current.initialState);return t.current.setOptions(i=>({...i,...e,state:{...r,...e.state},onStateChange:l=>{o(l),e.onStateChange==null||e.onStateChange(l)}})),t.current}function Be(){return Be=Object.assign?Object.assign.bind():function(e){for(var n=1;n{let c=f;for(let m of s.split(".")){var p;c=(p=c)==null?void 0:p[m]}return c}:a=f=>f[u.accessorKey]),!d)throw new Error;let g={id:`${String(d)}`,accessorFn:a,parent:r,depth:t,columnDef:u,columns:[],getFlatColumns:C(()=>[!0],()=>{var f;return[g,...(f=g.columns)==null?void 0:f.flatMap(c=>c.getFlatColumns())]},{key:"column.getFlatColumns",debug:()=>{var f;return(f=e.options.debugAll)!=null?f:e.options.debugColumns}}),getLeafColumns:C(()=>[e._getOrderColumnsFn()],f=>{var c;if((c=g.columns)!=null&&c.length){let p=g.columns.flatMap(m=>m.getLeafColumns());return f(p)}return[g]},{key:"column.getLeafColumns",debug:()=>{var f;return(f=e.options.debugAll)!=null?f:e.options.debugColumns}})};return g=e._features.reduce((f,c)=>Object.assign(f,c.createColumn==null?void 0:c.createColumn(g,e)),g),g}function mr(e,n,t){var r;let i={id:(r=t.id)!=null?r:n.id,column:n,index:t.index,isPlaceholder:!!t.isPlaceholder,placeholderId:t.placeholderId,depth:t.depth,subHeaders:[],colSpan:0,rowSpan:0,headerGroup:null,getLeafHeaders:()=>{let l=[],u=s=>{s.subHeaders&&s.subHeaders.length&&s.subHeaders.map(u),l.push(s)};return u(i),l},getContext:()=>({table:e,header:i,column:n})};return e._features.forEach(l=>{Object.assign(i,l.createHeader==null?void 0:l.createHeader(i,e))}),i}var Ri={createTable:e=>({getHeaderGroups:C(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(n,t,r,o)=>{var i,l;let u=(i=r?.map(g=>t.find(f=>f.id===g)).filter(Boolean))!=null?i:[],s=(l=o?.map(g=>t.find(f=>f.id===g)).filter(Boolean))!=null?l:[],d=t.filter(g=>!(r!=null&&r.includes(g.id))&&!(o!=null&&o.includes(g.id)));return ot(n,[...u,...d,...s],e)},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getCenterHeaderGroups:C(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(n,t,r,o)=>(t=t.filter(i=>!(r!=null&&r.includes(i.id))&&!(o!=null&&o.includes(i.id))),ot(n,t,e,"center")),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeftHeaderGroups:C(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.left],(n,t,r)=>{var o;let i=(o=r?.map(l=>t.find(u=>u.id===l)).filter(Boolean))!=null?o:[];return ot(n,i,e,"left")},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getRightHeaderGroups:C(()=>[e.getAllColumns(),e.getVisibleLeafColumns(),e.getState().columnPinning.right],(n,t,r)=>{var o;let i=(o=r?.map(l=>t.find(u=>u.id===l)).filter(Boolean))!=null?o:[];return ot(n,i,e,"right")},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getFooterGroups:C(()=>[e.getHeaderGroups()],n=>[...n].reverse(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeftFooterGroups:C(()=>[e.getLeftHeaderGroups()],n=>[...n].reverse(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getCenterFooterGroups:C(()=>[e.getCenterHeaderGroups()],n=>[...n].reverse(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getRightFooterGroups:C(()=>[e.getRightHeaderGroups()],n=>[...n].reverse(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getFlatHeaders:C(()=>[e.getHeaderGroups()],n=>n.map(t=>t.headers).flat(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeftFlatHeaders:C(()=>[e.getLeftHeaderGroups()],n=>n.map(t=>t.headers).flat(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getCenterFlatHeaders:C(()=>[e.getCenterHeaderGroups()],n=>n.map(t=>t.headers).flat(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getRightFlatHeaders:C(()=>[e.getRightHeaderGroups()],n=>n.map(t=>t.headers).flat(),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getCenterLeafHeaders:C(()=>[e.getCenterFlatHeaders()],n=>n.filter(t=>{var r;return!((r=t.subHeaders)!=null&&r.length)}),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeftLeafHeaders:C(()=>[e.getLeftFlatHeaders()],n=>n.filter(t=>{var r;return!((r=t.subHeaders)!=null&&r.length)}),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getRightLeafHeaders:C(()=>[e.getRightFlatHeaders()],n=>n.filter(t=>{var r;return!((r=t.subHeaders)!=null&&r.length)}),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}}),getLeafHeaders:C(()=>[e.getLeftHeaderGroups(),e.getCenterHeaderGroups(),e.getRightHeaderGroups()],(n,t,r)=>{var o,i,l,u,s,d;return[...(o=(i=n[0])==null?void 0:i.headers)!=null?o:[],...(l=(u=t[0])==null?void 0:u.headers)!=null?l:[],...(s=(d=r[0])==null?void 0:d.headers)!=null?s:[]].map(a=>a.getLeafHeaders()).flat()},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugHeaders}})})};function ot(e,n,t,r){var o,i;let l=0,u=function(f,c){c===void 0&&(c=1),l=Math.max(l,c),f.filter(p=>p.getIsVisible()).forEach(p=>{var m;(m=p.columns)!=null&&m.length&&u(p.columns,c+1)},0)};u(e);let s=[],d=(f,c)=>{let p={depth:c,id:[r,`${c}`].filter(Boolean).join("_"),headers:[]},m=[];f.forEach(h=>{let _=[...m].reverse()[0],E=h.column.depth===p.depth,M,O=!1;if(E&&h.column.parent?M=h.column.parent:(M=h.column,O=!0),_&&_?.column===M)_.subHeaders.push(h);else{let D=mr(t,M,{id:[r,c,M.id,h?.id].filter(Boolean).join("_"),isPlaceholder:O,placeholderId:O?`${m.filter(L=>L.column===M).length}`:void 0,depth:c,index:m.length});D.subHeaders.push(h),m.push(D)}p.headers.push(h),h.headerGroup=p}),s.push(p),c>0&&d(m,c-1)},a=n.map((f,c)=>mr(t,f,{depth:l,index:c}));d(a,l-1),s.reverse();let g=f=>f.filter(p=>p.column.getIsVisible()).map(p=>{let m=0,h=0,_=[0];p.subHeaders&&p.subHeaders.length?(_=[],g(p.subHeaders).forEach(M=>{let{colSpan:O,rowSpan:D}=M;m+=O,_.push(D)})):m=1;let E=Math.min(..._);return h=h+E,p.colSpan=m,p.rowSpan=h,{colSpan:m,rowSpan:h}});return g((o=(i=s[0])==null?void 0:i.headers)!=null?o:[]),s}var it={size:150,minSize:20,maxSize:Number.MAX_SAFE_INTEGER},At=()=>({startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,isResizingColumn:!1,columnSizingStart:[]}),xi={getDefaultColumnDef:()=>it,getInitialState:e=>({columnSizing:{},columnSizingInfo:At(),...e}),getDefaultOptions:e=>({columnResizeMode:"onEnd",onColumnSizingChange:Q("columnSizing",e),onColumnSizingInfoChange:Q("columnSizingInfo",e)}),createColumn:(e,n)=>({getSize:()=>{var t,r,o;let i=n.getState().columnSizing[e.id];return Math.min(Math.max((t=e.columnDef.minSize)!=null?t:it.minSize,(r=i??e.columnDef.size)!=null?r:it.size),(o=e.columnDef.maxSize)!=null?o:it.maxSize)},getStart:t=>{let r=t?t==="left"?n.getLeftVisibleLeafColumns():n.getRightVisibleLeafColumns():n.getVisibleLeafColumns(),o=r.findIndex(i=>i.id===e.id);if(o>0){let i=r[o-1];return i.getStart(t)+i.getSize()}return 0},resetSize:()=>{n.setColumnSizing(t=>{let{[e.id]:r,...o}=t;return o})},getCanResize:()=>{var t,r;return((t=e.columnDef.enableResizing)!=null?t:!0)&&((r=n.options.enableColumnResizing)!=null?r:!0)},getIsResizing:()=>n.getState().columnSizingInfo.isResizingColumn===e.id}),createHeader:(e,n)=>({getSize:()=>{let t=0,r=o=>{if(o.subHeaders.length)o.subHeaders.forEach(r);else{var i;t+=(i=o.column.getSize())!=null?i:0}};return r(e),t},getStart:()=>{if(e.index>0){let t=e.headerGroup.headers[e.index-1];return t.getStart()+t.getSize()}return 0},getResizeHandler:()=>{let t=n.getColumn(e.column.id),r=t?.getCanResize();return o=>{if(!t||!r||(o.persist==null||o.persist(),Pt(o)&&o.touches&&o.touches.length>1))return;let i=e.getSize(),l=e?e.getLeafHeaders().map(m=>[m.column.id,m.column.getSize()]):[[t.id,t.getSize()]],u=Pt(o)?Math.round(o.touches[0].clientX):o.clientX,s={},d=(m,h)=>{typeof h=="number"&&(n.setColumnSizingInfo(_=>{var E,M;let O=h-((E=_?.startOffset)!=null?E:0),D=Math.max(O/((M=_?.startSize)!=null?M:0),-.999999);return _.columnSizingStart.forEach(L=>{let[G,V]=L;s[G]=Math.round(Math.max(V+V*D,0)*100)/100}),{..._,deltaOffset:O,deltaPercentage:D}}),(n.options.columnResizeMode==="onChange"||m==="end")&&n.setColumnSizing(_=>({..._,...s})))},a=m=>d("move",m),g=m=>{d("end",m),n.setColumnSizingInfo(h=>({...h,isResizingColumn:!1,startOffset:null,startSize:null,deltaOffset:null,deltaPercentage:null,columnSizingStart:[]}))},f={moveHandler:m=>a(m.clientX),upHandler:m=>{document.removeEventListener("mousemove",f.moveHandler),document.removeEventListener("mouseup",f.upHandler),g(m.clientX)}},c={moveHandler:m=>(m.cancelable&&(m.preventDefault(),m.stopPropagation()),a(m.touches[0].clientX),!1),upHandler:m=>{var h;document.removeEventListener("touchmove",c.moveHandler),document.removeEventListener("touchend",c.upHandler),m.cancelable&&(m.preventDefault(),m.stopPropagation()),g((h=m.touches[0])==null?void 0:h.clientX)}},p=Mi()?{passive:!1}:!1;Pt(o)?(document.addEventListener("touchmove",c.moveHandler,p),document.addEventListener("touchend",c.upHandler,p)):(document.addEventListener("mousemove",f.moveHandler,p),document.addEventListener("mouseup",f.upHandler,p)),n.setColumnSizingInfo(m=>({...m,startOffset:u,startSize:i,deltaOffset:0,deltaPercentage:0,columnSizingStart:l,isResizingColumn:t.id}))}}}),createTable:e=>({setColumnSizing:n=>e.options.onColumnSizingChange==null?void 0:e.options.onColumnSizingChange(n),setColumnSizingInfo:n=>e.options.onColumnSizingInfoChange==null?void 0:e.options.onColumnSizingInfoChange(n),resetColumnSizing:n=>{var t;e.setColumnSizing(n?{}:(t=e.initialState.columnSizing)!=null?t:{})},resetHeaderSizeInfo:n=>{var t;e.setColumnSizingInfo(n?At():(t=e.initialState.columnSizingInfo)!=null?t:At())},getTotalSize:()=>{var n,t;return(n=(t=e.getHeaderGroups()[0])==null?void 0:t.headers.reduce((r,o)=>r+o.getSize(),0))!=null?n:0},getLeftTotalSize:()=>{var n,t;return(n=(t=e.getLeftHeaderGroups()[0])==null?void 0:t.headers.reduce((r,o)=>r+o.getSize(),0))!=null?n:0},getCenterTotalSize:()=>{var n,t;return(n=(t=e.getCenterHeaderGroups()[0])==null?void 0:t.headers.reduce((r,o)=>r+o.getSize(),0))!=null?n:0},getRightTotalSize:()=>{var n,t;return(n=(t=e.getRightHeaderGroups()[0])==null?void 0:t.headers.reduce((r,o)=>r+o.getSize(),0))!=null?n:0}})},lt=null;function Mi(){if(typeof lt=="boolean")return lt;let e=!1;try{let n={get passive(){return e=!0,!1}},t=()=>{};window.addEventListener("test",t,n),window.removeEventListener("test",t)}catch{e=!1}return lt=e,lt}function Pt(e){return e.type==="touchstart"}var Fi={getInitialState:e=>({expanded:{},...e}),getDefaultOptions:e=>({onExpandedChange:Q("expanded",e),paginateExpandedRows:!0}),createTable:e=>{let n=!1,t=!1;return{_autoResetExpanded:()=>{var r,o;if(!n){e._queue(()=>{n=!0});return}if((r=(o=e.options.autoResetAll)!=null?o:e.options.autoResetExpanded)!=null?r:!e.options.manualExpanding){if(t)return;t=!0,e._queue(()=>{e.resetExpanded(),t=!1})}},setExpanded:r=>e.options.onExpandedChange==null?void 0:e.options.onExpandedChange(r),toggleAllRowsExpanded:r=>{r??!e.getIsAllRowsExpanded()?e.setExpanded(!0):e.setExpanded({})},resetExpanded:r=>{var o,i;e.setExpanded(r?{}:(o=(i=e.initialState)==null?void 0:i.expanded)!=null?o:{})},getCanSomeRowsExpand:()=>e.getPrePaginationRowModel().flatRows.some(r=>r.getCanExpand()),getToggleAllRowsExpandedHandler:()=>r=>{r.persist==null||r.persist(),e.toggleAllRowsExpanded()},getIsSomeRowsExpanded:()=>{let r=e.getState().expanded;return r===!0||Object.values(r).some(Boolean)},getIsAllRowsExpanded:()=>{let r=e.getState().expanded;return typeof r=="boolean"?r===!0:!(!Object.keys(r).length||e.getRowModel().flatRows.some(o=>!o.getIsExpanded()))},getExpandedDepth:()=>{let r=0;return(e.getState().expanded===!0?Object.keys(e.getRowModel().rowsById):Object.keys(e.getState().expanded)).forEach(i=>{let l=i.split(".");r=Math.max(r,l.length)}),r},getPreExpandedRowModel:()=>e.getSortedRowModel(),getExpandedRowModel:()=>(!e._getExpandedRowModel&&e.options.getExpandedRowModel&&(e._getExpandedRowModel=e.options.getExpandedRowModel(e)),e.options.manualExpanding||!e._getExpandedRowModel?e.getPreExpandedRowModel():e._getExpandedRowModel())}},createRow:(e,n)=>({toggleExpanded:t=>{n.setExpanded(r=>{var o;let i=r===!0?!0:!!(r!=null&&r[e.id]),l={};if(r===!0?Object.keys(n.getRowModel().rowsById).forEach(u=>{l[u]=!0}):l=r,t=(o=t)!=null?o:!i,!i&&t)return{...l,[e.id]:!0};if(i&&!t){let{[e.id]:u,...s}=l;return s}return r})},getIsExpanded:()=>{var t;let r=n.getState().expanded;return!!((t=n.options.getIsRowExpanded==null?void 0:n.options.getIsRowExpanded(e))!=null?t:r===!0||r?.[e.id])},getCanExpand:()=>{var t,r,o;return(t=n.options.getRowCanExpand==null?void 0:n.options.getRowCanExpand(e))!=null?t:((r=n.options.enableExpanding)!=null?r:!0)&&!!((o=e.subRows)!=null&&o.length)},getToggleExpandedHandler:()=>{let t=e.getCanExpand();return()=>{t&&e.toggleExpanded()}}})},vr=(e,n,t)=>{var r,o,i;let l=t.toLowerCase();return!!(!((r=e.getValue(n))==null||(o=r.toString())==null||(i=o.toLowerCase())==null)&&i.includes(l))};vr.autoRemove=e=>re(e);var Sr=(e,n,t)=>{var r,o;return!!(!((r=e.getValue(n))==null||(o=r.toString())==null)&&o.includes(t))};Sr.autoRemove=e=>re(e);var br=(e,n,t)=>{var r,o;return((r=e.getValue(n))==null||(o=r.toString())==null?void 0:o.toLowerCase())===t?.toLowerCase()};br.autoRemove=e=>re(e);var Cr=(e,n,t)=>{var r;return(r=e.getValue(n))==null?void 0:r.includes(t)};Cr.autoRemove=e=>re(e)||!(e!=null&&e.length);var wr=(e,n,t)=>!t.some(r=>{var o;return!((o=e.getValue(n))!=null&&o.includes(r))});wr.autoRemove=e=>re(e)||!(e!=null&&e.length);var Er=(e,n,t)=>t.some(r=>{var o;return(o=e.getValue(n))==null?void 0:o.includes(r)});Er.autoRemove=e=>re(e)||!(e!=null&&e.length);var Rr=(e,n,t)=>e.getValue(n)===t;Rr.autoRemove=e=>re(e);var xr=(e,n,t)=>e.getValue(n)==t;xr.autoRemove=e=>re(e);var Kt=(e,n,t)=>{let[r,o]=t,i=e.getValue(n);return i>=r&&i<=o};Kt.resolveFilterValue=e=>{let[n,t]=e,r=typeof n!="number"?parseFloat(n):n,o=typeof t!="number"?parseFloat(t):t,i=n===null||Number.isNaN(r)?-1/0:r,l=t===null||Number.isNaN(o)?1/0:o;if(i>l){let u=i;i=l,l=u}return[i,l]};Kt.autoRemove=e=>re(e)||re(e[0])&&re(e[1]);var ue={includesString:vr,includesStringSensitive:Sr,equalsString:br,arrIncludes:Cr,arrIncludesAll:wr,arrIncludesSome:Er,equals:Rr,weakEquals:xr,inNumberRange:Kt};function re(e){return e==null||e===""}var Ii={getDefaultColumnDef:()=>({filterFn:"auto"}),getInitialState:e=>({columnFilters:[],globalFilter:void 0,...e}),getDefaultOptions:e=>({onColumnFiltersChange:Q("columnFilters",e),onGlobalFilterChange:Q("globalFilter",e),filterFromLeafRows:!1,maxLeafRowFilterDepth:100,globalFilterFn:"auto",getColumnCanGlobalFilter:n=>{var t,r;let o=(t=e.getCoreRowModel().flatRows[0])==null||(r=t._getAllCellsByColumnId()[n.id])==null?void 0:r.getValue();return typeof o=="string"||typeof o=="number"}}),createColumn:(e,n)=>({getAutoFilterFn:()=>{let t=n.getCoreRowModel().flatRows[0],r=t?.getValue(e.id);return typeof r=="string"?ue.includesString:typeof r=="number"?ue.inNumberRange:typeof r=="boolean"||r!==null&&typeof r=="object"?ue.equals:Array.isArray(r)?ue.arrIncludes:ue.weakEquals},getFilterFn:()=>{var t,r;return st(e.columnDef.filterFn)?e.columnDef.filterFn:e.columnDef.filterFn==="auto"?e.getAutoFilterFn():(t=(r=n.options.filterFns)==null?void 0:r[e.columnDef.filterFn])!=null?t:ue[e.columnDef.filterFn]},getCanFilter:()=>{var t,r,o;return((t=e.columnDef.enableColumnFilter)!=null?t:!0)&&((r=n.options.enableColumnFilters)!=null?r:!0)&&((o=n.options.enableFilters)!=null?o:!0)&&!!e.accessorFn},getCanGlobalFilter:()=>{var t,r,o,i;return((t=e.columnDef.enableGlobalFilter)!=null?t:!0)&&((r=n.options.enableGlobalFilter)!=null?r:!0)&&((o=n.options.enableFilters)!=null?o:!0)&&((i=n.options.getColumnCanGlobalFilter==null?void 0:n.options.getColumnCanGlobalFilter(e))!=null?i:!0)&&!!e.accessorFn},getIsFiltered:()=>e.getFilterIndex()>-1,getFilterValue:()=>{var t,r;return(t=n.getState().columnFilters)==null||(r=t.find(o=>o.id===e.id))==null?void 0:r.value},getFilterIndex:()=>{var t,r;return(t=(r=n.getState().columnFilters)==null?void 0:r.findIndex(o=>o.id===e.id))!=null?t:-1},setFilterValue:t=>{n.setColumnFilters(r=>{let o=e.getFilterFn(),i=r?.find(a=>a.id===e.id),l=me(t,i?i.value:void 0);if(hr(o,l,e)){var u;return(u=r?.filter(a=>a.id!==e.id))!=null?u:[]}let s={id:e.id,value:l};if(i){var d;return(d=r?.map(a=>a.id===e.id?s:a))!=null?d:[]}return r!=null&&r.length?[...r,s]:[s]})},_getFacetedRowModel:n.options.getFacetedRowModel&&n.options.getFacetedRowModel(n,e.id),getFacetedRowModel:()=>e._getFacetedRowModel?e._getFacetedRowModel():n.getPreFilteredRowModel(),_getFacetedUniqueValues:n.options.getFacetedUniqueValues&&n.options.getFacetedUniqueValues(n,e.id),getFacetedUniqueValues:()=>e._getFacetedUniqueValues?e._getFacetedUniqueValues():new Map,_getFacetedMinMaxValues:n.options.getFacetedMinMaxValues&&n.options.getFacetedMinMaxValues(n,e.id),getFacetedMinMaxValues:()=>{if(e._getFacetedMinMaxValues)return e._getFacetedMinMaxValues()}}),createRow:(e,n)=>({columnFilters:{},columnFiltersMeta:{}}),createTable:e=>({getGlobalAutoFilterFn:()=>ue.includesString,getGlobalFilterFn:()=>{var n,t;let{globalFilterFn:r}=e.options;return st(r)?r:r==="auto"?e.getGlobalAutoFilterFn():(n=(t=e.options.filterFns)==null?void 0:t[r])!=null?n:ue[r]},setColumnFilters:n=>{let t=e.getAllLeafColumns(),r=o=>{var i;return(i=me(n,o))==null?void 0:i.filter(l=>{let u=t.find(s=>s.id===l.id);if(u){let s=u.getFilterFn();if(hr(s,l.value,u))return!1}return!0})};e.options.onColumnFiltersChange==null||e.options.onColumnFiltersChange(r)},setGlobalFilter:n=>{e.options.onGlobalFilterChange==null||e.options.onGlobalFilterChange(n)},resetGlobalFilter:n=>{e.setGlobalFilter(n?void 0:e.initialState.globalFilter)},resetColumnFilters:n=>{var t,r;e.setColumnFilters(n?[]:(t=(r=e.initialState)==null?void 0:r.columnFilters)!=null?t:[])},getPreFilteredRowModel:()=>e.getCoreRowModel(),getFilteredRowModel:()=>(!e._getFilteredRowModel&&e.options.getFilteredRowModel&&(e._getFilteredRowModel=e.options.getFilteredRowModel(e)),e.options.manualFiltering||!e._getFilteredRowModel?e.getPreFilteredRowModel():e._getFilteredRowModel()),_getGlobalFacetedRowModel:e.options.getFacetedRowModel&&e.options.getFacetedRowModel(e,"__global__"),getGlobalFacetedRowModel:()=>e.options.manualFiltering||!e._getGlobalFacetedRowModel?e.getPreFilteredRowModel():e._getGlobalFacetedRowModel(),_getGlobalFacetedUniqueValues:e.options.getFacetedUniqueValues&&e.options.getFacetedUniqueValues(e,"__global__"),getGlobalFacetedUniqueValues:()=>e._getGlobalFacetedUniqueValues?e._getGlobalFacetedUniqueValues():new Map,_getGlobalFacetedMinMaxValues:e.options.getFacetedMinMaxValues&&e.options.getFacetedMinMaxValues(e,"__global__"),getGlobalFacetedMinMaxValues:()=>{if(e._getGlobalFacetedMinMaxValues)return e._getGlobalFacetedMinMaxValues()}})};function hr(e,n,t){return(e&&e.autoRemove?e.autoRemove(n,t):!1)||typeof n>"u"||typeof n=="string"&&!n}var $i=(e,n,t)=>t.reduce((r,o)=>{let i=o.getValue(e);return r+(typeof i=="number"?i:0)},0),Vi=(e,n,t)=>{let r;return t.forEach(o=>{let i=o.getValue(e);i!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}),r},Ti=(e,n,t)=>{let r;return t.forEach(o=>{let i=o.getValue(e);i!=null&&(r=i)&&(r=i)}),r},Di=(e,n,t)=>{let r,o;return t.forEach(i=>{let l=i.getValue(e);l!=null&&(r===void 0?l>=l&&(r=o=l):(r>l&&(r=l),o{let t=0,r=0;if(n.forEach(o=>{let i=o.getValue(e);i!=null&&(i=+i)>=i&&(++t,r+=i)}),t)return r/t},Ni=(e,n)=>{if(!n.length)return;let t=n.map(i=>i.getValue(e));if(!Ci(t))return;if(t.length===1)return t[0];let r=Math.floor(t.length/2),o=t.sort((i,l)=>i-l);return t.length%2!==0?o[r]:(o[r-1]+o[r])/2},Ai=(e,n)=>Array.from(new Set(n.map(t=>t.getValue(e))).values()),Pi=(e,n)=>new Set(n.map(t=>t.getValue(e))).size,ki=(e,n)=>n.length,kt={sum:$i,min:Vi,max:Ti,extent:Di,mean:Oi,median:Ni,unique:Ai,uniqueCount:Pi,count:ki},Li={getDefaultColumnDef:()=>({aggregatedCell:e=>{var n,t;return(n=(t=e.getValue())==null||t.toString==null?void 0:t.toString())!=null?n:null},aggregationFn:"auto"}),getInitialState:e=>({grouping:[],...e}),getDefaultOptions:e=>({onGroupingChange:Q("grouping",e),groupedColumnMode:"reorder"}),createColumn:(e,n)=>({toggleGrouping:()=>{n.setGrouping(t=>t!=null&&t.includes(e.id)?t.filter(r=>r!==e.id):[...t??[],e.id])},getCanGroup:()=>{var t,r,o,i;return(t=(r=(o=(i=e.columnDef.enableGrouping)!=null?i:!0)!=null?o:n.options.enableGrouping)!=null?r:!0)!=null?t:!!e.accessorFn},getIsGrouped:()=>{var t;return(t=n.getState().grouping)==null?void 0:t.includes(e.id)},getGroupedIndex:()=>{var t;return(t=n.getState().grouping)==null?void 0:t.indexOf(e.id)},getToggleGroupingHandler:()=>{let t=e.getCanGroup();return()=>{t&&e.toggleGrouping()}},getAutoAggregationFn:()=>{let t=n.getCoreRowModel().flatRows[0],r=t?.getValue(e.id);if(typeof r=="number")return kt.sum;if(Object.prototype.toString.call(r)==="[object Date]")return kt.extent},getAggregationFn:()=>{var t,r;if(!e)throw new Error;return st(e.columnDef.aggregationFn)?e.columnDef.aggregationFn:e.columnDef.aggregationFn==="auto"?e.getAutoAggregationFn():(t=(r=n.options.aggregationFns)==null?void 0:r[e.columnDef.aggregationFn])!=null?t:kt[e.columnDef.aggregationFn]}}),createTable:e=>({setGrouping:n=>e.options.onGroupingChange==null?void 0:e.options.onGroupingChange(n),resetGrouping:n=>{var t,r;e.setGrouping(n?[]:(t=(r=e.initialState)==null?void 0:r.grouping)!=null?t:[])},getPreGroupedRowModel:()=>e.getFilteredRowModel(),getGroupedRowModel:()=>(!e._getGroupedRowModel&&e.options.getGroupedRowModel&&(e._getGroupedRowModel=e.options.getGroupedRowModel(e)),e.options.manualGrouping||!e._getGroupedRowModel?e.getPreGroupedRowModel():e._getGroupedRowModel())}),createRow:(e,n)=>({getIsGrouped:()=>!!e.groupingColumnId,getGroupingValue:t=>{if(e._groupingValuesCache.hasOwnProperty(t))return e._groupingValuesCache[t];let r=n.getColumn(t);return r!=null&&r.columnDef.getGroupingValue?(e._groupingValuesCache[t]=r.columnDef.getGroupingValue(e.original),e._groupingValuesCache[t]):e.getValue(t)},_groupingValuesCache:{}}),createCell:(e,n,t,r)=>({getIsGrouped:()=>n.getIsGrouped()&&n.id===t.groupingColumnId,getIsPlaceholder:()=>!e.getIsGrouped()&&n.getIsGrouped(),getIsAggregated:()=>{var o;return!e.getIsGrouped()&&!e.getIsPlaceholder()&&!!((o=t.subRows)!=null&&o.length)}})};function Hi(e,n,t){if(!(n!=null&&n.length)||!t)return e;let r=e.filter(i=>!n.includes(i.id));return t==="remove"?r:[...n.map(i=>e.find(l=>l.id===i)).filter(Boolean),...r]}var zi={getInitialState:e=>({columnOrder:[],...e}),getDefaultOptions:e=>({onColumnOrderChange:Q("columnOrder",e)}),createTable:e=>({setColumnOrder:n=>e.options.onColumnOrderChange==null?void 0:e.options.onColumnOrderChange(n),resetColumnOrder:n=>{var t;e.setColumnOrder(n?[]:(t=e.initialState.columnOrder)!=null?t:[])},_getOrderColumnsFn:C(()=>[e.getState().columnOrder,e.getState().grouping,e.options.groupedColumnMode],(n,t,r)=>o=>{let i=[];if(!(n!=null&&n.length))i=o;else{let l=[...n],u=[...o];for(;u.length&&l.length;){let s=l.shift(),d=u.findIndex(a=>a.id===s);d>-1&&i.push(u.splice(d,1)[0])}i=[...i,...u]}return Hi(i,t,r)},{key:!1})})},Gt=0,Bt=10,Lt=()=>({pageIndex:Gt,pageSize:Bt}),Gi={getInitialState:e=>({...e,pagination:{...Lt(),...e?.pagination}}),getDefaultOptions:e=>({onPaginationChange:Q("pagination",e)}),createTable:e=>{let n=!1,t=!1;return{_autoResetPageIndex:()=>{var r,o;if(!n){e._queue(()=>{n=!0});return}if((r=(o=e.options.autoResetAll)!=null?o:e.options.autoResetPageIndex)!=null?r:!e.options.manualPagination){if(t)return;t=!0,e._queue(()=>{e.resetPageIndex(),t=!1})}},setPagination:r=>{let o=i=>me(r,i);return e.options.onPaginationChange==null?void 0:e.options.onPaginationChange(o)},resetPagination:r=>{var o;e.setPagination(r?Lt():(o=e.initialState.pagination)!=null?o:Lt())},setPageIndex:r=>{e.setPagination(o=>{let i=me(r,o.pageIndex),l=typeof e.options.pageCount>"u"||e.options.pageCount===-1?Number.MAX_SAFE_INTEGER:e.options.pageCount-1;return i=Math.max(0,Math.min(i,l)),{...o,pageIndex:i}})},resetPageIndex:r=>{var o,i,l;e.setPageIndex(r?Gt:(o=(i=e.initialState)==null||(l=i.pagination)==null?void 0:l.pageIndex)!=null?o:Gt)},resetPageSize:r=>{var o,i,l;e.setPageSize(r?Bt:(o=(i=e.initialState)==null||(l=i.pagination)==null?void 0:l.pageSize)!=null?o:Bt)},setPageSize:r=>{e.setPagination(o=>{let i=Math.max(1,me(r,o.pageSize)),l=o.pageSize*o.pageIndex,u=Math.floor(l/i);return{...o,pageIndex:u,pageSize:i}})},setPageCount:r=>e.setPagination(o=>{var i;let l=me(r,(i=e.options.pageCount)!=null?i:-1);return typeof l=="number"&&(l=Math.max(-1,l)),{...o,pageCount:l}}),getPageOptions:C(()=>[e.getPageCount()],r=>{let o=[];return r&&r>0&&(o=[...new Array(r)].fill(null).map((i,l)=>l)),o},{key:!1,debug:()=>{var r;return(r=e.options.debugAll)!=null?r:e.options.debugTable}}),getCanPreviousPage:()=>e.getState().pagination.pageIndex>0,getCanNextPage:()=>{let{pageIndex:r}=e.getState().pagination,o=e.getPageCount();return o===-1?!0:o===0?!1:re.setPageIndex(r=>r-1),nextPage:()=>e.setPageIndex(r=>r+1),getPrePaginationRowModel:()=>e.getExpandedRowModel(),getPaginationRowModel:()=>(!e._getPaginationRowModel&&e.options.getPaginationRowModel&&(e._getPaginationRowModel=e.options.getPaginationRowModel(e)),e.options.manualPagination||!e._getPaginationRowModel?e.getPrePaginationRowModel():e._getPaginationRowModel()),getPageCount:()=>{var r;return(r=e.options.pageCount)!=null?r:Math.ceil(e.getPrePaginationRowModel().rows.length/e.getState().pagination.pageSize)}}}},Ht=()=>({left:[],right:[]}),Bi={getInitialState:e=>({columnPinning:Ht(),...e}),getDefaultOptions:e=>({onColumnPinningChange:Q("columnPinning",e)}),createColumn:(e,n)=>({pin:t=>{let r=e.getLeafColumns().map(o=>o.id).filter(Boolean);n.setColumnPinning(o=>{var i,l;if(t==="right"){var u,s;return{left:((u=o?.left)!=null?u:[]).filter(g=>!(r!=null&&r.includes(g))),right:[...((s=o?.right)!=null?s:[]).filter(g=>!(r!=null&&r.includes(g))),...r]}}if(t==="left"){var d,a;return{left:[...((d=o?.left)!=null?d:[]).filter(g=>!(r!=null&&r.includes(g))),...r],right:((a=o?.right)!=null?a:[]).filter(g=>!(r!=null&&r.includes(g)))}}return{left:((i=o?.left)!=null?i:[]).filter(g=>!(r!=null&&r.includes(g))),right:((l=o?.right)!=null?l:[]).filter(g=>!(r!=null&&r.includes(g)))}})},getCanPin:()=>e.getLeafColumns().some(r=>{var o,i;return((o=r.columnDef.enablePinning)!=null?o:!0)&&((i=n.options.enablePinning)!=null?i:!0)}),getIsPinned:()=>{let t=e.getLeafColumns().map(u=>u.id),{left:r,right:o}=n.getState().columnPinning,i=t.some(u=>r?.includes(u)),l=t.some(u=>o?.includes(u));return i?"left":l?"right":!1},getPinnedIndex:()=>{var t,r,o;let i=e.getIsPinned();return i?(t=(r=n.getState().columnPinning)==null||(o=r[i])==null?void 0:o.indexOf(e.id))!=null?t:-1:0}}),createRow:(e,n)=>({getCenterVisibleCells:C(()=>[e._getAllVisibleCells(),n.getState().columnPinning.left,n.getState().columnPinning.right],(t,r,o)=>{let i=[...r??[],...o??[]];return t.filter(l=>!i.includes(l.column.id))},{key:"row.getCenterVisibleCells",debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}}),getLeftVisibleCells:C(()=>[e._getAllVisibleCells(),n.getState().columnPinning.left,,],(t,r)=>(r??[]).map(i=>t.find(l=>l.column.id===i)).filter(Boolean).map(i=>({...i,position:"left"})),{key:"row.getLeftVisibleCells",debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}}),getRightVisibleCells:C(()=>[e._getAllVisibleCells(),n.getState().columnPinning.right],(t,r)=>(r??[]).map(i=>t.find(l=>l.column.id===i)).filter(Boolean).map(i=>({...i,position:"right"})),{key:"row.getRightVisibleCells",debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}})}),createTable:e=>({setColumnPinning:n=>e.options.onColumnPinningChange==null?void 0:e.options.onColumnPinningChange(n),resetColumnPinning:n=>{var t,r;return e.setColumnPinning(n?Ht():(t=(r=e.initialState)==null?void 0:r.columnPinning)!=null?t:Ht())},getIsSomeColumnsPinned:n=>{var t;let r=e.getState().columnPinning;if(!n){var o,i;return!!((o=r.left)!=null&&o.length||(i=r.right)!=null&&i.length)}return!!((t=r[n])!=null&&t.length)},getLeftLeafColumns:C(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left],(n,t)=>(t??[]).map(r=>n.find(o=>o.id===r)).filter(Boolean),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugColumns}}),getRightLeafColumns:C(()=>[e.getAllLeafColumns(),e.getState().columnPinning.right],(n,t)=>(t??[]).map(r=>n.find(o=>o.id===r)).filter(Boolean),{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugColumns}}),getCenterLeafColumns:C(()=>[e.getAllLeafColumns(),e.getState().columnPinning.left,e.getState().columnPinning.right],(n,t,r)=>{let o=[...t??[],...r??[]];return n.filter(i=>!o.includes(i.id))},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugColumns}})})},Ui={getInitialState:e=>({rowSelection:{},...e}),getDefaultOptions:e=>({onRowSelectionChange:Q("rowSelection",e),enableRowSelection:!0,enableMultiRowSelection:!0,enableSubRowSelection:!0}),createTable:e=>({setRowSelection:n=>e.options.onRowSelectionChange==null?void 0:e.options.onRowSelectionChange(n),resetRowSelection:n=>{var t;return e.setRowSelection(n?{}:(t=e.initialState.rowSelection)!=null?t:{})},toggleAllRowsSelected:n=>{e.setRowSelection(t=>{n=typeof n<"u"?n:!e.getIsAllRowsSelected();let r={...t},o=e.getPreGroupedRowModel().flatRows;return n?o.forEach(i=>{i.getCanSelect()&&(r[i.id]=!0)}):o.forEach(i=>{delete r[i.id]}),r})},toggleAllPageRowsSelected:n=>e.setRowSelection(t=>{let r=typeof n<"u"?n:!e.getIsAllPageRowsSelected(),o={...t};return e.getRowModel().rows.forEach(i=>{Ut(o,i.id,r,e)}),o}),getPreSelectedRowModel:()=>e.getCoreRowModel(),getSelectedRowModel:C(()=>[e.getState().rowSelection,e.getCoreRowModel()],(n,t)=>Object.keys(n).length?zt(e,t):{rows:[],flatRows:[],rowsById:{}},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable}}),getFilteredSelectedRowModel:C(()=>[e.getState().rowSelection,e.getFilteredRowModel()],(n,t)=>Object.keys(n).length?zt(e,t):{rows:[],flatRows:[],rowsById:{}},{key:"getFilteredSelectedRowModel",debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable}}),getGroupedSelectedRowModel:C(()=>[e.getState().rowSelection,e.getSortedRowModel()],(n,t)=>Object.keys(n).length?zt(e,t):{rows:[],flatRows:[],rowsById:{}},{key:"getGroupedSelectedRowModel",debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable}}),getIsAllRowsSelected:()=>{let n=e.getFilteredRowModel().flatRows,{rowSelection:t}=e.getState(),r=!!(n.length&&Object.keys(t).length);return r&&n.some(o=>o.getCanSelect()&&!t[o.id])&&(r=!1),r},getIsAllPageRowsSelected:()=>{let n=e.getPaginationRowModel().flatRows.filter(o=>o.getCanSelect()),{rowSelection:t}=e.getState(),r=!!n.length;return r&&n.some(o=>!t[o.id])&&(r=!1),r},getIsSomeRowsSelected:()=>{var n;let t=Object.keys((n=e.getState().rowSelection)!=null?n:{}).length;return t>0&&t{let n=e.getPaginationRowModel().flatRows;return e.getIsAllPageRowsSelected()?!1:n.filter(t=>t.getCanSelect()).some(t=>t.getIsSelected()||t.getIsSomeSelected())},getToggleAllRowsSelectedHandler:()=>n=>{e.toggleAllRowsSelected(n.target.checked)},getToggleAllPageRowsSelectedHandler:()=>n=>{e.toggleAllPageRowsSelected(n.target.checked)}}),createRow:(e,n)=>({toggleSelected:t=>{let r=e.getIsSelected();n.setRowSelection(o=>{if(t=typeof t<"u"?t:!r,r===t)return o;let i={...o};return Ut(i,e.id,t,n),i})},getIsSelected:()=>{let{rowSelection:t}=n.getState();return qt(e,t)},getIsSomeSelected:()=>{let{rowSelection:t}=n.getState();return _r(e,t)==="some"},getIsAllSubRowsSelected:()=>{let{rowSelection:t}=n.getState();return _r(e,t)==="all"},getCanSelect:()=>{var t;return typeof n.options.enableRowSelection=="function"?n.options.enableRowSelection(e):(t=n.options.enableRowSelection)!=null?t:!0},getCanSelectSubRows:()=>{var t;return typeof n.options.enableSubRowSelection=="function"?n.options.enableSubRowSelection(e):(t=n.options.enableSubRowSelection)!=null?t:!0},getCanMultiSelect:()=>{var t;return typeof n.options.enableMultiRowSelection=="function"?n.options.enableMultiRowSelection(e):(t=n.options.enableMultiRowSelection)!=null?t:!0},getToggleSelectedHandler:()=>{let t=e.getCanSelect();return r=>{var o;t&&e.toggleSelected((o=r.target)==null?void 0:o.checked)}}})},Ut=(e,n,t,r)=>{var o;let i=r.getRow(n);t?(i.getCanMultiSelect()||Object.keys(e).forEach(l=>delete e[l]),i.getCanSelect()&&(e[n]=!0)):delete e[n],(o=i.subRows)!=null&&o.length&&i.getCanSelectSubRows()&&i.subRows.forEach(l=>Ut(e,l.id,t,r))};function zt(e,n){let t=e.getState().rowSelection,r=[],o={},i=function(l,u){return l.map(s=>{var d;let a=qt(s,t);if(a&&(r.push(s),o[s.id]=s),(d=s.subRows)!=null&&d.length&&(s={...s,subRows:i(s.subRows)}),a)return s}).filter(Boolean)};return{rows:i(n.rows),flatRows:r,rowsById:o}}function qt(e,n){var t;return(t=n[e.id])!=null?t:!1}function _r(e,n,t){if(e.subRows&&e.subRows.length){let r=!0,o=!1;return e.subRows.forEach(i=>{o&&!r||(qt(i,n)?o=!0:r=!1)}),r?"all":o?"some":!1}return!1}var jt=/([0-9]+)/gm,ji=(e,n,t)=>Mr(he(e.getValue(t)).toLowerCase(),he(n.getValue(t)).toLowerCase()),Ki=(e,n,t)=>Mr(he(e.getValue(t)),he(n.getValue(t))),qi=(e,n,t)=>Wt(he(e.getValue(t)).toLowerCase(),he(n.getValue(t)).toLowerCase()),Wi=(e,n,t)=>Wt(he(e.getValue(t)),he(n.getValue(t))),Xi=(e,n,t)=>{let r=e.getValue(t),o=n.getValue(t);return r>o?1:rWt(e.getValue(t),n.getValue(t));function Wt(e,n){return e===n?0:e>n?1:-1}function he(e){return typeof e=="number"?isNaN(e)||e===1/0||e===-1/0?"":String(e):typeof e=="string"?e:""}function Mr(e,n){let t=e.split(jt).filter(Boolean),r=n.split(jt).filter(Boolean);for(;t.length&&r.length;){let o=t.shift(),i=r.shift(),l=parseInt(o,10),u=parseInt(i,10),s=[l,u].sort();if(isNaN(s[0])){if(o>i)return 1;if(i>o)return-1;continue}if(isNaN(s[1]))return isNaN(l)?-1:1;if(l>u)return 1;if(u>l)return-1}return t.length-r.length}var Be={alphanumeric:ji,alphanumericCaseSensitive:Ki,text:qi,textCaseSensitive:Wi,datetime:Xi,basic:Yi},Ji={getInitialState:e=>({sorting:[],...e}),getDefaultColumnDef:()=>({sortingFn:"auto",sortUndefined:1}),getDefaultOptions:e=>({onSortingChange:Q("sorting",e),isMultiSortEvent:n=>n.shiftKey}),createColumn:(e,n)=>({getAutoSortingFn:()=>{let t=n.getFilteredRowModel().flatRows.slice(10),r=!1;for(let o of t){let i=o?.getValue(e.id);if(Object.prototype.toString.call(i)==="[object Date]")return Be.datetime;if(typeof i=="string"&&(r=!0,i.split(jt).length>1))return Be.alphanumeric}return r?Be.text:Be.basic},getAutoSortDir:()=>{let t=n.getFilteredRowModel().flatRows[0];return typeof t?.getValue(e.id)=="string"?"asc":"desc"},getSortingFn:()=>{var t,r;if(!e)throw new Error;return st(e.columnDef.sortingFn)?e.columnDef.sortingFn:e.columnDef.sortingFn==="auto"?e.getAutoSortingFn():(t=(r=n.options.sortingFns)==null?void 0:r[e.columnDef.sortingFn])!=null?t:Be[e.columnDef.sortingFn]},toggleSorting:(t,r)=>{let o=e.getNextSortingOrder(),i=typeof t<"u"&&t!==null;n.setSorting(l=>{let u=l?.find(c=>c.id===e.id),s=l?.findIndex(c=>c.id===e.id),d=[],a,g=i?t:o==="desc";if(l!=null&&l.length&&e.getCanMultiSort()&&r?u?a="toggle":a="add":l!=null&&l.length&&s!==l.length-1?a="replace":u?a="toggle":a="replace",a==="toggle"&&(i||o||(a="remove")),a==="add"){var f;d=[...l,{id:e.id,desc:g}],d.splice(0,d.length-((f=n.options.maxMultiSortColCount)!=null?f:Number.MAX_SAFE_INTEGER))}else a==="toggle"?d=l.map(c=>c.id===e.id?{...c,desc:g}:c):a==="remove"?d=l.filter(c=>c.id!==e.id):d=[{id:e.id,desc:g}];return d})},getFirstSortDir:()=>{var t,r;return((t=(r=e.columnDef.sortDescFirst)!=null?r:n.options.sortDescFirst)!=null?t:e.getAutoSortDir()==="desc")?"desc":"asc"},getNextSortingOrder:t=>{var r,o;let i=e.getFirstSortDir(),l=e.getIsSorted();return l?l!==i&&((r=n.options.enableSortingRemoval)==null||r)&&(!(t&&(o=n.options.enableMultiRemove)!=null)||o)?!1:l==="desc"?"asc":"desc":i},getCanSort:()=>{var t,r;return((t=e.columnDef.enableSorting)!=null?t:!0)&&((r=n.options.enableSorting)!=null?r:!0)&&!!e.accessorFn},getCanMultiSort:()=>{var t,r;return(t=(r=e.columnDef.enableMultiSort)!=null?r:n.options.enableMultiSort)!=null?t:!!e.accessorFn},getIsSorted:()=>{var t;let r=(t=n.getState().sorting)==null?void 0:t.find(o=>o.id===e.id);return r?r.desc?"desc":"asc":!1},getSortIndex:()=>{var t,r;return(t=(r=n.getState().sorting)==null?void 0:r.findIndex(o=>o.id===e.id))!=null?t:-1},clearSorting:()=>{n.setSorting(t=>t!=null&&t.length?t.filter(r=>r.id!==e.id):[])},getToggleSortingHandler:()=>{let t=e.getCanSort();return r=>{t&&(r.persist==null||r.persist(),e.toggleSorting==null||e.toggleSorting(void 0,e.getCanMultiSort()?n.options.isMultiSortEvent==null?void 0:n.options.isMultiSortEvent(r):!1))}}}),createTable:e=>({setSorting:n=>e.options.onSortingChange==null?void 0:e.options.onSortingChange(n),resetSorting:n=>{var t,r;e.setSorting(n?[]:(t=(r=e.initialState)==null?void 0:r.sorting)!=null?t:[])},getPreSortedRowModel:()=>e.getGroupedRowModel(),getSortedRowModel:()=>(!e._getSortedRowModel&&e.options.getSortedRowModel&&(e._getSortedRowModel=e.options.getSortedRowModel(e)),e.options.manualSorting||!e._getSortedRowModel?e.getPreSortedRowModel():e._getSortedRowModel())})},Qi={getInitialState:e=>({columnVisibility:{},...e}),getDefaultOptions:e=>({onColumnVisibilityChange:Q("columnVisibility",e)}),createColumn:(e,n)=>({toggleVisibility:t=>{e.getCanHide()&&n.setColumnVisibility(r=>({...r,[e.id]:t??!e.getIsVisible()}))},getIsVisible:()=>{var t,r;return(t=(r=n.getState().columnVisibility)==null?void 0:r[e.id])!=null?t:!0},getCanHide:()=>{var t,r;return((t=e.columnDef.enableHiding)!=null?t:!0)&&((r=n.options.enableHiding)!=null?r:!0)},getToggleVisibilityHandler:()=>t=>{e.toggleVisibility==null||e.toggleVisibility(t.target.checked)}}),createRow:(e,n)=>({_getAllVisibleCells:C(()=>[e.getAllCells(),n.getState().columnVisibility],t=>t.filter(r=>r.column.getIsVisible()),{key:"row._getAllVisibleCells",debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}}),getVisibleCells:C(()=>[e.getLeftVisibleCells(),e.getCenterVisibleCells(),e.getRightVisibleCells()],(t,r,o)=>[...t,...r,...o],{key:!1,debug:()=>{var t;return(t=n.options.debugAll)!=null?t:n.options.debugRows}})}),createTable:e=>{let n=(t,r)=>C(()=>[r(),r().filter(o=>o.getIsVisible()).map(o=>o.id).join("_")],o=>o.filter(i=>i.getIsVisible==null?void 0:i.getIsVisible()),{key:t,debug:()=>{var o;return(o=e.options.debugAll)!=null?o:e.options.debugColumns}});return{getVisibleFlatColumns:n("getVisibleFlatColumns",()=>e.getAllFlatColumns()),getVisibleLeafColumns:n("getVisibleLeafColumns",()=>e.getAllLeafColumns()),getLeftVisibleLeafColumns:n("getLeftVisibleLeafColumns",()=>e.getLeftLeafColumns()),getRightVisibleLeafColumns:n("getRightVisibleLeafColumns",()=>e.getRightLeafColumns()),getCenterVisibleLeafColumns:n("getCenterVisibleLeafColumns",()=>e.getCenterLeafColumns()),setColumnVisibility:t=>e.options.onColumnVisibilityChange==null?void 0:e.options.onColumnVisibilityChange(t),resetColumnVisibility:t=>{var r;e.setColumnVisibility(t?{}:(r=e.initialState.columnVisibility)!=null?r:{})},toggleAllColumnsVisible:t=>{var r;t=(r=t)!=null?r:!e.getIsAllColumnsVisible(),e.setColumnVisibility(e.getAllLeafColumns().reduce((o,i)=>({...o,[i.id]:t||!(i.getCanHide!=null&&i.getCanHide())}),{}))},getIsAllColumnsVisible:()=>!e.getAllLeafColumns().some(t=>!(t.getIsVisible!=null&&t.getIsVisible())),getIsSomeColumnsVisible:()=>e.getAllLeafColumns().some(t=>t.getIsVisible==null?void 0:t.getIsVisible()),getToggleAllColumnsVisibilityHandler:()=>t=>{var r;e.toggleAllColumnsVisible((r=t.target)==null?void 0:r.checked)}}}},yr=[Ri,Qi,zi,Bi,Ii,Ji,Li,Fi,Gi,Ui,xi];function Fr(e){var n;(e.debugAll||e.debugTable)&&console.info("Creating Table Instance...");let t={_features:yr},r=t._features.reduce((a,g)=>Object.assign(a,g.getDefaultOptions==null?void 0:g.getDefaultOptions(t)),{}),o=a=>t.options.mergeOptions?t.options.mergeOptions(r,a):{...r,...a},l={...{},...(n=e.initialState)!=null?n:{}};t._features.forEach(a=>{var g;l=(g=a.getInitialState==null?void 0:a.getInitialState(l))!=null?g:l});let u=[],s=!1,d={_features:yr,options:{...r,...e},initialState:l,_queue:a=>{u.push(a),s||(s=!0,Promise.resolve().then(()=>{for(;u.length;)u.shift()();s=!1}).catch(g=>setTimeout(()=>{throw g})))},reset:()=>{t.setState(t.initialState)},setOptions:a=>{let g=me(a,t.options);t.options=o(g)},getState:()=>t.options.state,setState:a=>{t.options.onStateChange==null||t.options.onStateChange(a)},_getRowId:(a,g,f)=>{var c;return(c=t.options.getRowId==null?void 0:t.options.getRowId(a,g,f))!=null?c:`${f?[f.id,g].join("."):g}`},getCoreRowModel:()=>(t._getCoreRowModel||(t._getCoreRowModel=t.options.getCoreRowModel(t)),t._getCoreRowModel()),getRowModel:()=>t.getPaginationRowModel(),getRow:a=>{let g=t.getRowModel().rowsById[a];if(!g)throw new Error;return g},_getDefaultColumnDef:C(()=>[t.options.defaultColumn],a=>{var g;return a=(g=a)!=null?g:{},{header:f=>{let c=f.header.column.columnDef;return c.accessorKey?c.accessorKey:c.accessorFn?c.id:null},cell:f=>{var c,p;return(c=(p=f.renderValue())==null||p.toString==null?void 0:p.toString())!=null?c:null},...t._features.reduce((f,c)=>Object.assign(f,c.getDefaultColumnDef==null?void 0:c.getDefaultColumnDef()),{}),...a}},{debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns},key:!1}),_getColumnDefs:()=>t.options.columns,getAllColumns:C(()=>[t._getColumnDefs()],a=>{let g=function(f,c,p){return p===void 0&&(p=0),f.map(m=>{let h=Ei(t,m,p,c),_=m;return h.columns=_.columns?g(_.columns,h,p+1):[],h})};return g(a)},{key:!1,debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns}}),getAllFlatColumns:C(()=>[t.getAllColumns()],a=>a.flatMap(g=>g.getFlatColumns()),{key:!1,debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns}}),_getAllFlatColumnsById:C(()=>[t.getAllFlatColumns()],a=>a.reduce((g,f)=>(g[f.id]=f,g),{}),{key:!1,debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns}}),getAllLeafColumns:C(()=>[t.getAllColumns(),t._getOrderColumnsFn()],(a,g)=>{let f=a.flatMap(c=>c.getLeafColumns());return g(f)},{key:!1,debug:()=>{var a;return(a=t.options.debugAll)!=null?a:t.options.debugColumns}}),getColumn:a=>t._getAllFlatColumnsById()[a]};return Object.assign(t,d),t._features.forEach(a=>Object.assign(t,a.createTable==null?void 0:a.createTable(t))),t}function Zi(e,n,t,r){let o=()=>{var l;return(l=i.getValue())!=null?l:e.options.renderFallbackValue},i={id:`${n.id}_${t.id}`,row:n,column:t,getValue:()=>n.getValue(r),renderValue:o,getContext:C(()=>[e,t,n,i],(l,u,s,d)=>({table:l,column:u,row:s,cell:d,getValue:d.getValue,renderValue:d.renderValue}),{key:!1,debug:()=>e.options.debugAll})};return e._features.forEach(l=>{Object.assign(i,l.createCell==null?void 0:l.createCell(i,t,n,e))},{}),i}var Xt=(e,n,t,r,o,i,l)=>{let u={id:n,index:r,original:t,depth:o,parentId:l,_valuesCache:{},_uniqueValuesCache:{},getValue:s=>{if(u._valuesCache.hasOwnProperty(s))return u._valuesCache[s];let d=e.getColumn(s);if(d!=null&&d.accessorFn)return u._valuesCache[s]=d.accessorFn(u.original,r),u._valuesCache[s]},getUniqueValues:s=>{if(u._uniqueValuesCache.hasOwnProperty(s))return u._uniqueValuesCache[s];let d=e.getColumn(s);if(d!=null&&d.accessorFn)return d.columnDef.getUniqueValues?(u._uniqueValuesCache[s]=d.columnDef.getUniqueValues(u.original,r),u._uniqueValuesCache[s]):(u._uniqueValuesCache[s]=[u.getValue(s)],u._uniqueValuesCache[s])},renderValue:s=>{var d;return(d=u.getValue(s))!=null?d:e.options.renderFallbackValue},subRows:i??[],getLeafRows:()=>wi(u.subRows,s=>s.subRows),getParentRow:()=>u.parentId?e.getRow(u.parentId):void 0,getParentRows:()=>{let s=[],d=u;for(;;){let a=d.getParentRow();if(!a)break;s.push(a),d=a}return s.reverse()},getAllCells:C(()=>[e.getAllLeafColumns()],s=>s.map(d=>Zi(e,u,d,d.id)),{key:!1,debug:()=>{var s;return(s=e.options.debugAll)!=null?s:e.options.debugRows}}),_getAllCellsByColumnId:C(()=>[u.getAllCells()],s=>s.reduce((d,a)=>(d[a.column.id]=a,d),{}),{key:"row.getAllCellsByColumnId",debug:()=>{var s;return(s=e.options.debugAll)!=null?s:e.options.debugRows}})};for(let s=0;sC(()=>[e.options.data],n=>{let t={rows:[],flatRows:[],rowsById:{}},r=function(o,i,l){i===void 0&&(i=0);let u=[];for(let d=0;d{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable},onChange:()=>{e._autoResetPageIndex()}})}function $r(e,n,t){return t.options.filterFromLeafRows?el(e,n,t):tl(e,n,t)}function el(e,n,t){var r;let o=[],i={},l=(r=t.options.maxLeafRowFilterDepth)!=null?r:100,u=function(s,d){d===void 0&&(d=0);let a=[];for(let f=0;fC(()=>[e.getPreFilteredRowModel(),e.getState().columnFilters,e.getState().globalFilter],(n,t,r)=>{if(!n.rows.length||!(t!=null&&t.length)&&!r){for(let f=0;f{var c;let p=e.getColumn(f.id);if(!p)return;let m=p.getFilterFn();m&&o.push({id:f.id,filterFn:m,resolvedValue:(c=m.resolveFilterValue==null?void 0:m.resolveFilterValue(f.value))!=null?c:f.value})});let l=t.map(f=>f.id),u=e.getGlobalFilterFn(),s=e.getAllLeafColumns().filter(f=>f.getCanGlobalFilter());r&&u&&s.length&&(l.push("__global__"),s.forEach(f=>{var c;i.push({id:f.id,filterFn:u,resolvedValue:(c=u.resolveFilterValue==null?void 0:u.resolveFilterValue(r))!=null?c:r})}));let d,a;for(let f=0;f{c.columnFiltersMeta[m]=h})}if(i.length){for(let p=0;p{c.columnFiltersMeta[m]=h})){c.columnFilters.__global__=!0;break}}c.columnFilters.__global__!==!0&&(c.columnFilters.__global__=!1)}}let g=f=>{for(let c=0;c{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable},onChange:()=>{e._autoResetPageIndex()}})}function Tr(){return(e,n)=>C(()=>[e.getPreFilteredRowModel(),e.getState().columnFilters,e.getState().globalFilter,e.getFilteredRowModel()],(t,r,o)=>{if(!t.rows.length||!(r!=null&&r.length)&&!o)return t;let i=[...r.map(u=>u.id).filter(u=>u!==n),o?"__global__":void 0].filter(Boolean),l=u=>{for(let s=0;s{var t;return(t=e.options.debugAll)!=null?t:e.options.debugTable},onChange:()=>{}})}function Dr(){return(e,n)=>C(()=>{var t;return[(t=e.getColumn(n))==null?void 0:t.getFacetedRowModel()]},t=>{if(!t)return new Map;let r=new Map;for(let i=0;i{var t;return(t=e.options.debugAll)!=null?t:e.options.debugTable},onChange:()=>{}})}function Or(){return(e,n)=>C(()=>{var t;return[(t=e.getColumn(n))==null?void 0:t.getFacetedRowModel()]},t=>{var r;if(!t)return;let o=(r=t.flatRows[0])==null?void 0:r.getUniqueValues(n);if(typeof o>"u")return;let i=[o,o];for(let l=0;li[1]&&(i[1]=d)}}return i},{key:!1,debug:()=>{var t;return(t=e.options.debugAll)!=null?t:e.options.debugTable},onChange:()=>{}})}function Nr(){return e=>C(()=>[e.getState().sorting,e.getPreSortedRowModel()],(n,t)=>{if(!t.rows.length||!(n!=null&&n.length))return t;let r=e.getState().sorting,o=[],i=r.filter(s=>{var d;return(d=e.getColumn(s.id))==null?void 0:d.getCanSort()}),l={};i.forEach(s=>{let d=e.getColumn(s.id);d&&(l[s.id]={sortUndefined:d.columnDef.sortUndefined,invertSorting:d.columnDef.invertSorting,sortingFn:d.getSortingFn()})});let u=s=>{let d=[...s];return d.sort((a,g)=>{for(let c=0;c{var g;o.push(a),(g=a.subRows)!=null&&g.length&&(a.subRows=u(a.subRows))}),d};return{rows:u(t.rows),flatRows:o,rowsById:t.rowsById}},{key:!1,debug:()=>{var n;return(n=e.options.debugAll)!=null?n:e.options.debugTable},onChange:()=>{e._autoResetPageIndex()}})}function at(e,n){return e?nl(e)?K(e,n):e:null}function nl(e){return rl(e)||typeof e=="function"||ol(e)}function rl(e){return typeof e=="function"&&(()=>{let n=Object.getPrototypeOf(e);return n.prototype&&n.prototype.isReactComponent})()}function ol(e){return typeof e=="object"&&typeof e.$$typeof=="symbol"&&["react.memo","react.forward_ref"].includes(e.$$typeof.description)}function Ar(e){let n={state:{},onStateChange:()=>{},renderFallbackValue:null,...e},[t]=P(()=>({current:Fr(n)})),[r,o]=P(()=>t.current.initialState);return t.current.setOptions(i=>({...i,...e,state:{...r,...e.state},onStateChange:l=>{o(l),e.onStateChange==null||e.onStateChange(l)}})),t.current}function Ue(){return Ue=Object.assign?Object.assign.bind():function(e){for(var n=1;n"u"&&delete r[i]}),t.options=Ue({debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:rl,rangeExtractor:ol,onChange:function(){},measureElement:il,initialRect:{width:0,height:0},scrollMargin:0,scrollingDelay:150,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1},r)},this.notify=function(){t.options.onChange==null||t.options.onChange(t)},this.cleanup=function(){t.unsubs.filter(Boolean).forEach(function(r){return r()}),t.unsubs=[],t.scrollElement=null},this._didMount=function(){return t.measureElementCache.forEach(t.observer.observe),function(){t.observer.disconnect(),t.cleanup()}},this._willUpdate=function(){var r=t.options.getScrollElement();t.scrollElement!==r&&(t.cleanup(),t.scrollElement=r,t._scrollToOffset(t.scrollOffset,{adjustments:void 0,behavior:void 0}),t.unsubs.push(t.options.observeElementRect(t,function(o){var i=t.scrollRect;t.scrollRect=o,(t.options.horizontal?o.width!==i.width:o.height!==i.height)&&t.maybeNotify()})),t.unsubs.push(t.options.observeElementOffset(t,function(o){t.scrollAdjustments=0,t.scrollOffset!==o&&(t.isScrollingTimeoutId!==null&&(clearTimeout(t.isScrollingTimeoutId),t.isScrollingTimeoutId=null),t.isScrolling=!0,t.scrollDirection=t.scrollOffset=0;u--){var s=r[u];if(!i.has(s.lane)){var d=l.get(s.lane);if(d==null||s.end>d.end?l.set(s.lane,s):s.end0?Math.min.apply(Math,t.pendingMeasuredCacheIndexes):0;t.pendingMeasuredCacheIndexes=[];for(var a=t.measurementsCache.slice(0,d),g=d;g=t.scrollOffset+i?o="end":o="start"),o==="start"?r=r:o==="end"?r=r-i:o==="center"&&(r=r-i/2);var l=t.options.horizontal?"scrollWidth":"scrollHeight",u=t.scrollElement?"document"in t.scrollElement?t.scrollElement.document.documentElement[l]:t.scrollElement[l]:0,s=u-t.getSize();return Math.max(Math.min(s,r),0)},this.getOffsetForIndex=function(r,o){o===void 0&&(o="auto"),r=Math.max(0,Math.min(r,t.options.count-1));var i=at(t.getMeasurements()[r]);if(o==="auto")if(i.end>=t.scrollOffset+t.getSize()-t.options.scrollPaddingEnd)o="end";else if(i.start<=t.scrollOffset+t.options.scrollPaddingStart)o="start";else return[t.scrollOffset,o];var l=o==="end"?i.end+t.options.scrollPaddingEnd:i.start-t.options.scrollPaddingStart;return[t.getOffsetForAlignment(l,o),o]},this.isDynamicMode=function(){return t.measureElementCache.size>0},this.cancelScrollToIndex=function(){t.scrollToIndexTimeoutId!==null&&(clearTimeout(t.scrollToIndexTimeoutId),t.scrollToIndexTimeoutId=null)},this.scrollToOffset=function(r,o){var i=o===void 0?{}:o,l=i.align,u=l===void 0?"start":l,s=i.behavior;t.cancelScrollToIndex(),s==="smooth"&&t.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),t._scrollToOffset(t.getOffsetForAlignment(r,u),{adjustments:void 0,behavior:s})},this.scrollToIndex=function(r,o){var i=o===void 0?{}:o,l=i.align,u=l===void 0?"auto":l,s=i.behavior;r=Math.max(0,Math.min(r,t.options.count-1)),t.cancelScrollToIndex(),s==="smooth"&&t.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size.");var d=t.getOffsetForIndex(r,u),a=d[0],g=d[1];t._scrollToOffset(a,{adjustments:void 0,behavior:s}),s!=="smooth"&&t.isDynamicMode()&&(t.scrollToIndexTimeoutId=setTimeout(function(){t.scrollToIndexTimeoutId=null;var f=t.measureElementCache.has(t.options.getItemKey(r));if(f){var c=t.getOffsetForIndex(r,g),m=c[0];Ar(m,t.scrollOffset)||t.scrollToIndex(r,{align:g,behavior:s})}else t.scrollToIndex(r,{align:g,behavior:s})}))},this.scrollBy=function(r,o){var i=o===void 0?{}:o,l=i.behavior;t.cancelScrollToIndex(),l==="smooth"&&t.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),t._scrollToOffset(t.scrollOffset+r,{adjustments:void 0,behavior:l})},this.getTotalSize=function(){var r;return(((r=t.getMeasurements()[t.options.count-1])==null?void 0:r.end)||t.options.paddingStart)-t.options.scrollMargin+t.options.paddingEnd},this._scrollToOffset=function(r,o){var i=o.adjustments,l=o.behavior;t.options.scrollToFn(r,{behavior:l,adjustments:i},t)},this.measure=function(){t.itemSizeCache=new Map,t.notify()},this.setOptions(n),this.scrollRect=this.options.initialRect,this.scrollOffset=this.options.initialOffset,this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(function(r){t.itemSizeCache.set(r.key,r.size)}),this.maybeNotify()},zr=function(n,t,r,o){for(;n<=t;){var i=(n+t)/2|0,l=r(i);if(lo)t=i-1;else return i}return n>0?n-1:0};function ll(e){for(var n=e.measurements,t=e.outerSize,r=e.scrollOffset,o=n.length-1,i=function(d){return n[d].start},l=zr(0,o,i,r),u=l;u{n(t,r,e)}):e.forEach((t,r)=>n(r,t,e))}function ft(e){let n=e[M];return n?n.type_:Array.isArray(e)?1:gt(e)?2:pt(e)?3:0}function Jt(e,n){return ft(e)===2?e.has(n):Object.prototype.hasOwnProperty.call(e,n)}function Jr(e,n,t){let r=ft(e);r===2?e.set(n,t):r===3?e.add(t):e[n]=t}function dl(e,n){return e===n?e!==0||1/e===1/n:e!==e&&n!==n}function gt(e){return e instanceof Map}function pt(e){return e instanceof Set}function H(e){return e.copy_||e.base_}function Qt(e,n){if(gt(e))return new Map(e);if(pt(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);if(!n&&Yr(e))return $e(e)?{...e}:Object.assign(Object.create(null),e);let t=Object.getOwnPropertyDescriptors(e);delete t[M];let r=Reflect.ownKeys(t);for(let o=0;o1&&(e.set=e.add=e.clear=e.delete=cl),Object.freeze(e),n&&Te(e,(t,r)=>De(r,!0),!0)),e}function cl(){Q(2)}function mt(e){return Object.isFrozen(e)}var Zt={};function Se(e){let n=Zt[e];return n||Q(0,e),n}function fl(e,n){Zt[e]||(Zt[e]=n)}var je;function ut(){return je}function gl(e,n){return{drafts_:[],parent_:e,immer_:n,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function jr(e,n){n&&(Se("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=n)}function en(e){tn(e),e.drafts_.forEach(pl),e.drafts_=null}function tn(e){e===je&&(je=e.parent_)}function Kr(e){return je=gl(je,e)}function pl(e){let n=e[M];n.type_===0||n.type_===1?n.revoke_():n.revoked_=!0}function qr(e,n){n.unfinalizedDrafts_=n.drafts_.length;let t=n.drafts_[0];return e!==void 0&&e!==t?(t[M].modified_&&(en(n),Q(4)),ce(e)&&(e=dt(n,e),n.parent_||ct(n,e)),n.patches_&&Se("Patches").generateReplacementPatches_(t[M].base_,e,n.patches_,n.inversePatches_)):e=dt(n,t,[]),en(n),n.patches_&&n.patchListener_(n.patches_,n.inversePatches_),e!==Xr?e:void 0}function dt(e,n,t){if(mt(n))return n;let r=n[M];if(!r)return Te(n,(o,i)=>Wr(e,r,n,o,i,t),!0),n;if(r.scope_!==e)return n;if(!r.modified_)return ct(e,r.base_,!0),r.base_;if(!r.finalized_){r.finalized_=!0,r.scope_.unfinalizedDrafts_--;let o=r.copy_,i=o,l=!1;r.type_===3&&(i=new Set(o),o.clear(),l=!0),Te(i,(u,s)=>Wr(e,r,o,u,s,t,l)),ct(e,o,!1),t&&e.patches_&&Se("Patches").generatePatches_(r,t,e.patches_,e.inversePatches_)}return r.copy_}function Wr(e,n,t,r,o,i,l){if(Ve(o)){let u=i&&n&&n.type_!==3&&!Jt(n.assigned_,r)?i.concat(r):void 0,s=dt(e,o,u);if(Jr(t,r,s),Ve(s))e.canAutoFreeze_=!1;else return}else l&&t.add(o);if(ce(o)&&!mt(o)){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;dt(e,o),(!n||!n.scope_.parent_)&&ct(e,o)}}function ct(e,n,t=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&De(n,t)}function ml(e,n){let t=Array.isArray(e),r={type_:t?1:0,scope_:n?n.scope_:ut(),modified_:!1,finalized_:!1,assigned_:{},parent_:n,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=r,i=nn;t&&(o=[r],i=Ke);let{revoke:l,proxy:u}=Proxy.revocable(o,i);return r.draft_=u,r.revoke_=l,u}var nn={get(e,n){if(n===M)return e;let t=H(e);if(!Jt(t,n))return hl(e,t,n);let r=t[n];return e.finalized_||!ce(r)?r:r===Xt(e.base_,n)?(Yt(e),e.copy_[n]=qe(r,e)):r},has(e,n){return n in H(e)},ownKeys(e){return Reflect.ownKeys(H(e))},set(e,n,t){let r=Qr(H(e),n);if(r?.set)return r.set.call(e.draft_,t),!0;if(!e.modified_){let o=Xt(H(e),n),i=o?.[M];if(i&&i.base_===t)return e.copy_[n]=t,e.assigned_[n]=!1,!0;if(dl(t,o)&&(t!==void 0||Jt(e.base_,n)))return!0;Yt(e),de(e)}return e.copy_[n]===t&&(t!==void 0||n in e.copy_)||Number.isNaN(t)&&Number.isNaN(e.copy_[n])||(e.copy_[n]=t,e.assigned_[n]=!0),!0},deleteProperty(e,n){return Xt(e.base_,n)!==void 0||n in e.base_?(e.assigned_[n]=!1,Yt(e),de(e)):delete e.assigned_[n],e.copy_&&delete e.copy_[n],!0},getOwnPropertyDescriptor(e,n){let t=H(e),r=Reflect.getOwnPropertyDescriptor(t,n);return r&&{writable:!0,configurable:e.type_!==1||n!=="length",enumerable:r.enumerable,value:t[n]}},defineProperty(){Q(11)},getPrototypeOf(e){return $e(e.base_)},setPrototypeOf(){Q(12)}},Ke={};Te(nn,(e,n)=>{Ke[e]=function(){return arguments[0]=arguments[0][0],n.apply(this,arguments)}});Ke.deleteProperty=function(e,n){return Ke.set.call(this,e,n,void 0)};Ke.set=function(e,n,t){return nn.set.call(this,e[0],n,t,e[0])};function Xt(e,n){let t=e[M];return(t?H(t):e)[n]}function hl(e,n,t){let r=Qr(n,t);return r?"value"in r?r.value:r.get?.call(e.draft_):void 0}function Qr(e,n){if(!(n in e))return;let t=$e(e);for(;t;){let r=Object.getOwnPropertyDescriptor(t,n);if(r)return r;t=$e(t)}}function de(e){e.modified_||(e.modified_=!0,e.parent_&&de(e.parent_))}function Yt(e){e.copy_||(e.copy_=Qt(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var _l=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(n,t,r)=>{if(typeof n=="function"&&typeof t!="function"){let i=t;t=n;let l=this;return function(s=i,...d){return l.produce(s,a=>t.call(this,a,...d))}}typeof t!="function"&&Q(6),r!==void 0&&typeof r!="function"&&Q(7);let o;if(ce(n)){let i=Kr(this),l=qe(n,void 0),u=!0;try{o=t(l),u=!1}finally{u?en(i):tn(i)}return jr(i,r),qr(o,i)}else if(!n||typeof n!="object"){if(o=t(n),o===void 0&&(o=n),o===Xr&&(o=void 0),this.autoFreeze_&&De(o,!0),r){let i=[],l=[];Se("Patches").generateReplacementPatches_(n,o,i,l),r(i,l)}return o}else Q(1,n)},this.produceWithPatches=(n,t)=>{if(typeof n=="function")return(l,...u)=>this.produceWithPatches(l,s=>n(s,...u));let r,o;return[this.produce(n,t,(l,u)=>{r=l,o=u}),r,o]},typeof e?.autoFreeze=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof e?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy)}createDraft(e){ce(e)||Q(8),Ve(e)&&(e=yl(e));let n=Kr(this),t=qe(e,void 0);return t[M].isManual_=!0,tn(n),t}finishDraft(e,n){let t=e&&e[M];(!t||!t.isManual_)&&Q(9);let{scope_:r}=t;return jr(r,n),qr(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}applyPatches(e,n){let t;for(t=n.length-1;t>=0;t--){let o=n[t];if(o.path.length===0&&o.op==="replace"){e=o.value;break}}t>-1&&(n=n.slice(t+1));let r=Se("Patches").applyPatches_;return Ve(e)?r(e,n):this.produce(e,o=>r(o,n))}};function qe(e,n){let t=gt(e)?Se("MapSet").proxyMap_(e,n):pt(e)?Se("MapSet").proxySet_(e,n):ml(e,n);return(n?n.scope_:ut()).drafts_.push(t),t}function yl(e){return Ve(e)||Q(10,e),Zr(e)}function Zr(e){if(!ce(e)||mt(e))return e;let n=e[M],t;if(n){if(!n.modified_)return n.base_;n.finalized_=!0,t=Qt(e,n.scope_.immer_.useStrictShallowCopy_)}else t=Qt(e,!0);return Te(t,(r,o)=>{Jr(t,r,Zr(o))}),n&&(n.finalized_=!1),t}function ht(){class e extends Map{constructor(s,d){super(),this[M]={type_:2,parent_:d,scope_:d?d.scope_:ut(),modified_:!1,finalized_:!1,copy_:void 0,assigned_:void 0,base_:s,draft_:this,isManual_:!1,revoked_:!1}}get size(){return H(this[M]).size}has(s){return H(this[M]).has(s)}set(s,d){let a=this[M];return l(a),(!H(a).has(s)||H(a).get(s)!==d)&&(t(a),de(a),a.assigned_.set(s,!0),a.copy_.set(s,d),a.assigned_.set(s,!0)),this}delete(s){if(!this.has(s))return!1;let d=this[M];return l(d),t(d),de(d),d.base_.has(s)?d.assigned_.set(s,!1):d.assigned_.delete(s),d.copy_.delete(s),!0}clear(){let s=this[M];l(s),H(s).size&&(t(s),de(s),s.assigned_=new Map,Te(s.base_,d=>{s.assigned_.set(d,!1)}),s.copy_.clear())}forEach(s,d){let a=this[M];H(a).forEach((g,f,c)=>{s.call(d,this.get(f),f,this)})}get(s){let d=this[M];l(d);let a=H(d).get(s);if(d.finalized_||!ce(a)||a!==d.base_.get(s))return a;let g=qe(a,d);return t(d),d.copy_.set(s,g),g}keys(){return H(this[M]).keys()}values(){let s=this.keys();return{[Symbol.iterator]:()=>this.values(),next:()=>{let d=s.next();return d.done?d:{done:!1,value:this.get(d.value)}}}}entries(){let s=this.keys();return{[Symbol.iterator]:()=>this.entries(),next:()=>{let d=s.next();if(d.done)return d;let a=this.get(d.value);return{done:!1,value:[d.value,a]}}}}[Symbol.iterator](){return this.entries()}}function n(u,s){return new e(u,s)}function t(u){u.copy_||(u.assigned_=new Map,u.copy_=new Map(u.base_))}class r extends Set{constructor(s,d){super(),this[M]={type_:3,parent_:d,scope_:d?d.scope_:ut(),modified_:!1,finalized_:!1,copy_:void 0,base_:s,draft_:this,drafts_:new Map,revoked_:!1,isManual_:!1}}get size(){return H(this[M]).size}has(s){let d=this[M];return l(d),d.copy_?!!(d.copy_.has(s)||d.drafts_.has(s)&&d.copy_.has(d.drafts_.get(s))):d.base_.has(s)}add(s){let d=this[M];return l(d),this.has(s)||(i(d),de(d),d.copy_.add(s)),this}delete(s){if(!this.has(s))return!1;let d=this[M];return l(d),i(d),de(d),d.copy_.delete(s)||(d.drafts_.has(s)?d.copy_.delete(d.drafts_.get(s)):!1)}clear(){let s=this[M];l(s),H(s).size&&(i(s),de(s),s.copy_.clear())}values(){let s=this[M];return l(s),i(s),s.copy_.values()}entries(){let s=this[M];return l(s),i(s),s.copy_.entries()}keys(){return this.values()}[Symbol.iterator](){return this.values()}forEach(s,d){let a=this.values(),g=a.next();for(;!g.done;)s.call(d,g.value,g.value,this),g=a.next()}}function o(u,s){return new r(u,s)}function i(u){u.copy_||(u.copy_=new Set,u.base_.forEach(s=>{if(ce(s)){let d=qe(s,u);u.drafts_.set(s,d),u.copy_.add(d)}else u.copy_.add(s)}))}function l(u){u.revoked_&&Q(3,JSON.stringify(H(u)))}fl("MapSet",{proxyMap_:n,proxySet_:o})}var W=new _l,eo=W.produce,us=W.produceWithPatches.bind(W),ds=W.setAutoFreeze.bind(W),cs=W.setUseStrictShallowCopy.bind(W),fs=W.applyPatches.bind(W),gs=W.createDraft.bind(W),ps=W.finishDraft.bind(W);function Oe(e){var n=P(function(){return De(typeof e=="function"?e():e,!0)}),t=n[1];return[n[0],q(function(r){t(typeof r=="function"?eo(r):De(r))},[])]}function vl(e,n,t,r,o){window.Shiny.shinyapp.makeRequest(e,n,t,r,o)}function to({method:e,args:n,blobs:t}){return new Promise((r,o)=>{vl(e,n,i=>{r(i)},i=>{o(i)},t)})}function no({patchInfo:e,patches:n,onSuccess:t,onError:r,columns:o,setData:i,setCellEditMapAtLoc:l}){let u=n.map(s=>({row_index:s.rowIndex,column_index:s.columnIndex,value:s.value}));to({method:e.key,args:[u]}).then(s=>{if(!Array.isArray(s))throw new Error("Expected a response of a list of patches");for(let a of s)if(!("row_index"in a&&"column_index"in a&&"value"in a))throw new Error("Expected list of patches containing `row_index`, `column_index`, and `value`");s=s;let d=s.map(a=>({rowIndex:a.row_index,columnIndex:a.column_index,value:a.value}));i(a=>{d.forEach(({rowIndex:g,columnIndex:f,value:c})=>{a[g][f]=c})}),d.forEach(({rowIndex:a,columnIndex:g,value:f})=>{l(a,g,c=>{c.value=f,c.state=fe.EditSuccess,c.errorTitle=void 0})}),t(d)}).catch(s=>{n.forEach(({rowIndex:d,columnIndex:a,value:g})=>{l(d,a,f=>{f.value=String(g),f.state=fe.EditFailure,f.errorTitle=String(s)})}),r(s)})}var fe={EditSaving:"EditSaving",EditSuccess:"EditSuccess",EditFailure:"EditFailure",Editing:"Editing",Ready:"Ready"},ln={EditSaving:"cell-edit-saving",EditSuccess:"cell-edit-success",EditFailure:"cell-edit-failure",Editing:"cell-edit-editing",Ready:void 0},on=e=>e!==null&&typeof e!="string"&&Object.prototype.hasOwnProperty.call(e,"isShinyHtml")&&e.isShinyHtml===!0,rn=e=>on(e)?e.obj.html:e,ro=({containerRef:e,rowId:n,cell:t,patchInfo:r,columns:o,coldefs:i,rowIndex:l,columnIndex:u,editCellsIsAllowed:s,getSortedRowModel:d,cellEditInfo:a,cellStyle:g,setData:f,setCellEditMapAtLoc:c,selection:m})=>{let p=t.getValue(),h=t.column.columnDef.meta.isHtmlColumn,_=a?.value??p,x=a?.state??fe.Ready,V=a?.errorTitle,I=a?.isEditing??!1,O=a?.editValue??rn(_),L=K(null),G=K(null),T=q(({resetIsEditing:E=!1,resetEditValue:k=!1}={resetIsEditing:!0,resetEditValue:!0})=>{c(l,u,F=>{E&&(F.isEditing=!1),k&&(F.editValue=void 0)})},[l,u,c]),re=E=>{E.key==="Escape"&&(E.preventDefault(),E.stopPropagation(),T(),m.focusOffset(n,0))},dn=E=>{if(E.key!=="Tab")return;E.preventDefault(),E.stopPropagation();let k=E.shiftKey,F=u;for(;;){let A=F+(k?-1:1);if(A<0||A>=i.length)return;if(F=A,i[A].meta.isHtmlColumn!==!0)break}we(),c(l,F,A=>{A.isEditing=!0})},We=E=>{if(E.key!=="Enter")return;E.preventDefault(),E.stopPropagation();let k=E.shiftKey,F=d(),A=F.rows.findIndex(Re=>Re.id===n);if(A<0)return;let Pe=A+(k?-1:1);if(Pe<0||Pe>=F.rows.length)return;we();let se=F.rows[Pe].index;c(se,u,Re=>{Re.isEditing=!0})},be=E=>{[re,We,dn].forEach(k=>k(E))},we=q(()=>{if(c(l,u,E=>{E.errorTitle=void 0}),`${rn(_)}`==`${O}`){T(),c(l,u,E=>{E.state=x});return}T({resetIsEditing:!0}),c(l,u,E=>{E.state=fe.EditSaving}),no({patchInfo:r,patches:[{rowIndex:l,columnIndex:u,value:O}],onSuccess:E=>{T({resetEditValue:!0})},onError:E=>{},columns:o,setData:f,setCellEditMapAtLoc:c})},[c,l,u,_,O,T,r,o,f,x]);N(()=>{I&&G.current&&(G.current.focus(),G.current.select())},[I]),N(()=>{if(!I||!L.current||!G.current)return;let E=A=>{L.current?.contains(A.target)&&A.stopPropagation()},k=L.current;k.addEventListener("mousedown",E);let F=A=>{A.target!==G.current&&(we(),T())};return document.body.addEventListener("mousedown",F),()=>{k.removeEventListener("mousedown",E),document.body.removeEventListener("mousedown",F)}},[x,we,l,u,I,T]);function cn(E){I&&E.target.select()}function Ce(E){c(l,u,k=>{k.editValue=E.target.value})}let Ee,Ne,yt=V,ge,_e=E=>{E&&(ge?(ge+=" ",ge+=E):ge=E)};_e(ln[I?fe.Editing:x]);let Ae=!1,Xe=null;return x===fe.EditSaving?Ne=O:(I?Xe=C.createElement("textarea",{value:String(O),onChange:Ce,onFocus:cn,onKeyDown:be,ref:G}):h?_e("cell-html"):s&&(_e("cell-editable"),Ee=E=>{c(l,u,k=>{k.isEditing=!0,k.editValue=rn(_)})}),on(_)?Ae=!0:Ne=st(t.column.columnDef.cell,t.getContext())),N(()=>{if(!L.current||!Ae||!on(_))return;let E=JSON.parse(JSON.stringify(_.obj));window.Shiny.renderContentAsync(L.current,E);let k=L.current;return()=>{window.Shiny.unbindAll(k),k.replaceChildren("")}},[L,_,l,u,Ae]),C.createElement("td",{ref:L,onDoubleClick:Ee,title:yt,className:ge,style:{...g}},Xe,Ne)};var oo=()=>{let[e,n]=Oe(new Map);return ht(),{cellEditMap:e,setCellEditMapAtLoc:(r,o,i)=>{n(l=>{let u=io(r,o),s=l.get(u)??{};i(s),l.set(u,s)})}}},io=(e,n)=>`[${e}, ${n}]`;var lo=(e,n,t)=>{let r=io(n,t);return[e.get(r)??{},r]};function _t(e,n,t){let r=Object.assign({top:0,right:0,bottom:0,left:0},t),o=e,i=o.scrollTop+r.top,l=o.scrollLeft+r.left,u=i+o.clientHeight-r.top-r.bottom,s=l+o.clientWidth-r.left-r.right;for(let d=0;d=i&&g<=u&&f>=l&&f<=s)return a}return null}function sn(e,n){return document?.defaultView?.getComputedStyle(e,null)?.getPropertyValue(n)}var uo=e=>{let[n,t]=P(!1),{range:r,from:o,to:i,onRangeChange:l}=e;return C.createElement(Sl,{range:r,value:[o,i],editing:n,onValueChange:u=>l(...u),onFocus:()=>t(!0),onBlur:()=>t(!1)})};var Sl=e=>{let[n,t]=e.value,{editing:r,onFocus:o}=e,[i,l]=e.range(),u=K(null),s=K(null);return C.createElement("div",{onBlur:d=>{if(!d.currentTarget.contains(d.relatedTarget))return e.onBlur()},onFocus:()=>o(),style:{display:"flex",gap:"0.5rem"}},C.createElement("input",{ref:u,className:`form-control form-control-sm ${u.current?.checkValidity()?"":"is-invalid"}`,style:{flex:"1 1 0",width:"0"},type:"number",placeholder:so(r,"Min",i),defaultValue:n,step:"any",onChange:d=>{let a=ao(d.target.value);u.current&&(u.current.classList.toggle("is-invalid",!d.target.checkValidity()),e.onValueChange([a,t]))}}),C.createElement("input",{ref:s,className:`form-control form-control-sm ${s.current?.checkValidity()?"":"is-invalid"}`,style:{flex:"1 1 0",width:"0"},type:"number",placeholder:so(r,"Max",l),defaultValue:t,step:"any",onChange:d=>{let a=ao(d.target.value);s.current&&(s.current.classList.toggle("is-invalid",!d.target.checkValidity()),e.onValueChange([n,a]))}}))};function so(e,n,t){if(e)return typeof t>"u"?n:`${n} (${t})`}function ao(e){if(e!=="")return+e}function co(e){let[n,t]=P([]),r=e?{getFilteredRowModel:$r(),getFacetedRowModel:Vr(),getFacetedUniqueValues:Tr(),getFacetedMinMaxValues:Dr(),filterFns:{substring:(o,i,l,u)=>o.getValue(i).toString().includes(l)},onColumnFiltersChange:t}:{};return{columnFilters:n,columnFiltersState:{columnFilters:n},filtersTableOptions:r,setColumnFilters:t}}var fo=({header:e,className:n,...t})=>{let r=e.column.columnDef.meta?.typeHint;if(!r||r.type==="html")return null;if(r.type==="numeric"){let[o,i]=e.column.getFilterValue()??[void 0,void 0];return uo({from:o,to:i,range:()=>e.column.getFacetedMinMaxValues()??[void 0,void 0],onRangeChange:(u,s)=>e.column.setFilterValue([u,s])})}return C.createElement("input",{...t,value:e.column.getFilterValue(),className:`form-control form-control-sm ${n}`,type:"text",onChange:o=>e.column.setFilterValue(o.target.value)})};var X=class e{static{this._empty=new e(new Set)}constructor(n){this._set=n}static empty(){return this._empty}static just(...n){return this.empty().add(...n)}has(n){return this._set.has(n)}add(...n){let t=new Set(this._set.keys());for(let r of n)t.add(r);return new e(t)}toggle(n){return this.has(n)?this.delete(n):this.add(n)}delete(n){let t=new Set(this._set.keys());return t.delete(n),new e(t)}clear(){return e.empty()}[Symbol.iterator](){return this._set[Symbol.iterator]()}toList(){return[...this._set.keys()]}};var U=class e{static{this._NONE="none"}static{this._ROW_SINGLE="single"}static{this._ROW_MULTIPLE="multiple"}static{this._COL_SINGLE="single"}static{this._col_multiple="multiple"}static{this._RECT_CELL="cell"}static{this._RECT_REGION="region"}static{this._rowEnum={NONE:e._NONE,SINGLE:e._ROW_SINGLE,MULTIPLE:e._ROW_MULTIPLE}}static{this._colEnum={NONE:e._NONE,SINGLE:e._COL_SINGLE,MULTIPLE:e._col_multiple}}static{this._rectEnum={NONE:e._NONE,REGION:e._RECT_REGION,CELL:e._RECT_CELL}}constructor({row:n,col:t,rect:r}){if(!Object.values(e._rowEnum).includes(n))throw new Error(`Invalid row selection mode: ${n}`);if(!Object.values(e._colEnum).includes(t))throw new Error(`Invalid col selection mode: ${t}`);if(!Object.values(e._rectEnum).includes(r))throw new Error(`Invalid rect selection mode: ${r}`);this.row=n,this.col=t,this.rect=r}isNone(){return this.row===e._rowEnum.NONE&&this.col===e._colEnum.NONE&&this.rect===e._rectEnum.NONE}};function po(e){return e||(e={row:"multiple",col:"none",rect:"none"}),new U({row:e.row,col:e.col,rect:e.rect})}function mo({isEditingCell:e,editCellsIsAllowed:n,selectionModes:t,keyAccessor:r,focusOffset:o,focusEscape:i,onKeyDownEnter:l,between:u}){let[s,d]=P(X.empty()),[a,g]=P(null),f=p=>{if(t.isNone())return;let h=p.currentTarget,_=r(h);if(e&&h.classList.contains(ln[fe.Editing]))return;let x=bl(t,u,s,p,_,a);x&&(d(x.selection),x.anchor&&(g(_),h.focus()),p.preventDefault())},c=p=>{if(e||t.isNone())return;let h=p.currentTarget,_=r(h),x=s.has(_);if(p.key==="Escape"){i(h),p.preventDefault();return}if(t.row===U._rowEnum.SINGLE){if(p.key===" "||p.key==="Enter")p.preventDefault(),n&&p.key==="Enter"?l(h):s.has(_)?d(X.empty()):d(X.just(_));else if(p.key==="ArrowUp"||p.key==="ArrowDown"){let V=o(_,p.key==="ArrowUp"?-1:1);V&&(p.preventDefault(),x&&d(X.just(V)))}}else t.row===U._rowEnum.MULTIPLE&&(p.key===" "||p.key==="Enter"?(p.preventDefault(),n&&p.key==="Enter"?l(h):d(s.toggle(_))):(p.key==="ArrowUp"||p.key==="ArrowDown")&&o(_,p.key==="ArrowUp"?-1:1)&&p.preventDefault())};return{has(p){return s.has(p)},set(p,h){d(h?s.add(p):s.delete(p))},setMultiple(p){d(X.just(...p))},clear(){d(s.clear())},keys(){return s},itemHandlers(){return{onMouseDown:f,onKeyDown:c}},focusOffset:o}}var go=/^mac/i.test(window.navigator.userAgentData?.platform??window.navigator.platform);function bl(e,n,t,r,o,i){let{shiftKey:l,altKey:u}=r,s=go?r.metaKey:r.ctrlKey;if((go?r.ctrlKey:r.metaKey)||u||e.row===U._rowEnum.NONE)return null;if(e.row===U._rowEnum.SINGLE)return s&&!l?t.has(o)?{selection:X.empty(),anchor:!0}:{selection:X.just(o),anchor:!0}:{selection:X.just(o),anchor:!0};if(e.row===U._rowEnum.MULTIPLE)if(l&&s){if(i!==null&&n){let a=n(i,o);return{selection:t.add(...a)}}}else{if(s)return{selection:t.toggle(o),anchor:!0};if(l){if(i!==null&&n){let a=n(i,o);return{selection:X.just(...a)}}}else return{selection:X.just(o),anchor:!0}}else throw new Error(`Unsupported row selection mode: ${e.row}`);return null}function ho({getColDefs:e}){let[n,t]=P([]);return{sorting:n,sortTableStateOptions:{sorting:n},sortTableOptions:{onSortingChange:r=>{let o=typeof r=="function"?r(n):r,i=e(),l=new Set(i.filter(s=>s.meta.isHtmlColumn).map(s=>s.header)),u=l.size==0?o:o.filter(s=>!l.has(s.id));t(u)},getSortedRowModel:Or()},setSorting:t}}var _o="sort-arrow",yo={viewBox:[-1,-1,2,2].map(e=>e*1.4).join(" "),width:"100%",height:"100%",style:{paddingLeft:"3px"}},vo={stroke:"#333333",strokeWidth:"0.6",fill:"transparent"},wl=C.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",...yo,className:`${_o} sort-arrow-up`},C.createElement("path",{d:"M -1 0.5 L 0 -0.5 L 1 0.5",...vo,strokeLinecap:"round"})),Cl=C.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",...yo,className:`${_o} sort-arrow-down`},C.createElement("path",{d:"M -1 -0.5 L 0 0.5 L 1 -0.5",...vo,strokeLinecap:"round"})),So=({direction:e})=>{if(!e)return null;if(e==="asc")return wl;if(e==="desc")return Cl;throw new Error(`Unexpected sort direction: '${e}'`)};ht();var bo=({location:e,rowIndex:n,columnIndex:t})=>`[${e}, ${n}, ${t}]`,wo=({initStyleInfos:e,nrow:n,ncol:t})=>{let[r,o]=Oe(new Map),i=q(s=>{let{location:d,rows:a,cols:g}=s;o(f=>{let c=a??Array.from({length:n},(p,h)=>h),m=g??Array.from({length:t},(p,h)=>h);for(let p of c)for(let h of m){let _=bo({location:d,rowIndex:p,columnIndex:h});f.set(_,{location:s.location,rowIndex:p,columnIndex:h,style:s.style,class:s.class})}})},[t,n,o]),l=q(()=>{o(s=>{s.clear()})},[o]),u=q(s=>{for(let d of s)i(d)},[i]);return N(()=>{u(e)},[e,u]),{styleInfoMap:r,setStyleInfo:i,setStyleInfos:u,resetStyleInfos:l}};var Co=(e,n,t,r)=>{let o=bo({location:n,rowIndex:t,columnIndex:r});return e.get(o)?.style},va=document.createElement("cssStringToObj");var Eo=` + color: hsl(`+Math.max(0,Math.min(120-120*f,120))+"deg 100% 31%);",t?.key)}return t==null||t.onChange==null||t.onChange(i),i}}function ut(e,n){if(e===void 0)throw new Error("Unexpected undefined"+(n?": "+n:""));return e}var Pr=function(n,t){return Math.abs(n-t)<1};var il=function(n){return n},ll=function(n){for(var t=Math.max(n.startIndex-n.overscan,0),r=Math.min(n.endIndex+n.overscan,n.count-1),o=[],i=t;i<=r;i++)o.push(i);return o},kr=function(n,t){var r=n.scrollElement;if(r){var o=function(u){var s=u.width,d=u.height;t({width:Math.round(s),height:Math.round(d)})};o(r.getBoundingClientRect());var i=new ResizeObserver(function(l){var u=l[0];if(u!=null&&u.borderBoxSize){var s=u.borderBoxSize[0];if(s){o({width:s.inlineSize,height:s.blockSize});return}}o(r.getBoundingClientRect())});return i.observe(r,{box:"border-box"}),function(){i.unobserve(r)}}};var Lr=function(n,t){var r=n.scrollElement;if(r){var o=function(){t(r[n.options.horizontal?"scrollLeft":"scrollTop"])};return o(),r.addEventListener("scroll",o,{passive:!0}),function(){r.removeEventListener("scroll",o)}}};var sl=function(n,t,r){if(t!=null&&t.borderBoxSize){var o=t.borderBoxSize[0];if(o){var i=Math.round(o[r.options.horizontal?"inlineSize":"blockSize"]);return i}}return Math.round(n.getBoundingClientRect()[r.options.horizontal?"width":"height"])};var Hr=function(n,t,r){var o,i,l=t.adjustments,u=l===void 0?0:l,s=t.behavior,d=n+u;(o=r.scrollElement)==null||o.scrollTo==null||o.scrollTo((i={},i[r.options.horizontal?"left":"top"]=d,i.behavior=s,i))},zr=function(n){var t=this;this.unsubs=[],this.scrollElement=null,this.isScrolling=!1,this.isScrollingTimeoutId=null,this.scrollToIndexTimeoutId=null,this.measurementsCache=[],this.itemSizeCache=new Map,this.pendingMeasuredCacheIndexes=[],this.scrollDirection=null,this.scrollAdjustments=0,this.measureElementCache=new Map,this.observer=function(){var r=null,o=function(){return r||(typeof ResizeObserver<"u"?r=new ResizeObserver(function(l){l.forEach(function(u){t._measureElement(u.target,u)})}):null)};return{disconnect:function(){var l;return(l=o())==null?void 0:l.disconnect()},observe:function(l){var u;return(u=o())==null?void 0:u.observe(l,{box:"border-box"})},unobserve:function(l){var u;return(u=o())==null?void 0:u.unobserve(l)}}}(),this.range={startIndex:0,endIndex:0},this.setOptions=function(r){Object.entries(r).forEach(function(o){var i=o[0],l=o[1];typeof l>"u"&&delete r[i]}),t.options=je({debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:il,rangeExtractor:ll,onChange:function(){},measureElement:sl,initialRect:{width:0,height:0},scrollMargin:0,scrollingDelay:150,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1},r)},this.notify=function(){t.options.onChange==null||t.options.onChange(t)},this.cleanup=function(){t.unsubs.filter(Boolean).forEach(function(r){return r()}),t.unsubs=[],t.scrollElement=null},this._didMount=function(){return t.measureElementCache.forEach(t.observer.observe),function(){t.observer.disconnect(),t.cleanup()}},this._willUpdate=function(){var r=t.options.getScrollElement();t.scrollElement!==r&&(t.cleanup(),t.scrollElement=r,t._scrollToOffset(t.scrollOffset,{adjustments:void 0,behavior:void 0}),t.unsubs.push(t.options.observeElementRect(t,function(o){var i=t.scrollRect;t.scrollRect=o,(t.options.horizontal?o.width!==i.width:o.height!==i.height)&&t.maybeNotify()})),t.unsubs.push(t.options.observeElementOffset(t,function(o){t.scrollAdjustments=0,t.scrollOffset!==o&&(t.isScrollingTimeoutId!==null&&(clearTimeout(t.isScrollingTimeoutId),t.isScrollingTimeoutId=null),t.isScrolling=!0,t.scrollDirection=t.scrollOffset=0;u--){var s=r[u];if(!i.has(s.lane)){var d=l.get(s.lane);if(d==null||s.end>d.end?l.set(s.lane,s):s.end0?Math.min.apply(Math,t.pendingMeasuredCacheIndexes):0;t.pendingMeasuredCacheIndexes=[];for(var a=t.measurementsCache.slice(0,d),g=d;g=t.scrollOffset+i?o="end":o="start"),o==="start"?r=r:o==="end"?r=r-i:o==="center"&&(r=r-i/2);var l=t.options.horizontal?"scrollWidth":"scrollHeight",u=t.scrollElement?"document"in t.scrollElement?t.scrollElement.document.documentElement[l]:t.scrollElement[l]:0,s=u-t.getSize();return Math.max(Math.min(s,r),0)},this.getOffsetForIndex=function(r,o){o===void 0&&(o="auto"),r=Math.max(0,Math.min(r,t.options.count-1));var i=ut(t.getMeasurements()[r]);if(o==="auto")if(i.end>=t.scrollOffset+t.getSize()-t.options.scrollPaddingEnd)o="end";else if(i.start<=t.scrollOffset+t.options.scrollPaddingStart)o="start";else return[t.scrollOffset,o];var l=o==="end"?i.end+t.options.scrollPaddingEnd:i.start-t.options.scrollPaddingStart;return[t.getOffsetForAlignment(l,o),o]},this.isDynamicMode=function(){return t.measureElementCache.size>0},this.cancelScrollToIndex=function(){t.scrollToIndexTimeoutId!==null&&(clearTimeout(t.scrollToIndexTimeoutId),t.scrollToIndexTimeoutId=null)},this.scrollToOffset=function(r,o){var i=o===void 0?{}:o,l=i.align,u=l===void 0?"start":l,s=i.behavior;t.cancelScrollToIndex(),s==="smooth"&&t.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),t._scrollToOffset(t.getOffsetForAlignment(r,u),{adjustments:void 0,behavior:s})},this.scrollToIndex=function(r,o){var i=o===void 0?{}:o,l=i.align,u=l===void 0?"auto":l,s=i.behavior;r=Math.max(0,Math.min(r,t.options.count-1)),t.cancelScrollToIndex(),s==="smooth"&&t.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size.");var d=t.getOffsetForIndex(r,u),a=d[0],g=d[1];t._scrollToOffset(a,{adjustments:void 0,behavior:s}),s!=="smooth"&&t.isDynamicMode()&&(t.scrollToIndexTimeoutId=setTimeout(function(){t.scrollToIndexTimeoutId=null;var f=t.measureElementCache.has(t.options.getItemKey(r));if(f){var c=t.getOffsetForIndex(r,g),p=c[0];Pr(p,t.scrollOffset)||t.scrollToIndex(r,{align:g,behavior:s})}else t.scrollToIndex(r,{align:g,behavior:s})}))},this.scrollBy=function(r,o){var i=o===void 0?{}:o,l=i.behavior;t.cancelScrollToIndex(),l==="smooth"&&t.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),t._scrollToOffset(t.scrollOffset+r,{adjustments:void 0,behavior:l})},this.getTotalSize=function(){var r;return(((r=t.getMeasurements()[t.options.count-1])==null?void 0:r.end)||t.options.paddingStart)-t.options.scrollMargin+t.options.paddingEnd},this._scrollToOffset=function(r,o){var i=o.adjustments,l=o.behavior;t.options.scrollToFn(r,{behavior:l,adjustments:i},t)},this.measure=function(){t.itemSizeCache=new Map,t.notify()},this.setOptions(n),this.scrollRect=this.options.initialRect,this.scrollOffset=this.options.initialOffset,this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(function(r){t.itemSizeCache.set(r.key,r.size)}),this.maybeNotify()},Gr=function(n,t,r,o){for(;n<=t;){var i=(n+t)/2|0,l=r(i);if(lo)t=i-1;else return i}return n>0?n-1:0};function al(e){for(var n=e.measurements,t=e.outerSize,r=e.scrollOffset,o=n.length-1,i=function(d){return n[d].start},l=Gr(0,o,i,r),u=l;u{n(t,r,e)}):e.forEach((t,r)=>n(r,t,e))}function gt(e){let n=e[F];return n?n.type_:Array.isArray(e)?1:pt(e)?2:mt(e)?3:0}function Qt(e,n){return gt(e)===2?e.has(n):Object.prototype.hasOwnProperty.call(e,n)}function Qr(e,n,t){let r=gt(e);r===2?e.set(n,t):r===3?e.add(t):e[n]=t}function fl(e,n){return e===n?e!==0||1/e===1/n:e!==e&&n!==n}function pt(e){return e instanceof Map}function mt(e){return e instanceof Set}function H(e){return e.copy_||e.base_}function Zt(e,n){if(pt(e))return new Map(e);if(mt(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);if(!n&&Jr(e))return $e(e)?{...e}:Object.assign(Object.create(null),e);let t=Object.getOwnPropertyDescriptors(e);delete t[F];let r=Reflect.ownKeys(t);for(let o=0;o1&&(e.set=e.add=e.clear=e.delete=gl),Object.freeze(e),n&&Te(e,(t,r)=>De(r,!0),!0)),e}function gl(){Z(2)}function ht(e){return Object.isFrozen(e)}var en={};function Se(e){let n=en[e];return n||Z(0,e),n}function pl(e,n){en[e]||(en[e]=n)}var Ke;function dt(){return Ke}function ml(e,n){return{drafts_:[],parent_:e,immer_:n,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function Kr(e,n){n&&(Se("Patches"),e.patches_=[],e.inversePatches_=[],e.patchListener_=n)}function tn(e){nn(e),e.drafts_.forEach(hl),e.drafts_=null}function nn(e){e===Ke&&(Ke=e.parent_)}function qr(e){return Ke=ml(Ke,e)}function hl(e){let n=e[F];n.type_===0||n.type_===1?n.revoke_():n.revoked_=!0}function Wr(e,n){n.unfinalizedDrafts_=n.drafts_.length;let t=n.drafts_[0];return e!==void 0&&e!==t?(t[F].modified_&&(tn(n),Z(4)),ce(e)&&(e=ct(n,e),n.parent_||ft(n,e)),n.patches_&&Se("Patches").generateReplacementPatches_(t[F].base_,e,n.patches_,n.inversePatches_)):e=ct(n,t,[]),tn(n),n.patches_&&n.patchListener_(n.patches_,n.inversePatches_),e!==Yr?e:void 0}function ct(e,n,t){if(ht(n))return n;let r=n[F];if(!r)return Te(n,(o,i)=>Xr(e,r,n,o,i,t),!0),n;if(r.scope_!==e)return n;if(!r.modified_)return ft(e,r.base_,!0),r.base_;if(!r.finalized_){r.finalized_=!0,r.scope_.unfinalizedDrafts_--;let o=r.copy_,i=o,l=!1;r.type_===3&&(i=new Set(o),o.clear(),l=!0),Te(i,(u,s)=>Xr(e,r,o,u,s,t,l)),ft(e,o,!1),t&&e.patches_&&Se("Patches").generatePatches_(r,t,e.patches_,e.inversePatches_)}return r.copy_}function Xr(e,n,t,r,o,i,l){if(Ve(o)){let u=i&&n&&n.type_!==3&&!Qt(n.assigned_,r)?i.concat(r):void 0,s=ct(e,o,u);if(Qr(t,r,s),Ve(s))e.canAutoFreeze_=!1;else return}else l&&t.add(o);if(ce(o)&&!ht(o)){if(!e.immer_.autoFreeze_&&e.unfinalizedDrafts_<1)return;ct(e,o),(!n||!n.scope_.parent_)&&ft(e,o)}}function ft(e,n,t=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&De(n,t)}function _l(e,n){let t=Array.isArray(e),r={type_:t?1:0,scope_:n?n.scope_:dt(),modified_:!1,finalized_:!1,assigned_:{},parent_:n,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1},o=r,i=rn;t&&(o=[r],i=qe);let{revoke:l,proxy:u}=Proxy.revocable(o,i);return r.draft_=u,r.revoke_=l,u}var rn={get(e,n){if(n===F)return e;let t=H(e);if(!Qt(t,n))return yl(e,t,n);let r=t[n];return e.finalized_||!ce(r)?r:r===Yt(e.base_,n)?(Jt(e),e.copy_[n]=We(r,e)):r},has(e,n){return n in H(e)},ownKeys(e){return Reflect.ownKeys(H(e))},set(e,n,t){let r=Zr(H(e),n);if(r?.set)return r.set.call(e.draft_,t),!0;if(!e.modified_){let o=Yt(H(e),n),i=o?.[F];if(i&&i.base_===t)return e.copy_[n]=t,e.assigned_[n]=!1,!0;if(fl(t,o)&&(t!==void 0||Qt(e.base_,n)))return!0;Jt(e),de(e)}return e.copy_[n]===t&&(t!==void 0||n in e.copy_)||Number.isNaN(t)&&Number.isNaN(e.copy_[n])||(e.copy_[n]=t,e.assigned_[n]=!0),!0},deleteProperty(e,n){return Yt(e.base_,n)!==void 0||n in e.base_?(e.assigned_[n]=!1,Jt(e),de(e)):delete e.assigned_[n],e.copy_&&delete e.copy_[n],!0},getOwnPropertyDescriptor(e,n){let t=H(e),r=Reflect.getOwnPropertyDescriptor(t,n);return r&&{writable:!0,configurable:e.type_!==1||n!=="length",enumerable:r.enumerable,value:t[n]}},defineProperty(){Z(11)},getPrototypeOf(e){return $e(e.base_)},setPrototypeOf(){Z(12)}},qe={};Te(rn,(e,n)=>{qe[e]=function(){return arguments[0]=arguments[0][0],n.apply(this,arguments)}});qe.deleteProperty=function(e,n){return qe.set.call(this,e,n,void 0)};qe.set=function(e,n,t){return rn.set.call(this,e[0],n,t,e[0])};function Yt(e,n){let t=e[F];return(t?H(t):e)[n]}function yl(e,n,t){let r=Zr(n,t);return r?"value"in r?r.value:r.get?.call(e.draft_):void 0}function Zr(e,n){if(!(n in e))return;let t=$e(e);for(;t;){let r=Object.getOwnPropertyDescriptor(t,n);if(r)return r;t=$e(t)}}function de(e){e.modified_||(e.modified_=!0,e.parent_&&de(e.parent_))}function Jt(e){e.copy_||(e.copy_=Zt(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var vl=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(n,t,r)=>{if(typeof n=="function"&&typeof t!="function"){let i=t;t=n;let l=this;return function(s=i,...d){return l.produce(s,a=>t.call(this,a,...d))}}typeof t!="function"&&Z(6),r!==void 0&&typeof r!="function"&&Z(7);let o;if(ce(n)){let i=qr(this),l=We(n,void 0),u=!0;try{o=t(l),u=!1}finally{u?tn(i):nn(i)}return Kr(i,r),Wr(o,i)}else if(!n||typeof n!="object"){if(o=t(n),o===void 0&&(o=n),o===Yr&&(o=void 0),this.autoFreeze_&&De(o,!0),r){let i=[],l=[];Se("Patches").generateReplacementPatches_(n,o,i,l),r(i,l)}return o}else Z(1,n)},this.produceWithPatches=(n,t)=>{if(typeof n=="function")return(l,...u)=>this.produceWithPatches(l,s=>n(s,...u));let r,o;return[this.produce(n,t,(l,u)=>{r=l,o=u}),r,o]},typeof e?.autoFreeze=="boolean"&&this.setAutoFreeze(e.autoFreeze),typeof e?.useStrictShallowCopy=="boolean"&&this.setUseStrictShallowCopy(e.useStrictShallowCopy)}createDraft(e){ce(e)||Z(8),Ve(e)&&(e=Sl(e));let n=qr(this),t=We(e,void 0);return t[F].isManual_=!0,nn(n),t}finishDraft(e,n){let t=e&&e[F];(!t||!t.isManual_)&&Z(9);let{scope_:r}=t;return Kr(r,n),Wr(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}applyPatches(e,n){let t;for(t=n.length-1;t>=0;t--){let o=n[t];if(o.path.length===0&&o.op==="replace"){e=o.value;break}}t>-1&&(n=n.slice(t+1));let r=Se("Patches").applyPatches_;return Ve(e)?r(e,n):this.produce(e,o=>r(o,n))}};function We(e,n){let t=pt(e)?Se("MapSet").proxyMap_(e,n):mt(e)?Se("MapSet").proxySet_(e,n):_l(e,n);return(n?n.scope_:dt()).drafts_.push(t),t}function Sl(e){return Ve(e)||Z(10,e),eo(e)}function eo(e){if(!ce(e)||ht(e))return e;let n=e[F],t;if(n){if(!n.modified_)return n.base_;n.finalized_=!0,t=Zt(e,n.scope_.immer_.useStrictShallowCopy_)}else t=Zt(e,!0);return Te(t,(r,o)=>{Qr(t,r,eo(o))}),n&&(n.finalized_=!1),t}function _t(){class e extends Map{constructor(s,d){super(),this[F]={type_:2,parent_:d,scope_:d?d.scope_:dt(),modified_:!1,finalized_:!1,copy_:void 0,assigned_:void 0,base_:s,draft_:this,isManual_:!1,revoked_:!1}}get size(){return H(this[F]).size}has(s){return H(this[F]).has(s)}set(s,d){let a=this[F];return l(a),(!H(a).has(s)||H(a).get(s)!==d)&&(t(a),de(a),a.assigned_.set(s,!0),a.copy_.set(s,d),a.assigned_.set(s,!0)),this}delete(s){if(!this.has(s))return!1;let d=this[F];return l(d),t(d),de(d),d.base_.has(s)?d.assigned_.set(s,!1):d.assigned_.delete(s),d.copy_.delete(s),!0}clear(){let s=this[F];l(s),H(s).size&&(t(s),de(s),s.assigned_=new Map,Te(s.base_,d=>{s.assigned_.set(d,!1)}),s.copy_.clear())}forEach(s,d){let a=this[F];H(a).forEach((g,f,c)=>{s.call(d,this.get(f),f,this)})}get(s){let d=this[F];l(d);let a=H(d).get(s);if(d.finalized_||!ce(a)||a!==d.base_.get(s))return a;let g=We(a,d);return t(d),d.copy_.set(s,g),g}keys(){return H(this[F]).keys()}values(){let s=this.keys();return{[Symbol.iterator]:()=>this.values(),next:()=>{let d=s.next();return d.done?d:{done:!1,value:this.get(d.value)}}}}entries(){let s=this.keys();return{[Symbol.iterator]:()=>this.entries(),next:()=>{let d=s.next();if(d.done)return d;let a=this.get(d.value);return{done:!1,value:[d.value,a]}}}}[Symbol.iterator](){return this.entries()}}function n(u,s){return new e(u,s)}function t(u){u.copy_||(u.assigned_=new Map,u.copy_=new Map(u.base_))}class r extends Set{constructor(s,d){super(),this[F]={type_:3,parent_:d,scope_:d?d.scope_:dt(),modified_:!1,finalized_:!1,copy_:void 0,base_:s,draft_:this,drafts_:new Map,revoked_:!1,isManual_:!1}}get size(){return H(this[F]).size}has(s){let d=this[F];return l(d),d.copy_?!!(d.copy_.has(s)||d.drafts_.has(s)&&d.copy_.has(d.drafts_.get(s))):d.base_.has(s)}add(s){let d=this[F];return l(d),this.has(s)||(i(d),de(d),d.copy_.add(s)),this}delete(s){if(!this.has(s))return!1;let d=this[F];return l(d),i(d),de(d),d.copy_.delete(s)||(d.drafts_.has(s)?d.copy_.delete(d.drafts_.get(s)):!1)}clear(){let s=this[F];l(s),H(s).size&&(i(s),de(s),s.copy_.clear())}values(){let s=this[F];return l(s),i(s),s.copy_.values()}entries(){let s=this[F];return l(s),i(s),s.copy_.entries()}keys(){return this.values()}[Symbol.iterator](){return this.values()}forEach(s,d){let a=this.values(),g=a.next();for(;!g.done;)s.call(d,g.value,g.value,this),g=a.next()}}function o(u,s){return new r(u,s)}function i(u){u.copy_||(u.copy_=new Set,u.base_.forEach(s=>{if(ce(s)){let d=We(s,u);u.drafts_.set(s,d),u.copy_.add(d)}else u.copy_.add(s)}))}function l(u){u.revoked_&&Z(3,JSON.stringify(H(u)))}pl("MapSet",{proxyMap_:n,proxySet_:o})}var X=new vl,to=X.produce,cs=X.produceWithPatches.bind(X),fs=X.setAutoFreeze.bind(X),gs=X.setUseStrictShallowCopy.bind(X),ps=X.applyPatches.bind(X),ms=X.createDraft.bind(X),hs=X.finishDraft.bind(X);function Oe(e){var n=P(function(){return De(typeof e=="function"?e():e,!0)}),t=n[1];return[n[0],W(function(r){t(typeof r=="function"?to(r):De(r))},[])]}function bl(e,n,t,r,o){window.Shiny.shinyapp.makeRequest(e,n,t,r,o)}function no({method:e,args:n,blobs:t}){return new Promise((r,o)=>{bl(e,n,i=>{r(i)},i=>{o(i)},t)})}function ro({patchInfo:e,patches:n,onSuccess:t,onError:r,columns:o,setData:i,setCellEditMapAtLoc:l}){let u=n.map(s=>({row_index:s.rowIndex,column_index:s.columnIndex,value:s.value}));no({method:e.key,args:[u]}).then(s=>{if(!Array.isArray(s))throw new Error("Expected a response of a list of patches");for(let a of s)if(!("row_index"in a&&"column_index"in a&&"value"in a))throw new Error("Expected list of patches containing `row_index`, `column_index`, and `value`");s=s;let d=s.map(a=>({rowIndex:a.row_index,columnIndex:a.column_index,value:a.value}));i(a=>{d.forEach(({rowIndex:g,columnIndex:f,value:c})=>{a[g][f]=c})}),d.forEach(({rowIndex:a,columnIndex:g,value:f})=>{l(a,g,c=>{c.value=f,c.state=fe.EditSuccess,c.errorTitle=void 0})}),t(d)}).catch(s=>{n.forEach(({rowIndex:d,columnIndex:a,value:g})=>{l(d,a,f=>{f.value=String(g),f.state=fe.EditFailure,f.errorTitle=String(s)})}),r(s)})}var fe={EditSaving:"EditSaving",EditSuccess:"EditSuccess",EditFailure:"EditFailure",Editing:"Editing",Ready:"Ready"},sn={EditSaving:"cell-edit-saving",EditSuccess:"cell-edit-success",EditFailure:"cell-edit-failure",Editing:"cell-edit-editing",Ready:void 0},ln=e=>e!==null&&typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"isShinyHtml")&&e.isShinyHtml===!0,on=e=>ln(e)?e.obj.html:e,oo=({containerRef:e,rowId:n,cell:t,patchInfo:r,columns:o,coldefs:i,rowIndex:l,columnIndex:u,editCellsIsAllowed:s,getSortedRowModel:d,cellEditInfo:a,cellStyle:g,cellClassName:f,setData:c,setCellEditMapAtLoc:p,selection:m})=>{let h=t.getValue(),_=t.column.columnDef.meta.isHtmlColumn,E=a?.value??h,M=a?.state??fe.Ready,O=a?.errorTitle,D=a?.isEditing??!1,L=a?.editValue??on(E),G=q(null),V=q(null),B=W(({resetIsEditing:R=!1,resetEditValue:k=!1}={resetIsEditing:!0,resetEditValue:!0})=>{p(l,u,I=>{R&&(I.isEditing=!1),k&&(I.editValue=void 0)})},[l,u,p]),Ne=R=>{R.key==="Escape"&&(R.preventDefault(),R.stopPropagation(),B(),m.focusOffset(n,0))},cn=R=>{if(R.key!=="Tab")return;R.preventDefault(),R.stopPropagation();let k=R.shiftKey,I=u;for(;;){let A=I+(k?-1:1);if(A<0||A>=i.length)return;if(I=A,i[A].meta.isHtmlColumn!==!0)break}Ce(),p(l,I,A=>{A.isEditing=!0})},Xe=R=>{if(R.key!=="Enter")return;R.preventDefault(),R.stopPropagation();let k=R.shiftKey,I=d(),A=I.rows.findIndex(Re=>Re.id===n);if(A<0)return;let ke=A+(k?-1:1);if(ke<0||ke>=I.rows.length)return;Ce();let se=I.rows[ke].index;p(se,u,Re=>{Re.isEditing=!0})},be=R=>{[Ne,Xe,cn].forEach(k=>k(R))},Ce=W(()=>{if(p(l,u,R=>{R.errorTitle=void 0}),`${on(E)}`==`${L}`){B(),p(l,u,R=>{R.state=M});return}B({resetIsEditing:!0}),p(l,u,R=>{R.state=fe.EditSaving}),ro({patchInfo:r,patches:[{rowIndex:l,columnIndex:u,value:L}],onSuccess:R=>{B({resetEditValue:!0})},onError:R=>{},columns:o,setData:c,setCellEditMapAtLoc:p})},[p,l,u,E,L,B,r,o,c,M]);N(()=>{D&&V.current&&(V.current.focus(),V.current.select())},[D]),N(()=>{if(!D||!G.current||!V.current)return;let R=A=>{G.current?.contains(A.target)&&A.stopPropagation()},k=G.current;k.addEventListener("mousedown",R);let I=A=>{A.target!==V.current&&(Ce(),B())};return document.body.addEventListener("mousedown",I),()=>{k.removeEventListener("mousedown",R),document.body.removeEventListener("mousedown",I)}},[M,Ce,l,u,D,B]);function fn(R){D&&R.target.select()}function we(R){p(l,u,k=>{k.editValue=R.target.value})}let Ee,Ae,vt=O,ge=f,_e=R=>{R&&(ge?(ge+=" ",ge+=R):ge=R)};_e(sn[D?fe.Editing:M]);let Pe=!1,Ye=null;return M===fe.EditSaving?Ae=L:(D?Ye=w.createElement("textarea",{value:String(L),onChange:we,onFocus:fn,onKeyDown:be,ref:V}):_?_e("cell-html"):s&&(_e("cell-editable"),Ee=R=>{p(l,u,k=>{k.isEditing=!0,k.editValue=on(E)})}),ln(E)?Pe=!0:Ae=at(t.column.columnDef.cell,t.getContext())),N(()=>{if(!G.current||!Pe||!ln(E))return;let R=JSON.parse(JSON.stringify(E.obj));window.Shiny.renderContentAsync(G.current,R);let k=G.current;return()=>{window.Shiny.unbindAll(k),k.replaceChildren("")}},[G,E,l,u,Pe]),w.createElement("td",{ref:G,onDoubleClick:Ee,title:vt,className:ge,style:{...g}},Ye,Ae)};var io=()=>{let[e,n]=Oe(new Map);return _t(),{cellEditMap:e,setCellEditMapAtLoc:(r,o,i)=>{n(l=>{let u=lo(r,o),s=l.get(u)??{};i(s),l.set(u,s)})}}},lo=(e,n)=>`[${e}, ${n}]`;var so=(e,n,t)=>{let r=lo(n,t);return[e.get(r)??{},r]};function yt(e,n,t){let r=Object.assign({top:0,right:0,bottom:0,left:0},t),o=e,i=o.scrollTop+r.top,l=o.scrollLeft+r.left,u=i+o.clientHeight-r.top-r.bottom,s=l+o.clientWidth-r.left-r.right;for(let d=0;d=i&&g<=u&&f>=l&&f<=s)return a}return null}function an(e,n){return document?.defaultView?.getComputedStyle(e,null)?.getPropertyValue(n)}var co=e=>{let[n,t]=P(!1),{range:r,from:o,to:i,onRangeChange:l}=e;return w.createElement(Cl,{range:r,value:[o,i],editing:n,onValueChange:u=>l(...u),onFocus:()=>t(!0),onBlur:()=>t(!1)})};var Cl=e=>{let[n,t]=e.value,{editing:r,onFocus:o}=e,[i,l]=e.range(),u=q(null),s=q(null);return w.createElement("div",{onBlur:d=>{if(!d.currentTarget.contains(d.relatedTarget))return e.onBlur()},onFocus:()=>o(),style:{display:"flex",gap:"0.5rem"}},w.createElement("input",{ref:u,className:`form-control form-control-sm ${u.current?.checkValidity()?"":"is-invalid"}`,style:{flex:"1 1 0",width:"0"},type:"number",placeholder:ao(r,"Min",i),defaultValue:n,step:"any",onChange:d=>{let a=uo(d.target.value);u.current&&(u.current.classList.toggle("is-invalid",!d.target.checkValidity()),e.onValueChange([a,t]))}}),w.createElement("input",{ref:s,className:`form-control form-control-sm ${s.current?.checkValidity()?"":"is-invalid"}`,style:{flex:"1 1 0",width:"0"},type:"number",placeholder:ao(r,"Max",l),defaultValue:t,step:"any",onChange:d=>{let a=uo(d.target.value);s.current&&(s.current.classList.toggle("is-invalid",!d.target.checkValidity()),e.onValueChange([n,a]))}}))};function ao(e,n,t){if(e)return typeof t>"u"?n:`${n} (${t})`}function uo(e){if(e!=="")return+e}function fo(e){let[n,t]=P([]),r=e?{getFilteredRowModel:Vr(),getFacetedRowModel:Tr(),getFacetedUniqueValues:Dr(),getFacetedMinMaxValues:Or(),filterFns:{substring:(o,i,l,u)=>o.getValue(i).toString().includes(l)},onColumnFiltersChange:t}:{};return{columnFilters:n,columnFiltersState:{columnFilters:n},filtersTableOptions:r,setColumnFilters:t}}var go=({header:e,className:n,...t})=>{let r=e.column.columnDef.meta?.typeHint;if(!r||r.type==="html")return null;if(r.type==="numeric"){let[o,i]=e.column.getFilterValue()??[void 0,void 0];return co({from:o,to:i,range:()=>e.column.getFacetedMinMaxValues()??[void 0,void 0],onRangeChange:(u,s)=>e.column.setFilterValue([u,s])})}return w.createElement("input",{...t,value:e.column.getFilterValue(),className:`form-control form-control-sm ${n}`,type:"text",onChange:o=>e.column.setFilterValue(o.target.value)})};var Y=class e{static{this._empty=new e(new Set)}constructor(n){this._set=n}static empty(){return this._empty}static just(...n){return this.empty().add(...n)}has(n){return this._set.has(n)}add(...n){let t=new Set(this._set.keys());for(let r of n)t.add(r);return new e(t)}toggle(n){return this.has(n)?this.delete(n):this.add(n)}delete(n){let t=new Set(this._set.keys());return t.delete(n),new e(t)}clear(){return e.empty()}[Symbol.iterator](){return this._set[Symbol.iterator]()}toList(){return[...this._set.keys()]}};var j=class e{static{this._NONE="none"}static{this._ROW_SINGLE="single"}static{this._ROW_MULTIPLE="multiple"}static{this._COL_SINGLE="single"}static{this._col_multiple="multiple"}static{this._RECT_CELL="cell"}static{this._RECT_REGION="region"}static{this._rowEnum={NONE:e._NONE,SINGLE:e._ROW_SINGLE,MULTIPLE:e._ROW_MULTIPLE}}static{this._colEnum={NONE:e._NONE,SINGLE:e._COL_SINGLE,MULTIPLE:e._col_multiple}}static{this._rectEnum={NONE:e._NONE,REGION:e._RECT_REGION,CELL:e._RECT_CELL}}constructor({row:n,col:t,rect:r}){if(!Object.values(e._rowEnum).includes(n))throw new Error(`Invalid row selection mode: ${n}`);if(!Object.values(e._colEnum).includes(t))throw new Error(`Invalid col selection mode: ${t}`);if(!Object.values(e._rectEnum).includes(r))throw new Error(`Invalid rect selection mode: ${r}`);this.row=n,this.col=t,this.rect=r}isNone(){return this.row===e._rowEnum.NONE&&this.col===e._colEnum.NONE&&this.rect===e._rectEnum.NONE}};function mo(e){return e||(e={row:"multiple",col:"none",rect:"none"}),new j({row:e.row,col:e.col,rect:e.rect})}function ho({isEditingCell:e,editCellsIsAllowed:n,selectionModes:t,keyAccessor:r,focusOffset:o,focusEscape:i,onKeyDownEnter:l,between:u}){let[s,d]=P(Y.empty()),[a,g]=P(null),f=m=>{if(t.isNone())return;let h=m.currentTarget,_=r(h);if(e&&h.classList.contains(sn[fe.Editing]))return;let E=wl(t,u,s,m,_,a);E&&(d(E.selection),E.anchor&&(g(_),h.focus()),m.preventDefault())},c=m=>{if(e||t.isNone())return;let h=m.currentTarget,_=r(h),E=s.has(_);if(m.key==="Escape"){i(h),m.preventDefault();return}if(t.row===j._rowEnum.SINGLE){if(m.key===" "||m.key==="Enter")m.preventDefault(),n&&m.key==="Enter"?l(h):s.has(_)?d(Y.empty()):d(Y.just(_));else if(m.key==="ArrowUp"||m.key==="ArrowDown"){let M=o(_,m.key==="ArrowUp"?-1:1);M&&(m.preventDefault(),E&&d(Y.just(M)))}}else t.row===j._rowEnum.MULTIPLE&&(m.key===" "||m.key==="Enter"?(m.preventDefault(),n&&m.key==="Enter"?l(h):d(s.toggle(_))):(m.key==="ArrowUp"||m.key==="ArrowDown")&&o(_,m.key==="ArrowUp"?-1:1)&&m.preventDefault())};return{has(m){return s.has(m)},set(m,h){d(h?s.add(m):s.delete(m))},setMultiple(m){d(Y.just(...m))},clear(){d(s.clear())},keys(){return s},itemHandlers(){return{onMouseDown:f,onKeyDown:c}},focusOffset:o}}var po=/^mac/i.test(window.navigator.userAgentData?.platform??window.navigator.platform);function wl(e,n,t,r,o,i){let{shiftKey:l,altKey:u}=r,s=po?r.metaKey:r.ctrlKey;if((po?r.ctrlKey:r.metaKey)||u||e.row===j._rowEnum.NONE)return null;if(e.row===j._rowEnum.SINGLE)return s&&!l?t.has(o)?{selection:Y.empty(),anchor:!0}:{selection:Y.just(o),anchor:!0}:{selection:Y.just(o),anchor:!0};if(e.row===j._rowEnum.MULTIPLE)if(l&&s){if(i!==null&&n){let a=n(i,o);return{selection:t.add(...a)}}}else{if(s)return{selection:t.toggle(o),anchor:!0};if(l){if(i!==null&&n){let a=n(i,o);return{selection:Y.just(...a)}}}else return{selection:Y.just(o),anchor:!0}}else throw new Error(`Unsupported row selection mode: ${e.row}`);return null}function _o({getColDefs:e}){let[n,t]=P([]);return{sorting:n,sortTableStateOptions:{sorting:n},sortTableOptions:{onSortingChange:r=>{let o=typeof r=="function"?r(n):r,i=e(),l=new Set(i.filter(s=>s.meta.isHtmlColumn).map(s=>s.header)),u=l.size==0?o:o.filter(s=>!l.has(s.id));t(u)},getSortedRowModel:Nr()},setSorting:t}}var yo="sort-arrow",vo={viewBox:[-1,-1,2,2].map(e=>e*1.4).join(" "),width:"100%",height:"100%",style:{paddingLeft:"3px"}},So={stroke:"#333333",strokeWidth:"0.6",fill:"transparent"},El=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",...vo,className:`${yo} sort-arrow-up`},w.createElement("path",{d:"M -1 0.5 L 0 -0.5 L 1 0.5",...So,strokeLinecap:"round"})),Rl=w.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",...vo,className:`${yo} sort-arrow-down`},w.createElement("path",{d:"M -1 -0.5 L 0 0.5 L 1 -0.5",...So,strokeLinecap:"round"})),bo=({direction:e})=>{if(!e)return null;if(e==="asc")return El;if(e==="desc")return Rl;throw new Error(`Unexpected sort direction: '${e}'`)};_t();var Co=({location:e,rowIndex:n,columnIndex:t})=>`[${e}, ${n}, ${t}]`,wo=({initStyleInfos:e,nrow:n,ncol:t})=>{let[r,o]=Oe(new Map),i=W(s=>{let{location:d,rows:a,cols:g}=s;o(f=>{let c=a??Array.from({length:n},(m,h)=>h),p=g??Array.from({length:t},(m,h)=>h);for(let m of c)for(let h of p){let _=Co({location:d,rowIndex:m,columnIndex:h}),E=f.get(_)??{style:{},class:void 0},M;E.class?s.class?M=`${E.class} ${s.class}`:M=E.class:s.class?M=s.class:M=void 0,f.set(_,{location:d,rowIndex:m,columnIndex:h,style:{...E.style,...s.style},class:M})}})},[t,n,o]),l=W(()=>{o(s=>{s.clear()})},[o]),u=W(s=>{l();for(let d of s)i(d)},[i,l]);return N(()=>{u(e)},[e,u]),{styleInfoMap:r,setStyleInfo:i,setStyleInfos:u,resetStyleInfos:l}};var Eo=(e,n,t,r)=>{let o=Co({location:n,rowIndex:t,columnIndex:r}),i=e.get(o);return{cellStyle:i?.style,cellClassName:i?.class}},ba=document.createElement("cssStringToObj");var Ro=` /* * * # Variables @@ -256,7 +256,7 @@ shiny-data-frame .shiny-data-grid > table > tbody > tr > td.cell-edit-saving { shiny-data-frame .shiny-data-grid > table > tbody > tr > td.cell-edit-failure { outline: 2px var(--shiny-datagrid-table-cell-edit-failure-border-style) var(--shiny-datagrid-table-cell-edit-failure-border-color); background-color: var(--shiny-datagrid-table-cell-edit-failure-bgcolor); -}`;function Ro(e,n,t){let[r,o]=P(0),i=C.useCallback(u=>{o(-1),u.target===u.currentTarget&&_t(e,n(),t)?.focus()},[e,n,t]),l=C.useCallback(u=>{o(0)},[]);return{containerTabIndex:r,containerHandlers:{onFocus:i,onBlur:l}}}function xo(e,n,t,r,o){return te(()=>{let i=e??!0;if(!i)return null;let l=typeof i=="string"?i:"Viewing rows {start} through {end} of {total}";if(!n||t.length===0||!r)return null;let u=n.scrollTop+r.clientHeight,s=n.scrollTop+n.clientHeight,[d,a]=El(u,s,t,(m,p)=>m.start+m.size/2);if(d===null||a===null)return null;let g=t[d],f=t[a];if(g.index===0&&f.index===o-1)return null;let c=Rl(l,g.index+1,f.index+1,o);return C.createElement("div",{className:"shiny-data-grid-summary"},c)},[e,n,t,r,o])}function El(e,n,t,r){let o=null,i=null;for(let l=0;l=e&&(o=l,i=l);else if(r(u,!1)<=n)i=l;else break}return[o,i]}function Rl(e,n,t,r){return e.replace(/\{(start|end|total)\}/g,(o,i)=>i==="start"?n+"":i==="end"?t+"":i==="total"?r+"":o)}var xl=({id:e,gridInfo:{payload:n,patchInfo:t,selectionModes:r},bgcolor:o})=>{let{columns:i,typeHints:l,data:u,options:s}=n,{width:d,height:a,fill:g,filters:f}=s,c=K(null),m=K(null),p=K(null),h=wo({initStyleInfos:s.styles,nrow:u.length,ncol:i.length}),_=h.styleInfoMap,{resetStyleInfos:x,setStyleInfos:V}=h,I=oo(),O=I.cellEditMap,L=I.setCellEditMapAtLoc,G=s.editable===!0,T=te(()=>{for(let v of O.values())if(v.isEditing)return!0;return!1},[O]),re=te(()=>i.map((v,S)=>{let b=l?.[S],R=b?.type==="html",z=R?!1:void 0;return{accessorFn:(B,Po)=>B[S],filterFn:b?.type==="numeric"?"inNumberRange":"includesString",header:v,meta:{colIndex:S,isHtmlColumn:R,typeHint:b},cell:({getValue:B})=>B(),enableSorting:z}}),[i,l]),dn=te(()=>u,[u]),We=Oe(u),be=We[0],we=We[1],Ce=ho({getColDefs:()=>re}),Ee=Ce.sorting,Ne=Ce.sortTableStateOptions,yt=Ce.sortTableOptions,ge=Ce.setSorting,{columnFilters:_e,columnFiltersState:Ae,filtersTableOptions:Xe,setColumnFilters:E}=co(f),k={data:be,columns:re,state:{...Ne,...Ae},getCoreRowModel:Fr(),...yt,...Xe},F=Nr(k),A=Gr({count:F.getFilteredRowModel().rows.length,getScrollElement:()=>c.current,estimateSize:()=>31,paddingStart:m.current?.clientHeight??0,scrollingDelay:10});le(()=>{A.scrollToOffset(0)},[n,A]);let Pe=A.getTotalSize(),se=A.getVirtualItems(),Re=(se.length>0&&se?.[0]?.start||0)-(m.current?.clientHeight??0),fn=se.length>0?Pe-(se?.[se.length-1]?.end||0):0,Io=xo(s.summary,c?.current,se,m.current,A.options.count),gn=s.style??"grid",$o=gn==="grid"?"shiny-data-grid-grid":"shiny-data-grid-table",Vo=gn==="table"?"table table-sm":null,Z=po(r),Il=!Z.isNone(),To=Z.row!==U._rowEnum.NONE,ee=mo({isEditingCell:T,editCellsIsAllowed:G,selectionModes:Z,keyAccessor:v=>v.dataset.key,focusEscape:v=>{setTimeout(()=>{v?.blur(),c.current?.focus()},0)},focusOffset:(v,S=0)=>{let b=F.getSortedRowModel(),R=b.rows.findIndex(B=>B.id===v);if(R<0||(R+=S,R<0||R>=b.rows.length))return null;let z=b.rows[R].id;return A.scrollToIndex(R),setTimeout(()=>{c.current?.querySelector(`[data-key='${z}']`)?.focus()},0),z},between:(v,S)=>Ml(F.getSortedRowModel(),v,S),onKeyDownEnter:v=>{let S=Array(...v.childNodes.values()).filter(z=>z instanceof HTMLElement&&z.classList.contains("cell-editable"));if(S.length===0)return;let b=_t(c.current,S);if(!b)return;let R=new MouseEvent("dblclick",{bubbles:!0,cancelable:!0});b.dispatchEvent(R)}});N(()=>{let v=b=>{let R=b.detail.cellSelection;if(R.type==="none"){ee.clear();return}else if(R.type==="row"){ee.setMultiple(R.rows.map(String));return}else console.error("Unhandled cell selection update:",R)};if(!e)return;let S=document.getElementById(e);if(S)return S.addEventListener("updateCellSelection",v),()=>{S.removeEventListener("updateCellSelection",v)}},[e,ee,be]),N(()=>{let v=b=>{let R=b.detail.sort,z=[];R.map(B=>{z.push({id:i[B.col],desc:B.desc})}),ge(z)};if(!e)return;let S=document.getElementById(e);if(S)return S.addEventListener("updateColumnSort",v),()=>{S.removeEventListener("updateColumnSort",v)}},[i,e,ge]),N(()=>{let v=b=>{let R=b.detail.filter,z=[];R.map(B=>{z.push({id:i[B.col],value:B.value})}),E(z)};if(!e)return;let S=document.getElementById(e);if(S)return S.addEventListener("updateColumnFilter",v),()=>{S.removeEventListener("updateColumnFilter",v)}},[i,e,E]),N(()=>{let v=b=>{let R=b.detail.styles;x(),V(R)};if(!e)return;let S=document.getElementById(e);if(S)return S.addEventListener("updateStyles",v),()=>{S.removeEventListener("updateStyles",v)}},[V]),N(()=>{if(!e)return;let v=null;if(Z.isNone())v=null;else if(Z.row!==U._rowEnum.NONE){let S=ee.keys().toList(),b=F.getSortedRowModel().rowsById;v={type:"row",rows:S.map(R=>R in b?b[R].index:null).filter(R=>R!==null)}}else console.error("Unhandled row selection mode:",Z);Shiny.setInputValue(`${e}_cell_selection`,v)},[e,ee,Z,F,F.getSortedRowModel]),N(()=>{if(!e)return;let v=[];Ee.map(S=>{let b=i.indexOf(S.id);v.push({col:b,desc:S.desc})}),Shiny.setInputValue(`${e}_sort`,v),Shiny.setInputValue(`${e}_column_sort`,v)},[i,e,Ee]),N(()=>{if(!e)return;let v=[];_e.map(S=>{let b=i.indexOf(S.id);v.push({col:b,value:S.value})}),Shiny.setInputValue(`${e}_filter`,v),Shiny.setInputValue(`${e}_column_filter`,v)},[e,_e,i]),N(()=>{if(!e)return;let v=F.getSortedRowModel().rows.map(S=>S.index);Shiny.setInputValue(`${e}_data_view_rows`,v),Shiny.setInputValue(`${e}_data_view_indices`,v)},[e,F,Ee,_e]),N(()=>{if(!e)return;let v=null;if(Z.row!==U._rowEnum.NONE){let S=ee.keys().toList(),b=F.getSortedRowModel().rowsById;v=S.map(R=>R in b?b[R].index:null).filter(R=>R!==null).sort()}Shiny.setInputValue(`${e}_selected_rows`,v)},[e,ee,Z,F]);let Do=C.useCallback(()=>p.current.querySelectorAll("[tabindex='-1']"),[p.current]),pn=Ro(c.current,Do,{top:m.current?.clientHeight??0});N(()=>()=>{F.resetSorting(),ee.clear()},[n]);let Oo=F.getHeaderGroups().length,mn=be.length>0?"scrolling":"",hn=c.current?.scrollHeight,_n=c.current?.clientHeight;hn&&_n&&hn<=_n&&(mn="");let No=v=>S=>{(S.key===" "||S.key==="Enter")&&v.toggleSorting(void 0,S.shiftKey)},Ao=Fl(A),yn=`shiny-data-grid ${$o} ${mn}`;g&&(yn+=" html-fill-item");let vn=Z.row!==U._rowEnum.NONE;return C.createElement(C.Fragment,null,C.createElement("div",{className:yn,ref:c,style:{width:d,height:a,overflow:"auto"}},C.createElement("table",{className:Vo+(f?" filtering":""),"aria-rowcount":be.length,"aria-multiselectable":To,style:{width:d===null||d==="auto"?void 0:"100%"}},C.createElement("thead",{ref:m,style:{backgroundColor:o}},F.getHeaderGroups().map((v,S)=>C.createElement("tr",{key:v.id,"aria-rowindex":S+1},vn&&C.createElement("th",{className:"table-corner"}),v.headers.map(b=>{let R=b.isPlaceholder?void 0:C.createElement("div",{style:{cursor:b.column.getCanSort()?"pointer":void 0,userSelect:b.column.getCanSort()?"none":void 0}},st(b.column.columnDef.header,b.getContext()),C.createElement(So,{direction:b.column.getIsSorted()}));return C.createElement("th",{key:b.id,colSpan:b.colSpan,style:{width:b.getSize()},scope:"col",tabIndex:0,onClick:b.column.getToggleSortingHandler(),onKeyDown:No(b.column),className:b.column.getCanSort()?void 0:"header-html"},R)}))),f&&C.createElement("tr",{className:"filters"},vn&&C.createElement("th",{className:"table-corner"}),F.getFlatHeaders().map(v=>C.createElement("th",{key:`filter-${v.id}`},C.createElement(fo,{header:v}))))),C.createElement("tbody",{ref:p,tabIndex:pn.containerTabIndex,...pn.containerHandlers},Re>0&&C.createElement("tr",{style:{height:`${Re}px`}}),se.map(v=>{let S=F.getRowModel().rows[v.index];return S&&C.createElement("tr",{key:v.key,"data-index":v.index,"aria-rowindex":v.index+Oo,"data-key":S.id,ref:Ao,"aria-selected":ee.has(S.id),tabIndex:-1,...ee.itemHandlers()},Z.row!==U._rowEnum.NONE&&C.createElement("td",{className:"row-number"},S.index+1),S.getVisibleCells().map(b=>{let R=b.row.index,z=b.column.columnDef.meta.colIndex,[B,Po]=lo(O,R,z),ko=Co(_,"body",R,z);return C.createElement(ro,{key:b.id,rowId:b.row.id,containerRef:c,cell:b,patchInfo:t,editCellsIsAllowed:G,columns:i,coldefs:re,rowIndex:R,columnIndex:z,getSortedRowModel:F.getSortedRowModel,cellEditInfo:B,cellStyle:ko,setData:we,setCellEditMapAtLoc:L,selection:ee})}))}),fn>0&&C.createElement("tr",{style:{height:`${fn}px`}})))),Io)};function Ml(e,n,t){let r=e.rows.findIndex(l=>l.id===n),o=e.rows.findIndex(l=>l.id===t);if(r<0||o<0)return[];r>o&&([r,o]=[o,r]);let i=[];for(let l=r;l<=o;l++)i.push(e.rows[l].id);return i}function Fl(e){let n=K([]),t=q(r=>{r&&(r.isConnected?e.measureElement(r):n.current.push(r))},[e]);return le(()=>{n.current.length>0&&n.current.splice(0).forEach(e.measureElement)}),t}var an=class extends Shiny.OutputBinding{find(n){return $(n).find("shiny-data-frame")}renderValue(n,t){n.renderValue(t)}renderError(n,t){n.classList.add("shiny-output-error"),n.renderError(t)}clearError(n){n.classList.remove("shiny-output-error"),n.clearError()}};Shiny.outputBindings.register(new an,"shinyDataFrame");function Mo(e){if(!e)return;let n=sn(e,"background-color");if(!n)return n;let t=n.match(/^rgba\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/);if(n==="transparent"||t&&parseFloat(t[4])===0){let r=sn(e,"background-image");return r&&r!=="none"?void 0:Mo(e.parentElement)}return n}var Fo=document.createElement("template");Fo.innerHTML=``;var un=class extends HTMLElement{connectedCallback(){let[t]=[this];t.appendChild(Fo.content.cloneNode(!0)),this.errorRoot=document.createElement("span"),t.appendChild(this.errorRoot);let r=document.createElement("div");r.classList.add("html-fill-container","html-fill-item"),t.appendChild(r),this.reactRoot=Br(r);let o=this.querySelector("script.data");if(o){let i=JSON.parse(o.innerText);this.renderValue(i)}}renderValue(t){if(this.clearError(),!t){this.reactRoot.render(null);return}this.reactRoot.render(C.createElement(Ot,null,C.createElement(xl,{id:this.id,gridInfo:t,bgcolor:Mo(this)})))}renderError(t){this.reactRoot.render(null),this.errorRoot.innerText=t.message}clearError(){this.reactRoot.render(null),this.errorRoot.innerText=""}};customElements.define("shiny-data-frame",un);$(function(){Shiny.addCustomMessageHandler("shinyDataFrameMessage",function(e){let n=new CustomEvent(e.handler,{detail:e.obj});document.getElementById(e.id)?.dispatchEvent(n)})});export{un as ShinyDataFrameOutput}; +}`;function xo(e,n,t){let[r,o]=P(0),i=w.useCallback(u=>{o(-1),u.target===u.currentTarget&&yt(e,n(),t)?.focus()},[e,n,t]),l=w.useCallback(u=>{o(0)},[]);return{containerTabIndex:r,containerHandlers:{onFocus:i,onBlur:l}}}function Mo(e,n,t,r,o){return ne(()=>{let i=e??!0;if(!i)return null;let l=typeof i=="string"?i:"Viewing rows {start} through {end} of {total}";if(!n||t.length===0||!r)return null;let u=n.scrollTop+r.clientHeight,s=n.scrollTop+n.clientHeight,[d,a]=xl(u,s,t,(p,m)=>p.start+p.size/2);if(d===null||a===null)return null;let g=t[d],f=t[a];if(g.index===0&&f.index===o-1)return null;let c=Ml(l,g.index+1,f.index+1,o);return w.createElement("div",{className:"shiny-data-grid-summary"},c)},[e,n,t,r,o])}function xl(e,n,t,r){let o=null,i=null;for(let l=0;l=e&&(o=l,i=l);else if(r(u,!1)<=n)i=l;else break}return[o,i]}function Ml(e,n,t,r){return e.replace(/\{(start|end|total)\}/g,(o,i)=>i==="start"?n+"":i==="end"?t+"":i==="total"?r+"":o)}var Fl=({id:e,gridInfo:{payload:n,patchInfo:t,selectionModes:r},bgcolor:o})=>{let{columns:i,typeHints:l,data:u,options:s={width:void 0,height:void 0,fill:!1,styles:[]}}=n,{width:d,height:a,fill:g,filters:f,styles:c}=s,p=q(null),m=q(null),h=q(null),_=wo({initStyleInfos:c??[],nrow:u.length,ncol:i.length}),E=_.styleInfoMap,{resetStyleInfos:M,setStyleInfos:O}=_,D=io(),L=D.cellEditMap,G=D.setCellEditMapAtLoc,V=s.editable===!0,B=ne(()=>{for(let v of L.values())if(v.isEditing)return!0;return!1},[L]),Ne=ne(()=>i.map((v,S)=>{let b=l?.[S],x=b?.type==="html",z=x?!1:void 0;return{accessorFn:(U,ko)=>U[S],filterFn:b?.type==="numeric"?"inNumberRange":"includesString",header:v,meta:{colIndex:S,isHtmlColumn:x,typeHint:b},cell:({getValue:U})=>U(),enableSorting:z}}),[i,l]),cn=ne(()=>u,[u]),Xe=Oe(u),be=Xe[0],Ce=Xe[1],we=_o({getColDefs:()=>Ne}),Ee=we.sorting,Ae=we.sortTableStateOptions,vt=we.sortTableOptions,ge=we.setSorting,{columnFilters:_e,columnFiltersState:Pe,filtersTableOptions:Ye,setColumnFilters:R}=fo(f),k={data:be,columns:Ne,state:{...Ae,...Pe},getCoreRowModel:Ir(),...vt,...Ye},I=Ar(k),A=Br({count:I.getFilteredRowModel().rows.length,getScrollElement:()=>p.current,estimateSize:()=>31,paddingStart:m.current?.clientHeight??0,scrollingDelay:10});le(()=>{A.scrollToOffset(0)},[n,A]);let ke=A.getTotalSize(),se=A.getVirtualItems(),Re=(se.length>0&&se?.[0]?.start||0)-(m.current?.clientHeight??0),gn=se.length>0?ke-(se?.[se.length-1]?.end||0):0,$o=Mo(s.summary,p?.current,se,m.current,A.options.count),pn=s.style??"grid",Vo=pn==="grid"?"shiny-data-grid-grid":"shiny-data-grid-table",To=pn==="table"?"table table-sm":null,ee=mo(r),Vl=!ee.isNone(),Do=ee.row!==j._rowEnum.NONE,te=ho({isEditingCell:B,editCellsIsAllowed:V,selectionModes:ee,keyAccessor:v=>v.dataset.key,focusEscape:v=>{setTimeout(()=>{v?.blur(),p.current?.focus()},0)},focusOffset:(v,S=0)=>{let b=I.getSortedRowModel(),x=b.rows.findIndex(U=>U.id===v);if(x<0||(x+=S,x<0||x>=b.rows.length))return null;let z=b.rows[x].id;return A.scrollToIndex(x),setTimeout(()=>{p.current?.querySelector(`[data-key='${z}']`)?.focus()},0),z},between:(v,S)=>Il(I.getSortedRowModel(),v,S),onKeyDownEnter:v=>{let S=Array(...v.childNodes.values()).filter(z=>z instanceof HTMLElement&&z.classList.contains("cell-editable"));if(S.length===0)return;let b=yt(p.current,S);if(!b)return;let x=new MouseEvent("dblclick",{bubbles:!0,cancelable:!0});b.dispatchEvent(x)}});N(()=>{let v=b=>{let x=b.detail.cellSelection;if(x.type==="none"){te.clear();return}else if(x.type==="row"){te.setMultiple(x.rows.map(String));return}else console.error("Unhandled cell selection update:",x)};if(!e)return;let S=document.getElementById(e);if(S)return S.addEventListener("updateCellSelection",v),()=>{S.removeEventListener("updateCellSelection",v)}},[e,te,be]),N(()=>{let v=b=>{let x=b.detail.sort,z=[];x.map(U=>{z.push({id:i[U.col],desc:U.desc})}),ge(z)};if(!e)return;let S=document.getElementById(e);if(S)return S.addEventListener("updateColumnSort",v),()=>{S.removeEventListener("updateColumnSort",v)}},[i,e,ge]),N(()=>{let v=b=>{let x=b.detail.filter,z=[];x.map(U=>{z.push({id:i[U.col],value:U.value})}),R(z)};if(!e)return;let S=document.getElementById(e);if(S)return S.addEventListener("updateColumnFilter",v),()=>{S.removeEventListener("updateColumnFilter",v)}},[i,e,R]),N(()=>{let v=b=>{let x=b.detail.styles;O(x)};if(!e)return;let S=document.getElementById(e);if(S)return S.addEventListener("updateStyles",v),()=>{S.removeEventListener("updateStyles",v)}},[e,O]),N(()=>{if(!e)return;let v=null;if(ee.isNone())v=null;else if(ee.row!==j._rowEnum.NONE){let S=te.keys().toList(),b=I.getSortedRowModel().rowsById;v={type:"row",rows:S.map(x=>x in b?b[x].index:null).filter(x=>x!==null)}}else console.error("Unhandled row selection mode:",ee);Shiny.setInputValue(`${e}_cell_selection`,v)},[e,te,ee,I,I.getSortedRowModel]),N(()=>{if(!e)return;let v=[];Ee.map(S=>{let b=i.indexOf(S.id);v.push({col:b,desc:S.desc})}),Shiny.setInputValue(`${e}_sort`,v),Shiny.setInputValue(`${e}_column_sort`,v)},[i,e,Ee]),N(()=>{if(!e)return;let v=[];_e.map(S=>{let b=i.indexOf(S.id);v.push({col:b,value:S.value})}),Shiny.setInputValue(`${e}_filter`,v),Shiny.setInputValue(`${e}_column_filter`,v)},[e,_e,i]),N(()=>{if(!e)return;let v=I.getSortedRowModel().rows.map(S=>S.index);Shiny.setInputValue(`${e}_data_view_rows`,v),Shiny.setInputValue(`${e}_data_view_indices`,v)},[e,I,Ee,_e]),N(()=>{if(!e)return;let v=null;if(ee.row!==j._rowEnum.NONE){let S=te.keys().toList(),b=I.getSortedRowModel().rowsById;v=S.map(x=>x in b?b[x].index:null).filter(x=>x!==null).sort()}Shiny.setInputValue(`${e}_selected_rows`,v)},[e,te,ee,I]);let Oo=w.useCallback(()=>h.current.querySelectorAll("[tabindex='-1']"),[h.current]),mn=xo(p.current,Oo,{top:m.current?.clientHeight??0});N(()=>()=>{I.resetSorting(),te.clear()},[n]);let No=I.getHeaderGroups().length,hn=be.length>0?"scrolling":"",_n=p.current?.scrollHeight,yn=p.current?.clientHeight;_n&&yn&&_n<=yn&&(hn="");let Ao=v=>S=>{(S.key===" "||S.key==="Enter")&&v.toggleSorting(void 0,S.shiftKey)},Po=$l(A),vn=`shiny-data-grid ${Vo} ${hn}`;g&&(vn+=" html-fill-item");let Sn=ee.row!==j._rowEnum.NONE;return w.createElement(w.Fragment,null,w.createElement("div",{className:vn,ref:p,style:{width:d,height:a,overflow:"auto"}},w.createElement("table",{className:To+(f?" filtering":""),"aria-rowcount":be.length,"aria-multiselectable":Do,style:{width:d===null||d==="auto"?void 0:"100%"}},w.createElement("thead",{ref:m,style:{backgroundColor:o}},I.getHeaderGroups().map((v,S)=>w.createElement("tr",{key:v.id,"aria-rowindex":S+1},Sn&&w.createElement("th",{className:"table-corner"}),v.headers.map(b=>{let x=b.isPlaceholder?void 0:w.createElement("div",{style:{cursor:b.column.getCanSort()?"pointer":void 0,userSelect:b.column.getCanSort()?"none":void 0}},at(b.column.columnDef.header,b.getContext()),w.createElement(bo,{direction:b.column.getIsSorted()}));return w.createElement("th",{key:b.id,colSpan:b.colSpan,style:{width:b.getSize()},scope:"col",tabIndex:0,onClick:b.column.getToggleSortingHandler(),onKeyDown:Ao(b.column),className:b.column.getCanSort()?void 0:"header-html"},x)}))),f&&w.createElement("tr",{className:"filters"},Sn&&w.createElement("th",{className:"table-corner"}),I.getFlatHeaders().map(v=>w.createElement("th",{key:`filter-${v.id}`},w.createElement(go,{header:v}))))),w.createElement("tbody",{ref:h,tabIndex:mn.containerTabIndex,...mn.containerHandlers},Re>0&&w.createElement("tr",{style:{height:`${Re}px`}}),se.map(v=>{let S=I.getRowModel().rows[v.index];return S&&w.createElement("tr",{key:v.key,"data-index":v.index,"aria-rowindex":v.index+No,"data-key":S.id,ref:Po,"aria-selected":te.has(S.id),tabIndex:-1,...te.itemHandlers()},ee.row!==j._rowEnum.NONE&&w.createElement("td",{className:"row-number"},S.index+1),S.getVisibleCells().map(b=>{let x=b.row.index,z=b.column.columnDef.meta.colIndex,[U,ko]=so(L,x,z),{cellStyle:Lo,cellClassName:Ho}=Eo(E,"body",x,z);return w.createElement(oo,{key:b.id,rowId:b.row.id,containerRef:p,cell:b,patchInfo:t,editCellsIsAllowed:V,columns:i,coldefs:Ne,rowIndex:x,columnIndex:z,getSortedRowModel:I.getSortedRowModel,cellEditInfo:U,cellStyle:Lo,cellClassName:Ho,setData:Ce,setCellEditMapAtLoc:G,selection:te})}))}),gn>0&&w.createElement("tr",{style:{height:`${gn}px`}})))),$o)};function Il(e,n,t){let r=e.rows.findIndex(l=>l.id===n),o=e.rows.findIndex(l=>l.id===t);if(r<0||o<0)return[];r>o&&([r,o]=[o,r]);let i=[];for(let l=r;l<=o;l++)i.push(e.rows[l].id);return i}function $l(e){let n=q([]),t=W(r=>{r&&(r.isConnected?e.measureElement(r):n.current.push(r))},[e]);return le(()=>{n.current.length>0&&n.current.splice(0).forEach(e.measureElement)}),t}var un=class extends Shiny.OutputBinding{find(n){return $(n).find("shiny-data-frame")}renderValue(n,t){n.renderValue(t)}renderError(n,t){n.classList.add("shiny-output-error"),n.renderError(t)}clearError(n){n.classList.remove("shiny-output-error"),n.clearError()}};Shiny.outputBindings.register(new un,"shinyDataFrame");function Fo(e){if(!e)return;let n=an(e,"background-color");if(!n)return n;let t=n.match(/^rgba\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/);if(n==="transparent"||t&&parseFloat(t[4])===0){let r=an(e,"background-image");return r&&r!=="none"?void 0:Fo(e.parentElement)}return n}var Io=document.createElement("template");Io.innerHTML=``;var dn=class extends HTMLElement{connectedCallback(){let[t]=[this];t.appendChild(Io.content.cloneNode(!0)),this.errorRoot=document.createElement("span"),t.appendChild(this.errorRoot);let r=document.createElement("div");r.classList.add("html-fill-container","html-fill-item"),t.appendChild(r),this.reactRoot=Ur(r);let o=this.querySelector("script.data");if(o){let i=JSON.parse(o.innerText);this.renderValue(i)}}renderValue(t){if(this.clearError(),!t){this.reactRoot.render(null);return}this.reactRoot.render(w.createElement(Nt,null,w.createElement(Fl,{id:this.id,gridInfo:t,bgcolor:Fo(this)})))}renderError(t){this.reactRoot.render(null),this.errorRoot.innerText=t.message}clearError(){this.reactRoot.render(null),this.errorRoot.innerText=""}};customElements.define("shiny-data-frame",dn);$(function(){Shiny.addCustomMessageHandler("shinyDataFrameMessage",function(e){let n=new CustomEvent(e.handler,{detail:e.obj});document.getElementById(e.id)?.dispatchEvent(n)})});export{dn as ShinyDataFrameOutput}; /*! Bundled license information: @tanstack/table-core/build/lib/index.mjs: diff --git a/shiny/www/py-shiny/data-frame/data-frame.js.map b/shiny/www/py-shiny/data-frame/data-frame.js.map index 13a9bbe4d..aa6b66d53 100644 --- a/shiny/www/py-shiny/data-frame/data-frame.js.map +++ b/shiny/www/py-shiny/data-frame/data-frame.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../../js/node_modules/preact/src/util.js", "../../../../js/node_modules/preact/src/options.js", "../../../../js/node_modules/preact/src/create-element.js", "../../../../js/node_modules/preact/src/component.js", "../../../../js/node_modules/preact/src/create-context.js", "../../../../js/node_modules/preact/src/constants.js", "../../../../js/node_modules/preact/src/diff/children.js", "../../../../js/node_modules/preact/src/diff/props.js", "../../../../js/node_modules/preact/src/diff/index.js", "../../../../js/node_modules/preact/src/render.js", "../../../../js/node_modules/preact/src/clone-element.js", "../../../../js/node_modules/preact/src/diff/catch-error.js", "../../../../js/node_modules/preact/hooks/src/index.js", "../../../../js/node_modules/preact/compat/src/util.js", "../../../../js/node_modules/preact/compat/src/PureComponent.js", "../../../../js/node_modules/preact/compat/src/memo.js", "../../../../js/node_modules/preact/compat/src/forwardRef.js", "../../../../js/node_modules/preact/compat/src/Children.js", "../../../../js/node_modules/preact/compat/src/suspense.js", "../../../../js/node_modules/preact/compat/src/suspense-list.js", "../../../../js/node_modules/preact/compat/src/portals.js", "../../../../js/node_modules/preact/compat/src/render.js", "../../../../js/node_modules/preact/compat/src/index.js", "../../../../js/node_modules/@tanstack/table-core/src/utils.ts", "../../../../js/node_modules/@tanstack/table-core/src/core/column.ts", "../../../../js/node_modules/@tanstack/table-core/src/core/headers.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/ColumnSizing.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/Expanding.ts", "../../../../js/node_modules/@tanstack/table-core/src/filterFns.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/Filters.ts", "../../../../js/node_modules/@tanstack/table-core/src/aggregationFns.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/Grouping.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/Ordering.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/Pagination.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/Pinning.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/RowSelection.ts", "../../../../js/node_modules/@tanstack/table-core/src/sortingFns.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/Sorting.ts", "../../../../js/node_modules/@tanstack/table-core/src/features/Visibility.ts", "../../../../js/node_modules/@tanstack/table-core/src/core/table.ts", "../../../../js/node_modules/@tanstack/table-core/src/core/cell.ts", "../../../../js/node_modules/@tanstack/table-core/src/core/row.ts", "../../../../js/node_modules/@tanstack/table-core/src/columnHelper.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getCoreRowModel.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/filterRowsUtils.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getFilteredRowModel.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getFacetedRowModel.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getFacetedUniqueValues.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getFacetedMinMaxValues.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getSortedRowModel.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getGroupedRowModel.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getExpandedRowModel.ts", "../../../../js/node_modules/@tanstack/table-core/src/utils/getPaginationRowModel.ts", "../../../../js/node_modules/@tanstack/react-table/src/index.tsx", "../../../../js/node_modules/@tanstack/react-virtual/build/lib/_virtual/_rollupPluginBabelHelpers.mjs", "../../../../js/node_modules/@tanstack/virtual-core/build/lib/_virtual/_rollupPluginBabelHelpers.mjs", "../../../../js/node_modules/@tanstack/virtual-core/src/utils.ts", "../../../../js/node_modules/@tanstack/virtual-core/src/index.ts", "../../../../js/node_modules/@tanstack/react-virtual/src/index.tsx", "../../../../js/node_modules/preact/compat/client.mjs", "../../../../js/node_modules/immer/src/utils/env.ts", "../../../../js/node_modules/immer/src/utils/errors.ts", "../../../../js/node_modules/immer/src/utils/common.ts", "../../../../js/node_modules/immer/src/utils/plugins.ts", "../../../../js/node_modules/immer/src/core/scope.ts", "../../../../js/node_modules/immer/src/core/finalize.ts", "../../../../js/node_modules/immer/src/core/proxy.ts", "../../../../js/node_modules/immer/src/core/immerClass.ts", "../../../../js/node_modules/immer/src/core/current.ts", "../../../../js/node_modules/immer/src/plugins/patches.ts", "../../../../js/node_modules/immer/src/plugins/mapset.ts", "../../../../js/node_modules/immer/src/immer.ts", "../../../../js/node_modules/use-immer/src/index.ts", "../../../../js/data-frame/request.ts", "../../../../js/data-frame/data-update.tsx", "../../../../js/data-frame/cell.tsx", "../../../../js/data-frame/cell-edit-map.tsx", "../../../../js/data-frame/dom-utils.tsx", "../../../../js/data-frame/filter-numeric.tsx", "../../../../js/data-frame/filter.tsx", "../../../../js/data-frame/immutable-set.tsx", "../../../../js/data-frame/selection.tsx", "../../../../js/data-frame/sort.ts", "../../../../js/data-frame/sort-arrows.tsx", "../../../../js/data-frame/style-info.ts", "../../../../js/data-frame/styles.scss", "../../../../js/data-frame/tabindex-group.ts", "../../../../js/data-frame/table-summary.tsx", "../../../../js/data-frame/index.tsx"], - "sourcesContent": ["import { EMPTY_ARR } from './constants';\n\nexport const isArray = Array.isArray;\n\n/**\n * Assign properties from `props` to `obj`\n * @template O, P The obj and props types\n * @param {O} obj The object to copy properties to\n * @param {P} props The object to copy properties from\n * @returns {O & P}\n */\nexport function assign(obj, props) {\n\t// @ts-ignore We change the type of `obj` to be `O & P`\n\tfor (let i in props) obj[i] = props[i];\n\treturn /** @type {O & P} */ (obj);\n}\n\n/**\n * Remove a child node from its parent if attached. This is a workaround for\n * IE11 which doesn't support `Element.prototype.remove()`. Using this function\n * is smaller than including a dedicated polyfill.\n * @param {Node} node The node to remove\n */\nexport function removeNode(node) {\n\tlet parentNode = node.parentNode;\n\tif (parentNode) parentNode.removeChild(node);\n}\n\nexport const slice = EMPTY_ARR.slice;\n", "import { _catchError } from './diff/catch-error';\n\n/**\n * The `option` object can potentially contain callback functions\n * that are called during various stages of our renderer. This is the\n * foundation on which all our addons like `preact/debug`, `preact/compat`,\n * and `preact/hooks` are based on. See the `Options` type in `internal.d.ts`\n * for a full list of available option hooks (most editors/IDEs allow you to\n * ctrl+click or cmd+click on mac the type definition below).\n * @type {import('./internal').Options}\n */\nconst options = {\n\t_catchError\n};\n\nexport default options;\n", "import { slice } from './util';\nimport options from './options';\n\nlet vnodeId = 0;\n\n/**\n * Create an virtual node (used for JSX)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component\n * constructor for this virtual node\n * @param {object | null | undefined} [props] The properties of the virtual node\n * @param {Array} [children] The children of the virtual node\n * @returns {import('./internal').VNode}\n */\nexport function createElement(type, props, children) {\n\tlet normalizedProps = {},\n\t\tkey,\n\t\tref,\n\t\ti;\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref') ref = props[i];\n\t\telse normalizedProps[i] = props[i];\n\t}\n\n\tif (arguments.length > 2) {\n\t\tnormalizedProps.children =\n\t\t\targuments.length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\t// If a Component VNode, check for and apply defaultProps\n\t// Note: type may be undefined in development, must never error here.\n\tif (typeof type == 'function' && type.defaultProps != null) {\n\t\tfor (i in type.defaultProps) {\n\t\t\tif (normalizedProps[i] === undefined) {\n\t\t\t\tnormalizedProps[i] = type.defaultProps[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn createVNode(type, normalizedProps, key, ref, null);\n}\n\n/**\n * Create a VNode (used internally by Preact)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component\n * Constructor for this virtual node\n * @param {object | string | number | null} props The properties of this virtual node.\n * If this virtual node represents a text node, this is the text of the node (string or number).\n * @param {string | number | null} key The key for this virtual node, used when\n * diffing it against its children\n * @param {import('./internal').VNode[\"ref\"]} ref The ref property that will\n * receive a reference to its created child\n * @returns {import('./internal').VNode}\n */\nexport function createVNode(type, props, key, ref, original) {\n\t// V8 seems to be better at detecting type shapes if the object is allocated from the same call site\n\t// Do not inline into createElement and coerceToVNode!\n\tconst vnode = {\n\t\ttype,\n\t\tprops,\n\t\tkey,\n\t\tref,\n\t\t_children: null,\n\t\t_parent: null,\n\t\t_depth: 0,\n\t\t_dom: null,\n\t\t// _nextDom must be initialized to undefined b/c it will eventually\n\t\t// be set to dom.nextSibling which can return `null` and it is important\n\t\t// to be able to distinguish between an uninitialized _nextDom and\n\t\t// a _nextDom that has been set to `null`\n\t\t_nextDom: undefined,\n\t\t_component: null,\n\t\t_hydrating: null,\n\t\tconstructor: undefined,\n\t\t_original: original == null ? ++vnodeId : original\n\t};\n\n\t// Only invoke the vnode hook if this was *not* a direct copy:\n\tif (original == null && options.vnode != null) options.vnode(vnode);\n\n\treturn vnode;\n}\n\nexport function createRef() {\n\treturn { current: null };\n}\n\nexport function Fragment(props) {\n\treturn props.children;\n}\n\n/**\n * Check if a the argument is a valid Preact VNode.\n * @param {*} vnode\n * @returns {vnode is import('./internal').VNode}\n */\nexport const isValidElement = vnode =>\n\tvnode != null && vnode.constructor === undefined;\n", "import { assign } from './util';\nimport { diff, commitRoot } from './diff/index';\nimport options from './options';\nimport { Fragment } from './create-element';\n\n/**\n * Base Component class. Provides `setState()` and `forceUpdate()`, which\n * trigger rendering\n * @param {object} props The initial component props\n * @param {object} context The initial context from parent components'\n * getChildContext\n */\nexport function Component(props, context) {\n\tthis.props = props;\n\tthis.context = context;\n}\n\n/**\n * Update component state and schedule a re-render.\n * @this {import('./internal').Component}\n * @param {object | ((s: object, p: object) => object)} update A hash of state\n * properties to update with new values or a function that given the current\n * state and props returns a new partial state\n * @param {() => void} [callback] A function to be called once component state is\n * updated\n */\nComponent.prototype.setState = function (update, callback) {\n\t// only clone state when copying to nextState the first time.\n\tlet s;\n\tif (this._nextState != null && this._nextState !== this.state) {\n\t\ts = this._nextState;\n\t} else {\n\t\ts = this._nextState = assign({}, this.state);\n\t}\n\n\tif (typeof update == 'function') {\n\t\t// Some libraries like `immer` mark the current state as readonly,\n\t\t// preventing us from mutating it, so we need to clone it. See #2716\n\t\tupdate = update(assign({}, s), this.props);\n\t}\n\n\tif (update) {\n\t\tassign(s, update);\n\t}\n\n\t// Skip update if updater function returned null\n\tif (update == null) return;\n\n\tif (this._vnode) {\n\t\tif (callback) {\n\t\t\tthis._stateCallbacks.push(callback);\n\t\t}\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Immediately perform a synchronous re-render of the component\n * @this {import('./internal').Component}\n * @param {() => void} [callback] A function to be called after component is\n * re-rendered\n */\nComponent.prototype.forceUpdate = function (callback) {\n\tif (this._vnode) {\n\t\t// Set render mode so that we can differentiate where the render request\n\t\t// is coming from. We need this because forceUpdate should never call\n\t\t// shouldComponentUpdate\n\t\tthis._force = true;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n * Virtual DOM is generally constructed via [JSX](http://jasonformat.com/wtf-is-jsx).\n * @param {object} props Props (eg: JSX attributes) received from parent\n * element/component\n * @param {object} state The component's current state\n * @param {object} context Context object, as returned by the nearest\n * ancestor's `getChildContext()`\n * @returns {import('./index').ComponentChildren | void}\n */\nComponent.prototype.render = Fragment;\n\n/**\n * @param {import('./internal').VNode} vnode\n * @param {number | null} [childIndex]\n */\nexport function getDomSibling(vnode, childIndex) {\n\tif (childIndex == null) {\n\t\t// Use childIndex==null as a signal to resume the search from the vnode's sibling\n\t\treturn vnode._parent\n\t\t\t? getDomSibling(vnode._parent, vnode._parent._children.indexOf(vnode) + 1)\n\t\t\t: null;\n\t}\n\n\tlet sibling;\n\tfor (; childIndex < vnode._children.length; childIndex++) {\n\t\tsibling = vnode._children[childIndex];\n\n\t\tif (sibling != null && sibling._dom != null) {\n\t\t\t// Since updateParentDomPointers keeps _dom pointer correct,\n\t\t\t// we can rely on _dom to tell us if this subtree contains a\n\t\t\t// rendered DOM node, and what the first rendered DOM node is\n\t\t\treturn sibling._dom;\n\t\t}\n\t}\n\n\t// If we get here, we have not found a DOM node in this vnode's children.\n\t// We must resume from this vnode's sibling (in it's parent _children array)\n\t// Only climb up and search the parent if we aren't searching through a DOM\n\t// VNode (meaning we reached the DOM parent of the original vnode that began\n\t// the search)\n\treturn typeof vnode.type == 'function' ? getDomSibling(vnode) : null;\n}\n\n/**\n * Trigger in-place re-rendering of a component.\n * @param {import('./internal').Component} component The component to rerender\n */\nfunction renderComponent(component) {\n\tlet vnode = component._vnode,\n\t\toldDom = vnode._dom,\n\t\tparentDom = component._parentDom;\n\n\tif (parentDom) {\n\t\tlet commitQueue = [];\n\t\tconst oldVNode = assign({}, vnode);\n\t\toldVNode._original = vnode._original + 1;\n\n\t\tdiff(\n\t\t\tparentDom,\n\t\t\tvnode,\n\t\t\toldVNode,\n\t\t\tcomponent._globalContext,\n\t\t\tparentDom.ownerSVGElement !== undefined,\n\t\t\tvnode._hydrating != null ? [oldDom] : null,\n\t\t\tcommitQueue,\n\t\t\toldDom == null ? getDomSibling(vnode) : oldDom,\n\t\t\tvnode._hydrating\n\t\t);\n\t\tcommitRoot(commitQueue, vnode);\n\n\t\tif (vnode._dom != oldDom) {\n\t\t\tupdateParentDomPointers(vnode);\n\t\t}\n\t}\n}\n\n/**\n * @param {import('./internal').VNode} vnode\n */\nfunction updateParentDomPointers(vnode) {\n\tif ((vnode = vnode._parent) != null && vnode._component != null) {\n\t\tvnode._dom = vnode._component.base = null;\n\t\tfor (let i = 0; i < vnode._children.length; i++) {\n\t\t\tlet child = vnode._children[i];\n\t\t\tif (child != null && child._dom != null) {\n\t\t\t\tvnode._dom = vnode._component.base = child._dom;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn updateParentDomPointers(vnode);\n\t}\n}\n\n/**\n * The render queue\n * @type {Array}\n */\nlet rerenderQueue = [];\n\n/*\n * The value of `Component.debounce` must asynchronously invoke the passed in callback. It is\n * important that contributors to Preact can consistently reason about what calls to `setState`, etc.\n * do, and when their effects will be applied. See the links below for some further reading on designing\n * asynchronous APIs.\n * * [Designing APIs for Asynchrony](https://blog.izs.me/2013/08/designing-apis-for-asynchrony)\n * * [Callbacks synchronous and asynchronous](https://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)\n */\n\nlet prevDebounce;\n\nconst defer =\n\ttypeof Promise == 'function'\n\t\t? Promise.prototype.then.bind(Promise.resolve())\n\t\t: setTimeout;\n\n/**\n * Enqueue a rerender of a component\n * @param {import('./internal').Component} c The component to rerender\n */\nexport function enqueueRender(c) {\n\tif (\n\t\t(!c._dirty &&\n\t\t\t(c._dirty = true) &&\n\t\t\trerenderQueue.push(c) &&\n\t\t\t!process._rerenderCount++) ||\n\t\tprevDebounce !== options.debounceRendering\n\t) {\n\t\tprevDebounce = options.debounceRendering;\n\t\t(prevDebounce || defer)(process);\n\t}\n}\n\n/**\n * @param {import('./internal').Component} a\n * @param {import('./internal').Component} b\n */\nconst depthSort = (a, b) => a._vnode._depth - b._vnode._depth;\n\n/** Flush the render queue by rerendering all queued components */\nfunction process() {\n\tlet c;\n\trerenderQueue.sort(depthSort);\n\t// Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary\n\t// process() calls from getting scheduled while `queue` is still being consumed.\n\twhile ((c = rerenderQueue.shift())) {\n\t\tif (c._dirty) {\n\t\t\tlet renderQueueLength = rerenderQueue.length;\n\t\t\trenderComponent(c);\n\t\t\tif (rerenderQueue.length > renderQueueLength) {\n\t\t\t\t// When i.e. rerendering a provider additional new items can be injected, we want to\n\t\t\t\t// keep the order from top to bottom with those new items so we can handle them in a\n\t\t\t\t// single pass\n\t\t\t\trerenderQueue.sort(depthSort);\n\t\t\t}\n\t\t}\n\t}\n\tprocess._rerenderCount = 0;\n}\n\nprocess._rerenderCount = 0;\n", "import { enqueueRender } from './component';\n\nexport let i = 0;\n\nexport function createContext(defaultValue, contextId) {\n\tcontextId = '__cC' + i++;\n\n\tconst context = {\n\t\t_id: contextId,\n\t\t_defaultValue: defaultValue,\n\t\t/** @type {import('./internal').FunctionComponent} */\n\t\tConsumer(props, contextValue) {\n\t\t\t// return props.children(\n\t\t\t// \tcontext[contextId] ? context[contextId].props.value : defaultValue\n\t\t\t// );\n\t\t\treturn props.children(contextValue);\n\t\t},\n\t\t/** @type {import('./internal').FunctionComponent} */\n\t\tProvider(props) {\n\t\t\tif (!this.getChildContext) {\n\t\t\t\t/** @type {import('./internal').Component[]} */\n\t\t\t\tlet subs = [];\n\t\t\t\tlet ctx = {};\n\t\t\t\tctx[contextId] = this;\n\n\t\t\t\tthis.getChildContext = () => ctx;\n\n\t\t\t\tthis.shouldComponentUpdate = function (_props) {\n\t\t\t\t\tif (this.props.value !== _props.value) {\n\t\t\t\t\t\t// I think the forced value propagation here was only needed when `options.debounceRendering` was being bypassed:\n\t\t\t\t\t\t// https://github.com/preactjs/preact/commit/4d339fb803bea09e9f198abf38ca1bf8ea4b7771#diff-54682ce380935a717e41b8bfc54737f6R358\n\t\t\t\t\t\t// In those cases though, even with the value corrected, we're double-rendering all nodes.\n\t\t\t\t\t\t// It might be better to just tell folks not to use force-sync mode.\n\t\t\t\t\t\t// Currently, using `useContext()` in a class component will overwrite its `this.context` value.\n\t\t\t\t\t\t// subs.some(c => {\n\t\t\t\t\t\t// \tc.context = _props.value;\n\t\t\t\t\t\t// \tenqueueRender(c);\n\t\t\t\t\t\t// });\n\n\t\t\t\t\t\t// subs.some(c => {\n\t\t\t\t\t\t// \tc.context[contextId] = _props.value;\n\t\t\t\t\t\t// \tenqueueRender(c);\n\t\t\t\t\t\t// });\n\t\t\t\t\t\tsubs.some(c => {\n\t\t\t\t\t\t\tc._force = true;\n\t\t\t\t\t\t\tenqueueRender(c);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tthis.sub = c => {\n\t\t\t\t\tsubs.push(c);\n\t\t\t\t\tlet old = c.componentWillUnmount;\n\t\t\t\t\tc.componentWillUnmount = () => {\n\t\t\t\t\t\tsubs.splice(subs.indexOf(c), 1);\n\t\t\t\t\t\tif (old) old.call(c);\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn props.children;\n\t\t}\n\t};\n\n\t// Devtools needs access to the context object when it\n\t// encounters a Provider. This is necessary to support\n\t// setting `displayName` on the context object instead\n\t// of on the component itself. See:\n\t// https://reactjs.org/docs/context.html#contextdisplayname\n\n\treturn (context.Provider._contextRef = context.Consumer.contextType =\n\t\tcontext);\n}\n", "export const EMPTY_OBJ = {};\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL =\n\t/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\n", "import { diff, unmount, applyRef } from './index';\nimport { createVNode, Fragment } from '../create-element';\nimport { EMPTY_OBJ, EMPTY_ARR } from '../constants';\nimport { getDomSibling } from '../component';\nimport { isArray } from '../util';\n\n/**\n * Diff the children of a virtual node\n * @param {import('../internal').PreactElement} parentDom The DOM element whose\n * children are being diffed\n * @param {import('../internal').ComponentChildren[]} renderResult\n * @param {import('../internal').VNode} newParentVNode The new virtual\n * node whose children should be diff'ed against oldParentVNode\n * @param {import('../internal').VNode} oldParentVNode The old virtual\n * node whose children should be diff'ed against newParentVNode\n * @param {object} globalContext The current context object - modified by getChildContext\n * @param {boolean} isSvg Whether or not this DOM node is an SVG node\n * @param {Array} excessDomChildren\n * @param {Array} commitQueue List of components\n * which have callbacks to invoke in commitRoot\n * @param {import('../internal').PreactElement} oldDom The current attached DOM\n * element any new dom elements should be placed around. Likely `null` on first\n * render (except when hydrating). Can be a sibling DOM element when diffing\n * Fragments that have siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n */\nexport function diffChildren(\n\tparentDom,\n\trenderResult,\n\tnewParentVNode,\n\toldParentVNode,\n\tglobalContext,\n\tisSvg,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating\n) {\n\tlet i, j, oldVNode, childVNode, newDom, firstChildDom, refs;\n\n\t// This is a compression of oldParentVNode!=null && oldParentVNode != EMPTY_OBJ && oldParentVNode._children || EMPTY_ARR\n\t// as EMPTY_OBJ._children should be `undefined`.\n\tlet oldChildren = (oldParentVNode && oldParentVNode._children) || EMPTY_ARR;\n\n\tlet oldChildrenLength = oldChildren.length;\n\n\tnewParentVNode._children = [];\n\tfor (i = 0; i < renderResult.length; i++) {\n\t\tchildVNode = renderResult[i];\n\n\t\tif (\n\t\t\tchildVNode == null ||\n\t\t\ttypeof childVNode == 'boolean' ||\n\t\t\ttypeof childVNode == 'function'\n\t\t) {\n\t\t\tchildVNode = newParentVNode._children[i] = null;\n\t\t}\n\t\t// If this newVNode is being reused (e.g.
{reuse}{reuse}
) in the same diff,\n\t\t// or we are rendering a component (e.g. setState) copy the oldVNodes so it can have\n\t\t// it's own DOM & etc. pointers\n\t\telse if (\n\t\t\ttypeof childVNode == 'string' ||\n\t\t\ttypeof childVNode == 'number' ||\n\t\t\t// eslint-disable-next-line valid-typeof\n\t\t\ttypeof childVNode == 'bigint'\n\t\t) {\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tnull,\n\t\t\t\tchildVNode,\n\t\t\t\tnull,\n\t\t\t\tnull,\n\t\t\t\tchildVNode\n\t\t\t);\n\t\t} else if (isArray(childVNode)) {\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tFragment,\n\t\t\t\t{ children: childVNode },\n\t\t\t\tnull,\n\t\t\t\tnull,\n\t\t\t\tnull\n\t\t\t);\n\t\t} else if (childVNode._depth > 0) {\n\t\t\t// VNode is already in use, clone it. This can happen in the following\n\t\t\t// scenario:\n\t\t\t// const reuse =
\n\t\t\t//
{reuse}{reuse}
\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tchildVNode.type,\n\t\t\t\tchildVNode.props,\n\t\t\t\tchildVNode.key,\n\t\t\t\tchildVNode.ref ? childVNode.ref : null,\n\t\t\t\tchildVNode._original\n\t\t\t);\n\t\t} else {\n\t\t\tchildVNode = newParentVNode._children[i] = childVNode;\n\t\t}\n\n\t\t// Terser removes the `continue` here and wraps the loop body\n\t\t// in a `if (childVNode) { ... } condition\n\t\tif (childVNode == null) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tchildVNode._parent = newParentVNode;\n\t\tchildVNode._depth = newParentVNode._depth + 1;\n\n\t\t// Check if we find a corresponding element in oldChildren.\n\t\t// If found, delete the array item by setting to `undefined`.\n\t\t// We use `undefined`, as `null` is reserved for empty placeholders\n\t\t// (holes).\n\t\toldVNode = oldChildren[i];\n\n\t\tif (\n\t\t\toldVNode === null ||\n\t\t\t(oldVNode &&\n\t\t\t\tchildVNode.key == oldVNode.key &&\n\t\t\t\tchildVNode.type === oldVNode.type)\n\t\t) {\n\t\t\toldChildren[i] = undefined;\n\t\t} else {\n\t\t\t// Either oldVNode === undefined or oldChildrenLength > 0,\n\t\t\t// so after this loop oldVNode == null or oldVNode is a valid value.\n\t\t\tfor (j = 0; j < oldChildrenLength; j++) {\n\t\t\t\toldVNode = oldChildren[j];\n\t\t\t\t// If childVNode is unkeyed, we only match similarly unkeyed nodes, otherwise we match by key.\n\t\t\t\t// We always match by type (in either case).\n\t\t\t\tif (\n\t\t\t\t\toldVNode &&\n\t\t\t\t\tchildVNode.key == oldVNode.key &&\n\t\t\t\t\tchildVNode.type === oldVNode.type\n\t\t\t\t) {\n\t\t\t\t\toldChildren[j] = undefined;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\toldVNode = null;\n\t\t\t}\n\t\t}\n\n\t\toldVNode = oldVNode || EMPTY_OBJ;\n\n\t\t// Morph the old element into the new one, but don't append it to the dom yet\n\t\tdiff(\n\t\t\tparentDom,\n\t\t\tchildVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tisSvg,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\toldDom,\n\t\t\tisHydrating\n\t\t);\n\n\t\tnewDom = childVNode._dom;\n\n\t\tif ((j = childVNode.ref) && oldVNode.ref != j) {\n\t\t\tif (!refs) refs = [];\n\t\t\tif (oldVNode.ref) refs.push(oldVNode.ref, null, childVNode);\n\t\t\trefs.push(j, childVNode._component || newDom, childVNode);\n\t\t}\n\n\t\tif (newDom != null) {\n\t\t\tif (firstChildDom == null) {\n\t\t\t\tfirstChildDom = newDom;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\ttypeof childVNode.type == 'function' &&\n\t\t\t\tchildVNode._children === oldVNode._children\n\t\t\t) {\n\t\t\t\tchildVNode._nextDom = oldDom = reorderChildren(\n\t\t\t\t\tchildVNode,\n\t\t\t\t\toldDom,\n\t\t\t\t\tparentDom\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\toldDom = placeChild(\n\t\t\t\t\tparentDom,\n\t\t\t\t\tchildVNode,\n\t\t\t\t\toldVNode,\n\t\t\t\t\toldChildren,\n\t\t\t\t\tnewDom,\n\t\t\t\t\toldDom\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof newParentVNode.type == 'function') {\n\t\t\t\t// Because the newParentVNode is Fragment-like, we need to set it's\n\t\t\t\t// _nextDom property to the nextSibling of its last child DOM node.\n\t\t\t\t//\n\t\t\t\t// `oldDom` contains the correct value here because if the last child\n\t\t\t\t// is a Fragment-like, then oldDom has already been set to that child's _nextDom.\n\t\t\t\t// If the last child is a DOM VNode, then oldDom will be set to that DOM\n\t\t\t\t// node's nextSibling.\n\t\t\t\tnewParentVNode._nextDom = oldDom;\n\t\t\t}\n\t\t} else if (\n\t\t\toldDom &&\n\t\t\toldVNode._dom == oldDom &&\n\t\t\toldDom.parentNode != parentDom\n\t\t) {\n\t\t\t// The above condition is to handle null placeholders. See test in placeholder.test.js:\n\t\t\t// `efficiently replace null placeholders in parent rerenders`\n\t\t\toldDom = getDomSibling(oldVNode);\n\t\t}\n\t}\n\n\tnewParentVNode._dom = firstChildDom;\n\n\t// Remove remaining oldChildren if there are any.\n\tfor (i = oldChildrenLength; i--; ) {\n\t\tif (oldChildren[i] != null) {\n\t\t\tif (\n\t\t\t\ttypeof newParentVNode.type == 'function' &&\n\t\t\t\toldChildren[i]._dom != null &&\n\t\t\t\toldChildren[i]._dom == newParentVNode._nextDom\n\t\t\t) {\n\t\t\t\t// If the newParentVNode.__nextDom points to a dom node that is about to\n\t\t\t\t// be unmounted, then get the next sibling of that vnode and set\n\t\t\t\t// _nextDom to it\n\t\t\t\tnewParentVNode._nextDom = getLastDom(oldParentVNode).nextSibling;\n\t\t\t}\n\n\t\t\tunmount(oldChildren[i], oldChildren[i]);\n\t\t}\n\t}\n\n\t// Set refs only after unmount\n\tif (refs) {\n\t\tfor (i = 0; i < refs.length; i++) {\n\t\t\tapplyRef(refs[i], refs[++i], refs[++i]);\n\t\t}\n\t}\n}\n\nfunction reorderChildren(childVNode, oldDom, parentDom) {\n\t// Note: VNodes in nested suspended trees may be missing _children.\n\tlet c = childVNode._children;\n\tlet tmp = 0;\n\tfor (; c && tmp < c.length; tmp++) {\n\t\tlet vnode = c[tmp];\n\t\tif (vnode) {\n\t\t\t// We typically enter this code path on sCU bailout, where we copy\n\t\t\t// oldVNode._children to newVNode._children. If that is the case, we need\n\t\t\t// to update the old children's _parent pointer to point to the newVNode\n\t\t\t// (childVNode here).\n\t\t\tvnode._parent = childVNode;\n\n\t\t\tif (typeof vnode.type == 'function') {\n\t\t\t\toldDom = reorderChildren(vnode, oldDom, parentDom);\n\t\t\t} else {\n\t\t\t\toldDom = placeChild(parentDom, vnode, vnode, c, vnode._dom, oldDom);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn oldDom;\n}\n\n/**\n * Flatten and loop through the children of a virtual node\n * @param {import('../index').ComponentChildren} children The unflattened\n * children of a virtual node\n * @returns {import('../internal').VNode[]}\n */\nexport function toChildArray(children, out) {\n\tout = out || [];\n\tif (children == null || typeof children == 'boolean') {\n\t} else if (isArray(children)) {\n\t\tchildren.some(child => {\n\t\t\ttoChildArray(child, out);\n\t\t});\n\t} else {\n\t\tout.push(children);\n\t}\n\treturn out;\n}\n\nfunction placeChild(\n\tparentDom,\n\tchildVNode,\n\toldVNode,\n\toldChildren,\n\tnewDom,\n\toldDom\n) {\n\tlet nextDom;\n\tif (childVNode._nextDom !== undefined) {\n\t\t// Only Fragments or components that return Fragment like VNodes will\n\t\t// have a non-undefined _nextDom. Continue the diff from the sibling\n\t\t// of last DOM child of this child VNode\n\t\tnextDom = childVNode._nextDom;\n\n\t\t// Eagerly cleanup _nextDom. We don't need to persist the value because\n\t\t// it is only used by `diffChildren` to determine where to resume the diff after\n\t\t// diffing Components and Fragments. Once we store it the nextDOM local var, we\n\t\t// can clean up the property\n\t\tchildVNode._nextDom = undefined;\n\t} else if (\n\t\toldVNode == null ||\n\t\tnewDom != oldDom ||\n\t\tnewDom.parentNode == null\n\t) {\n\t\touter: if (oldDom == null || oldDom.parentNode !== parentDom) {\n\t\t\tparentDom.appendChild(newDom);\n\t\t\tnextDom = null;\n\t\t} else {\n\t\t\t// `j= 0; i--) {\n\t\t\tlet child = vnode._children[i];\n\t\t\tif (child) {\n\t\t\t\tlet lastDom = getLastDom(child);\n\t\t\t\tif (lastDom) {\n\t\t\t\t\treturn lastDom;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n", "import { IS_NON_DIMENSIONAL } from '../constants';\nimport options from '../options';\n\n/**\n * Diff the old and new properties of a VNode and apply changes to the DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to apply\n * changes to\n * @param {object} newProps The new props\n * @param {object} oldProps The old props\n * @param {boolean} isSvg Whether or not this node is an SVG node\n * @param {boolean} hydrate Whether or not we are in hydration mode\n */\nexport function diffProps(dom, newProps, oldProps, isSvg, hydrate) {\n\tlet i;\n\n\tfor (i in oldProps) {\n\t\tif (i !== 'children' && i !== 'key' && !(i in newProps)) {\n\t\t\tsetProperty(dom, i, null, oldProps[i], isSvg);\n\t\t}\n\t}\n\n\tfor (i in newProps) {\n\t\tif (\n\t\t\t(!hydrate || typeof newProps[i] == 'function') &&\n\t\t\ti !== 'children' &&\n\t\t\ti !== 'key' &&\n\t\t\ti !== 'value' &&\n\t\t\ti !== 'checked' &&\n\t\t\toldProps[i] !== newProps[i]\n\t\t) {\n\t\t\tsetProperty(dom, i, newProps[i], oldProps[i], isSvg);\n\t\t}\n\t}\n}\n\nfunction setStyle(style, key, value) {\n\tif (key[0] === '-') {\n\t\tstyle.setProperty(key, value == null ? '' : value);\n\t} else if (value == null) {\n\t\tstyle[key] = '';\n\t} else if (typeof value != 'number' || IS_NON_DIMENSIONAL.test(key)) {\n\t\tstyle[key] = value;\n\t} else {\n\t\tstyle[key] = value + 'px';\n\t}\n}\n\n/**\n * Set a property value on a DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to modify\n * @param {string} name The name of the property to set\n * @param {*} value The value to set the property to\n * @param {*} oldValue The old value the property had\n * @param {boolean} isSvg Whether or not this DOM node is an SVG node or not\n */\nexport function setProperty(dom, name, value, oldValue, isSvg) {\n\tlet useCapture;\n\n\to: if (name === 'style') {\n\t\tif (typeof value == 'string') {\n\t\t\tdom.style.cssText = value;\n\t\t} else {\n\t\t\tif (typeof oldValue == 'string') {\n\t\t\t\tdom.style.cssText = oldValue = '';\n\t\t\t}\n\n\t\t\tif (oldValue) {\n\t\t\t\tfor (name in oldValue) {\n\t\t\t\t\tif (!(value && name in value)) {\n\t\t\t\t\t\tsetStyle(dom.style, name, '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value) {\n\t\t\t\tfor (name in value) {\n\t\t\t\t\tif (!oldValue || value[name] !== oldValue[name]) {\n\t\t\t\t\t\tsetStyle(dom.style, name, value[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6\n\telse if (name[0] === 'o' && name[1] === 'n') {\n\t\tuseCapture = name !== (name = name.replace(/Capture$/, ''));\n\n\t\t// Infer correct casing for DOM built-in events:\n\t\tif (name.toLowerCase() in dom) name = name.toLowerCase().slice(2);\n\t\telse name = name.slice(2);\n\n\t\tif (!dom._listeners) dom._listeners = {};\n\t\tdom._listeners[name + useCapture] = value;\n\n\t\tif (value) {\n\t\t\tif (!oldValue) {\n\t\t\t\tconst handler = useCapture ? eventProxyCapture : eventProxy;\n\t\t\t\tdom.addEventListener(name, handler, useCapture);\n\t\t\t}\n\t\t} else {\n\t\t\tconst handler = useCapture ? eventProxyCapture : eventProxy;\n\t\t\tdom.removeEventListener(name, handler, useCapture);\n\t\t}\n\t} else if (name !== 'dangerouslySetInnerHTML') {\n\t\tif (isSvg) {\n\t\t\t// Normalize incorrect prop usage for SVG:\n\t\t\t// - xlink:href / xlinkHref --> href (xlink:href was removed from SVG and isn't needed)\n\t\t\t// - className --> class\n\t\t\tname = name.replace(/xlink(H|:h)/, 'h').replace(/sName$/, 's');\n\t\t} else if (\n\t\t\tname !== 'width' &&\n\t\t\tname !== 'height' &&\n\t\t\tname !== 'href' &&\n\t\t\tname !== 'list' &&\n\t\t\tname !== 'form' &&\n\t\t\t// Default value in browsers is `-1` and an empty string is\n\t\t\t// cast to `0` instead\n\t\t\tname !== 'tabIndex' &&\n\t\t\tname !== 'download' &&\n\t\t\tname !== 'rowSpan' &&\n\t\t\tname !== 'colSpan' &&\n\t\t\tname in dom\n\t\t) {\n\t\t\ttry {\n\t\t\t\tdom[name] = value == null ? '' : value;\n\t\t\t\t// labelled break is 1b smaller here than a return statement (sorry)\n\t\t\t\tbreak o;\n\t\t\t} catch (e) {}\n\t\t}\n\n\t\t// aria- and data- attributes have no boolean representation.\n\t\t// A `false` value is different from the attribute not being\n\t\t// present, so we can't remove it. For non-boolean aria\n\t\t// attributes we could treat false as a removal, but the\n\t\t// amount of exceptions would cost too many bytes. On top of\n\t\t// that other frameworks generally stringify `false`.\n\n\t\tif (typeof value === 'function') {\n\t\t\t// never serialize functions as attribute values\n\t\t} else if (value != null && (value !== false || name[4] === '-')) {\n\t\t\tdom.setAttribute(name, value);\n\t\t} else {\n\t\t\tdom.removeAttribute(name);\n\t\t}\n\t}\n}\n\n/**\n * Proxy an event to hooked event handlers\n * @param {Event} e The event object from the browser\n * @private\n */\nfunction eventProxy(e) {\n\treturn this._listeners[e.type + false](options.event ? options.event(e) : e);\n}\n\nfunction eventProxyCapture(e) {\n\treturn this._listeners[e.type + true](options.event ? options.event(e) : e);\n}\n", "import { EMPTY_OBJ } from '../constants';\nimport { Component, getDomSibling } from '../component';\nimport { Fragment } from '../create-element';\nimport { diffChildren } from './children';\nimport { diffProps, setProperty } from './props';\nimport { assign, isArray, removeNode, slice } from '../util';\nimport options from '../options';\n\n/**\n * Diff two virtual nodes and apply proper changes to the DOM\n * @param {import('../internal').PreactElement} parentDom The parent of the DOM element\n * @param {import('../internal').VNode} newVNode The new virtual node\n * @param {import('../internal').VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object. Modified by getChildContext\n * @param {boolean} isSvg Whether or not this element is an SVG node\n * @param {Array} excessDomChildren\n * @param {Array} commitQueue List of components\n * which have callbacks to invoke in commitRoot\n * @param {import('../internal').PreactElement} oldDom The current attached DOM\n * element any new dom elements should be placed around. Likely `null` on first\n * render (except when hydrating). Can be a sibling DOM element when diffing\n * Fragments that have siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} [isHydrating] Whether or not we are in hydration\n */\nexport function diff(\n\tparentDom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tisSvg,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating\n) {\n\tlet tmp,\n\t\tnewType = newVNode.type;\n\n\t// When passing through createElement it assigns the object\n\t// constructor as undefined. This to prevent JSON-injection.\n\tif (newVNode.constructor !== undefined) return null;\n\n\t// If the previous diff bailed out, resume creating/hydrating.\n\tif (oldVNode._hydrating != null) {\n\t\tisHydrating = oldVNode._hydrating;\n\t\toldDom = newVNode._dom = oldVNode._dom;\n\t\t// if we resume, we want the tree to be \"unlocked\"\n\t\tnewVNode._hydrating = null;\n\t\texcessDomChildren = [oldDom];\n\t}\n\n\tif ((tmp = options._diff)) tmp(newVNode);\n\n\ttry {\n\t\touter: if (typeof newType == 'function') {\n\t\t\tlet c, isNew, oldProps, oldState, snapshot, clearProcessingException;\n\t\t\tlet newProps = newVNode.props;\n\n\t\t\t// Necessary for createContext api. Setting this property will pass\n\t\t\t// the context value as `this.context` just for this component.\n\t\t\ttmp = newType.contextType;\n\t\t\tlet provider = tmp && globalContext[tmp._id];\n\t\t\tlet componentContext = tmp\n\t\t\t\t? provider\n\t\t\t\t\t? provider.props.value\n\t\t\t\t\t: tmp._defaultValue\n\t\t\t\t: globalContext;\n\n\t\t\t// Get component and set it to `c`\n\t\t\tif (oldVNode._component) {\n\t\t\t\tc = newVNode._component = oldVNode._component;\n\t\t\t\tclearProcessingException = c._processingException = c._pendingError;\n\t\t\t} else {\n\t\t\t\t// Instantiate the new component\n\t\t\t\tif ('prototype' in newType && newType.prototype.render) {\n\t\t\t\t\t// @ts-ignore The check above verifies that newType is suppose to be constructed\n\t\t\t\t\tnewVNode._component = c = new newType(newProps, componentContext); // eslint-disable-line new-cap\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-ignore Trust me, Component implements the interface we want\n\t\t\t\t\tnewVNode._component = c = new Component(newProps, componentContext);\n\t\t\t\t\tc.constructor = newType;\n\t\t\t\t\tc.render = doRender;\n\t\t\t\t}\n\t\t\t\tif (provider) provider.sub(c);\n\n\t\t\t\tc.props = newProps;\n\t\t\t\tif (!c.state) c.state = {};\n\t\t\t\tc.context = componentContext;\n\t\t\t\tc._globalContext = globalContext;\n\t\t\t\tisNew = c._dirty = true;\n\t\t\t\tc._renderCallbacks = [];\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t}\n\n\t\t\t// Invoke getDerivedStateFromProps\n\t\t\tif (c._nextState == null) {\n\t\t\t\tc._nextState = c.state;\n\t\t\t}\n\n\t\t\tif (newType.getDerivedStateFromProps != null) {\n\t\t\t\tif (c._nextState == c.state) {\n\t\t\t\t\tc._nextState = assign({}, c._nextState);\n\t\t\t\t}\n\n\t\t\t\tassign(\n\t\t\t\t\tc._nextState,\n\t\t\t\t\tnewType.getDerivedStateFromProps(newProps, c._nextState)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\toldProps = c.props;\n\t\t\toldState = c.state;\n\t\t\tc._vnode = newVNode;\n\n\t\t\t// Invoke pre-render lifecycle methods\n\t\t\tif (isNew) {\n\t\t\t\tif (\n\t\t\t\t\tnewType.getDerivedStateFromProps == null &&\n\t\t\t\t\tc.componentWillMount != null\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillMount();\n\t\t\t\t}\n\n\t\t\t\tif (c.componentDidMount != null) {\n\t\t\t\t\tc._renderCallbacks.push(c.componentDidMount);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tnewType.getDerivedStateFromProps == null &&\n\t\t\t\t\tnewProps !== oldProps &&\n\t\t\t\t\tc.componentWillReceiveProps != null\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillReceiveProps(newProps, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(!c._force &&\n\t\t\t\t\t\tc.shouldComponentUpdate != null &&\n\t\t\t\t\t\tc.shouldComponentUpdate(\n\t\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\t\tc._nextState,\n\t\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t\t) === false) ||\n\t\t\t\t\tnewVNode._original === oldVNode._original\n\t\t\t\t) {\n\t\t\t\t\t// More info about this here: https://gist.github.com/JoviDeCroock/bec5f2ce93544d2e6070ef8e0036e4e8\n\t\t\t\t\tif (newVNode._original !== oldVNode._original) {\n\t\t\t\t\t\t// When we are dealing with a bail because of sCU we have to update\n\t\t\t\t\t\t// the props, state and dirty-state.\n\t\t\t\t\t\t// when we are dealing with strict-equality we don't as the child could still\n\t\t\t\t\t\t// be dirtied see #3883\n\t\t\t\t\t\tc.props = newProps;\n\t\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t\t\tc._dirty = false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// In cases of bailing due to strict-equality we have to reset force as well\n\t\t\t\t\tc._force = false;\n\t\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\t\tnewVNode._children.forEach(vnode => {\n\t\t\t\t\t\tif (vnode) vnode._parent = newVNode;\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (let i = 0; i < c._stateCallbacks.length; i++) {\n\t\t\t\t\t\tc._renderCallbacks.push(c._stateCallbacks[i]);\n\t\t\t\t\t}\n\t\t\t\t\tc._stateCallbacks = [];\n\n\t\t\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\t\t\tcommitQueue.push(c);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\n\t\t\t\tif (c.componentWillUpdate != null) {\n\t\t\t\t\tc.componentWillUpdate(newProps, c._nextState, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (c.componentDidUpdate != null) {\n\t\t\t\t\tc._renderCallbacks.push(() => {\n\t\t\t\t\t\tc.componentDidUpdate(oldProps, oldState, snapshot);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tc.context = componentContext;\n\t\t\tc.props = newProps;\n\t\t\tc._parentDom = parentDom;\n\n\t\t\tlet renderHook = options._render,\n\t\t\t\tcount = 0;\n\t\t\tif ('prototype' in newType && newType.prototype.render) {\n\t\t\t\tc.state = c._nextState;\n\t\t\t\tc._dirty = false;\n\n\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\tfor (let i = 0; i < c._stateCallbacks.length; i++) {\n\t\t\t\t\tc._renderCallbacks.push(c._stateCallbacks[i]);\n\t\t\t\t}\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t} else {\n\t\t\t\tdo {\n\t\t\t\t\tc._dirty = false;\n\t\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\t\t// Handle setState called in render, see #2553\n\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t} while (c._dirty && ++count < 25);\n\t\t\t}\n\n\t\t\t// Handle setState called in render, see #2553\n\t\t\tc.state = c._nextState;\n\n\t\t\tif (c.getChildContext != null) {\n\t\t\t\tglobalContext = assign(assign({}, globalContext), c.getChildContext());\n\t\t\t}\n\n\t\t\tif (!isNew && c.getSnapshotBeforeUpdate != null) {\n\t\t\t\tsnapshot = c.getSnapshotBeforeUpdate(oldProps, oldState);\n\t\t\t}\n\n\t\t\tlet isTopLevelFragment =\n\t\t\t\ttmp != null && tmp.type === Fragment && tmp.key == null;\n\t\t\tlet renderResult = isTopLevelFragment ? tmp.props.children : tmp;\n\n\t\t\tdiffChildren(\n\t\t\t\tparentDom,\n\t\t\t\tisArray(renderResult) ? renderResult : [renderResult],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tisSvg,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\toldDom,\n\t\t\t\tisHydrating\n\t\t\t);\n\n\t\t\tc.base = newVNode._dom;\n\n\t\t\t// We successfully rendered this VNode, unset any stored hydration/bailout state:\n\t\t\tnewVNode._hydrating = null;\n\n\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\tcommitQueue.push(c);\n\t\t\t}\n\n\t\t\tif (clearProcessingException) {\n\t\t\t\tc._pendingError = c._processingException = null;\n\t\t\t}\n\n\t\t\tc._force = false;\n\t\t} else if (\n\t\t\texcessDomChildren == null &&\n\t\t\tnewVNode._original === oldVNode._original\n\t\t) {\n\t\t\tnewVNode._children = oldVNode._children;\n\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t} else {\n\t\t\tnewVNode._dom = diffElementNodes(\n\t\t\t\toldVNode._dom,\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tisSvg,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\tisHydrating\n\t\t\t);\n\t\t}\n\n\t\tif ((tmp = options.diffed)) tmp(newVNode);\n\t} catch (e) {\n\t\tnewVNode._original = null;\n\t\t// if hydrating or creating initial tree, bailout preserves DOM:\n\t\tif (isHydrating || excessDomChildren != null) {\n\t\t\tnewVNode._dom = oldDom;\n\t\t\tnewVNode._hydrating = !!isHydrating;\n\t\t\texcessDomChildren[excessDomChildren.indexOf(oldDom)] = null;\n\t\t\t// ^ could possibly be simplified to:\n\t\t\t// excessDomChildren.length = 0;\n\t\t}\n\t\toptions._catchError(e, newVNode, oldVNode);\n\t}\n}\n\n/**\n * @param {Array} commitQueue List of components\n * which have callbacks to invoke in commitRoot\n * @param {import('../internal').VNode} root\n */\nexport function commitRoot(commitQueue, root) {\n\tif (options._commit) options._commit(root, commitQueue);\n\n\tcommitQueue.some(c => {\n\t\ttry {\n\t\t\t// @ts-ignore Reuse the commitQueue variable here so the type changes\n\t\t\tcommitQueue = c._renderCallbacks;\n\t\t\tc._renderCallbacks = [];\n\t\t\tcommitQueue.some(cb => {\n\t\t\t\t// @ts-ignore See above ts-ignore on commitQueue\n\t\t\t\tcb.call(c);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t});\n}\n\n/**\n * Diff two virtual nodes representing DOM element\n * @param {import('../internal').PreactElement} dom The DOM element representing\n * the virtual nodes being diffed\n * @param {import('../internal').VNode} newVNode The new virtual node\n * @param {import('../internal').VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object\n * @param {boolean} isSvg Whether or not this DOM node is an SVG node\n * @param {*} excessDomChildren\n * @param {Array} commitQueue List of components\n * which have callbacks to invoke in commitRoot\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @returns {import('../internal').PreactElement}\n */\nfunction diffElementNodes(\n\tdom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tisSvg,\n\texcessDomChildren,\n\tcommitQueue,\n\tisHydrating\n) {\n\tlet oldProps = oldVNode.props;\n\tlet newProps = newVNode.props;\n\tlet nodeType = newVNode.type;\n\tlet i = 0;\n\n\t// Tracks entering and exiting SVG namespace when descending through the tree.\n\tif (nodeType === 'svg') isSvg = true;\n\n\tif (excessDomChildren != null) {\n\t\tfor (; i < excessDomChildren.length; i++) {\n\t\t\tconst child = excessDomChildren[i];\n\n\t\t\t// if newVNode matches an element in excessDomChildren or the `dom`\n\t\t\t// argument matches an element in excessDomChildren, remove it from\n\t\t\t// excessDomChildren so it isn't later removed in diffChildren\n\t\t\tif (\n\t\t\t\tchild &&\n\t\t\t\t'setAttribute' in child === !!nodeType &&\n\t\t\t\t(nodeType ? child.localName === nodeType : child.nodeType === 3)\n\t\t\t) {\n\t\t\t\tdom = child;\n\t\t\t\texcessDomChildren[i] = null;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (dom == null) {\n\t\tif (nodeType === null) {\n\t\t\t// @ts-ignore createTextNode returns Text, we expect PreactElement\n\t\t\treturn document.createTextNode(newProps);\n\t\t}\n\n\t\tif (isSvg) {\n\t\t\tdom = document.createElementNS(\n\t\t\t\t'http://www.w3.org/2000/svg',\n\t\t\t\t// @ts-ignore We know `newVNode.type` is a string\n\t\t\t\tnodeType\n\t\t\t);\n\t\t} else {\n\t\t\tdom = document.createElement(\n\t\t\t\t// @ts-ignore We know `newVNode.type` is a string\n\t\t\t\tnodeType,\n\t\t\t\tnewProps.is && newProps\n\t\t\t);\n\t\t}\n\n\t\t// we created a new parent, so none of the previously attached children can be reused:\n\t\texcessDomChildren = null;\n\t\t// we are creating a new node, so we can assume this is a new subtree (in case we are hydrating), this deopts the hydrate\n\t\tisHydrating = false;\n\t}\n\n\tif (nodeType === null) {\n\t\t// During hydration, we still have to split merged text from SSR'd HTML.\n\t\tif (oldProps !== newProps && (!isHydrating || dom.data !== newProps)) {\n\t\t\tdom.data = newProps;\n\t\t}\n\t} else {\n\t\t// If excessDomChildren was not null, repopulate it with the current element's children:\n\t\texcessDomChildren = excessDomChildren && slice.call(dom.childNodes);\n\n\t\toldProps = oldVNode.props || EMPTY_OBJ;\n\n\t\tlet oldHtml = oldProps.dangerouslySetInnerHTML;\n\t\tlet newHtml = newProps.dangerouslySetInnerHTML;\n\n\t\t// During hydration, props are not diffed at all (including dangerouslySetInnerHTML)\n\t\t// @TODO we should warn in debug mode when props don't match here.\n\t\tif (!isHydrating) {\n\t\t\t// But, if we are in a situation where we are using existing DOM (e.g. replaceNode)\n\t\t\t// we should read the existing DOM attributes to diff them\n\t\t\tif (excessDomChildren != null) {\n\t\t\t\toldProps = {};\n\t\t\t\tfor (i = 0; i < dom.attributes.length; i++) {\n\t\t\t\t\toldProps[dom.attributes[i].name] = dom.attributes[i].value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newHtml || oldHtml) {\n\t\t\t\t// Avoid re-applying the same '__html' if it did not changed between re-render\n\t\t\t\tif (\n\t\t\t\t\t!newHtml ||\n\t\t\t\t\t((!oldHtml || newHtml.__html != oldHtml.__html) &&\n\t\t\t\t\t\tnewHtml.__html !== dom.innerHTML)\n\t\t\t\t) {\n\t\t\t\t\tdom.innerHTML = (newHtml && newHtml.__html) || '';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdiffProps(dom, newProps, oldProps, isSvg, isHydrating);\n\n\t\t// If the new vnode didn't have dangerouslySetInnerHTML, diff its children\n\t\tif (newHtml) {\n\t\t\tnewVNode._children = [];\n\t\t} else {\n\t\t\ti = newVNode.props.children;\n\t\t\tdiffChildren(\n\t\t\t\tdom,\n\t\t\t\tisArray(i) ? i : [i],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tisSvg && nodeType !== 'foreignObject',\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\texcessDomChildren\n\t\t\t\t\t? excessDomChildren[0]\n\t\t\t\t\t: oldVNode._children && getDomSibling(oldVNode, 0),\n\t\t\t\tisHydrating\n\t\t\t);\n\n\t\t\t// Remove children that are not part of any vnode.\n\t\t\tif (excessDomChildren != null) {\n\t\t\t\tfor (i = excessDomChildren.length; i--; ) {\n\t\t\t\t\tif (excessDomChildren[i] != null) removeNode(excessDomChildren[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// (as above, don't diff props during hydration)\n\t\tif (!isHydrating) {\n\t\t\tif (\n\t\t\t\t'value' in newProps &&\n\t\t\t\t(i = newProps.value) !== undefined &&\n\t\t\t\t// #2756 For the -element the initial value is 0,\n\t\t\t\t// despite the attribute not being present. When the attribute\n\t\t\t\t// is missing the progress bar is treated as indeterminate.\n\t\t\t\t// To fix that we'll always update it when it is 0 for progress elements\n\t\t\t\t(i !== dom.value ||\n\t\t\t\t\t(nodeType === 'progress' && !i) ||\n\t\t\t\t\t// This is only for IE 11 to fix \n\tif (\n\t\ttype == 'select' &&\n\t\tnormalizedProps.multiple &&\n\t\tArray.isArray(normalizedProps.value)\n\t) {\n\t\t// forEach() always returns undefined, which we abuse here to unset the value prop.\n\t\tnormalizedProps.value = toChildArray(props.children).forEach(child => {\n\t\t\tchild.props.selected =\n\t\t\t\tnormalizedProps.value.indexOf(child.props.value) != -1;\n\t\t});\n\t}\n\n\t// Adding support for defaultValue in select tag\n\tif (type == 'select' && normalizedProps.defaultValue != null) {\n\t\tnormalizedProps.value = toChildArray(props.children).forEach(child => {\n\t\t\tif (normalizedProps.multiple) {\n\t\t\t\tchild.props.selected =\n\t\t\t\t\tnormalizedProps.defaultValue.indexOf(child.props.value) != -1;\n\t\t\t} else {\n\t\t\t\tchild.props.selected =\n\t\t\t\t\tnormalizedProps.defaultValue == child.props.value;\n\t\t\t}\n\t\t});\n\t}\n\n\tif (props.class && !props.className) {\n\t\tnormalizedProps.class = props.class;\n\t\tObject.defineProperty(\n\t\t\tnormalizedProps,\n\t\t\t'className',\n\t\t\tclassNameDescriptorNonEnumberable\n\t\t);\n\t} else if (props.className && !props.class) {\n\t\tnormalizedProps.class = normalizedProps.className = props.className;\n\t} else if (props.class && props.className) {\n\t\tnormalizedProps.class = normalizedProps.className = props.className;\n\t}\n\n\tvnode.props = normalizedProps;\n}\n\nlet oldVNodeHook = options.vnode;\noptions.vnode = vnode => {\n\t// only normalize props on Element nodes\n\tif (typeof vnode.type === 'string') {\n\t\thandleDomVNode(vnode);\n\t}\n\n\tvnode.$$typeof = REACT_ELEMENT_TYPE;\n\n\tif (oldVNodeHook) oldVNodeHook(vnode);\n};\n\n// Only needed for react-relay\nlet currentComponent;\nconst oldBeforeRender = options._render;\noptions._render = function (vnode) {\n\tif (oldBeforeRender) {\n\t\toldBeforeRender(vnode);\n\t}\n\tcurrentComponent = vnode._component;\n};\n\nconst oldDiffed = options.diffed;\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.diffed = function (vnode) {\n\tif (oldDiffed) {\n\t\toldDiffed(vnode);\n\t}\n\n\tconst props = vnode.props;\n\tconst dom = vnode._dom;\n\n\tif (\n\t\tdom != null &&\n\t\tvnode.type === 'textarea' &&\n\t\t'value' in props &&\n\t\tprops.value !== dom.value\n\t) {\n\t\tdom.value = props.value == null ? '' : props.value;\n\t}\n\n\tcurrentComponent = null;\n};\n\n// This is a very very private internal function for React it\n// is used to sort-of do runtime dependency injection. So far\n// only `react-relay` makes use of it. It uses it to read the\n// context value.\nexport const __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = {\n\tReactCurrentDispatcher: {\n\t\tcurrent: {\n\t\t\treadContext(context) {\n\t\t\t\treturn currentComponent._globalContext[context._id].props.value;\n\t\t\t}\n\t\t}\n\t}\n};\n", "import {\n\tcreateElement,\n\trender as preactRender,\n\tcloneElement as preactCloneElement,\n\tcreateRef,\n\tComponent,\n\tcreateContext,\n\tFragment\n} from 'preact';\nimport {\n\tuseState,\n\tuseId,\n\tuseReducer,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseCallback,\n\tuseContext,\n\tuseDebugValue\n} from 'preact/hooks';\nimport { PureComponent } from './PureComponent';\nimport { memo } from './memo';\nimport { forwardRef } from './forwardRef';\nimport { Children } from './Children';\nimport { Suspense, lazy } from './suspense';\nimport { SuspenseList } from './suspense-list';\nimport { createPortal } from './portals';\nimport { is } from './util';\nimport {\n\thydrate,\n\trender,\n\tREACT_ELEMENT_TYPE,\n\t__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED\n} from './render';\n\nconst version = '17.0.2'; // trick libraries to think we are react\n\n/**\n * Legacy version of createElement.\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component constructor\n */\nfunction createFactory(type) {\n\treturn createElement.bind(null, type);\n}\n\n/**\n * Check if the passed element is a valid (p)react node.\n * @param {*} element The element to check\n * @returns {boolean}\n */\nfunction isValidElement(element) {\n\treturn !!element && element.$$typeof === REACT_ELEMENT_TYPE;\n}\n\n/**\n * Wrap `cloneElement` to abort if the passed element is not a valid element and apply\n * all vnode normalizations.\n * @param {import('./internal').VNode} element The vnode to clone\n * @param {object} props Props to add when cloning\n * @param {Array} rest Optional component children\n */\nfunction cloneElement(element) {\n\tif (!isValidElement(element)) return element;\n\treturn preactCloneElement.apply(null, arguments);\n}\n\n/**\n * Remove a component tree from the DOM, including state and event handlers.\n * @param {import('./internal').PreactElement} container\n * @returns {boolean}\n */\nfunction unmountComponentAtNode(container) {\n\tif (container._children) {\n\t\tpreactRender(null, container);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Get the matching DOM node for a component\n * @param {import('./internal').Component} component\n * @returns {import('./internal').PreactElement | null}\n */\nfunction findDOMNode(component) {\n\treturn (\n\t\t(component &&\n\t\t\t(component.base || (component.nodeType === 1 && component))) ||\n\t\tnull\n\t);\n}\n\n/**\n * Deprecated way to control batched rendering inside the reconciler, but we\n * already schedule in batches inside our rendering code\n * @template Arg\n * @param {(arg: Arg) => void} callback function that triggers the updated\n * @param {Arg} [arg] Optional argument that can be passed to the callback\n */\n// eslint-disable-next-line camelcase\nconst unstable_batchedUpdates = (callback, arg) => callback(arg);\n\n/**\n * In React, `flushSync` flushes the entire tree and forces a rerender. It's\n * implmented here as a no-op.\n * @template Arg\n * @template Result\n * @param {(arg: Arg) => Result} callback function that runs before the flush\n * @param {Arg} [arg] Optional argument that can be passed to the callback\n * @returns\n */\nconst flushSync = (callback, arg) => callback(arg);\n\n/**\n * Strict Mode is not implemented in Preact, so we provide a stand-in for it\n * that just renders its children without imposing any restrictions.\n */\nconst StrictMode = Fragment;\n\nexport function startTransition(cb) {\n\tcb();\n}\n\nexport function useDeferredValue(val) {\n\treturn val;\n}\n\nexport function useTransition() {\n\treturn [false, startTransition];\n}\n\n// TODO: in theory this should be done after a VNode is diffed as we want to insert\n// styles/... before it attaches\nexport const useInsertionEffect = useLayoutEffect;\n\n/**\n * This is taken from https://github.com/facebook/react/blob/main/packages/use-sync-external-store/src/useSyncExternalStoreShimClient.js#L84\n * on a high level this cuts out the warnings, ... and attempts a smaller implementation\n */\nexport function useSyncExternalStore(subscribe, getSnapshot) {\n\tconst value = getSnapshot();\n\n\tconst [{ _instance }, forceUpdate] = useState({\n\t\t_instance: { _value: value, _getSnapshot: getSnapshot }\n\t});\n\n\tuseLayoutEffect(() => {\n\t\t_instance._value = value;\n\t\t_instance._getSnapshot = getSnapshot;\n\n\t\tif (!is(_instance._value, getSnapshot())) {\n\t\t\tforceUpdate({ _instance });\n\t\t}\n\t}, [subscribe, value, getSnapshot]);\n\n\tuseEffect(() => {\n\t\tif (!is(_instance._value, _instance._getSnapshot())) {\n\t\t\tforceUpdate({ _instance });\n\t\t}\n\n\t\treturn subscribe(() => {\n\t\t\tif (!is(_instance._value, _instance._getSnapshot())) {\n\t\t\t\tforceUpdate({ _instance });\n\t\t\t}\n\t\t});\n\t}, [subscribe]);\n\n\treturn value;\n}\n\nexport * from 'preact/hooks';\nexport {\n\tversion,\n\tChildren,\n\trender,\n\thydrate,\n\tunmountComponentAtNode,\n\tcreatePortal,\n\tcreateElement,\n\tcreateContext,\n\tcreateFactory,\n\tcloneElement,\n\tcreateRef,\n\tFragment,\n\tisValidElement,\n\tfindDOMNode,\n\tComponent,\n\tPureComponent,\n\tmemo,\n\tforwardRef,\n\tflushSync,\n\t// eslint-disable-next-line camelcase\n\tunstable_batchedUpdates,\n\tStrictMode,\n\tSuspense,\n\tSuspenseList,\n\tlazy,\n\t__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED\n};\n\n// React copies the named exports to the default one.\nexport default {\n\tuseState,\n\tuseId,\n\tuseReducer,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseInsertionEffect,\n\tuseTransition,\n\tuseDeferredValue,\n\tuseSyncExternalStore,\n\tstartTransition,\n\tuseRef,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseCallback,\n\tuseContext,\n\tuseDebugValue,\n\tversion,\n\tChildren,\n\trender,\n\thydrate,\n\tunmountComponentAtNode,\n\tcreatePortal,\n\tcreateElement,\n\tcreateContext,\n\tcreateFactory,\n\tcloneElement,\n\tcreateRef,\n\tFragment,\n\tisValidElement,\n\tfindDOMNode,\n\tComponent,\n\tPureComponent,\n\tmemo,\n\tforwardRef,\n\tflushSync,\n\tunstable_batchedUpdates,\n\tStrictMode,\n\tSuspense,\n\tSuspenseList,\n\tlazy,\n\t__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED\n};\n", "import { TableState, Updater } from './types'\n\nexport type PartialKeys = Omit & Partial>\nexport type RequiredKeys = Omit &\n Required>\nexport type Overwrite = Omit<\n T,\n keyof U\n> &\n U\n\nexport type UnionToIntersection = (\n T extends any ? (x: T) => any : never\n) extends (x: infer R) => any\n ? R\n : never\n\nexport type IsAny = 1 extends 0 & T ? Y : N\nexport type IsKnown = unknown extends T ? N : Y\n\ntype ComputeRange<\n N extends number,\n Result extends Array = []\n> = Result['length'] extends N\n ? Result\n : ComputeRange\ntype Index40 = ComputeRange<40>[number]\n\n// Is this type a tuple?\ntype IsTuple = T extends readonly any[] & { length: infer Length }\n ? Length extends Index40\n ? T\n : never\n : never\n\n// If this type is a tuple, what indices are allowed?\ntype AllowedIndexes<\n Tuple extends ReadonlyArray,\n Keys extends number = never\n> = Tuple extends readonly []\n ? Keys\n : Tuple extends readonly [infer _, ...infer Tail]\n ? AllowedIndexes\n : Keys\n\nexport type DeepKeys = unknown extends T\n ? keyof T\n : object extends T\n ? string\n : T extends readonly any[] & IsTuple\n ? AllowedIndexes | DeepKeysPrefix>\n : T extends any[]\n ? never & 'Dynamic length array indexing is not supported'\n : T extends Date\n ? never\n : T extends object\n ? (keyof T & string) | DeepKeysPrefix\n : never\n\ntype DeepKeysPrefix = TPrefix extends keyof T & (number | string)\n ? `${TPrefix}.${DeepKeys & string}`\n : never\n\nexport type DeepValue = T extends Record\n ? TProp extends `${infer TBranch}.${infer TDeepProp}`\n ? DeepValue\n : T[TProp & string]\n : never\n\nexport type NoInfer = [T][T extends any ? 0 : never]\n\nexport type Getter = () => NoInfer\n\n///\n\nexport function functionalUpdate(updater: Updater, input: T): T {\n return typeof updater === 'function'\n ? (updater as (input: T) => T)(input)\n : updater\n}\n\nexport function noop() {\n //\n}\n\nexport function makeStateUpdater(\n key: K,\n instance: unknown\n) {\n return (updater: Updater) => {\n ;(instance as any).setState((old: TTableState) => {\n return {\n ...old,\n [key]: functionalUpdate(updater, (old as any)[key]),\n }\n })\n }\n}\n\ntype AnyFunction = (...args: any) => any\n\nexport function isFunction(d: any): d is T {\n return d instanceof Function\n}\n\nexport function isNumberArray(d: any): d is number[] {\n return Array.isArray(d) && d.every(val => typeof val === 'number')\n}\n\nexport function flattenBy(\n arr: TNode[],\n getChildren: (item: TNode) => TNode[]\n) {\n const flat: TNode[] = []\n\n const recurse = (subArr: TNode[]) => {\n subArr.forEach(item => {\n flat.push(item)\n const children = getChildren(item)\n if (children?.length) {\n recurse(children)\n }\n })\n }\n\n recurse(arr)\n\n return flat\n}\n\nexport function memo(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n }\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug) {\n if (opts?.debug()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120)\n )}deg 100% 31%);`,\n opts?.key\n )\n }\n }\n\n return result!\n }\n}\n", "import {\n Column,\n Table,\n AccessorFn,\n ColumnDef,\n RowData,\n ColumnDefResolved,\n} from '../types'\nimport { memo } from '../utils'\n\nexport interface CoreColumn {\n id: string\n depth: number\n accessorFn?: AccessorFn\n columnDef: ColumnDef\n columns: Column[]\n parent?: Column\n getFlatColumns: () => Column[]\n getLeafColumns: () => Column[]\n}\n\nexport function createColumn(\n table: Table,\n columnDef: ColumnDef,\n depth: number,\n parent?: Column\n): Column {\n const defaultColumn = table._getDefaultColumnDef()\n\n const resolvedColumnDef = {\n ...defaultColumn,\n ...columnDef,\n } as ColumnDefResolved\n\n const accessorKey = resolvedColumnDef.accessorKey\n\n let id =\n resolvedColumnDef.id ??\n (accessorKey ? accessorKey.replace('.', '_') : undefined) ??\n (typeof resolvedColumnDef.header === 'string'\n ? resolvedColumnDef.header\n : undefined)\n\n let accessorFn: AccessorFn | undefined\n\n if (resolvedColumnDef.accessorFn) {\n accessorFn = resolvedColumnDef.accessorFn\n } else if (accessorKey) {\n // Support deep accessor keys\n if (accessorKey.includes('.')) {\n accessorFn = (originalRow: TData) => {\n let result = originalRow as Record\n\n for (const key of accessorKey.split('.')) {\n result = result?.[key]\n if (process.env.NODE_ENV !== 'production' && result === undefined) {\n console.warn(\n `\"${key}\" in deeply nested key \"${accessorKey}\" returned undefined.`\n )\n }\n }\n\n return result\n }\n } else {\n accessorFn = (originalRow: TData) =>\n (originalRow as any)[resolvedColumnDef.accessorKey]\n }\n }\n\n if (!id) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\n resolvedColumnDef.accessorFn\n ? `Columns require an id when using an accessorFn`\n : `Columns require an id when using a non-string header`\n )\n }\n throw new Error()\n }\n\n let column: CoreColumn = {\n id: `${String(id)}`,\n accessorFn,\n parent: parent as any,\n depth,\n columnDef: resolvedColumnDef as ColumnDef,\n columns: [],\n getFlatColumns: memo(\n () => [true],\n () => {\n return [\n column as Column,\n ...column.columns?.flatMap(d => d.getFlatColumns()),\n ]\n },\n {\n key: process.env.NODE_ENV === 'production' && 'column.getFlatColumns',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n getLeafColumns: memo(\n () => [table._getOrderColumnsFn()],\n orderColumns => {\n if (column.columns?.length) {\n let leafColumns = column.columns.flatMap(column =>\n column.getLeafColumns()\n )\n\n return orderColumns(leafColumns)\n }\n\n return [column as Column]\n },\n {\n key: process.env.NODE_ENV === 'production' && 'column.getLeafColumns',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n }\n\n column = table._features.reduce((obj, feature) => {\n return Object.assign(obj, feature.createColumn?.(column, table))\n }, column)\n\n // Yes, we have to convert table to uknown, because we know more than the compiler here.\n return column as Column\n}\n", "import { RowData, Column, Header, HeaderGroup, Table } from '../types'\nimport { memo } from '../utils'\nimport { TableFeature } from './table'\n\nexport interface CoreHeaderGroup {\n id: string\n depth: number\n headers: Header[]\n}\n\nexport interface HeaderContext {\n table: Table\n header: Header\n column: Column\n}\n\nexport interface CoreHeader {\n id: string\n index: number\n depth: number\n column: Column\n headerGroup: HeaderGroup\n subHeaders: Header[]\n colSpan: number\n rowSpan: number\n getLeafHeaders: () => Header[]\n isPlaceholder: boolean\n placeholderId?: string\n getContext: () => HeaderContext\n}\n\nexport interface HeadersInstance {\n getHeaderGroups: () => HeaderGroup[]\n getLeftHeaderGroups: () => HeaderGroup[]\n getCenterHeaderGroups: () => HeaderGroup[]\n getRightHeaderGroups: () => HeaderGroup[]\n\n getFooterGroups: () => HeaderGroup[]\n getLeftFooterGroups: () => HeaderGroup[]\n getCenterFooterGroups: () => HeaderGroup[]\n getRightFooterGroups: () => HeaderGroup[]\n\n getFlatHeaders: () => Header[]\n getLeftFlatHeaders: () => Header[]\n getCenterFlatHeaders: () => Header[]\n getRightFlatHeaders: () => Header[]\n\n getLeafHeaders: () => Header[]\n getLeftLeafHeaders: () => Header[]\n getCenterLeafHeaders: () => Header[]\n getRightLeafHeaders: () => Header[]\n}\n\n//\n\nfunction createHeader(\n table: Table,\n column: Column,\n options: {\n id?: string\n isPlaceholder?: boolean\n placeholderId?: string\n index: number\n depth: number\n }\n): Header {\n const id = options.id ?? column.id\n\n let header: CoreHeader = {\n id,\n column,\n index: options.index,\n isPlaceholder: !!options.isPlaceholder,\n placeholderId: options.placeholderId,\n depth: options.depth,\n subHeaders: [],\n colSpan: 0,\n rowSpan: 0,\n headerGroup: null!,\n getLeafHeaders: (): Header[] => {\n const leafHeaders: Header[] = []\n\n const recurseHeader = (h: CoreHeader) => {\n if (h.subHeaders && h.subHeaders.length) {\n h.subHeaders.map(recurseHeader)\n }\n leafHeaders.push(h as Header)\n }\n\n recurseHeader(header)\n\n return leafHeaders\n },\n getContext: () => ({\n table,\n header: header as Header,\n column,\n }),\n }\n\n table._features.forEach(feature => {\n Object.assign(header, feature.createHeader?.(header, table))\n })\n\n return header as Header\n}\n\nexport const Headers: TableFeature = {\n createTable: (\n table: Table\n ): HeadersInstance => {\n return {\n // Header Groups\n\n getHeaderGroups: memo(\n () => [\n table.getAllColumns(),\n table.getVisibleLeafColumns(),\n table.getState().columnPinning.left,\n table.getState().columnPinning.right,\n ],\n (allColumns, leafColumns, left, right) => {\n const leftColumns =\n left\n ?.map(columnId => leafColumns.find(d => d.id === columnId)!)\n .filter(Boolean) ?? []\n\n const rightColumns =\n right\n ?.map(columnId => leafColumns.find(d => d.id === columnId)!)\n .filter(Boolean) ?? []\n\n const centerColumns = leafColumns.filter(\n column => !left?.includes(column.id) && !right?.includes(column.id)\n )\n\n const headerGroups = buildHeaderGroups(\n allColumns,\n [...leftColumns, ...centerColumns, ...rightColumns],\n table\n )\n\n return headerGroups\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getHeaderGroups',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getCenterHeaderGroups: memo(\n () => [\n table.getAllColumns(),\n table.getVisibleLeafColumns(),\n table.getState().columnPinning.left,\n table.getState().columnPinning.right,\n ],\n (allColumns, leafColumns, left, right) => {\n leafColumns = leafColumns.filter(\n column => !left?.includes(column.id) && !right?.includes(column.id)\n )\n return buildHeaderGroups(allColumns, leafColumns, table, 'center')\n },\n {\n key:\n process.env.NODE_ENV === 'development' && 'getCenterHeaderGroups',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getLeftHeaderGroups: memo(\n () => [\n table.getAllColumns(),\n table.getVisibleLeafColumns(),\n table.getState().columnPinning.left,\n ],\n (allColumns, leafColumns, left) => {\n const orderedLeafColumns =\n left\n ?.map(columnId => leafColumns.find(d => d.id === columnId)!)\n .filter(Boolean) ?? []\n\n return buildHeaderGroups(\n allColumns,\n orderedLeafColumns,\n table,\n 'left'\n )\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getLeftHeaderGroups',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getRightHeaderGroups: memo(\n () => [\n table.getAllColumns(),\n table.getVisibleLeafColumns(),\n table.getState().columnPinning.right,\n ],\n (allColumns, leafColumns, right) => {\n const orderedLeafColumns =\n right\n ?.map(columnId => leafColumns.find(d => d.id === columnId)!)\n .filter(Boolean) ?? []\n\n return buildHeaderGroups(\n allColumns,\n orderedLeafColumns,\n table,\n 'right'\n )\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getRightHeaderGroups',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n // Footer Groups\n\n getFooterGroups: memo(\n () => [table.getHeaderGroups()],\n headerGroups => {\n return [...headerGroups].reverse()\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getFooterGroups',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getLeftFooterGroups: memo(\n () => [table.getLeftHeaderGroups()],\n headerGroups => {\n return [...headerGroups].reverse()\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getLeftFooterGroups',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getCenterFooterGroups: memo(\n () => [table.getCenterHeaderGroups()],\n headerGroups => {\n return [...headerGroups].reverse()\n },\n {\n key:\n process.env.NODE_ENV === 'development' && 'getCenterFooterGroups',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getRightFooterGroups: memo(\n () => [table.getRightHeaderGroups()],\n headerGroups => {\n return [...headerGroups].reverse()\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getRightFooterGroups',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n // Flat Headers\n\n getFlatHeaders: memo(\n () => [table.getHeaderGroups()],\n headerGroups => {\n return headerGroups\n .map(headerGroup => {\n return headerGroup.headers\n })\n .flat()\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getFlatHeaders',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getLeftFlatHeaders: memo(\n () => [table.getLeftHeaderGroups()],\n left => {\n return left\n .map(headerGroup => {\n return headerGroup.headers\n })\n .flat()\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getLeftFlatHeaders',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getCenterFlatHeaders: memo(\n () => [table.getCenterHeaderGroups()],\n left => {\n return left\n .map(headerGroup => {\n return headerGroup.headers\n })\n .flat()\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getCenterFlatHeaders',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getRightFlatHeaders: memo(\n () => [table.getRightHeaderGroups()],\n left => {\n return left\n .map(headerGroup => {\n return headerGroup.headers\n })\n .flat()\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getRightFlatHeaders',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n // Leaf Headers\n\n getCenterLeafHeaders: memo(\n () => [table.getCenterFlatHeaders()],\n flatHeaders => {\n return flatHeaders.filter(header => !header.subHeaders?.length)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getCenterLeafHeaders',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getLeftLeafHeaders: memo(\n () => [table.getLeftFlatHeaders()],\n flatHeaders => {\n return flatHeaders.filter(header => !header.subHeaders?.length)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getLeftLeafHeaders',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getRightLeafHeaders: memo(\n () => [table.getRightFlatHeaders()],\n flatHeaders => {\n return flatHeaders.filter(header => !header.subHeaders?.length)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getRightLeafHeaders',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n\n getLeafHeaders: memo(\n () => [\n table.getLeftHeaderGroups(),\n table.getCenterHeaderGroups(),\n table.getRightHeaderGroups(),\n ],\n (left, center, right) => {\n return [\n ...(left[0]?.headers ?? []),\n ...(center[0]?.headers ?? []),\n ...(right[0]?.headers ?? []),\n ]\n .map(header => {\n return header.getLeafHeaders()\n })\n .flat()\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getLeafHeaders',\n debug: () => table.options.debugAll ?? table.options.debugHeaders,\n }\n ),\n }\n },\n}\n\nexport function buildHeaderGroups(\n allColumns: Column[],\n columnsToGroup: Column[],\n table: Table,\n headerFamily?: 'center' | 'left' | 'right'\n) {\n // Find the max depth of the columns:\n // build the leaf column row\n // build each buffer row going up\n // placeholder for non-existent level\n // real column for existing level\n\n let maxDepth = 0\n\n const findMaxDepth = (columns: Column[], depth = 1) => {\n maxDepth = Math.max(maxDepth, depth)\n\n columns\n .filter(column => column.getIsVisible())\n .forEach(column => {\n if (column.columns?.length) {\n findMaxDepth(column.columns, depth + 1)\n }\n }, 0)\n }\n\n findMaxDepth(allColumns)\n\n let headerGroups: HeaderGroup[] = []\n\n const createHeaderGroup = (\n headersToGroup: Header[],\n depth: number\n ) => {\n // The header group we are creating\n const headerGroup: HeaderGroup = {\n depth,\n id: [headerFamily, `${depth}`].filter(Boolean).join('_'),\n headers: [],\n }\n\n // The parent columns we're going to scan next\n const pendingParentHeaders: Header[] = []\n\n // Scan each column for parents\n headersToGroup.forEach(headerToGroup => {\n // What is the latest (last) parent column?\n\n const latestPendingParentHeader = [...pendingParentHeaders].reverse()[0]\n\n const isLeafHeader = headerToGroup.column.depth === headerGroup.depth\n\n let column: Column\n let isPlaceholder = false\n\n if (isLeafHeader && headerToGroup.column.parent) {\n // The parent header is new\n column = headerToGroup.column.parent\n } else {\n // The parent header is repeated\n column = headerToGroup.column\n isPlaceholder = true\n }\n\n if (\n latestPendingParentHeader &&\n latestPendingParentHeader?.column === column\n ) {\n // This column is repeated. Add it as a sub header to the next batch\n latestPendingParentHeader.subHeaders.push(headerToGroup)\n } else {\n // This is a new header. Let's create it\n const header = createHeader(table, column, {\n id: [headerFamily, depth, column.id, headerToGroup?.id]\n .filter(Boolean)\n .join('_'),\n isPlaceholder,\n placeholderId: isPlaceholder\n ? `${pendingParentHeaders.filter(d => d.column === column).length}`\n : undefined,\n depth,\n index: pendingParentHeaders.length,\n })\n\n // Add the headerToGroup as a subHeader of the new header\n header.subHeaders.push(headerToGroup)\n // Add the new header to the pendingParentHeaders to get grouped\n // in the next batch\n pendingParentHeaders.push(header)\n }\n\n headerGroup.headers.push(headerToGroup)\n headerToGroup.headerGroup = headerGroup\n })\n\n headerGroups.push(headerGroup)\n\n if (depth > 0) {\n createHeaderGroup(pendingParentHeaders, depth - 1)\n }\n }\n\n const bottomHeaders = columnsToGroup.map((column, index) =>\n createHeader(table, column, {\n depth: maxDepth,\n index,\n })\n )\n\n createHeaderGroup(bottomHeaders, maxDepth - 1)\n\n headerGroups.reverse()\n\n // headerGroups = headerGroups.filter(headerGroup => {\n // return !headerGroup.headers.every(header => header.isPlaceholder)\n // })\n\n const recurseHeadersForSpans = (\n headers: Header[]\n ): { colSpan: number; rowSpan: number }[] => {\n const filteredHeaders = headers.filter(header =>\n header.column.getIsVisible()\n )\n\n return filteredHeaders.map(header => {\n let colSpan = 0\n let rowSpan = 0\n let childRowSpans = [0]\n\n if (header.subHeaders && header.subHeaders.length) {\n childRowSpans = []\n\n recurseHeadersForSpans(header.subHeaders).forEach(\n ({ colSpan: childColSpan, rowSpan: childRowSpan }) => {\n colSpan += childColSpan\n childRowSpans.push(childRowSpan)\n }\n )\n } else {\n colSpan = 1\n }\n\n const minChildRowSpan = Math.min(...childRowSpans)\n rowSpan = rowSpan + minChildRowSpan\n\n header.colSpan = colSpan\n header.rowSpan = rowSpan\n\n return { colSpan, rowSpan }\n })\n }\n\n recurseHeadersForSpans(headerGroups[0]?.headers ?? [])\n\n return headerGroups\n}\n", "import { TableFeature } from '../core/table'\nimport { RowData, Column, Header, OnChangeFn, Table, Updater } from '../types'\nimport { makeStateUpdater } from '../utils'\nimport { ColumnPinningPosition } from './Pinning'\n\n//\n\nexport interface ColumnSizingTableState {\n columnSizing: ColumnSizingState\n columnSizingInfo: ColumnSizingInfoState\n}\n\nexport type ColumnSizingState = Record\n\nexport interface ColumnSizingInfoState {\n startOffset: null | number\n startSize: null | number\n deltaOffset: null | number\n deltaPercentage: null | number\n isResizingColumn: false | string\n columnSizingStart: [string, number][]\n}\n\nexport type ColumnResizeMode = 'onChange' | 'onEnd'\n\nexport interface ColumnSizingOptions {\n enableColumnResizing?: boolean\n columnResizeMode?: ColumnResizeMode\n onColumnSizingChange?: OnChangeFn\n onColumnSizingInfoChange?: OnChangeFn\n}\n\nexport interface ColumnSizingDefaultOptions {\n columnResizeMode: ColumnResizeMode\n onColumnSizingChange: OnChangeFn\n onColumnSizingInfoChange: OnChangeFn\n}\n\nexport interface ColumnSizingInstance {\n setColumnSizing: (updater: Updater) => void\n setColumnSizingInfo: (updater: Updater) => void\n resetColumnSizing: (defaultState?: boolean) => void\n resetHeaderSizeInfo: (defaultState?: boolean) => void\n getTotalSize: () => number\n getLeftTotalSize: () => number\n getCenterTotalSize: () => number\n getRightTotalSize: () => number\n}\n\nexport interface ColumnSizingColumnDef {\n enableResizing?: boolean\n size?: number\n minSize?: number\n maxSize?: number\n}\n\nexport interface ColumnSizingColumn {\n getSize: () => number\n getStart: (position?: ColumnPinningPosition) => number\n getCanResize: () => boolean\n getIsResizing: () => boolean\n resetSize: () => void\n}\n\nexport interface ColumnSizingHeader {\n getSize: () => number\n getStart: (position?: ColumnPinningPosition) => number\n getResizeHandler: () => (event: unknown) => void\n}\n\n//\n\nexport const defaultColumnSizing = {\n size: 150,\n minSize: 20,\n maxSize: Number.MAX_SAFE_INTEGER,\n}\n\nconst getDefaultColumnSizingInfoState = (): ColumnSizingInfoState => ({\n startOffset: null,\n startSize: null,\n deltaOffset: null,\n deltaPercentage: null,\n isResizingColumn: false,\n columnSizingStart: [],\n})\n\nexport const ColumnSizing: TableFeature = {\n getDefaultColumnDef: (): ColumnSizingColumnDef => {\n return defaultColumnSizing\n },\n getInitialState: (state): ColumnSizingTableState => {\n return {\n columnSizing: {},\n columnSizingInfo: getDefaultColumnSizingInfoState(),\n ...state,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): ColumnSizingDefaultOptions => {\n return {\n columnResizeMode: 'onEnd',\n onColumnSizingChange: makeStateUpdater('columnSizing', table),\n onColumnSizingInfoChange: makeStateUpdater('columnSizingInfo', table),\n }\n },\n\n createColumn: (\n column: Column,\n table: Table\n ): ColumnSizingColumn => {\n return {\n getSize: () => {\n const columnSize = table.getState().columnSizing[column.id]\n\n return Math.min(\n Math.max(\n column.columnDef.minSize ?? defaultColumnSizing.minSize,\n columnSize ?? column.columnDef.size ?? defaultColumnSizing.size\n ),\n column.columnDef.maxSize ?? defaultColumnSizing.maxSize\n )\n },\n getStart: position => {\n const columns = !position\n ? table.getVisibleLeafColumns()\n : position === 'left'\n ? table.getLeftVisibleLeafColumns()\n : table.getRightVisibleLeafColumns()\n\n const index = columns.findIndex(d => d.id === column.id)\n\n if (index > 0) {\n const prevSiblingColumn = columns[index - 1]!\n\n return (\n prevSiblingColumn.getStart(position) + prevSiblingColumn.getSize()\n )\n }\n\n return 0\n },\n resetSize: () => {\n table.setColumnSizing(({ [column.id]: _, ...rest }) => {\n return rest\n })\n },\n getCanResize: () => {\n return (\n (column.columnDef.enableResizing ?? true) &&\n (table.options.enableColumnResizing ?? true)\n )\n },\n getIsResizing: () => {\n return table.getState().columnSizingInfo.isResizingColumn === column.id\n },\n }\n },\n\n createHeader: (\n header: Header,\n table: Table\n ): ColumnSizingHeader => {\n return {\n getSize: () => {\n let sum = 0\n\n const recurse = (header: Header) => {\n if (header.subHeaders.length) {\n header.subHeaders.forEach(recurse)\n } else {\n sum += header.column.getSize() ?? 0\n }\n }\n\n recurse(header)\n\n return sum\n },\n getStart: () => {\n if (header.index > 0) {\n const prevSiblingHeader =\n header.headerGroup.headers[header.index - 1]!\n return prevSiblingHeader.getStart() + prevSiblingHeader.getSize()\n }\n\n return 0\n },\n getResizeHandler: () => {\n const column = table.getColumn(header.column.id)\n const canResize = column?.getCanResize()\n\n return (e: unknown) => {\n if (!column || !canResize) {\n return\n }\n\n ;(e as any).persist?.()\n\n if (isTouchStartEvent(e)) {\n // lets not respond to multiple touches (e.g. 2 or 3 fingers)\n if (e.touches && e.touches.length > 1) {\n return\n }\n }\n\n const startSize = header.getSize()\n\n const columnSizingStart: [string, number][] = header\n ? header\n .getLeafHeaders()\n .map(d => [d.column.id, d.column.getSize()])\n : [[column.id, column.getSize()]]\n\n const clientX = isTouchStartEvent(e)\n ? Math.round(e.touches[0]!.clientX)\n : (e as MouseEvent).clientX\n\n const newColumnSizing: ColumnSizingState = {}\n\n const updateOffset = (\n eventType: 'move' | 'end',\n clientXPos?: number\n ) => {\n if (typeof clientXPos !== 'number') {\n return\n }\n\n table.setColumnSizingInfo(old => {\n const deltaOffset = clientXPos - (old?.startOffset ?? 0)\n const deltaPercentage = Math.max(\n deltaOffset / (old?.startSize ?? 0),\n -0.999999\n )\n\n old.columnSizingStart.forEach(([columnId, headerSize]) => {\n newColumnSizing[columnId] =\n Math.round(\n Math.max(headerSize + headerSize * deltaPercentage, 0) * 100\n ) / 100\n })\n\n return {\n ...old,\n deltaOffset,\n deltaPercentage,\n }\n })\n\n if (\n table.options.columnResizeMode === 'onChange' ||\n eventType === 'end'\n ) {\n table.setColumnSizing(old => ({\n ...old,\n ...newColumnSizing,\n }))\n }\n }\n\n const onMove = (clientXPos?: number) =>\n updateOffset('move', clientXPos)\n\n const onEnd = (clientXPos?: number) => {\n updateOffset('end', clientXPos)\n\n table.setColumnSizingInfo(old => ({\n ...old,\n isResizingColumn: false,\n startOffset: null,\n startSize: null,\n deltaOffset: null,\n deltaPercentage: null,\n columnSizingStart: [],\n }))\n }\n\n const mouseEvents = {\n moveHandler: (e: MouseEvent) => onMove(e.clientX),\n upHandler: (e: MouseEvent) => {\n document.removeEventListener('mousemove', mouseEvents.moveHandler)\n document.removeEventListener('mouseup', mouseEvents.upHandler)\n onEnd(e.clientX)\n },\n }\n\n const touchEvents = {\n moveHandler: (e: TouchEvent) => {\n if (e.cancelable) {\n e.preventDefault()\n e.stopPropagation()\n }\n onMove(e.touches[0]!.clientX)\n return false\n },\n upHandler: (e: TouchEvent) => {\n document.removeEventListener('touchmove', touchEvents.moveHandler)\n document.removeEventListener('touchend', touchEvents.upHandler)\n if (e.cancelable) {\n e.preventDefault()\n e.stopPropagation()\n }\n onEnd(e.touches[0]?.clientX)\n },\n }\n\n const passiveIfSupported = passiveEventSupported()\n ? { passive: false }\n : false\n\n if (isTouchStartEvent(e)) {\n document.addEventListener(\n 'touchmove',\n touchEvents.moveHandler,\n passiveIfSupported\n )\n document.addEventListener(\n 'touchend',\n touchEvents.upHandler,\n passiveIfSupported\n )\n } else {\n document.addEventListener(\n 'mousemove',\n mouseEvents.moveHandler,\n passiveIfSupported\n )\n document.addEventListener(\n 'mouseup',\n mouseEvents.upHandler,\n passiveIfSupported\n )\n }\n\n table.setColumnSizingInfo(old => ({\n ...old,\n startOffset: clientX,\n startSize,\n deltaOffset: 0,\n deltaPercentage: 0,\n columnSizingStart,\n isResizingColumn: column.id,\n }))\n }\n },\n }\n },\n\n createTable: (\n table: Table\n ): ColumnSizingInstance => {\n return {\n setColumnSizing: updater => table.options.onColumnSizingChange?.(updater),\n setColumnSizingInfo: updater =>\n table.options.onColumnSizingInfoChange?.(updater),\n resetColumnSizing: defaultState => {\n table.setColumnSizing(\n defaultState ? {} : table.initialState.columnSizing ?? {}\n )\n },\n resetHeaderSizeInfo: defaultState => {\n table.setColumnSizingInfo(\n defaultState\n ? getDefaultColumnSizingInfoState()\n : table.initialState.columnSizingInfo ??\n getDefaultColumnSizingInfoState()\n )\n },\n getTotalSize: () =>\n table.getHeaderGroups()[0]?.headers.reduce((sum, header) => {\n return sum + header.getSize()\n }, 0) ?? 0,\n getLeftTotalSize: () =>\n table.getLeftHeaderGroups()[0]?.headers.reduce((sum, header) => {\n return sum + header.getSize()\n }, 0) ?? 0,\n getCenterTotalSize: () =>\n table.getCenterHeaderGroups()[0]?.headers.reduce((sum, header) => {\n return sum + header.getSize()\n }, 0) ?? 0,\n getRightTotalSize: () =>\n table.getRightHeaderGroups()[0]?.headers.reduce((sum, header) => {\n return sum + header.getSize()\n }, 0) ?? 0,\n }\n },\n}\n\nlet passiveSupported: boolean | null = null\nexport function passiveEventSupported() {\n if (typeof passiveSupported === 'boolean') return passiveSupported\n\n let supported = false\n try {\n const options = {\n get passive() {\n supported = true\n return false\n },\n }\n\n const noop = () => {}\n\n window.addEventListener('test', noop, options)\n window.removeEventListener('test', noop)\n } catch (err) {\n supported = false\n }\n passiveSupported = supported\n return passiveSupported\n}\n\nfunction isTouchStartEvent(e: unknown): e is TouchEvent {\n return (e as TouchEvent).type === 'touchstart'\n}\n", "import { RowModel } from '..'\nimport { TableFeature } from '../core/table'\nimport { OnChangeFn, Table, Row, Updater, RowData } from '../types'\nimport { makeStateUpdater } from '../utils'\n\nexport type ExpandedStateList = Record\nexport type ExpandedState = true | Record\nexport interface ExpandedTableState {\n expanded: ExpandedState\n}\n\nexport interface ExpandedRow {\n toggleExpanded: (expanded?: boolean) => void\n getIsExpanded: () => boolean\n getCanExpand: () => boolean\n getToggleExpandedHandler: () => () => void\n}\n\nexport interface ExpandedOptions {\n manualExpanding?: boolean\n onExpandedChange?: OnChangeFn\n autoResetExpanded?: boolean\n enableExpanding?: boolean\n getExpandedRowModel?: (table: Table) => () => RowModel\n getIsRowExpanded?: (row: Row) => boolean\n getRowCanExpand?: (row: Row) => boolean\n paginateExpandedRows?: boolean\n}\n\nexport interface ExpandedInstance {\n _autoResetExpanded: () => void\n setExpanded: (updater: Updater) => void\n toggleAllRowsExpanded: (expanded?: boolean) => void\n resetExpanded: (defaultState?: boolean) => void\n getCanSomeRowsExpand: () => boolean\n getToggleAllRowsExpandedHandler: () => (event: unknown) => void\n getIsSomeRowsExpanded: () => boolean\n getIsAllRowsExpanded: () => boolean\n getExpandedDepth: () => number\n getExpandedRowModel: () => RowModel\n _getExpandedRowModel?: () => RowModel\n getPreExpandedRowModel: () => RowModel\n}\n\n//\n\nexport const Expanding: TableFeature = {\n getInitialState: (state): ExpandedTableState => {\n return {\n expanded: {},\n ...state,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): ExpandedOptions => {\n return {\n onExpandedChange: makeStateUpdater('expanded', table),\n paginateExpandedRows: true,\n }\n },\n\n createTable: (\n table: Table\n ): ExpandedInstance => {\n let registered = false\n let queued = false\n\n return {\n _autoResetExpanded: () => {\n if (!registered) {\n table._queue(() => {\n registered = true\n })\n return\n }\n\n if (\n table.options.autoResetAll ??\n table.options.autoResetExpanded ??\n !table.options.manualExpanding\n ) {\n if (queued) return\n queued = true\n table._queue(() => {\n table.resetExpanded()\n queued = false\n })\n }\n },\n setExpanded: updater => table.options.onExpandedChange?.(updater),\n toggleAllRowsExpanded: expanded => {\n if (expanded ?? !table.getIsAllRowsExpanded()) {\n table.setExpanded(true)\n } else {\n table.setExpanded({})\n }\n },\n resetExpanded: defaultState => {\n table.setExpanded(\n defaultState ? {} : table.initialState?.expanded ?? {}\n )\n },\n getCanSomeRowsExpand: () => {\n return table\n .getPrePaginationRowModel()\n .flatRows.some(row => row.getCanExpand())\n },\n getToggleAllRowsExpandedHandler: () => {\n return (e: unknown) => {\n ;(e as any).persist?.()\n table.toggleAllRowsExpanded()\n }\n },\n getIsSomeRowsExpanded: () => {\n const expanded = table.getState().expanded\n return expanded === true || Object.values(expanded).some(Boolean)\n },\n getIsAllRowsExpanded: () => {\n const expanded = table.getState().expanded\n\n // If expanded is true, save some cycles and return true\n if (typeof expanded === 'boolean') {\n return expanded === true\n }\n\n if (!Object.keys(expanded).length) {\n return false\n }\n\n // If any row is not expanded, return false\n if (table.getRowModel().flatRows.some(row => !row.getIsExpanded())) {\n return false\n }\n\n // They must all be expanded :shrug:\n return true\n },\n getExpandedDepth: () => {\n let maxDepth = 0\n\n const rowIds =\n table.getState().expanded === true\n ? Object.keys(table.getRowModel().rowsById)\n : Object.keys(table.getState().expanded)\n\n rowIds.forEach(id => {\n const splitId = id.split('.')\n maxDepth = Math.max(maxDepth, splitId.length)\n })\n\n return maxDepth\n },\n getPreExpandedRowModel: () => table.getSortedRowModel(),\n getExpandedRowModel: () => {\n if (!table._getExpandedRowModel && table.options.getExpandedRowModel) {\n table._getExpandedRowModel = table.options.getExpandedRowModel(table)\n }\n\n if (table.options.manualExpanding || !table._getExpandedRowModel) {\n return table.getPreExpandedRowModel()\n }\n\n return table._getExpandedRowModel()\n },\n }\n },\n\n createRow: (\n row: Row,\n table: Table\n ): ExpandedRow => {\n return {\n toggleExpanded: expanded => {\n table.setExpanded(old => {\n const exists = old === true ? true : !!old?.[row.id]\n\n let oldExpanded: ExpandedStateList = {}\n\n if (old === true) {\n Object.keys(table.getRowModel().rowsById).forEach(rowId => {\n oldExpanded[rowId] = true\n })\n } else {\n oldExpanded = old\n }\n\n expanded = expanded ?? !exists\n\n if (!exists && expanded) {\n return {\n ...oldExpanded,\n [row.id]: true,\n }\n }\n\n if (exists && !expanded) {\n const { [row.id]: _, ...rest } = oldExpanded\n return rest\n }\n\n return old\n })\n },\n getIsExpanded: () => {\n const expanded = table.getState().expanded\n\n return !!(\n table.options.getIsRowExpanded?.(row) ??\n (expanded === true || expanded?.[row.id])\n )\n },\n getCanExpand: () => {\n return (\n table.options.getRowCanExpand?.(row) ??\n ((table.options.enableExpanding ?? true) && !!row.subRows?.length)\n )\n },\n getToggleExpandedHandler: () => {\n const canExpand = row.getCanExpand()\n\n return () => {\n if (!canExpand) return\n row.toggleExpanded()\n }\n },\n }\n },\n}\n", "import { FilterFn } from './features/Filters'\n\nconst includesString: FilterFn = (\n row,\n columnId: string,\n filterValue: string\n) => {\n const search = filterValue.toLowerCase()\n return Boolean(\n row\n .getValue(columnId)\n ?.toString()\n ?.toLowerCase()\n ?.includes(search)\n )\n}\n\nincludesString.autoRemove = (val: any) => testFalsey(val)\n\nconst includesStringSensitive: FilterFn = (\n row,\n columnId: string,\n filterValue: string\n) => {\n return Boolean(\n row.getValue(columnId)?.toString()?.includes(filterValue)\n )\n}\n\nincludesStringSensitive.autoRemove = (val: any) => testFalsey(val)\n\nconst equalsString: FilterFn = (\n row,\n columnId: string,\n filterValue: string\n) => {\n return (\n row.getValue(columnId)?.toString()?.toLowerCase() ===\n filterValue?.toLowerCase()\n )\n}\n\nequalsString.autoRemove = (val: any) => testFalsey(val)\n\nconst arrIncludes: FilterFn = (\n row,\n columnId: string,\n filterValue: unknown\n) => {\n return row.getValue(columnId)?.includes(filterValue)\n}\n\narrIncludes.autoRemove = (val: any) => testFalsey(val) || !val?.length\n\nconst arrIncludesAll: FilterFn = (\n row,\n columnId: string,\n filterValue: unknown[]\n) => {\n return !filterValue.some(\n val => !row.getValue(columnId)?.includes(val)\n )\n}\n\narrIncludesAll.autoRemove = (val: any) => testFalsey(val) || !val?.length\n\nconst arrIncludesSome: FilterFn = (\n row,\n columnId: string,\n filterValue: unknown[]\n) => {\n return filterValue.some(val =>\n row.getValue(columnId)?.includes(val)\n )\n}\n\narrIncludesSome.autoRemove = (val: any) => testFalsey(val) || !val?.length\n\nconst equals: FilterFn = (row, columnId: string, filterValue: unknown) => {\n return row.getValue(columnId) === filterValue\n}\n\nequals.autoRemove = (val: any) => testFalsey(val)\n\nconst weakEquals: FilterFn = (\n row,\n columnId: string,\n filterValue: unknown\n) => {\n return row.getValue(columnId) == filterValue\n}\n\nweakEquals.autoRemove = (val: any) => testFalsey(val)\n\nconst inNumberRange: FilterFn = (\n row,\n columnId: string,\n filterValue: [number, number]\n) => {\n let [min, max] = filterValue\n\n const rowValue = row.getValue(columnId)\n return rowValue >= min && rowValue <= max\n}\n\ninNumberRange.resolveFilterValue = (val: [any, any]) => {\n let [unsafeMin, unsafeMax] = val\n\n let parsedMin =\n typeof unsafeMin !== 'number' ? parseFloat(unsafeMin as string) : unsafeMin\n let parsedMax =\n typeof unsafeMax !== 'number' ? parseFloat(unsafeMax as string) : unsafeMax\n\n let min =\n unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max = unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n}\n\ninNumberRange.autoRemove = (val: any) =>\n testFalsey(val) || (testFalsey(val[0]) && testFalsey(val[1]))\n\n// Export\n\nexport const filterFns = {\n includesString,\n includesStringSensitive,\n equalsString,\n arrIncludes,\n arrIncludesAll,\n arrIncludesSome,\n equals,\n weakEquals,\n inNumberRange,\n}\n\nexport type BuiltInFilterFn = keyof typeof filterFns\n\n// Utils\n\nfunction testFalsey(val: any) {\n return val === undefined || val === null || val === ''\n}\n", "import { RowModel } from '..'\nimport { TableFeature } from '../core/table'\nimport { BuiltInFilterFn, filterFns } from '../filterFns'\nimport {\n Column,\n OnChangeFn,\n Table,\n Row,\n Updater,\n RowData,\n FilterMeta,\n FilterFns,\n} from '../types'\nimport { functionalUpdate, isFunction, makeStateUpdater } from '../utils'\n\nexport interface FiltersTableState {\n columnFilters: ColumnFiltersState\n globalFilter: any\n}\n\nexport type ColumnFiltersState = ColumnFilter[]\n\nexport interface ColumnFilter {\n id: string\n value: unknown\n}\n\nexport interface ResolvedColumnFilter {\n id: string\n resolvedValue: unknown\n filterFn: FilterFn\n}\n\nexport interface FilterFn {\n (\n row: Row,\n columnId: string,\n filterValue: any,\n addMeta: (meta: FilterMeta) => void\n ): boolean\n\n resolveFilterValue?: TransformFilterValueFn\n autoRemove?: ColumnFilterAutoRemoveTestFn\n}\n\nexport type TransformFilterValueFn = (\n value: any,\n column?: Column\n) => unknown\n\nexport type ColumnFilterAutoRemoveTestFn = (\n value: any,\n column?: Column\n) => boolean\n\nexport type CustomFilterFns = Record<\n string,\n FilterFn\n>\n\nexport type FilterFnOption =\n | 'auto'\n | BuiltInFilterFn\n | keyof FilterFns\n | FilterFn\n\nexport interface FiltersColumnDef {\n filterFn?: FilterFnOption\n enableColumnFilter?: boolean\n enableGlobalFilter?: boolean\n}\n\nexport interface FiltersColumn {\n getAutoFilterFn: () => FilterFn | undefined\n getFilterFn: () => FilterFn | undefined\n setFilterValue: (updater: Updater) => void\n getCanFilter: () => boolean\n getCanGlobalFilter: () => boolean\n getFacetedRowModel: () => RowModel\n _getFacetedRowModel?: () => RowModel\n getIsFiltered: () => boolean\n getFilterValue: () => unknown\n getFilterIndex: () => number\n getFacetedUniqueValues: () => Map\n _getFacetedUniqueValues?: () => Map\n getFacetedMinMaxValues: () => undefined | [number, number]\n _getFacetedMinMaxValues?: () => undefined | [number, number]\n}\n\nexport interface FiltersRow {\n columnFilters: Record\n columnFiltersMeta: Record\n}\n\ninterface FiltersOptionsBase {\n enableFilters?: boolean\n manualFiltering?: boolean\n filterFromLeafRows?: boolean\n maxLeafRowFilterDepth?: number\n getFilteredRowModel?: (table: Table) => () => RowModel\n\n // Column\n onColumnFiltersChange?: OnChangeFn\n enableColumnFilters?: boolean\n\n // Global\n globalFilterFn?: FilterFnOption\n onGlobalFilterChange?: OnChangeFn\n enableGlobalFilter?: boolean\n getColumnCanGlobalFilter?: (column: Column) => boolean\n\n // Faceting\n getFacetedRowModel?: (\n table: Table,\n columnId: string\n ) => () => RowModel\n getFacetedUniqueValues?: (\n table: Table,\n columnId: string\n ) => () => Map\n getFacetedMinMaxValues?: (\n table: Table,\n columnId: string\n ) => () => undefined | [number, number]\n}\n\ntype ResolvedFilterFns = keyof FilterFns extends never\n ? {\n filterFns?: Record>\n }\n : {\n filterFns: Record>\n }\n\nexport interface FiltersOptions\n extends FiltersOptionsBase,\n ResolvedFilterFns {}\n\nexport interface FiltersInstance {\n setColumnFilters: (updater: Updater) => void\n\n resetColumnFilters: (defaultState?: boolean) => void\n\n // Column Filters\n getPreFilteredRowModel: () => RowModel\n getFilteredRowModel: () => RowModel\n _getFilteredRowModel?: () => RowModel\n\n // Global Filters\n setGlobalFilter: (updater: Updater) => void\n resetGlobalFilter: (defaultState?: boolean) => void\n getGlobalAutoFilterFn: () => FilterFn | undefined\n getGlobalFilterFn: () => FilterFn | undefined\n getGlobalFacetedRowModel: () => RowModel\n _getGlobalFacetedRowModel?: () => RowModel\n getGlobalFacetedUniqueValues: () => Map\n _getGlobalFacetedUniqueValues?: () => Map\n getGlobalFacetedMinMaxValues: () => undefined | [number, number]\n _getGlobalFacetedMinMaxValues?: () => undefined | [number, number]\n}\n\n//\n\nexport const Filters: TableFeature = {\n getDefaultColumnDef: (): FiltersColumnDef => {\n return {\n filterFn: 'auto',\n }\n },\n\n getInitialState: (state): FiltersTableState => {\n return {\n columnFilters: [],\n globalFilter: undefined,\n // filtersProgress: 1,\n // facetProgress: {},\n ...state,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): FiltersOptions => {\n return {\n onColumnFiltersChange: makeStateUpdater('columnFilters', table),\n onGlobalFilterChange: makeStateUpdater('globalFilter', table),\n filterFromLeafRows: false,\n maxLeafRowFilterDepth: 100,\n globalFilterFn: 'auto',\n getColumnCanGlobalFilter: column => {\n const value = table\n .getCoreRowModel()\n .flatRows[0]?._getAllCellsByColumnId()\n [column.id]?.getValue()\n\n return typeof value === 'string' || typeof value === 'number'\n },\n } as FiltersOptions\n },\n\n createColumn: (\n column: Column,\n table: Table\n ): FiltersColumn => {\n return {\n getAutoFilterFn: () => {\n const firstRow = table.getCoreRowModel().flatRows[0]\n\n const value = firstRow?.getValue(column.id)\n\n if (typeof value === 'string') {\n return filterFns.includesString\n }\n\n if (typeof value === 'number') {\n return filterFns.inNumberRange\n }\n\n if (typeof value === 'boolean') {\n return filterFns.equals\n }\n\n if (value !== null && typeof value === 'object') {\n return filterFns.equals\n }\n\n if (Array.isArray(value)) {\n return filterFns.arrIncludes\n }\n\n return filterFns.weakEquals\n },\n getFilterFn: () => {\n return isFunction(column.columnDef.filterFn)\n ? column.columnDef.filterFn\n : column.columnDef.filterFn === 'auto'\n ? column.getAutoFilterFn()\n // @ts-ignore \n : table.options.filterFns?.[column.columnDef.filterFn as string] ??\n filterFns[column.columnDef.filterFn as BuiltInFilterFn]\n },\n getCanFilter: () => {\n return (\n (column.columnDef.enableColumnFilter ?? true) &&\n (table.options.enableColumnFilters ?? true) &&\n (table.options.enableFilters ?? true) &&\n !!column.accessorFn\n )\n },\n\n getCanGlobalFilter: () => {\n return (\n (column.columnDef.enableGlobalFilter ?? true) &&\n (table.options.enableGlobalFilter ?? true) &&\n (table.options.enableFilters ?? true) &&\n (table.options.getColumnCanGlobalFilter?.(column) ?? true) &&\n !!column.accessorFn\n )\n },\n\n getIsFiltered: () => column.getFilterIndex() > -1,\n\n getFilterValue: () =>\n table.getState().columnFilters?.find(d => d.id === column.id)?.value,\n\n getFilterIndex: () =>\n table.getState().columnFilters?.findIndex(d => d.id === column.id) ??\n -1,\n\n setFilterValue: value => {\n table.setColumnFilters(old => {\n const filterFn = column.getFilterFn()\n const previousfilter = old?.find(d => d.id === column.id)\n\n const newFilter = functionalUpdate(\n value,\n previousfilter ? previousfilter.value : undefined\n )\n\n //\n if (\n shouldAutoRemoveFilter(\n filterFn as FilterFn,\n newFilter,\n column\n )\n ) {\n return old?.filter(d => d.id !== column.id) ?? []\n }\n\n const newFilterObj = { id: column.id, value: newFilter }\n\n if (previousfilter) {\n return (\n old?.map(d => {\n if (d.id === column.id) {\n return newFilterObj\n }\n return d\n }) ?? []\n )\n }\n\n if (old?.length) {\n return [...old, newFilterObj]\n }\n\n return [newFilterObj]\n })\n },\n _getFacetedRowModel:\n table.options.getFacetedRowModel &&\n table.options.getFacetedRowModel(table, column.id),\n getFacetedRowModel: () => {\n if (!column._getFacetedRowModel) {\n return table.getPreFilteredRowModel()\n }\n\n return column._getFacetedRowModel()\n },\n _getFacetedUniqueValues:\n table.options.getFacetedUniqueValues &&\n table.options.getFacetedUniqueValues(table, column.id),\n getFacetedUniqueValues: () => {\n if (!column._getFacetedUniqueValues) {\n return new Map()\n }\n\n return column._getFacetedUniqueValues()\n },\n _getFacetedMinMaxValues:\n table.options.getFacetedMinMaxValues &&\n table.options.getFacetedMinMaxValues(table, column.id),\n getFacetedMinMaxValues: () => {\n if (!column._getFacetedMinMaxValues) {\n return undefined\n }\n\n return column._getFacetedMinMaxValues()\n },\n // () => [column.getFacetedRowModel()],\n // facetedRowModel => getRowModelMinMaxValues(facetedRowModel, column.id),\n }\n },\n\n createRow: (\n row: Row,\n table: Table\n ): FiltersRow => {\n return {\n columnFilters: {},\n columnFiltersMeta: {},\n }\n },\n\n createTable: (\n table: Table\n ): FiltersInstance => {\n return {\n getGlobalAutoFilterFn: () => {\n return filterFns.includesString\n },\n\n getGlobalFilterFn: () => {\n const { globalFilterFn: globalFilterFn } = table.options\n\n return isFunction(globalFilterFn)\n ? globalFilterFn\n : globalFilterFn === 'auto'\n ? table.getGlobalAutoFilterFn()\n // @ts-ignore\n : table.options.filterFns?.[globalFilterFn as string] ??\n filterFns[globalFilterFn as BuiltInFilterFn]\n },\n\n setColumnFilters: (updater: Updater) => {\n const leafColumns = table.getAllLeafColumns()\n\n const updateFn = (old: ColumnFiltersState) => {\n return functionalUpdate(updater, old)?.filter(filter => {\n const column = leafColumns.find(d => d.id === filter.id)\n\n if (column) {\n const filterFn = column.getFilterFn()\n\n if (shouldAutoRemoveFilter(filterFn, filter.value, column)) {\n return false\n }\n }\n\n return true\n })\n }\n\n table.options.onColumnFiltersChange?.(updateFn)\n },\n\n setGlobalFilter: updater => {\n table.options.onGlobalFilterChange?.(updater)\n },\n\n resetGlobalFilter: defaultState => {\n table.setGlobalFilter(\n defaultState ? undefined : table.initialState.globalFilter\n )\n },\n\n resetColumnFilters: defaultState => {\n table.setColumnFilters(\n defaultState ? [] : table.initialState?.columnFilters ?? []\n )\n },\n\n getPreFilteredRowModel: () => table.getCoreRowModel(),\n getFilteredRowModel: () => {\n if (!table._getFilteredRowModel && table.options.getFilteredRowModel) {\n table._getFilteredRowModel = table.options.getFilteredRowModel(table)\n }\n\n if (table.options.manualFiltering || !table._getFilteredRowModel) {\n return table.getPreFilteredRowModel()\n }\n\n return table._getFilteredRowModel()\n },\n\n _getGlobalFacetedRowModel:\n table.options.getFacetedRowModel &&\n table.options.getFacetedRowModel(table, '__global__'),\n\n getGlobalFacetedRowModel: () => {\n if (table.options.manualFiltering || !table._getGlobalFacetedRowModel) {\n return table.getPreFilteredRowModel()\n }\n\n return table._getGlobalFacetedRowModel()\n },\n\n _getGlobalFacetedUniqueValues:\n table.options.getFacetedUniqueValues &&\n table.options.getFacetedUniqueValues(table, '__global__'),\n getGlobalFacetedUniqueValues: () => {\n if (!table._getGlobalFacetedUniqueValues) {\n return new Map()\n }\n\n return table._getGlobalFacetedUniqueValues()\n },\n\n _getGlobalFacetedMinMaxValues:\n table.options.getFacetedMinMaxValues &&\n table.options.getFacetedMinMaxValues(table, '__global__'),\n getGlobalFacetedMinMaxValues: () => {\n if (!table._getGlobalFacetedMinMaxValues) {\n return\n }\n\n return table._getGlobalFacetedMinMaxValues()\n },\n }\n },\n}\n\nexport function shouldAutoRemoveFilter(\n filterFn?: FilterFn,\n value?: any,\n column?: Column\n) {\n return (\n (filterFn && filterFn.autoRemove\n ? filterFn.autoRemove(value, column)\n : false) ||\n typeof value === 'undefined' ||\n (typeof value === 'string' && !value)\n )\n}\n", "import { AggregationFn } from './features/Grouping'\nimport { isNumberArray } from './utils'\n\nconst sum: AggregationFn = (columnId, _leafRows, childRows) => {\n // It's faster to just add the aggregations together instead of\n // process leaf nodes individually\n return childRows.reduce((sum, next) => {\n const nextValue = next.getValue(columnId)\n return sum + (typeof nextValue === 'number' ? nextValue : 0)\n }, 0)\n}\n\nconst min: AggregationFn = (columnId, _leafRows, childRows) => {\n let min: number | undefined\n\n childRows.forEach(row => {\n const value = row.getValue(columnId)\n\n if (\n value != null &&\n (min! > value || (min === undefined && value >= value))\n ) {\n min = value\n }\n })\n\n return min\n}\n\nconst max: AggregationFn = (columnId, _leafRows, childRows) => {\n let max: number | undefined\n\n childRows.forEach(row => {\n const value = row.getValue(columnId)\n if (\n value != null &&\n (max! < value || (max === undefined && value >= value))\n ) {\n max = value\n }\n })\n\n return max\n}\n\nconst extent: AggregationFn = (columnId, _leafRows, childRows) => {\n let min: number | undefined\n let max: number | undefined\n\n childRows.forEach(row => {\n const value = row.getValue(columnId)\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value\n } else {\n if (min > value) min = value\n if (max! < value) max = value\n }\n }\n })\n\n return [min, max]\n}\n\nconst mean: AggregationFn = (columnId, leafRows) => {\n let count = 0\n let sum = 0\n\n leafRows.forEach(row => {\n let value = row.getValue(columnId)\n if (value != null && (value = +value) >= value) {\n ++count, (sum += value)\n }\n })\n\n if (count) return sum / count\n\n return\n}\n\nconst median: AggregationFn = (columnId, leafRows) => {\n if (!leafRows.length) {\n return\n }\n\n const values = leafRows.map(row => row.getValue(columnId))\n if (!isNumberArray(values)) {\n return\n }\n if (values.length === 1) {\n return values[0]\n }\n\n const mid = Math.floor(values.length / 2)\n const nums = values.sort((a, b) => a - b)\n return values.length % 2 !== 0 ? nums[mid] : (nums[mid - 1]! + nums[mid]!) / 2\n}\n\nconst unique: AggregationFn = (columnId, leafRows) => {\n return Array.from(new Set(leafRows.map(d => d.getValue(columnId))).values())\n}\n\nconst uniqueCount: AggregationFn = (columnId, leafRows) => {\n return new Set(leafRows.map(d => d.getValue(columnId))).size\n}\n\nconst count: AggregationFn = (_columnId, leafRows) => {\n return leafRows.length\n}\n\nexport const aggregationFns = {\n sum,\n min,\n max,\n extent,\n mean,\n median,\n unique,\n uniqueCount,\n count,\n}\n\nexport type BuiltInAggregationFn = keyof typeof aggregationFns\n", "import { RowModel } from '..'\nimport { BuiltInAggregationFn, aggregationFns } from '../aggregationFns'\nimport { TableFeature } from '../core/table'\nimport {\n Cell,\n Column,\n OnChangeFn,\n Table,\n Row,\n Updater,\n ColumnDefTemplate,\n RowData,\n AggregationFns,\n} from '../types'\nimport { isFunction, makeStateUpdater } from '../utils'\n\nexport type GroupingState = string[]\n\nexport interface GroupingTableState {\n grouping: GroupingState\n}\n\nexport type AggregationFn = (\n columnId: string,\n leafRows: Row[],\n childRows: Row[]\n) => any\n\nexport type CustomAggregationFns = Record>\n\nexport type AggregationFnOption =\n | 'auto'\n | keyof AggregationFns\n | BuiltInAggregationFn\n | AggregationFn\n\nexport interface GroupingColumnDef {\n aggregationFn?: AggregationFnOption\n aggregatedCell?: ColumnDefTemplate<\n ReturnType['getContext']>\n >\n enableGrouping?: boolean\n getGroupingValue?: (row: TData) => any\n}\n\nexport interface GroupingColumn {\n getCanGroup: () => boolean\n getIsGrouped: () => boolean\n getGroupedIndex: () => number\n toggleGrouping: () => void\n getToggleGroupingHandler: () => () => void\n getAutoAggregationFn: () => AggregationFn | undefined\n getAggregationFn: () => AggregationFn | undefined\n}\n\nexport interface GroupingRow {\n groupingColumnId?: string\n groupingValue?: unknown\n getIsGrouped: () => boolean\n getGroupingValue: (columnId: string) => unknown\n _groupingValuesCache: Record\n}\n\nexport interface GroupingCell {\n getIsGrouped: () => boolean\n getIsPlaceholder: () => boolean\n getIsAggregated: () => boolean\n}\n\nexport interface ColumnDefaultOptions {\n // Column\n onGroupingChange: OnChangeFn\n enableGrouping: boolean\n}\n\ninterface GroupingOptionsBase {\n manualGrouping?: boolean\n onGroupingChange?: OnChangeFn\n enableGrouping?: boolean\n getGroupedRowModel?: (table: Table) => () => RowModel\n groupedColumnMode?: false | 'reorder' | 'remove'\n}\n\ntype ResolvedAggregationFns = keyof AggregationFns extends never\n ? {\n aggregationFns?: Record>\n }\n : {\n aggregationFns: Record>\n }\n\nexport interface GroupingOptions\n extends GroupingOptionsBase,\n ResolvedAggregationFns {}\n\nexport type GroupingColumnMode = false | 'reorder' | 'remove'\n\nexport interface GroupingInstance {\n setGrouping: (updater: Updater) => void\n resetGrouping: (defaultState?: boolean) => void\n getPreGroupedRowModel: () => RowModel\n getGroupedRowModel: () => RowModel\n _getGroupedRowModel?: () => RowModel\n}\n\n//\n\nexport const Grouping: TableFeature = {\n getDefaultColumnDef: (): GroupingColumnDef<\n TData,\n unknown\n > => {\n return {\n aggregatedCell: props => (props.getValue() as any)?.toString?.() ?? null,\n aggregationFn: 'auto',\n }\n },\n\n getInitialState: (state): GroupingTableState => {\n return {\n grouping: [],\n ...state,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): GroupingOptions => {\n return {\n onGroupingChange: makeStateUpdater('grouping', table),\n groupedColumnMode: 'reorder',\n }\n },\n\n createColumn: (\n column: Column,\n table: Table\n ): GroupingColumn => {\n return {\n toggleGrouping: () => {\n table.setGrouping(old => {\n // Find any existing grouping for this column\n if (old?.includes(column.id)) {\n return old.filter(d => d !== column.id)\n }\n\n return [...(old ?? []), column.id]\n })\n },\n\n getCanGroup: () => {\n return (\n column.columnDef.enableGrouping ??\n true ??\n table.options.enableGrouping ??\n true ??\n !!column.accessorFn\n )\n },\n\n getIsGrouped: () => {\n return table.getState().grouping?.includes(column.id)\n },\n\n getGroupedIndex: () => table.getState().grouping?.indexOf(column.id),\n\n getToggleGroupingHandler: () => {\n const canGroup = column.getCanGroup()\n\n return () => {\n if (!canGroup) return\n column.toggleGrouping()\n }\n },\n getAutoAggregationFn: () => {\n const firstRow = table.getCoreRowModel().flatRows[0]\n\n const value = firstRow?.getValue(column.id)\n\n if (typeof value === 'number') {\n return aggregationFns.sum\n }\n\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return aggregationFns.extent\n }\n },\n getAggregationFn: () => {\n if (!column) {\n throw new Error()\n }\n\n return isFunction(column.columnDef.aggregationFn)\n ? column.columnDef.aggregationFn\n : column.columnDef.aggregationFn === 'auto'\n ? column.getAutoAggregationFn()\n : table.options.aggregationFns?.[\n column.columnDef.aggregationFn as string\n ] ??\n aggregationFns[\n column.columnDef.aggregationFn as BuiltInAggregationFn\n ]\n },\n }\n },\n\n createTable: (\n table: Table\n ): GroupingInstance => {\n return {\n setGrouping: updater => table.options.onGroupingChange?.(updater),\n\n resetGrouping: defaultState => {\n table.setGrouping(\n defaultState ? [] : table.initialState?.grouping ?? []\n )\n },\n\n getPreGroupedRowModel: () => table.getFilteredRowModel(),\n getGroupedRowModel: () => {\n if (!table._getGroupedRowModel && table.options.getGroupedRowModel) {\n table._getGroupedRowModel = table.options.getGroupedRowModel(table)\n }\n\n if (table.options.manualGrouping || !table._getGroupedRowModel) {\n return table.getPreGroupedRowModel()\n }\n\n return table._getGroupedRowModel()\n },\n }\n },\n\n createRow: (\n row: Row,\n table: Table\n ): GroupingRow => {\n return {\n getIsGrouped: () => !!row.groupingColumnId,\n getGroupingValue: columnId => {\n if (row._groupingValuesCache.hasOwnProperty(columnId)) {\n return row._groupingValuesCache[columnId]\n }\n\n const column = table.getColumn(columnId)\n\n if (!column?.columnDef.getGroupingValue) {\n return row.getValue(columnId)\n }\n\n row._groupingValuesCache[columnId] = column.columnDef.getGroupingValue(\n row.original\n )\n\n return row._groupingValuesCache[columnId]\n },\n _groupingValuesCache: {},\n }\n },\n\n createCell: (\n cell: Cell,\n column: Column,\n row: Row,\n table: Table\n ): GroupingCell => {\n const getRenderValue = () =>\n cell.getValue() ?? table.options.renderFallbackValue\n\n return {\n getIsGrouped: () =>\n column.getIsGrouped() && column.id === row.groupingColumnId,\n getIsPlaceholder: () => !cell.getIsGrouped() && column.getIsGrouped(),\n getIsAggregated: () =>\n !cell.getIsGrouped() &&\n !cell.getIsPlaceholder() &&\n !!row.subRows?.length,\n }\n },\n}\n\nexport function orderColumns(\n leafColumns: Column[],\n grouping: string[],\n groupedColumnMode?: GroupingColumnMode\n) {\n if (!grouping?.length || !groupedColumnMode) {\n return leafColumns\n }\n\n const nonGroupingColumns = leafColumns.filter(\n col => !grouping.includes(col.id)\n )\n\n if (groupedColumnMode === 'remove') {\n return nonGroupingColumns\n }\n\n const groupingColumns = grouping\n .map(g => leafColumns.find(col => col.id === g)!)\n .filter(Boolean)\n\n return [...groupingColumns, ...nonGroupingColumns]\n}\n", "import { makeStateUpdater, memo } from '../utils'\n\nimport { Table, OnChangeFn, Updater, Column, RowData } from '../types'\n\nimport { orderColumns } from './Grouping'\nimport { TableFeature } from '../core/table'\n\nexport interface ColumnOrderTableState {\n columnOrder: ColumnOrderState\n}\n\nexport type ColumnOrderState = string[]\n\nexport interface ColumnOrderOptions {\n onColumnOrderChange?: OnChangeFn\n}\n\nexport interface ColumnOrderDefaultOptions {\n onColumnOrderChange: OnChangeFn\n}\n\nexport interface ColumnOrderInstance {\n setColumnOrder: (updater: Updater) => void\n resetColumnOrder: (defaultState?: boolean) => void\n _getOrderColumnsFn: () => (\n columns: Column[]\n ) => Column[]\n}\n\n//\n\nexport const Ordering: TableFeature = {\n getInitialState: (state): ColumnOrderTableState => {\n return {\n columnOrder: [],\n ...state,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): ColumnOrderDefaultOptions => {\n return {\n onColumnOrderChange: makeStateUpdater('columnOrder', table),\n }\n },\n\n createTable: (\n table: Table\n ): ColumnOrderInstance => {\n return {\n setColumnOrder: updater => table.options.onColumnOrderChange?.(updater),\n resetColumnOrder: defaultState => {\n table.setColumnOrder(\n defaultState ? [] : table.initialState.columnOrder ?? []\n )\n },\n _getOrderColumnsFn: memo(\n () => [\n table.getState().columnOrder,\n table.getState().grouping,\n table.options.groupedColumnMode,\n ],\n (columnOrder, grouping, groupedColumnMode) => columns => {\n // Sort grouped columns to the start of the column list\n // before the headers are built\n let orderedColumns: Column[] = []\n\n // If there is no order, return the normal columns\n if (!columnOrder?.length) {\n orderedColumns = columns\n } else {\n const columnOrderCopy = [...columnOrder]\n\n // If there is an order, make a copy of the columns\n const columnsCopy = [...columns]\n\n // And make a new ordered array of the columns\n\n // Loop over the columns and place them in order into the new array\n while (columnsCopy.length && columnOrderCopy.length) {\n const targetColumnId = columnOrderCopy.shift()\n const foundIndex = columnsCopy.findIndex(\n d => d.id === targetColumnId\n )\n if (foundIndex > -1) {\n orderedColumns.push(columnsCopy.splice(foundIndex, 1)[0]!)\n }\n }\n\n // If there are any columns left, add them to the end\n orderedColumns = [...orderedColumns, ...columnsCopy]\n }\n\n return orderColumns(orderedColumns, grouping, groupedColumnMode)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getOrderColumnsFn',\n // debug: () => table.options.debugAll ?? table.options.debugTable,\n }\n ),\n }\n },\n}\n", "import { TableFeature } from '../core/table'\nimport { OnChangeFn, Table, RowModel, Updater, RowData } from '../types'\nimport { functionalUpdate, makeStateUpdater, memo } from '../utils'\n\nexport interface PaginationState {\n pageIndex: number\n pageSize: number\n}\n\nexport interface PaginationTableState {\n pagination: PaginationState\n}\n\nexport interface PaginationInitialTableState {\n pagination?: Partial\n}\n\nexport interface PaginationOptions {\n pageCount?: number\n manualPagination?: boolean\n onPaginationChange?: OnChangeFn\n autoResetPageIndex?: boolean\n getPaginationRowModel?: (table: Table) => () => RowModel\n}\n\nexport interface PaginationDefaultOptions {\n onPaginationChange: OnChangeFn\n}\n\nexport interface PaginationInstance {\n _autoResetPageIndex: () => void\n setPagination: (updater: Updater) => void\n resetPagination: (defaultState?: boolean) => void\n setPageIndex: (updater: Updater) => void\n resetPageIndex: (defaultState?: boolean) => void\n setPageSize: (updater: Updater) => void\n resetPageSize: (defaultState?: boolean) => void\n setPageCount: (updater: Updater) => void\n getPageOptions: () => number[]\n getCanPreviousPage: () => boolean\n getCanNextPage: () => boolean\n previousPage: () => void\n nextPage: () => void\n getPrePaginationRowModel: () => RowModel\n getPaginationRowModel: () => RowModel\n _getPaginationRowModel?: () => RowModel\n getPageCount: () => number\n}\n\n//\n\nconst defaultPageIndex = 0\nconst defaultPageSize = 10\n\nconst getDefaultPaginationState = (): PaginationState => ({\n pageIndex: defaultPageIndex,\n pageSize: defaultPageSize,\n})\n\nexport const Pagination: TableFeature = {\n getInitialState: (state): PaginationTableState => {\n return {\n ...state,\n pagination: {\n ...getDefaultPaginationState(),\n ...state?.pagination,\n },\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): PaginationDefaultOptions => {\n return {\n onPaginationChange: makeStateUpdater('pagination', table),\n }\n },\n\n createTable: (\n table: Table\n ): PaginationInstance => {\n let registered = false\n let queued = false\n\n return {\n _autoResetPageIndex: () => {\n if (!registered) {\n table._queue(() => {\n registered = true\n })\n return\n }\n\n if (\n table.options.autoResetAll ??\n table.options.autoResetPageIndex ??\n !table.options.manualPagination\n ) {\n if (queued) return\n queued = true\n table._queue(() => {\n table.resetPageIndex()\n queued = false\n })\n }\n },\n setPagination: updater => {\n const safeUpdater: Updater = old => {\n let newState = functionalUpdate(updater, old)\n\n return newState\n }\n\n return table.options.onPaginationChange?.(safeUpdater)\n },\n resetPagination: defaultState => {\n table.setPagination(\n defaultState\n ? getDefaultPaginationState()\n : table.initialState.pagination ?? getDefaultPaginationState()\n )\n },\n setPageIndex: updater => {\n table.setPagination(old => {\n let pageIndex = functionalUpdate(updater, old.pageIndex)\n\n const maxPageIndex =\n typeof table.options.pageCount === 'undefined' ||\n table.options.pageCount === -1\n ? Number.MAX_SAFE_INTEGER\n : table.options.pageCount - 1\n\n pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex))\n\n return {\n ...old,\n pageIndex,\n }\n })\n },\n resetPageIndex: defaultState => {\n table.setPageIndex(\n defaultState\n ? defaultPageIndex\n : table.initialState?.pagination?.pageIndex ?? defaultPageIndex\n )\n },\n resetPageSize: defaultState => {\n table.setPageSize(\n defaultState\n ? defaultPageSize\n : table.initialState?.pagination?.pageSize ?? defaultPageSize\n )\n },\n setPageSize: updater => {\n table.setPagination(old => {\n const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize))\n const topRowIndex = old.pageSize * old.pageIndex!\n const pageIndex = Math.floor(topRowIndex / pageSize)\n\n return {\n ...old,\n pageIndex,\n pageSize,\n }\n })\n },\n setPageCount: updater =>\n table.setPagination(old => {\n let newPageCount = functionalUpdate(\n updater,\n table.options.pageCount ?? -1\n )\n\n if (typeof newPageCount === 'number') {\n newPageCount = Math.max(-1, newPageCount)\n }\n\n return {\n ...old,\n pageCount: newPageCount,\n }\n }),\n\n getPageOptions: memo(\n () => [table.getPageCount()],\n pageCount => {\n let pageOptions: number[] = []\n if (pageCount && pageCount > 0) {\n pageOptions = [...new Array(pageCount)].fill(null).map((_, i) => i)\n }\n return pageOptions\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getPageOptions',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n }\n ),\n\n getCanPreviousPage: () => table.getState().pagination.pageIndex > 0,\n\n getCanNextPage: () => {\n const { pageIndex } = table.getState().pagination\n\n const pageCount = table.getPageCount()\n\n if (pageCount === -1) {\n return true\n }\n\n if (pageCount === 0) {\n return false\n }\n\n return pageIndex < pageCount - 1\n },\n\n previousPage: () => {\n return table.setPageIndex(old => old - 1)\n },\n\n nextPage: () => {\n return table.setPageIndex(old => {\n return old + 1\n })\n },\n\n getPrePaginationRowModel: () => table.getExpandedRowModel(),\n getPaginationRowModel: () => {\n if (\n !table._getPaginationRowModel &&\n table.options.getPaginationRowModel\n ) {\n table._getPaginationRowModel =\n table.options.getPaginationRowModel(table)\n }\n\n if (table.options.manualPagination || !table._getPaginationRowModel) {\n return table.getPrePaginationRowModel()\n }\n\n return table._getPaginationRowModel()\n },\n\n getPageCount: () => {\n return (\n table.options.pageCount ??\n Math.ceil(\n table.getPrePaginationRowModel().rows.length /\n table.getState().pagination.pageSize\n )\n )\n },\n }\n },\n}\n", "import { TableFeature } from '../core/table'\nimport {\n OnChangeFn,\n Updater,\n Table,\n Column,\n Row,\n Cell,\n RowData,\n} from '../types'\nimport { makeStateUpdater, memo } from '../utils'\n\nexport type ColumnPinningPosition = false | 'left' | 'right'\n\nexport interface ColumnPinningState {\n left?: string[]\n right?: string[]\n}\n\nexport interface ColumnPinningTableState {\n columnPinning: ColumnPinningState\n}\n\nexport interface ColumnPinningOptions {\n onColumnPinningChange?: OnChangeFn\n enablePinning?: boolean\n}\n\nexport interface ColumnPinningDefaultOptions {\n onColumnPinningChange: OnChangeFn\n}\n\nexport interface ColumnPinningColumnDef {\n enablePinning?: boolean\n}\n\nexport interface ColumnPinningColumn {\n getCanPin: () => boolean\n getPinnedIndex: () => number\n getIsPinned: () => ColumnPinningPosition\n pin: (position: ColumnPinningPosition) => void\n}\n\nexport interface ColumnPinningRow {\n getLeftVisibleCells: () => Cell[]\n getCenterVisibleCells: () => Cell[]\n getRightVisibleCells: () => Cell[]\n}\n\nexport interface ColumnPinningInstance {\n setColumnPinning: (updater: Updater) => void\n resetColumnPinning: (defaultState?: boolean) => void\n getIsSomeColumnsPinned: (position?: ColumnPinningPosition) => boolean\n getLeftLeafColumns: () => Column[]\n getRightLeafColumns: () => Column[]\n getCenterLeafColumns: () => Column[]\n}\n\n//\n\nconst getDefaultPinningState = (): ColumnPinningState => ({\n left: [],\n right: [],\n})\n\nexport const Pinning: TableFeature = {\n getInitialState: (state): ColumnPinningTableState => {\n return {\n columnPinning: getDefaultPinningState(),\n ...state,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): ColumnPinningDefaultOptions => {\n return {\n onColumnPinningChange: makeStateUpdater('columnPinning', table),\n }\n },\n\n createColumn: (\n column: Column,\n table: Table\n ): ColumnPinningColumn => {\n return {\n pin: position => {\n const columnIds = column\n .getLeafColumns()\n .map(d => d.id)\n .filter(Boolean) as string[]\n\n table.setColumnPinning(old => {\n if (position === 'right') {\n return {\n left: (old?.left ?? []).filter(d => !columnIds?.includes(d)),\n right: [\n ...(old?.right ?? []).filter(d => !columnIds?.includes(d)),\n ...columnIds,\n ],\n }\n }\n\n if (position === 'left') {\n return {\n left: [\n ...(old?.left ?? []).filter(d => !columnIds?.includes(d)),\n ...columnIds,\n ],\n right: (old?.right ?? []).filter(d => !columnIds?.includes(d)),\n }\n }\n\n return {\n left: (old?.left ?? []).filter(d => !columnIds?.includes(d)),\n right: (old?.right ?? []).filter(d => !columnIds?.includes(d)),\n }\n })\n },\n\n getCanPin: () => {\n const leafColumns = column.getLeafColumns()\n\n return leafColumns.some(\n d =>\n (d.columnDef.enablePinning ?? true) &&\n (table.options.enablePinning ?? true)\n )\n },\n\n getIsPinned: () => {\n const leafColumnIds = column.getLeafColumns().map(d => d.id)\n\n const { left, right } = table.getState().columnPinning\n\n const isLeft = leafColumnIds.some(d => left?.includes(d))\n const isRight = leafColumnIds.some(d => right?.includes(d))\n\n return isLeft ? 'left' : isRight ? 'right' : false\n },\n\n getPinnedIndex: () => {\n const position = column.getIsPinned()\n\n return position\n ? table.getState().columnPinning?.[position]?.indexOf(column.id) ?? -1\n : 0\n },\n }\n },\n\n createRow: (\n row: Row,\n table: Table\n ): ColumnPinningRow => {\n return {\n getCenterVisibleCells: memo(\n () => [\n row._getAllVisibleCells(),\n table.getState().columnPinning.left,\n table.getState().columnPinning.right,\n ],\n (allCells, left, right) => {\n const leftAndRight: string[] = [...(left ?? []), ...(right ?? [])]\n\n return allCells.filter(d => !leftAndRight.includes(d.column.id))\n },\n {\n key:\n process.env.NODE_ENV === 'production' &&\n 'row.getCenterVisibleCells',\n debug: () => table.options.debugAll ?? table.options.debugRows,\n }\n ),\n getLeftVisibleCells: memo(\n () => [\n row._getAllVisibleCells(),\n table.getState().columnPinning.left,\n ,\n ],\n (allCells, left) => {\n const cells = (left ?? [])\n .map(\n columnId => allCells.find(cell => cell.column.id === columnId)!\n )\n .filter(Boolean)\n .map(d => ({ ...d, position: 'left' } as Cell))\n\n return cells\n },\n {\n key:\n process.env.NODE_ENV === 'production' && 'row.getLeftVisibleCells',\n debug: () => table.options.debugAll ?? table.options.debugRows,\n }\n ),\n getRightVisibleCells: memo(\n () => [row._getAllVisibleCells(), table.getState().columnPinning.right],\n (allCells, right) => {\n const cells = (right ?? [])\n .map(\n columnId => allCells.find(cell => cell.column.id === columnId)!\n )\n .filter(Boolean)\n .map(d => ({ ...d, position: 'right' } as Cell))\n\n return cells\n },\n {\n key:\n process.env.NODE_ENV === 'production' && 'row.getRightVisibleCells',\n debug: () => table.options.debugAll ?? table.options.debugRows,\n }\n ),\n }\n },\n\n createTable: (\n table: Table\n ): ColumnPinningInstance => {\n return {\n setColumnPinning: updater =>\n table.options.onColumnPinningChange?.(updater),\n\n resetColumnPinning: defaultState =>\n table.setColumnPinning(\n defaultState\n ? getDefaultPinningState()\n : table.initialState?.columnPinning ?? getDefaultPinningState()\n ),\n\n getIsSomeColumnsPinned: position => {\n const pinningState = table.getState().columnPinning\n\n if (!position) {\n return Boolean(\n pinningState.left?.length || pinningState.right?.length\n )\n }\n return Boolean(pinningState[position]?.length)\n },\n\n getLeftLeafColumns: memo(\n () => [table.getAllLeafColumns(), table.getState().columnPinning.left],\n (allColumns, left) => {\n return (left ?? [])\n .map(columnId => allColumns.find(column => column.id === columnId)!)\n .filter(Boolean)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getLeftLeafColumns',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n\n getRightLeafColumns: memo(\n () => [table.getAllLeafColumns(), table.getState().columnPinning.right],\n (allColumns, right) => {\n return (right ?? [])\n .map(columnId => allColumns.find(column => column.id === columnId)!)\n .filter(Boolean)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getRightLeafColumns',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n\n getCenterLeafColumns: memo(\n () => [\n table.getAllLeafColumns(),\n table.getState().columnPinning.left,\n table.getState().columnPinning.right,\n ],\n (allColumns, left, right) => {\n const leftAndRight: string[] = [...(left ?? []), ...(right ?? [])]\n\n return allColumns.filter(d => !leftAndRight.includes(d.id))\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getCenterLeafColumns',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n }\n },\n}\n", "import { TableFeature } from '../core/table'\nimport { OnChangeFn, Table, Row, RowModel, Updater, RowData } from '../types'\nimport { makeStateUpdater, memo } from '../utils'\n\nexport type RowSelectionState = Record\n\nexport interface RowSelectionTableState {\n rowSelection: RowSelectionState\n}\n\nexport interface RowSelectionOptions {\n enableRowSelection?: boolean | ((row: Row) => boolean)\n enableMultiRowSelection?: boolean | ((row: Row) => boolean)\n enableSubRowSelection?: boolean | ((row: Row) => boolean)\n onRowSelectionChange?: OnChangeFn\n // enableGroupingRowSelection?:\n // | boolean\n // | ((\n // row: Row\n // ) => boolean)\n // isAdditiveSelectEvent?: (e: unknown) => boolean\n // isInclusiveSelectEvent?: (e: unknown) => boolean\n // selectRowsFn?: (\n // table: Table,\n // rowModel: RowModel\n // ) => RowModel\n}\n\nexport interface RowSelectionRow {\n getIsSelected: () => boolean\n getIsSomeSelected: () => boolean\n getIsAllSubRowsSelected: () => boolean\n getCanSelect: () => boolean\n getCanMultiSelect: () => boolean\n getCanSelectSubRows: () => boolean\n toggleSelected: (value?: boolean) => void\n getToggleSelectedHandler: () => (event: unknown) => void\n}\n\nexport interface RowSelectionInstance {\n getToggleAllRowsSelectedHandler: () => (event: unknown) => void\n getToggleAllPageRowsSelectedHandler: () => (event: unknown) => void\n setRowSelection: (updater: Updater) => void\n resetRowSelection: (defaultState?: boolean) => void\n getIsAllRowsSelected: () => boolean\n getIsAllPageRowsSelected: () => boolean\n getIsSomeRowsSelected: () => boolean\n getIsSomePageRowsSelected: () => boolean\n toggleAllRowsSelected: (value?: boolean) => void\n toggleAllPageRowsSelected: (value?: boolean) => void\n getPreSelectedRowModel: () => RowModel\n getSelectedRowModel: () => RowModel\n getFilteredSelectedRowModel: () => RowModel\n getGroupedSelectedRowModel: () => RowModel\n}\n\n//\n\nexport const RowSelection: TableFeature = {\n getInitialState: (state): RowSelectionTableState => {\n return {\n rowSelection: {},\n ...state,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): RowSelectionOptions => {\n return {\n onRowSelectionChange: makeStateUpdater('rowSelection', table),\n enableRowSelection: true,\n enableMultiRowSelection: true,\n enableSubRowSelection: true,\n // enableGroupingRowSelection: false,\n // isAdditiveSelectEvent: (e: unknown) => !!e.metaKey,\n // isInclusiveSelectEvent: (e: unknown) => !!e.shiftKey,\n }\n },\n\n createTable: (\n table: Table\n ): RowSelectionInstance => {\n return {\n setRowSelection: updater => table.options.onRowSelectionChange?.(updater),\n resetRowSelection: defaultState =>\n table.setRowSelection(\n defaultState ? {} : table.initialState.rowSelection ?? {}\n ),\n toggleAllRowsSelected: value => {\n table.setRowSelection(old => {\n value =\n typeof value !== 'undefined' ? value : !table.getIsAllRowsSelected()\n\n const rowSelection = { ...old }\n\n const preGroupedFlatRows = table.getPreGroupedRowModel().flatRows\n\n // We don't use `mutateRowIsSelected` here for performance reasons.\n // All of the rows are flat already, so it wouldn't be worth it\n if (value) {\n preGroupedFlatRows.forEach(row => {\n if (!row.getCanSelect()) {\n return\n }\n rowSelection[row.id] = true\n })\n } else {\n preGroupedFlatRows.forEach(row => {\n delete rowSelection[row.id]\n })\n }\n\n return rowSelection\n })\n },\n toggleAllPageRowsSelected: value =>\n table.setRowSelection(old => {\n const resolvedValue =\n typeof value !== 'undefined'\n ? value\n : !table.getIsAllPageRowsSelected()\n\n const rowSelection: RowSelectionState = { ...old }\n\n table.getRowModel().rows.forEach(row => {\n mutateRowIsSelected(rowSelection, row.id, resolvedValue, table)\n })\n\n return rowSelection\n }),\n\n // addRowSelectionRange: rowId => {\n // const {\n // rows,\n // rowsById,\n // options: { selectGroupingRows, selectSubRows },\n // } = table\n\n // const findSelectedRow = (rows: Row[]) => {\n // let found\n // rows.find(d => {\n // if (d.getIsSelected()) {\n // found = d\n // return true\n // }\n // const subFound = findSelectedRow(d.subRows || [])\n // if (subFound) {\n // found = subFound\n // return true\n // }\n // return false\n // })\n // return found\n // }\n\n // const firstRow = findSelectedRow(rows) || rows[0]\n // const lastRow = rowsById[rowId]\n\n // let include = false\n // const selectedRowIds = {}\n\n // const addRow = (row: Row) => {\n // mutateRowIsSelected(selectedRowIds, row.id, true, {\n // rowsById,\n // selectGroupingRows: selectGroupingRows!,\n // selectSubRows: selectSubRows!,\n // })\n // }\n\n // table.rows.forEach(row => {\n // const isFirstRow = row.id === firstRow.id\n // const isLastRow = row.id === lastRow.id\n\n // if (isFirstRow || isLastRow) {\n // if (!include) {\n // include = true\n // } else if (include) {\n // addRow(row)\n // include = false\n // }\n // }\n\n // if (include) {\n // addRow(row)\n // }\n // })\n\n // table.setRowSelection(selectedRowIds)\n // },\n getPreSelectedRowModel: () => table.getCoreRowModel(),\n getSelectedRowModel: memo(\n () => [table.getState().rowSelection, table.getCoreRowModel()],\n (rowSelection, rowModel) => {\n if (!Object.keys(rowSelection).length) {\n return {\n rows: [],\n flatRows: [],\n rowsById: {},\n }\n }\n\n return selectRowsFn(table, rowModel)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getSelectedRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n }\n ),\n\n getFilteredSelectedRowModel: memo(\n () => [table.getState().rowSelection, table.getFilteredRowModel()],\n (rowSelection, rowModel) => {\n if (!Object.keys(rowSelection).length) {\n return {\n rows: [],\n flatRows: [],\n rowsById: {},\n }\n }\n\n return selectRowsFn(table, rowModel)\n },\n {\n key:\n process.env.NODE_ENV === 'production' &&\n 'getFilteredSelectedRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n }\n ),\n\n getGroupedSelectedRowModel: memo(\n () => [table.getState().rowSelection, table.getSortedRowModel()],\n (rowSelection, rowModel) => {\n if (!Object.keys(rowSelection).length) {\n return {\n rows: [],\n flatRows: [],\n rowsById: {},\n }\n }\n\n return selectRowsFn(table, rowModel)\n },\n {\n key:\n process.env.NODE_ENV === 'production' &&\n 'getGroupedSelectedRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n }\n ),\n\n ///\n\n // getGroupingRowCanSelect: rowId => {\n // const row = table.getRow(rowId)\n\n // if (!row) {\n // throw new Error()\n // }\n\n // if (typeof table.options.enableGroupingRowSelection === 'function') {\n // return table.options.enableGroupingRowSelection(row)\n // }\n\n // return table.options.enableGroupingRowSelection ?? false\n // },\n\n getIsAllRowsSelected: () => {\n const preGroupedFlatRows = table.getFilteredRowModel().flatRows\n const { rowSelection } = table.getState()\n\n let isAllRowsSelected = Boolean(\n preGroupedFlatRows.length && Object.keys(rowSelection).length\n )\n\n if (isAllRowsSelected) {\n if (\n preGroupedFlatRows.some(\n row => row.getCanSelect() && !rowSelection[row.id]\n )\n ) {\n isAllRowsSelected = false\n }\n }\n\n return isAllRowsSelected\n },\n\n getIsAllPageRowsSelected: () => {\n const paginationFlatRows = table\n .getPaginationRowModel()\n .flatRows.filter(row => row.getCanSelect())\n const { rowSelection } = table.getState()\n\n let isAllPageRowsSelected = !!paginationFlatRows.length\n\n if (\n isAllPageRowsSelected &&\n paginationFlatRows.some(row => !rowSelection[row.id])\n ) {\n isAllPageRowsSelected = false\n }\n\n return isAllPageRowsSelected\n },\n\n getIsSomeRowsSelected: () => {\n const totalSelected = Object.keys(\n table.getState().rowSelection ?? {}\n ).length\n return (\n totalSelected > 0 &&\n totalSelected < table.getFilteredRowModel().flatRows.length\n )\n },\n\n getIsSomePageRowsSelected: () => {\n const paginationFlatRows = table.getPaginationRowModel().flatRows\n return table.getIsAllPageRowsSelected()\n ? false\n : paginationFlatRows\n .filter(row => row.getCanSelect())\n .some(d => d.getIsSelected() || d.getIsSomeSelected())\n },\n\n getToggleAllRowsSelectedHandler: () => {\n return (e: unknown) => {\n table.toggleAllRowsSelected(\n ((e as MouseEvent).target as HTMLInputElement).checked\n )\n }\n },\n\n getToggleAllPageRowsSelectedHandler: () => {\n return (e: unknown) => {\n table.toggleAllPageRowsSelected(\n ((e as MouseEvent).target as HTMLInputElement).checked\n )\n }\n },\n }\n },\n\n createRow: (\n row: Row,\n table: Table\n ): RowSelectionRow => {\n return {\n toggleSelected: value => {\n const isSelected = row.getIsSelected()\n\n table.setRowSelection(old => {\n value = typeof value !== 'undefined' ? value : !isSelected\n\n if (isSelected === value) {\n return old\n }\n\n const selectedRowIds = { ...old }\n\n mutateRowIsSelected(selectedRowIds, row.id, value, table)\n\n return selectedRowIds\n })\n },\n getIsSelected: () => {\n const { rowSelection } = table.getState()\n return isRowSelected(row, rowSelection)\n },\n\n getIsSomeSelected: () => {\n const { rowSelection } = table.getState()\n return isSubRowSelected(row, rowSelection, table) === 'some'\n },\n\n getIsAllSubRowsSelected: () => {\n const { rowSelection } = table.getState()\n return isSubRowSelected(row, rowSelection, table) === 'all'\n },\n\n getCanSelect: () => {\n if (typeof table.options.enableRowSelection === 'function') {\n return table.options.enableRowSelection(row)\n }\n\n return table.options.enableRowSelection ?? true\n },\n\n getCanSelectSubRows: () => {\n if (typeof table.options.enableSubRowSelection === 'function') {\n return table.options.enableSubRowSelection(row)\n }\n\n return table.options.enableSubRowSelection ?? true\n },\n\n getCanMultiSelect: () => {\n if (typeof table.options.enableMultiRowSelection === 'function') {\n return table.options.enableMultiRowSelection(row)\n }\n\n return table.options.enableMultiRowSelection ?? true\n },\n getToggleSelectedHandler: () => {\n const canSelect = row.getCanSelect()\n\n return (e: unknown) => {\n if (!canSelect) return\n row.toggleSelected(\n ((e as MouseEvent).target as HTMLInputElement)?.checked\n )\n }\n },\n }\n },\n}\n\nconst mutateRowIsSelected = (\n selectedRowIds: Record,\n id: string,\n value: boolean,\n table: Table\n) => {\n const row = table.getRow(id)\n\n // const isGrouped = row.getIsGrouped()\n\n // if ( // TODO: enforce grouping row selection rules\n // !isGrouped ||\n // (isGrouped && table.options.enableGroupingRowSelection)\n // ) {\n if (value) {\n if (!row.getCanMultiSelect()) {\n Object.keys(selectedRowIds).forEach(key => delete selectedRowIds[key])\n }\n if (row.getCanSelect()) {\n selectedRowIds[id] = true\n }\n } else {\n delete selectedRowIds[id]\n }\n // }\n\n if (row.subRows?.length && row.getCanSelectSubRows()) {\n row.subRows.forEach(row =>\n mutateRowIsSelected(selectedRowIds, row.id, value, table)\n )\n }\n}\n\nexport function selectRowsFn(\n table: Table,\n rowModel: RowModel\n): RowModel {\n const rowSelection = table.getState().rowSelection\n\n const newSelectedFlatRows: Row[] = []\n const newSelectedRowsById: Record> = {}\n\n // Filters top level and nested rows\n const recurseRows = (rows: Row[], depth = 0): Row[] => {\n return rows\n .map(row => {\n const isSelected = isRowSelected(row, rowSelection)\n\n if (isSelected) {\n newSelectedFlatRows.push(row)\n newSelectedRowsById[row.id] = row\n }\n\n if (row.subRows?.length) {\n row = {\n ...row,\n subRows: recurseRows(row.subRows, depth + 1),\n }\n }\n\n if (isSelected) {\n return row\n }\n })\n .filter(Boolean) as Row[]\n }\n\n return {\n rows: recurseRows(rowModel.rows),\n flatRows: newSelectedFlatRows,\n rowsById: newSelectedRowsById,\n }\n}\n\nexport function isRowSelected(\n row: Row,\n selection: Record\n): boolean {\n return selection[row.id] ?? false\n}\n\nexport function isSubRowSelected(\n row: Row,\n selection: Record,\n table: Table\n): boolean | 'some' | 'all' {\n if (row.subRows && row.subRows.length) {\n let allChildrenSelected = true\n let someSelected = false\n\n row.subRows.forEach(subRow => {\n // Bail out early if we know both of these\n if (someSelected && !allChildrenSelected) {\n return\n }\n\n if (isRowSelected(subRow, selection)) {\n someSelected = true\n } else {\n allChildrenSelected = false\n }\n })\n\n return allChildrenSelected ? 'all' : someSelected ? 'some' : false\n }\n\n return false\n}\n", "import { SortingFn } from './features/Sorting'\n\nexport const reSplitAlphaNumeric = /([0-9]+)/gm\n\nconst alphanumeric: SortingFn = (rowA, rowB, columnId) => {\n return compareAlphanumeric(\n toString(rowA.getValue(columnId)).toLowerCase(),\n toString(rowB.getValue(columnId)).toLowerCase()\n )\n}\n\nconst alphanumericCaseSensitive: SortingFn = (rowA, rowB, columnId) => {\n return compareAlphanumeric(\n toString(rowA.getValue(columnId)),\n toString(rowB.getValue(columnId))\n )\n}\n\n// The text filter is more basic (less numeric support)\n// but is much faster\nconst text: SortingFn = (rowA, rowB, columnId) => {\n return compareBasic(\n toString(rowA.getValue(columnId)).toLowerCase(),\n toString(rowB.getValue(columnId)).toLowerCase()\n )\n}\n\n// The text filter is more basic (less numeric support)\n// but is much faster\nconst textCaseSensitive: SortingFn = (rowA, rowB, columnId) => {\n return compareBasic(\n toString(rowA.getValue(columnId)),\n toString(rowB.getValue(columnId))\n )\n}\n\nconst datetime: SortingFn = (rowA, rowB, columnId) => {\n const a = rowA.getValue(columnId)\n const b = rowB.getValue(columnId)\n\n // Can handle nullish values\n // Use > and < because == (and ===) doesn't work with\n // Date objects (would require calling getTime()).\n return a > b ? 1 : a < b ? -1 : 0\n}\n\nconst basic: SortingFn = (rowA, rowB, columnId) => {\n return compareBasic(rowA.getValue(columnId), rowB.getValue(columnId))\n}\n\n// Utils\n\nfunction compareBasic(a: any, b: any) {\n return a === b ? 0 : a > b ? 1 : -1\n}\n\nfunction toString(a: any) {\n if (typeof a === 'number') {\n if (isNaN(a) || a === Infinity || a === -Infinity) {\n return ''\n }\n return String(a)\n }\n if (typeof a === 'string') {\n return a\n }\n return ''\n}\n\n// Mixed sorting is slow, but very inclusive of many edge cases.\n// It handles numbers, mixed alphanumeric combinations, and even\n// null, undefined, and Infinity\nfunction compareAlphanumeric(aStr: string, bStr: string) {\n // Split on number groups, but keep the delimiter\n // Then remove falsey split values\n const a = aStr.split(reSplitAlphaNumeric).filter(Boolean)\n const b = bStr.split(reSplitAlphaNumeric).filter(Boolean)\n\n // While\n while (a.length && b.length) {\n const aa = a.shift()!\n const bb = b.shift()!\n\n const an = parseInt(aa, 10)\n const bn = parseInt(bb, 10)\n\n const combo = [an, bn].sort()\n\n // Both are string\n if (isNaN(combo[0]!)) {\n if (aa > bb) {\n return 1\n }\n if (bb > aa) {\n return -1\n }\n continue\n }\n\n // One is a string, one is a number\n if (isNaN(combo[1]!)) {\n return isNaN(an) ? -1 : 1\n }\n\n // Both are numbers\n if (an > bn) {\n return 1\n }\n if (bn > an) {\n return -1\n }\n }\n\n return a.length - b.length\n}\n\n// Exports\n\nexport const sortingFns = {\n alphanumeric,\n alphanumericCaseSensitive,\n text,\n textCaseSensitive,\n datetime,\n basic,\n}\n\nexport type BuiltInSortingFn = keyof typeof sortingFns\n", "import { RowModel } from '..'\nimport { TableFeature } from '../core/table'\nimport {\n BuiltInSortingFn,\n reSplitAlphaNumeric,\n sortingFns,\n} from '../sortingFns'\n\nimport {\n Column,\n OnChangeFn,\n Table,\n Row,\n Updater,\n RowData,\n SortingFns,\n} from '../types'\n\nimport { isFunction, makeStateUpdater } from '../utils'\n\nexport type SortDirection = 'asc' | 'desc'\n\nexport interface ColumnSort {\n id: string\n desc: boolean\n}\n\nexport type SortingState = ColumnSort[]\n\nexport interface SortingTableState {\n sorting: SortingState\n}\n\nexport interface SortingFn {\n (rowA: Row, rowB: Row, columnId: string): number\n}\n\nexport type CustomSortingFns = Record<\n string,\n SortingFn\n>\n\nexport type SortingFnOption =\n | 'auto'\n | keyof SortingFns\n | BuiltInSortingFn\n | SortingFn\n\nexport interface SortingColumnDef {\n sortingFn?: SortingFnOption\n sortDescFirst?: boolean\n enableSorting?: boolean\n enableMultiSort?: boolean\n invertSorting?: boolean\n sortUndefined?: false | -1 | 1\n}\n\nexport interface SortingColumn {\n getAutoSortingFn: () => SortingFn\n getAutoSortDir: () => SortDirection\n getSortingFn: () => SortingFn\n getFirstSortDir: () => SortDirection\n getNextSortingOrder: () => SortDirection | false\n getCanSort: () => boolean\n getCanMultiSort: () => boolean\n getSortIndex: () => number\n getIsSorted: () => false | SortDirection\n clearSorting: () => void\n toggleSorting: (desc?: boolean, isMulti?: boolean) => void\n getToggleSortingHandler: () => undefined | ((event: unknown) => void)\n}\n\ninterface SortingOptionsBase {\n manualSorting?: boolean\n onSortingChange?: OnChangeFn\n enableSorting?: boolean\n enableSortingRemoval?: boolean\n enableMultiRemove?: boolean\n enableMultiSort?: boolean\n sortDescFirst?: boolean\n getSortedRowModel?: (table: Table) => () => RowModel\n maxMultiSortColCount?: number\n isMultiSortEvent?: (e: unknown) => boolean\n}\n\ntype ResolvedSortingFns = keyof SortingFns extends never\n ? {\n sortingFns?: Record>\n }\n : {\n sortingFns: Record>\n }\n\nexport interface SortingOptions\n extends SortingOptionsBase,\n ResolvedSortingFns {}\n\nexport interface SortingInstance {\n setSorting: (updater: Updater) => void\n resetSorting: (defaultState?: boolean) => void\n getPreSortedRowModel: () => RowModel\n getSortedRowModel: () => RowModel\n _getSortedRowModel?: () => RowModel\n}\n\n//\n\nexport const Sorting: TableFeature = {\n getInitialState: (state): SortingTableState => {\n return {\n sorting: [],\n ...state,\n }\n },\n\n getDefaultColumnDef: (): SortingColumnDef => {\n return {\n sortingFn: 'auto',\n sortUndefined: 1,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): SortingOptions => {\n return {\n onSortingChange: makeStateUpdater('sorting', table),\n isMultiSortEvent: (e: unknown) => {\n return (e as MouseEvent).shiftKey\n },\n }\n },\n\n createColumn: (\n column: Column,\n table: Table\n ): SortingColumn => {\n return {\n getAutoSortingFn: () => {\n const firstRows = table.getFilteredRowModel().flatRows.slice(10)\n\n let isString = false\n\n for (const row of firstRows) {\n const value = row?.getValue(column.id)\n\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return sortingFns.datetime\n }\n\n if (typeof value === 'string') {\n isString = true\n\n if (value.split(reSplitAlphaNumeric).length > 1) {\n return sortingFns.alphanumeric\n }\n }\n }\n\n if (isString) {\n return sortingFns.text\n }\n\n return sortingFns.basic\n },\n getAutoSortDir: () => {\n const firstRow = table.getFilteredRowModel().flatRows[0]\n\n const value = firstRow?.getValue(column.id)\n\n if (typeof value === 'string') {\n return 'asc'\n }\n\n return 'desc'\n },\n getSortingFn: () => {\n if (!column) {\n throw new Error()\n }\n\n return isFunction(column.columnDef.sortingFn)\n ? column.columnDef.sortingFn\n : column.columnDef.sortingFn === 'auto'\n ? column.getAutoSortingFn()\n : table.options.sortingFns?.[column.columnDef.sortingFn as string] ??\n sortingFns[column.columnDef.sortingFn as BuiltInSortingFn]\n },\n toggleSorting: (desc, multi) => {\n // if (column.columns.length) {\n // column.columns.forEach((c, i) => {\n // if (c.id) {\n // table.toggleColumnSorting(c.id, undefined, multi || !!i)\n // }\n // })\n // return\n // }\n\n // this needs to be outside of table.setSorting to be in sync with rerender\n const nextSortingOrder = column.getNextSortingOrder()\n const hasManualValue = typeof desc !== 'undefined' && desc !== null\n\n table.setSorting(old => {\n // Find any existing sorting for this column\n const existingSorting = old?.find(d => d.id === column.id)\n const existingIndex = old?.findIndex(d => d.id === column.id)\n\n let newSorting: SortingState = []\n\n // What should we do with this sort action?\n let sortAction: 'add' | 'remove' | 'toggle' | 'replace'\n let nextDesc = hasManualValue ? desc : nextSortingOrder === 'desc'\n\n // Multi-mode\n if (old?.length && column.getCanMultiSort() && multi) {\n if (existingSorting) {\n sortAction = 'toggle'\n } else {\n sortAction = 'add'\n }\n } else {\n // Normal mode\n if (old?.length && existingIndex !== old.length - 1) {\n sortAction = 'replace'\n } else if (existingSorting) {\n sortAction = 'toggle'\n } else {\n sortAction = 'replace'\n }\n }\n\n // Handle toggle states that will remove the sorting\n if (sortAction === 'toggle') {\n // If we are \"actually\" toggling (not a manual set value), should we remove the sorting?\n if (!hasManualValue) {\n // Is our intention to remove?\n if (!nextSortingOrder) {\n sortAction = 'remove'\n }\n }\n }\n\n if (sortAction === 'add') {\n newSorting = [\n ...old,\n {\n id: column.id,\n desc: nextDesc,\n },\n ]\n // Take latest n columns\n newSorting.splice(\n 0,\n newSorting.length -\n (table.options.maxMultiSortColCount ?? Number.MAX_SAFE_INTEGER)\n )\n } else if (sortAction === 'toggle') {\n // This flips (or sets) the\n newSorting = old.map(d => {\n if (d.id === column.id) {\n return {\n ...d,\n desc: nextDesc,\n }\n }\n return d\n })\n } else if (sortAction === 'remove') {\n newSorting = old.filter(d => d.id !== column.id)\n } else {\n newSorting = [\n {\n id: column.id,\n desc: nextDesc,\n },\n ]\n }\n\n return newSorting\n })\n },\n\n getFirstSortDir: () => {\n const sortDescFirst =\n column.columnDef.sortDescFirst ??\n table.options.sortDescFirst ??\n column.getAutoSortDir() === 'desc'\n return sortDescFirst ? 'desc' : 'asc'\n },\n\n getNextSortingOrder: (multi?: boolean) => {\n const firstSortDirection = column.getFirstSortDir()\n const isSorted = column.getIsSorted()\n\n if (!isSorted) {\n return firstSortDirection\n }\n\n if (\n isSorted !== firstSortDirection &&\n (table.options.enableSortingRemoval ?? true) && // If enableSortRemove, enable in general\n (multi ? table.options.enableMultiRemove ?? true : true) // If multi, don't allow if enableMultiRemove))\n ) {\n return false\n }\n return isSorted === 'desc' ? 'asc' : 'desc'\n },\n\n getCanSort: () => {\n return (\n (column.columnDef.enableSorting ?? true) &&\n (table.options.enableSorting ?? true) &&\n !!column.accessorFn\n )\n },\n\n getCanMultiSort: () => {\n return (\n column.columnDef.enableMultiSort ??\n table.options.enableMultiSort ??\n !!column.accessorFn\n )\n },\n\n getIsSorted: () => {\n const columnSort = table\n .getState()\n .sorting?.find(d => d.id === column.id)\n\n return !columnSort ? false : columnSort.desc ? 'desc' : 'asc'\n },\n\n getSortIndex: () =>\n table.getState().sorting?.findIndex(d => d.id === column.id) ?? -1,\n\n clearSorting: () => {\n //clear sorting for just 1 column\n table.setSorting(old =>\n old?.length ? old.filter(d => d.id !== column.id) : []\n )\n },\n\n getToggleSortingHandler: () => {\n const canSort = column.getCanSort()\n\n return (e: unknown) => {\n if (!canSort) return\n ;(e as any).persist?.()\n column.toggleSorting?.(\n undefined,\n column.getCanMultiSort()\n ? table.options.isMultiSortEvent?.(e)\n : false\n )\n }\n },\n }\n },\n\n createTable: (\n table: Table\n ): SortingInstance => {\n return {\n setSorting: updater => table.options.onSortingChange?.(updater),\n resetSorting: defaultState => {\n table.setSorting(defaultState ? [] : table.initialState?.sorting ?? [])\n },\n getPreSortedRowModel: () => table.getGroupedRowModel(),\n getSortedRowModel: () => {\n if (!table._getSortedRowModel && table.options.getSortedRowModel) {\n table._getSortedRowModel = table.options.getSortedRowModel(table)\n }\n\n if (table.options.manualSorting || !table._getSortedRowModel) {\n return table.getPreSortedRowModel()\n }\n\n return table._getSortedRowModel()\n },\n }\n },\n}\n", "import { TableFeature } from '../core/table'\nimport {\n Cell,\n Column,\n OnChangeFn,\n Table,\n Updater,\n Row,\n RowData,\n} from '../types'\nimport { makeStateUpdater, memo } from '../utils'\n\nexport type VisibilityState = Record\n\nexport interface VisibilityTableState {\n columnVisibility: VisibilityState\n}\n\nexport interface VisibilityOptions {\n onColumnVisibilityChange?: OnChangeFn\n enableHiding?: boolean\n}\n\nexport interface VisibilityDefaultOptions {\n onColumnVisibilityChange: OnChangeFn\n}\n\nexport interface VisibilityInstance {\n getVisibleFlatColumns: () => Column[]\n getVisibleLeafColumns: () => Column[]\n getLeftVisibleLeafColumns: () => Column[]\n getRightVisibleLeafColumns: () => Column[]\n getCenterVisibleLeafColumns: () => Column[]\n setColumnVisibility: (updater: Updater) => void\n resetColumnVisibility: (defaultState?: boolean) => void\n toggleAllColumnsVisible: (value?: boolean) => void\n getIsAllColumnsVisible: () => boolean\n getIsSomeColumnsVisible: () => boolean\n getToggleAllColumnsVisibilityHandler: () => (event: unknown) => void\n}\n\nexport interface VisibilityColumnDef {\n enableHiding?: boolean\n}\n\nexport interface VisibilityRow {\n _getAllVisibleCells: () => Cell[]\n getVisibleCells: () => Cell[]\n}\n\nexport interface VisibilityColumn {\n getCanHide: () => boolean\n getIsVisible: () => boolean\n toggleVisibility: (value?: boolean) => void\n getToggleVisibilityHandler: () => (event: unknown) => void\n}\n\n//\n\nexport const Visibility: TableFeature = {\n getInitialState: (state): VisibilityTableState => {\n return {\n columnVisibility: {},\n ...state,\n }\n },\n\n getDefaultOptions: (\n table: Table\n ): VisibilityDefaultOptions => {\n return {\n onColumnVisibilityChange: makeStateUpdater('columnVisibility', table),\n }\n },\n\n createColumn: (\n column: Column,\n table: Table\n ): VisibilityColumn => {\n return {\n toggleVisibility: value => {\n if (column.getCanHide()) {\n table.setColumnVisibility(old => ({\n ...old,\n [column.id]: value ?? !column.getIsVisible(),\n }))\n }\n },\n getIsVisible: () => {\n return table.getState().columnVisibility?.[column.id] ?? true\n },\n\n getCanHide: () => {\n return (\n (column.columnDef.enableHiding ?? true) &&\n (table.options.enableHiding ?? true)\n )\n },\n getToggleVisibilityHandler: () => {\n return (e: unknown) => {\n column.toggleVisibility?.(\n ((e as MouseEvent).target as HTMLInputElement).checked\n )\n }\n },\n }\n },\n\n createRow: (\n row: Row,\n table: Table\n ): VisibilityRow => {\n return {\n _getAllVisibleCells: memo(\n () => [row.getAllCells(), table.getState().columnVisibility],\n cells => {\n return cells.filter(cell => cell.column.getIsVisible())\n },\n {\n key:\n process.env.NODE_ENV === 'production' && 'row._getAllVisibleCells',\n debug: () => table.options.debugAll ?? table.options.debugRows,\n }\n ),\n getVisibleCells: memo(\n () => [\n row.getLeftVisibleCells(),\n row.getCenterVisibleCells(),\n row.getRightVisibleCells(),\n ],\n (left, center, right) => [...left, ...center, ...right],\n {\n key: process.env.NODE_ENV === 'development' && 'row.getVisibleCells',\n debug: () => table.options.debugAll ?? table.options.debugRows,\n }\n ),\n }\n },\n\n createTable: (\n table: Table\n ): VisibilityInstance => {\n const makeVisibleColumnsMethod = (\n key: string,\n getColumns: () => Column[]\n ): (() => Column[]) => {\n return memo(\n () => [\n getColumns(),\n getColumns()\n .filter(d => d.getIsVisible())\n .map(d => d.id)\n .join('_'),\n ],\n columns => {\n return columns.filter(d => d.getIsVisible?.())\n },\n {\n key,\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n )\n }\n\n return {\n getVisibleFlatColumns: makeVisibleColumnsMethod(\n 'getVisibleFlatColumns',\n () => table.getAllFlatColumns()\n ),\n getVisibleLeafColumns: makeVisibleColumnsMethod(\n 'getVisibleLeafColumns',\n () => table.getAllLeafColumns()\n ),\n getLeftVisibleLeafColumns: makeVisibleColumnsMethod(\n 'getLeftVisibleLeafColumns',\n () => table.getLeftLeafColumns()\n ),\n getRightVisibleLeafColumns: makeVisibleColumnsMethod(\n 'getRightVisibleLeafColumns',\n () => table.getRightLeafColumns()\n ),\n getCenterVisibleLeafColumns: makeVisibleColumnsMethod(\n 'getCenterVisibleLeafColumns',\n () => table.getCenterLeafColumns()\n ),\n\n setColumnVisibility: updater =>\n table.options.onColumnVisibilityChange?.(updater),\n\n resetColumnVisibility: defaultState => {\n table.setColumnVisibility(\n defaultState ? {} : table.initialState.columnVisibility ?? {}\n )\n },\n\n toggleAllColumnsVisible: value => {\n value = value ?? !table.getIsAllColumnsVisible()\n\n table.setColumnVisibility(\n table.getAllLeafColumns().reduce(\n (obj, column) => ({\n ...obj,\n [column.id]: !value ? !column.getCanHide?.() : value,\n }),\n {}\n )\n )\n },\n\n getIsAllColumnsVisible: () =>\n !table.getAllLeafColumns().some(column => !column.getIsVisible?.()),\n\n getIsSomeColumnsVisible: () =>\n table.getAllLeafColumns().some(column => column.getIsVisible?.()),\n\n getToggleAllColumnsVisibilityHandler: () => {\n return (e: unknown) => {\n table.toggleAllColumnsVisible(\n ((e as MouseEvent).target as HTMLInputElement)?.checked\n )\n }\n },\n }\n },\n}\n", "import { functionalUpdate, memo, RequiredKeys } from '../utils'\n\nimport {\n Updater,\n TableOptionsResolved,\n TableState,\n Table,\n InitialTableState,\n Row,\n Column,\n RowModel,\n ColumnDef,\n TableOptions,\n RowData,\n TableMeta,\n ColumnDefResolved,\n GroupColumnDef,\n} from '../types'\n\n//\nimport { createColumn } from './column'\nimport { Headers } from './headers'\n//\n\nimport { ColumnSizing } from '../features/ColumnSizing'\nimport { Expanding } from '../features/Expanding'\nimport { Filters } from '../features/Filters'\nimport { Grouping } from '../features/Grouping'\nimport { Ordering } from '../features/Ordering'\nimport { Pagination } from '../features/Pagination'\nimport { Pinning } from '../features/Pinning'\nimport { RowSelection } from '../features/RowSelection'\nimport { Sorting } from '../features/Sorting'\nimport { Visibility } from '../features/Visibility'\n\nexport interface TableFeature {\n getDefaultOptions?: (table: any) => any\n getInitialState?: (initialState?: InitialTableState) => any\n createTable?: (table: any) => any\n getDefaultColumnDef?: () => any\n createColumn?: (column: any, table: any) => any\n createHeader?: (column: any, table: any) => any\n createCell?: (cell: any, column: any, row: any, table: any) => any\n createRow?: (row: any, table: any) => any\n}\n\nconst features = [\n Headers,\n Visibility,\n Ordering,\n Pinning,\n Filters,\n Sorting,\n Grouping,\n Expanding,\n Pagination,\n RowSelection,\n ColumnSizing,\n] as const\n\n//\n\nexport interface CoreTableState {}\n\nexport interface CoreOptions {\n data: TData[]\n state: Partial\n onStateChange: (updater: Updater) => void\n debugAll?: boolean\n debugTable?: boolean\n debugHeaders?: boolean\n debugColumns?: boolean\n debugRows?: boolean\n initialState?: InitialTableState\n autoResetAll?: boolean\n mergeOptions?: (\n defaultOptions: TableOptions,\n options: Partial>\n ) => TableOptions\n meta?: TableMeta\n getCoreRowModel: (table: Table) => () => RowModel\n getSubRows?: (originalRow: TData, index: number) => undefined | TData[]\n getRowId?: (originalRow: TData, index: number, parent?: Row) => string\n columns: ColumnDef[]\n defaultColumn?: Partial>\n renderFallbackValue: any\n}\n\nexport interface CoreInstance {\n initialState: TableState\n reset: () => void\n options: RequiredKeys, 'state'>\n setOptions: (newOptions: Updater>) => void\n getState: () => TableState\n setState: (updater: Updater) => void\n _features: readonly TableFeature[]\n _queue: (cb: () => void) => void\n _getRowId: (_: TData, index: number, parent?: Row) => string\n getCoreRowModel: () => RowModel\n _getCoreRowModel?: () => RowModel\n getRowModel: () => RowModel\n getRow: (id: string) => Row\n _getDefaultColumnDef: () => Partial>\n _getColumnDefs: () => ColumnDef[]\n _getAllFlatColumnsById: () => Record>\n getAllColumns: () => Column[]\n getAllFlatColumns: () => Column[]\n getAllLeafColumns: () => Column[]\n getColumn: (columnId: string) => Column | undefined\n}\n\nexport function createTable(\n options: TableOptionsResolved\n): Table {\n if (options.debugAll || options.debugTable) {\n console.info('Creating Table Instance...')\n }\n\n let table = { _features: features } as unknown as Table\n\n const defaultOptions = table._features.reduce((obj, feature) => {\n return Object.assign(obj, feature.getDefaultOptions?.(table))\n }, {}) as TableOptionsResolved\n\n const mergeOptions = (options: TableOptionsResolved) => {\n if (table.options.mergeOptions) {\n return table.options.mergeOptions(defaultOptions, options)\n }\n\n return {\n ...defaultOptions,\n ...options,\n }\n }\n\n const coreInitialState: CoreTableState = {}\n\n let initialState = {\n ...coreInitialState,\n ...(options.initialState ?? {}),\n } as TableState\n\n table._features.forEach(feature => {\n initialState = feature.getInitialState?.(initialState) ?? initialState\n })\n\n const queued: (() => void)[] = []\n let queuedTimeout = false\n\n const coreInstance: CoreInstance = {\n _features: features,\n options: {\n ...defaultOptions,\n ...options,\n },\n initialState,\n _queue: cb => {\n queued.push(cb)\n\n if (!queuedTimeout) {\n queuedTimeout = true\n\n // Schedule a microtask to run the queued callbacks after\n // the current call stack (render, etc) has finished.\n Promise.resolve()\n .then(() => {\n while (queued.length) {\n queued.shift()!()\n }\n queuedTimeout = false\n })\n .catch(error =>\n setTimeout(() => {\n throw error\n })\n )\n }\n },\n reset: () => {\n table.setState(table.initialState)\n },\n setOptions: updater => {\n const newOptions = functionalUpdate(updater, table.options)\n table.options = mergeOptions(newOptions) as RequiredKeys<\n TableOptionsResolved,\n 'state'\n >\n },\n\n getState: () => {\n return table.options.state as TableState\n },\n\n setState: (updater: Updater) => {\n table.options.onStateChange?.(updater)\n },\n\n _getRowId: (row: TData, index: number, parent?: Row) =>\n table.options.getRowId?.(row, index, parent) ??\n `${parent ? [parent.id, index].join('.') : index}`,\n\n getCoreRowModel: () => {\n if (!table._getCoreRowModel) {\n table._getCoreRowModel = table.options.getCoreRowModel(table)\n }\n\n return table._getCoreRowModel!()\n },\n\n // The final calls start at the bottom of the model,\n // expanded rows, which then work their way up\n\n getRowModel: () => {\n return table.getPaginationRowModel()\n },\n getRow: (id: string) => {\n const row = table.getRowModel().rowsById[id]\n\n if (!row) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(`getRow expected an ID, but got ${id}`)\n }\n throw new Error()\n }\n\n return row\n },\n _getDefaultColumnDef: memo(\n () => [table.options.defaultColumn],\n defaultColumn => {\n defaultColumn = (defaultColumn ?? {}) as Partial<\n ColumnDef\n >\n\n return {\n header: props => {\n const resolvedColumnDef = props.header.column\n .columnDef as ColumnDefResolved\n\n if (resolvedColumnDef.accessorKey) {\n return resolvedColumnDef.accessorKey\n }\n\n if (resolvedColumnDef.accessorFn) {\n return resolvedColumnDef.id\n }\n\n return null\n },\n // footer: props => props.header.column.id,\n cell: props => props.renderValue()?.toString?.() ?? null,\n ...table._features.reduce((obj, feature) => {\n return Object.assign(obj, feature.getDefaultColumnDef?.())\n }, {}),\n ...defaultColumn,\n } as Partial>\n },\n {\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n key: process.env.NODE_ENV === 'development' && 'getDefaultColumnDef',\n }\n ),\n\n _getColumnDefs: () => table.options.columns,\n\n getAllColumns: memo(\n () => [table._getColumnDefs()],\n columnDefs => {\n const recurseColumns = (\n columnDefs: ColumnDef[],\n parent?: Column,\n depth = 0\n ): Column[] => {\n return columnDefs.map(columnDef => {\n const column = createColumn(table, columnDef, depth, parent)\n\n const groupingColumnDef = columnDef as GroupColumnDef<\n TData,\n unknown\n >\n\n column.columns = groupingColumnDef.columns\n ? recurseColumns(groupingColumnDef.columns, column, depth + 1)\n : []\n\n return column\n })\n }\n\n return recurseColumns(columnDefs)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getAllColumns',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n\n getAllFlatColumns: memo(\n () => [table.getAllColumns()],\n allColumns => {\n return allColumns.flatMap(column => {\n return column.getFlatColumns()\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getAllFlatColumns',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n\n _getAllFlatColumnsById: memo(\n () => [table.getAllFlatColumns()],\n flatColumns => {\n return flatColumns.reduce((acc, column) => {\n acc[column.id] = column\n return acc\n }, {} as Record>)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getAllFlatColumnsById',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n\n getAllLeafColumns: memo(\n () => [table.getAllColumns(), table._getOrderColumnsFn()],\n (allColumns, orderColumns) => {\n let leafColumns = allColumns.flatMap(column => column.getLeafColumns())\n return orderColumns(leafColumns)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getAllLeafColumns',\n debug: () => table.options.debugAll ?? table.options.debugColumns,\n }\n ),\n\n getColumn: columnId => {\n const column = table._getAllFlatColumnsById()[columnId]\n\n if (process.env.NODE_ENV !== 'production' && !column) {\n console.error(`[Table] Column with id '${columnId}' does not exist.`)\n }\n\n return column\n },\n }\n\n Object.assign(table, coreInstance)\n\n table._features.forEach(feature => {\n return Object.assign(table, feature.createTable?.(table))\n })\n\n return table\n}\n", "import { RowData, Cell, Column, Row, Table } from '../types'\nimport { Getter, memo } from '../utils'\n\nexport interface CellContext {\n table: Table\n column: Column\n row: Row\n cell: Cell\n getValue: Getter\n renderValue: Getter\n}\n\nexport interface CoreCell {\n id: string\n getValue: CellContext['getValue']\n renderValue: CellContext['renderValue']\n row: Row\n column: Column\n getContext: () => CellContext\n}\n\nexport function createCell(\n table: Table,\n row: Row,\n column: Column,\n columnId: string\n): Cell {\n const getRenderValue = () =>\n cell.getValue() ?? table.options.renderFallbackValue\n\n const cell: CoreCell = {\n id: `${row.id}_${column.id}`,\n row,\n column,\n getValue: () => row.getValue(columnId),\n renderValue: getRenderValue,\n getContext: memo(\n () => [table, column, row, cell],\n (table, column, row, cell) => ({\n table,\n column,\n row,\n cell: cell as Cell,\n getValue: cell.getValue,\n renderValue: cell.renderValue,\n }),\n {\n key: process.env.NODE_ENV === 'development' && 'cell.getContext',\n debug: () => table.options.debugAll,\n }\n ),\n }\n\n table._features.forEach(feature => {\n Object.assign(\n cell,\n feature.createCell?.(\n cell as Cell,\n column,\n row as Row,\n table\n )\n )\n }, {})\n\n return cell as Cell\n}\n", "import { RowData, Cell, Row, Table } from '../types'\nimport { flattenBy, memo } from '../utils'\nimport { createCell } from './cell'\n\nexport interface CoreRow {\n id: string\n index: number\n original: TData\n depth: number\n parentId?: string\n _valuesCache: Record\n _uniqueValuesCache: Record\n getValue: (columnId: string) => TValue\n getUniqueValues: (columnId: string) => TValue[]\n renderValue: (columnId: string) => TValue\n subRows: Row[]\n getLeafRows: () => Row[]\n originalSubRows?: TData[]\n getAllCells: () => Cell[]\n _getAllCellsByColumnId: () => Record>\n getParentRow: () => Row | undefined\n getParentRows: () => Row[]\n}\n\nexport const createRow = (\n table: Table,\n id: string,\n original: TData,\n rowIndex: number,\n depth: number,\n subRows?: Row[],\n parentId?: string\n): Row => {\n let row: CoreRow = {\n id,\n index: rowIndex,\n original,\n depth,\n parentId,\n _valuesCache: {},\n _uniqueValuesCache: {},\n getValue: columnId => {\n if (row._valuesCache.hasOwnProperty(columnId)) {\n return row._valuesCache[columnId]\n }\n\n const column = table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n row._valuesCache[columnId] = column.accessorFn(\n row.original as TData,\n rowIndex\n )\n\n return row._valuesCache[columnId] as any\n },\n getUniqueValues: columnId => {\n if (row._uniqueValuesCache.hasOwnProperty(columnId)) {\n return row._uniqueValuesCache[columnId]\n }\n\n const column = table.getColumn(columnId)\n\n if (!column?.accessorFn) {\n return undefined\n }\n\n if (!column.columnDef.getUniqueValues) {\n row._uniqueValuesCache[columnId] = [row.getValue(columnId)]\n return row._uniqueValuesCache[columnId]\n }\n\n row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(\n row.original as TData,\n rowIndex\n )\n\n return row._uniqueValuesCache[columnId] as any\n },\n renderValue: columnId =>\n row.getValue(columnId) ?? table.options.renderFallbackValue,\n subRows: subRows ?? [],\n getLeafRows: () => flattenBy(row.subRows, d => d.subRows),\n getParentRow: () => (row.parentId ? table.getRow(row.parentId) : undefined),\n getParentRows: () => {\n let parentRows: Row[] = []\n let currentRow = row\n while (true) {\n const parentRow = currentRow.getParentRow()\n if (!parentRow) break\n parentRows.push(parentRow)\n currentRow = parentRow\n }\n return parentRows.reverse()\n },\n getAllCells: memo(\n () => [table.getAllLeafColumns()],\n leafColumns => {\n return leafColumns.map(column => {\n return createCell(table, row as Row, column, column.id)\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'row.getAllCells',\n debug: () => table.options.debugAll ?? table.options.debugRows,\n }\n ),\n\n _getAllCellsByColumnId: memo(\n () => [row.getAllCells()],\n allCells => {\n return allCells.reduce((acc, cell) => {\n acc[cell.column.id] = cell\n return acc\n }, {} as Record>)\n },\n {\n key:\n process.env.NODE_ENV === 'production' && 'row.getAllCellsByColumnId',\n debug: () => table.options.debugAll ?? table.options.debugRows,\n }\n ),\n }\n\n for (let i = 0; i < table._features.length; i++) {\n const feature = table._features[i]\n Object.assign(row, feature?.createRow?.(row, table))\n }\n\n return row as Row\n}\n", "import {\n AccessorFn,\n ColumnDef,\n DisplayColumnDef,\n GroupColumnDef,\n IdentifiedColumnDef,\n RowData,\n} from './types'\nimport { DeepKeys, DeepValue, RequiredKeys } from './utils'\n\n// type Person = {\n// firstName: string\n// lastName: string\n// age: number\n// visits: number\n// status: string\n// progress: number\n// createdAt: Date\n// nested: {\n// foo: [\n// {\n// bar: 'bar'\n// }\n// ]\n// bar: { subBar: boolean }[]\n// baz: {\n// foo: 'foo'\n// bar: {\n// baz: 'baz'\n// }\n// }\n// }\n// }\n\n// const test: DeepKeys = 'nested.foo.0.bar'\n// const test2: DeepKeys = 'nested.bar'\n\n// const helper = createColumnHelper()\n\n// helper.accessor('nested.foo', {\n// cell: info => info.getValue(),\n// })\n\n// helper.accessor('nested.foo.0.bar', {\n// cell: info => info.getValue(),\n// })\n\n// helper.accessor('nested.bar', {\n// cell: info => info.getValue(),\n// })\n\nexport type ColumnHelper = {\n accessor: <\n TAccessor extends AccessorFn | DeepKeys,\n TValue extends TAccessor extends AccessorFn\n ? TReturn\n : TAccessor extends DeepKeys\n ? DeepValue\n : never\n >(\n accessor: TAccessor,\n column: TAccessor extends AccessorFn\n ? DisplayColumnDef\n : IdentifiedColumnDef\n ) => ColumnDef\n display: (column: DisplayColumnDef) => ColumnDef\n group: (column: GroupColumnDef) => ColumnDef\n}\n\nexport function createColumnHelper<\n TData extends RowData\n>(): ColumnHelper {\n return {\n accessor: (accessor, column) => {\n return typeof accessor === 'function'\n ? ({\n ...column,\n accessorFn: accessor,\n } as any)\n : {\n ...column,\n accessorKey: accessor,\n }\n },\n display: column => column as ColumnDef,\n group: column => column as ColumnDef,\n }\n}\n", "import { createRow } from '../core/row'\nimport { Table, Row, RowModel, RowData } from '../types'\nimport { memo } from '../utils'\n\nexport function getCoreRowModel(): (\n table: Table\n) => () => RowModel {\n return table =>\n memo(\n () => [table.options.data],\n (\n data\n ): {\n rows: Row[]\n flatRows: Row[]\n rowsById: Record>\n } => {\n const rowModel: RowModel = {\n rows: [],\n flatRows: [],\n rowsById: {},\n }\n\n const accessRows = (\n originalRows: TData[],\n depth = 0,\n parentRow?: Row\n ): Row[] => {\n const rows = [] as Row[]\n\n for (let i = 0; i < originalRows.length; i++) {\n // This could be an expensive check at scale, so we should move it somewhere else, but where?\n // if (!id) {\n // if (process.env.NODE_ENV !== 'production') {\n // throw new Error(`getRowId expected an ID, but got ${id}`)\n // }\n // }\n\n // Make the row\n const row = createRow(\n table,\n table._getRowId(originalRows[i]!, i, parentRow),\n originalRows[i]!,\n i,\n depth,\n undefined,\n parentRow?.id\n )\n\n // Keep track of every row in a flat array\n rowModel.flatRows.push(row)\n // Also keep track of every row by its ID\n rowModel.rowsById[row.id] = row\n // Push table row into parent\n rows.push(row)\n\n // Get the original subrows\n if (table.options.getSubRows) {\n row.originalSubRows = table.options.getSubRows(\n originalRows[i]!,\n i\n )\n\n // Then recursively access them\n if (row.originalSubRows?.length) {\n row.subRows = accessRows(row.originalSubRows, depth + 1, row)\n }\n }\n }\n\n return rows\n }\n\n rowModel.rows = accessRows(data)\n\n return rowModel\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n onChange: () => {\n table._autoResetPageIndex()\n },\n }\n )\n}\n", "import { createRow } from '../core/row'\nimport { Row, RowModel, Table, RowData } from '../types'\n\nexport function filterRows(\n rows: Row[],\n filterRowImpl: (row: Row) => any,\n table: Table\n) {\n if (table.options.filterFromLeafRows) {\n return filterRowModelFromLeafs(rows, filterRowImpl, table)\n }\n\n return filterRowModelFromRoot(rows, filterRowImpl, table)\n}\n\nexport function filterRowModelFromLeafs(\n rowsToFilter: Row[],\n filterRow: (row: Row) => Row[],\n table: Table\n): RowModel {\n const newFilteredFlatRows: Row[] = []\n const newFilteredRowsById: Record> = {}\n const maxDepth = table.options.maxLeafRowFilterDepth ?? 100\n\n const recurseFilterRows = (rowsToFilter: Row[], depth = 0) => {\n const rows: Row[] = []\n\n // Filter from children up first\n for (let i = 0; i < rowsToFilter.length; i++) {\n let row = rowsToFilter[i]!\n\n const newRow = createRow(\n table,\n row.id,\n row.original,\n row.index,\n row.depth,\n undefined,\n row.parentId\n )\n newRow.columnFilters = row.columnFilters\n\n if (row.subRows?.length && depth < maxDepth) {\n newRow.subRows = recurseFilterRows(row.subRows, depth + 1)\n row = newRow\n\n if (filterRow(row) && !newRow.subRows.length) {\n rows.push(row)\n newFilteredRowsById[row.id] = row\n newFilteredRowsById[i] = row\n continue\n }\n\n if (filterRow(row) || newRow.subRows.length) {\n rows.push(row)\n newFilteredRowsById[row.id] = row\n newFilteredRowsById[i] = row\n continue\n }\n } else {\n row = newRow\n if (filterRow(row)) {\n rows.push(row)\n newFilteredRowsById[row.id] = row\n newFilteredRowsById[i] = row\n }\n }\n }\n\n return rows\n }\n\n return {\n rows: recurseFilterRows(rowsToFilter),\n flatRows: newFilteredFlatRows,\n rowsById: newFilteredRowsById,\n }\n}\n\nexport function filterRowModelFromRoot(\n rowsToFilter: Row[],\n filterRow: (row: Row) => any,\n table: Table\n): RowModel {\n const newFilteredFlatRows: Row[] = []\n const newFilteredRowsById: Record> = {}\n const maxDepth = table.options.maxLeafRowFilterDepth ?? 100\n\n // Filters top level and nested rows\n const recurseFilterRows = (rowsToFilter: Row[], depth = 0) => {\n // Filter from parents downward first\n\n const rows: Row[] = []\n\n // Apply the filter to any subRows\n for (let i = 0; i < rowsToFilter.length; i++) {\n let row = rowsToFilter[i]!\n\n const pass = filterRow(row)\n\n if (pass) {\n if (row.subRows?.length && depth < maxDepth) {\n const newRow = createRow(\n table,\n row.id,\n row.original,\n row.index,\n row.depth,\n undefined,\n row.parentId\n )\n newRow.subRows = recurseFilterRows(row.subRows, depth + 1)\n row = newRow\n }\n\n rows.push(row)\n newFilteredFlatRows.push(row)\n newFilteredRowsById[row.id] = row\n }\n }\n\n return rows\n }\n\n return {\n rows: recurseFilterRows(rowsToFilter),\n flatRows: newFilteredFlatRows,\n rowsById: newFilteredRowsById,\n }\n}\n", "import { ResolvedColumnFilter } from '../features/Filters'\nimport { Table, RowModel, Row, RowData } from '../types'\nimport { memo } from '../utils'\nimport { filterRows } from './filterRowsUtils'\n\nexport function getFilteredRowModel(): (\n table: Table\n) => () => RowModel {\n return table =>\n memo(\n () => [\n table.getPreFilteredRowModel(),\n table.getState().columnFilters,\n table.getState().globalFilter,\n ],\n (rowModel, columnFilters, globalFilter) => {\n if (\n !rowModel.rows.length ||\n (!columnFilters?.length && !globalFilter)\n ) {\n for (let i = 0; i < rowModel.flatRows.length; i++) {\n rowModel.flatRows[i]!.columnFilters = {}\n rowModel.flatRows[i]!.columnFiltersMeta = {}\n }\n return rowModel\n }\n\n const resolvedColumnFilters: ResolvedColumnFilter[] = []\n const resolvedGlobalFilters: ResolvedColumnFilter[] = []\n\n ;(columnFilters ?? []).forEach(d => {\n const column = table.getColumn(d.id)\n\n if (!column) {\n return\n }\n\n const filterFn = column.getFilterFn()\n\n if (!filterFn) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Could not find a valid 'column.filterFn' for column with the ID: ${column.id}.`\n )\n }\n return\n }\n\n resolvedColumnFilters.push({\n id: d.id,\n filterFn,\n resolvedValue: filterFn.resolveFilterValue?.(d.value) ?? d.value,\n })\n })\n\n const filterableIds = columnFilters.map(d => d.id)\n\n const globalFilterFn = table.getGlobalFilterFn()\n\n const globallyFilterableColumns = table\n .getAllLeafColumns()\n .filter(column => column.getCanGlobalFilter())\n\n if (\n globalFilter &&\n globalFilterFn &&\n globallyFilterableColumns.length\n ) {\n filterableIds.push('__global__')\n\n globallyFilterableColumns.forEach(column => {\n resolvedGlobalFilters.push({\n id: column.id,\n filterFn: globalFilterFn,\n resolvedValue:\n globalFilterFn.resolveFilterValue?.(globalFilter) ??\n globalFilter,\n })\n })\n }\n\n let currentColumnFilter\n let currentGlobalFilter\n\n // Flag the prefiltered row model with each filter state\n for (let j = 0; j < rowModel.flatRows.length; j++) {\n const row = rowModel.flatRows[j]!\n\n row.columnFilters = {}\n\n if (resolvedColumnFilters.length) {\n for (let i = 0; i < resolvedColumnFilters.length; i++) {\n currentColumnFilter = resolvedColumnFilters[i]!\n const id = currentColumnFilter.id\n\n // Tag the row with the column filter state\n row.columnFilters[id] = currentColumnFilter.filterFn(\n row,\n id,\n currentColumnFilter.resolvedValue,\n filterMeta => {\n row.columnFiltersMeta[id] = filterMeta\n }\n )\n }\n }\n\n if (resolvedGlobalFilters.length) {\n for (let i = 0; i < resolvedGlobalFilters.length; i++) {\n currentGlobalFilter = resolvedGlobalFilters[i]!\n const id = currentGlobalFilter.id\n // Tag the row with the first truthy global filter state\n if (\n currentGlobalFilter.filterFn(\n row,\n id,\n currentGlobalFilter.resolvedValue,\n filterMeta => {\n row.columnFiltersMeta[id] = filterMeta\n }\n )\n ) {\n row.columnFilters.__global__ = true\n break\n }\n }\n\n if (row.columnFilters.__global__ !== true) {\n row.columnFilters.__global__ = false\n }\n }\n }\n\n const filterRowsImpl = (row: Row) => {\n // Horizontally filter rows through each column\n for (let i = 0; i < filterableIds.length; i++) {\n if (row.columnFilters[filterableIds[i]!] === false) {\n return false\n }\n }\n return true\n }\n\n // Filter final rows using all of the active filters\n return filterRows(rowModel.rows, filterRowsImpl, table)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getFilteredRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n onChange: () => {\n table._autoResetPageIndex()\n },\n }\n )\n}\n", "import { Table, RowModel, Row, RowData } from '../types'\nimport { memo } from '../utils'\nimport { filterRows } from './filterRowsUtils'\n\nexport function getFacetedRowModel(): (\n table: Table,\n columnId: string\n) => () => RowModel {\n return (table, columnId) =>\n memo(\n () => [\n table.getPreFilteredRowModel(),\n table.getState().columnFilters,\n table.getState().globalFilter,\n table.getFilteredRowModel(),\n ],\n (preRowModel, columnFilters, globalFilter) => {\n if (\n !preRowModel.rows.length ||\n (!columnFilters?.length && !globalFilter)\n ) {\n return preRowModel\n }\n\n const filterableIds = [\n ...columnFilters.map(d => d.id).filter(d => d !== columnId),\n globalFilter ? '__global__' : undefined,\n ].filter(Boolean) as string[]\n\n const filterRowsImpl = (row: Row) => {\n // Horizontally filter rows through each column\n for (let i = 0; i < filterableIds.length; i++) {\n if (row.columnFilters[filterableIds[i]!] === false) {\n return false\n }\n }\n return true\n }\n\n return filterRows(preRowModel.rows, filterRowsImpl, table)\n },\n {\n key:\n process.env.NODE_ENV === 'development' &&\n 'getFacetedRowModel_' + columnId,\n debug: () => table.options.debugAll ?? table.options.debugTable,\n onChange: () => {},\n }\n )\n}\n", "import { Table, RowData } from '../types'\nimport { memo } from '../utils'\n\nexport function getFacetedUniqueValues(): (\n table: Table,\n columnId: string\n) => () => Map {\n return (table, columnId) =>\n memo(\n () => [table.getColumn(columnId)?.getFacetedRowModel()],\n facetedRowModel => {\n if (!facetedRowModel) return new Map()\n\n let facetedUniqueValues = new Map()\n\n for (let i = 0; i < facetedRowModel.flatRows.length; i++) {\n const values =\n facetedRowModel.flatRows[i]!.getUniqueValues(columnId)\n\n for (let j = 0; j < values.length; j++) {\n const value = values[j]!\n\n if (facetedUniqueValues.has(value)) {\n facetedUniqueValues.set(\n value,\n (facetedUniqueValues.get(value) ?? 0) + 1\n )\n } else {\n facetedUniqueValues.set(value, 1)\n }\n }\n }\n\n return facetedUniqueValues\n },\n {\n key:\n process.env.NODE_ENV === 'development' &&\n 'getFacetedUniqueValues_' + columnId,\n debug: () => table.options.debugAll ?? table.options.debugTable,\n onChange: () => {},\n }\n )\n}\n", "import { Table, RowData } from '../types'\nimport { memo } from '../utils'\n\nexport function getFacetedMinMaxValues(): (\n table: Table,\n columnId: string\n) => () => undefined | [number, number] {\n return (table, columnId) =>\n memo(\n () => [table.getColumn(columnId)?.getFacetedRowModel()],\n facetedRowModel => {\n if (!facetedRowModel) return undefined\n\n const firstValue =\n facetedRowModel.flatRows[0]?.getUniqueValues(columnId)\n\n if (typeof firstValue === 'undefined') {\n return undefined\n }\n\n let facetedMinMaxValues: [any, any] = [firstValue, firstValue]\n\n for (let i = 0; i < facetedRowModel.flatRows.length; i++) {\n const values =\n facetedRowModel.flatRows[i]!.getUniqueValues(columnId)\n\n for (let j = 0; j < values.length; j++) {\n const value = values[j]!\n\n if (value < facetedMinMaxValues[0]) {\n facetedMinMaxValues[0] = value\n } else if (value > facetedMinMaxValues[1]) {\n facetedMinMaxValues[1] = value\n }\n }\n }\n\n return facetedMinMaxValues\n },\n {\n key:\n process.env.NODE_ENV === 'development' &&\n 'getFacetedMinMaxValues_' + columnId,\n debug: () => table.options.debugAll ?? table.options.debugTable,\n onChange: () => {},\n }\n )\n}\n", "import { Table, Row, RowModel, RowData } from '../types'\nimport { SortingFn } from '../features/Sorting'\nimport { memo } from '../utils'\n\nexport function getSortedRowModel(): (\n table: Table\n) => () => RowModel {\n return table =>\n memo(\n () => [table.getState().sorting, table.getPreSortedRowModel()],\n (sorting, rowModel) => {\n if (!rowModel.rows.length || !sorting?.length) {\n return rowModel\n }\n\n const sortingState = table.getState().sorting\n\n const sortedFlatRows: Row[] = []\n\n // Filter out sortings that correspond to non existing columns\n const availableSorting = sortingState.filter(sort =>\n table.getColumn(sort.id)?.getCanSort()\n )\n\n const columnInfoById: Record<\n string,\n {\n sortUndefined?: false | -1 | 1\n invertSorting?: boolean\n sortingFn: SortingFn\n }\n > = {}\n\n availableSorting.forEach(sortEntry => {\n const column = table.getColumn(sortEntry.id)\n if (!column) return\n\n columnInfoById[sortEntry.id] = {\n sortUndefined: column.columnDef.sortUndefined,\n invertSorting: column.columnDef.invertSorting,\n sortingFn: column.getSortingFn(),\n }\n })\n\n const sortData = (rows: Row[]) => {\n // This will also perform a stable sorting using the row index\n // if needed.\n const sortedData = [...rows]\n\n sortedData.sort((rowA, rowB) => {\n for (let i = 0; i < availableSorting.length; i += 1) {\n const sortEntry = availableSorting[i]!\n const columnInfo = columnInfoById[sortEntry.id]!\n const isDesc = sortEntry?.desc ?? false\n\n let sortInt = 0\n\n // All sorting ints should always return in ascending order\n if (columnInfo.sortUndefined) {\n const aValue = rowA.getValue(sortEntry.id)\n const bValue = rowB.getValue(sortEntry.id)\n\n const aUndefined = aValue === undefined\n const bUndefined = bValue === undefined\n\n if (aUndefined || bUndefined) {\n sortInt =\n aUndefined && bUndefined\n ? 0\n : aUndefined\n ? columnInfo.sortUndefined\n : -columnInfo.sortUndefined\n }\n }\n\n if (sortInt === 0) {\n sortInt = columnInfo.sortingFn(rowA, rowB, sortEntry.id)\n }\n\n // If sorting is non-zero, take care of desc and inversion\n if (sortInt !== 0) {\n if (isDesc) {\n sortInt *= -1\n }\n\n if (columnInfo.invertSorting) {\n sortInt *= -1\n }\n\n return sortInt\n }\n }\n\n return rowA.index - rowB.index\n })\n\n // If there are sub-rows, sort them\n sortedData.forEach(row => {\n sortedFlatRows.push(row)\n if (row.subRows?.length) {\n row.subRows = sortData(row.subRows)\n }\n })\n\n return sortedData\n }\n\n return {\n rows: sortData(rowModel.rows),\n flatRows: sortedFlatRows,\n rowsById: rowModel.rowsById,\n }\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getSortedRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n onChange: () => {\n table._autoResetPageIndex()\n },\n }\n )\n}\n", "import { createRow } from '../core/row'\nimport { Table, Row, RowModel, RowData } from '../types'\nimport { flattenBy, memo } from '../utils'\n\nexport function getGroupedRowModel(): (\n table: Table\n) => () => RowModel {\n return table =>\n memo(\n () => [table.getState().grouping, table.getPreGroupedRowModel()],\n (grouping, rowModel) => {\n if (!rowModel.rows.length || !grouping.length) {\n return rowModel\n }\n\n // Filter the grouping list down to columns that exist\n const existingGrouping = grouping.filter(columnId =>\n table.getColumn(columnId)\n )\n\n const groupedFlatRows: Row[] = []\n const groupedRowsById: Record> = {}\n // const onlyGroupedFlatRows: Row[] = [];\n // const onlyGroupedRowsById: Record = {};\n // const nonGroupedFlatRows: Row[] = [];\n // const nonGroupedRowsById: Record = {};\n\n // Recursively group the data\n const groupUpRecursively = (\n rows: Row[],\n depth = 0,\n parentId?: string\n ) => {\n // Grouping depth has been been met\n // Stop grouping and simply rewrite thd depth and row relationships\n if (depth >= existingGrouping.length) {\n return rows.map(row => {\n row.depth = depth\n\n groupedFlatRows.push(row)\n groupedRowsById[row.id] = row\n\n if (row.subRows) {\n row.subRows = groupUpRecursively(row.subRows, depth + 1, row.id)\n }\n\n return row\n })\n }\n\n const columnId: string = existingGrouping[depth]!\n\n // Group the rows together for this level\n const rowGroupsMap = groupBy(rows, columnId)\n\n // Peform aggregations for each group\n const aggregatedGroupedRows = Array.from(rowGroupsMap.entries()).map(\n ([groupingValue, groupedRows], index) => {\n let id = `${columnId}:${groupingValue}`\n id = parentId ? `${parentId}>${id}` : id\n\n // First, Recurse to group sub rows before aggregation\n const subRows = groupUpRecursively(groupedRows, depth + 1, id)\n\n // Flatten the leaf rows of the rows in this group\n const leafRows = depth\n ? flattenBy(groupedRows, row => row.subRows)\n : groupedRows\n\n const row = createRow(\n table,\n id,\n leafRows[0]!.original,\n index,\n depth,\n undefined,\n parentId\n )\n\n Object.assign(row, {\n groupingColumnId: columnId,\n groupingValue,\n subRows,\n leafRows,\n getValue: (columnId: string) => {\n // Don't aggregate columns that are in the grouping\n if (existingGrouping.includes(columnId)) {\n if (row._valuesCache.hasOwnProperty(columnId)) {\n return row._valuesCache[columnId]\n }\n\n if (groupedRows[0]) {\n row._valuesCache[columnId] =\n groupedRows[0].getValue(columnId) ?? undefined\n }\n\n return row._valuesCache[columnId]\n }\n\n if (row._groupingValuesCache.hasOwnProperty(columnId)) {\n return row._groupingValuesCache[columnId]\n }\n\n // Aggregate the values\n const column = table.getColumn(columnId)\n const aggregateFn = column?.getAggregationFn()\n\n if (aggregateFn) {\n row._groupingValuesCache[columnId] = aggregateFn(\n columnId,\n leafRows,\n groupedRows\n )\n\n return row._groupingValuesCache[columnId]\n }\n },\n })\n\n subRows.forEach(subRow => {\n groupedFlatRows.push(subRow)\n groupedRowsById[subRow.id] = subRow\n // if (subRow.getIsGrouped?.()) {\n // onlyGroupedFlatRows.push(subRow);\n // onlyGroupedRowsById[subRow.id] = subRow;\n // } else {\n // nonGroupedFlatRows.push(subRow);\n // nonGroupedRowsById[subRow.id] = subRow;\n // }\n })\n\n return row\n }\n )\n\n return aggregatedGroupedRows\n }\n\n const groupedRows = groupUpRecursively(rowModel.rows, 0)\n\n groupedRows.forEach(subRow => {\n groupedFlatRows.push(subRow)\n groupedRowsById[subRow.id] = subRow\n // if (subRow.getIsGrouped?.()) {\n // onlyGroupedFlatRows.push(subRow);\n // onlyGroupedRowsById[subRow.id] = subRow;\n // } else {\n // nonGroupedFlatRows.push(subRow);\n // nonGroupedRowsById[subRow.id] = subRow;\n // }\n })\n\n return {\n rows: groupedRows,\n flatRows: groupedFlatRows,\n rowsById: groupedRowsById,\n }\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getGroupedRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n onChange: () => {\n table._queue(() => {\n table._autoResetExpanded()\n table._autoResetPageIndex()\n })\n },\n }\n )\n}\n\nfunction groupBy(rows: Row[], columnId: string) {\n const groupMap = new Map[]>()\n\n return rows.reduce((map, row) => {\n const resKey = `${row.getGroupingValue(columnId)}`\n const previous = map.get(resKey)\n if (!previous) {\n map.set(resKey, [row])\n } else {\n previous.push(row)\n }\n return map\n }, groupMap)\n}\n", "import { Table, Row, RowModel, RowData } from '../types'\nimport { memo } from '../utils'\n\nexport function getExpandedRowModel(): (\n table: Table\n) => () => RowModel {\n return table =>\n memo(\n () => [\n table.getState().expanded,\n table.getPreExpandedRowModel(),\n table.options.paginateExpandedRows,\n ],\n (expanded, rowModel, paginateExpandedRows) => {\n if (\n !rowModel.rows.length ||\n (expanded !== true && !Object.keys(expanded ?? {}).length)\n ) {\n return rowModel\n }\n\n if (!paginateExpandedRows) {\n // Only expand rows at this point if they are being paginated\n return rowModel\n }\n\n return expandRows(rowModel)\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getExpandedRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n }\n )\n}\n\nexport function expandRows(rowModel: RowModel) {\n const expandedRows: Row[] = []\n\n const handleRow = (row: Row) => {\n expandedRows.push(row)\n\n if (row.subRows?.length && row.getIsExpanded()) {\n row.subRows.forEach(handleRow)\n }\n }\n\n rowModel.rows.forEach(handleRow)\n\n return {\n rows: expandedRows,\n flatRows: rowModel.flatRows,\n rowsById: rowModel.rowsById,\n }\n}\n", "import { Table, RowModel, Row, RowData } from '../types'\nimport { memo } from '../utils'\nimport { expandRows } from './getExpandedRowModel'\n\nexport function getPaginationRowModel(opts?: {\n initialSync: boolean\n}): (table: Table) => () => RowModel {\n return table =>\n memo(\n () => [\n table.getState().pagination,\n table.getPrePaginationRowModel(),\n table.options.paginateExpandedRows\n ? undefined\n : table.getState().expanded,\n ],\n (pagination, rowModel) => {\n if (!rowModel.rows.length) {\n return rowModel\n }\n\n const { pageSize, pageIndex } = pagination\n let { rows, flatRows, rowsById } = rowModel\n const pageStart = pageSize * pageIndex\n const pageEnd = pageStart + pageSize\n\n rows = rows.slice(pageStart, pageEnd)\n\n let paginatedRowModel: RowModel\n\n if (!table.options.paginateExpandedRows) {\n paginatedRowModel = expandRows({\n rows,\n flatRows,\n rowsById,\n })\n } else {\n paginatedRowModel = {\n rows,\n flatRows,\n rowsById,\n }\n }\n\n paginatedRowModel.flatRows = []\n\n const handleRow = (row: Row) => {\n paginatedRowModel.flatRows.push(row)\n if (row.subRows.length) {\n row.subRows.forEach(handleRow)\n }\n }\n\n paginatedRowModel.rows.forEach(handleRow)\n\n return paginatedRowModel\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getPaginationRowModel',\n debug: () => table.options.debugAll ?? table.options.debugTable,\n }\n )\n}\n", "import * as React from 'react'\nexport * from '@tanstack/table-core'\n\nimport {\n TableOptions,\n TableOptionsResolved,\n RowData,\n createTable,\n} from '@tanstack/table-core'\n\nexport type Renderable = React.ReactNode | React.ComponentType\n\n//\n\nexport function flexRender(\n Comp: Renderable,\n props: TProps\n): React.ReactNode | JSX.Element {\n return !Comp ? null : isReactComponent(Comp) ? (\n \n ) : (\n Comp\n )\n}\n\nfunction isReactComponent(\n component: unknown\n): component is React.ComponentType {\n return (\n isClassComponent(component) ||\n typeof component === 'function' ||\n isExoticComponent(component)\n )\n}\n\nfunction isClassComponent(component: any) {\n return (\n typeof component === 'function' &&\n (() => {\n const proto = Object.getPrototypeOf(component)\n return proto.prototype && proto.prototype.isReactComponent\n })()\n )\n}\n\nfunction isExoticComponent(component: any) {\n return (\n typeof component === 'object' &&\n typeof component.$$typeof === 'symbol' &&\n ['react.memo', 'react.forward_ref'].includes(component.$$typeof.description)\n )\n}\n\nexport function useReactTable(\n options: TableOptions\n) {\n // Compose in the generic options to the user options\n const resolvedOptions: TableOptionsResolved = {\n state: {}, // Dummy state\n onStateChange: () => {}, // noop\n renderFallbackValue: null,\n ...options,\n }\n\n // Create a new table and store it in state\n const [tableRef] = React.useState(() => ({\n current: createTable(resolvedOptions),\n }))\n\n // By default, manage table state here using the table's initial state\n const [state, setState] = React.useState(() => tableRef.current.initialState)\n\n // Compose the default state above with any user state. This will allow the user\n // to only control a subset of the state if desired.\n tableRef.current.setOptions(prev => ({\n ...prev,\n ...options,\n state: {\n ...state,\n ...options.state,\n },\n // Similarly, we'll maintain both our internal state and any user-provided\n // state.\n onStateChange: updater => {\n setState(updater)\n options.onStateChange?.(updater)\n },\n }))\n\n return tableRef.current\n}\n", "/**\n * react-virtual\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nexport { _extends as extends };\n//# sourceMappingURL=_rollupPluginBabelHelpers.mjs.map\n", "/**\n * virtual-core\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nexport { _extends as extends };\n//# sourceMappingURL=_rollupPluginBabelHelpers.mjs.map\n", "export type NoInfer = [A][A extends any ? 0 : never]\n\nexport type PartialKeys = Omit & Partial>\n\nexport function memo(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: false | string\n debug?: () => any\n onChange?: (result: TResult) => void\n initialDeps?: TDeps\n },\n) {\n let deps = opts.initialDeps ?? []\n let result: TResult | undefined\n\n return (): TResult => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n opts?.onChange?.(result)\n\n return result!\n }\n}\n\nexport function notUndefined(value: T | undefined, msg?: string): T {\n if (value === undefined) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : ''}`)\n } else {\n return value\n }\n}\n\nexport const approxEqual = (a: number, b: number) => Math.abs(a - b) < 1\n", "import { approxEqual, memo, notUndefined } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollDirection = 'forward' | 'backward'\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\nexport interface VirtualItem {\n key: Key\n index: number\n start: number\n end: number\n size: number\n lane: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer,\n cb: (rect: Rect) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = (rect: Rect) => {\n const { width, height } = rect\n cb({ width: Math.round(width), height: Math.round(height) })\n }\n\n handler(element.getBoundingClientRect())\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry?.borderBoxSize) {\n const box = entry.borderBoxSize[0]\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize })\n return\n }\n }\n handler(element.getBoundingClientRect())\n })\n\n observer.observe(element, { box: 'border-box' })\n\n return () => {\n observer.unobserve(element)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer,\n cb: (rect: Rect) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight })\n }\n handler()\n\n element.addEventListener('resize', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('resize', handler)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer,\n cb: (offset: number) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb(element[instance.options.horizontal ? 'scrollLeft' : 'scrollTop'])\n }\n handler()\n\n element.addEventListener('scroll', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('scroll', handler)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer,\n cb: (offset: number) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb(element[instance.options.horizontal ? 'scrollX' : 'scrollY'])\n }\n handler()\n\n element.addEventListener('scroll', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('scroll', handler)\n }\n}\n\nexport const measureElement = (\n element: TItemElement,\n entry: ResizeObserverEntry | undefined,\n instance: Virtualizer,\n) => {\n if (entry?.borderBoxSize) {\n const box = entry.borderBoxSize[0]\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? 'inlineSize' : 'blockSize'],\n )\n return size\n }\n }\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = (\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer,\n ) => void\n observeElementRect: (\n instance: Virtualizer,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer) => void\n measureElement?: (\n element: TItemElement,\n entry: ResizeObserverEntry | undefined,\n instance: Virtualizer,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n initialMeasurementsCache?: VirtualItem[]\n lanes?: number\n}\n\nexport class Virtualizer<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n private unsubs: (void | (() => void))[] = []\n options!: Required>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType | null = null\n private scrollToIndexTimeoutId: ReturnType | null = null\n measurementsCache: VirtualItem[] = []\n private itemSizeCache = new Map()\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n scrollOffset: number\n scrollDirection: ScrollDirection | null = null\n private scrollAdjustments: number = 0\n measureElementCache = new Map()\n private observer = (() => {\n let _ro: ResizeObserver | null = null\n\n const get = () => {\n if (_ro) {\n return _ro\n } else if (typeof ResizeObserver !== 'undefined') {\n return (_ro = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n this._measureElement(entry.target as TItemElement, entry)\n })\n }))\n } else {\n return null\n }\n }\n\n return {\n disconnect: () => get()?.disconnect(),\n observe: (target: Element) =>\n get()?.observe(target, { box: 'border-box' }),\n unobserve: (target: Element) => get()?.unobserve(target),\n }\n })()\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n this.measurementsCache = this.options.initialMeasurementsCache\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size)\n })\n\n this.maybeNotify()\n }\n\n setOptions = (opts: VirtualizerOptions) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n initialMeasurementsCache: [],\n lanes: 1,\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n this.measureElementCache.forEach(this.observer.observe)\n return () => {\n this.observer.disconnect()\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n const prev = this.scrollRect\n this.scrollRect = rect\n if (\n this.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n this.maybeNotify()\n }\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollAdjustments = 0\n\n if (this.scrollOffset === offset) {\n return\n }\n\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n this.isScrolling = true\n this.scrollDirection =\n this.scrollOffset < offset ? 'forward' : 'backward'\n this.scrollOffset = offset\n\n this.maybeNotify()\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n this.scrollDirection = null\n\n this.maybeNotify()\n }, this.options.scrollingDelay)\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private memoOptions = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n ],\n (count, paddingStart, scrollMargin, getItemKey) => {\n this.pendingMeasuredCacheIndexes = []\n return {\n count,\n paddingStart,\n scrollMargin,\n getItemKey,\n }\n },\n {\n key: false,\n },\n )\n\n private getFurthestMeasurement = (\n measurements: VirtualItem[],\n index: number,\n ) => {\n const furthestMeasurementsFound = new Map()\n const furthestMeasurements = new Map()\n for (let m = index - 1; m >= 0; m--) {\n const measurement = measurements[m]!\n\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue\n }\n\n const previousFurthestMeasurement = furthestMeasurements.get(\n measurement.lane,\n )\n if (\n previousFurthestMeasurement == null ||\n measurement.end > previousFurthestMeasurement.end\n ) {\n furthestMeasurements.set(measurement.lane, measurement)\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true)\n }\n\n if (furthestMeasurementsFound.size === this.options.lanes) {\n break\n }\n }\n\n return furthestMeasurements.size === this.options.lanes\n ? Array.from(furthestMeasurements.values()).sort(\n (a, b) => a.end - b.end,\n )[0]\n : undefined\n }\n\n private getMeasurements = memo(\n () => [this.memoOptions(), this.itemSizeCache],\n ({ count, paddingStart, scrollMargin, getItemKey }, itemSizeCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n\n const furthestMeasurement =\n this.options.lanes === 1\n ? measurements[i - 1]\n : this.getFurthestMeasurement(measurements, i)\n\n const start = furthestMeasurement\n ? furthestMeasurement.end\n : paddingStart + scrollMargin\n\n const measuredSize = itemSizeCache.get(key)\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n\n const end = start + size\n\n const lane = furthestMeasurement\n ? furthestMeasurement.lane\n : i % this.options.lanes\n\n measurements[i] = {\n index: i,\n start,\n size,\n end,\n key,\n lane,\n }\n }\n\n this.measurementsCache = measurements\n\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return (this.range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n }))\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private maybeNotify = memo(\n () => {\n const range = this.calculateRange()\n\n return [range.startIndex, range.endIndex, this.isScrolling]\n },\n () => {\n this.notify()\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'maybeNotify',\n debug: () => this.options.debug,\n initialDeps: [\n this.range.startIndex,\n this.range.endIndex,\n this.isScrolling,\n ],\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n indexFromElement = (node: TItemElement) => {\n const attributeName = this.options.indexAttribute\n const indexStr = node.getAttribute(attributeName)\n\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`,\n )\n return -1\n }\n\n return parseInt(indexStr, 10)\n }\n\n private _measureElement = (\n node: TItemElement,\n entry: ResizeObserverEntry | undefined,\n ) => {\n const index = this.indexFromElement(node)\n\n const item = this.measurementsCache[index]\n if (!item) {\n return\n }\n\n const prevNode = this.measureElementCache.get(item.key)\n\n if (!node.isConnected) {\n this.observer.unobserve(node)\n if (node === prevNode) {\n this.measureElementCache.delete(item.key)\n }\n return\n }\n\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode)\n }\n this.observer.observe(node)\n this.measureElementCache.set(item.key, node)\n }\n\n const measuredItemSize = this.options.measureElement(node, entry, this)\n\n const itemSize = this.itemSizeCache.get(item.key) ?? item.size\n\n const delta = measuredItemSize - itemSize\n\n if (delta !== 0) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: (this.scrollAdjustments += delta),\n behavior: undefined,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n\n this.itemSizeCache = new Map(\n this.itemSizeCache.set(item.key, measuredItemSize),\n )\n\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, undefined)\n }\n\n getVirtualItems = memo(\n () => [this.getIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems: VirtualItem[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n virtualItems.push(measurement)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItemForOffset = (offset: number) => {\n const measurements = this.getMeasurements()\n\n return notUndefined(\n measurements[\n findNearestBinarySearch(\n 0,\n measurements.length - 1,\n (index: number) => notUndefined(measurements[index]).start,\n offset,\n )\n ],\n )\n }\n\n getOffsetForAlignment = (toOffset: number, align: ScrollAlignment) => {\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= this.scrollOffset) {\n align = 'start'\n } else if (toOffset >= this.scrollOffset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n toOffset = toOffset\n } else if (align === 'end') {\n toOffset = toOffset - size\n } else if (align === 'center') {\n toOffset = toOffset - size / 2\n }\n\n const scrollSizeProp = this.options.horizontal\n ? 'scrollWidth'\n : 'scrollHeight'\n const scrollSize = this.scrollElement\n ? 'document' in this.scrollElement\n ? this.scrollElement.document.documentElement[scrollSizeProp]\n : this.scrollElement[scrollSizeProp]\n : 0\n\n const maxOffset = scrollSize - this.getSize()\n\n return Math.max(Math.min(maxOffset, toOffset), 0)\n }\n\n getOffsetForIndex = (index: number, align: ScrollAlignment = 'auto') => {\n index = Math.max(0, Math.min(index, this.options.count - 1))\n\n const measurement = notUndefined(this.getMeasurements()[index])\n\n if (align === 'auto') {\n if (\n measurement.end >=\n this.scrollOffset + this.getSize() - this.options.scrollPaddingEnd\n ) {\n align = 'end'\n } else if (\n measurement.start <=\n this.scrollOffset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return [this.scrollOffset, align] as const\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n return [this.getOffsetForAlignment(toOffset, align), align] as const\n }\n\n private isDynamicMode = () => this.measureElementCache.size > 0\n\n private cancelScrollToIndex = () => {\n if (this.scrollToIndexTimeoutId !== null) {\n clearTimeout(this.scrollToIndexTimeoutId)\n this.scrollToIndexTimeoutId = null\n }\n }\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', behavior }: ScrollToOffsetOptions = {},\n ) => {\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {\n adjustments: undefined,\n behavior,\n })\n }\n\n scrollToIndex = (\n index: number,\n { align: initialAlign = 'auto', behavior }: ScrollToIndexOptions = {},\n ) => {\n index = Math.max(0, Math.min(index, this.options.count - 1))\n\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n const [toOffset, align] = this.getOffsetForIndex(index, initialAlign)\n\n this._scrollToOffset(toOffset, { adjustments: undefined, behavior })\n\n if (behavior !== 'smooth' && this.isDynamicMode()) {\n this.scrollToIndexTimeoutId = setTimeout(() => {\n this.scrollToIndexTimeoutId = null\n\n const elementInDOM = this.measureElementCache.has(\n this.options.getItemKey(index),\n )\n\n if (elementInDOM) {\n const [toOffset] = this.getOffsetForIndex(index, align)\n\n if (!approxEqual(toOffset, this.scrollOffset)) {\n this.scrollToIndex(index, { align, behavior })\n }\n } else {\n this.scrollToIndex(index, { align, behavior })\n }\n })\n }\n }\n\n scrollBy = (delta: number, { behavior }: ScrollToOffsetOptions = {}) => {\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n this._scrollToOffset(this.scrollOffset + delta, {\n adjustments: undefined,\n behavior,\n })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) -\n this.options.scrollMargin +\n this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n adjustments,\n behavior,\n }: {\n adjustments: number | undefined\n behavior: ScrollBehavior | undefined\n },\n ) => {\n this.options.scrollToFn(offset, { behavior, adjustments }, this)\n }\n\n measure = () => {\n this.itemSizeCache = new Map()\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: VirtualItem[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n", "import * as React from 'react'\nimport {\n elementScroll,\n observeElementOffset,\n observeElementRect,\n observeWindowOffset,\n observeWindowRect,\n PartialKeys,\n Virtualizer,\n VirtualizerOptions,\n windowScroll,\n} from '@tanstack/virtual-core'\nexport * from '@tanstack/virtual-core'\n\n//\n\nconst useIsomorphicLayoutEffect =\n typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect\n\nfunction useVirtualizerBase<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n>(\n options: VirtualizerOptions,\n): Virtualizer {\n const rerender = React.useReducer(() => ({}), {})[1]\n\n const resolvedOptions: VirtualizerOptions = {\n ...options,\n onChange: (instance) => {\n rerender()\n options.onChange?.(instance)\n },\n }\n\n const [instance] = React.useState(\n () => new Virtualizer(resolvedOptions),\n )\n\n instance.setOptions(resolvedOptions)\n\n React.useEffect(() => {\n return instance._didMount()\n }, [])\n\n useIsomorphicLayoutEffect(() => {\n return instance._willUpdate()\n })\n\n return instance\n}\n\nexport function useVirtualizer<\n TScrollElement extends Element,\n TItemElement extends Element,\n>(\n options: PartialKeys<\n VirtualizerOptions,\n 'observeElementRect' | 'observeElementOffset' | 'scrollToFn'\n >,\n): Virtualizer {\n return useVirtualizerBase({\n observeElementRect: observeElementRect,\n observeElementOffset: observeElementOffset,\n scrollToFn: elementScroll,\n ...options,\n })\n}\n\nexport function useWindowVirtualizer(\n options: PartialKeys<\n VirtualizerOptions,\n | 'getScrollElement'\n | 'observeElementRect'\n | 'observeElementOffset'\n | 'scrollToFn'\n >,\n): Virtualizer {\n return useVirtualizerBase({\n getScrollElement: () => (typeof document !== 'undefined' ? window : null),\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll,\n ...options,\n })\n}\n", "import { render, hydrate, unmountComponentAtNode } from 'preact/compat';\n\nexport function createRoot(container) {\n\treturn {\n\t\trender(children) {\n\t\t\trender(children, container);\n\t\t},\n\t\tunmount() {\n\t\t\tunmountComponentAtNode(container);\n\t\t}\n\t};\n}\n\nexport function hydrateRoot(container, children) {\n\thydrate(children, container);\n\treturn createRoot(container);\n}\n\nexport default {\n\tcreateRoot,\n\thydrateRoot\n};\n", "// Should be no imports here!\n\n/**\n * The sentinel value returned by producers to replace the draft with undefined.\n */\nexport const NOTHING: unique symbol = Symbol.for(\"immer-nothing\")\n\n/**\n * To let Immer treat your class instances as plain immutable objects\n * (albeit with a custom prototype), you must define either an instance property\n * or a static property on each of your custom classes.\n *\n * Otherwise, your class instance will never be drafted, which means it won't be\n * safe to mutate in a produce callback.\n */\nexport const DRAFTABLE: unique symbol = Symbol.for(\"immer-draftable\")\n\nexport const DRAFT_STATE: unique symbol = Symbol.for(\"immer-state\")\n", "export const errors =\n\tprocess.env.NODE_ENV !== \"production\"\n\t\t? [\n\t\t\t\t// All error codes, starting by 0:\n\t\t\t\tfunction(plugin: string) {\n\t\t\t\t\treturn `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${plugin}()\\` when initializing your application.`\n\t\t\t\t},\n\t\t\t\tfunction(thing: string) {\n\t\t\t\t\treturn `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`\n\t\t\t\t},\n\t\t\t\t\"This object has been frozen and should not be mutated\",\n\t\t\t\tfunction(data: any) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t\"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" +\n\t\t\t\t\t\tdata\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\t\"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n\t\t\t\t\"Immer forbids circular references\",\n\t\t\t\t\"The first or second argument to `produce` must be a function\",\n\t\t\t\t\"The third argument to `produce` must be a function or undefined\",\n\t\t\t\t\"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n\t\t\t\t\"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n\t\t\t\tfunction(thing: string) {\n\t\t\t\t\treturn `'current' expects a draft, got: ${thing}`\n\t\t\t\t},\n\t\t\t\t\"Object.defineProperty() cannot be used on an Immer draft\",\n\t\t\t\t\"Object.setPrototypeOf() cannot be used on an Immer draft\",\n\t\t\t\t\"Immer only supports deleting array indices\",\n\t\t\t\t\"Immer only supports setting array indices and the 'length' property\",\n\t\t\t\tfunction(thing: string) {\n\t\t\t\t\treturn `'original' expects a draft, got: ${thing}`\n\t\t\t\t}\n\t\t\t\t// Note: if more errors are added, the errorOffset in Patches.ts should be increased\n\t\t\t\t// See Patches.ts for additional errors\n\t\t ]\n\t\t: []\n\nexport function die(error: number, ...args: any[]): never {\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tconst e = errors[error]\n\t\tconst msg = typeof e === \"function\" ? e.apply(null, args as any) : e\n\t\tthrow new Error(`[Immer] ${msg}`)\n\t}\n\tthrow new Error(\n\t\t`[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`\n\t)\n}\n", "import {\n\tDRAFT_STATE,\n\tDRAFTABLE,\n\tObjectish,\n\tDrafted,\n\tAnyObject,\n\tAnyMap,\n\tAnySet,\n\tImmerState,\n\tArchType,\n\tdie\n} from \"../internal\"\n\nexport const getPrototypeOf = Object.getPrototypeOf\n\n/** Returns true if the given value is an Immer draft */\n/*#__PURE__*/\nexport function isDraft(value: any): boolean {\n\treturn !!value && !!value[DRAFT_STATE]\n}\n\n/** Returns true if the given value can be drafted by Immer */\n/*#__PURE__*/\nexport function isDraftable(value: any): boolean {\n\tif (!value) return false\n\treturn (\n\t\tisPlainObject(value) ||\n\t\tArray.isArray(value) ||\n\t\t!!value[DRAFTABLE] ||\n\t\t!!value.constructor?.[DRAFTABLE] ||\n\t\tisMap(value) ||\n\t\tisSet(value)\n\t)\n}\n\nconst objectCtorString = Object.prototype.constructor.toString()\n/*#__PURE__*/\nexport function isPlainObject(value: any): boolean {\n\tif (!value || typeof value !== \"object\") return false\n\tconst proto = getPrototypeOf(value)\n\tif (proto === null) {\n\t\treturn true\n\t}\n\tconst Ctor =\n\t\tObject.hasOwnProperty.call(proto, \"constructor\") && proto.constructor\n\n\tif (Ctor === Object) return true\n\n\treturn (\n\t\ttypeof Ctor == \"function\" &&\n\t\tFunction.toString.call(Ctor) === objectCtorString\n\t)\n}\n\n/** Get the underlying object that is represented by the given draft */\n/*#__PURE__*/\nexport function original(value: T): T | undefined\nexport function original(value: Drafted): any {\n\tif (!isDraft(value)) die(15, value)\n\treturn value[DRAFT_STATE].base_\n}\n\nexport function each(\n\tobj: T,\n\titer: (key: string | number, value: any, source: T) => void,\n\tenumerableOnly?: boolean\n): void\nexport function each(obj: any, iter: any) {\n\tif (getArchtype(obj) === ArchType.Object) {\n\t\tObject.entries(obj).forEach(([key, value]) => {\n\t\t\titer(key, value, obj)\n\t\t})\n\t} else {\n\t\tobj.forEach((entry: any, index: any) => iter(index, entry, obj))\n\t}\n}\n\n/*#__PURE__*/\nexport function getArchtype(thing: any): ArchType {\n\tconst state: undefined | ImmerState = thing[DRAFT_STATE]\n\treturn state\n\t\t? state.type_\n\t\t: Array.isArray(thing)\n\t\t? ArchType.Array\n\t\t: isMap(thing)\n\t\t? ArchType.Map\n\t\t: isSet(thing)\n\t\t? ArchType.Set\n\t\t: ArchType.Object\n}\n\n/*#__PURE__*/\nexport function has(thing: any, prop: PropertyKey): boolean {\n\treturn getArchtype(thing) === ArchType.Map\n\t\t? thing.has(prop)\n\t\t: Object.prototype.hasOwnProperty.call(thing, prop)\n}\n\n/*#__PURE__*/\nexport function get(thing: AnyMap | AnyObject, prop: PropertyKey): any {\n\t// @ts-ignore\n\treturn getArchtype(thing) === ArchType.Map ? thing.get(prop) : thing[prop]\n}\n\n/*#__PURE__*/\nexport function set(thing: any, propOrOldValue: PropertyKey, value: any) {\n\tconst t = getArchtype(thing)\n\tif (t === ArchType.Map) thing.set(propOrOldValue, value)\n\telse if (t === ArchType.Set) {\n\t\tthing.add(value)\n\t} else thing[propOrOldValue] = value\n}\n\n/*#__PURE__*/\nexport function is(x: any, y: any): boolean {\n\t// From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js\n\tif (x === y) {\n\t\treturn x !== 0 || 1 / x === 1 / y\n\t} else {\n\t\treturn x !== x && y !== y\n\t}\n}\n\n/*#__PURE__*/\nexport function isMap(target: any): target is AnyMap {\n\treturn target instanceof Map\n}\n\n/*#__PURE__*/\nexport function isSet(target: any): target is AnySet {\n\treturn target instanceof Set\n}\n/*#__PURE__*/\nexport function latest(state: ImmerState): any {\n\treturn state.copy_ || state.base_\n}\n\n/*#__PURE__*/\nexport function shallowCopy(base: any, strict: boolean) {\n\tif (isMap(base)) {\n\t\treturn new Map(base)\n\t}\n\tif (isSet(base)) {\n\t\treturn new Set(base)\n\t}\n\tif (Array.isArray(base)) return Array.prototype.slice.call(base)\n\n\tif (!strict && isPlainObject(base)) {\n\t\tif (!getPrototypeOf(base)) {\n\t\t\tconst obj = Object.create(null)\n\t\t\treturn Object.assign(obj, base)\n\t\t}\n\t\treturn {...base}\n\t}\n\n\tconst descriptors = Object.getOwnPropertyDescriptors(base)\n\tdelete descriptors[DRAFT_STATE as any]\n\tlet keys = Reflect.ownKeys(descriptors)\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tconst key: any = keys[i]\n\t\tconst desc = descriptors[key]\n\t\tif (desc.writable === false) {\n\t\t\tdesc.writable = true\n\t\t\tdesc.configurable = true\n\t\t}\n\t\t// like object.assign, we will read any _own_, get/set accessors. This helps in dealing\n\t\t// with libraries that trap values, like mobx or vue\n\t\t// unlike object.assign, non-enumerables will be copied as well\n\t\tif (desc.get || desc.set)\n\t\t\tdescriptors[key] = {\n\t\t\t\tconfigurable: true,\n\t\t\t\twritable: true, // could live with !!desc.set as well here...\n\t\t\t\tenumerable: desc.enumerable,\n\t\t\t\tvalue: base[key]\n\t\t\t}\n\t}\n\treturn Object.create(getPrototypeOf(base), descriptors)\n}\n\n/**\n * Freezes draftable objects. Returns the original object.\n * By default freezes shallowly, but if the second argument is `true` it will freeze recursively.\n *\n * @param obj\n * @param deep\n */\nexport function freeze(obj: T, deep?: boolean): T\nexport function freeze(obj: any, deep: boolean = false): T {\n\tif (isFrozen(obj) || isDraft(obj) || !isDraftable(obj)) return obj\n\tif (getArchtype(obj) > 1 /* Map or Set */) {\n\t\tobj.set = obj.add = obj.clear = obj.delete = dontMutateFrozenCollections as any\n\t}\n\tObject.freeze(obj)\n\tif (deep) each(obj, (_key, value) => freeze(value, true), true)\n\treturn obj\n}\n\nfunction dontMutateFrozenCollections() {\n\tdie(2)\n}\n\nexport function isFrozen(obj: any): boolean {\n\treturn Object.isFrozen(obj)\n}\n", "import {\n\tImmerState,\n\tPatch,\n\tDrafted,\n\tImmerBaseState,\n\tAnyMap,\n\tAnySet,\n\tArchType,\n\tdie\n} from \"../internal\"\n\n/** Plugin utilities */\nconst plugins: {\n\tPatches?: {\n\t\tgeneratePatches_(\n\t\t\tstate: ImmerState,\n\t\t\tbasePath: PatchPath,\n\t\t\tpatches: Patch[],\n\t\t\tinversePatches: Patch[]\n\t\t): void\n\t\tgenerateReplacementPatches_(\n\t\t\tbase: any,\n\t\t\treplacement: any,\n\t\t\tpatches: Patch[],\n\t\t\tinversePatches: Patch[]\n\t\t): void\n\t\tapplyPatches_(draft: T, patches: Patch[]): T\n\t}\n\tMapSet?: {\n\t\tproxyMap_(target: T, parent?: ImmerState): T\n\t\tproxySet_(target: T, parent?: ImmerState): T\n\t}\n} = {}\n\ntype Plugins = typeof plugins\n\nexport function getPlugin(\n\tpluginKey: K\n): Exclude {\n\tconst plugin = plugins[pluginKey]\n\tif (!plugin) {\n\t\tdie(0, pluginKey)\n\t}\n\t// @ts-ignore\n\treturn plugin\n}\n\nexport function loadPlugin(\n\tpluginKey: K,\n\timplementation: Plugins[K]\n): void {\n\tif (!plugins[pluginKey]) plugins[pluginKey] = implementation\n}\n/** Map / Set plugin */\n\nexport interface MapState extends ImmerBaseState {\n\ttype_: ArchType.Map\n\tcopy_: AnyMap | undefined\n\tassigned_: Map | undefined\n\tbase_: AnyMap\n\trevoked_: boolean\n\tdraft_: Drafted\n}\n\nexport interface SetState extends ImmerBaseState {\n\ttype_: ArchType.Set\n\tcopy_: AnySet | undefined\n\tbase_: AnySet\n\tdrafts_: Map // maps the original value to the draft value in the new set\n\trevoked_: boolean\n\tdraft_: Drafted\n}\n\n/** Patches plugin */\n\nexport type PatchPath = (string | number)[]\n", "import {\n\tPatch,\n\tPatchListener,\n\tDrafted,\n\tImmer,\n\tDRAFT_STATE,\n\tImmerState,\n\tArchType,\n\tgetPlugin\n} from \"../internal\"\n\n/** Each scope represents a `produce` call. */\n\nexport interface ImmerScope {\n\tpatches_?: Patch[]\n\tinversePatches_?: Patch[]\n\tcanAutoFreeze_: boolean\n\tdrafts_: any[]\n\tparent_?: ImmerScope\n\tpatchListener_?: PatchListener\n\timmer_: Immer\n\tunfinalizedDrafts_: number\n}\n\nlet currentScope: ImmerScope | undefined\n\nexport function getCurrentScope() {\n\treturn currentScope!\n}\n\nfunction createScope(\n\tparent_: ImmerScope | undefined,\n\timmer_: Immer\n): ImmerScope {\n\treturn {\n\t\tdrafts_: [],\n\t\tparent_,\n\t\timmer_,\n\t\t// Whenever the modified draft contains a draft from another scope, we\n\t\t// need to prevent auto-freezing so the unowned draft can be finalized.\n\t\tcanAutoFreeze_: true,\n\t\tunfinalizedDrafts_: 0\n\t}\n}\n\nexport function usePatchesInScope(\n\tscope: ImmerScope,\n\tpatchListener?: PatchListener\n) {\n\tif (patchListener) {\n\t\tgetPlugin(\"Patches\") // assert we have the plugin\n\t\tscope.patches_ = []\n\t\tscope.inversePatches_ = []\n\t\tscope.patchListener_ = patchListener\n\t}\n}\n\nexport function revokeScope(scope: ImmerScope) {\n\tleaveScope(scope)\n\tscope.drafts_.forEach(revokeDraft)\n\t// @ts-ignore\n\tscope.drafts_ = null\n}\n\nexport function leaveScope(scope: ImmerScope) {\n\tif (scope === currentScope) {\n\t\tcurrentScope = scope.parent_\n\t}\n}\n\nexport function enterScope(immer: Immer) {\n\treturn (currentScope = createScope(currentScope, immer))\n}\n\nfunction revokeDraft(draft: Drafted) {\n\tconst state: ImmerState = draft[DRAFT_STATE]\n\tif (state.type_ === ArchType.Object || state.type_ === ArchType.Array)\n\t\tstate.revoke_()\n\telse state.revoked_ = true\n}\n", "import {\n\tImmerScope,\n\tDRAFT_STATE,\n\tisDraftable,\n\tNOTHING,\n\tPatchPath,\n\teach,\n\thas,\n\tfreeze,\n\tImmerState,\n\tisDraft,\n\tSetState,\n\tset,\n\tArchType,\n\tgetPlugin,\n\tdie,\n\trevokeScope,\n\tisFrozen\n} from \"../internal\"\n\nexport function processResult(result: any, scope: ImmerScope) {\n\tscope.unfinalizedDrafts_ = scope.drafts_.length\n\tconst baseDraft = scope.drafts_![0]\n\tconst isReplaced = result !== undefined && result !== baseDraft\n\tif (isReplaced) {\n\t\tif (baseDraft[DRAFT_STATE].modified_) {\n\t\t\trevokeScope(scope)\n\t\t\tdie(4)\n\t\t}\n\t\tif (isDraftable(result)) {\n\t\t\t// Finalize the result in case it contains (or is) a subset of the draft.\n\t\t\tresult = finalize(scope, result)\n\t\t\tif (!scope.parent_) maybeFreeze(scope, result)\n\t\t}\n\t\tif (scope.patches_) {\n\t\t\tgetPlugin(\"Patches\").generateReplacementPatches_(\n\t\t\t\tbaseDraft[DRAFT_STATE].base_,\n\t\t\t\tresult,\n\t\t\t\tscope.patches_,\n\t\t\t\tscope.inversePatches_!\n\t\t\t)\n\t\t}\n\t} else {\n\t\t// Finalize the base draft.\n\t\tresult = finalize(scope, baseDraft, [])\n\t}\n\trevokeScope(scope)\n\tif (scope.patches_) {\n\t\tscope.patchListener_!(scope.patches_, scope.inversePatches_!)\n\t}\n\treturn result !== NOTHING ? result : undefined\n}\n\nfunction finalize(rootScope: ImmerScope, value: any, path?: PatchPath) {\n\t// Don't recurse in tho recursive data structures\n\tif (isFrozen(value)) return value\n\n\tconst state: ImmerState = value[DRAFT_STATE]\n\t// A plain object, might need freezing, might contain drafts\n\tif (!state) {\n\t\teach(\n\t\t\tvalue,\n\t\t\t(key, childValue) =>\n\t\t\t\tfinalizeProperty(rootScope, state, value, key, childValue, path),\n\t\t\ttrue // See #590, don't recurse into non-enumerable of non drafted objects\n\t\t)\n\t\treturn value\n\t}\n\t// Never finalize drafts owned by another scope.\n\tif (state.scope_ !== rootScope) return value\n\t// Unmodified draft, return the (frozen) original\n\tif (!state.modified_) {\n\t\tmaybeFreeze(rootScope, state.base_, true)\n\t\treturn state.base_\n\t}\n\t// Not finalized yet, let's do that now\n\tif (!state.finalized_) {\n\t\tstate.finalized_ = true\n\t\tstate.scope_.unfinalizedDrafts_--\n\t\tconst result = state.copy_\n\t\t// Finalize all children of the copy\n\t\t// For sets we clone before iterating, otherwise we can get in endless loop due to modifying during iteration, see #628\n\t\t// To preserve insertion order in all cases we then clear the set\n\t\t// And we let finalizeProperty know it needs to re-add non-draft children back to the target\n\t\tlet resultEach = result\n\t\tlet isSet = false\n\t\tif (state.type_ === ArchType.Set) {\n\t\t\tresultEach = new Set(result)\n\t\t\tresult.clear()\n\t\t\tisSet = true\n\t\t}\n\t\teach(resultEach, (key, childValue) =>\n\t\t\tfinalizeProperty(rootScope, state, result, key, childValue, path, isSet)\n\t\t)\n\t\t// everything inside is frozen, we can freeze here\n\t\tmaybeFreeze(rootScope, result, false)\n\t\t// first time finalizing, let's create those patches\n\t\tif (path && rootScope.patches_) {\n\t\t\tgetPlugin(\"Patches\").generatePatches_(\n\t\t\t\tstate,\n\t\t\t\tpath,\n\t\t\t\trootScope.patches_,\n\t\t\t\trootScope.inversePatches_!\n\t\t\t)\n\t\t}\n\t}\n\treturn state.copy_\n}\n\nfunction finalizeProperty(\n\trootScope: ImmerScope,\n\tparentState: undefined | ImmerState,\n\ttargetObject: any,\n\tprop: string | number,\n\tchildValue: any,\n\trootPath?: PatchPath,\n\ttargetIsSet?: boolean\n) {\n\tif (process.env.NODE_ENV !== \"production\" && childValue === targetObject)\n\t\tdie(5)\n\tif (isDraft(childValue)) {\n\t\tconst path =\n\t\t\trootPath &&\n\t\t\tparentState &&\n\t\t\tparentState!.type_ !== ArchType.Set && // Set objects are atomic since they have no keys.\n\t\t\t!has((parentState as Exclude).assigned_!, prop) // Skip deep patches for assigned keys.\n\t\t\t\t? rootPath!.concat(prop)\n\t\t\t\t: undefined\n\t\t// Drafts owned by `scope` are finalized here.\n\t\tconst res = finalize(rootScope, childValue, path)\n\t\tset(targetObject, prop, res)\n\t\t// Drafts from another scope must prevented to be frozen\n\t\t// if we got a draft back from finalize, we're in a nested produce and shouldn't freeze\n\t\tif (isDraft(res)) {\n\t\t\trootScope.canAutoFreeze_ = false\n\t\t} else return\n\t} else if (targetIsSet) {\n\t\ttargetObject.add(childValue)\n\t}\n\t// Search new objects for unfinalized drafts. Frozen objects should never contain drafts.\n\tif (isDraftable(childValue) && !isFrozen(childValue)) {\n\t\tif (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n\t\t\t// optimization: if an object is not a draft, and we don't have to\n\t\t\t// deepfreeze everything, and we are sure that no drafts are left in the remaining object\n\t\t\t// cause we saw and finalized all drafts already; we can stop visiting the rest of the tree.\n\t\t\t// This benefits especially adding large data tree's without further processing.\n\t\t\t// See add-data.js perf test\n\t\t\treturn\n\t\t}\n\t\tfinalize(rootScope, childValue)\n\t\t// immer deep freezes plain objects, so if there is no parent state, we freeze as well\n\t\tif (!parentState || !parentState.scope_.parent_)\n\t\t\tmaybeFreeze(rootScope, childValue)\n\t}\n}\n\nfunction maybeFreeze(scope: ImmerScope, value: any, deep = false) {\n\t// we never freeze for a non-root scope; as it would prevent pruning for drafts inside wrapping objects\n\tif (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n\t\tfreeze(value, deep)\n\t}\n}\n", "import {\n\teach,\n\thas,\n\tis,\n\tisDraftable,\n\tshallowCopy,\n\tlatest,\n\tImmerBaseState,\n\tImmerState,\n\tDrafted,\n\tAnyObject,\n\tAnyArray,\n\tObjectish,\n\tgetCurrentScope,\n\tgetPrototypeOf,\n\tDRAFT_STATE,\n\tdie,\n\tcreateProxy,\n\tArchType,\n\tImmerScope\n} from \"../internal\"\n\ninterface ProxyBaseState extends ImmerBaseState {\n\tassigned_: {\n\t\t[property: string]: boolean\n\t}\n\tparent_?: ImmerState\n\trevoke_(): void\n}\n\nexport interface ProxyObjectState extends ProxyBaseState {\n\ttype_: ArchType.Object\n\tbase_: any\n\tcopy_: any\n\tdraft_: Drafted\n}\n\nexport interface ProxyArrayState extends ProxyBaseState {\n\ttype_: ArchType.Array\n\tbase_: AnyArray\n\tcopy_: AnyArray | null\n\tdraft_: Drafted\n}\n\ntype ProxyState = ProxyObjectState | ProxyArrayState\n\n/**\n * Returns a new draft of the `base` object.\n *\n * The second argument is the parent draft-state (used internally).\n */\nexport function createProxyProxy(\n\tbase: T,\n\tparent?: ImmerState\n): Drafted {\n\tconst isArray = Array.isArray(base)\n\tconst state: ProxyState = {\n\t\ttype_: isArray ? ArchType.Array : (ArchType.Object as any),\n\t\t// Track which produce call this is associated with.\n\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t// True for both shallow and deep changes.\n\t\tmodified_: false,\n\t\t// Used during finalization.\n\t\tfinalized_: false,\n\t\t// Track which properties have been assigned (true) or deleted (false).\n\t\tassigned_: {},\n\t\t// The parent draft state.\n\t\tparent_: parent,\n\t\t// The base state.\n\t\tbase_: base,\n\t\t// The base proxy.\n\t\tdraft_: null as any, // set below\n\t\t// The base copy with any updated values.\n\t\tcopy_: null,\n\t\t// Called by the `produce` function.\n\t\trevoke_: null as any,\n\t\tisManual_: false\n\t}\n\n\t// the traps must target something, a bit like the 'real' base.\n\t// but also, we need to be able to determine from the target what the relevant state is\n\t// (to avoid creating traps per instance to capture the state in closure,\n\t// and to avoid creating weird hidden properties as well)\n\t// So the trick is to use 'state' as the actual 'target'! (and make sure we intercept everything)\n\t// Note that in the case of an array, we put the state in an array to have better Reflect defaults ootb\n\tlet target: T = state as any\n\tlet traps: ProxyHandler> = objectTraps\n\tif (isArray) {\n\t\ttarget = [state] as any\n\t\ttraps = arrayTraps\n\t}\n\n\tconst {revoke, proxy} = Proxy.revocable(target, traps)\n\tstate.draft_ = proxy as any\n\tstate.revoke_ = revoke\n\treturn proxy as any\n}\n\n/**\n * Object drafts\n */\nexport const objectTraps: ProxyHandler = {\n\tget(state, prop) {\n\t\tif (prop === DRAFT_STATE) return state\n\n\t\tconst source = latest(state)\n\t\tif (!has(source, prop)) {\n\t\t\t// non-existing or non-own property...\n\t\t\treturn readPropFromProto(state, source, prop)\n\t\t}\n\t\tconst value = source[prop]\n\t\tif (state.finalized_ || !isDraftable(value)) {\n\t\t\treturn value\n\t\t}\n\t\t// Check for existing draft in modified state.\n\t\t// Assigned values are never drafted. This catches any drafts we created, too.\n\t\tif (value === peek(state.base_, prop)) {\n\t\t\tprepareCopy(state)\n\t\t\treturn (state.copy_![prop as any] = createProxy(value, state))\n\t\t}\n\t\treturn value\n\t},\n\thas(state, prop) {\n\t\treturn prop in latest(state)\n\t},\n\townKeys(state) {\n\t\treturn Reflect.ownKeys(latest(state))\n\t},\n\tset(\n\t\tstate: ProxyObjectState,\n\t\tprop: string /* strictly not, but helps TS */,\n\t\tvalue\n\t) {\n\t\tconst desc = getDescriptorFromProto(latest(state), prop)\n\t\tif (desc?.set) {\n\t\t\t// special case: if this write is captured by a setter, we have\n\t\t\t// to trigger it with the correct context\n\t\t\tdesc.set.call(state.draft_, value)\n\t\t\treturn true\n\t\t}\n\t\tif (!state.modified_) {\n\t\t\t// the last check is because we need to be able to distinguish setting a non-existing to undefined (which is a change)\n\t\t\t// from setting an existing property with value undefined to undefined (which is not a change)\n\t\t\tconst current = peek(latest(state), prop)\n\t\t\t// special case, if we assigning the original value to a draft, we can ignore the assignment\n\t\t\tconst currentState: ProxyObjectState = current?.[DRAFT_STATE]\n\t\t\tif (currentState && currentState.base_ === value) {\n\t\t\t\tstate.copy_![prop] = value\n\t\t\t\tstate.assigned_[prop] = false\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (is(value, current) && (value !== undefined || has(state.base_, prop)))\n\t\t\t\treturn true\n\t\t\tprepareCopy(state)\n\t\t\tmarkChanged(state)\n\t\t}\n\n\t\tif (\n\t\t\t(state.copy_![prop] === value &&\n\t\t\t\t// special case: handle new props with value 'undefined'\n\t\t\t\t(value !== undefined || prop in state.copy_)) ||\n\t\t\t// special case: NaN\n\t\t\t(Number.isNaN(value) && Number.isNaN(state.copy_![prop]))\n\t\t)\n\t\t\treturn true\n\n\t\t// @ts-ignore\n\t\tstate.copy_![prop] = value\n\t\tstate.assigned_[prop] = true\n\t\treturn true\n\t},\n\tdeleteProperty(state, prop: string) {\n\t\t// The `undefined` check is a fast path for pre-existing keys.\n\t\tif (peek(state.base_, prop) !== undefined || prop in state.base_) {\n\t\t\tstate.assigned_[prop] = false\n\t\t\tprepareCopy(state)\n\t\t\tmarkChanged(state)\n\t\t} else {\n\t\t\t// if an originally not assigned property was deleted\n\t\t\tdelete state.assigned_[prop]\n\t\t}\n\t\tif (state.copy_) {\n\t\t\tdelete state.copy_[prop]\n\t\t}\n\t\treturn true\n\t},\n\t// Note: We never coerce `desc.value` into an Immer draft, because we can't make\n\t// the same guarantee in ES5 mode.\n\tgetOwnPropertyDescriptor(state, prop) {\n\t\tconst owner = latest(state)\n\t\tconst desc = Reflect.getOwnPropertyDescriptor(owner, prop)\n\t\tif (!desc) return desc\n\t\treturn {\n\t\t\twritable: true,\n\t\t\tconfigurable: state.type_ !== ArchType.Array || prop !== \"length\",\n\t\t\tenumerable: desc.enumerable,\n\t\t\tvalue: owner[prop]\n\t\t}\n\t},\n\tdefineProperty() {\n\t\tdie(11)\n\t},\n\tgetPrototypeOf(state) {\n\t\treturn getPrototypeOf(state.base_)\n\t},\n\tsetPrototypeOf() {\n\t\tdie(12)\n\t}\n}\n\n/**\n * Array drafts\n */\n\nconst arrayTraps: ProxyHandler<[ProxyArrayState]> = {}\neach(objectTraps, (key, fn) => {\n\t// @ts-ignore\n\tarrayTraps[key] = function() {\n\t\targuments[0] = arguments[0][0]\n\t\treturn fn.apply(this, arguments)\n\t}\n})\narrayTraps.deleteProperty = function(state, prop) {\n\tif (process.env.NODE_ENV !== \"production\" && isNaN(parseInt(prop as any)))\n\t\tdie(13)\n\t// @ts-ignore\n\treturn arrayTraps.set!.call(this, state, prop, undefined)\n}\narrayTraps.set = function(state, prop, value) {\n\tif (\n\t\tprocess.env.NODE_ENV !== \"production\" &&\n\t\tprop !== \"length\" &&\n\t\tisNaN(parseInt(prop as any))\n\t)\n\t\tdie(14)\n\treturn objectTraps.set!.call(this, state[0], prop, value, state[0])\n}\n\n// Access a property without creating an Immer draft.\nfunction peek(draft: Drafted, prop: PropertyKey) {\n\tconst state = draft[DRAFT_STATE]\n\tconst source = state ? latest(state) : draft\n\treturn source[prop]\n}\n\nfunction readPropFromProto(state: ImmerState, source: any, prop: PropertyKey) {\n\tconst desc = getDescriptorFromProto(source, prop)\n\treturn desc\n\t\t? `value` in desc\n\t\t\t? desc.value\n\t\t\t: // This is a very special case, if the prop is a getter defined by the\n\t\t\t // prototype, we should invoke it with the draft as context!\n\t\t\t desc.get?.call(state.draft_)\n\t\t: undefined\n}\n\nfunction getDescriptorFromProto(\n\tsource: any,\n\tprop: PropertyKey\n): PropertyDescriptor | undefined {\n\t// 'in' checks proto!\n\tif (!(prop in source)) return undefined\n\tlet proto = getPrototypeOf(source)\n\twhile (proto) {\n\t\tconst desc = Object.getOwnPropertyDescriptor(proto, prop)\n\t\tif (desc) return desc\n\t\tproto = getPrototypeOf(proto)\n\t}\n\treturn undefined\n}\n\nexport function markChanged(state: ImmerState) {\n\tif (!state.modified_) {\n\t\tstate.modified_ = true\n\t\tif (state.parent_) {\n\t\t\tmarkChanged(state.parent_)\n\t\t}\n\t}\n}\n\nexport function prepareCopy(state: {\n\tbase_: any\n\tcopy_: any\n\tscope_: ImmerScope\n}) {\n\tif (!state.copy_) {\n\t\tstate.copy_ = shallowCopy(\n\t\t\tstate.base_,\n\t\t\tstate.scope_.immer_.useStrictShallowCopy_\n\t\t)\n\t}\n}\n", "import {\n\tIProduceWithPatches,\n\tIProduce,\n\tImmerState,\n\tDrafted,\n\tisDraftable,\n\tprocessResult,\n\tPatch,\n\tObjectish,\n\tDRAFT_STATE,\n\tDraft,\n\tPatchListener,\n\tisDraft,\n\tisMap,\n\tisSet,\n\tcreateProxyProxy,\n\tgetPlugin,\n\tdie,\n\tenterScope,\n\trevokeScope,\n\tleaveScope,\n\tusePatchesInScope,\n\tgetCurrentScope,\n\tNOTHING,\n\tfreeze,\n\tcurrent\n} from \"../internal\"\n\ninterface ProducersFns {\n\tproduce: IProduce\n\tproduceWithPatches: IProduceWithPatches\n}\n\nexport class Immer implements ProducersFns {\n\tautoFreeze_: boolean = true\n\tuseStrictShallowCopy_: boolean = false\n\n\tconstructor(config?: {autoFreeze?: boolean; useStrictShallowCopy?: boolean}) {\n\t\tif (typeof config?.autoFreeze === \"boolean\")\n\t\t\tthis.setAutoFreeze(config!.autoFreeze)\n\t\tif (typeof config?.useStrictShallowCopy === \"boolean\")\n\t\t\tthis.setUseStrictShallowCopy(config!.useStrictShallowCopy)\n\t}\n\n\t/**\n\t * The `produce` function takes a value and a \"recipe function\" (whose\n\t * return value often depends on the base state). The recipe function is\n\t * free to mutate its first argument however it wants. All mutations are\n\t * only ever applied to a __copy__ of the base state.\n\t *\n\t * Pass only a function to create a \"curried producer\" which relieves you\n\t * from passing the recipe function every time.\n\t *\n\t * Only plain objects and arrays are made mutable. All other objects are\n\t * considered uncopyable.\n\t *\n\t * Note: This function is __bound__ to its `Immer` instance.\n\t *\n\t * @param {any} base - the initial state\n\t * @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified\n\t * @param {Function} patchListener - optional function that will be called with all the patches produced here\n\t * @returns {any} a new state, or the initial state if nothing was modified\n\t */\n\tproduce: IProduce = (base: any, recipe?: any, patchListener?: any) => {\n\t\t// curried invocation\n\t\tif (typeof base === \"function\" && typeof recipe !== \"function\") {\n\t\t\tconst defaultBase = recipe\n\t\t\trecipe = base\n\n\t\t\tconst self = this\n\t\t\treturn function curriedProduce(\n\t\t\t\tthis: any,\n\t\t\t\tbase = defaultBase,\n\t\t\t\t...args: any[]\n\t\t\t) {\n\t\t\t\treturn self.produce(base, (draft: Drafted) => recipe.call(this, draft, ...args)) // prettier-ignore\n\t\t\t}\n\t\t}\n\n\t\tif (typeof recipe !== \"function\") die(6)\n\t\tif (patchListener !== undefined && typeof patchListener !== \"function\")\n\t\t\tdie(7)\n\n\t\tlet result\n\n\t\t// Only plain objects, arrays, and \"immerable classes\" are drafted.\n\t\tif (isDraftable(base)) {\n\t\t\tconst scope = enterScope(this)\n\t\t\tconst proxy = createProxy(base, undefined)\n\t\t\tlet hasError = true\n\t\t\ttry {\n\t\t\t\tresult = recipe(proxy)\n\t\t\t\thasError = false\n\t\t\t} finally {\n\t\t\t\t// finally instead of catch + rethrow better preserves original stack\n\t\t\t\tif (hasError) revokeScope(scope)\n\t\t\t\telse leaveScope(scope)\n\t\t\t}\n\t\t\tusePatchesInScope(scope, patchListener)\n\t\t\treturn processResult(result, scope)\n\t\t} else if (!base || typeof base !== \"object\") {\n\t\t\tresult = recipe(base)\n\t\t\tif (result === undefined) result = base\n\t\t\tif (result === NOTHING) result = undefined\n\t\t\tif (this.autoFreeze_) freeze(result, true)\n\t\t\tif (patchListener) {\n\t\t\t\tconst p: Patch[] = []\n\t\t\t\tconst ip: Patch[] = []\n\t\t\t\tgetPlugin(\"Patches\").generateReplacementPatches_(base, result, p, ip)\n\t\t\t\tpatchListener(p, ip)\n\t\t\t}\n\t\t\treturn result\n\t\t} else die(1, base)\n\t}\n\n\tproduceWithPatches: IProduceWithPatches = (base: any, recipe?: any): any => {\n\t\t// curried invocation\n\t\tif (typeof base === \"function\") {\n\t\t\treturn (state: any, ...args: any[]) =>\n\t\t\t\tthis.produceWithPatches(state, (draft: any) => base(draft, ...args))\n\t\t}\n\n\t\tlet patches: Patch[], inversePatches: Patch[]\n\t\tconst result = this.produce(base, recipe, (p: Patch[], ip: Patch[]) => {\n\t\t\tpatches = p\n\t\t\tinversePatches = ip\n\t\t})\n\t\treturn [result, patches!, inversePatches!]\n\t}\n\n\tcreateDraft(base: T): Draft {\n\t\tif (!isDraftable(base)) die(8)\n\t\tif (isDraft(base)) base = current(base)\n\t\tconst scope = enterScope(this)\n\t\tconst proxy = createProxy(base, undefined)\n\t\tproxy[DRAFT_STATE].isManual_ = true\n\t\tleaveScope(scope)\n\t\treturn proxy as any\n\t}\n\n\tfinishDraft>(\n\t\tdraft: D,\n\t\tpatchListener?: PatchListener\n\t): D extends Draft ? T : never {\n\t\tconst state: ImmerState = draft && (draft as any)[DRAFT_STATE]\n\t\tif (!state || !state.isManual_) die(9)\n\t\tconst {scope_: scope} = state\n\t\tusePatchesInScope(scope, patchListener)\n\t\treturn processResult(undefined, scope)\n\t}\n\n\t/**\n\t * Pass true to automatically freeze all copies created by Immer.\n\t *\n\t * By default, auto-freezing is enabled.\n\t */\n\tsetAutoFreeze(value: boolean) {\n\t\tthis.autoFreeze_ = value\n\t}\n\n\t/**\n\t * Pass true to enable strict shallow copy.\n\t *\n\t * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n\t */\n\tsetUseStrictShallowCopy(value: boolean) {\n\t\tthis.useStrictShallowCopy_ = value\n\t}\n\n\tapplyPatches(base: T, patches: Patch[]): T {\n\t\t// If a patch replaces the entire state, take that replacement as base\n\t\t// before applying patches\n\t\tlet i: number\n\t\tfor (i = patches.length - 1; i >= 0; i--) {\n\t\t\tconst patch = patches[i]\n\t\t\tif (patch.path.length === 0 && patch.op === \"replace\") {\n\t\t\t\tbase = patch.value\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// If there was a patch that replaced the entire state, start from the\n\t\t// patch after that.\n\t\tif (i > -1) {\n\t\t\tpatches = patches.slice(i + 1)\n\t\t}\n\n\t\tconst applyPatchesImpl = getPlugin(\"Patches\").applyPatches_\n\t\tif (isDraft(base)) {\n\t\t\t// N.B: never hits if some patch a replacement, patches are never drafts\n\t\t\treturn applyPatchesImpl(base, patches)\n\t\t}\n\t\t// Otherwise, produce a copy of the base state.\n\t\treturn this.produce(base, (draft: Drafted) =>\n\t\t\tapplyPatchesImpl(draft, patches)\n\t\t)\n\t}\n}\n\nexport function createProxy(\n\tvalue: T,\n\tparent?: ImmerState\n): Drafted {\n\t// precondition: createProxy should be guarded by isDraftable, so we know we can safely draft\n\tconst draft: Drafted = isMap(value)\n\t\t? getPlugin(\"MapSet\").proxyMap_(value, parent)\n\t\t: isSet(value)\n\t\t? getPlugin(\"MapSet\").proxySet_(value, parent)\n\t\t: createProxyProxy(value, parent)\n\n\tconst scope = parent ? parent.scope_ : getCurrentScope()\n\tscope.drafts_.push(draft)\n\treturn draft\n}\n", "import {\n\tdie,\n\tisDraft,\n\tshallowCopy,\n\teach,\n\tDRAFT_STATE,\n\tset,\n\tImmerState,\n\tisDraftable,\n\tisFrozen\n} from \"../internal\"\n\n/** Takes a snapshot of the current state of a draft and finalizes it (but without freezing). This is a great utility to print the current state during debugging (no Proxies in the way). The output of current can also be safely leaked outside the producer. */\nexport function current(value: T): T\nexport function current(value: any): any {\n\tif (!isDraft(value)) die(10, value)\n\treturn currentImpl(value)\n}\n\nfunction currentImpl(value: any): any {\n\tif (!isDraftable(value) || isFrozen(value)) return value\n\tconst state: ImmerState | undefined = value[DRAFT_STATE]\n\tlet copy: any\n\tif (state) {\n\t\tif (!state.modified_) return state.base_\n\t\t// Optimization: avoid generating new drafts during copying\n\t\tstate.finalized_ = true\n\t\tcopy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_)\n\t} else {\n\t\tcopy = shallowCopy(value, true)\n\t}\n\t// recurse\n\teach(copy, (key, childValue) => {\n\t\tset(copy, key, currentImpl(childValue))\n\t})\n\tif (state) {\n\t\tstate.finalized_ = false\n\t}\n\treturn copy\n}\n", "import {immerable} from \"../immer\"\nimport {\n\tImmerState,\n\tPatch,\n\tSetState,\n\tProxyArrayState,\n\tMapState,\n\tProxyObjectState,\n\tPatchPath,\n\tget,\n\teach,\n\thas,\n\tgetArchtype,\n\tgetPrototypeOf,\n\tisSet,\n\tisMap,\n\tloadPlugin,\n\tArchType,\n\tdie,\n\tisDraft,\n\tisDraftable,\n\tNOTHING,\n\terrors\n} from \"../internal\"\n\nexport function enablePatches() {\n\tconst errorOffset = 16\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\terrors.push(\n\t\t\t'Sets cannot have \"replace\" patches.',\n\t\t\tfunction(op: string) {\n\t\t\t\treturn \"Unsupported patch operation: \" + op\n\t\t\t},\n\t\t\tfunction(path: string) {\n\t\t\t\treturn \"Cannot apply patch, path doesn't resolve: \" + path\n\t\t\t},\n\t\t\t\"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"\n\t\t)\n\t}\n\n\tconst REPLACE = \"replace\"\n\tconst ADD = \"add\"\n\tconst REMOVE = \"remove\"\n\n\tfunction generatePatches_(\n\t\tstate: ImmerState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t): void {\n\t\tswitch (state.type_) {\n\t\t\tcase ArchType.Object:\n\t\t\tcase ArchType.Map:\n\t\t\t\treturn generatePatchesFromAssigned(\n\t\t\t\t\tstate,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tpatches,\n\t\t\t\t\tinversePatches\n\t\t\t\t)\n\t\t\tcase ArchType.Array:\n\t\t\t\treturn generateArrayPatches(state, basePath, patches, inversePatches)\n\t\t\tcase ArchType.Set:\n\t\t\t\treturn generateSetPatches(\n\t\t\t\t\t(state as any) as SetState,\n\t\t\t\t\tbasePath,\n\t\t\t\t\tpatches,\n\t\t\t\t\tinversePatches\n\t\t\t\t)\n\t\t}\n\t}\n\n\tfunction generateArrayPatches(\n\t\tstate: ProxyArrayState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tlet {base_, assigned_} = state\n\t\tlet copy_ = state.copy_!\n\n\t\t// Reduce complexity by ensuring `base` is never longer.\n\t\tif (copy_.length < base_.length) {\n\t\t\t// @ts-ignore\n\t\t\t;[base_, copy_] = [copy_, base_]\n\t\t\t;[patches, inversePatches] = [inversePatches, patches]\n\t\t}\n\n\t\t// Process replaced indices.\n\t\tfor (let i = 0; i < base_.length; i++) {\n\t\t\tif (assigned_[i] && copy_[i] !== base_[i]) {\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: REPLACE,\n\t\t\t\t\tpath,\n\t\t\t\t\t// Need to maybe clone it, as it can in fact be the original value\n\t\t\t\t\t// due to the base/copy inversion at the start of this function\n\t\t\t\t\tvalue: clonePatchValueIfNeeded(copy_[i])\n\t\t\t\t})\n\t\t\t\tinversePatches.push({\n\t\t\t\t\top: REPLACE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue: clonePatchValueIfNeeded(base_[i])\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// Process added indices.\n\t\tfor (let i = base_.length; i < copy_.length; i++) {\n\t\t\tconst path = basePath.concat([i])\n\t\t\tpatches.push({\n\t\t\t\top: ADD,\n\t\t\t\tpath,\n\t\t\t\t// Need to maybe clone it, as it can in fact be the original value\n\t\t\t\t// due to the base/copy inversion at the start of this function\n\t\t\t\tvalue: clonePatchValueIfNeeded(copy_[i])\n\t\t\t})\n\t\t}\n\t\tfor (let i = copy_.length - 1; base_.length <= i; --i) {\n\t\t\tconst path = basePath.concat([i])\n\t\t\tinversePatches.push({\n\t\t\t\top: REMOVE,\n\t\t\t\tpath\n\t\t\t})\n\t\t}\n\t}\n\n\t// This is used for both Map objects and normal objects.\n\tfunction generatePatchesFromAssigned(\n\t\tstate: MapState | ProxyObjectState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tconst {base_, copy_} = state\n\t\teach(state.assigned_!, (key, assignedValue) => {\n\t\t\tconst origValue = get(base_, key)\n\t\t\tconst value = get(copy_!, key)\n\t\t\tconst op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD\n\t\t\tif (origValue === value && op === REPLACE) return\n\t\t\tconst path = basePath.concat(key as any)\n\t\t\tpatches.push(op === REMOVE ? {op, path} : {op, path, value})\n\t\t\tinversePatches.push(\n\t\t\t\top === ADD\n\t\t\t\t\t? {op: REMOVE, path}\n\t\t\t\t\t: op === REMOVE\n\t\t\t\t\t? {op: ADD, path, value: clonePatchValueIfNeeded(origValue)}\n\t\t\t\t\t: {op: REPLACE, path, value: clonePatchValueIfNeeded(origValue)}\n\t\t\t)\n\t\t})\n\t}\n\n\tfunction generateSetPatches(\n\t\tstate: SetState,\n\t\tbasePath: PatchPath,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t) {\n\t\tlet {base_, copy_} = state\n\n\t\tlet i = 0\n\t\tbase_.forEach((value: any) => {\n\t\t\tif (!copy_!.has(value)) {\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: REMOVE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t\tinversePatches.unshift({\n\t\t\t\t\top: ADD,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t}\n\t\t\ti++\n\t\t})\n\t\ti = 0\n\t\tcopy_!.forEach((value: any) => {\n\t\t\tif (!base_.has(value)) {\n\t\t\t\tconst path = basePath.concat([i])\n\t\t\t\tpatches.push({\n\t\t\t\t\top: ADD,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t\tinversePatches.unshift({\n\t\t\t\t\top: REMOVE,\n\t\t\t\t\tpath,\n\t\t\t\t\tvalue\n\t\t\t\t})\n\t\t\t}\n\t\t\ti++\n\t\t})\n\t}\n\n\tfunction generateReplacementPatches_(\n\t\tbaseValue: any,\n\t\treplacement: any,\n\t\tpatches: Patch[],\n\t\tinversePatches: Patch[]\n\t): void {\n\t\tpatches.push({\n\t\t\top: REPLACE,\n\t\t\tpath: [],\n\t\t\tvalue: replacement === NOTHING ? undefined : replacement\n\t\t})\n\t\tinversePatches.push({\n\t\t\top: REPLACE,\n\t\t\tpath: [],\n\t\t\tvalue: baseValue\n\t\t})\n\t}\n\n\tfunction applyPatches_(draft: T, patches: Patch[]): T {\n\t\tpatches.forEach(patch => {\n\t\t\tconst {path, op} = patch\n\n\t\t\tlet base: any = draft\n\t\t\tfor (let i = 0; i < path.length - 1; i++) {\n\t\t\t\tconst parentType = getArchtype(base)\n\t\t\t\tlet p = path[i]\n\t\t\t\tif (typeof p !== \"string\" && typeof p !== \"number\") {\n\t\t\t\t\tp = \"\" + p\n\t\t\t\t}\n\n\t\t\t\t// See #738, avoid prototype pollution\n\t\t\t\tif (\n\t\t\t\t\t(parentType === ArchType.Object || parentType === ArchType.Array) &&\n\t\t\t\t\t(p === \"__proto__\" || p === \"constructor\")\n\t\t\t\t)\n\t\t\t\t\tdie(errorOffset + 3)\n\t\t\t\tif (typeof base === \"function\" && p === \"prototype\")\n\t\t\t\t\tdie(errorOffset + 3)\n\t\t\t\tbase = get(base, p)\n\t\t\t\tif (typeof base !== \"object\") die(errorOffset + 2, path.join(\"/\"))\n\t\t\t}\n\n\t\t\tconst type = getArchtype(base)\n\t\t\tconst value = deepClonePatchValue(patch.value) // used to clone patch to ensure original patch is not modified, see #411\n\t\t\tconst key = path[path.length - 1]\n\t\t\tswitch (op) {\n\t\t\t\tcase REPLACE:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase ArchType.Map:\n\t\t\t\t\t\t\treturn base.set(key, value)\n\t\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\t\tcase ArchType.Set:\n\t\t\t\t\t\t\tdie(errorOffset)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// if value is an object, then it's assigned by reference\n\t\t\t\t\t\t\t// in the following add or remove ops, the value field inside the patch will also be modifyed\n\t\t\t\t\t\t\t// so we use value from the cloned patch\n\t\t\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t\t\treturn (base[key] = value)\n\t\t\t\t\t}\n\t\t\t\tcase ADD:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase ArchType.Array:\n\t\t\t\t\t\t\treturn key === \"-\"\n\t\t\t\t\t\t\t\t? base.push(value)\n\t\t\t\t\t\t\t\t: base.splice(key as any, 0, value)\n\t\t\t\t\t\tcase ArchType.Map:\n\t\t\t\t\t\t\treturn base.set(key, value)\n\t\t\t\t\t\tcase ArchType.Set:\n\t\t\t\t\t\t\treturn base.add(value)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn (base[key] = value)\n\t\t\t\t\t}\n\t\t\t\tcase REMOVE:\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase ArchType.Array:\n\t\t\t\t\t\t\treturn base.splice(key as any, 1)\n\t\t\t\t\t\tcase ArchType.Map:\n\t\t\t\t\t\t\treturn base.delete(key)\n\t\t\t\t\t\tcase ArchType.Set:\n\t\t\t\t\t\t\treturn base.delete(patch.value)\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn delete base[key]\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tdie(errorOffset + 1, op)\n\t\t\t}\n\t\t})\n\n\t\treturn draft\n\t}\n\n\t// optimize: this is quite a performance hit, can we detect intelligently when it is needed?\n\t// E.g. auto-draft when new objects from outside are assigned and modified?\n\t// (See failing test when deepClone just returns obj)\n\tfunction deepClonePatchValue(obj: T): T\n\tfunction deepClonePatchValue(obj: any) {\n\t\tif (!isDraftable(obj)) return obj\n\t\tif (Array.isArray(obj)) return obj.map(deepClonePatchValue)\n\t\tif (isMap(obj))\n\t\t\treturn new Map(\n\t\t\t\tArray.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])\n\t\t\t)\n\t\tif (isSet(obj)) return new Set(Array.from(obj).map(deepClonePatchValue))\n\t\tconst cloned = Object.create(getPrototypeOf(obj))\n\t\tfor (const key in obj) cloned[key] = deepClonePatchValue(obj[key])\n\t\tif (has(obj, immerable)) cloned[immerable] = obj[immerable]\n\t\treturn cloned\n\t}\n\n\tfunction clonePatchValueIfNeeded(obj: T): T {\n\t\tif (isDraft(obj)) {\n\t\t\treturn deepClonePatchValue(obj)\n\t\t} else return obj\n\t}\n\n\tloadPlugin(\"Patches\", {\n\t\tapplyPatches_,\n\t\tgeneratePatches_,\n\t\tgenerateReplacementPatches_\n\t})\n}\n", "// types only!\nimport {\n\tImmerState,\n\tAnyMap,\n\tAnySet,\n\tMapState,\n\tSetState,\n\tDRAFT_STATE,\n\tgetCurrentScope,\n\tlatest,\n\tisDraftable,\n\tcreateProxy,\n\tloadPlugin,\n\tmarkChanged,\n\tdie,\n\tArchType,\n\teach\n} from \"../internal\"\n\nexport function enableMapSet() {\n\tclass DraftMap extends Map {\n\t\t[DRAFT_STATE]: MapState\n\n\t\tconstructor(target: AnyMap, parent?: ImmerState) {\n\t\t\tsuper()\n\t\t\tthis[DRAFT_STATE] = {\n\t\t\t\ttype_: ArchType.Map,\n\t\t\t\tparent_: parent,\n\t\t\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t\t\tmodified_: false,\n\t\t\t\tfinalized_: false,\n\t\t\t\tcopy_: undefined,\n\t\t\t\tassigned_: undefined,\n\t\t\t\tbase_: target,\n\t\t\t\tdraft_: this as any,\n\t\t\t\tisManual_: false,\n\t\t\t\trevoked_: false\n\t\t\t}\n\t\t}\n\n\t\tget size(): number {\n\t\t\treturn latest(this[DRAFT_STATE]).size\n\t\t}\n\n\t\thas(key: any): boolean {\n\t\t\treturn latest(this[DRAFT_STATE]).has(key)\n\t\t}\n\n\t\tset(key: any, value: any) {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (!latest(state).has(key) || latest(state).get(key) !== value) {\n\t\t\t\tprepareMapCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.assigned_!.set(key, true)\n\t\t\t\tstate.copy_!.set(key, value)\n\t\t\t\tstate.assigned_!.set(key, true)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\n\t\tdelete(key: any): boolean {\n\t\t\tif (!this.has(key)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareMapCopy(state)\n\t\t\tmarkChanged(state)\n\t\t\tif (state.base_.has(key)) {\n\t\t\t\tstate.assigned_!.set(key, false)\n\t\t\t} else {\n\t\t\t\tstate.assigned_!.delete(key)\n\t\t\t}\n\t\t\tstate.copy_!.delete(key)\n\t\t\treturn true\n\t\t}\n\n\t\tclear() {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (latest(state).size) {\n\t\t\t\tprepareMapCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.assigned_ = new Map()\n\t\t\t\teach(state.base_, key => {\n\t\t\t\t\tstate.assigned_!.set(key, false)\n\t\t\t\t})\n\t\t\t\tstate.copy_!.clear()\n\t\t\t}\n\t\t}\n\n\t\tforEach(cb: (value: any, key: any, self: any) => void, thisArg?: any) {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tlatest(state).forEach((_value: any, key: any, _map: any) => {\n\t\t\t\tcb.call(thisArg, this.get(key), key, this)\n\t\t\t})\n\t\t}\n\n\t\tget(key: any): any {\n\t\t\tconst state: MapState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tconst value = latest(state).get(key)\n\t\t\tif (state.finalized_ || !isDraftable(value)) {\n\t\t\t\treturn value\n\t\t\t}\n\t\t\tif (value !== state.base_.get(key)) {\n\t\t\t\treturn value // either already drafted or reassigned\n\t\t\t}\n\t\t\t// despite what it looks, this creates a draft only once, see above condition\n\t\t\tconst draft = createProxy(value, state)\n\t\t\tprepareMapCopy(state)\n\t\t\tstate.copy_!.set(key, draft)\n\t\t\treturn draft\n\t\t}\n\n\t\tkeys(): IterableIterator {\n\t\t\treturn latest(this[DRAFT_STATE]).keys()\n\t\t}\n\n\t\tvalues(): IterableIterator {\n\t\t\tconst iterator = this.keys()\n\t\t\treturn {\n\t\t\t\t[Symbol.iterator]: () => this.values(),\n\t\t\t\tnext: () => {\n\t\t\t\t\tconst r = iterator.next()\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (r.done) return r\n\t\t\t\t\tconst value = this.get(r.value)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t\tvalue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} as any\n\t\t}\n\n\t\tentries(): IterableIterator<[any, any]> {\n\t\t\tconst iterator = this.keys()\n\t\t\treturn {\n\t\t\t\t[Symbol.iterator]: () => this.entries(),\n\t\t\t\tnext: () => {\n\t\t\t\t\tconst r = iterator.next()\n\t\t\t\t\t/* istanbul ignore next */\n\t\t\t\t\tif (r.done) return r\n\t\t\t\t\tconst value = this.get(r.value)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdone: false,\n\t\t\t\t\t\tvalue: [r.value, value]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} as any\n\t\t}\n\n\t\t[Symbol.iterator]() {\n\t\t\treturn this.entries()\n\t\t}\n\t}\n\n\tfunction proxyMap_(target: T, parent?: ImmerState): T {\n\t\t// @ts-ignore\n\t\treturn new DraftMap(target, parent)\n\t}\n\n\tfunction prepareMapCopy(state: MapState) {\n\t\tif (!state.copy_) {\n\t\t\tstate.assigned_ = new Map()\n\t\t\tstate.copy_ = new Map(state.base_)\n\t\t}\n\t}\n\n\tclass DraftSet extends Set {\n\t\t[DRAFT_STATE]: SetState\n\t\tconstructor(target: AnySet, parent?: ImmerState) {\n\t\t\tsuper()\n\t\t\tthis[DRAFT_STATE] = {\n\t\t\t\ttype_: ArchType.Set,\n\t\t\t\tparent_: parent,\n\t\t\t\tscope_: parent ? parent.scope_ : getCurrentScope()!,\n\t\t\t\tmodified_: false,\n\t\t\t\tfinalized_: false,\n\t\t\t\tcopy_: undefined,\n\t\t\t\tbase_: target,\n\t\t\t\tdraft_: this,\n\t\t\t\tdrafts_: new Map(),\n\t\t\t\trevoked_: false,\n\t\t\t\tisManual_: false\n\t\t\t}\n\t\t}\n\n\t\tget size(): number {\n\t\t\treturn latest(this[DRAFT_STATE]).size\n\t\t}\n\n\t\thas(value: any): boolean {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\t// bit of trickery here, to be able to recognize both the value, and the draft of its value\n\t\t\tif (!state.copy_) {\n\t\t\t\treturn state.base_.has(value)\n\t\t\t}\n\t\t\tif (state.copy_.has(value)) return true\n\t\t\tif (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n\t\t\t\treturn true\n\t\t\treturn false\n\t\t}\n\n\t\tadd(value: any): any {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (!this.has(value)) {\n\t\t\t\tprepareSetCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.copy_!.add(value)\n\t\t\t}\n\t\t\treturn this\n\t\t}\n\n\t\tdelete(value: any): any {\n\t\t\tif (!this.has(value)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\tmarkChanged(state)\n\t\t\treturn (\n\t\t\t\tstate.copy_!.delete(value) ||\n\t\t\t\t(state.drafts_.has(value)\n\t\t\t\t\t? state.copy_!.delete(state.drafts_.get(value))\n\t\t\t\t\t: /* istanbul ignore next */ false)\n\t\t\t)\n\t\t}\n\n\t\tclear() {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tif (latest(state).size) {\n\t\t\t\tprepareSetCopy(state)\n\t\t\t\tmarkChanged(state)\n\t\t\t\tstate.copy_!.clear()\n\t\t\t}\n\t\t}\n\n\t\tvalues(): IterableIterator {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\treturn state.copy_!.values()\n\t\t}\n\n\t\tentries(): IterableIterator<[any, any]> {\n\t\t\tconst state: SetState = this[DRAFT_STATE]\n\t\t\tassertUnrevoked(state)\n\t\t\tprepareSetCopy(state)\n\t\t\treturn state.copy_!.entries()\n\t\t}\n\n\t\tkeys(): IterableIterator {\n\t\t\treturn this.values()\n\t\t}\n\n\t\t[Symbol.iterator]() {\n\t\t\treturn this.values()\n\t\t}\n\n\t\tforEach(cb: any, thisArg?: any) {\n\t\t\tconst iterator = this.values()\n\t\t\tlet result = iterator.next()\n\t\t\twhile (!result.done) {\n\t\t\t\tcb.call(thisArg, result.value, result.value, this)\n\t\t\t\tresult = iterator.next()\n\t\t\t}\n\t\t}\n\t}\n\tfunction proxySet_(target: T, parent?: ImmerState): T {\n\t\t// @ts-ignore\n\t\treturn new DraftSet(target, parent)\n\t}\n\n\tfunction prepareSetCopy(state: SetState) {\n\t\tif (!state.copy_) {\n\t\t\t// create drafts for all entries to preserve insertion order\n\t\t\tstate.copy_ = new Set()\n\t\t\tstate.base_.forEach(value => {\n\t\t\t\tif (isDraftable(value)) {\n\t\t\t\t\tconst draft = createProxy(value, state)\n\t\t\t\t\tstate.drafts_.set(value, draft)\n\t\t\t\t\tstate.copy_!.add(draft)\n\t\t\t\t} else {\n\t\t\t\t\tstate.copy_!.add(value)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tfunction assertUnrevoked(state: any /*ES5State | MapState | SetState*/) {\n\t\tif (state.revoked_) die(3, JSON.stringify(latest(state)))\n\t}\n\n\tloadPlugin(\"MapSet\", {proxyMap_, proxySet_})\n}\n", "import {\n\tIProduce,\n\tIProduceWithPatches,\n\tImmer,\n\tDraft,\n\tImmutable\n} from \"./internal\"\n\nexport {\n\tDraft,\n\tImmutable,\n\tPatch,\n\tPatchListener,\n\toriginal,\n\tcurrent,\n\tisDraft,\n\tisDraftable,\n\tNOTHING as nothing,\n\tDRAFTABLE as immerable,\n\tfreeze,\n\tObjectish\n} from \"./internal\"\n\nconst immer = new Immer()\n\n/**\n * The `produce` function takes a value and a \"recipe function\" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a \"curried producer\" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\nexport const produce: IProduce = immer.produce\n\n/**\n * Like `produce`, but `produceWithPatches` always returns a tuple\n * [nextState, patches, inversePatches] (instead of just the next state)\n */\nexport const produceWithPatches: IProduceWithPatches = immer.produceWithPatches.bind(\n\timmer\n)\n\n/**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * Always freeze by default, even in production mode\n */\nexport const setAutoFreeze = immer.setAutoFreeze.bind(immer)\n\n/**\n * Pass true to enable strict shallow copy.\n *\n * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n */\nexport const setUseStrictShallowCopy = immer.setUseStrictShallowCopy.bind(immer)\n\n/**\n * Apply an array of Immer patches to the first argument.\n *\n * This function is a producer, which means copy-on-write is in effect.\n */\nexport const applyPatches = immer.applyPatches.bind(immer)\n\n/**\n * Create an Immer draft from the given base state, which may be a draft itself.\n * The draft can be modified until you finalize it with the `finishDraft` function.\n */\nexport const createDraft = immer.createDraft.bind(immer)\n\n/**\n * Finalize an Immer draft from a `createDraft` call, returning the base state\n * (if no changes were made) or a modified copy. The draft must *not* be\n * mutated afterwards.\n *\n * Pass a function as the 2nd argument to generate Immer patches based on the\n * changes that were made.\n */\nexport const finishDraft = immer.finishDraft.bind(immer)\n\n/**\n * This function is actually a no-op, but can be used to cast an immutable type\n * to an draft type and make TypeScript happy\n *\n * @param value\n */\nexport function castDraft(value: T): Draft {\n\treturn value as any\n}\n\n/**\n * This function is actually a no-op, but can be used to cast a mutable type\n * to an immutable type and make TypeScript happy\n * @param value\n */\nexport function castImmutable(value: T): Immutable {\n\treturn value as any\n}\n\nexport {Immer}\n\nexport {enablePatches} from \"./plugins/patches\"\nexport {enableMapSet} from \"./plugins/mapset\"\n", "import { produce, Draft, nothing, freeze } from \"immer\";\nimport { useState, useReducer, useCallback, useMemo, Dispatch } from \"react\";\n\nexport type DraftFunction = (draft: Draft) => void;\nexport type Updater = (arg: S | DraftFunction) => void;\nexport type ImmerHook = [S, Updater];\n\nexport function useImmer(initialValue: S | (() => S)): ImmerHook;\n\nexport function useImmer(initialValue: any) {\n const [val, updateValue] = useState(() =>\n freeze(\n typeof initialValue === \"function\" ? initialValue() : initialValue,\n true\n )\n );\n return [\n val,\n useCallback((updater) => {\n if (typeof updater === \"function\") updateValue(produce(updater));\n else updateValue(freeze(updater));\n }, []),\n ];\n}\n\n// Provides different overloads of `useImmerReducer` similar to `useReducer` from `@types/react`.\n\nexport type ImmerReducer = (\n draftState: Draft,\n action: A\n) => void | (S extends undefined ? typeof nothing : S);\n\n/**\n * @deprecated Use `ImmerReducer` instead since there is already a `Reducer` type in `@types/react`.\n */\nexport type Reducer = ImmerReducer;\n\nexport function useImmerReducer(\n reducer: ImmerReducer,\n initializerArg: S & I,\n initializer: (arg: S & I) => S\n): [S, Dispatch];\n\nexport function useImmerReducer(\n reducer: ImmerReducer,\n initializerArg: I,\n initializer: (arg: I) => S\n): [S, Dispatch];\n\nexport function useImmerReducer(\n reducer: ImmerReducer,\n initialState: S,\n initializer?: undefined\n): [S, Dispatch];\n\nexport function useImmerReducer(\n reducer: ImmerReducer,\n initializerArg: S & I,\n initializer?: (arg: S & I) => S\n) {\n const cachedReducer = useMemo(() => produce(reducer), [reducer]);\n return useReducer(cachedReducer, initializerArg as any, initializer as any);\n}\n", "// type JobId = string;\n// type UploadUrl = string;\n// type UploadInitValue = { jobId: JobId; uploadUrl: UploadUrl };\n// type UploadEndValue = never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ResponseValue = any;\n\nexport type OnSuccessRequest = (value: ResponseValue) => void;\nexport type OnErrorRequest = (err: string) => void;\n\n// Websocket messages are normally one-way--i.e. the client passes a\n// message to the server but there is no way for the server to provide\n// a response to that specific message. makeRequest provides a way to\n// do asynchronous RPC over websocket. Each request has a method name\n// and arguments, plus optionally one or more binary blobs can be\n// included as well. The request is tagged with a unique number that\n// the server will use to label the corresponding response.\n//\n// @param method A string that tells the server what logic to run.\n// @param args An array of objects that should also be passed to the\n// server in JSON-ified form.\n// @param onSuccess A function that will be called back if the server\n// responds with success. If the server provides a value in the\n// response, the function will be called with it as the only argument.\n// @param onError A function that will be called back if the server\n// responds with error, or if the request fails for any other reason.\n// The parameter to onError will be a string describing the error.\n// @param blobs Optionally, an array of Blob, ArrayBuffer, or string\n// objects that will be made available to the server as part of the\n// request. Strings will be encoded using UTF-8.\nexport function makeRequest(\n method: string,\n args: unknown[],\n onSuccess: OnSuccessRequest,\n onError: OnErrorRequest,\n blobs: Array | undefined\n) {\n window.Shiny.shinyapp!.makeRequest(method, args, onSuccess, onError, blobs);\n}\n\nexport function makeRequestPromise({\n method,\n args,\n blobs,\n}: {\n method: string;\n args: unknown[];\n blobs?: Array | undefined;\n}) {\n return new Promise((resolve, reject) => {\n makeRequest(\n method,\n args,\n (value: ResponseValue) => {\n resolve(value);\n },\n (err: string) => {\n reject(err);\n },\n blobs\n );\n });\n}\n", "import { ResponseValue, makeRequestPromise } from \"./request\";\n\nimport { CellStateEnum } from \"./cell\";\nimport { SetCellEditMapAtLoc } from \"./cell-edit-map\";\nimport type { PatchInfo } from \"./types\";\n\nexport type CellPatch = {\n rowIndex: number;\n columnIndex: number;\n value: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n // prev: unknown;\n};\nexport type CellPatchPy = {\n row_index: number;\n column_index: number;\n value: unknown;\n // prev: unknown;\n};\n\nexport function updateCellsData({\n patchInfo,\n patches,\n onSuccess,\n onError,\n columns,\n setData,\n setCellEditMapAtLoc,\n}: {\n patchInfo: PatchInfo;\n patches: CellPatch[];\n onSuccess: (values: CellPatch[]) => void;\n onError: (err: string) => void;\n columns: readonly string[];\n setData: (fn: (draft: unknown[][]) => void) => void;\n setCellEditMapAtLoc: SetCellEditMapAtLoc;\n}) {\n // // Skip page index reset until after next rerender\n // skipAutoResetPageIndex();\n\n const patchesPy: CellPatchPy[] = patches.map((patch) => {\n return {\n row_index: patch.rowIndex,\n column_index: patch.columnIndex,\n value: patch.value,\n // prev: patch.prev,\n };\n });\n\n makeRequestPromise({\n method: patchInfo.key,\n args: [\n // list[CellPatch]\n patchesPy,\n ],\n })\n .then((newPatchesPy: ResponseValue) => {\n // Assert type of values is list\n if (!Array.isArray(newPatchesPy)) {\n throw new Error(\"Expected a response of a list of patches\");\n }\n\n for (const patch of newPatchesPy) {\n if (\n !(\"row_index\" in patch && \"column_index\" in patch && \"value\" in patch)\n ) {\n throw new Error(\n \"Expected list of patches containing `row_index`, `column_index`, and `value`\"\n );\n }\n }\n newPatchesPy = newPatchesPy as CellPatchPy[];\n\n const newPatches = newPatchesPy.map((patch: CellPatchPy) => {\n return {\n rowIndex: patch.row_index,\n columnIndex: patch.column_index,\n value: patch.value,\n };\n });\n\n setData((draft) => {\n newPatches.forEach(({ rowIndex, columnIndex, value }) => {\n draft[rowIndex][columnIndex] = value;\n });\n });\n newPatches.forEach(({ rowIndex, columnIndex, value }) => {\n setCellEditMapAtLoc(rowIndex, columnIndex, (obj_draft) => {\n obj_draft.value = value;\n obj_draft.state = CellStateEnum.EditSuccess;\n // Remove save_error if it exists\n obj_draft.errorTitle = undefined;\n });\n });\n onSuccess(newPatches);\n })\n .catch((err: string) => {\n patches.forEach(({ rowIndex, columnIndex, value }) => {\n setCellEditMapAtLoc(rowIndex, columnIndex, (obj_draft) => {\n // Do not overwrite value!\n obj_draft.value = String(value);\n\n obj_draft.state = CellStateEnum.EditFailure;\n obj_draft.errorTitle = String(err);\n });\n });\n onError(err);\n });\n}\n", "import { ColumnDef, RowModel, flexRender } from \"@tanstack/react-table\";\nimport { Cell } from \"@tanstack/table-core\";\nimport React, {\n FC,\n ChangeEvent as ReactChangeEvent,\n ReactElement,\n FocusEvent as ReactFocusEvent,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent as ReactMouseEvent,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { CellEdit, SetCellEditMapAtLoc } from \"./cell-edit-map\";\nimport { updateCellsData } from \"./data-update\";\nimport { SelectionSet } from \"./selection\";\nimport { CellStyle } from \"./style-info\";\nimport type { PatchInfo } from \"./types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype HtmlDep = any;\n\n// States\n// # \u221A Ready\n// # \u221A Editing\n// # \u221A Saving / Disabled\n// # \u221A Error\n// # \u221A Saved\n// # Cancelled (is Ready state?)\n// # New\n// # Added\n// # Removed\nexport const CellStateEnum = {\n EditSaving: \"EditSaving\",\n EditSuccess: \"EditSuccess\",\n EditFailure: \"EditFailure\",\n Editing: \"Editing\",\n Ready: \"Ready\",\n} as const;\nexport const CellStateClassEnum = {\n EditSaving: \"cell-edit-saving\",\n EditSuccess: \"cell-edit-success\",\n EditFailure: \"cell-edit-failure\",\n Editing: \"cell-edit-editing\",\n Ready: undefined,\n} as const;\nexport type CellState = keyof typeof CellStateEnum;\n\ntype CellHtmlValue = {\n isShinyHtml: true;\n obj: { deps?: HtmlDep[]; html: string };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isShinyHtml = (x: any): x is CellHtmlValue => {\n return (\n x !== null &&\n typeof x !== \"string\" &&\n Object.prototype.hasOwnProperty.call(x, \"isShinyHtml\") &&\n x.isShinyHtml === true\n );\n};\ntype CellValue = string | CellHtmlValue | null;\nconst getCellValueText = (cellValue: CellValue) => {\n if (isShinyHtml(cellValue)) {\n return cellValue.obj.html;\n }\n return cellValue as string;\n};\n\ninterface TableBodyCellProps {\n key: string;\n rowId: string;\n containerRef: React.RefObject;\n cell: Cell;\n patchInfo: PatchInfo;\n columns: readonly string[];\n coldefs: readonly ColumnDef[];\n rowIndex: number;\n columnIndex: number;\n editCellsIsAllowed: boolean;\n getSortedRowModel: () => RowModel;\n setData: (fn: (draft: unknown[][]) => void) => void;\n cellEditInfo: CellEdit | undefined;\n cellStyle: CellStyle | undefined;\n setCellEditMapAtLoc: SetCellEditMapAtLoc;\n selection: SelectionSet;\n}\n\nexport const TableBodyCell: FC = ({\n containerRef,\n rowId,\n cell,\n patchInfo,\n columns,\n coldefs,\n rowIndex,\n columnIndex,\n editCellsIsAllowed,\n getSortedRowModel,\n cellEditInfo,\n cellStyle,\n setData,\n setCellEditMapAtLoc,\n selection,\n}) => {\n const initialValue = cell.getValue() as\n | string\n | { isShinyHtml: true; obj: { deps?: HtmlDep[]; html: string } }\n | null;\n\n const isHtmlColumn = cell.column.columnDef.meta!.isHtmlColumn;\n\n const cellValue = cellEditInfo?.value ?? initialValue;\n\n const cellState = cellEditInfo?.state ?? CellStateEnum.Ready;\n const errorTitle = cellEditInfo?.errorTitle;\n // Listen to boolean value of cellEditInfo. This allows for the cell state to be restored if esc is hit\n const isEditing = cellEditInfo?.isEditing ?? false;\n const editValue = cellEditInfo?.editValue ?? getCellValueText(cellValue);\n\n const tdRef = useRef(null);\n const inputRef = useRef(null);\n\n // Keyboard navigation:\n // * When editing a cell:\n // * On esc key:\n // * \u221A Restore prior value / state / error\n // * \u221A Move focus from input to td\n // * On enter key:\n // * \u221A Save value\n // * \u221A Move to the cell below (or above w/ shift) and edit the new cell\n // * X Should shift+enter add a newline in a cell?\n // * On tab key:\n // * \u221A Save value\n // * \u221A Move to the cell to the right (or left w/ shift) and edit the new cell\n // * Scrolls out of view:\n // * Intercept keyboard events and execute the above actions\n // * (Currently, there literally is no input DOM element to accept keyboard events)\n // TODO-barret-future; More keyboard navigation!\n // * https://www.npmjs.com/package/@table-nav/react ?\n // * When focused on a td:\n // * Allow for arrow key navigation\n // * Have enter key enter edit mode for a cell\n // * \u221A When a td is focused, Have esc key move focus to the table\n // * X When table is focused, Have esc key blur the focus\n // TODO-barret-future; Combat edit mode being independent of selection mode\n // * In row / column selection mode, allow for arrow key navigation by focusing on a single cell, not a TR\n // * If a cell is focused,\n // * `enter key` allows you to go into edit mode; If editing is turned off, the selection is toggled\n // * `space key` allows you toggle the selection of the cell\n // * Arrow key navigation is required\n\n const resetEditing = useCallback(\n (\n {\n resetIsEditing = false,\n resetEditValue = false,\n }: { resetIsEditing?: boolean; resetEditValue?: boolean } = {\n resetIsEditing: true,\n resetEditValue: true,\n }\n ) => {\n setCellEditMapAtLoc(rowIndex, columnIndex, (obj_draft) => {\n if (resetIsEditing) obj_draft.isEditing = false;\n if (resetEditValue) obj_draft.editValue = undefined;\n });\n },\n [rowIndex, columnIndex, setCellEditMapAtLoc]\n );\n\n const handleEsc = (e: ReactKeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n // Prevent default behavior\n e.preventDefault();\n e.stopPropagation();\n\n // Turn off editing and the _temp_ edit value\n resetEditing();\n selection.focusOffset(rowId, 0);\n };\n const handleTab = (e: ReactKeyboardEvent) => {\n if (e.key !== \"Tab\") return;\n // Prevent default behavior\n e.preventDefault();\n e.stopPropagation();\n\n const hasShift = e.shiftKey;\n\n let nextColumnIndex = columnIndex;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const newColumnIndex = nextColumnIndex + (hasShift ? -1 : 1);\n\n if (newColumnIndex < 0 || newColumnIndex >= coldefs.length) {\n // If the new column index is out of bounds, quit\n return;\n }\n\n nextColumnIndex = newColumnIndex;\n // Repeat until the loop if the next column is not an HTML column\n if (coldefs[newColumnIndex].meta!.isHtmlColumn !== true) {\n break;\n }\n }\n\n // Submit changes to the current cell\n attemptUpdate();\n\n // Turn on editing in next cell!\n setCellEditMapAtLoc(rowIndex, nextColumnIndex, (obj_draft) => {\n obj_draft.isEditing = true;\n });\n };\n // TODO future: Make Cmd-Enter add a newline in a cell.\n const handleEnter = (e: ReactKeyboardEvent) => {\n if (e.key !== \"Enter\") return;\n // Prevent default behavior\n e.preventDefault();\n e.stopPropagation();\n\n const hasShift = e.shiftKey;\n\n const rowModel = getSortedRowModel();\n const sortedRowIndex = rowModel.rows.findIndex((row) => row.id === rowId);\n // Couldn't find row... silently quit\n if (sortedRowIndex < 0) {\n return;\n }\n const nextSortedRowIndex = sortedRowIndex! + (hasShift ? -1 : 1);\n\n if (nextSortedRowIndex < 0 || nextSortedRowIndex >= rowModel.rows.length) {\n // If the new row index is out of bounds, quit\n return;\n }\n\n // Submit changes to the current cell\n attemptUpdate();\n\n // Turn on editing in the next cell!\n // Get the original row index\n const targetRowIndex = rowModel.rows[nextSortedRowIndex].index;\n setCellEditMapAtLoc(targetRowIndex, columnIndex, (obj_draft) => {\n obj_draft.isEditing = true;\n });\n };\n\n const onInputKeyDown = (e: ReactKeyboardEvent) => {\n [handleEsc, handleEnter, handleTab].forEach((fn) => fn(e));\n };\n\n const attemptUpdate = useCallback(() => {\n // Reset error title\n setCellEditMapAtLoc(rowIndex, columnIndex, (obj_draft) => {\n obj_draft.errorTitle = undefined;\n });\n\n // Only update if the string form of the value has changed\n if (`${getCellValueText(cellValue)}` === `${editValue}`) {\n // Reset all edit info\n resetEditing();\n // Set state to prior cell state\n setCellEditMapAtLoc(rowIndex, columnIndex, (obj_draft) => {\n obj_draft.state = cellState;\n });\n return;\n }\n\n // Only turn off editing for cell; Maintain all other edit info\n resetEditing({ resetIsEditing: true });\n\n // Set state to saving\n setCellEditMapAtLoc(rowIndex, columnIndex, (obj_draft) => {\n obj_draft.state = CellStateEnum.EditSaving;\n });\n\n // Update the data!\n // updateCellsData updates the underlying data via `setData` and `setCellEditMapAtLoc`\n updateCellsData({\n patchInfo: patchInfo,\n patches: [{ rowIndex, columnIndex, value: editValue }],\n onSuccess: (_patches) => {\n // Reset `editValue`\n resetEditing({ resetEditValue: true });\n\n // console.log(\"Success!!\");\n },\n onError: (_err) => {\n // console.log(\"Error!!\", _err);\n // // Do not reset edit value here so that users can \"restore\" their prior edit value\n // resetEditing({ resetEditValue: true });\n },\n columns,\n setData,\n setCellEditMapAtLoc,\n });\n }, [\n setCellEditMapAtLoc,\n rowIndex,\n columnIndex,\n cellValue,\n editValue,\n resetEditing,\n patchInfo,\n columns,\n setData,\n cellState,\n ]);\n\n // Select the input when it becomes editable\n useEffect(() => {\n if (!isEditing) return;\n if (!inputRef.current) return;\n\n inputRef.current.focus();\n inputRef.current.select();\n }, [isEditing]);\n\n // When editing a cell, set up a global click listener to reset edit info when\n // clicking outside of the cell\n // Use MouseDown event to match how selection is performed to prevent the click from bubbling up\n useEffect(() => {\n if (!isEditing) return;\n if (!tdRef.current) return;\n if (!inputRef.current) return;\n\n // TODO-barret; Restore cursor position and text selection here\n\n const onEdtingCellMouseDown = (e: MouseEvent) => {\n if (!tdRef.current?.contains(e.target as Node)) return;\n // Prevent the click from bubbling up to the body click listener\n e.stopPropagation();\n\n // Do not stop the event from preventing default as we need the click to work for the text area!\n // e.preventDefault();\n };\n const curRef = tdRef.current; // Capture the current ref\n curRef.addEventListener(\"mousedown\", onEdtingCellMouseDown);\n\n // Set up global click listener to reset edit info\n const onBodyMouseDown = (e: MouseEvent) => {\n if (e.target === inputRef.current) return;\n\n attemptUpdate();\n // Turn off editing for this cell\n resetEditing();\n };\n document.body.addEventListener(\"mousedown\", onBodyMouseDown);\n\n // Tear down global click listener when we're done\n return () => {\n curRef.removeEventListener(\"mousedown\", onEdtingCellMouseDown);\n document.body.removeEventListener(\"mousedown\", onBodyMouseDown);\n };\n }, [\n cellState,\n attemptUpdate,\n rowIndex,\n columnIndex,\n isEditing,\n resetEditing,\n ]);\n\n // Reselect the input when it comes into view!\n // (It could be scrolled out of view and then back into view)\n function onFocus(e: ReactFocusEvent) {\n if (isEditing) {\n e.target.select();\n }\n }\n\n function onChange(e: ReactChangeEvent) {\n // Update edit value to cell map\n setCellEditMapAtLoc(rowIndex, columnIndex, (obj_draft) => {\n obj_draft.editValue = e.target.value;\n });\n }\n\n // // https://medium.com/@oherterich/creating-a-textarea-with-dynamic-height-using-react-and-typescript-5ed2d78d9848\n // // Updates the height of a