koval-ui
Version:
React components collection with minimalistic design. Supports theming, layout, and input validation.
1 lines • 34.4 kB
Source Map (JSON)
{"version":3,"file":"DataTable.cjs","sources":["../../../../src/lib/DataTable/DataTable.tsx"],"sourcesContent":["import type {ReactNode} from 'react';\nimport {forwardRef, Fragment, useCallback, useMemo, useRef} from 'react';\nimport classNames from 'classnames';\nimport type {\n ColumnPinningState,\n PaginationState,\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n ColumnDef,\n} from '@tanstack/react-table';\nimport {\n flexRender,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n getFilteredRowModel,\n} from '@tanstack/react-table';\nimport {useLocalTheme} from 'css-vars-hook';\n\nimport {useResizeObserver} from '@/internal/hooks/useResizeObserverNew.ts';\nimport {useInternalRef} from '@/internal/hooks/useInternalRef.ts';\nimport type {DataAttributes, LibraryProps} from '@/internal/LibraryAPI';\nimport {useBrowserLocale} from '@/internal/locale';\nimport type {Locale} from '@/internal/locale';\nimport {I, Table, Button} from '@/lib';\nimport {useInternalId} from '@/internal/hooks/useInternalId.ts';\nimport {IconFilterOff} from '@/internal/Icons';\n\nimport {useColumnFilters} from './tableFeatures/useColumnFilters.ts';\nimport classes from './DataTable.module.css';\nimport type {EditState, TableData, TableRow, Column} from './types.ts';\nimport {ProcessingModes, RenderModes} from './types.ts';\n// import {columns} from './columns.tsx';\nimport {useColumnPinning} from './tableFeatures/useColumnPinning.ts';\nimport {TableCell} from './TableCell.tsx';\nimport {useVirtualRows} from './tableFeatures/useVirtualRows.ts';\nimport {useTableData} from './tableFeatures/useTableData.ts';\nimport {Pagination} from './Pagination.tsx';\nimport {usePagination} from './tableFeatures/usePagination.ts';\nimport {useSorting} from './tableFeatures/useSorting.ts';\nimport type {FilterConfig} from './dialogs/FilterDialog.tsx';\nimport {FilterDialog} from './dialogs/FilterDialog.tsx';\nimport {useRowSelection} from './tableFeatures/useRowSelection.ts';\nimport {useTableHeight} from './tableFeatures/useTableHeight.ts';\nimport {DeleteDialog} from './dialogs/DeleteDialog.tsx';\nimport {EditDialog} from './dialogs/EditDialog.tsx';\nimport {SelectableActions} from './SelectableActions.tsx';\nimport {useEdit} from './tableFeatures/useEdit.ts';\nimport {useTableColumns} from './tableFeatures/useTableColumns.tsx';\nimport {isInDateRange, isInPercentRange} from './filterFns.ts';\n\nexport type Props = DataAttributes &\n LibraryProps & {\n children?: ReactNode;\n /**\n * Provide table columns configuration\n * @see Column\n */\n columns: Column[];\n /**\n * Provide data for the table\n * @see TableData\n */\n tableData: TableData;\n /**\n * Provide a callback to capture table data changes\n * @see EditState\n */\n onEdit?: (editState: EditState) => void;\n /**\n * Control column pinning state externally\n * @see ColumnPinningState\n */\n columnPinning?: ColumnPinningState;\n /**\n * Control pagination state externally\n * @see PaginationState\n */\n pagination?: PaginationState;\n /**\n * Provide a callback to capture pagination changes\n * @see PaginationState\n */\n onPaginationChange?: (paginationState: PaginationState) => void;\n /**\n * Manage column filters externally\n * @see ColumnFiltersState\n */\n columnFilters?: ColumnFiltersState;\n /**\n * Provide a callback to capture column filters changes\n * @see ColumnFiltersState\n */\n onFiltersChange?: (filterState: ColumnFiltersState) => void;\n /**\n * Manage row selection externally\n * @see RowSelectionState\n */\n rowSelection?: RowSelectionState;\n /**\n * Provide a callback to capture row selection changes\n * @see RowSelectionState\n */\n onRowSelect?: (selectionState: RowSelectionState) => void;\n /**\n * Control table data sorting externally\n * @see SortingState\n */\n sorting?: SortingState;\n /**\n * Provide a callback to capture table data sorting changes\n * @see SortingState\n */\n onSortingChange?: (sortingState: SortingState) => void;\n /**\n * Configure how table data is processed inside or outside the component\n * @see ProcessingModes\n */\n processingMode?: keyof typeof ProcessingModes;\n /**\n * Select which type of table to render\n * @see RenderModes\n */\n renderMode?: keyof typeof RenderModes;\n /**\n * Set a controlled page count number for pagination. Required for renderMode=\"paginated-controlled\"\n * @see https://morewings.github.io/koval-ui/?path=/story/components-datatable--paginated-controlled&args=tableData:rows100\n */\n pageCount?: number;\n /**\n * Provide a string with a BCP 47 language tag or an Intl.Locale instance,\n * or an array of such locale identifiers.\n * Used to format dates, numbers, and units.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#locales\n * @see Locale\n */\n locale?: Locale;\n /**\n * Enable column selection\n */\n selectable?: boolean;\n /**\n * Set a height constrain to the data table. 'full' sets to 100% of viewport height\n */\n tableHeight?: number | 'full';\n /**\n * Set a caption text to render below the table\n */\n caption?: string;\n };\n\nconst CELL_HEIGHT = 42;\n\nconst OVERSCAN = 6;\n\nconst defaultPages = {\n pageIndex: 0,\n pageSize: 10,\n};\n\nconst defaultSorting: SortingState = [];\n\nconst defaultFilters: ColumnFiltersState = [];\n\nconst defaultSelection: RowSelectionState = {};\n\nexport const DataTable = forwardRef<HTMLTableElement, Props>(\n (\n {\n children,\n className,\n tableData: tableDataProp = [],\n columnPinning: columnPinningProp,\n renderMode = RenderModes.virtual,\n pagination: paginationProp = defaultPages,\n onPaginationChange = () => {},\n onSortingChange = () => {},\n onFiltersChange = () => {},\n onRowSelect = () => {},\n onEdit = () => {},\n rowSelection: rowSelectionProp = defaultSelection,\n pageCount,\n sorting: sortingProp = defaultSorting,\n processingMode = ProcessingModes.internal,\n columnFilters: columnFiltersProp = defaultFilters,\n locale: localeProp,\n selectable = false,\n tableHeight: tableHeightProp = 'full',\n caption,\n columns: columnsProp = [],\n id: idProp,\n ...nativeProps\n },\n ref\n ) => {\n const id = useInternalId(idProp);\n\n const {tableData, setTableData} = useTableData(tableDataProp);\n\n const tableRef = useInternalRef(ref);\n\n const wrapperRef = useRef(null);\n\n const tableRect = useResizeObserver(tableRef);\n\n const tableHeight = tableRect?.height;\n\n const {LocalRoot} = useLocalTheme();\n\n const maxHeight = useTableHeight({tableHeightProp});\n\n const theme = useMemo(\n () => ({\n ...(tableHeight && {'table-height': tableHeight}),\n 'cell-height': CELL_HEIGHT,\n 'max-height': maxHeight,\n }),\n [maxHeight, tableHeight]\n );\n\n const {columnPinning, setColumnPinning} = useColumnPinning({\n columnPinningProp,\n hasSelectableColumn: selectable,\n });\n\n const {pagination, setPagination, currentPage, setCurrentPage, setPageSize} = usePagination(\n {tableData, paginationProp, onPaginationChange}\n );\n\n const {sorting, setSorting} = useSorting({sortingProp, onSortingChange});\n\n const {columnFilters, setColumnFilters} = useColumnFilters({\n columnFiltersProp,\n onFiltersChange,\n });\n\n const browserLocale = useBrowserLocale();\n\n const {rowSelection, setRowSelection, clearSelection} = useRowSelection({\n rowSelectionProp,\n onRowSelect,\n processingMode,\n });\n\n const {columns, editableColumns} = useTableColumns({\n columnsProp,\n selectable,\n });\n\n const table = useReactTable({\n meta: {\n locale: localeProp || browserLocale,\n editModalId: `edit-modal-${id}`,\n filterModalId: `filter-modal-${id}`,\n deleteModalId: `delete-modal-${id}`,\n },\n data: tableData,\n columns: columns as ColumnDef<TableRow>[],\n getCoreRowModel: getCoreRowModel(),\n onColumnPinningChange: setColumnPinning,\n getPaginationRowModel:\n renderMode === RenderModes.paginated ? getPaginationRowModel() : undefined,\n onPaginationChange: renderMode === RenderModes.paginated ? setPagination : undefined,\n state: {\n pagination: renderMode === RenderModes.paginated ? pagination : undefined,\n columnPinning,\n sorting,\n columnFilters,\n rowSelection,\n },\n manualPagination: processingMode === ProcessingModes.external,\n pageCount: processingMode === ProcessingModes.external ? pageCount : undefined,\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n // Disabled until proper implementation\n enableMultiSort: false,\n manualSorting: processingMode === ProcessingModes.external,\n getFilteredRowModel: getFilteredRowModel(),\n onColumnFiltersChange: setColumnFilters,\n manualFiltering: processingMode === ProcessingModes.external,\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n filterFns: {\n isInDateRange,\n isInPercentRange,\n },\n });\n\n const {rows} = table.getRowModel();\n\n const {before, after, virtualRows} = useVirtualRows({\n rowsCount: rows.length,\n scrollRef: wrapperRef,\n overscan: OVERSCAN,\n cellHeight: CELL_HEIGHT,\n });\n\n const handleSetFilter = useCallback(\n ({filter, column}: FilterConfig) => {\n table.getColumn(column!)?.setFilterValue(filter);\n },\n [table]\n );\n\n const handleResetFilters = useCallback(() => {\n table.resetColumnFilters();\n }, [table]);\n\n const {handleEdit, handleDelete, handleDeleteRequest, handleEditRequest} = useEdit({\n rowSelection,\n onEdit,\n clearSelection,\n setTableData,\n table,\n tableData,\n processingMode,\n });\n\n const captionId = `caption-${id}`;\n\n return (\n <Fragment>\n <FilterDialog\n tableContext={table}\n id={table.options.meta?.filterModalId as string}\n onApplyFiler={handleSetFilter}\n columnFilters={columnFilters}\n />\n <EditDialog\n id={table.options.meta?.editModalId as string}\n selectionAmount={Object.keys(rowSelection).length}\n columnsConfig={editableColumns}\n onEdit={handleEdit}\n />\n <DeleteDialog\n id={table.options.meta?.deleteModalId as string}\n selectionAmount={Object.keys(rowSelection).length}\n onDeleteConfirmation={handleDelete}\n />\n <LocalRoot theme={theme} className={classes.heightContainer}>\n {selectable && (\n <SelectableActions\n selectedRows={Object.keys(rowSelection).length}\n totalRows={table.getPreFilteredRowModel().rows.length}\n onDeleteRequest={handleDeleteRequest}\n onEditRequest={handleEditRequest}\n onClear={clearSelection}\n />\n )}\n <Table\n aria-describedby={caption && captionId}\n wrapperRef={wrapperRef}\n wrapperClassName={classNames(classes.tableWrapper, {\n // Needed to apply calculated height to the table to show small tables properly\n [classes.paginated]: renderMode === RenderModes.paginated,\n [classes.selectable]: selectable,\n [classes.hasCaption]: Boolean(caption),\n })}\n {...nativeProps}\n id={id}\n className={classNames(classes.dataTable, className)}\n ref={tableRef}>\n <thead className={classes.tableHeader}>\n {table.getHeaderGroups().map(headerGroup => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header, i, array) => {\n const fixLeft = i > 0 ? i + 1 : 0;\n const fixRight =\n i === array.length ? 0 : array.length - (i + 1);\n return (\n <TableCell\n as=\"th\"\n key={header.id}\n leftMargin={\n header.column.getStart('left') + fixLeft\n }\n rightMargin={\n header.column.getAfter('right') + fixRight\n }\n isPinned={header.column.getIsPinned()}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </TableCell>\n );\n })}\n </tr>\n ))}\n </thead>\n {renderMode === RenderModes.virtual && (\n <tbody>\n <Fragment>\n {before > 0 && (\n <tr>\n <td colSpan={columns.length} style={{height: before}} />\n </tr>\n )}\n {virtualRows.map(virtualRow => {\n const row = rows[virtualRow.index];\n return (\n <tr\n key={row.id}\n style={{\n height: `${virtualRow.size}px`,\n }}>\n {row.getVisibleCells().map((cell, i, array) => {\n const fixLeft = i > 0 ? i + 1 : 0;\n const fixRight =\n i === array.length\n ? 0\n : array.length - (i + 1);\n return (\n <TableCell\n isHighlighted={Boolean(\n cell.column.getIsSorted()\n )}\n as=\"td\"\n key={cell.id}\n leftMargin={\n cell.column.getStart('left') +\n fixLeft\n }\n rightMargin={\n cell.column.getAfter('right') +\n fixRight\n }\n isPinned={cell.column.getIsPinned()}>\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n );\n })}\n </tr>\n );\n })}\n {after > 0 && (\n <tr>\n <td colSpan={columns.length} style={{height: after}} />\n </tr>\n )}\n </Fragment>\n </tbody>\n )}\n {renderMode === RenderModes.paginated && (\n <tbody>\n {rows.map(row => (\n <tr key={row.id}>\n {row.getVisibleCells().map((cell, i, array) => {\n const fixLeft = i > 0 ? i + 1 : 0;\n const fixRight =\n i === array.length ? 0 : array.length - (i + 1);\n return (\n <TableCell\n isHighlighted={Boolean(\n cell.column.getIsSorted()\n )}\n as=\"td\"\n key={cell.id}\n leftMargin={\n cell.column.getStart('left') + fixLeft\n }\n rightMargin={\n cell.column.getAfter('right') + fixRight\n }\n isPinned={cell.column.getIsPinned()}>\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n );\n })}\n </tr>\n ))}\n </tbody>\n )}\n {rows.length === 0 && (\n <tbody>\n <tr className={classes.noDataRow}>\n <td\n className={classes.noDataCell}\n colSpan={table.getAllColumns().length}>\n <div className={classes.noDataWarning}>\n <span>No data to render.</span>\n {columnFilters.length > 0 && (\n <Button\n onClick={handleResetFilters}\n prefix={IconFilterOff}\n size=\"small\"\n variant=\"link\">\n Reset all filters\n </Button>\n )}\n </div>\n </td>\n </tr>\n </tbody>\n )}\n <tfoot className={classes.tableFooter}>\n {table.getFooterGroups().map(footerGroup => (\n <tr key={footerGroup.id}>\n {footerGroup.headers.map((header, i, array) => {\n const fixLeft = i > 0 ? i + 1 : 0;\n const fixRight =\n i === array.length ? 0 : array.length - (i + 1);\n return (\n <TableCell\n as=\"th\"\n key={header.id}\n leftMargin={\n header.column.getStart('left') + fixLeft\n }\n rightMargin={\n header.column.getAfter('right') + fixRight\n }\n isPinned={header.column.getIsPinned()}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.footer,\n header.getContext()\n )}\n </TableCell>\n );\n })}\n </tr>\n ))}\n </tfoot>\n </Table>\n {renderMode === RenderModes.paginated && (\n <Pagination\n rowsCount={tableData.length}\n onPageSizeChange={setPageSize}\n currentPage={currentPage}\n pagesAmount={table.getPageCount()}\n pageSize={pagination.pageSize}\n setCurrentPage={setCurrentPage}\n />\n )}\n {caption && (\n <div id={captionId} className={classes.tableCaption}>\n <I>{caption}</I>\n </div>\n )}\n </LocalRoot>\n </Fragment>\n );\n }\n);\n\nDataTable.displayName = 'DataTable';\n"],"names":["CELL_HEIGHT","OVERSCAN","defaultPages","defaultSorting","defaultFilters","defaultSelection","DataTable","forwardRef","children","className","tableDataProp","columnPinningProp","renderMode","RenderModes","paginationProp","onPaginationChange","onSortingChange","onFiltersChange","onRowSelect","onEdit","rowSelectionProp","pageCount","sortingProp","processingMode","ProcessingModes","columnFiltersProp","localeProp","selectable","tableHeightProp","caption","columnsProp","idProp","nativeProps","ref","id","useInternalId","tableData","setTableData","useTableData","tableRef","useInternalRef","wrapperRef","useRef","tableHeight","useResizeObserver","LocalRoot","useLocalTheme","maxHeight","useTableHeight","theme","useMemo","columnPinning","setColumnPinning","useColumnPinning","pagination","setPagination","currentPage","setCurrentPage","setPageSize","usePagination","sorting","setSorting","useSorting","columnFilters","setColumnFilters","useColumnFilters","browserLocale","useBrowserLocale","rowSelection","setRowSelection","clearSelection","useRowSelection","columns","editableColumns","useTableColumns","table","useReactTable","getCoreRowModel","getPaginationRowModel","getSortedRowModel","getFilteredRowModel","isInDateRange","isInPercentRange","rows","before","after","virtualRows","useVirtualRows","handleSetFilter","useCallback","filter","column","handleResetFilters","handleEdit","handleDelete","handleDeleteRequest","handleEditRequest","useEdit","captionId","Fragment","jsx","FilterDialog","EditDialog","DeleteDialog","jsxs","classes","SelectableActions","Table","classNames","headerGroup","header","i","array","fixLeft","fixRight","TableCell","flexRender","virtualRow","row","cell","Button","IconFilterOff","footerGroup","Pagination","I"],"mappings":"+6CAyJMA,EAAc,GAEdC,GAAW,EAEXC,GAAe,CACjB,UAAW,EACX,SAAU,EACd,EAEMC,GAA+B,CAAA,EAE/BC,GAAqC,CAAA,EAErCC,GAAsC,CAAA,EAE/BC,EAAYC,EAAAA,WACrB,CACI,CACI,SAAAC,GACA,UAAAC,EACA,UAAWC,EAAgB,CAAA,EAC3B,cAAeC,EACf,WAAAC,EAAaC,EAAAA,YAAY,QACzB,WAAYC,EAAiBZ,GAC7B,mBAAAa,EAAqB,IAAM,CAAC,EAC5B,gBAAAC,EAAkB,IAAM,CAAC,EACzB,gBAAAC,EAAkB,IAAM,CAAC,EACzB,YAAAC,EAAc,IAAM,CAAC,EACrB,OAAAC,EAAS,IAAM,CAAC,EAChB,aAAcC,EAAmBf,GACjC,UAAAgB,EACA,QAASC,EAAcnB,GACvB,eAAAoB,EAAiBC,EAAAA,gBAAgB,SACjC,cAAeC,EAAoBrB,GACnC,OAAQsB,EACR,WAAAC,EAAa,GACb,YAAaC,EAAkB,OAC/B,QAAAC,EACA,QAASC,EAAc,CAAA,EACvB,GAAIC,EACJ,GAAGC,CAAA,EAEPC,KACC,CACD,MAAMC,EAAKC,GAAAA,cAAcJ,CAAM,EAEzB,CAAC,UAAAK,EAAW,aAAAC,IAAgBC,GAAAA,aAAa5B,CAAa,EAEtD6B,EAAWC,GAAAA,eAAeP,EAAG,EAE7BQ,EAAaC,EAAAA,OAAO,IAAI,EAIxBC,EAFYC,GAAAA,kBAAkBL,CAAQ,GAEb,OAEzB,CAAC,UAAAM,EAAA,EAAaC,iBAAA,EAEdC,EAAYC,GAAAA,eAAe,CAAC,gBAAApB,EAAgB,EAE5CqB,GAAQC,EAAAA,QACV,KAAO,CACH,GAAIP,GAAe,CAAC,eAAgBA,CAAA,EACpC,cAAe3C,EACf,aAAc+C,CAAA,GAElB,CAACA,EAAWJ,CAAW,CAAA,EAGrB,CAAC,cAAAQ,GAAe,iBAAAC,EAAA,EAAoBC,oBAAiB,CACvD,kBAAA1C,EACA,oBAAqBgB,CAAA,CACxB,EAEK,CAAC,WAAA2B,EAAY,cAAAC,GAAe,YAAAC,GAAa,eAAAC,GAAgB,YAAAC,IAAeC,GAAAA,cAC1E,CAAY,eAAA7C,EAAgB,mBAAAC,CAAA,CAAkB,EAG5C,CAAC,QAAA6C,GAAS,WAAAC,EAAA,EAAcC,GAAAA,WAAW,CAAC,YAAAxC,EAAa,gBAAAN,EAAgB,EAEjE,CAAC,cAAA+C,EAAe,iBAAAC,EAAA,EAAoBC,oBAAiB,CACvD,kBAAAxC,EACA,gBAAAR,CAAA,CACH,EAEKiD,GAAgBC,GAAAA,iBAAA,EAEhB,CAAC,aAAAC,EAAc,gBAAAC,GAAiB,eAAAC,CAAA,EAAkBC,GAAAA,gBAAgB,CACpE,iBAAAnD,EACA,YAAAF,EACA,eAAAK,CAAA,CACH,EAEK,CAAC,QAAAiD,EAAS,gBAAAC,EAAA,EAAmBC,mBAAgB,CAC/C,YAAA5C,EACA,WAAAH,CAAA,CACH,EAEKgD,EAAQC,EAAAA,cAAc,CACxB,KAAM,CACF,OAAQlD,GAAcwC,GACtB,YAAa,cAAchC,CAAE,GAC7B,cAAe,gBAAgBA,CAAE,GACjC,cAAe,gBAAgBA,CAAE,EAAA,EAErC,KAAME,EACN,QAAAoC,EACA,gBAAiBK,EAAAA,gBAAA,EACjB,sBAAuBzB,GACvB,sBACIxC,IAAeC,EAAAA,YAAY,UAAYiE,EAAAA,wBAA0B,OACrE,mBAAoBlE,IAAeC,EAAAA,YAAY,UAAY0C,GAAgB,OAC3E,MAAO,CACH,WAAY3C,IAAeC,EAAAA,YAAY,UAAYyC,EAAa,OAChE,cAAAH,GACA,QAAAS,GACA,cAAAG,EACA,aAAAK,CAAA,EAEJ,iBAAkB7C,IAAmBC,EAAAA,gBAAgB,SACrD,UAAWD,IAAmBC,EAAAA,gBAAgB,SAAWH,EAAY,OACrE,kBAAmB0D,EAAAA,kBAAA,EACnB,gBAAiBlB,GAEjB,gBAAiB,GACjB,cAAetC,IAAmBC,EAAAA,gBAAgB,SAClD,oBAAqBwD,EAAAA,oBAAA,EACrB,sBAAuBhB,GACvB,gBAAiBzC,IAAmBC,EAAAA,gBAAgB,SACpD,mBAAoB,GACpB,qBAAsB6C,GACtB,UAAW,CAAA,cACPY,EAAAA,cAAA,iBACAC,EAAAA,gBAAA,CACJ,CACH,EAEK,CAAC,KAAAC,CAAA,EAAQR,EAAM,YAAA,EAEf,CAAC,OAAAS,EAAQ,MAAAC,EAAO,YAAAC,EAAA,EAAeC,GAAAA,eAAe,CAChD,UAAWJ,EAAK,OAChB,UAAW1C,EACX,SAAUxC,GACV,WAAYD,CAAA,CACf,EAEKwF,GAAkBC,EAAAA,YACpB,CAAC,CAAC,OAAAC,EAAQ,OAAAC,KAA0B,CAChChB,EAAM,UAAUgB,CAAO,GAAG,eAAeD,CAAM,CACnD,EACA,CAACf,CAAK,CAAA,EAGJiB,GAAqBH,EAAAA,YAAY,IAAM,CACzCd,EAAM,mBAAA,CACV,EAAG,CAACA,CAAK,CAAC,EAEJ,CAAC,WAAAkB,GAAY,aAAAC,GAAc,oBAAAC,GAAqB,kBAAAC,EAAA,EAAqBC,GAAAA,QAAQ,CAC/E,aAAA7B,EACA,OAAAjD,EACA,eAAAmD,EACA,aAAAjC,GACA,MAAAsC,EACA,UAAAvC,EACA,eAAAb,CAAA,CACH,EAEK2E,EAAY,WAAWhE,CAAE,GAE/B,cACKiE,WAAA,CACG,SAAA,CAAAC,EAAAA,IAACC,GAAAA,aAAA,CACG,aAAc1B,EACd,GAAIA,EAAM,QAAQ,MAAM,cACxB,aAAca,GACd,cAAAzB,CAAA,CAAA,EAEJqC,EAAAA,IAACE,GAAAA,WAAA,CACG,GAAI3B,EAAM,QAAQ,MAAM,YACxB,gBAAiB,OAAO,KAAKP,CAAY,EAAE,OAC3C,cAAeK,GACf,OAAQoB,EAAA,CAAA,EAEZO,EAAAA,IAACG,GAAAA,aAAA,CACG,GAAI5B,EAAM,QAAQ,MAAM,cACxB,gBAAiB,OAAO,KAAKP,CAAY,EAAE,OAC3C,qBAAsB0B,EAAA,CAAA,EAE1BU,EAAAA,KAAC3D,GAAA,CAAU,MAAAI,GAAc,UAAWwD,EAAAA,QAAQ,gBACvC,SAAA,CAAA9E,GACGyE,EAAAA,IAACM,GAAAA,kBAAA,CACG,aAAc,OAAO,KAAKtC,CAAY,EAAE,OACxC,UAAWO,EAAM,uBAAA,EAAyB,KAAK,OAC/C,gBAAiBoB,GACjB,cAAeC,GACf,QAAS1B,CAAA,CAAA,EAGjBkC,EAAAA,KAACG,GAAAA,MAAA,CACG,mBAAkB9E,GAAWqE,EAC7B,WAAAzD,EACA,iBAAkBmE,EAAWH,EAAAA,QAAQ,aAAc,CAE/C,CAACA,UAAQ,SAAS,EAAG7F,IAAeC,EAAAA,YAAY,UAChD,CAAC4F,EAAAA,QAAQ,UAAU,EAAG9E,EACtB,CAAC8E,EAAAA,QAAQ,UAAU,EAAG,EAAQ5E,CAAO,CACxC,EACA,GAAGG,EACJ,GAAAE,EACA,UAAW0E,EAAWH,UAAQ,UAAWhG,CAAS,EAClD,IAAK8B,EACL,SAAA,CAAA6D,MAAC,SAAM,UAAWK,EAAAA,QAAQ,YACrB,SAAA9B,EAAM,kBAAkB,IAAIkC,GACzBT,MAAC,MACI,SAAAS,EAAY,QAAQ,IAAI,CAACC,EAAQC,EAAGC,IAAU,CAC3C,MAAMC,EAAUF,EAAI,EAAIA,EAAI,EAAI,EAC1BG,EACFH,IAAMC,EAAM,OAAS,EAAIA,EAAM,QAAUD,EAAI,GACjD,OACIX,EAAAA,IAACe,EAAAA,UAAA,CACG,GAAG,KAEH,WACIL,EAAO,OAAO,SAAS,MAAM,EAAIG,EAErC,YACIH,EAAO,OAAO,SAAS,OAAO,EAAII,EAEtC,SAAUJ,EAAO,OAAO,YAAA,EACvB,SAAAA,EAAO,cACF,KACAM,EAAAA,WACIN,EAAO,OAAO,UAAU,OACxBA,EAAO,WAAA,CAAW,CACtB,EAbDA,EAAO,EAAA,CAgBxB,CAAC,CAAA,EAxBID,EAAY,EAyBrB,CACH,CAAA,CACL,EACCjG,IAAeC,EAAAA,YAAY,SACxBuF,MAAC,QAAA,CACG,gBAACD,WAAA,CACI,SAAA,CAAAf,EAAS,GACNgB,MAAC,KAAA,CACG,SAAAA,EAAAA,IAAC,KAAA,CAAG,QAAS5B,EAAQ,OAAQ,MAAO,CAAC,OAAQY,CAAA,EAAS,EAC1D,EAEHE,GAAY,IAAI+B,GAAc,CAC3B,MAAMC,EAAMnC,EAAKkC,EAAW,KAAK,EACjC,OACIjB,EAAAA,IAAC,KAAA,CAEG,MAAO,CACH,OAAQ,GAAGiB,EAAW,IAAI,IAAA,EAE7B,WAAI,gBAAA,EAAkB,IAAI,CAACE,EAAMR,EAAGC,IAAU,CAC3C,MAAMC,EAAUF,EAAI,EAAIA,EAAI,EAAI,EAC1BG,GACFH,IAAMC,EAAM,OACN,EACAA,EAAM,QAAUD,EAAI,GAC9B,OACIX,EAAAA,IAACe,EAAAA,UAAA,CACG,cAAe,EACXI,EAAK,OAAO,YAAA,EAEhB,GAAG,KAEH,WACIA,EAAK,OAAO,SAAS,MAAM,EAC3BN,EAEJ,YACIM,EAAK,OAAO,SAAS,OAAO,EAC5BL,GAEJ,SAAUK,EAAK,OAAO,YAAA,EACrB,SAAAH,EAAAA,WACGG,EAAK,OAAO,UAAU,KACtBA,EAAK,WAAA,CAAW,CACpB,EAbKA,EAAK,EAAA,CAgBtB,CAAC,CAAA,EAhCID,EAAI,EAAA,CAmCrB,CAAC,EACAjC,EAAQ,GACLe,EAAAA,IAAC,KAAA,CACG,eAAC,KAAA,CAAG,QAAS5B,EAAQ,OAAQ,MAAO,CAAC,OAAQa,CAAA,EAAQ,CAAA,CACzD,CAAA,CAAA,CAER,CAAA,CACJ,EAEHzE,IAAeC,EAAAA,YAAY,WACxBuF,MAAC,QAAA,CACI,WAAK,IAAIkB,GACNlB,EAAAA,IAAC,KAAA,CACI,WAAI,gBAAA,EAAkB,IAAI,CAACmB,EAAMR,EAAGC,IAAU,CAC3C,MAAMC,EAAUF,EAAI,EAAIA,EAAI,EAAI,EAC1BG,EACFH,IAAMC,EAAM,OAAS,EAAIA,EAAM,QAAUD,EAAI,GACjD,OACIX,EAAAA,IAACe,EAAAA,UAAA,CACG,cAAe,EACXI,EAAK,OAAO,YAAA,EAEhB,GAAG,KAEH,WACIA,EAAK,OAAO,SAAS,MAAM,EAAIN,EAEnC,YACIM,EAAK,OAAO,SAAS,OAAO,EAAIL,EAEpC,SAAUK,EAAK,OAAO,YAAA,EACrB,SAAAH,EAAAA,WACGG,EAAK,OAAO,UAAU,KACtBA,EAAK,WAAA,CAAW,CACpB,EAXKA,EAAK,EAAA,CActB,CAAC,CAAA,EAzBID,EAAI,EA0Bb,CACH,CAAA,CACL,EAEHnC,EAAK,SAAW,GACbiB,EAAAA,IAAC,SACG,SAAAA,MAAC,KAAA,CAAG,UAAWK,EAAAA,QAAQ,UACnB,SAAAL,EAAAA,IAAC,KAAA,CACG,UAAWK,EAAAA,QAAQ,WACnB,QAAS9B,EAAM,cAAA,EAAgB,OAC/B,SAAA6B,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAAA,QAAQ,cACpB,SAAA,CAAAL,EAAAA,IAAC,QAAK,SAAA,oBAAA,CAAkB,EACvBrC,EAAc,OAAS,GACpBqC,EAAAA,IAACoB,GAAAA,OAAA,CACG,QAAS5B,GACT,OAAQ6B,GAAAA,cACR,KAAK,QACL,QAAQ,OAAO,SAAA,mBAAA,CAAA,CAEnB,CAAA,CAER,CAAA,CAAA,EAER,CAAA,CACJ,QAEH,QAAA,CAAM,UAAWhB,EAAAA,QAAQ,YACrB,SAAA9B,EAAM,kBAAkB,IAAI+C,GACzBtB,MAAC,MACI,SAAAsB,EAAY,QAAQ,IAAI,CAACZ,EAAQC,EAAGC,IAAU,CAC3C,MAAMC,EAAUF,EAAI,EAAIA,EAAI,EAAI,EAC1BG,EACFH,IAAMC,EAAM,OAAS,EAAIA,EAAM,QAAUD,EAAI,GACjD,OACIX,EAAAA,IAACe,EAAAA,UAAA,CACG,GAAG,KAEH,WACIL,EAAO,OAAO,SAAS,MAAM,EAAIG,EAErC,YACIH,EAAO,OAAO,SAAS,OAAO,EAAII,EAEtC,SAAUJ,EAAO,OAAO,YAAA,EACvB,SAAAA,EAAO,cACF,KACAM,EAAAA,WACIN,EAAO,OAAO,UAAU,OACxBA,EAAO,WAAA,CAAW,CACtB,EAbDA,EAAO,EAAA,CAgBxB,CAAC,CAAA,EAxBIY,EAAY,EAyBrB,CACH,CAAA,CACL,CAAA,CAAA,CAAA,EAEH9G,IAAeC,EAAAA,YAAY,WACxBuF,EAAAA,IAACuB,GAAAA,WAAA,CACG,UAAWvF,EAAU,OACrB,iBAAkBsB,GAClB,YAAAF,GACA,YAAamB,EAAM,aAAA,EACnB,SAAUrB,EAAW,SACrB,eAAAG,EAAA,CAAA,EAGP5B,GACGuE,EAAAA,IAAC,MAAA,CAAI,GAAIF,EAAW,UAAWO,EAAAA,QAAQ,aACnC,SAAAL,EAAAA,IAACwB,GAAAA,EAAA,CAAG,SAAA/F,CAAA,CAAQ,CAAA,CAChB,CAAA,CAAA,CAER,CAAA,EACJ,CAER,CACJ,EAEAvB,EAAU,YAAc"}