@nexgrid/react 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -31
- package/dist/index.cjs +463 -290
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -7
- package/dist/index.d.ts +19 -7
- package/dist/index.js +483 -300
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/styles.css +135 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/table-x.tsx","../src/icons.tsx","../src/render.tsx","../src/use-debounced-search.ts","../src/use-dropdown.ts","../src/use-client-table-x.ts","../src/index.ts"],"sourcesContent":["// `<NexGrid />` — the React adapter.\n//\n// The component is a VIEW over a `QueryState`. It owns only what the server\n// cannot know: which menus are open, which columns the user hid, how dense the\n// rows are, which rows are ticked, and the half-typed contents of the search\n// box. Everything that changes which records exist — page, size, sort, search,\n// filters — is handed to `onQueryChange` and comes back as props.\n//\n// That split is what makes the grid honest about server-driven data. There is\n// no local sort that silently reorders one page out of a thousand, and no\n// client filter that hides rows the total still counts. It also means the URL,\n// a router, or a query cache can own the state instead of the component.\n//\n// Every query mutation goes through core's reducers rather than object\n// spreads, so the \"search resets to page 1\" and \"sort cycles asc → desc → off\"\n// rules are defined once for React, Angular and vanilla alike.\n\nimport * as React from \"react\";\nimport {\n DENSITIES,\n PAGE_SIZES,\n buildQueryUrl,\n computeAggregation,\n downloadCsv,\n downloadExcel,\n fetchAllPages,\n filePrefixFromCaption,\n formatMessage,\n getColumnId,\n getColumnTitle,\n getPageNumbers,\n getRecordRange,\n initialHiddenColumns,\n isEditable,\n isExportable,\n isFilterable,\n isHideable,\n isPageSize,\n isPinned,\n isSortable,\n primarySort,\n resolveLocale,\n serialNumber,\n timestampedFilename,\n toExportColumns,\n totalPagesFor,\n visibleColumns,\n withFilter,\n withPage,\n withPageSize,\n withSearch,\n withToggledSort,\n withToggledMultiSort,\n copyToClipboard,\n type Density,\n type PagedResponse,\n type TableXColumn,\n} from \"@nexgrid/core\";\n\nimport {\n ArrowDownIcon,\n ArrowUpDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n ColumnsIcon,\n DensityIcon,\n DotsVerticalIcon,\n DownloadIcon,\n DownloadTrayIcon,\n EditIcon,\n EyeIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FilterIcon,\n FunnelIcon,\n MoreVerticalIcon,\n RotateCcwIcon,\n SearchIcon,\n SlidersIcon,\n TrashIcon,\n XIcon,\n} from \"./icons.js\";\nimport {\n bodyCellStyle,\n headerCellStyle,\n headerInnerClass,\n renderCellContent,\n renderColumnHeader,\n renderTemplate,\n} from \"./render.js\";\nimport { useDebouncedSearch } from \"./use-debounced-search.js\";\nimport { useDropdown } from \"./use-dropdown.js\";\nimport type { TableXNoticeType, TableXProps } from \"./types.js\";\n\n/** Fallback row identity: the `id` property, else the row's own string form. */\nfunction defaultRowId<TData>(row: TData): string {\n const record = row as Record<string, unknown> | null | undefined;\n const id = record === null || record === undefined ? undefined : record[\"id\"];\n return String(id ?? row);\n}\n\n/** Density -> the locale key holding its menu label. */\nconst DENSITY_LABEL_KEY = {\n compact: \"densityCompact\",\n default: \"densityDefault\",\n comfortable: \"densityComfortable\",\n} as const satisfies Record<Density, string>;\n\n/**\n * A server-driven data grid: search, sorting, column visibility, density,\n * selection, exports, a responsive card layout, and a paginated footer.\n *\n * `data`, `total`, `query` and `onQueryChange` are controlled by the host — the\n * grid renders the page it is given and never fetches on its own (the one\n * exception being {@link TableXProps.fetchEndpoint}, used to page in the rest\n * of the dataset for an export).\n *\n * @example\n * ```tsx\n * const [query, setQuery] = useState(defaultQuery());\n * <NexGrid\n * caption=\"Students\"\n * columns={columns}\n * data={page.items}\n * total={page.total}\n * query={query}\n * onQueryChange={setQuery}\n * />\n * ```\n */\nexport function TableX<TData>(props: TableXProps<TData>): React.JSX.Element {\n const {\n columns,\n data,\n total,\n query,\n onQueryChange,\n caption,\n density: initialDensity = \"default\",\n isLoading = false,\n error = false,\n onRetry,\n enableSelection = false,\n selectionMode = \"multi\",\n enableColumnFilters = true,\n enableColumnResize = true,\n onSelectionChange,\n enableSearch = true,\n searchPlaceholder,\n enableColumns = true,\n showColumnsButton,\n enableDensity = true,\n showDensityButton,\n enableExport = true,\n showExportButton,\n enableSorting = true,\n enablePagination = true,\n showPagination,\n enableRowsPerPage = true,\n showRowsPerPage,\n enableJumpToPage = true,\n showJumpToPage,\n showToolbar = true,\n showFooter = true,\n renderExpandedRow,\n enableBulkActions = true,\n bulkActions,\n enableSummaryRow,\n enableColumnReorder = false,\n onColumnOrderChange,\n onCellEdit,\n toolbarActions,\n onRowClick,\n getRowId = defaultRowId,\n className,\n showSerialNumber = true,\n exportFileName,\n onExportAll,\n fetchEndpoint,\n badgeRules,\n locale: localeOverrides,\n onNotify,\n theme = \"light\",\n } = props;\n const locale = resolveLocale(localeOverrides);\n const boolLabels = { yes: locale.booleanYes, no: locale.booleanNo };\n\n const isColumnsVisible = enableColumns && showColumnsButton !== false;\n const isDensityVisible = enableDensity && showDensityButton !== false;\n const isExportVisible = enableExport && showExportButton !== false;\n const isPaginationVisible = enablePagination && showPagination !== false;\n const isRowsPerPageVisible = enableRowsPerPage && showRowsPerPage !== false;\n const isJumpToPageVisible = enableJumpToPage && showJumpToPage !== false;\n\n const [colList, setColList] = React.useState(columns);\n React.useEffect(() => {\n setColList(columns);\n }, [columns]);\n\n const [density, setDensity] = React.useState<Density>(initialDensity);\n const [hiddenCols, setHiddenCols] = React.useState<Record<string, boolean>>(() =>\n initialHiddenColumns(columns),\n );\n const [selectedIds, setSelectedIds] = React.useState<ReadonlySet<string>>(\n () => new Set<string>(),\n );\n const [expandedRows, setExpandedRows] = React.useState<ReadonlySet<string>>(\n () => new Set<string>(),\n );\n const [editingCell, setEditingCell] = React.useState<{ rowId: string; columnId: string } | null>(null);\n const [draggedColId, setDraggedColId] = React.useState<string | null>(null);\n const [isExporting, setIsExporting] = React.useState(false);\n const [openFilterCol, setOpenFilterCol] = React.useState<string | null>(null);\n const [colWidths, setColWidths] = React.useState<Record<string, number>>({});\n\n const columnsMenu = useDropdown();\n const densityMenu = useDropdown();\n const exportMenu = useDropdown();\n\n const instanceId = React.useId();\n const columnsButtonId = `${instanceId}-columns`;\n const densityButtonId = `${instanceId}-density`;\n const exportButtonId = `${instanceId}-export`;\n const jumpInputId = `${instanceId}-jump`;\n const rootRef = React.useRef<HTMLDivElement>(null);\n\n const notify = (type: TableXNoticeType, message: string): void => {\n onNotify?.({ type, message });\n };\n\n // ---- Derived query state -------------------------------------------------\n\n const currentPage = Math.max(1, query.page);\n const pageSize = query.pageSize;\n const totalPages = totalPagesFor(total, pageSize);\n const range = getRecordRange(currentPage, pageSize, total);\n const sort = primarySort(query);\n\n const visible = React.useMemo(\n () => visibleColumns(colList, hiddenCols),\n [colList, hiddenCols],\n );\n const hideable = React.useMemo(() => colList.filter(isHideable), [colList]);\n const pageItems = React.useMemo(\n () => getPageNumbers(currentPage, totalPages),\n [currentPage, totalPages],\n );\n const pageRowIds = React.useMemo(() => data.map((row) => getRowId(row)), [data, getRowId]);\n\n const columnCount =\n visible.length +\n (renderExpandedRow ? 1 : 0) +\n (showSerialNumber ? 1 : 0) +\n (enableSelection ? 1 : 0);\n\n // ---- Pinned offsets helper -----------------------------------------------\n\n const getPinnedOffsets = (visibleCols: readonly TableXColumn<TData, React.ReactNode>[]) => {\n const leftOffsets = new Map<string, number>();\n const rightOffsets = new Map<string, number>();\n let currentLeft = 0;\n let lastLeftPinnedId: string | null = null;\n\n if (renderExpandedRow) {\n leftOffsets.set(\"__expand\", currentLeft);\n currentLeft += 40;\n lastLeftPinnedId = \"__expand\";\n }\n\n if (enableSelection) {\n leftOffsets.set(\"__select\", currentLeft);\n currentLeft += 44;\n lastLeftPinnedId = \"__select\";\n }\n\n if (showSerialNumber) {\n leftOffsets.set(\"__serial\", currentLeft);\n currentLeft += 56;\n lastLeftPinnedId = \"__serial\";\n }\n\n for (const col of visibleCols) {\n const id = getColumnId(col);\n const pin = col.meta?.pinned;\n const width = colWidths[id] ?? col.meta?.width ?? 140;\n if (pin === \"left\") {\n leftOffsets.set(id, currentLeft);\n currentLeft += width;\n lastLeftPinnedId = id;\n }\n }\n\n let currentRight = 0;\n let firstRightPinnedId: string | null = null;\n for (let i = visibleCols.length - 1; i >= 0; i--) {\n const col = visibleCols[i];\n if (!col) continue;\n const id = getColumnId(col);\n const pin = col.meta?.pinned;\n const width = colWidths[id] ?? col.meta?.width ?? 140;\n if (pin === \"right\") {\n rightOffsets.set(id, currentRight);\n currentRight += width;\n firstRightPinnedId = id;\n }\n }\n\n return { leftOffsets, rightOffsets, lastLeftPinnedId, firstRightPinnedId };\n };\n\n const { leftOffsets, rightOffsets, lastLeftPinnedId, firstRightPinnedId } =\n getPinnedOffsets(visible);\n\n // ---- Search --------------------------------------------------------------\n\n const [searchText, setSearchText] = useDebouncedSearch(query.q ?? \"\", (text) => {\n onQueryChange(withSearch(query, text));\n });\n\n // ---- Page jump -----------------------------------------------------------\n\n const [jumpText, setJumpText] = React.useState(() => String(currentPage));\n React.useEffect(() => setJumpText(String(currentPage)), [currentPage]);\n\n const submitJump = (raw: string): void => {\n const page = Number.parseInt(raw, 10);\n if (Number.isNaN(page) || page < 1 || page > totalPages) {\n setJumpText(String(currentPage));\n return;\n }\n if (page !== currentPage) {\n onQueryChange(withPage(query, page, totalPages));\n }\n };\n\n // ---- Sorting -------------------------------------------------------------\n\n const toggleSort = (field: string, multiSort = false): void => {\n const next = multiSort\n ? withToggledMultiSort(query, field)\n : withToggledSort(query, field);\n onQueryChange(next);\n };\n\n // ---- Selection -----------------------------------------------------------\n\n const isSingleSelect = selectionMode === \"single\";\n const allPageSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => selectedIds.has(id));\n const somePageSelected =\n !allPageSelected && pageRowIds.some((id) => selectedIds.has(id));\n\n const toggleSelectAll = (): void => {\n if (isSingleSelect) return;\n const next = new Set(selectedIds);\n if (allPageSelected) {\n for (const id of pageRowIds) next.delete(id);\n } else {\n for (const id of pageRowIds) next.add(id);\n }\n setSelectedIds(next);\n onSelectionChange?.(Array.from(next), false);\n };\n\n const toggleSelectRow = (id: string): void => {\n const next = isSingleSelect\n ? selectedIds.has(id)\n ? new Set<string>()\n : new Set([id])\n : new Set(selectedIds);\n if (!isSingleSelect) {\n if (next.has(id)) next.delete(id);\n else next.add(id);\n }\n setSelectedIds(next);\n onSelectionChange?.(Array.from(next), false);\n };\n\n const deselectAll = (): void => {\n setSelectedIds(new Set<string>());\n onSelectionChange?.([], false);\n };\n\n const toggleExpandRow = (id: string): void => {\n setExpandedRows((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n // ---- Columns / density ---------------------------------------------------\n\n const toggleColumn = (columnId: string): void => {\n setHiddenCols((prev) => ({ ...prev, [columnId]: prev[columnId] !== true }));\n };\n\n // ---- Export --------------------------------------------------------------\n\n const handleExport = async (format: \"excel\" | \"csv\" | \"clipboard\"): Promise<void> => {\n exportMenu.close();\n\n if (onExportAll) {\n try {\n await onExportAll();\n } catch (err) {\n notify(\"error\", err instanceof Error ? err.message : \"Export failed\");\n }\n return;\n }\n\n setIsExporting(true);\n notify(\"info\", \"Exporting...\");\n try {\n let exportRows: readonly TData[] = data;\n if (fetchEndpoint) {\n const full = await fetchAllPages<TData>(async (page, size) => {\n const url = buildQueryUrl(fetchEndpoint, {\n ...query,\n page,\n pageSize: isPageSize(size) ? size : query.pageSize,\n });\n const response = await fetch(url, { cache: \"no-store\" });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n return (await response.json()) as PagedResponse<TData>;\n });\n exportRows = full.items;\n }\n\n const exportColumns = toExportColumns(visible, boolLabels);\n const prefix = exportFileName ?? filePrefixFromCaption(caption);\n\n if (format === \"clipboard\") {\n const ok = await copyToClipboard(exportRows, exportColumns);\n if (ok) notify(\"success\", \"Copied to clipboard\");\n else notify(\"error\", \"Failed to copy to clipboard\");\n } else if (format === \"excel\") {\n downloadExcel({\n filename: prefix,\n caption,\n rows: exportRows,\n columns: exportColumns,\n badgeRules,\n serialHeader: locale.serialHeader,\n });\n notify(\"success\", \"Excel downloaded\");\n } else {\n downloadCsv(timestampedFilename(prefix), exportRows, exportColumns);\n notify(\"success\", \"CSV downloaded\");\n }\n } catch {\n notify(\"error\", \"Export failed\");\n } finally {\n setIsExporting(false);\n }\n };\n\n // ---- Root ----------------------------------------------------------------\n\n const rootClasses = [\n \"tbx-root\",\n theme === \"dark\" ? \"tbx-dark\" : theme === \"auto\" ? \"tbx-auto\" : undefined,\n className,\n ].filter(Boolean);\n\n if (error) {\n return (\n <div className={rootClasses.join(\" \")} data-density={density}>\n <div className=\"tbx-state-card\">\n <p className=\"tbx-state-text\">{locale.errorText}</p>\n {onRetry ? (\n <button type=\"button\" className=\"tbx-btn\" onClick={onRetry}>\n <RotateCcwIcon className=\"tbx-icon\" />\n <span>{locale.retryButton}</span>\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n const rowIsClickable = typeof onRowClick === \"function\";\n\n const activateRow = (row: TData) => (): void => {\n onRowClick?.(row);\n };\n\n const rowKeyDown =\n (row: TData) =>\n (event: React.KeyboardEvent): void => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n onRowClick?.(row);\n };\n\n const hasSummary =\n enableSummaryRow === true ||\n visible.some((col) => col.meta?.aggregation !== undefined);\n\n return (\n <div className={rootClasses.join(\" \")} data-density={density} ref={rootRef}>\n {/* ── TOOLBAR ─────────────────────────────────────────────────────── */}\n {showToolbar ? (\n <div className=\"tbx-toolbar\">\n <div className=\"tbx-toolbar-group\">\n {enableSearch ? (\n <div className=\"tbx-search\">\n <SearchIcon className=\"tbx-search-icon\" />\n <input\n type=\"search\"\n className=\"tbx-search-input\"\n value={searchText}\n onChange={(event) => setSearchText(event.target.value)}\n placeholder={searchPlaceholder ?? locale.searchPlaceholder}\n aria-label={`Search ${caption}`}\n />\n {searchText ? (\n <button\n type=\"button\"\n className=\"tbx-search-clear\"\n onClick={() => setSearchText(\"\")}\n aria-label={locale.clearSearch}\n >\n <XIcon className=\"tbx-icon\" />\n <span className=\"tbx-sr-only\">{locale.clearSearch}</span>\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"tbx-toolbar-group tbx-toolbar-group--end\">\n {isColumnsVisible ? (\n <div className=\"tbx-menu-wrap\" ref={columnsMenu.containerRef}>\n <button\n type=\"button\"\n id={columnsButtonId}\n className=\"tbx-btn\"\n ref={columnsMenu.triggerRef}\n aria-haspopup=\"menu\"\n aria-expanded={columnsMenu.isOpen}\n onClick={columnsMenu.toggle}\n >\n <ColumnsIcon className=\"tbx-icon\" />\n <span>{locale.columnsButton}</span>\n </button>\n {columnsMenu.isOpen ? (\n <div className=\"tbx-menu\" role=\"menu\" aria-labelledby={columnsButtonId}>\n <div className=\"tbx-menu-label\">{locale.toggleColumnsLabel}</div>\n <div className=\"tbx-menu-separator\" />\n {hideable.map((col) => {\n const id = getColumnId(col);\n const checked = hiddenCols[id] !== true;\n return (\n <button\n key={id}\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n onClick={() => toggleColumn(id)}\n >\n <CheckIcon className=\"tbx-check\" />\n <span>{getColumnTitle(col) || id}</span>\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {isDensityVisible ? (\n <div className=\"tbx-menu-wrap\" ref={densityMenu.containerRef}>\n <button\n type=\"button\"\n id={densityButtonId}\n className=\"tbx-btn tbx-capitalize\"\n ref={densityMenu.triggerRef}\n aria-haspopup=\"menu\"\n aria-expanded={densityMenu.isOpen}\n onClick={densityMenu.toggle}\n >\n <DensityIcon className=\"tbx-icon\" />\n <span>{formatMessage(locale.densityButton, { density })}</span>\n </button>\n {densityMenu.isOpen ? (\n <div className=\"tbx-menu\" role=\"menu\" aria-labelledby={densityButtonId}>\n {DENSITIES.map((option) => (\n <button\n key={option}\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitemcheckbox\"\n aria-checked={density === option}\n onClick={() => {\n setDensity(option);\n densityMenu.close();\n }}\n >\n <CheckIcon className=\"tbx-check\" />\n <span>{locale[DENSITY_LABEL_KEY[option]]}</span>\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {isExportVisible ? (\n <div className=\"tbx-menu-wrap\" ref={exportMenu.containerRef}>\n <button\n type=\"button\"\n id={exportButtonId}\n className=\"tbx-btn tbx-btn--export\"\n ref={exportMenu.triggerRef}\n disabled={isExporting}\n aria-haspopup=\"menu\"\n aria-expanded={exportMenu.isOpen}\n onClick={exportMenu.toggle}\n >\n <DownloadTrayIcon className=\"tbx-icon\" />\n <span>{isExporting ? locale.exportingButton : locale.exportButton}</span>\n <ChevronDownIcon className=\"tbx-icon tbx-chevron\" />\n </button>\n {exportMenu.isOpen ? (\n <div\n className=\"tbx-menu tbx-menu--end\"\n role=\"menu\"\n aria-labelledby={exportButtonId}\n >\n <button\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitem\"\n onClick={() => void handleExport(\"excel\")}\n >\n <FileSpreadsheetIcon className=\"tbx-icon--excel\" />\n <div className=\"tbx-menu-item-title\">\n <strong>{locale.exportExcelTitle}</strong>\n <small>{locale.exportExcelSubtitle}</small>\n </div>\n </button>\n <button\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitem\"\n onClick={() => void handleExport(\"csv\")}\n >\n <FileTextIcon className=\"tbx-icon--csv\" />\n <div className=\"tbx-menu-item-title\">\n <strong>{locale.exportCsvTitle}</strong>\n <small>{locale.exportCsvSubtitle}</small>\n </div>\n </button>\n <button\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitem\"\n onClick={() => void handleExport(\"clipboard\")}\n >\n <FileTextIcon className=\"tbx-icon--csv\" />\n <div className=\"tbx-menu-item-title\">\n <strong>{locale.exportClipboardTitle}</strong>\n <small>{locale.exportClipboardSubtitle}</small>\n </div>\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n\n {toolbarActions}\n </div>\n </div>\n ) : null}\n\n {/* ── TABLE (>= 768px) ─────────────────────────────────────────────── */}\n <div className=\"tbx-table-wrap\">\n <table className=\"tbx-table\" aria-label={caption}>\n <thead>\n <tr>\n {renderExpandedRow ? (\n <th\n className={[\n \"tbx-th tbx-th--expand\",\n leftOffsets.has(\"__expand\") ? \"tbx-th--pinned-left\" : undefined,\n lastLeftPinnedId === \"__expand\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n width: \"40px\",\n left: leftOffsets.get(\"__expand\"),\n }}\n scope=\"col\"\n />\n ) : null}\n\n {enableSelection ? (\n <th\n className={[\n \"tbx-th tbx-th--select\",\n leftOffsets.has(\"__select\") ? \"tbx-th--pinned-left\" : undefined,\n lastLeftPinnedId === \"__select\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n left: leftOffsets.get(\"__select\"),\n }}\n scope=\"col\"\n >\n {!isSingleSelect ? (\n <input\n type=\"checkbox\"\n className=\"tbx-checkbox\"\n checked={allPageSelected}\n ref={(el) => {\n if (el) el.indeterminate = somePageSelected;\n }}\n onChange={toggleSelectAll}\n aria-label={locale.selectAllLabel}\n />\n ) : null}\n </th>\n ) : null}\n\n {showSerialNumber ? (\n <th\n className={[\n \"tbx-th tbx-th--serial\",\n leftOffsets.has(\"__serial\") ? \"tbx-th--pinned-left\" : undefined,\n lastLeftPinnedId === \"__serial\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n left: leftOffsets.get(\"__serial\"),\n }}\n scope=\"col\"\n >\n {locale.serialHeader}\n </th>\n ) : null}\n\n {visible.map((col, index) => {\n const id = getColumnId(col);\n const sortable = isSortable(col) && enableSorting !== false;\n const sortIndex = query.sort.findIndex((s) => s.field === id);\n const sortItem = sortIndex >= 0 ? query.sort[sortIndex] : undefined;\n const sorted = sortable && sortItem !== undefined;\n const title = getColumnTitle(col) || id;\n const meta = col.meta;\n const activeFilter = query.filter?.[id];\n const isFilterActive = activeFilter !== undefined && activeFilter !== \"\";\n\n const customWidth = colWidths[id];\n const baseStyle = headerCellStyle(col);\n const thStyle: React.CSSProperties = {\n ...baseStyle,\n ...(customWidth !== undefined ? { width: `${customWidth}px` } : {}),\n ...(leftOffsets.has(id) ? { left: leftOffsets.get(id) } : {}),\n ...(rightOffsets.has(id) ? { right: rightOffsets.get(id) } : {}),\n };\n\n const startResize = (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const startX = e.clientX;\n const targetTh = (e.currentTarget.parentElement as HTMLElement) || null;\n const startWidth = targetTh ? targetTh.getBoundingClientRect().width : (customWidth ?? meta?.width ?? 120);\n\n const onMove = (moveEvent: PointerEvent) => {\n const nextW = Math.max(meta?.minWidth ?? 60, Math.round(startWidth + (moveEvent.clientX - startX)));\n setColWidths((prev) => ({ ...prev, [id]: nextW }));\n };\n const onUp = () => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n document.body?.classList.remove(\"tbx-resizing\");\n };\n document.body?.classList.add(\"tbx-resizing\");\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n };\n\n const isPinnedLeft = leftOffsets.has(id);\n const isPinnedRight = rightOffsets.has(id);\n const isLastLeft = lastLeftPinnedId === id;\n const isFirstRight = firstRightPinnedId === id;\n\n return (\n <th\n key={id || `col-${index}`}\n scope=\"col\"\n className={[\n \"tbx-th\",\n sortable ? \"tbx-th--sortable\" : undefined,\n enableColumnReorder ? \"tbx-th--draggable\" : undefined,\n isPinnedLeft ? \"tbx-th--pinned-left\" : undefined,\n isPinnedRight ? \"tbx-th--pinned-right\" : undefined,\n isLastLeft ? \"tbx-pinned-border-left\" : undefined,\n isFirstRight ? \"tbx-pinned-border-right\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={thStyle}\n aria-sort={\n sorted\n ? sortItem?.dir === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : sortable\n ? \"none\"\n : undefined\n }\n aria-label={title || undefined}\n tabIndex={sortable ? 0 : undefined}\n draggable={enableColumnReorder}\n onDragStart={\n enableColumnReorder\n ? (e) => {\n setDraggedColId(id);\n e.dataTransfer.setData(\"text/plain\", id);\n }\n : undefined\n }\n onDragOver={\n enableColumnReorder\n ? (e) => {\n e.preventDefault();\n }\n : undefined\n }\n onDrop={\n enableColumnReorder\n ? (e) => {\n e.preventDefault();\n if (!draggedColId || draggedColId === id) return;\n const fromIdx = colList.findIndex((c) => getColumnId(c) === draggedColId);\n const toIdx = colList.findIndex((c) => getColumnId(c) === id);\n if (fromIdx >= 0 && toIdx >= 0) {\n const nextCols = [...colList];\n const moved = nextCols[fromIdx];\n if (!moved) return;\n nextCols.splice(fromIdx, 1);\n nextCols.splice(toIdx, 0, moved);\n setColList(nextCols);\n onColumnOrderChange?.(nextCols.map(getColumnId));\n }\n setDraggedColId(null);\n }\n : undefined\n }\n onClick={sortable ? (event) => {\n const t = event.target as HTMLElement | null;\n if (t?.closest(\".tbx-col-filter-wrap\") || t?.closest(\".tbx-resize-handle\")) return;\n toggleSort(id, event.shiftKey);\n } : undefined}\n onKeyDown={\n sortable\n ? (event) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n const t = event.target as HTMLElement | null;\n if (t?.closest(\".tbx-col-filter-wrap\")) return;\n event.preventDefault();\n toggleSort(id, event.shiftKey);\n }\n : undefined\n }\n >\n <div className={headerInnerClass(col)}>\n <span>{renderColumnHeader(col)}</span>\n {sortable ? (\n <span className=\"tbx-sort-icon-wrap\">\n {sorted ? (\n sortItem?.dir === \"asc\" ? (\n <ArrowUpIcon className=\"tbx-sort-icon\" />\n ) : (\n <ArrowDownIcon className=\"tbx-sort-icon\" />\n )\n ) : (\n <ArrowUpDownIcon className=\"tbx-sort-icon tbx-sort-icon--idle\" />\n )}\n {query.sort.length > 1 && sortIndex >= 0 ? (\n <span className=\"tbx-sort-order\">{sortIndex + 1}</span>\n ) : null}\n </span>\n ) : null}\n\n {isFilterable(col, enableColumnFilters) ? (\n <div className=\"tbx-col-filter-wrap\">\n <button\n type=\"button\"\n className={\n isFilterActive\n ? \"tbx-col-filter-btn tbx-col-filter-btn--active\"\n : \"tbx-col-filter-btn\"\n }\n aria-label={`Filter ${title}`}\n onClick={(e) => {\n e.stopPropagation();\n setOpenFilterCol(openFilterCol === id ? null : id);\n }}\n >\n <DotsVerticalIcon className=\"tbx-icon\" />\n </button>\n\n {openFilterCol === id ? (\n <div\n className=\"tbx-filter-popover\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n autoFocus\n type=\"text\"\n className=\"tbx-filter-popover-input\"\n defaultValue={activeFilter ?? \"\"}\n placeholder={meta?.filterPlaceholder || formatMessage(locale.filterColumnPlaceholder, { column: title })}\n aria-label={`Filter ${title}`}\n onChange={(e) => {\n const val = e.currentTarget.value.toLowerCase().trim();\n const pop = e.currentTarget.closest(\".tbx-filter-popover\");\n const opts = pop?.querySelectorAll<HTMLElement>(\".tbx-filter-option:not(:first-child)\");\n opts?.forEach((opt) => {\n const text = opt.textContent?.toLowerCase() ?? \"\";\n opt.style.display = !val || text.includes(val) ? \"\" : \"none\";\n });\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const val = (e.currentTarget as HTMLInputElement).value.trim();\n setOpenFilterCol(null);\n onQueryChange(withFilter(query, id, val || undefined));\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setOpenFilterCol(null);\n }\n }}\n />\n\n {meta?.filterOptions && meta.filterOptions.length > 0 ? (\n <div className=\"tbx-filter-popover-options\">\n <div\n className={\n !activeFilter\n ? \"tbx-filter-option tbx-filter-option--selected\"\n : \"tbx-filter-option\"\n }\n onClick={() => {\n setOpenFilterCol(null);\n onQueryChange(withFilter(query, id, undefined));\n }}\n >\n {locale.filterAll}\n </div>\n {meta.filterOptions.map((opt) => (\n <div\n key={opt}\n className={\n activeFilter === opt\n ? \"tbx-filter-option tbx-filter-option--selected\"\n : \"tbx-filter-option\"\n }\n onClick={() => {\n setOpenFilterCol(null);\n onQueryChange(withFilter(query, id, opt));\n }}\n >\n {opt}\n </div>\n ))}\n </div>\n ) : null}\n\n <div className=\"tbx-filter-popover-actions\">\n <button\n type=\"button\"\n className=\"tbx-filter-popover-btn\"\n onClick={(e) => {\n e.stopPropagation();\n setOpenFilterCol(null);\n onQueryChange(withFilter(query, id, undefined));\n }}\n >\n <RotateCcwIcon className=\"tbx-icon\" />\n <span>{locale.clearFilter}</span>\n </button>\n <button\n type=\"button\"\n className=\"tbx-filter-popover-btn tbx-filter-popover-btn--primary\"\n onClick={(e) => {\n e.stopPropagation();\n const parent = (e.currentTarget as HTMLElement).closest(\".tbx-filter-popover\");\n const inputEl = parent?.querySelector(\"input\") as HTMLInputElement | null;\n const val = inputEl?.value.trim();\n setOpenFilterCol(null);\n onQueryChange(withFilter(query, id, val || undefined));\n }}\n >\n <CheckIcon className=\"tbx-icon\" />\n <span>{locale.applyFilter}</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n\n {enableColumnResize ? (\n <div className=\"tbx-resize-handle\" onPointerDown={startResize} />\n ) : null}\n </th>\n );\n })}\n </tr>\n </thead>\n\n <tbody>\n {isLoading ? (\n <tr>\n <td className=\"tbx-state\" colSpan={Math.max(1, columnCount)}>\n <div className=\"tbx-dotted-loader\" aria-hidden=\"true\">\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n </div>\n <div className=\"tbx-loading-text\" aria-live=\"polite\">{locale.loadingText}</div>\n </td>\n </tr>\n ) : data.length === 0 ? (\n <tr>\n <td className=\"tbx-state\" colSpan={Math.max(1, columnCount)}>\n {locale.emptyText}\n </td>\n </tr>\n ) : (\n data.map((row, index) => {\n const id = pageRowIds[index] ?? String(index);\n const isSelected = selectedIds.has(id);\n const isExpanded = expandedRows.has(id);\n\n return (\n <React.Fragment key={id || index}>\n <tr\n className={[\n \"tbx-row\",\n isSelected ? \"tbx-row--selected\" : undefined,\n isExpanded ? \"tbx-row--expanded\" : undefined,\n rowIsClickable ? \"tbx-row--clickable\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={rowIsClickable ? activateRow(row) : undefined}\n onKeyDown={rowIsClickable ? rowKeyDown(row) : undefined}\n tabIndex={rowIsClickable ? 0 : undefined}\n >\n {renderExpandedRow ? (\n <td\n className={[\n \"tbx-td tbx-td--expand\",\n leftOffsets.has(\"__expand\") ? \"tbx-td--pinned-left\" : undefined,\n lastLeftPinnedId === \"__expand\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n width: \"40px\",\n left: leftOffsets.get(\"__expand\"),\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n className={isExpanded ? \"tbx-expand-btn tbx-expand-btn--open\" : \"tbx-expand-btn\"}\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n onClick={(e) => {\n e.stopPropagation();\n toggleExpandRow(id);\n }}\n >\n <ChevronRightIcon className=\"tbx-icon\" />\n </button>\n </td>\n ) : null}\n\n {enableSelection ? (\n <td\n className={[\n \"tbx-td tbx-td--select\",\n leftOffsets.has(\"__select\") ? \"tbx-td--pinned-left\" : undefined,\n lastLeftPinnedId === \"__select\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n left: leftOffsets.get(\"__select\"),\n }}\n onClick={(event) => event.stopPropagation()}\n >\n <input\n type={isSingleSelect ? \"radio\" : \"checkbox\"}\n name={isSingleSelect ? `${instanceId}-select` : undefined}\n className=\"tbx-checkbox\"\n checked={isSelected}\n onChange={() => toggleSelectRow(id)}\n onClick={(event) => event.stopPropagation()}\n aria-label={formatMessage(locale.selectRowLabel, { id })}\n />\n </td>\n ) : null}\n\n {showSerialNumber ? (\n <td\n className={[\n \"tbx-td tbx-td--serial\",\n leftOffsets.has(\"__serial\") ? \"tbx-td--pinned-left\" : undefined,\n lastLeftPinnedId === \"__serial\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n left: leftOffsets.get(\"__serial\"),\n }}\n >\n {serialNumber(currentPage, pageSize, index)}\n </td>\n ) : null}\n\n {visible.map((col, colIndex) => {\n const colId = getColumnId(col);\n const isPinnedLeft = leftOffsets.has(colId);\n const isPinnedRight = rightOffsets.has(colId);\n const isLastLeft = lastLeftPinnedId === colId;\n const isFirstRight = firstRightPinnedId === colId;\n const isCellEditable = isEditable(col);\n const isCurrentlyEditing =\n editingCell?.rowId === id && editingCell?.columnId === colId;\n\n const tdStyle: React.CSSProperties = {\n ...bodyCellStyle(col),\n ...(isPinnedLeft ? { left: leftOffsets.get(colId) } : {}),\n ...(isPinnedRight ? { right: rightOffsets.get(colId) } : {}),\n };\n\n return (\n <td\n key={colId || `col-${colIndex}`}\n className={[\n \"tbx-td\",\n isCellEditable ? \"tbx-cell--editable\" : undefined,\n isPinnedLeft ? \"tbx-td--pinned-left\" : undefined,\n isPinnedRight ? \"tbx-td--pinned-right\" : undefined,\n isLastLeft ? \"tbx-pinned-border-left\" : undefined,\n isFirstRight ? \"tbx-pinned-border-right\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={tdStyle}\n onDoubleClick={\n isCellEditable\n ? (e) => {\n e.stopPropagation();\n setEditingCell({ rowId: id, columnId: colId });\n }\n : undefined\n }\n >\n {isCurrentlyEditing ? (\n <div\n className=\"tbx-cell-edit-wrap\"\n onClick={(e) => e.stopPropagation()}\n >\n {col.meta?.editType === \"select\" && col.meta.editOptions ? (\n <select\n autoFocus\n className=\"tbx-cell-edit-select tbx-cell-edit-input\"\n defaultValue={String((row as Record<string, unknown>)[colId] ?? \"\")}\n id={`${instanceId}-edit-${id}-${colId}`}\n >\n {col.meta.editOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n ) : (\n <input\n autoFocus\n type={col.meta?.editType === \"number\" ? \"number\" : \"text\"}\n className=\"tbx-cell-edit-input\"\n defaultValue={String((row as Record<string, unknown>)[colId] ?? \"\")}\n id={`${instanceId}-edit-${id}-${colId}`}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const el = e.currentTarget;\n const val = col.meta?.editType === \"number\" ? Number(el.value) : el.value;\n const oldVal = (row as Record<string, unknown>)[colId];\n (row as Record<string, unknown>)[colId] = val;\n onCellEdit?.({ row, columnId: colId, oldValue: oldVal, newValue: val });\n setEditingCell(null);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setEditingCell(null);\n }\n }}\n />\n )}\n <div className=\"tbx-cell-edit-actions\">\n <button\n type=\"button\"\n className=\"tbx-cell-edit-btn tbx-cell-edit-btn--save\"\n onClick={(e) => {\n e.stopPropagation();\n const el = document.getElementById(`${instanceId}-edit-${id}-${colId}`) as HTMLInputElement | HTMLSelectElement | null;\n if (el) {\n const val = col.meta?.editType === \"number\" ? Number(el.value) : el.value;\n const oldVal = (row as Record<string, unknown>)[colId];\n (row as Record<string, unknown>)[colId] = val;\n onCellEdit?.({ row, columnId: colId, oldValue: oldVal, newValue: val });\n }\n setEditingCell(null);\n }}\n >\n <CheckIcon className=\"tbx-icon\" />\n </button>\n <button\n type=\"button\"\n className=\"tbx-cell-edit-btn tbx-cell-edit-btn--cancel\"\n onClick={(e) => {\n e.stopPropagation();\n setEditingCell(null);\n }}\n >\n <XIcon className=\"tbx-icon\" />\n </button>\n </div>\n </div>\n ) : (\n renderCellContent(col, row, boolLabels)\n )}\n </td>\n );\n })}\n </tr>\n {isExpanded && renderExpandedRow ? (\n <tr className=\"tbx-expanded-row\">\n <td className=\"tbx-expanded-cell\" colSpan={columnCount}>\n <div className=\"tbx-detail-panel\">\n {renderExpandedRow(row)}\n </div>\n </td>\n </tr>\n ) : null}\n </React.Fragment>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {/* ── CARD LIST (< 768px) ──────────────────────────────────────────────\n Not a cosmetic alternative: table cells are `white-space: nowrap`, so\n on a phone a reader would scroll sideways through columns to assemble\n a single record. Cards put the record back together vertically, and\n render through the SAME helpers as the table so a column with a custom\n cell cannot look different in the two layouts. */}\n <div className=\"tbx-cards\">\n {isLoading ? (\n <div className=\"tbx-card\">\n <div className=\"tbx-state\">\n <div className=\"tbx-dotted-loader\" aria-hidden=\"true\">\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n </div>\n <div className=\"tbx-loading-text\" aria-live=\"polite\">{locale.loadingText}</div>\n </div>\n </div>\n ) : data.length === 0 ? (\n <div className=\"tbx-card\">\n <div className=\"tbx-state\">{locale.emptyText}</div>\n </div>\n ) : (\n data.map((row, index) => {\n const id = pageRowIds[index] ?? String(index);\n const isSelected = selectedIds.has(id);\n\n return (\n <div\n key={id || index}\n className={[\n \"tbx-card\",\n isSelected ? \"tbx-card--selected\" : undefined,\n rowIsClickable ? \"tbx-card--clickable\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={rowIsClickable ? activateRow(row) : undefined}\n onKeyDown={rowIsClickable ? rowKeyDown(row) : undefined}\n tabIndex={rowIsClickable ? 0 : undefined}\n >\n {showSerialNumber || enableSelection ? (\n <div className=\"tbx-card-head\">\n {showSerialNumber ? (\n <span className=\"tbx-card-serial\">\n #{serialNumber(currentPage, pageSize, index)}\n </span>\n ) : null}\n {enableSelection ? (\n <span\n className=\"tbx-card-select\"\n onClick={(event) => event.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n className=\"tbx-checkbox\"\n checked={isSelected}\n onChange={() => toggleSelectRow(id)}\n onClick={(event) => event.stopPropagation()}\n aria-label={formatMessage(locale.selectRowLabel, { id })}\n />\n </span>\n ) : null}\n </div>\n ) : null}\n\n <dl className=\"tbx-card-rows\">\n {visible.map((col, colIndex) => {\n const colId = getColumnId(col);\n return (\n <div key={colId || `col-${colIndex}`} className=\"tbx-card-row\">\n <dt>{getColumnTitle(col) || colId}</dt>\n <dd>{renderCellContent(col, row, boolLabels)}</dd>\n </div>\n );\n })}\n </dl>\n </div>\n );\n })\n )}\n </div>\n\n {/* ── FOOTER ──────────────────────────────────────────────────────── */}\n {showFooter ? (\n <div className=\"tbx-footer\">\n <div className=\"tbx-range\">\n <span>\n {renderTemplate(locale.showingRange, {\n start: <strong>{range.start}</strong>,\n end: <strong>{range.end}</strong>,\n total: <strong className=\"tbx-range-total\">{total.toLocaleString()}</strong>,\n })}\n </span>\n {selectedIds.size > 0 ? (\n <span className=\"tbx-selected-badge\">\n {formatMessage(locale.selectedBadge, { count: selectedIds.size })}\n </span>\n ) : null}\n </div>\n\n <div className=\"tbx-pagination\">\n {isRowsPerPageVisible ? (\n <div className=\"tbx-rows-per-page\">\n <span>{locale.rowsPerPage}</span>\n <select\n className=\"tbx-rows-select\"\n value={String(pageSize)}\n onChange={(event) => {\n onQueryChange(withPageSize(query, Number.parseInt(event.target.value, 10)));\n }}\n aria-label={locale.rowsPerPage}\n >\n {PAGE_SIZES.map((size) => (\n <option key={size} value={size}>\n {size} rows\n </option>\n ))}\n </select>\n </div>\n ) : null}\n\n {isPaginationVisible ? (\n <div className=\"tbx-pager\">\n <button\n type=\"button\"\n className=\"tbx-page-nav\"\n disabled={currentPage <= 1}\n onClick={() => onQueryChange(withPage(query, currentPage - 1, totalPages))}\n aria-label={locale.previousPage}\n >\n <ChevronLeftIcon size={16} />\n <span className=\"tbx-sr-only\">{locale.previousPage}</span>\n </button>\n\n {pageItems.map((item, index) =>\n item === \"...\" ? (\n <span key={`gap-${index}`} className=\"tbx-page-ellipsis\">\n …\n </span>\n ) : (\n <button\n key={`page-${item}`}\n type=\"button\"\n className={\n item === currentPage ? \"tbx-page-btn tbx-page-btn--current\" : \"tbx-page-btn\"\n }\n onClick={() => onQueryChange(withPage(query, item, totalPages))}\n aria-label={formatMessage(locale.pageLabel, { page: item })}\n aria-current={item === currentPage ? \"page\" : undefined}\n >\n {item}\n </button>\n ),\n )}\n\n <button\n type=\"button\"\n className=\"tbx-page-nav\"\n disabled={currentPage >= totalPages}\n onClick={() => onQueryChange(withPage(query, currentPage + 1, totalPages))}\n aria-label={locale.nextPage}\n >\n <ChevronRightIcon size={16} />\n <span className=\"tbx-sr-only\">{locale.nextPage}</span>\n </button>\n </div>\n ) : null}\n\n {isJumpToPageVisible ? (\n <form\n className=\"tbx-jump\"\n onSubmit={(event) => {\n event.preventDefault();\n submitJump(jumpText);\n }}\n >\n <label className=\"tbx-jump-label\" htmlFor={jumpInputId}>\n {locale.goToPage}\n </label>\n <input\n id={jumpInputId}\n type=\"number\"\n className=\"tbx-jump-input\"\n min={1}\n max={totalPages}\n value={jumpText}\n onChange={(event) => setJumpText(event.target.value)}\n onBlur={() => submitJump(jumpText)}\n aria-label={locale.goToPageOf}\n />\n </form>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport const NexGrid = TableX;\n","// The grid's complete icon set, inlined as components.\n//\n// WHY INLINE: TableX ships with zero runtime dependencies, so an icon package\n// (lucide-react, heroicons) is not an option. It would also be a parity hazard —\n// the Angular and vanilla adapters draw these same shapes from §7 of the\n// adapter spec, and a version bump in one package's icon set would silently\n// make one adapter look different from the others.\n//\n// Every icon shares the same 24x24 stroked geometry, so the wrapper below owns\n// those attributes and each export contributes only its paths.\n\nimport * as React from \"react\";\n\n/** Props accepted by every TableX icon. */\nexport interface TableXIconProps {\n /**\n * Class supplying size and color — `.tbx-icon`, `.tbx-sort-icon`,\n * `.tbx-check`, `.tbx-icon--excel`, `.tbx-icon--csv`, `.tbx-search-icon`.\n * An SVG with no sizing resolves to 300x150, so every icon needs either a\n * class or {@link TableXIconProps.size}.\n */\n className?: string;\n /** Explicit pixel size, for the pager chevrons which have no sizing class. */\n size?: number;\n}\nexport type NexGridIconProps = TableXIconProps;\n\nfunction Icon({\n className,\n size,\n children,\n}: TableXIconProps & { children: React.ReactNode }): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className={className}\n width={size}\n height={size}\n >\n {children}\n </svg>\n );\n}\n\n/** Magnifier — the search field's leading adornment. */\nexport function SearchIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </Icon>\n );\n}\n\n/** Cross used by the \"clear search\" button. */\nexport function XIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n );\n}\n\n/** Columns icon — 3 vertical columns inside a rounded box. */\nexport function ColumnsIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </Icon>\n );\n}\n\n/** Horizontal sliders — backwards compatible alias to ColumnsIcon. */\nexport function SlidersIcon(props: TableXIconProps): React.JSX.Element {\n return <ColumnsIcon {...props} />;\n}\n\n/** Density icon — horizontal rows / stacked bars. */\nexport function DensityIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"6\" rx=\"1.5\" />\n <rect x=\"3\" y=\"13.5\" width=\"18\" height=\"6\" rx=\"1.5\" />\n </Icon>\n );\n}\n\n/** Funnel — backwards compatible alias to DensityIcon. */\nexport function FilterIcon(props: TableXIconProps): React.JSX.Element {\n return <DensityIcon {...props} />;\n}\n\n/** Chevron down for dropdowns. */\nexport function ChevronDownIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m6 9 6 6 6-6\" />\n </Icon>\n );\n}\n\n/** Edit / pencil icon for actions. */\nexport function EditIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n <path d=\"m15 5 4 4\" />\n </Icon>\n );\n}\n\n/** Download tray — the Export menu trigger. */\nexport function DownloadIcon(props: TableXIconProps): React.JSX.Element {\n return <ChevronDownIcon {...props} />;\n}\n\n/** Spreadsheet document — the Excel export option. */\nexport function FileSpreadsheetIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M8 13h2\" />\n <path d=\"M14 13h2\" />\n <path d=\"M8 17h2\" />\n <path d=\"M14 17h2\" />\n </Icon>\n );\n}\n\n/** Text document — the CSV export option. */\nexport function FileTextIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </Icon>\n );\n}\n\n/** Left chevron — previous page. */\nexport function ChevronLeftIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m15 18-6-6 6-6\" />\n </Icon>\n );\n}\n\n/** Right chevron — next page. */\nexport function ChevronRightIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m9 18 6-6-6-6\" />\n </Icon>\n );\n}\n\n/** Up arrow — ascending sort. */\nexport function ArrowUpIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </Icon>\n );\n}\n\n/** Down arrow — descending sort. */\nexport function ArrowDownIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M12 5v14\" />\n <path d=\"m19 12-7 7-7-7\" />\n </Icon>\n );\n}\n\n/** Opposed arrows — sortable but not currently sorted. */\nexport function ArrowUpDownIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </Icon>\n );\n}\n\n/** Tick — the checked marker in menu checkbox items. */\nexport function CheckIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M20 6 9 17l-5-5\" />\n </Icon>\n );\n}\n\n/** Funnel icon for column filter trigger. */\nexport function FunnelIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\" />\n </Icon>\n );\n}\n\n/** Rotate counter-clockwise / reset icon. */\nexport function RotateCcwIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </Icon>\n );\n}\n\n/** Trash / delete icon for actions. */\nexport function TrashIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n </Icon>\n );\n}\n\n/** Eye / view icon. */\nexport function EyeIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </Icon>\n );\n}\n\n/** Download tray icon. */\nexport function DownloadTrayIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\" />\n </Icon>\n );\n}\n\n/** Three vertical dots (⋮) icon for column filter & options menu trigger. */\nexport function DotsVerticalIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"12\" cy=\"19\" r=\"1.5\" />\n </Icon>\n );\n}\n\nexport function MoreVerticalIcon(props: TableXIconProps): React.JSX.Element {\n return <DotsVerticalIcon {...props} />;\n}\n","// Pure rendering helpers shared by the table and the card list.\n//\n// The two layouts must never drift: a column with a custom cell (a status\n// pill, a row action menu) has to look the same whether it is drawn as a `td`\n// or as a card's `dd`. Routing both through these functions is what makes that\n// structural rather than a thing to remember.\n\nimport * as React from \"react\";\nimport {\n getCellText,\n getCellValue,\n getColumnId,\n type TableXColumn,\n type NexGridColumn,\n} from \"@nexgrid/core\";\n\n/** Default width, in px, for a column that declares neither `width` nor `minWidth`. */\nexport const DEFAULT_MIN_WIDTH = 120;\n\n/** Render a column's header: a custom render function, its text, or its id. */\nexport function renderColumnHeader<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n): React.ReactNode {\n const header = col.header;\n if (typeof header === \"function\") return header({});\n if (typeof header === \"string\") return header;\n return getColumnId(col);\n}\n\n/**\n * Render one cell. With no `cell` renderer the raw value is rendered as text\n * through core's `getCellText`, so booleans and objects never leak `[object\n * Object]` into the grid.\n */\nexport function renderCellContent<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n row: TData,\n labels: { yes: string; no: string },\n): React.ReactNode {\n const cell = col.cell;\n if (typeof cell === \"function\") {\n return cell({ row: { original: row }, getValue: () => getCellValue(col, row) });\n }\n return getCellText(getCellValue(col, row), labels);\n}\n\n/**\n * Header cell geometry. `meta.width` pins the column; otherwise it gets a floor\n * of `meta.minWidth ?? 120` and lays out naturally, which keeps a table of\n * short values from collapsing into unreadable slivers.\n */\nexport function headerCellStyle<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n): React.CSSProperties {\n const meta = col.meta;\n const style: React.CSSProperties =\n meta?.width === undefined\n ? { minWidth: `${meta?.minWidth ?? DEFAULT_MIN_WIDTH}px` }\n : { width: `${meta.width}px` };\n if (meta?.align !== undefined) style.textAlign = meta.align;\n return style;\n}\n\n/** Body cell geometry — alignment only; widths are set once, on the header. */\nexport function bodyCellStyle<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n): React.CSSProperties | undefined {\n const align = col.meta?.align;\n return align === undefined ? undefined : { textAlign: align };\n}\n\n/** Extra class for the header's inner flex wrapper, following `meta.align`. */\nexport function headerInnerClass<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n): string {\n const align = col.meta?.align;\n if (align === \"center\") return \"tbx-th-inner tbx-th-inner--center\";\n if (align === \"right\") return \"tbx-th-inner tbx-th-inner--right\";\n return \"tbx-th-inner\";\n}\n\n/**\n * Interpolate a locale template whose placeholders resolve to ELEMENTS rather\n * than text.\n *\n * `showingRange` needs `<strong>` around each number, but it is deliberately a\n * single translatable sentence (\"Showing {start} to {end} of {total} entries\")\n * rather than a pile of fragments, because word order differs by language.\n * Splitting the template on its own placeholders keeps translators in charge\n * of the sentence while the grid keeps control of the markup.\n */\nexport function renderTemplate(\n template: string,\n values: Readonly<Record<string, React.ReactNode>>,\n): React.ReactNode {\n const parts: React.ReactNode[] = [];\n const pattern = /\\{(\\w+)\\}/g;\n let cursor = 0;\n\n for (let match = pattern.exec(template); match !== null; match = pattern.exec(template)) {\n const key = match[1];\n const replacement = key === undefined ? undefined : values[key];\n if (replacement === undefined) continue;\n if (match.index > cursor) parts.push(template.slice(cursor, match.index));\n parts.push(replacement);\n cursor = match.index + match[0].length;\n }\n\n if (cursor < template.length) parts.push(template.slice(cursor));\n\n // Index keys are correct here: the parts are fixed positions in one template,\n // never a reorderable list.\n return parts.map((part, index) => <React.Fragment key={index}>{part}</React.Fragment>);\n}\n","// Debounced two-way binding between the search box and `query.q`.\n//\n// The search input cannot be driven straight from `query.q`: every keystroke\n// would be a server round-trip, and each one resets the grid to page 1. So the\n// input keeps its own state and the committed value trails it by a beat.\n//\n// Two failure modes this hook exists to prevent, both of which are easy to\n// write by accident:\n//\n// * Committing on mount. `text` starts equal to `query.q`, and the timer is\n// only armed when the two differ, so a freshly mounted grid never fires a\n// query the host did not ask for — which would have thrown away a page\n// number restored from the URL.\n// * Restarting the timer on unrelated renders. The commit callback is held\n// in a ref instead of being an effect dependency, so a host that passes an\n// inline arrow (nearly all of them do) does not re-arm the 350 ms timer\n// every time its parent re-renders.\n\nimport * as React from \"react\";\n\n/** How long typing must pause before the query is updated. */\nexport const SEARCH_DEBOUNCE_MS = 350;\n\n/**\n * Bind a text input to an externally controlled search string.\n *\n * @param value The committed search text (`query.q ?? \"\"`). An external\n * change — a URL restore, a \"reset filters\" button — is\n * detected and mirrored into the input.\n * @param commit Called with the input text once typing has paused.\n * @param delayMs Debounce interval. Defaults to {@link SEARCH_DEBOUNCE_MS}.\n * @returns The input's current text and its setter.\n */\nexport function useDebouncedSearch(\n value: string,\n commit: (text: string) => void,\n delayMs: number = SEARCH_DEBOUNCE_MS,\n): readonly [string, (next: string) => void] {\n const [text, setText] = React.useState(value);\n\n const commitRef = React.useRef(commit);\n React.useEffect(() => {\n commitRef.current = commit;\n });\n\n // Distinguish \"the host changed the search\" from \"the host echoed back what\n // we just committed\": only the former should overwrite what the user typed.\n const lastExternal = React.useRef(value);\n React.useEffect(() => {\n if (lastExternal.current === value) return;\n lastExternal.current = value;\n setText(value);\n }, [value]);\n\n React.useEffect(() => {\n if (text === value) return;\n const timer = setTimeout(() => commitRef.current(text), delayMs);\n return () => clearTimeout(timer);\n }, [text, value, delayMs]);\n\n return [text, setText] as const;\n}\n","// Open/close state for the toolbar menus.\n//\n// The grid has no dependency on a popover library, so the two behaviors users\n// expect from any menu — clicking elsewhere dismisses it, Escape dismisses it —\n// have to be implemented here. They are worth getting right: a menu that only\n// closes by clicking its own trigger feels broken, and a menu that traps focus\n// after Escape strands keyboard users.\n//\n// Listeners are attached only while a menu is open, so a page with several\n// grids on it is not paying for document-level handlers it never uses.\n\nimport * as React from \"react\";\n\n/** Everything a menu needs to wire itself up. */\nexport interface Dropdown {\n /** Is the menu currently open? */\n isOpen: boolean;\n /** Toggle — bind to the trigger's `onClick`. */\n toggle: () => void;\n /** Close programmatically, e.g. after a menu item is activated. */\n close: () => void;\n /** Attach to the `.tbx-menu-wrap` element; defines what counts as \"outside\". */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Attach to the trigger button so Escape can return focus to it. */\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n}\n\n/**\n * Self-contained dropdown state: opens on toggle, closes on outside pointer\n * down and on Escape (returning focus to the trigger).\n */\nexport function useDropdown(): Dropdown {\n const [isOpen, setIsOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const triggerRef = React.useRef<HTMLButtonElement | null>(null);\n\n React.useEffect(() => {\n if (!isOpen) return;\n\n // `pointerdown` rather than `click`: dismissing on press matches every\n // native menu, and it fires before the trigger's own click handler would\n // re-open a menu the user meant to close.\n const onPointerDown = (event: PointerEvent) => {\n const container = containerRef.current;\n const target = event.target;\n if (container && target instanceof Node && container.contains(target)) return;\n setIsOpen(false);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n setIsOpen(false);\n triggerRef.current?.focus();\n };\n\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOpen]);\n\n const toggle = React.useCallback(() => setIsOpen((open) => !open), []);\n const close = React.useCallback(() => setIsOpen(false), []);\n\n return { isOpen, toggle, close, containerRef, triggerRef };\n}\n","import { useMemo, useState } from \"react\";\nimport {\n defaultQuery,\n queryClientData,\n type ClientQueryOptions,\n type QueryState,\n} from \"@nexgrid/core\";\n\n/** Options for {@link useClientTableX}. */\nexport interface UseClientTableXOptions<TData> extends ClientQueryOptions<TData> {\n /** Optional initial query state overrides. */\n initialQuery?: Partial<QueryState>;\n}\nexport type UseClientNexGridOptions<TData> = UseClientTableXOptions<TData>;\n\n/**\n * React hook for effortless in-memory client-side grid operations.\n *\n * Automatically manages search, sorting, column filtering, and pagination\n * over a client-side dataset array.\n *\n * @example\n * ```tsx\n * export function StudentsGrid({ allStudents }: { allStudents: Student[] }) {\n * const grid = useClientTableX(allStudents);\n *\n * return (\n * <TableX\n * caption=\"Students\"\n * columns={columns}\n * {...grid}\n * />\n * );\n * }\n * ```\n */\nexport function useClientTableX<TData>(\n allData: readonly TData[],\n options?: UseClientTableXOptions<TData>,\n) {\n const [query, setQuery] = useState<QueryState>(() => ({\n ...defaultQuery(),\n ...options?.initialQuery,\n }));\n\n const page = useMemo(\n () => queryClientData(allData, query, options),\n [allData, query, options],\n );\n\n return {\n data: page.items,\n total: page.total,\n query,\n onQueryChange: setQuery,\n page: page.page,\n pageSize: page.pageSize,\n totalPages: page.totalPages,\n setQuery,\n };\n}\n\nexport const useClientNexGrid = useClientTableX;\n","// @nexgrid/react — public surface.\n//\n// The engine lives in `@nexgrid/core`. The handful of core exports re-exported\n// below are the ones a HOST needs in order to drive a controlled grid — build a\n// starting query, read it out of a URL, move a page — so an app can integrate\n// TableX without a second install and without learning the package split. The\n// rest of core (export writers, column helpers, locale internals) stays where\n// it is; import `@nexgrid/core` directly if you need it.\n\nexport { TableX, NexGrid } from \"./table-x.js\";\n\nexport type {\n TableXProps,\n TableXReactColumn,\n TableXNotice,\n TableXNoticeType,\n TableXTheme,\n NexGridProps,\n NexGridReactColumn,\n NexGridNotice,\n NexGridNoticeType,\n NexGridTheme,\n} from \"./types.js\";\n\n/** Column definitions render `React.ReactNode`; see {@link TableXReactColumn}. */\nexport type {\n TableXColumn,\n TableXColumnMeta,\n TableXCellContext,\n TableXLocale,\n NexGridColumn,\n NexGridColumnMeta,\n NexGridCellContext,\n NexGridLocale,\n QueryState,\n SortSpec,\n SortDir,\n PageSize,\n PagedResponse,\n Density,\n ExcelBadgeRule,\n} from \"@nexgrid/core\";\n\nexport { useClientTableX, useClientNexGrid } from \"./use-client-table-x.js\";\nexport type { UseClientTableXOptions, UseClientNexGridOptions } from \"./use-client-table-x.js\";\n\nexport {\n // In-memory client-side data querying\n queryClientData,\n // Building and reading a query (REST & OData v4)\n defaultQuery,\n parseQuery,\n serializeQuery,\n buildQueryUrl,\n toODataParams,\n buildODataUrl,\n fromODataResponse,\n primarySort,\n\n // Query reducers — the only supported way to mutate a QueryState\n withToggledSort,\n withToggledMultiSort,\n withSort,\n withSearch,\n withPage,\n withPageSize,\n withFilter,\n // Pagination math\n totalPagesFor,\n isPageSize,\n PAGE_SIZES,\n DEFAULT_PAGE_SIZE,\n // Localization\n DEFAULT_LOCALE,\n resolveLocale,\n} from \"@nexgrid/core\";\nexport type { ClientQueryOptions } from \"@nexgrid/core\";\n"],"mappings":";;;AAiBA,YAAYA,YAAW;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;;;ACxBH,cAsBA,YAtBA;AANJ,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACF,GAAuE;AACrE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAa;AAAA,MACb,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MACZ,WAAU;AAAA,MACV;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MAEP;AAAA;AAAA,EACH;AAEJ;AAGO,SAAS,WAAW,OAA2C;AACpE,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,oBAAC,UAAK,GAAE,kBAAiB;AAAA,KAC3B;AAEJ;AAGO,SAAS,MAAM,OAA2C;AAC/D,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,cAAa;AAAA,IACrB,oBAAC,UAAK,GAAE,cAAa;AAAA,KACvB;AAEJ;AAGO,SAAS,YAAY,OAA2C;AACrE,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,oBAAC,UAAK,GAAE,WAAU;AAAA,IAClB,oBAAC,UAAK,GAAE,YAAW;AAAA,KACrB;AAEJ;AAQO,SAAS,YAAY,OAA2C;AACrE,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,KAAI,IAAG,OAAM;AAAA,IACnD,oBAAC,UAAK,GAAE,KAAI,GAAE,QAAO,OAAM,MAAK,QAAO,KAAI,IAAG,OAAM;AAAA,KACtD;AAEJ;AAQO,SAAS,gBAAgB,OAA2C;AACzE,SACE,oBAAC,QAAM,GAAG,OACR,8BAAC,UAAK,GAAE,gBAAe,GACzB;AAEJ;AAkBO,SAAS,oBAAoB,OAA2C;AAC7E,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,8DAA6D;AAAA,IACrE,oBAAC,UAAK,GAAE,2BAA0B;AAAA,IAClC,oBAAC,UAAK,GAAE,WAAU;AAAA,IAClB,oBAAC,UAAK,GAAE,YAAW;AAAA,IACnB,oBAAC,UAAK,GAAE,WAAU;AAAA,IAClB,oBAAC,UAAK,GAAE,YAAW;AAAA,KACrB;AAEJ;AAGO,SAAS,aAAa,OAA2C;AACtE,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,8DAA6D;AAAA,IACrE,oBAAC,UAAK,GAAE,2BAA0B;AAAA,IAClC,oBAAC,UAAK,GAAE,WAAU;AAAA,IAClB,oBAAC,UAAK,GAAE,YAAW;AAAA,IACnB,oBAAC,UAAK,GAAE,YAAW;AAAA,KACrB;AAEJ;AAGO,SAAS,gBAAgB,OAA2C;AACzE,SACE,oBAAC,QAAM,GAAG,OACR,8BAAC,UAAK,GAAE,kBAAiB,GAC3B;AAEJ;AAGO,SAAS,iBAAiB,OAA2C;AAC1E,SACE,oBAAC,QAAM,GAAG,OACR,8BAAC,UAAK,GAAE,iBAAgB,GAC1B;AAEJ;AAGO,SAAS,YAAY,OAA2C;AACrE,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,iBAAgB;AAAA,IACxB,oBAAC,UAAK,GAAE,YAAW;AAAA,KACrB;AAEJ;AAGO,SAAS,cAAc,OAA2C;AACvE,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,YAAW;AAAA,IACnB,oBAAC,UAAK,GAAE,kBAAiB;AAAA,KAC3B;AAEJ;AAGO,SAAS,gBAAgB,OAA2C;AACzE,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,oBAAC,UAAK,GAAE,YAAW;AAAA,IACnB,oBAAC,UAAK,GAAE,gBAAe;AAAA,IACvB,oBAAC,UAAK,GAAE,WAAU;AAAA,KACpB;AAEJ;AAGO,SAAS,UAAU,OAA2C;AACnE,SACE,oBAAC,QAAM,GAAG,OACR,8BAAC,UAAK,GAAE,mBAAkB,GAC5B;AAEJ;AAYO,SAAS,cAAc,OAA2C;AACvE,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,qDAAoD;AAAA,IAC5D,oBAAC,UAAK,GAAE,YAAW;AAAA,KACrB;AAEJ;AAwBO,SAAS,iBAAiB,OAA2C;AAC1E,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,oBAAC,cAAS,QAAO,oBAAmB;AAAA,IACpC,oBAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI;AAAA,KACvC;AAEJ;AAGO,SAAS,iBAAiB,OAA2C;AAC1E,SACE,qBAAC,QAAM,GAAG,OACR;AAAA,wBAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,OAAM;AAAA,IAC/B,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAM;AAAA,IAChC,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAM;AAAA,KAClC;AAEJ;;;AC1QA,YAAY,WAAW;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAkG6B,gBAAAC,YAAA;AA/F7B,IAAM,oBAAoB;AAG1B,SAAS,mBACd,KACiB;AACjB,QAAM,SAAS,IAAI;AACnB,MAAI,OAAO,WAAW,WAAY,QAAO,OAAO,CAAC,CAAC;AAClD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,SAAO,YAAY,GAAG;AACxB;AAOO,SAAS,kBACd,KACA,KACA,QACiB;AACjB,QAAM,OAAO,IAAI;AACjB,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO,KAAK,EAAE,KAAK,EAAE,UAAU,IAAI,GAAG,UAAU,MAAM,aAAa,KAAK,GAAG,EAAE,CAAC;AAAA,EAChF;AACA,SAAO,YAAY,aAAa,KAAK,GAAG,GAAG,MAAM;AACnD;AAOO,SAAS,gBACd,KACqB;AACrB,QAAM,OAAO,IAAI;AACjB,QAAM,QACJ,MAAM,UAAU,SACZ,EAAE,UAAU,GAAG,MAAM,YAAY,iBAAiB,KAAK,IACvD,EAAE,OAAO,GAAG,KAAK,KAAK,KAAK;AACjC,MAAI,MAAM,UAAU,OAAW,OAAM,YAAY,KAAK;AACtD,SAAO;AACT;AAGO,SAAS,cACd,KACiC;AACjC,QAAM,QAAQ,IAAI,MAAM;AACxB,SAAO,UAAU,SAAY,SAAY,EAAE,WAAW,MAAM;AAC9D;AAGO,SAAS,iBACd,KACQ;AACR,QAAM,QAAQ,IAAI,MAAM;AACxB,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,QAAS,QAAO;AAC9B,SAAO;AACT;AAYO,SAAS,eACd,UACA,QACiB;AACjB,QAAM,QAA2B,CAAC;AAClC,QAAM,UAAU;AAChB,MAAI,SAAS;AAEb,WAAS,QAAQ,QAAQ,KAAK,QAAQ,GAAG,UAAU,MAAM,QAAQ,QAAQ,KAAK,QAAQ,GAAG;AACvF,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,cAAc,QAAQ,SAAY,SAAY,OAAO,GAAG;AAC9D,QAAI,gBAAgB,OAAW;AAC/B,QAAI,MAAM,QAAQ,OAAQ,OAAM,KAAK,SAAS,MAAM,QAAQ,MAAM,KAAK,CAAC;AACxE,UAAM,KAAK,WAAW;AACtB,aAAS,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,EAClC;AAEA,MAAI,SAAS,SAAS,OAAQ,OAAM,KAAK,SAAS,MAAM,MAAM,CAAC;AAI/D,SAAO,MAAM,IAAI,CAAC,MAAM,UAAU,gBAAAA,KAAO,gBAAN,EAA4B,kBAAR,KAAa,CAAiB;AACvF;;;AC/FA,YAAYC,YAAW;AAGhB,IAAM,qBAAqB;AAY3B,SAAS,mBACd,OACA,QACA,UAAkB,oBACyB;AAC3C,QAAM,CAAC,MAAM,OAAO,IAAU,gBAAS,KAAK;AAE5C,QAAM,YAAkB,cAAO,MAAM;AACrC,EAAM,iBAAU,MAAM;AACpB,cAAU,UAAU;AAAA,EACtB,CAAC;AAID,QAAM,eAAqB,cAAO,KAAK;AACvC,EAAM,iBAAU,MAAM;AACpB,QAAI,aAAa,YAAY,MAAO;AACpC,iBAAa,UAAU;AACvB,YAAQ,KAAK;AAAA,EACf,GAAG,CAAC,KAAK,CAAC;AAEV,EAAM,iBAAU,MAAM;AACpB,QAAI,SAAS,MAAO;AACpB,UAAM,QAAQ,WAAW,MAAM,UAAU,QAAQ,IAAI,GAAG,OAAO;AAC/D,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,MAAM,OAAO,OAAO,CAAC;AAEzB,SAAO,CAAC,MAAM,OAAO;AACvB;;;AClDA,YAAYC,YAAW;AAoBhB,SAAS,cAAwB;AACtC,QAAM,CAAC,QAAQ,SAAS,IAAU,gBAAS,KAAK;AAChD,QAAM,eAAqB,cAA8B,IAAI;AAC7D,QAAM,aAAmB,cAAiC,IAAI;AAE9D,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,OAAQ;AAKb,UAAM,gBAAgB,CAAC,UAAwB;AAC7C,YAAM,YAAY,aAAa;AAC/B,YAAM,SAAS,MAAM;AACrB,UAAI,aAAa,kBAAkB,QAAQ,UAAU,SAAS,MAAM,EAAG;AACvE,gBAAU,KAAK;AAAA,IACjB;AAEA,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,SAAU;AAC5B,gBAAU,KAAK;AACf,iBAAW,SAAS,MAAM;AAAA,IAC5B;AAEA,aAAS,iBAAiB,eAAe,eAAe,IAAI;AAC5D,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,eAAe,IAAI;AAC/D,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,SAAe,mBAAY,MAAM,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;AACrE,QAAM,QAAc,mBAAY,MAAM,UAAU,KAAK,GAAG,CAAC,CAAC;AAE1D,SAAO,EAAE,QAAQ,QAAQ,OAAO,cAAc,WAAW;AAC3D;;;AJsZU,gBAAAC,MAEE,QAAAC,aAFF;AAvXV,SAAS,aAAoB,KAAoB;AAC/C,QAAM,SAAS;AACf,QAAM,KAAK,WAAW,QAAQ,WAAW,SAAY,SAAY,OAAO,IAAI;AAC5E,SAAO,OAAO,MAAM,GAAG;AACzB;AAGA,IAAM,oBAAoB;AAAA,EACxB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AACf;AAwBO,SAAS,OAAc,OAA8C;AAC1E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,iBAAiB;AAAA,IAC1B,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,IACA,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA,cAAc;AAAA,IACd,aAAa;AAAA,IACb;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,EACV,IAAI;AACJ,QAAM,SAAS,cAAc,eAAe;AAC5C,QAAM,aAAa,EAAE,KAAK,OAAO,YAAY,IAAI,OAAO,UAAU;AAElE,QAAM,mBAAmB,iBAAiB,sBAAsB;AAChE,QAAM,mBAAmB,iBAAiB,sBAAsB;AAChE,QAAM,kBAAkB,gBAAgB,qBAAqB;AAC7D,QAAM,sBAAsB,oBAAoB,mBAAmB;AACnE,QAAM,uBAAuB,qBAAqB,oBAAoB;AACtE,QAAM,sBAAsB,oBAAoB,mBAAmB;AAEnE,QAAM,CAAC,SAAS,UAAU,IAAU,gBAAS,OAAO;AACpD,EAAM,iBAAU,MAAM;AACpB,eAAW,OAAO;AAAA,EACpB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,CAAC,SAAS,UAAU,IAAU,gBAAkB,cAAc;AACpE,QAAM,CAAC,YAAY,aAAa,IAAU;AAAA,IAAkC,MAC1E,qBAAqB,OAAO;AAAA,EAC9B;AACA,QAAM,CAAC,aAAa,cAAc,IAAU;AAAA,IAC1C,MAAM,oBAAI,IAAY;AAAA,EACxB;AACA,QAAM,CAAC,cAAc,eAAe,IAAU;AAAA,IAC5C,MAAM,oBAAI,IAAY;AAAA,EACxB;AACA,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAqD,IAAI;AACrG,QAAM,CAAC,cAAc,eAAe,IAAU,gBAAwB,IAAI;AAC1E,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAS,KAAK;AAC1D,QAAM,CAAC,eAAe,gBAAgB,IAAU,gBAAwB,IAAI;AAC5E,QAAM,CAAC,WAAW,YAAY,IAAU,gBAAiC,CAAC,CAAC;AAE3E,QAAM,cAAc,YAAY;AAChC,QAAM,cAAc,YAAY;AAChC,QAAM,aAAa,YAAY;AAE/B,QAAM,aAAmB,aAAM;AAC/B,QAAM,kBAAkB,GAAG,UAAU;AACrC,QAAM,kBAAkB,GAAG,UAAU;AACrC,QAAM,iBAAiB,GAAG,UAAU;AACpC,QAAM,cAAc,GAAG,UAAU;AACjC,QAAM,UAAgB,cAAuB,IAAI;AAEjD,QAAM,SAAS,CAAC,MAAwB,YAA0B;AAChE,eAAW,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC9B;AAIA,QAAM,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;AAC1C,QAAM,WAAW,MAAM;AACvB,QAAM,aAAa,cAAc,OAAO,QAAQ;AAChD,QAAM,QAAQ,eAAe,aAAa,UAAU,KAAK;AACzD,QAAM,OAAO,YAAY,KAAK;AAE9B,QAAM,UAAgB;AAAA,IACpB,MAAM,eAAe,SAAS,UAAU;AAAA,IACxC,CAAC,SAAS,UAAU;AAAA,EACtB;AACA,QAAM,WAAiB,eAAQ,MAAM,QAAQ,OAAO,UAAU,GAAG,CAAC,OAAO,CAAC;AAC1E,QAAM,YAAkB;AAAA,IACtB,MAAM,eAAe,aAAa,UAAU;AAAA,IAC5C,CAAC,aAAa,UAAU;AAAA,EAC1B;AACA,QAAM,aAAmB,eAAQ,MAAM,KAAK,IAAI,CAAC,QAAQ,SAAS,GAAG,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEzF,QAAM,cACJ,QAAQ,UACP,oBAAoB,IAAI,MACxB,mBAAmB,IAAI,MACvB,kBAAkB,IAAI;AAIzB,QAAM,mBAAmB,CAAC,gBAAiE;AACzF,UAAMC,eAAc,oBAAI,IAAoB;AAC5C,UAAMC,gBAAe,oBAAI,IAAoB;AAC7C,QAAI,cAAc;AAClB,QAAIC,oBAAkC;AAEtC,QAAI,mBAAmB;AACrB,MAAAF,aAAY,IAAI,YAAY,WAAW;AACvC,qBAAe;AACf,MAAAE,oBAAmB;AAAA,IACrB;AAEA,QAAI,iBAAiB;AACnB,MAAAF,aAAY,IAAI,YAAY,WAAW;AACvC,qBAAe;AACf,MAAAE,oBAAmB;AAAA,IACrB;AAEA,QAAI,kBAAkB;AACpB,MAAAF,aAAY,IAAI,YAAY,WAAW;AACvC,qBAAe;AACf,MAAAE,oBAAmB;AAAA,IACrB;AAEA,eAAW,OAAO,aAAa;AAC7B,YAAM,KAAKC,aAAY,GAAG;AAC1B,YAAM,MAAM,IAAI,MAAM;AACtB,YAAM,QAAQ,UAAU,EAAE,KAAK,IAAI,MAAM,SAAS;AAClD,UAAI,QAAQ,QAAQ;AAClB,QAAAH,aAAY,IAAI,IAAI,WAAW;AAC/B,uBAAe;AACf,QAAAE,oBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,eAAe;AACnB,QAAIE,sBAAoC;AACxC,aAAS,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AAChD,YAAM,MAAM,YAAY,CAAC;AACzB,UAAI,CAAC,IAAK;AACV,YAAM,KAAKD,aAAY,GAAG;AAC1B,YAAM,MAAM,IAAI,MAAM;AACtB,YAAM,QAAQ,UAAU,EAAE,KAAK,IAAI,MAAM,SAAS;AAClD,UAAI,QAAQ,SAAS;AACnB,QAAAF,cAAa,IAAI,IAAI,YAAY;AACjC,wBAAgB;AAChB,QAAAG,sBAAqB;AAAA,MACvB;AAAA,IACF;AAEA,WAAO,EAAE,aAAAJ,cAAa,cAAAC,eAAc,kBAAAC,mBAAkB,oBAAAE,oBAAmB;AAAA,EAC3E;AAEA,QAAM,EAAE,aAAa,cAAc,kBAAkB,mBAAmB,IACtE,iBAAiB,OAAO;AAI1B,QAAM,CAAC,YAAY,aAAa,IAAI,mBAAmB,MAAM,KAAK,IAAI,CAAC,SAAS;AAC9E,kBAAc,WAAW,OAAO,IAAI,CAAC;AAAA,EACvC,CAAC;AAID,QAAM,CAAC,UAAU,WAAW,IAAU,gBAAS,MAAM,OAAO,WAAW,CAAC;AACxE,EAAM,iBAAU,MAAM,YAAY,OAAO,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;AAErE,QAAM,aAAa,CAAC,QAAsB;AACxC,UAAM,OAAO,OAAO,SAAS,KAAK,EAAE;AACpC,QAAI,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO,YAAY;AACvD,kBAAY,OAAO,WAAW,CAAC;AAC/B;AAAA,IACF;AACA,QAAI,SAAS,aAAa;AACxB,oBAAc,SAAS,OAAO,MAAM,UAAU,CAAC;AAAA,IACjD;AAAA,EACF;AAIA,QAAM,aAAa,CAAC,OAAe,YAAY,UAAgB;AAC7D,UAAM,OAAO,YACT,qBAAqB,OAAO,KAAK,IACjC,gBAAgB,OAAO,KAAK;AAChC,kBAAc,IAAI;AAAA,EACpB;AAIA,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,kBACJ,WAAW,SAAS,KAAK,WAAW,MAAM,CAAC,OAAO,YAAY,IAAI,EAAE,CAAC;AACvE,QAAM,mBACJ,CAAC,mBAAmB,WAAW,KAAK,CAAC,OAAO,YAAY,IAAI,EAAE,CAAC;AAEjE,QAAM,kBAAkB,MAAY;AAClC,QAAI,eAAgB;AACpB,UAAM,OAAO,IAAI,IAAI,WAAW;AAChC,QAAI,iBAAiB;AACnB,iBAAW,MAAM,WAAY,MAAK,OAAO,EAAE;AAAA,IAC7C,OAAO;AACL,iBAAW,MAAM,WAAY,MAAK,IAAI,EAAE;AAAA,IAC1C;AACA,mBAAe,IAAI;AACnB,wBAAoB,MAAM,KAAK,IAAI,GAAG,KAAK;AAAA,EAC7C;AAEA,QAAM,kBAAkB,CAAC,OAAqB;AAC5C,UAAM,OAAO,iBACT,YAAY,IAAI,EAAE,IAChB,oBAAI,IAAY,IAChB,oBAAI,IAAI,CAAC,EAAE,CAAC,IACd,IAAI,IAAI,WAAW;AACvB,QAAI,CAAC,gBAAgB;AACnB,UAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,UAC3B,MAAK,IAAI,EAAE;AAAA,IAClB;AACA,mBAAe,IAAI;AACnB,wBAAoB,MAAM,KAAK,IAAI,GAAG,KAAK;AAAA,EAC7C;AAEA,QAAM,cAAc,MAAY;AAC9B,mBAAe,oBAAI,IAAY,CAAC;AAChC,wBAAoB,CAAC,GAAG,KAAK;AAAA,EAC/B;AAEA,QAAM,kBAAkB,CAAC,OAAqB;AAC5C,oBAAgB,CAAC,SAAS;AACxB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,UAC3B,MAAK,IAAI,EAAE;AAChB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAIA,QAAM,eAAe,CAAC,aAA2B;AAC/C,kBAAc,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,QAAQ,GAAG,KAAK,QAAQ,MAAM,KAAK,EAAE;AAAA,EAC5E;AAIA,QAAM,eAAe,OAAO,WAAyD;AACnF,eAAW,MAAM;AAEjB,QAAI,aAAa;AACf,UAAI;AACF,cAAM,YAAY;AAAA,MACpB,SAAS,KAAK;AACZ,eAAO,SAAS,eAAe,QAAQ,IAAI,UAAU,eAAe;AAAA,MACtE;AACA;AAAA,IACF;AAEA,mBAAe,IAAI;AACnB,WAAO,QAAQ,cAAc;AAC7B,QAAI;AACF,UAAI,aAA+B;AACnC,UAAI,eAAe;AACjB,cAAM,OAAO,MAAM,cAAqB,OAAO,MAAM,SAAS;AAC5D,gBAAM,MAAM,cAAc,eAAe;AAAA,YACvC,GAAG;AAAA,YACH;AAAA,YACA,UAAU,WAAW,IAAI,IAAI,OAAO,MAAM;AAAA,UAC5C,CAAC;AACD,gBAAM,WAAW,MAAM,MAAM,KAAK,EAAE,OAAO,WAAW,CAAC;AACvD,cAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,EAAE;AAC3D,iBAAQ,MAAM,SAAS,KAAK;AAAA,QAC9B,CAAC;AACD,qBAAa,KAAK;AAAA,MACpB;AAEA,YAAM,gBAAgB,gBAAgB,SAAS,UAAU;AACzD,YAAM,SAAS,kBAAkB,sBAAsB,OAAO;AAE9D,UAAI,WAAW,aAAa;AAC1B,cAAM,KAAK,MAAM,gBAAgB,YAAY,aAAa;AAC1D,YAAI,GAAI,QAAO,WAAW,qBAAqB;AAAA,YAC1C,QAAO,SAAS,6BAA6B;AAAA,MACpD,WAAW,WAAW,SAAS;AAC7B,sBAAc;AAAA,UACZ,UAAU;AAAA,UACV;AAAA,UACA,MAAM;AAAA,UACN,SAAS;AAAA,UACT;AAAA,UACA,cAAc,OAAO;AAAA,QACvB,CAAC;AACD,eAAO,WAAW,kBAAkB;AAAA,MACtC,OAAO;AACL,oBAAY,oBAAoB,MAAM,GAAG,YAAY,aAAa;AAClE,eAAO,WAAW,gBAAgB;AAAA,MACpC;AAAA,IACF,QAAQ;AACN,aAAO,SAAS,eAAe;AAAA,IACjC,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAIA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA,UAAU,SAAS,aAAa,UAAU,SAAS,aAAa;AAAA,IAChE;AAAA,EACF,EAAE,OAAO,OAAO;AAEhB,MAAI,OAAO;AACT,WACE,gBAAAN,KAAC,SAAI,WAAW,YAAY,KAAK,GAAG,GAAG,gBAAc,SACnD,0BAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,sBAAAD,KAAC,OAAE,WAAU,kBAAkB,iBAAO,WAAU;AAAA,MAC/C,UACC,gBAAAC,MAAC,YAAO,MAAK,UAAS,WAAU,WAAU,SAAS,SACjD;AAAA,wBAAAD,KAAC,iBAAc,WAAU,YAAW;AAAA,QACpC,gBAAAA,KAAC,UAAM,iBAAO,aAAY;AAAA,SAC5B,IACE;AAAA,OACN,GACF;AAAA,EAEJ;AAEA,QAAM,iBAAiB,OAAO,eAAe;AAE7C,QAAM,cAAc,CAAC,QAAe,MAAY;AAC9C,iBAAa,GAAG;AAAA,EAClB;AAEA,QAAM,aACJ,CAAC,QACD,CAAC,UAAqC;AACpC,QAAI,MAAM,QAAQ,QAAS;AAC3B,UAAM,eAAe;AACrB,iBAAa,GAAG;AAAA,EAClB;AAEF,QAAM,aACJ,qBAAqB,QACrB,QAAQ,KAAK,CAAC,QAAQ,IAAI,MAAM,gBAAgB,MAAS;AAE3D,SACE,gBAAAC,MAAC,SAAI,WAAW,YAAY,KAAK,GAAG,GAAG,gBAAc,SAAS,KAAK,SAEhE;AAAA,kBACC,gBAAAA,MAAC,SAAI,WAAU,eACf;AAAA,sBAAAD,KAAC,SAAI,WAAU,qBACZ,yBACC,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,wBAAAD,KAAC,cAAW,WAAU,mBAAkB;AAAA,QACxC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,cAAc,MAAM,OAAO,KAAK;AAAA,YACrD,aAAa,qBAAqB,OAAO;AAAA,YACzC,cAAY,UAAU,OAAO;AAAA;AAAA,QAC/B;AAAA,QACC,aACC,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,cAAc,EAAE;AAAA,YAC/B,cAAY,OAAO;AAAA,YAEnB;AAAA,8BAAAD,KAAC,SAAM,WAAU,YAAW;AAAA,cAC5B,gBAAAA,KAAC,UAAK,WAAU,eAAe,iBAAO,aAAY;AAAA;AAAA;AAAA,QACpD,IACE;AAAA,SACN,IACE,MACN;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAU,4CACZ;AAAA,2BACC,gBAAAA,MAAC,SAAI,WAAU,iBAAgB,KAAK,YAAY,cAC9C;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,IAAI;AAAA,cACJ,WAAU;AAAA,cACV,KAAK,YAAY;AAAA,cACjB,iBAAc;AAAA,cACd,iBAAe,YAAY;AAAA,cAC3B,SAAS,YAAY;AAAA,cAErB;AAAA,gCAAAD,KAAC,eAAY,WAAU,YAAW;AAAA,gBAClC,gBAAAA,KAAC,UAAM,iBAAO,eAAc;AAAA;AAAA;AAAA,UAC9B;AAAA,UACD,YAAY,SACX,gBAAAC,MAAC,SAAI,WAAU,YAAW,MAAK,QAAO,mBAAiB,iBACrD;AAAA,4BAAAD,KAAC,SAAI,WAAU,kBAAkB,iBAAO,oBAAmB;AAAA,YAC3D,gBAAAA,KAAC,SAAI,WAAU,sBAAqB;AAAA,YACnC,SAAS,IAAI,CAAC,QAAQ;AACrB,oBAAM,KAAKK,aAAY,GAAG;AAC1B,oBAAM,UAAU,WAAW,EAAE,MAAM;AACnC,qBACE,gBAAAJ;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,gBAAc;AAAA,kBACd,SAAS,MAAM,aAAa,EAAE;AAAA,kBAE9B;AAAA,oCAAAD,KAAC,aAAU,WAAU,aAAY;AAAA,oBACjC,gBAAAA,KAAC,UAAM,yBAAe,GAAG,KAAK,IAAG;AAAA;AAAA;AAAA,gBAR5B;AAAA,cASP;AAAA,YAEJ,CAAC;AAAA,aACH,IACE;AAAA,WACN,IACI;AAAA,QAEH,mBACC,gBAAAC,MAAC,SAAI,WAAU,iBAAgB,KAAK,YAAY,cAC9C;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,IAAI;AAAA,cACJ,WAAU;AAAA,cACV,KAAK,YAAY;AAAA,cACjB,iBAAc;AAAA,cACd,iBAAe,YAAY;AAAA,cAC3B,SAAS,YAAY;AAAA,cAErB;AAAA,gCAAAD,KAAC,eAAY,WAAU,YAAW;AAAA,gBAClC,gBAAAA,KAAC,UAAM,wBAAc,OAAO,eAAe,EAAE,QAAQ,CAAC,GAAE;AAAA;AAAA;AAAA,UAC1D;AAAA,UACD,YAAY,SACX,gBAAAA,KAAC,SAAI,WAAU,YAAW,MAAK,QAAO,mBAAiB,iBACpD,oBAAU,IAAI,CAAC,WACd,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,MAAK;AAAA,cACL,gBAAc,YAAY;AAAA,cAC1B,SAAS,MAAM;AACb,2BAAW,MAAM;AACjB,4BAAY,MAAM;AAAA,cACpB;AAAA,cAEA;AAAA,gCAAAD,KAAC,aAAU,WAAU,aAAY;AAAA,gBACjC,gBAAAA,KAAC,UAAM,iBAAO,kBAAkB,MAAM,CAAC,GAAE;AAAA;AAAA;AAAA,YAXpC;AAAA,UAYP,CACD,GACH,IACE;AAAA,WACN,IACI;AAAA,QAEH,kBACC,gBAAAC,MAAC,SAAI,WAAU,iBAAgB,KAAK,WAAW,cAC7C;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,IAAI;AAAA,cACJ,WAAU;AAAA,cACV,KAAK,WAAW;AAAA,cAChB,UAAU;AAAA,cACV,iBAAc;AAAA,cACd,iBAAe,WAAW;AAAA,cAC1B,SAAS,WAAW;AAAA,cAEpB;AAAA,gCAAAD,KAAC,oBAAiB,WAAU,YAAW;AAAA,gBACvC,gBAAAA,KAAC,UAAM,wBAAc,OAAO,kBAAkB,OAAO,cAAa;AAAA,gBAClE,gBAAAA,KAAC,mBAAgB,WAAU,wBAAuB;AAAA;AAAA;AAAA,UACpD;AAAA,UACC,WAAW,SACV,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,mBAAiB;AAAA,cAEjB;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,SAAS,MAAM,KAAK,aAAa,OAAO;AAAA,oBAExC;AAAA,sCAAAD,KAAC,uBAAoB,WAAU,mBAAkB;AAAA,sBACjD,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,wCAAAD,KAAC,YAAQ,iBAAO,kBAAiB;AAAA,wBACjC,gBAAAA,KAAC,WAAO,iBAAO,qBAAoB;AAAA,yBACrC;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,SAAS,MAAM,KAAK,aAAa,KAAK;AAAA,oBAEtC;AAAA,sCAAAD,KAAC,gBAAa,WAAU,iBAAgB;AAAA,sBACxC,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,wCAAAD,KAAC,YAAQ,iBAAO,gBAAe;AAAA,wBAC/B,gBAAAA,KAAC,WAAO,iBAAO,mBAAkB;AAAA,yBACnC;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,SAAS,MAAM,KAAK,aAAa,WAAW;AAAA,oBAE5C;AAAA,sCAAAD,KAAC,gBAAa,WAAU,iBAAgB;AAAA,sBACxC,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,wCAAAD,KAAC,YAAQ,iBAAO,sBAAqB;AAAA,wBACrC,gBAAAA,KAAC,WAAO,iBAAO,yBAAwB;AAAA,yBACzC;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF,IACE;AAAA,WACN,IACE;AAAA,QAEH;AAAA,SACH;AAAA,OACF,IACI;AAAA,IAGJ,gBAAAA,KAAC,SAAI,WAAU,kBACb,0BAAAC,MAAC,WAAM,WAAU,aAAY,cAAY,SACvC;AAAA,sBAAAD,KAAC,WACC,0BAAAC,MAAC,QACE;AAAA,4BACC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,YAAY,IAAI,UAAU,IAAI,wBAAwB;AAAA,cACtD,qBAAqB,aAAa,2BAA2B;AAAA,YAC/D,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,OAAO;AAAA,cACL,OAAO;AAAA,cACP,MAAM,YAAY,IAAI,UAAU;AAAA,YAClC;AAAA,YACA,OAAM;AAAA;AAAA,QACR,IACE;AAAA,QAEH,kBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,YAAY,IAAI,UAAU,IAAI,wBAAwB;AAAA,cACtD,qBAAqB,aAAa,2BAA2B;AAAA,YAC/D,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,OAAO;AAAA,cACL,MAAM,YAAY,IAAI,UAAU;AAAA,YAClC;AAAA,YACA,OAAM;AAAA,YAEL,WAAC,iBACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,KAAK,CAAC,OAAO;AACX,sBAAI,GAAI,IAAG,gBAAgB;AAAA,gBAC7B;AAAA,gBACA,UAAU;AAAA,gBACV,cAAY,OAAO;AAAA;AAAA,YACrB,IACE;AAAA;AAAA,QACN,IACE;AAAA,QAEH,mBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,YAAY,IAAI,UAAU,IAAI,wBAAwB;AAAA,cACtD,qBAAqB,aAAa,2BAA2B;AAAA,YAC/D,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,OAAO;AAAA,cACL,MAAM,YAAY,IAAI,UAAU;AAAA,YAClC;AAAA,YACA,OAAM;AAAA,YAEL,iBAAO;AAAA;AAAA,QACV,IACE;AAAA,QAEH,QAAQ,IAAI,CAAC,KAAK,UAAU;AAC3B,gBAAM,KAAKK,aAAY,GAAG;AAC1B,gBAAM,WAAW,WAAW,GAAG,KAAK,kBAAkB;AACtD,gBAAM,YAAY,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE;AAC5D,gBAAM,WAAW,aAAa,IAAI,MAAM,KAAK,SAAS,IAAI;AAC1D,gBAAM,SAAS,YAAY,aAAa;AACxC,gBAAM,QAAQ,eAAe,GAAG,KAAK;AACrC,gBAAM,OAAO,IAAI;AACjB,gBAAM,eAAe,MAAM,SAAS,EAAE;AACtC,gBAAM,iBAAiB,iBAAiB,UAAa,iBAAiB;AAEtE,gBAAM,cAAc,UAAU,EAAE;AAChC,gBAAM,YAAY,gBAAgB,GAAG;AACrC,gBAAM,UAA+B;AAAA,YACnC,GAAG;AAAA,YACH,GAAI,gBAAgB,SAAY,EAAE,OAAO,GAAG,WAAW,KAAK,IAAI,CAAC;AAAA,YACjE,GAAI,YAAY,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,IAAI,EAAE,EAAE,IAAI,CAAC;AAAA,YAC3D,GAAI,aAAa,IAAI,EAAE,IAAI,EAAE,OAAO,aAAa,IAAI,EAAE,EAAE,IAAI,CAAC;AAAA,UAChE;AAEA,gBAAM,cAAc,CAAC,MAA0C;AAC7D,cAAE,eAAe;AACjB,cAAE,gBAAgB;AAClB,kBAAM,SAAS,EAAE;AACjB,kBAAM,WAAY,EAAE,cAAc,iBAAiC;AACnE,kBAAM,aAAa,WAAW,SAAS,sBAAsB,EAAE,QAAS,eAAe,MAAM,SAAS;AAEtG,kBAAM,SAAS,CAAC,cAA4B;AAC1C,oBAAM,QAAQ,KAAK,IAAI,MAAM,YAAY,IAAI,KAAK,MAAM,cAAc,UAAU,UAAU,OAAO,CAAC;AAClG,2BAAa,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE;AAAA,YACnD;AACA,kBAAM,OAAO,MAAM;AACjB,uBAAS,oBAAoB,eAAe,MAAM;AAClD,uBAAS,oBAAoB,aAAa,IAAI;AAC9C,uBAAS,MAAM,UAAU,OAAO,cAAc;AAAA,YAChD;AACA,qBAAS,MAAM,UAAU,IAAI,cAAc;AAC3C,qBAAS,iBAAiB,eAAe,MAAM;AAC/C,qBAAS,iBAAiB,aAAa,IAAI;AAAA,UAC7C;AAEA,gBAAM,eAAe,YAAY,IAAI,EAAE;AACvC,gBAAM,gBAAgB,aAAa,IAAI,EAAE;AACzC,gBAAM,aAAa,qBAAqB;AACxC,gBAAM,eAAe,uBAAuB;AAE5C,iBACE,gBAAAJ;AAAA,YAAC;AAAA;AAAA,cAEC,OAAM;AAAA,cACN,WAAW;AAAA,gBACT;AAAA,gBACA,WAAW,qBAAqB;AAAA,gBAChC,sBAAsB,sBAAsB;AAAA,gBAC5C,eAAe,wBAAwB;AAAA,gBACvC,gBAAgB,yBAAyB;AAAA,gBACzC,aAAa,2BAA2B;AAAA,gBACxC,eAAe,4BAA4B;AAAA,cAC7C,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cACX,OAAO;AAAA,cACP,aACE,SACI,UAAU,QAAQ,QAChB,cACA,eACF,WACE,SACA;AAAA,cAER,cAAY,SAAS;AAAA,cACrB,UAAU,WAAW,IAAI;AAAA,cACzB,WAAW;AAAA,cACX,aACE,sBACI,CAAC,MAAM;AACL,gCAAgB,EAAE;AAClB,kBAAE,aAAa,QAAQ,cAAc,EAAE;AAAA,cACzC,IACA;AAAA,cAEN,YACE,sBACI,CAAC,MAAM;AACL,kBAAE,eAAe;AAAA,cACnB,IACA;AAAA,cAEN,QACE,sBACI,CAAC,MAAM;AACL,kBAAE,eAAe;AACjB,oBAAI,CAAC,gBAAgB,iBAAiB,GAAI;AAC1C,sBAAM,UAAU,QAAQ,UAAU,CAAC,MAAMI,aAAY,CAAC,MAAM,YAAY;AACxE,sBAAM,QAAQ,QAAQ,UAAU,CAAC,MAAMA,aAAY,CAAC,MAAM,EAAE;AAC5D,oBAAI,WAAW,KAAK,SAAS,GAAG;AAC9B,wBAAM,WAAW,CAAC,GAAG,OAAO;AAC5B,wBAAM,QAAQ,SAAS,OAAO;AAC9B,sBAAI,CAAC,MAAO;AACZ,2BAAS,OAAO,SAAS,CAAC;AAC1B,2BAAS,OAAO,OAAO,GAAG,KAAK;AAC/B,6BAAW,QAAQ;AACnB,wCAAsB,SAAS,IAAIA,YAAW,CAAC;AAAA,gBACjD;AACA,gCAAgB,IAAI;AAAA,cACtB,IACA;AAAA,cAEN,SAAS,WAAW,CAAC,UAAU;AAC7B,sBAAM,IAAI,MAAM;AAChB,oBAAI,GAAG,QAAQ,sBAAsB,KAAK,GAAG,QAAQ,oBAAoB,EAAG;AAC5E,2BAAW,IAAI,MAAM,QAAQ;AAAA,cAC/B,IAAI;AAAA,cACJ,WACE,WACI,CAAC,UAAU;AACT,oBAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,IAAK;AAChD,sBAAM,IAAI,MAAM;AAChB,oBAAI,GAAG,QAAQ,sBAAsB,EAAG;AACxC,sBAAM,eAAe;AACrB,2BAAW,IAAI,MAAM,QAAQ;AAAA,cAC/B,IACA;AAAA,cAGN;AAAA,gCAAAJ,MAAC,SAAI,WAAW,iBAAiB,GAAG,GAClC;AAAA,kCAAAD,KAAC,UAAM,6BAAmB,GAAG,GAAE;AAAA,kBAC9B,WACC,gBAAAC,MAAC,UAAK,WAAU,sBACb;AAAA,6BACC,UAAU,QAAQ,QAChB,gBAAAD,KAAC,eAAY,WAAU,iBAAgB,IAEvC,gBAAAA,KAAC,iBAAc,WAAU,iBAAgB,IAG3C,gBAAAA,KAAC,mBAAgB,WAAU,qCAAoC;AAAA,oBAEhE,MAAM,KAAK,SAAS,KAAK,aAAa,IACrC,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,sBAAY,GAAE,IAC9C;AAAA,qBACN,IACE;AAAA,kBAEH,aAAa,KAAK,mBAAmB,IACpC,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WACE,iBACI,kDACA;AAAA,wBAEN,cAAY,UAAU,KAAK;AAAA,wBAC3B,SAAS,CAAC,MAAM;AACd,4BAAE,gBAAgB;AAClB,2CAAiB,kBAAkB,KAAK,OAAO,EAAE;AAAA,wBACnD;AAAA,wBAEA,0BAAAA,KAAC,oBAAiB,WAAU,YAAW;AAAA;AAAA,oBACzC;AAAA,oBAEC,kBAAkB,KACjB,gBAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,wBAElC;AAAA,0CAAAD;AAAA,4BAAC;AAAA;AAAA,8BACC,WAAS;AAAA,8BACT,MAAK;AAAA,8BACL,WAAU;AAAA,8BACV,cAAc,gBAAgB;AAAA,8BAC9B,aAAa,MAAM,qBAAqB,cAAc,OAAO,yBAAyB,EAAE,QAAQ,MAAM,CAAC;AAAA,8BACvG,cAAY,UAAU,KAAK;AAAA,8BAC3B,UAAU,CAAC,MAAM;AACf,sCAAM,MAAM,EAAE,cAAc,MAAM,YAAY,EAAE,KAAK;AACrD,sCAAM,MAAM,EAAE,cAAc,QAAQ,qBAAqB;AACzD,sCAAM,OAAO,KAAK,iBAA8B,sCAAsC;AACtF,sCAAM,QAAQ,CAAC,QAAQ;AACrB,wCAAM,OAAO,IAAI,aAAa,YAAY,KAAK;AAC/C,sCAAI,MAAM,UAAU,CAAC,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK;AAAA,gCACxD,CAAC;AAAA,8BACH;AAAA,8BACA,WAAW,CAAC,MAAM;AAChB,oCAAI,EAAE,QAAQ,SAAS;AACrB,oCAAE,eAAe;AACjB,wCAAM,MAAO,EAAE,cAAmC,MAAM,KAAK;AAC7D,mDAAiB,IAAI;AACrB,gDAAc,WAAW,OAAO,IAAI,OAAO,MAAS,CAAC;AAAA,gCACvD,WAAW,EAAE,QAAQ,UAAU;AAC7B,oCAAE,eAAe;AACjB,mDAAiB,IAAI;AAAA,gCACvB;AAAA,8BACF;AAAA;AAAA,0BACF;AAAA,0BAEC,MAAM,iBAAiB,KAAK,cAAc,SAAS,IAClD,gBAAAC,MAAC,SAAI,WAAU,8BACb;AAAA,4CAAAD;AAAA,8BAAC;AAAA;AAAA,gCACC,WACE,CAAC,eACG,kDACA;AAAA,gCAEN,SAAS,MAAM;AACb,mDAAiB,IAAI;AACrB,gDAAc,WAAW,OAAO,IAAI,MAAS,CAAC;AAAA,gCAChD;AAAA,gCAEC,iBAAO;AAAA;AAAA,4BACV;AAAA,4BACC,KAAK,cAAc,IAAI,CAAC,QACvB,gBAAAA;AAAA,8BAAC;AAAA;AAAA,gCAEC,WACE,iBAAiB,MACb,kDACA;AAAA,gCAEN,SAAS,MAAM;AACb,mDAAiB,IAAI;AACrB,gDAAc,WAAW,OAAO,IAAI,GAAG,CAAC;AAAA,gCAC1C;AAAA,gCAEC;AAAA;AAAA,8BAXI;AAAA,4BAYP,CACD;AAAA,6BACH,IACE;AAAA,0BAEJ,gBAAAC,MAAC,SAAI,WAAU,8BACb;AAAA,4CAAAA;AAAA,8BAAC;AAAA;AAAA,gCACC,MAAK;AAAA,gCACL,WAAU;AAAA,gCACV,SAAS,CAAC,MAAM;AACd,oCAAE,gBAAgB;AAClB,mDAAiB,IAAI;AACrB,gDAAc,WAAW,OAAO,IAAI,MAAS,CAAC;AAAA,gCAChD;AAAA,gCAEA;AAAA,kDAAAD,KAAC,iBAAc,WAAU,YAAW;AAAA,kCACpC,gBAAAA,KAAC,UAAM,iBAAO,aAAY;AAAA;AAAA;AAAA,4BAC5B;AAAA,4BACA,gBAAAC;AAAA,8BAAC;AAAA;AAAA,gCACC,MAAK;AAAA,gCACL,WAAU;AAAA,gCACV,SAAS,CAAC,MAAM;AACd,oCAAE,gBAAgB;AAClB,wCAAM,SAAU,EAAE,cAA8B,QAAQ,qBAAqB;AAC7E,wCAAM,UAAU,QAAQ,cAAc,OAAO;AAC7C,wCAAM,MAAM,SAAS,MAAM,KAAK;AAChC,mDAAiB,IAAI;AACrB,gDAAc,WAAW,OAAO,IAAI,OAAO,MAAS,CAAC;AAAA,gCACvD;AAAA,gCAEA;AAAA,kDAAAD,KAAC,aAAU,WAAU,YAAW;AAAA,kCAChC,gBAAAA,KAAC,UAAM,iBAAO,aAAY;AAAA;AAAA;AAAA,4BAC5B;AAAA,6BACF;AAAA;AAAA;AAAA,oBACF,IACE;AAAA,qBACN,IACE;AAAA,mBACN;AAAA,gBAEC,qBACC,gBAAAA,KAAC,SAAI,WAAU,qBAAoB,eAAe,aAAa,IAC7D;AAAA;AAAA;AAAA,YA5NC,MAAM,OAAO,KAAK;AAAA,UA6NzB;AAAA,QAEJ,CAAC;AAAA,SACH,GACF;AAAA,MAEA,gBAAAA,KAAC,WACE,sBACC,gBAAAA,KAAC,QACC,0BAAAC,MAAC,QAAG,WAAU,aAAY,SAAS,KAAK,IAAI,GAAG,WAAW,GACxD;AAAA,wBAAAA,MAAC,SAAI,WAAU,qBAAoB,eAAY,QAC7C;AAAA,0BAAAD,KAAC,UAAK,WAAU,WAAU;AAAA,UAC1B,gBAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,UAC1B,gBAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,UAC1B,gBAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,WAC5B;AAAA,QACA,gBAAAA,KAAC,SAAI,WAAU,oBAAmB,aAAU,UAAU,iBAAO,aAAY;AAAA,SAC3E,GACF,IACE,KAAK,WAAW,IAClB,gBAAAA,KAAC,QACC,0BAAAA,KAAC,QAAG,WAAU,aAAY,SAAS,KAAK,IAAI,GAAG,WAAW,GACvD,iBAAO,WACV,GACF,IAEA,KAAK,IAAI,CAAC,KAAK,UAAU;AACvB,cAAM,KAAK,WAAW,KAAK,KAAK,OAAO,KAAK;AAC5C,cAAM,aAAa,YAAY,IAAI,EAAE;AACrC,cAAM,aAAa,aAAa,IAAI,EAAE;AAEtC,eACE,gBAAAC,MAAO,iBAAN,EACC;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,aAAa,sBAAsB;AAAA,gBACnC,aAAa,sBAAsB;AAAA,gBACnC,iBAAiB,uBAAuB;AAAA,cAC1C,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cACX,SAAS,iBAAiB,YAAY,GAAG,IAAI;AAAA,cAC7C,WAAW,iBAAiB,WAAW,GAAG,IAAI;AAAA,cAC9C,UAAU,iBAAiB,IAAI;AAAA,cAE9B;AAAA,oCACC,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,YAAY,IAAI,UAAU,IAAI,wBAAwB;AAAA,sBACtD,qBAAqB,aAAa,2BAA2B;AAAA,oBAC/D,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,oBACX,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,MAAM,YAAY,IAAI,UAAU;AAAA,oBAClC;AAAA,oBACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,oBAElC,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAW,aAAa,wCAAwC;AAAA,wBAChE,cAAY,aAAa,iBAAiB;AAAA,wBAC1C,SAAS,CAAC,MAAM;AACd,4BAAE,gBAAgB;AAClB,0CAAgB,EAAE;AAAA,wBACpB;AAAA,wBAEA,0BAAAA,KAAC,oBAAiB,WAAU,YAAW;AAAA;AAAA,oBACzC;AAAA;AAAA,gBACF,IACE;AAAA,gBAEH,kBACC,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,YAAY,IAAI,UAAU,IAAI,wBAAwB;AAAA,sBACtD,qBAAqB,aAAa,2BAA2B;AAAA,oBAC/D,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,oBACX,OAAO;AAAA,sBACL,MAAM,YAAY,IAAI,UAAU;AAAA,oBAClC;AAAA,oBACA,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,oBAE1C,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAM,iBAAiB,UAAU;AAAA,wBACjC,MAAM,iBAAiB,GAAG,UAAU,YAAY;AAAA,wBAChD,WAAU;AAAA,wBACV,SAAS;AAAA,wBACT,UAAU,MAAM,gBAAgB,EAAE;AAAA,wBAClC,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,wBAC1C,cAAY,cAAc,OAAO,gBAAgB,EAAE,GAAG,CAAC;AAAA;AAAA,oBACzD;AAAA;AAAA,gBACF,IACE;AAAA,gBAEH,mBACC,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,sBACT;AAAA,sBACA,YAAY,IAAI,UAAU,IAAI,wBAAwB;AAAA,sBACtD,qBAAqB,aAAa,2BAA2B;AAAA,oBAC/D,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,oBACX,OAAO;AAAA,sBACL,MAAM,YAAY,IAAI,UAAU;AAAA,oBAClC;AAAA,oBAEC,uBAAa,aAAa,UAAU,KAAK;AAAA;AAAA,gBAC5C,IACE;AAAA,gBAEH,QAAQ,IAAI,CAAC,KAAK,aAAa;AAC9B,wBAAM,QAAQK,aAAY,GAAG;AAC7B,wBAAM,eAAe,YAAY,IAAI,KAAK;AAC1C,wBAAM,gBAAgB,aAAa,IAAI,KAAK;AAC5C,wBAAM,aAAa,qBAAqB;AACxC,wBAAM,eAAe,uBAAuB;AAC5C,wBAAM,iBAAiB,WAAW,GAAG;AACrC,wBAAM,qBACJ,aAAa,UAAU,MAAM,aAAa,aAAa;AAEzD,wBAAM,UAA+B;AAAA,oBACnC,GAAG,cAAc,GAAG;AAAA,oBACpB,GAAI,eAAe,EAAE,MAAM,YAAY,IAAI,KAAK,EAAE,IAAI,CAAC;AAAA,oBACvD,GAAI,gBAAgB,EAAE,OAAO,aAAa,IAAI,KAAK,EAAE,IAAI,CAAC;AAAA,kBAC5D;AAEA,yBACE,gBAAAL;AAAA,oBAAC;AAAA;AAAA,sBAEC,WAAW;AAAA,wBACT;AAAA,wBACA,iBAAiB,uBAAuB;AAAA,wBACxC,eAAe,wBAAwB;AAAA,wBACvC,gBAAgB,yBAAyB;AAAA,wBACzC,aAAa,2BAA2B;AAAA,wBACxC,eAAe,4BAA4B;AAAA,sBAC7C,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,sBACX,OAAO;AAAA,sBACP,eACE,iBACI,CAAC,MAAM;AACL,0BAAE,gBAAgB;AAClB,uCAAe,EAAE,OAAO,IAAI,UAAU,MAAM,CAAC;AAAA,sBAC/C,IACA;AAAA,sBAGL,+BACC,gBAAAC;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,0BAEjC;AAAA,gCAAI,MAAM,aAAa,YAAY,IAAI,KAAK,cAC3C,gBAAAD;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAS;AAAA,gCACT,WAAU;AAAA,gCACV,cAAc,OAAQ,IAAgC,KAAK,KAAK,EAAE;AAAA,gCAClE,IAAI,GAAG,UAAU,SAAS,EAAE,IAAI,KAAK;AAAA,gCAEpC,cAAI,KAAK,YAAY,IAAI,CAAC,QACzB,gBAAAA,KAAC,YAAiB,OAAO,KACtB,iBADU,GAEb,CACD;AAAA;AAAA,4BACH,IAEA,gBAAAA;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAS;AAAA,gCACT,MAAM,IAAI,MAAM,aAAa,WAAW,WAAW;AAAA,gCACnD,WAAU;AAAA,gCACV,cAAc,OAAQ,IAAgC,KAAK,KAAK,EAAE;AAAA,gCAClE,IAAI,GAAG,UAAU,SAAS,EAAE,IAAI,KAAK;AAAA,gCACrC,WAAW,CAAC,MAAM;AAChB,sCAAI,EAAE,QAAQ,SAAS;AACrB,sCAAE,eAAe;AACjB,0CAAM,KAAK,EAAE;AACb,0CAAM,MAAM,IAAI,MAAM,aAAa,WAAW,OAAO,GAAG,KAAK,IAAI,GAAG;AACpE,0CAAM,SAAU,IAAgC,KAAK;AACrD,oCAAC,IAAgC,KAAK,IAAI;AAC1C,iDAAa,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,UAAU,IAAI,CAAC;AACtE,mDAAe,IAAI;AAAA,kCACrB,WAAW,EAAE,QAAQ,UAAU;AAC7B,sCAAE,eAAe;AACjB,mDAAe,IAAI;AAAA,kCACrB;AAAA,gCACF;AAAA;AAAA,4BACF;AAAA,4BAEF,gBAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,8CAAAD;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAU;AAAA,kCACV,SAAS,CAAC,MAAM;AACd,sCAAE,gBAAgB;AAClB,0CAAM,KAAK,SAAS,eAAe,GAAG,UAAU,SAAS,EAAE,IAAI,KAAK,EAAE;AACtE,wCAAI,IAAI;AACN,4CAAM,MAAM,IAAI,MAAM,aAAa,WAAW,OAAO,GAAG,KAAK,IAAI,GAAG;AACpE,4CAAM,SAAU,IAAgC,KAAK;AACrD,sCAAC,IAAgC,KAAK,IAAI;AAC1C,mDAAa,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,UAAU,IAAI,CAAC;AAAA,oCACxE;AACA,mDAAe,IAAI;AAAA,kCACrB;AAAA,kCAEA,0BAAAA,KAAC,aAAU,WAAU,YAAW;AAAA;AAAA,8BAClC;AAAA,8BACA,gBAAAA;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAU;AAAA,kCACV,SAAS,CAAC,MAAM;AACd,sCAAE,gBAAgB;AAClB,mDAAe,IAAI;AAAA,kCACrB;AAAA,kCAEA,0BAAAA,KAAC,SAAM,WAAU,YAAW;AAAA;AAAA,8BAC9B;AAAA,+BACF;AAAA;AAAA;AAAA,sBACF,IAEA,kBAAkB,KAAK,KAAK,UAAU;AAAA;AAAA,oBA7FnC,SAAS,OAAO,QAAQ;AAAA,kBA+F/B;AAAA,gBAEJ,CAAC;AAAA;AAAA;AAAA,UACH;AAAA,UACC,cAAc,oBACb,gBAAAA,KAAC,QAAG,WAAU,oBACZ,0BAAAA,KAAC,QAAG,WAAU,qBAAoB,SAAS,aACzC,0BAAAA,KAAC,SAAI,WAAU,oBACZ,4BAAkB,GAAG,GACxB,GACF,GACF,IACE;AAAA,aAnNe,MAAM,KAoN3B;AAAA,MAEJ,CAAC,GAEL;AAAA,OACF,GACF;AAAA,IAQA,gBAAAA,KAAC,SAAI,WAAU,aACZ,sBACC,gBAAAA,KAAC,SAAI,WAAU,YACb,0BAAAC,MAAC,SAAI,WAAU,aACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,qBAAoB,eAAY,QAC7C;AAAA,wBAAAD,KAAC,UAAK,WAAU,WAAU;AAAA,QAC1B,gBAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,QAC1B,gBAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,QAC1B,gBAAAA,KAAC,UAAK,WAAU,WAAU;AAAA,SAC5B;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAU,oBAAmB,aAAU,UAAU,iBAAO,aAAY;AAAA,OAC3E,GACF,IACE,KAAK,WAAW,IAClB,gBAAAA,KAAC,SAAI,WAAU,YACb,0BAAAA,KAAC,SAAI,WAAU,aAAa,iBAAO,WAAU,GAC/C,IAEA,KAAK,IAAI,CAAC,KAAK,UAAU;AACvB,YAAM,KAAK,WAAW,KAAK,KAAK,OAAO,KAAK;AAC5C,YAAM,aAAa,YAAY,IAAI,EAAE;AAErC,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA,aAAa,uBAAuB;AAAA,YACpC,iBAAiB,wBAAwB;AAAA,UAC3C,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,SAAS,iBAAiB,YAAY,GAAG,IAAI;AAAA,UAC7C,WAAW,iBAAiB,WAAW,GAAG,IAAI;AAAA,UAC9C,UAAU,iBAAiB,IAAI;AAAA,UAE9B;AAAA,gCAAoB,kBACnB,gBAAAA,MAAC,SAAI,WAAU,iBACZ;AAAA,iCACC,gBAAAA,MAAC,UAAK,WAAU,mBAAkB;AAAA;AAAA,gBAC9B,aAAa,aAAa,UAAU,KAAK;AAAA,iBAC7C,IACE;AAAA,cACH,kBACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,kBAE1C,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS;AAAA,sBACT,UAAU,MAAM,gBAAgB,EAAE;AAAA,sBAClC,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,sBAC1C,cAAY,cAAc,OAAO,gBAAgB,EAAE,GAAG,CAAC;AAAA;AAAA,kBACzD;AAAA;AAAA,cACF,IACE;AAAA,eACN,IACE;AAAA,YAEJ,gBAAAA,KAAC,QAAG,WAAU,iBACX,kBAAQ,IAAI,CAAC,KAAK,aAAa;AAC9B,oBAAM,QAAQK,aAAY,GAAG;AAC7B,qBACE,gBAAAJ,MAAC,SAAqC,WAAU,gBAC9C;AAAA,gCAAAD,KAAC,QAAI,yBAAe,GAAG,KAAK,OAAM;AAAA,gBAClC,gBAAAA,KAAC,QAAI,4BAAkB,KAAK,KAAK,UAAU,GAAE;AAAA,mBAFrC,SAAS,OAAO,QAAQ,EAGlC;AAAA,YAEJ,CAAC,GACH;AAAA;AAAA;AAAA,QA/CK,MAAM;AAAA,MAgDb;AAAA,IAEJ,CAAC,GAEL;AAAA,IAGC,aACC,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,aACb;AAAA,wBAAAD,KAAC,UACE,yBAAe,OAAO,cAAc;AAAA,UACnC,OAAO,gBAAAA,KAAC,YAAQ,gBAAM,OAAM;AAAA,UAC5B,KAAK,gBAAAA,KAAC,YAAQ,gBAAM,KAAI;AAAA,UACxB,OAAO,gBAAAA,KAAC,YAAO,WAAU,mBAAmB,gBAAM,eAAe,GAAE;AAAA,QACrE,CAAC,GACH;AAAA,QACC,YAAY,OAAO,IAClB,gBAAAA,KAAC,UAAK,WAAU,sBACb,wBAAc,OAAO,eAAe,EAAE,OAAO,YAAY,KAAK,CAAC,GAClE,IACE;AAAA,SACN;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAU,kBACZ;AAAA,+BACC,gBAAAA,MAAC,SAAI,WAAU,qBACb;AAAA,0BAAAD,KAAC,UAAM,iBAAO,aAAY;AAAA,UAC1B,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,OAAO,QAAQ;AAAA,cACtB,UAAU,CAAC,UAAU;AACnB,8BAAc,aAAa,OAAO,OAAO,SAAS,MAAM,OAAO,OAAO,EAAE,CAAC,CAAC;AAAA,cAC5E;AAAA,cACA,cAAY,OAAO;AAAA,cAElB,qBAAW,IAAI,CAAC,SACf,gBAAAC,MAAC,YAAkB,OAAO,MACvB;AAAA;AAAA,gBAAK;AAAA,mBADK,IAEb,CACD;AAAA;AAAA,UACH;AAAA,WACF,IACE;AAAA,QAEH,sBACC,gBAAAA,MAAC,SAAI,WAAU,aACb;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU,eAAe;AAAA,cACzB,SAAS,MAAM,cAAc,SAAS,OAAO,cAAc,GAAG,UAAU,CAAC;AAAA,cACzE,cAAY,OAAO;AAAA,cAEnB;AAAA,gCAAAD,KAAC,mBAAgB,MAAM,IAAI;AAAA,gBAC3B,gBAAAA,KAAC,UAAK,WAAU,eAAe,iBAAO,cAAa;AAAA;AAAA;AAAA,UACrD;AAAA,UAEC,UAAU;AAAA,YAAI,CAAC,MAAM,UACpB,SAAS,QACP,gBAAAA,KAAC,UAA0B,WAAU,qBAAoB,sBAA9C,OAAO,KAAK,EAEvB,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WACE,SAAS,cAAc,uCAAuC;AAAA,gBAEhE,SAAS,MAAM,cAAc,SAAS,OAAO,MAAM,UAAU,CAAC;AAAA,gBAC9D,cAAY,cAAc,OAAO,WAAW,EAAE,MAAM,KAAK,CAAC;AAAA,gBAC1D,gBAAc,SAAS,cAAc,SAAS;AAAA,gBAE7C;AAAA;AAAA,cATI,QAAQ,IAAI;AAAA,YAUnB;AAAA,UAEJ;AAAA,UAEA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU,eAAe;AAAA,cACzB,SAAS,MAAM,cAAc,SAAS,OAAO,cAAc,GAAG,UAAU,CAAC;AAAA,cACzE,cAAY,OAAO;AAAA,cAEnB;AAAA,gCAAAD,KAAC,oBAAiB,MAAM,IAAI;AAAA,gBAC5B,gBAAAA,KAAC,UAAK,WAAU,eAAe,iBAAO,UAAS;AAAA;AAAA;AAAA,UACjD;AAAA,WACF,IACE;AAAA,QAEH,sBACC,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,UAAU,CAAC,UAAU;AACnB,oBAAM,eAAe;AACrB,yBAAW,QAAQ;AAAA,YACrB;AAAA,YAEA;AAAA,8BAAAD,KAAC,WAAM,WAAU,kBAAiB,SAAS,aACxC,iBAAO,UACV;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,KAAK;AAAA,kBACL,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,UAAU,YAAY,MAAM,OAAO,KAAK;AAAA,kBACnD,QAAQ,MAAM,WAAW,QAAQ;AAAA,kBACjC,cAAY,OAAO;AAAA;AAAA,cACrB;AAAA;AAAA;AAAA,QACF,IACE;AAAA,SACN;AAAA,OACF,IACE;AAAA,KACN;AAEJ;AAEO,IAAM,UAAU;;;AKh8CvB,SAAS,WAAAO,UAAS,YAAAC,iBAAgB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AA8BA,SAAS,gBACd,SACA,SACA;AACA,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAqB,OAAO;AAAA,IACpD,GAAG,aAAa;AAAA,IAChB,GAAG,SAAS;AAAA,EACd,EAAE;AAEF,QAAM,OAAOD;AAAA,IACX,MAAM,gBAAgB,SAAS,OAAO,OAAO;AAAA,IAC7C,CAAC,SAAS,OAAO,OAAO;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,eAAe;AAAA,IACf,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,IACf,YAAY,KAAK;AAAA,IACjB;AAAA,EACF;AACF;AAEO,IAAM,mBAAmB;;;AChBhC;AAAA,EAEE,mBAAAE;AAAA,EAEA,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EAGA,mBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,cAAAC;AAAA,EAEA,iBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EAEA;AAAA,EACA,iBAAAC;AAAA,OACK;","names":["React","getColumnId","jsx","React","React","jsx","jsxs","leftOffsets","rightOffsets","lastLeftPinnedId","getColumnId","firstRightPinnedId","useMemo","useState","queryClientData","defaultQuery","buildQueryUrl","primarySort","withToggledSort","withToggledMultiSort","withSearch","withPage","withPageSize","withFilter","totalPagesFor","isPageSize","PAGE_SIZES","resolveLocale"]}
|
|
1
|
+
{"version":3,"sources":["../src/table-x.tsx","../src/icons.tsx","../src/render.tsx","../src/use-debounced-search.ts","../src/use-dropdown.ts","../src/use-client-table-x.ts","../src/index.ts"],"sourcesContent":["// `<NexGrid />` — the React adapter.\n//\n// The component is a VIEW over a `QueryState`. It owns only what the server\n// cannot know: which menus are open, which columns the user hid, how dense the\n// rows are, which rows are ticked, and the half-typed contents of the search\n// box. Everything that changes which records exist — page, size, sort, search,\n// filters — is handed to `onQueryChange` and comes back as props.\n//\n// That split is what makes the grid honest about server-driven data. There is\n// no local sort that silently reorders one page out of a thousand, and no\n// client filter that hides rows the total still counts. It also means the URL,\n// a router, or a query cache can own the state instead of the component.\n//\n// Every query mutation goes through core's reducers rather than object\n// spreads, so the \"search resets to page 1\" and \"sort cycles asc → desc → off\"\n// rules are defined once for React, Angular and vanilla alike.\n\nimport * as React from \"react\";\nimport {\n DENSITIES,\n PAGE_SIZES,\n buildQueryUrl,\n computeAggregation,\n downloadCsv,\n downloadExcel,\n fetchAllPages,\n filePrefixFromCaption,\n formatMessage,\n getColumnId,\n getColumnTitle,\n getPageNumbers,\n getRecordRange,\n initialHiddenColumns,\n isEditable,\n isExportable,\n isFilterable,\n isHideable,\n isPageSize,\n isPinned,\n isSortable,\n primarySort,\n resolveLocale,\n serialNumber,\n timestampedFilename,\n toExportColumns,\n totalPagesFor,\n visibleColumns,\n withFilter,\n withPage,\n withPageSize,\n withSearch,\n withToggledSort,\n withToggledMultiSort,\n copyToClipboard,\n clearGridState,\n loadGridState,\n saveGridState,\n getCellValue,\n getCellText,\n queryClientData,\n defaultQuery,\n flattenColumns,\n hasHeaderGroups,\n buildHeaderRows,\n type Density,\n type PagedResponse,\n type TableXColumn,\n type QueryState,\n type SortSpec,\n} from \"@nexgrid/core\";\n\nimport {\n ArrowDownIcon,\n ArrowUpDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n ColumnsIcon,\n DensityIcon,\n DotsVerticalIcon,\n DownloadIcon,\n DownloadTrayIcon,\n EditIcon,\n EyeIcon,\n FileSpreadsheetIcon,\n FileTextIcon,\n FilterIcon,\n FunnelIcon,\n MoreVerticalIcon,\n RotateCcwIcon,\n SearchIcon,\n SlidersIcon,\n TrashIcon,\n XIcon,\n} from \"./icons.js\";\nimport {\n bodyCellStyle,\n headerCellStyle,\n headerInnerClass,\n renderCellContent,\n renderColumnHeader,\n renderTemplate,\n} from \"./render.js\";\nimport { useDebouncedSearch } from \"./use-debounced-search.js\";\nimport { useDropdown } from \"./use-dropdown.js\";\nimport type { TableXNoticeType, TableXProps, TableXReactColumn } from \"./types.js\";\n\n/** Fallback row identity: the `id` property, else the row's own string form. */\nfunction defaultRowId<TData>(row: TData): string {\n const record = row as Record<string, unknown> | null | undefined;\n const id = record === null || record === undefined ? undefined : record[\"id\"];\n return String(id ?? row);\n}\n\n/** Density -> the locale key holding its menu label. */\nconst DENSITY_LABEL_KEY = {\n compact: \"densityCompact\",\n default: \"densityDefault\",\n comfortable: \"densityComfortable\",\n} as const satisfies Record<Density, string>;\n\n/**\n * A server-driven data grid: search, sorting, column visibility, density,\n * selection, exports, a responsive card layout, and a paginated footer.\n *\n * `data`, `total`, `query` and `onQueryChange` are controlled by the host — the\n * grid renders the page it is given and never fetches on its own (the one\n * exception being {@link TableXProps.fetchEndpoint}, used to page in the rest\n * of the dataset for an export).\n *\n * @example\n * ```tsx\n * const [query, setQuery] = useState(defaultQuery());\n * <NexGrid\n * caption=\"Students\"\n * columns={columns}\n * data={page.items}\n * total={page.total}\n * query={query}\n * onQueryChange={setQuery}\n * />\n * ```\n */\nexport function TableX<TData>(props: TableXProps<TData>): React.JSX.Element {\n const {\n columns,\n data,\n total: totalProp,\n query: queryProp,\n onQueryChange: onQueryChangeProp,\n clientSidePagination,\n paginationMode,\n caption,\n density: initialDensity = \"default\",\n isLoading = false,\n error = false,\n onRetry,\n enableSelection = false,\n selectionMode = \"multi\",\n enableColumnFilters = true,\n enableColumnResize = true,\n onSelectionChange,\n enableSearch = true,\n searchPlaceholder,\n enableColumns = true,\n showColumnsButton,\n enableDensity = true,\n showDensityButton,\n enableExport = true,\n showExportButton,\n enableSorting = true,\n enablePagination = true,\n showPagination,\n enableRowsPerPage = true,\n showRowsPerPage,\n enableJumpToPage = true,\n showJumpToPage,\n showToolbar = true,\n showFooter = true,\n renderExpandedRow,\n enableBulkActions = true,\n bulkActions,\n enableSummaryRow,\n enableColumnReorder = false,\n onColumnOrderChange,\n onCellEdit,\n storageKey,\n showFilterPills = true,\n toolbarActions,\n onRowClick,\n getRowId = defaultRowId,\n className,\n showSerialNumber = true,\n exportFileName,\n onExportAll,\n fetchEndpoint,\n badgeRules,\n locale: localeOverrides,\n onNotify,\n theme = \"light\",\n } = props;\n\n const isClientSide =\n clientSidePagination === true ||\n paginationMode === \"client\" ||\n (onQueryChangeProp === undefined && queryProp === undefined);\n\n const [internalQuery, setInternalQuery] = React.useState<QueryState>(() => queryProp ?? defaultQuery());\n const query = queryProp ?? internalQuery;\n\n const onQueryChange = React.useCallback(\n (next: QueryState) => {\n setInternalQuery(next);\n onQueryChangeProp?.(next);\n },\n [onQueryChangeProp],\n );\n\n const clientPaged = React.useMemo(() => {\n if (!isClientSide) return null;\n return queryClientData(data, query);\n }, [isClientSide, data, query]);\n\n const rows = isClientSide ? (clientPaged?.items ?? data) : data;\n const total = isClientSide ? (clientPaged?.total ?? data.length) : (totalProp ?? data.length);\n const locale = resolveLocale(localeOverrides);\n const boolLabels = { yes: locale.booleanYes, no: locale.booleanNo };\n\n const isColumnsVisible = enableColumns && showColumnsButton !== false;\n const isDensityVisible = enableDensity && showDensityButton !== false;\n const isExportVisible = enableExport && showExportButton !== false;\n const isPaginationVisible = enablePagination && showPagination !== false;\n const isRowsPerPageVisible = enableRowsPerPage && showRowsPerPage !== false;\n const isJumpToPageVisible = enableJumpToPage && showJumpToPage !== false;\n\n const [colList, setColList] = React.useState(columns);\n React.useEffect(() => {\n setColList(columns);\n }, [columns]);\n\n const [density, setDensity] = React.useState<Density>(initialDensity);\n const [hiddenCols, setHiddenCols] = React.useState<Record<string, boolean>>(() =>\n initialHiddenColumns(flattenColumns(columns)),\n );\n const [selectedIds, setSelectedIds] = React.useState<ReadonlySet<string>>(\n () => new Set<string>(),\n );\n const [expandedRows, setExpandedRows] = React.useState<ReadonlySet<string>>(\n () => new Set<string>(),\n );\n const [editingCell, setEditingCell] = React.useState<{ rowId: string; columnId: string } | null>(null);\n const [draggedColId, setDraggedColId] = React.useState<string | null>(null);\n const [isExporting, setIsExporting] = React.useState(false);\n const [openFilterCol, setOpenFilterCol] = React.useState<string | null>(null);\n const [colWidths, setColWidths] = React.useState<Record<string, number>>({});\n\n // Restore persisted state on mount\n React.useEffect(() => {\n if (!storageKey) return;\n const persisted = loadGridState(storageKey);\n if (persisted) {\n if (persisted.density) setDensity(persisted.density);\n if (persisted.columnWidths) setColWidths(persisted.columnWidths);\n if (persisted.hiddenColumns && Array.isArray(persisted.hiddenColumns)) {\n const hiddenMap: Record<string, boolean> = {};\n for (const col of columns) {\n const id = getColumnId(col);\n if (id) hiddenMap[id] = persisted.hiddenColumns.includes(id);\n }\n setHiddenCols(hiddenMap);\n }\n if (persisted.columnOrder && Array.isArray(persisted.columnOrder)) {\n const colMap = new Map<string, TableXReactColumn<TData>>(columns.map((c) => [getColumnId(c), c]));\n const reordered: TableXReactColumn<TData>[] = [];\n for (const id of persisted.columnOrder) {\n const col = colMap.get(id);\n if (col) {\n reordered.push(col);\n colMap.delete(id);\n }\n }\n for (const remaining of colMap.values()) {\n reordered.push(remaining);\n }\n if (reordered.length === columns.length) {\n setColList(reordered);\n }\n }\n }\n }, [storageKey, columns]);\n\n // Persist state changes\n React.useEffect(() => {\n if (!storageKey) return;\n const hiddenList = Object.entries(hiddenCols)\n .filter(([_, isHidden]) => isHidden)\n .map(([id]) => id);\n saveGridState(storageKey, {\n density,\n columnWidths: colWidths,\n columnOrder: colList.map(getColumnId).filter(Boolean) as string[],\n hiddenColumns: hiddenList,\n });\n }, [storageKey, density, hiddenCols, colList, colWidths]);\n\n const columnsMenu = useDropdown();\n const densityMenu = useDropdown();\n const exportMenu = useDropdown();\n\n const handleResetView = React.useCallback(() => {\n if (storageKey) {\n clearGridState(storageKey);\n }\n setDensity(initialDensity);\n setColWidths({});\n setColList(columns);\n setHiddenCols(initialHiddenColumns(flattenColumns(columns)));\n columnsMenu.close();\n }, [storageKey, initialDensity, columns, columnsMenu]);\n\n const leafCols = React.useMemo(() => flattenColumns(colList), [colList]);\n\n const autoFitColumn = React.useCallback((id: string) => {\n const col = leafCols.find((c) => getColumnId(c) === id);\n if (!col) return;\n const meta = col.meta ?? {};\n let maxContentWidth = 0;\n const headerTitle = getColumnTitle(col) || id;\n maxContentWidth = Math.max(maxContentWidth, headerTitle.length * 8.5 + 50);\n\n for (const row of rows) {\n const rawVal = getCellValue(col, row);\n const val = getCellText(rawVal);\n if (val) {\n maxContentWidth = Math.max(maxContentWidth, String(val).length * 8 + 26);\n }\n }\n\n const minW = meta.minWidth ?? 60;\n const maxW = 550;\n const finalWidth = Math.min(maxW, Math.max(minW, Math.round(maxContentWidth)));\n\n setColWidths((prev) => ({ ...prev, [id]: finalWidth }));\n }, [leafCols, rows]);\n\n const instanceId = React.useId();\n const columnsButtonId = `${instanceId}-columns`;\n const densityButtonId = `${instanceId}-density`;\n const exportButtonId = `${instanceId}-export`;\n const jumpInputId = `${instanceId}-jump`;\n const rootRef = React.useRef<HTMLDivElement>(null);\n\n const notify = (type: TableXNoticeType, message: string): void => {\n onNotify?.({ type, message });\n };\n\n // ---- Derived query state -------------------------------------------------\n\n const currentPage = Math.max(1, query.page);\n const pageSize = query.pageSize;\n const totalPages = totalPagesFor(total, pageSize);\n const range = getRecordRange(currentPage, pageSize, total);\n const sort = primarySort(query);\n\n const headerRows = React.useMemo(\n () => buildHeaderRows(colList, hiddenCols),\n [colList, hiddenCols],\n );\n const visible = React.useMemo(\n () => visibleColumns(leafCols, hiddenCols),\n [leafCols, hiddenCols],\n );\n const hideable = React.useMemo(() => leafCols.filter(isHideable), [leafCols]);\n const pageItems = React.useMemo(\n () => getPageNumbers(currentPage, totalPages),\n [currentPage, totalPages],\n );\n const pageRowIds = React.useMemo(() => rows.map((row) => getRowId(row)), [rows, getRowId]);\n\n const columnCount =\n visible.length +\n (renderExpandedRow ? 1 : 0) +\n (showSerialNumber ? 1 : 0) +\n (enableSelection ? 1 : 0);\n\n // ---- Pinned offsets helper -----------------------------------------------\n\n const getPinnedOffsets = (visibleCols: readonly TableXColumn<TData, React.ReactNode>[]) => {\n const leftOffsets = new Map<string, number>();\n const rightOffsets = new Map<string, number>();\n let currentLeft = 0;\n let lastLeftPinnedId: string | null = null;\n\n if (renderExpandedRow) {\n leftOffsets.set(\"__expand\", currentLeft);\n currentLeft += 40;\n lastLeftPinnedId = \"__expand\";\n }\n\n if (enableSelection) {\n leftOffsets.set(\"__select\", currentLeft);\n currentLeft += 44;\n lastLeftPinnedId = \"__select\";\n }\n\n if (showSerialNumber) {\n leftOffsets.set(\"__serial\", currentLeft);\n currentLeft += 56;\n lastLeftPinnedId = \"__serial\";\n }\n\n for (const col of visibleCols) {\n const id = getColumnId(col);\n const pin = col.meta?.pinned;\n const width = colWidths[id] ?? col.meta?.width ?? 140;\n if (pin === \"left\") {\n leftOffsets.set(id, currentLeft);\n currentLeft += width;\n lastLeftPinnedId = id;\n }\n }\n\n let currentRight = 0;\n let firstRightPinnedId: string | null = null;\n for (let i = visibleCols.length - 1; i >= 0; i--) {\n const col = visibleCols[i];\n if (!col) continue;\n const id = getColumnId(col);\n const pin = col.meta?.pinned;\n const width = colWidths[id] ?? col.meta?.width ?? 140;\n if (pin === \"right\") {\n rightOffsets.set(id, currentRight);\n currentRight += width;\n firstRightPinnedId = id;\n }\n }\n\n return { leftOffsets, rightOffsets, lastLeftPinnedId, firstRightPinnedId };\n };\n\n const { leftOffsets, rightOffsets, lastLeftPinnedId, firstRightPinnedId } =\n getPinnedOffsets(visible);\n\n // ---- Search --------------------------------------------------------------\n\n const [searchText, setSearchText] = useDebouncedSearch(query.q ?? \"\", (text) => {\n onQueryChange(withSearch(query, text));\n });\n\n // ---- Page jump -----------------------------------------------------------\n\n const [jumpText, setJumpText] = React.useState(() => String(currentPage));\n React.useEffect(() => setJumpText(String(currentPage)), [currentPage]);\n\n const submitJump = (raw: string): void => {\n const page = Number.parseInt(raw, 10);\n if (Number.isNaN(page) || page < 1 || page > totalPages) {\n setJumpText(String(currentPage));\n return;\n }\n if (page !== currentPage) {\n onQueryChange(withPage(query, page, totalPages));\n }\n };\n\n // ---- Sorting -------------------------------------------------------------\n\n const toggleSort = (field: string, multiSort = false): void => {\n const next = multiSort\n ? withToggledMultiSort(query, field)\n : withToggledSort(query, field);\n onQueryChange(next);\n };\n\n // ---- Selection -----------------------------------------------------------\n\n const isSingleSelect = selectionMode === \"single\";\n const allPageSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => selectedIds.has(id));\n const somePageSelected =\n !allPageSelected && pageRowIds.some((id) => selectedIds.has(id));\n\n const toggleSelectAll = (): void => {\n if (isSingleSelect) return;\n const next = new Set(selectedIds);\n if (allPageSelected) {\n for (const id of pageRowIds) next.delete(id);\n } else {\n for (const id of pageRowIds) next.add(id);\n }\n setSelectedIds(next);\n onSelectionChange?.(Array.from(next), false);\n };\n\n const toggleSelectRow = (id: string): void => {\n const next = isSingleSelect\n ? selectedIds.has(id)\n ? new Set<string>()\n : new Set([id])\n : new Set(selectedIds);\n if (!isSingleSelect) {\n if (next.has(id)) next.delete(id);\n else next.add(id);\n }\n setSelectedIds(next);\n onSelectionChange?.(Array.from(next), false);\n };\n\n const deselectAll = (): void => {\n setSelectedIds(new Set<string>());\n onSelectionChange?.([], false);\n };\n\n const toggleExpandRow = (id: string): void => {\n setExpandedRows((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n // ---- Columns / density ---------------------------------------------------\n\n const toggleColumn = (columnId: string): void => {\n setHiddenCols((prev) => ({ ...prev, [columnId]: prev[columnId] !== true }));\n };\n\n // ---- Export --------------------------------------------------------------\n\n const handleExport = async (format: \"excel\" | \"csv\" | \"clipboard\"): Promise<void> => {\n exportMenu.close();\n\n if (onExportAll) {\n try {\n await onExportAll();\n } catch (err) {\n notify(\"error\", err instanceof Error ? err.message : \"Export failed\");\n }\n return;\n }\n\n setIsExporting(true);\n notify(\"info\", \"Exporting...\");\n try {\n let exportRows: readonly TData[] = rows;\n if (fetchEndpoint) {\n const full = await fetchAllPages<TData>(async (page, size) => {\n const url = buildQueryUrl(fetchEndpoint, {\n ...query,\n page,\n pageSize: isPageSize(size) ? size : query.pageSize,\n });\n const response = await fetch(url, { cache: \"no-store\" });\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n return (await response.json()) as PagedResponse<TData>;\n });\n exportRows = full.items;\n } else if (isClientSide) {\n const full = queryClientData(data, query, { paginate: false });\n exportRows = full.items;\n }\n\n const exportColumns = toExportColumns(visible, boolLabels);\n const prefix = exportFileName ?? filePrefixFromCaption(caption);\n\n if (format === \"clipboard\") {\n const ok = await copyToClipboard(exportRows, exportColumns);\n if (ok) notify(\"success\", \"Copied to clipboard\");\n else notify(\"error\", \"Failed to copy to clipboard\");\n } else if (format === \"excel\") {\n downloadExcel({\n filename: prefix,\n caption,\n rows: exportRows,\n columns: exportColumns,\n badgeRules,\n serialHeader: locale.serialHeader,\n });\n notify(\"success\", \"Excel downloaded\");\n } else {\n downloadCsv(timestampedFilename(prefix), exportRows, exportColumns);\n notify(\"success\", \"CSV downloaded\");\n }\n } catch {\n notify(\"error\", \"Export failed\");\n } finally {\n setIsExporting(false);\n }\n };\n\n // ---- Root ----------------------------------------------------------------\n\n const rootClasses = [\n \"tbx-root\",\n theme === \"dark\" ? \"tbx-dark\" : theme === \"auto\" ? \"tbx-auto\" : undefined,\n className,\n ].filter(Boolean);\n\n if (error) {\n return (\n <div className={rootClasses.join(\" \")} data-density={density}>\n <div className=\"tbx-state-card\">\n <p className=\"tbx-state-text\">{locale.errorText}</p>\n {onRetry ? (\n <button type=\"button\" className=\"tbx-btn\" onClick={onRetry}>\n <RotateCcwIcon className=\"tbx-icon\" />\n <span>{locale.retryButton}</span>\n </button>\n ) : null}\n </div>\n </div>\n );\n }\n\n const rowIsClickable = typeof onRowClick === \"function\";\n\n const activateRow = (row: TData) => (): void => {\n onRowClick?.(row);\n };\n\n const rowKeyDown =\n (row: TData) =>\n (event: React.KeyboardEvent): void => {\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n onRowClick?.(row);\n };\n\n const hasSummary =\n enableSummaryRow === true ||\n visible.some((col) => col.meta?.aggregation !== undefined);\n\n const renderLeafTh = (\n col: TableXColumn<TData, React.ReactNode>,\n rowSpan = 1,\n isGroupChild = false,\n ) => {\n const id = getColumnId(col);\n const sortable = isSortable(col) && enableSorting !== false;\n const sortIndex = query.sort.findIndex((s: SortSpec) => s.field === id);\n const sortItem = sortIndex >= 0 ? query.sort[sortIndex] : undefined;\n const sorted = sortable && sortItem !== undefined;\n const title = getColumnTitle(col) || id;\n const meta = col.meta;\n const activeFilter = query.filter?.[id];\n const isFilterActive = activeFilter !== undefined && activeFilter !== \"\";\n\n const customWidth = colWidths[id];\n const baseStyle = headerCellStyle(col);\n const thStyle: React.CSSProperties = {\n ...baseStyle,\n ...(customWidth !== undefined ? { width: `${customWidth}px` } : {}),\n ...(leftOffsets.has(id) ? { left: leftOffsets.get(id) } : {}),\n ...(rightOffsets.has(id) ? { right: rightOffsets.get(id) } : {}),\n };\n\n const startResize = (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const startX = e.clientX;\n const targetTh = (e.currentTarget.parentElement as HTMLElement) || null;\n const startWidth = targetTh ? targetTh.getBoundingClientRect().width : (customWidth ?? meta?.width ?? 120);\n\n const onMove = (moveEvent: PointerEvent) => {\n const nextW = Math.max(meta?.minWidth ?? 60, Math.round(startWidth + (moveEvent.clientX - startX)));\n setColWidths((prev) => ({ ...prev, [id]: nextW }));\n };\n const onUp = () => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n document.body?.classList.remove(\"tbx-resizing\");\n };\n document.body?.classList.add(\"tbx-resizing\");\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n };\n\n return (\n <th\n key={id}\n scope=\"col\"\n rowSpan={rowSpan > 1 ? rowSpan : undefined}\n aria-sort={\n !sortable\n ? undefined\n : sorted\n ? sortItem?.dir === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : \"none\"\n }\n tabIndex={sortable ? 0 : undefined}\n data-column-id={id}\n data-tbx-focus={sortable ? `sort:${id}` : undefined}\n draggable={enableColumnReorder && !isGroupChild}\n onDragStart={\n enableColumnReorder && !isGroupChild\n ? (e) => {\n setDraggedColId(id);\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", id);\n }\n : undefined\n }\n onDragOver={\n enableColumnReorder && !isGroupChild\n ? (e) => {\n e.preventDefault();\n }\n : undefined\n }\n onDrop={\n enableColumnReorder && !isGroupChild\n ? (e) => {\n e.preventDefault();\n if (!draggedColId || draggedColId === id) return;\n const fromIdx = colList.findIndex((c) => getColumnId(c) === draggedColId);\n const toIdx = colList.findIndex((c) => getColumnId(c) === id);\n if (fromIdx >= 0 && toIdx >= 0) {\n const nextCols = [...colList];\n const moved = nextCols[fromIdx];\n if (!moved) return;\n nextCols.splice(fromIdx, 1);\n nextCols.splice(toIdx, 0, moved);\n setColList(nextCols);\n onColumnOrderChange?.(nextCols.map(getColumnId));\n }\n }\n : undefined\n }\n onDragEnd={\n enableColumnReorder && !isGroupChild\n ? () => {\n setDraggedColId(null);\n }\n : undefined\n }\n className={[\n \"tbx-th\",\n sortable ? \"tbx-th--sortable\" : undefined,\n isGroupChild ? \"tbx-th--grouped-child\" : undefined,\n enableColumnReorder && !isGroupChild ? \"tbx-th--draggable\" : undefined,\n draggedColId === id ? \"tbx-th--dragging\" : undefined,\n isPinned(col) === \"left\" ? \"tbx-th--pinned-left\" : undefined,\n isPinned(col) === \"right\" ? \"tbx-th--pinned-right\" : undefined,\n lastLeftPinnedId === id ? \"tbx-pinned-border-left\" : undefined,\n firstRightPinnedId === id ? \"tbx-pinned-border-right\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={thStyle}\n onClick={\n sortable\n ? (event) => {\n const t = event.target as HTMLElement | null;\n if (t?.closest(\".tbx-col-filter-wrap\") || t?.closest(\".tbx-resize-handle\")) return;\n toggleSort(id, event.shiftKey);\n }\n : undefined\n }\n onKeyDown={\n sortable\n ? (event) => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n const t = event.target as HTMLElement | null;\n if (t?.closest(\".tbx-col-filter-wrap\")) return;\n event.preventDefault();\n toggleSort(id, event.shiftKey);\n }\n : undefined\n }\n >\n <div className={headerInnerClass(col)}>\n <span>{renderColumnHeader(col)}</span>\n {sortable ? (\n <span className=\"tbx-sort-icon-wrap\">\n {sorted ? (\n sortItem?.dir === \"asc\" ? (\n <ArrowUpIcon className=\"tbx-sort-icon\" />\n ) : (\n <ArrowDownIcon className=\"tbx-sort-icon\" />\n )\n ) : (\n <ArrowUpDownIcon className=\"tbx-sort-icon tbx-sort-icon--idle\" />\n )}\n {query.sort.length > 1 && sortIndex >= 0 ? (\n <span className=\"tbx-sort-order\">{sortIndex + 1}</span>\n ) : null}\n </span>\n ) : null}\n\n {isFilterable(col, enableColumnFilters) ? (\n <div className=\"tbx-col-filter-wrap\">\n <button\n type=\"button\"\n className={\n isFilterActive\n ? \"tbx-col-filter-btn tbx-col-filter-btn--active\"\n : \"tbx-col-filter-btn\"\n }\n aria-label={`Filter ${title}`}\n onClick={(e) => {\n e.stopPropagation();\n setOpenFilterCol(openFilterCol === id ? null : id);\n }}\n >\n <DotsVerticalIcon className=\"tbx-icon\" />\n </button>\n\n {openFilterCol === id ? (\n <div\n className=\"tbx-filter-popover\"\n onClick={(e) => e.stopPropagation()}\n >\n <input\n autoFocus\n type=\"text\"\n className=\"tbx-filter-popover-input\"\n defaultValue={activeFilter ?? \"\"}\n placeholder={`Filter by ${title}...`}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const val = (e.currentTarget as HTMLInputElement).value.trim();\n setOpenFilterCol(null);\n onQueryChange(withFilter(query, id, val || undefined));\n } else if (e.key === \"Escape\") {\n setOpenFilterCol(null);\n }\n }}\n />\n <div className=\"tbx-filter-popover-actions\">\n <button\n type=\"button\"\n className=\"tbx-filter-popover-btn\"\n onClick={(e) => {\n e.stopPropagation();\n setOpenFilterCol(null);\n onQueryChange(withFilter(query, id, undefined));\n }}\n >\n <RotateCcwIcon className=\"tbx-icon\" />\n <span>{locale.clearFilter}</span>\n </button>\n <button\n type=\"button\"\n className=\"tbx-filter-popover-btn tbx-filter-popover-btn--primary\"\n onClick={(e) => {\n e.stopPropagation();\n const parent = (e.currentTarget as HTMLElement).closest(\".tbx-filter-popover\");\n const inputEl = parent?.querySelector(\"input\") as HTMLInputElement | null;\n const val = inputEl?.value.trim();\n setOpenFilterCol(null);\n onQueryChange(withFilter(query, id, val || undefined));\n }}\n >\n <CheckIcon className=\"tbx-icon\" />\n <span>{locale.applyFilter}</span>\n </button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n\n {enableColumnResize ? (\n <div\n className=\"tbx-resize-handle\"\n onPointerDown={startResize}\n onDoubleClick={() => autoFitColumn(id)}\n />\n ) : null}\n </th>\n );\n };\n\n return (\n <div className={rootClasses.join(\" \")} data-density={density} ref={rootRef}>\n {/* ── TOOLBAR ─────────────────────────────────────────────────────── */}\n {showToolbar ? (\n <div className=\"tbx-toolbar\">\n <div className=\"tbx-toolbar-group\">\n {enableSearch ? (\n <div className=\"tbx-search\">\n <SearchIcon className=\"tbx-search-icon\" />\n <input\n type=\"search\"\n className=\"tbx-search-input\"\n value={searchText}\n onChange={(event) => setSearchText(event.target.value)}\n placeholder={searchPlaceholder ?? locale.searchPlaceholder}\n aria-label={`Search ${caption}`}\n />\n {searchText ? (\n <button\n type=\"button\"\n className=\"tbx-search-clear\"\n onClick={() => setSearchText(\"\")}\n aria-label={locale.clearSearch}\n >\n <XIcon className=\"tbx-icon\" />\n <span className=\"tbx-sr-only\">{locale.clearSearch}</span>\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"tbx-toolbar-group tbx-toolbar-group--end\">\n {isColumnsVisible ? (\n <div className=\"tbx-menu-wrap\" ref={columnsMenu.containerRef}>\n <button\n type=\"button\"\n id={columnsButtonId}\n className=\"tbx-btn\"\n ref={columnsMenu.triggerRef}\n aria-haspopup=\"menu\"\n aria-expanded={columnsMenu.isOpen}\n onClick={columnsMenu.toggle}\n >\n <ColumnsIcon className=\"tbx-icon\" />\n <span>{locale.columnsButton}</span>\n </button>\n {columnsMenu.isOpen ? (\n <div className=\"tbx-menu\" role=\"menu\" aria-labelledby={columnsButtonId}>\n <div className=\"tbx-menu-label\">{locale.toggleColumnsLabel}</div>\n <div className=\"tbx-menu-separator\" />\n {hideable.map((col) => {\n const id = getColumnId(col);\n const checked = hiddenCols[id] !== true;\n return (\n <button\n key={id}\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n onClick={() => toggleColumn(id)}\n >\n <CheckIcon className=\"tbx-check\" />\n <span>{getColumnTitle(col) || id}</span>\n </button>\n );\n })}\n {storageKey ? (\n <>\n <div className=\"tbx-menu-separator\" />\n <button\n type=\"button\"\n className=\"tbx-menu-item tbx-menu-item--reset\"\n role=\"menuitem\"\n onClick={handleResetView}\n >\n <span>Reset to default view</span>\n </button>\n </>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {isDensityVisible ? (\n <div className=\"tbx-menu-wrap\" ref={densityMenu.containerRef}>\n <button\n type=\"button\"\n id={densityButtonId}\n className=\"tbx-btn tbx-capitalize\"\n ref={densityMenu.triggerRef}\n aria-haspopup=\"menu\"\n aria-expanded={densityMenu.isOpen}\n onClick={densityMenu.toggle}\n >\n <DensityIcon className=\"tbx-icon\" />\n <span>{formatMessage(locale.densityButton, { density })}</span>\n </button>\n {densityMenu.isOpen ? (\n <div className=\"tbx-menu\" role=\"menu\" aria-labelledby={densityButtonId}>\n {DENSITIES.map((option) => (\n <button\n key={option}\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitemcheckbox\"\n aria-checked={density === option}\n onClick={() => {\n setDensity(option);\n densityMenu.close();\n }}\n >\n <CheckIcon className=\"tbx-check\" />\n <span>{locale[DENSITY_LABEL_KEY[option]]}</span>\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {isExportVisible ? (\n <div className=\"tbx-menu-wrap\" ref={exportMenu.containerRef}>\n <button\n type=\"button\"\n id={exportButtonId}\n className=\"tbx-btn tbx-btn--export\"\n ref={exportMenu.triggerRef}\n disabled={isExporting}\n aria-haspopup=\"menu\"\n aria-expanded={exportMenu.isOpen}\n onClick={exportMenu.toggle}\n >\n <DownloadTrayIcon className=\"tbx-icon\" />\n <span>{isExporting ? locale.exportingButton : locale.exportButton}</span>\n <ChevronDownIcon className=\"tbx-icon tbx-chevron\" />\n </button>\n {exportMenu.isOpen ? (\n <div\n className=\"tbx-menu tbx-menu--end\"\n role=\"menu\"\n aria-labelledby={exportButtonId}\n >\n <button\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitem\"\n onClick={() => void handleExport(\"excel\")}\n >\n <FileSpreadsheetIcon className=\"tbx-icon--excel\" />\n <div className=\"tbx-menu-item-title\">\n <strong>{locale.exportExcelTitle}</strong>\n <small>{locale.exportExcelSubtitle}</small>\n </div>\n </button>\n <button\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitem\"\n onClick={() => void handleExport(\"csv\")}\n >\n <FileTextIcon className=\"tbx-icon--csv\" />\n <div className=\"tbx-menu-item-title\">\n <strong>{locale.exportCsvTitle}</strong>\n <small>{locale.exportCsvSubtitle}</small>\n </div>\n </button>\n <button\n type=\"button\"\n className=\"tbx-menu-item\"\n role=\"menuitem\"\n onClick={() => void handleExport(\"clipboard\")}\n >\n <FileTextIcon className=\"tbx-icon--csv\" />\n <div className=\"tbx-menu-item-title\">\n <strong>{locale.exportClipboardTitle}</strong>\n <small>{locale.exportClipboardSubtitle}</small>\n </div>\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n\n {toolbarActions}\n </div>\n </div>\n ) : null}\n\n {/* ── ACTIVE FILTER PILLS BAR ────────────────────────────────────────── */}\n {showFilterPills !== false && (Boolean(query.q?.trim()) || Object.keys(query.filter ?? {}).some((k) => query.filter?.[k])) ? (\n <div className=\"tbx-filter-pills-bar\">\n <span className=\"tbx-filter-pills-title\">Active filters:</span>\n {query.q?.trim() ? (\n <div className=\"tbx-filter-pill\">\n <span className=\"tbx-filter-pill-label\">\n {searchPlaceholder || locale.searchPlaceholder || \"Search\"}:\n </span>\n <span className=\"tbx-filter-pill-val\">\"{query.q}\"</span>\n <button\n type=\"button\"\n className=\"tbx-filter-pill-remove\"\n title=\"Clear search\"\n aria-label=\"Clear search\"\n onClick={() => onQueryChange(withSearch(query, \"\"))}\n >\n ✕\n </button>\n </div>\n ) : null}\n {Object.entries(query.filter ?? {}).map(([key, val]) => {\n if (val === undefined || val === \"\") return null;\n const col = leafCols.find((c) => getColumnId(c) === key);\n const title = col ? getColumnTitle(col) || key : key;\n return (\n <div key={key} className=\"tbx-filter-pill\">\n <span className=\"tbx-filter-pill-label\">{title}:</span>\n <span className=\"tbx-filter-pill-val\">{String(val)}</span>\n <button\n type=\"button\"\n className=\"tbx-filter-pill-remove\"\n title={`Remove ${title} filter`}\n aria-label={`Remove filter for ${title}`}\n onClick={() => onQueryChange(withFilter(query, key, undefined))}\n >\n ✕\n </button>\n </div>\n );\n })}\n <button\n type=\"button\"\n className=\"tbx-filter-pill-clear-all\"\n onClick={() => onQueryChange({ ...query, page: 1, q: undefined, filter: {} })}\n >\n Clear all\n </button>\n </div>\n ) : null}\n\n {/* ── TABLE (>= 768px) ─────────────────────────────────────────────── */}\n <div className=\"tbx-table-wrap\">\n <table className=\"tbx-table\" aria-label={caption}>\n <thead>\n <tr>\n {renderExpandedRow ? (\n <th\n rowSpan={headerRows.hasGroups ? 2 : undefined}\n className={[\n \"tbx-th tbx-th--expand\",\n leftOffsets.has(\"__expand\") ? \"tbx-th--pinned-left\" : undefined,\n lastLeftPinnedId === \"__expand\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n width: \"40px\",\n left: leftOffsets.get(\"__expand\"),\n }}\n scope=\"col\"\n />\n ) : null}\n\n {enableSelection ? (\n <th\n rowSpan={headerRows.hasGroups ? 2 : undefined}\n className={[\n \"tbx-th tbx-th--select\",\n leftOffsets.has(\"__select\") ? \"tbx-th--pinned-left\" : undefined,\n lastLeftPinnedId === \"__select\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n left: leftOffsets.get(\"__select\"),\n }}\n scope=\"col\"\n >\n {!isSingleSelect ? (\n <input\n type=\"checkbox\"\n className=\"tbx-checkbox\"\n checked={allPageSelected}\n ref={(el) => {\n if (el) el.indeterminate = somePageSelected;\n }}\n onChange={toggleSelectAll}\n aria-label={locale.selectAllLabel}\n />\n ) : null}\n </th>\n ) : null}\n\n {showSerialNumber ? (\n <th\n rowSpan={headerRows.hasGroups ? 2 : undefined}\n className={[\n \"tbx-th tbx-th--serial\",\n leftOffsets.has(\"__serial\") ? \"tbx-th--pinned-left\" : undefined,\n lastLeftPinnedId === \"__serial\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n left: leftOffsets.get(\"__serial\"),\n }}\n scope=\"col\"\n >\n {locale.serialHeader}\n </th>\n ) : null}\n\n {!headerRows.hasGroups\n ? visible.map((col) => renderLeafTh(col, 1, false))\n : headerRows.topRow.map((cell, idx) => {\n if (cell.isGroup) {\n return (\n <th\n key={`grp-${cell.id}-${idx}`}\n colSpan={cell.colSpan}\n className=\"tbx-th tbx-th--group\"\n scope=\"colgroup\"\n >\n <span className=\"tbx-th-group-title\">{cell.title}</span>\n </th>\n );\n }\n if (cell.leafColumn) {\n return renderLeafTh(cell.leafColumn, cell.rowSpan, false);\n }\n return null;\n })}\n </tr>\n {headerRows.hasGroups ? (\n <tr>\n {headerRows.bottomRow.map((cell) => {\n if (cell.leafColumn) {\n return renderLeafTh(cell.leafColumn, 1, true);\n }\n return null;\n })}\n </tr>\n ) : null}\n </thead>\n\n <tbody>\n {isLoading ? (\n <tr>\n <td className=\"tbx-state\" colSpan={Math.max(1, columnCount)}>\n <div className=\"tbx-dotted-loader\" aria-hidden=\"true\">\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n </div>\n <div className=\"tbx-loading-text\" aria-live=\"polite\">{locale.loadingText}</div>\n </td>\n </tr>\n ) : rows.length === 0 ? (\n <tr>\n <td className=\"tbx-state\" colSpan={Math.max(1, columnCount)}>\n {locale.emptyText}\n </td>\n </tr>\n ) : (\n rows.map((row, index) => {\n const id = pageRowIds[index] ?? String(index);\n const isSelected = selectedIds.has(id);\n const isExpanded = expandedRows.has(id);\n\n return (\n <React.Fragment key={id || index}>\n <tr\n className={[\n \"tbx-row\",\n isSelected ? \"tbx-row--selected\" : undefined,\n isExpanded ? \"tbx-row--expanded\" : undefined,\n rowIsClickable ? \"tbx-row--clickable\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={rowIsClickable ? activateRow(row) : undefined}\n onKeyDown={rowIsClickable ? rowKeyDown(row) : undefined}\n tabIndex={rowIsClickable ? 0 : undefined}\n >\n {renderExpandedRow ? (\n <td\n className={[\n \"tbx-td tbx-td--expand\",\n leftOffsets.has(\"__expand\") ? \"tbx-td--pinned-left\" : undefined,\n lastLeftPinnedId === \"__expand\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n width: \"40px\",\n left: leftOffsets.get(\"__expand\"),\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n className={isExpanded ? \"tbx-expand-btn tbx-expand-btn--open\" : \"tbx-expand-btn\"}\n aria-label={isExpanded ? \"Collapse row\" : \"Expand row\"}\n onClick={(e) => {\n e.stopPropagation();\n toggleExpandRow(id);\n }}\n >\n <ChevronRightIcon className=\"tbx-icon\" />\n </button>\n </td>\n ) : null}\n\n {enableSelection ? (\n <td\n className={[\n \"tbx-td tbx-td--select\",\n leftOffsets.has(\"__select\") ? \"tbx-td--pinned-left\" : undefined,\n lastLeftPinnedId === \"__select\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n left: leftOffsets.get(\"__select\"),\n }}\n onClick={(event) => event.stopPropagation()}\n >\n <input\n type={isSingleSelect ? \"radio\" : \"checkbox\"}\n name={isSingleSelect ? `${instanceId}-select` : undefined}\n className=\"tbx-checkbox\"\n checked={isSelected}\n onChange={() => toggleSelectRow(id)}\n onClick={(event) => event.stopPropagation()}\n aria-label={formatMessage(locale.selectRowLabel, { id })}\n />\n </td>\n ) : null}\n\n {showSerialNumber ? (\n <td\n className={[\n \"tbx-td tbx-td--serial\",\n leftOffsets.has(\"__serial\") ? \"tbx-td--pinned-left\" : undefined,\n lastLeftPinnedId === \"__serial\" ? \"tbx-pinned-border-left\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n left: leftOffsets.get(\"__serial\"),\n }}\n >\n {serialNumber(currentPage, pageSize, index)}\n </td>\n ) : null}\n\n {visible.map((col, colIndex) => {\n const colId = getColumnId(col);\n const isPinnedLeft = leftOffsets.has(colId);\n const isPinnedRight = rightOffsets.has(colId);\n const isLastLeft = lastLeftPinnedId === colId;\n const isFirstRight = firstRightPinnedId === colId;\n const isCellEditable = isEditable(col);\n const isCurrentlyEditing =\n editingCell?.rowId === id && editingCell?.columnId === colId;\n\n const tdStyle: React.CSSProperties = {\n ...bodyCellStyle(col),\n ...(isPinnedLeft ? { left: leftOffsets.get(colId) } : {}),\n ...(isPinnedRight ? { right: rightOffsets.get(colId) } : {}),\n };\n\n return (\n <td\n key={colId || `col-${colIndex}`}\n className={[\n \"tbx-td\",\n isCellEditable ? \"tbx-cell--editable\" : undefined,\n isPinnedLeft ? \"tbx-td--pinned-left\" : undefined,\n isPinnedRight ? \"tbx-td--pinned-right\" : undefined,\n isLastLeft ? \"tbx-pinned-border-left\" : undefined,\n isFirstRight ? \"tbx-pinned-border-right\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={tdStyle}\n onDoubleClick={\n isCellEditable\n ? (e) => {\n e.stopPropagation();\n setEditingCell({ rowId: id, columnId: colId });\n }\n : undefined\n }\n >\n {isCurrentlyEditing ? (\n <div\n className=\"tbx-cell-edit-wrap\"\n onClick={(e) => e.stopPropagation()}\n >\n {col.meta?.editType === \"select\" && col.meta.editOptions ? (\n <select\n autoFocus\n className=\"tbx-cell-edit-select tbx-cell-edit-input\"\n defaultValue={String((row as Record<string, unknown>)[colId] ?? \"\")}\n id={`${instanceId}-edit-${id}-${colId}`}\n >\n {col.meta.editOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n ) : (\n <input\n autoFocus\n type={col.meta?.editType === \"number\" ? \"number\" : \"text\"}\n className=\"tbx-cell-edit-input\"\n defaultValue={String((row as Record<string, unknown>)[colId] ?? \"\")}\n id={`${instanceId}-edit-${id}-${colId}`}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n const el = e.currentTarget;\n const val = col.meta?.editType === \"number\" ? Number(el.value) : el.value;\n const oldVal = (row as Record<string, unknown>)[colId];\n (row as Record<string, unknown>)[colId] = val;\n onCellEdit?.({ row, columnId: colId, oldValue: oldVal, newValue: val });\n setEditingCell(null);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setEditingCell(null);\n }\n }}\n />\n )}\n <div className=\"tbx-cell-edit-actions\">\n <button\n type=\"button\"\n className=\"tbx-cell-edit-btn tbx-cell-edit-btn--save\"\n onClick={(e) => {\n e.stopPropagation();\n const el = document.getElementById(`${instanceId}-edit-${id}-${colId}`) as HTMLInputElement | HTMLSelectElement | null;\n if (el) {\n const val = col.meta?.editType === \"number\" ? Number(el.value) : el.value;\n const oldVal = (row as Record<string, unknown>)[colId];\n (row as Record<string, unknown>)[colId] = val;\n onCellEdit?.({ row, columnId: colId, oldValue: oldVal, newValue: val });\n }\n setEditingCell(null);\n }}\n >\n <CheckIcon className=\"tbx-icon\" />\n </button>\n <button\n type=\"button\"\n className=\"tbx-cell-edit-btn tbx-cell-edit-btn--cancel\"\n onClick={(e) => {\n e.stopPropagation();\n setEditingCell(null);\n }}\n >\n <XIcon className=\"tbx-icon\" />\n </button>\n </div>\n </div>\n ) : (\n renderCellContent(col, row, boolLabels)\n )}\n </td>\n );\n })}\n </tr>\n {isExpanded && renderExpandedRow ? (\n <tr className=\"tbx-expanded-row\">\n <td className=\"tbx-expanded-cell\" colSpan={columnCount}>\n <div className=\"tbx-detail-panel\">\n {renderExpandedRow(row)}\n </div>\n </td>\n </tr>\n ) : null}\n </React.Fragment>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {/* ── CARD LIST (< 768px) ──────────────────────────────────────────────\n Not a cosmetic alternative: table cells are `white-space: nowrap`, so\n on a phone a reader would scroll sideways through columns to assemble\n a single record. Cards put the record back together vertically, and\n render through the SAME helpers as the table so a column with a custom\n cell cannot look different in the two layouts. */}\n <div className=\"tbx-cards\">\n {isLoading ? (\n <div className=\"tbx-card\">\n <div className=\"tbx-state\">\n <div className=\"tbx-dotted-loader\" aria-hidden=\"true\">\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n <span className=\"tbx-dot\" />\n </div>\n <div className=\"tbx-loading-text\" aria-live=\"polite\">{locale.loadingText}</div>\n </div>\n </div>\n ) : rows.length === 0 ? (\n <div className=\"tbx-card\">\n <div className=\"tbx-state\">{locale.emptyText}</div>\n </div>\n ) : (\n rows.map((row, index) => {\n const id = pageRowIds[index] ?? String(index);\n const isSelected = selectedIds.has(id);\n\n return (\n <div\n key={id || index}\n className={[\n \"tbx-card\",\n isSelected ? \"tbx-card--selected\" : undefined,\n rowIsClickable ? \"tbx-card--clickable\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={rowIsClickable ? activateRow(row) : undefined}\n onKeyDown={rowIsClickable ? rowKeyDown(row) : undefined}\n tabIndex={rowIsClickable ? 0 : undefined}\n >\n {showSerialNumber || enableSelection ? (\n <div className=\"tbx-card-head\">\n {showSerialNumber ? (\n <span className=\"tbx-card-serial\">\n #{serialNumber(currentPage, pageSize, index)}\n </span>\n ) : null}\n {enableSelection ? (\n <span\n className=\"tbx-card-select\"\n onClick={(event) => event.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n className=\"tbx-checkbox\"\n checked={isSelected}\n onChange={() => toggleSelectRow(id)}\n onClick={(event) => event.stopPropagation()}\n aria-label={formatMessage(locale.selectRowLabel, { id })}\n />\n </span>\n ) : null}\n </div>\n ) : null}\n\n <dl className=\"tbx-card-rows\">\n {visible.map((col, colIndex) => {\n const colId = getColumnId(col);\n return (\n <div key={colId || `col-${colIndex}`} className=\"tbx-card-row\">\n <dt>{getColumnTitle(col) || colId}</dt>\n <dd>{renderCellContent(col, row, boolLabels)}</dd>\n </div>\n );\n })}\n </dl>\n </div>\n );\n })\n )}\n </div>\n\n {/* ── FOOTER ──────────────────────────────────────────────────────── */}\n {showFooter ? (\n <div className=\"tbx-footer\">\n <div className=\"tbx-range\">\n <span>\n {renderTemplate(locale.showingRange, {\n start: <strong>{range.start}</strong>,\n end: <strong>{range.end}</strong>,\n total: <strong className=\"tbx-range-total\">{total.toLocaleString()}</strong>,\n })}\n </span>\n {selectedIds.size > 0 ? (\n <span className=\"tbx-selected-badge\">\n {formatMessage(locale.selectedBadge, { count: selectedIds.size })}\n </span>\n ) : null}\n </div>\n\n <div className=\"tbx-pagination\">\n {isRowsPerPageVisible ? (\n <div className=\"tbx-rows-per-page\">\n <span>{locale.rowsPerPage}</span>\n <select\n className=\"tbx-rows-select\"\n value={String(pageSize)}\n onChange={(event) => {\n onQueryChange(withPageSize(query, Number.parseInt(event.target.value, 10)));\n }}\n aria-label={locale.rowsPerPage}\n >\n {PAGE_SIZES.map((size) => (\n <option key={size} value={size}>\n {size} rows\n </option>\n ))}\n </select>\n </div>\n ) : null}\n\n {isPaginationVisible ? (\n <div className=\"tbx-pager\">\n <button\n type=\"button\"\n className=\"tbx-page-nav\"\n disabled={currentPage <= 1}\n onClick={() => onQueryChange(withPage(query, currentPage - 1, totalPages))}\n aria-label={locale.previousPage}\n >\n <ChevronLeftIcon size={16} />\n <span className=\"tbx-sr-only\">{locale.previousPage}</span>\n </button>\n\n {pageItems.map((item, index) =>\n item === \"...\" ? (\n <span key={`gap-${index}`} className=\"tbx-page-ellipsis\">\n …\n </span>\n ) : (\n <button\n key={`page-${item}`}\n type=\"button\"\n className={\n item === currentPage ? \"tbx-page-btn tbx-page-btn--current\" : \"tbx-page-btn\"\n }\n onClick={() => onQueryChange(withPage(query, item, totalPages))}\n aria-label={formatMessage(locale.pageLabel, { page: item })}\n aria-current={item === currentPage ? \"page\" : undefined}\n >\n {item}\n </button>\n ),\n )}\n\n <button\n type=\"button\"\n className=\"tbx-page-nav\"\n disabled={currentPage >= totalPages}\n onClick={() => onQueryChange(withPage(query, currentPage + 1, totalPages))}\n aria-label={locale.nextPage}\n >\n <ChevronRightIcon size={16} />\n <span className=\"tbx-sr-only\">{locale.nextPage}</span>\n </button>\n </div>\n ) : null}\n\n {isJumpToPageVisible ? (\n <form\n className=\"tbx-jump\"\n onSubmit={(event) => {\n event.preventDefault();\n submitJump(jumpText);\n }}\n >\n <label className=\"tbx-jump-label\" htmlFor={jumpInputId}>\n {locale.goToPage}\n </label>\n <input\n id={jumpInputId}\n type=\"number\"\n className=\"tbx-jump-input\"\n min={1}\n max={totalPages}\n value={jumpText}\n onChange={(event) => setJumpText(event.target.value)}\n onBlur={() => submitJump(jumpText)}\n aria-label={locale.goToPageOf}\n />\n </form>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport const NexGrid = TableX;\n","// The grid's complete icon set, inlined as components.\n//\n// WHY INLINE: TableX ships with zero runtime dependencies, so an icon package\n// (lucide-react, heroicons) is not an option. It would also be a parity hazard —\n// the Angular and vanilla adapters draw these same shapes from §7 of the\n// adapter spec, and a version bump in one package's icon set would silently\n// make one adapter look different from the others.\n//\n// Every icon shares the same 24x24 stroked geometry, so the wrapper below owns\n// those attributes and each export contributes only its paths.\n\nimport * as React from \"react\";\n\n/** Props accepted by every TableX icon. */\nexport interface TableXIconProps {\n /**\n * Class supplying size and color — `.tbx-icon`, `.tbx-sort-icon`,\n * `.tbx-check`, `.tbx-icon--excel`, `.tbx-icon--csv`, `.tbx-search-icon`.\n * An SVG with no sizing resolves to 300x150, so every icon needs either a\n * class or {@link TableXIconProps.size}.\n */\n className?: string;\n /** Explicit pixel size, for the pager chevrons which have no sizing class. */\n size?: number;\n}\nexport type NexGridIconProps = TableXIconProps;\n\nfunction Icon({\n className,\n size,\n children,\n}: TableXIconProps & { children: React.ReactNode }): React.JSX.Element {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className={className}\n width={size}\n height={size}\n >\n {children}\n </svg>\n );\n}\n\n/** Magnifier — the search field's leading adornment. */\nexport function SearchIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </Icon>\n );\n}\n\n/** Cross used by the \"clear search\" button. */\nexport function XIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </Icon>\n );\n}\n\n/** Columns icon — 3 vertical columns inside a rounded box. */\nexport function ColumnsIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </Icon>\n );\n}\n\n/** Horizontal sliders — backwards compatible alias to ColumnsIcon. */\nexport function SlidersIcon(props: TableXIconProps): React.JSX.Element {\n return <ColumnsIcon {...props} />;\n}\n\n/** Density icon — horizontal rows / stacked bars. */\nexport function DensityIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"6\" rx=\"1.5\" />\n <rect x=\"3\" y=\"13.5\" width=\"18\" height=\"6\" rx=\"1.5\" />\n </Icon>\n );\n}\n\n/** Funnel — backwards compatible alias to DensityIcon. */\nexport function FilterIcon(props: TableXIconProps): React.JSX.Element {\n return <DensityIcon {...props} />;\n}\n\n/** Chevron down for dropdowns. */\nexport function ChevronDownIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m6 9 6 6 6-6\" />\n </Icon>\n );\n}\n\n/** Edit / pencil icon for actions. */\nexport function EditIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n <path d=\"m15 5 4 4\" />\n </Icon>\n );\n}\n\n/** Download tray — the Export menu trigger. */\nexport function DownloadIcon(props: TableXIconProps): React.JSX.Element {\n return <ChevronDownIcon {...props} />;\n}\n\n/** Spreadsheet document — the Excel export option. */\nexport function FileSpreadsheetIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M8 13h2\" />\n <path d=\"M14 13h2\" />\n <path d=\"M8 17h2\" />\n <path d=\"M14 17h2\" />\n </Icon>\n );\n}\n\n/** Text document — the CSV export option. */\nexport function FileTextIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </Icon>\n );\n}\n\n/** Left chevron — previous page. */\nexport function ChevronLeftIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m15 18-6-6 6-6\" />\n </Icon>\n );\n}\n\n/** Right chevron — next page. */\nexport function ChevronRightIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m9 18 6-6-6-6\" />\n </Icon>\n );\n}\n\n/** Up arrow — ascending sort. */\nexport function ArrowUpIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </Icon>\n );\n}\n\n/** Down arrow — descending sort. */\nexport function ArrowDownIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M12 5v14\" />\n <path d=\"m19 12-7 7-7-7\" />\n </Icon>\n );\n}\n\n/** Opposed arrows — sortable but not currently sorted. */\nexport function ArrowUpDownIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </Icon>\n );\n}\n\n/** Tick — the checked marker in menu checkbox items. */\nexport function CheckIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M20 6 9 17l-5-5\" />\n </Icon>\n );\n}\n\n/** Funnel icon for column filter trigger. */\nexport function FunnelIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\" />\n </Icon>\n );\n}\n\n/** Rotate counter-clockwise / reset icon. */\nexport function RotateCcwIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </Icon>\n );\n}\n\n/** Trash / delete icon for actions. */\nexport function TrashIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n </Icon>\n );\n}\n\n/** Eye / view icon. */\nexport function EyeIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </Icon>\n );\n}\n\n/** Download tray icon. */\nexport function DownloadTrayIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\" />\n </Icon>\n );\n}\n\n/** Three vertical dots (⋮) icon for column filter & options menu trigger. */\nexport function DotsVerticalIcon(props: TableXIconProps): React.JSX.Element {\n return (\n <Icon {...props}>\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"12\" cy=\"19\" r=\"1.5\" />\n </Icon>\n );\n}\n\nexport function MoreVerticalIcon(props: TableXIconProps): React.JSX.Element {\n return <DotsVerticalIcon {...props} />;\n}\n","// Pure rendering helpers shared by the table and the card list.\n//\n// The two layouts must never drift: a column with a custom cell (a status\n// pill, a row action menu) has to look the same whether it is drawn as a `td`\n// or as a card's `dd`. Routing both through these functions is what makes that\n// structural rather than a thing to remember.\n\nimport * as React from \"react\";\nimport {\n getCellText,\n getCellValue,\n getColumnId,\n type TableXColumn,\n type NexGridColumn,\n} from \"@nexgrid/core\";\n\n/** Default width, in px, for a column that declares neither `width` nor `minWidth`. */\nexport const DEFAULT_MIN_WIDTH = 120;\n\n/** Render a column's header: a custom render function, its text, or its id. */\nexport function renderColumnHeader<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n): React.ReactNode {\n const header = col.header;\n if (typeof header === \"function\") return header({});\n if (typeof header === \"string\") return header;\n return getColumnId(col);\n}\n\n/**\n * Render one cell. With no `cell` renderer the raw value is rendered as text\n * through core's `getCellText`, so booleans and objects never leak `[object\n * Object]` into the grid.\n */\nexport function renderCellContent<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n row: TData,\n labels: { yes: string; no: string },\n): React.ReactNode {\n const cell = col.cell;\n if (typeof cell === \"function\") {\n return cell({ row: { original: row }, getValue: () => getCellValue(col, row) });\n }\n return getCellText(getCellValue(col, row), labels);\n}\n\n/**\n * Header cell geometry. `meta.width` pins the column; otherwise it gets a floor\n * of `meta.minWidth ?? 120` and lays out naturally, which keeps a table of\n * short values from collapsing into unreadable slivers.\n */\nexport function headerCellStyle<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n): React.CSSProperties {\n const meta = col.meta;\n const style: React.CSSProperties =\n meta?.width === undefined\n ? { minWidth: `${meta?.minWidth ?? DEFAULT_MIN_WIDTH}px` }\n : { width: `${meta.width}px` };\n if (meta?.align !== undefined) style.textAlign = meta.align;\n return style;\n}\n\n/** Body cell geometry — alignment only; widths are set once, on the header. */\nexport function bodyCellStyle<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n): React.CSSProperties | undefined {\n const align = col.meta?.align;\n return align === undefined ? undefined : { textAlign: align };\n}\n\n/** Extra class for the header's inner flex wrapper, following `meta.align`. */\nexport function headerInnerClass<TData>(\n col: TableXColumn<TData, React.ReactNode>,\n): string {\n const align = col.meta?.align;\n if (align === \"center\") return \"tbx-th-inner tbx-th-inner--center\";\n if (align === \"right\") return \"tbx-th-inner tbx-th-inner--right\";\n return \"tbx-th-inner\";\n}\n\n/**\n * Interpolate a locale template whose placeholders resolve to ELEMENTS rather\n * than text.\n *\n * `showingRange` needs `<strong>` around each number, but it is deliberately a\n * single translatable sentence (\"Showing {start} to {end} of {total} entries\")\n * rather than a pile of fragments, because word order differs by language.\n * Splitting the template on its own placeholders keeps translators in charge\n * of the sentence while the grid keeps control of the markup.\n */\nexport function renderTemplate(\n template: string,\n values: Readonly<Record<string, React.ReactNode>>,\n): React.ReactNode {\n const parts: React.ReactNode[] = [];\n const pattern = /\\{(\\w+)\\}/g;\n let cursor = 0;\n\n for (let match = pattern.exec(template); match !== null; match = pattern.exec(template)) {\n const key = match[1];\n const replacement = key === undefined ? undefined : values[key];\n if (replacement === undefined) continue;\n if (match.index > cursor) parts.push(template.slice(cursor, match.index));\n parts.push(replacement);\n cursor = match.index + match[0].length;\n }\n\n if (cursor < template.length) parts.push(template.slice(cursor));\n\n // Index keys are correct here: the parts are fixed positions in one template,\n // never a reorderable list.\n return parts.map((part, index) => <React.Fragment key={index}>{part}</React.Fragment>);\n}\n","// Debounced two-way binding between the search box and `query.q`.\n//\n// The search input cannot be driven straight from `query.q`: every keystroke\n// would be a server round-trip, and each one resets the grid to page 1. So the\n// input keeps its own state and the committed value trails it by a beat.\n//\n// Two failure modes this hook exists to prevent, both of which are easy to\n// write by accident:\n//\n// * Committing on mount. `text` starts equal to `query.q`, and the timer is\n// only armed when the two differ, so a freshly mounted grid never fires a\n// query the host did not ask for — which would have thrown away a page\n// number restored from the URL.\n// * Restarting the timer on unrelated renders. The commit callback is held\n// in a ref instead of being an effect dependency, so a host that passes an\n// inline arrow (nearly all of them do) does not re-arm the 350 ms timer\n// every time its parent re-renders.\n\nimport * as React from \"react\";\n\n/** How long typing must pause before the query is updated. */\nexport const SEARCH_DEBOUNCE_MS = 350;\n\n/**\n * Bind a text input to an externally controlled search string.\n *\n * @param value The committed search text (`query.q ?? \"\"`). An external\n * change — a URL restore, a \"reset filters\" button — is\n * detected and mirrored into the input.\n * @param commit Called with the input text once typing has paused.\n * @param delayMs Debounce interval. Defaults to {@link SEARCH_DEBOUNCE_MS}.\n * @returns The input's current text and its setter.\n */\nexport function useDebouncedSearch(\n value: string,\n commit: (text: string) => void,\n delayMs: number = SEARCH_DEBOUNCE_MS,\n): readonly [string, (next: string) => void] {\n const [text, setText] = React.useState(value);\n\n const commitRef = React.useRef(commit);\n React.useEffect(() => {\n commitRef.current = commit;\n });\n\n // Distinguish \"the host changed the search\" from \"the host echoed back what\n // we just committed\": only the former should overwrite what the user typed.\n const lastExternal = React.useRef(value);\n React.useEffect(() => {\n if (lastExternal.current === value) return;\n lastExternal.current = value;\n setText(value);\n }, [value]);\n\n React.useEffect(() => {\n if (text === value) return;\n const timer = setTimeout(() => commitRef.current(text), delayMs);\n return () => clearTimeout(timer);\n }, [text, value, delayMs]);\n\n return [text, setText] as const;\n}\n","// Open/close state for the toolbar menus.\n//\n// The grid has no dependency on a popover library, so the two behaviors users\n// expect from any menu — clicking elsewhere dismisses it, Escape dismisses it —\n// have to be implemented here. They are worth getting right: a menu that only\n// closes by clicking its own trigger feels broken, and a menu that traps focus\n// after Escape strands keyboard users.\n//\n// Listeners are attached only while a menu is open, so a page with several\n// grids on it is not paying for document-level handlers it never uses.\n\nimport * as React from \"react\";\n\n/** Everything a menu needs to wire itself up. */\nexport interface Dropdown {\n /** Is the menu currently open? */\n isOpen: boolean;\n /** Toggle — bind to the trigger's `onClick`. */\n toggle: () => void;\n /** Close programmatically, e.g. after a menu item is activated. */\n close: () => void;\n /** Attach to the `.tbx-menu-wrap` element; defines what counts as \"outside\". */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Attach to the trigger button so Escape can return focus to it. */\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n}\n\n/**\n * Self-contained dropdown state: opens on toggle, closes on outside pointer\n * down and on Escape (returning focus to the trigger).\n */\nexport function useDropdown(): Dropdown {\n const [isOpen, setIsOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const triggerRef = React.useRef<HTMLButtonElement | null>(null);\n\n React.useEffect(() => {\n if (!isOpen) return;\n\n // `pointerdown` rather than `click`: dismissing on press matches every\n // native menu, and it fires before the trigger's own click handler would\n // re-open a menu the user meant to close.\n const onPointerDown = (event: PointerEvent) => {\n const container = containerRef.current;\n const target = event.target;\n if (container && target instanceof Node && container.contains(target)) return;\n setIsOpen(false);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n setIsOpen(false);\n triggerRef.current?.focus();\n };\n\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [isOpen]);\n\n const toggle = React.useCallback(() => setIsOpen((open) => !open), []);\n const close = React.useCallback(() => setIsOpen(false), []);\n\n return { isOpen, toggle, close, containerRef, triggerRef };\n}\n","import { useMemo, useState } from \"react\";\nimport {\n defaultQuery,\n queryClientData,\n type ClientQueryOptions,\n type QueryState,\n} from \"@nexgrid/core\";\n\n/** Options for {@link useClientTableX}. */\nexport interface UseClientTableXOptions<TData> extends ClientQueryOptions<TData> {\n /** Optional initial query state overrides. */\n initialQuery?: Partial<QueryState>;\n}\nexport type UseClientNexGridOptions<TData> = UseClientTableXOptions<TData>;\n\n/**\n * React hook for effortless in-memory client-side grid operations.\n *\n * Automatically manages search, sorting, column filtering, and pagination\n * over a client-side dataset array.\n *\n * @example\n * ```tsx\n * export function StudentsGrid({ allStudents }: { allStudents: Student[] }) {\n * const grid = useClientTableX(allStudents);\n *\n * return (\n * <TableX\n * caption=\"Students\"\n * columns={columns}\n * {...grid}\n * />\n * );\n * }\n * ```\n */\nexport function useClientTableX<TData>(\n allData: readonly TData[],\n options?: UseClientTableXOptions<TData>,\n) {\n const [query, setQuery] = useState<QueryState>(() => ({\n ...defaultQuery(),\n ...options?.initialQuery,\n }));\n\n const page = useMemo(\n () => queryClientData(allData, query, options),\n [allData, query, options],\n );\n\n return {\n data: page.items,\n total: page.total,\n query,\n onQueryChange: setQuery,\n page: page.page,\n pageSize: page.pageSize,\n totalPages: page.totalPages,\n setQuery,\n };\n}\n\nexport const useClientNexGrid = useClientTableX;\n","// @nexgrid/react — public surface.\n//\n// The engine lives in `@nexgrid/core`. The handful of core exports re-exported\n// below are the ones a HOST needs in order to drive a controlled grid — build a\n// starting query, read it out of a URL, move a page — so an app can integrate\n// TableX without a second install and without learning the package split. The\n// rest of core (export writers, column helpers, locale internals) stays where\n// it is; import `@nexgrid/core` directly if you need it.\n\nexport { TableX, NexGrid } from \"./table-x.js\";\n\nexport type {\n TableXProps,\n TableXReactColumn,\n TableXNotice,\n TableXNoticeType,\n TableXTheme,\n NexGridProps,\n NexGridReactColumn,\n NexGridNotice,\n NexGridNoticeType,\n NexGridTheme,\n} from \"./types.js\";\n\n/** Column definitions render `React.ReactNode`; see {@link TableXReactColumn}. */\nexport type {\n TableXColumn,\n TableXColumnMeta,\n TableXCellContext,\n TableXLocale,\n NexGridColumn,\n NexGridColumnMeta,\n NexGridCellContext,\n NexGridLocale,\n QueryState,\n SortSpec,\n SortDir,\n PageSize,\n PagedResponse,\n Density,\n ExcelBadgeRule,\n} from \"@nexgrid/core\";\n\nexport { useClientTableX, useClientNexGrid } from \"./use-client-table-x.js\";\nexport type { UseClientTableXOptions, UseClientNexGridOptions } from \"./use-client-table-x.js\";\n\nexport {\n // In-memory client-side data querying\n queryClientData,\n // Building and reading a query (REST & OData v4)\n defaultQuery,\n parseQuery,\n serializeQuery,\n buildQueryUrl,\n toODataParams,\n buildODataUrl,\n fromODataResponse,\n primarySort,\n\n // Query reducers — the only supported way to mutate a QueryState\n withToggledSort,\n withToggledMultiSort,\n withSort,\n withSearch,\n withPage,\n withPageSize,\n withFilter,\n // Pagination math\n totalPagesFor,\n isPageSize,\n PAGE_SIZES,\n DEFAULT_PAGE_SIZE,\n // Localization\n DEFAULT_LOCALE,\n resolveLocale,\n} from \"@nexgrid/core\";\nexport type { ClientQueryOptions } from \"@nexgrid/core\";\n"],"mappings":"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","names":["React","getColumnId","getCellValue","getCellText","jsx","React","React","Fragment","jsx","jsxs","getColumnId","getCellValue","getCellText","leftOffsets","rightOffsets","lastLeftPinnedId","firstRightPinnedId","useMemo","useState","defaultQuery","queryClientData","queryClientData","defaultQuery","buildQueryUrl","primarySort","withToggledSort","withToggledMultiSort","withSearch","withPage","withPageSize","withFilter","totalPagesFor","isPageSize","PAGE_SIZES","resolveLocale"]}
|