@x12i/data 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +549 -3
- package/dist/chunk-ASP4ABDG.js +1987 -0
- package/dist/chunk-ASP4ABDG.js.map +1 -0
- package/dist/index.d.ts +394 -0
- package/dist/index.js +219 -0
- package/dist/index.js.map +1 -0
- package/dist/messages-BF20Mq97.d.ts +508 -0
- package/dist/react.d.ts +328 -0
- package/dist/react.js +3078 -0
- package/dist/react.js.map +1 -0
- package/dist/styles.css +1169 -0
- package/package.json +87 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/data-grid.tsx","../src/react/editors.tsx","../src/react/internal/fields.tsx","../src/react/filter-bar.tsx","../src/react/filters.tsx","../src/react/grid-rows.tsx","../src/react/cells.tsx","../src/react/internal/format.ts","../src/react/internal/menu.tsx","../src/react/internal/popover.tsx","../src/react/internal/dom.ts","../src/react/header.tsx","../src/react/internal/clipboard.ts","../src/react/internal/use-controllable.ts","../src/react/pagination.tsx","../src/react/toolbar.tsx","../src/react/use-server-rows.ts","../src/react/use-grid-state.ts","../src/react/use-saved-views.ts"],"sourcesContent":["import { defaultRangeExtractor, useVirtualizer, type Range } from \"@tanstack/react-virtual\";\nimport { Icon } from \"@x12i/icons\";\nimport { Button, Spinner, VisuallyHidden } from \"@x12i/ui\";\nimport {\n useCallback,\n useDeferredValue,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport {\n buildDisplayRows,\n clampNav,\n clearSelection,\n computeAggregate,\n computeViewIndexes,\n countSelected,\n createSearchIndex,\n createViewState,\n DEFAULT_COLUMN_MAX_WIDTH,\n DEFAULT_COLUMN_MIN_WIDTH,\n distinctValues,\n EMPTY_SELECTION,\n formatMessage,\n getColumnValue,\n gridToCsv,\n gridToTsv,\n indexColumns,\n isEditable,\n isEmptyValue,\n isFilterable,\n isFilterEffective,\n isNavigationKey,\n isResizable,\n isSelected,\n isSortable,\n layoutColumns,\n moveColumn,\n moveColumnTo,\n navigate,\n resizeColumn,\n resolveColumnAlign,\n resolveColumnOrder,\n resolveEditor,\n resolveMessages,\n selectAll,\n selectAllExceptNone,\n selectOnly,\n selectRange,\n setColumnFilter,\n setPinning,\n setSort as setSortModel,\n summarizeSelection,\n toggleGroup,\n toggleRow,\n toggleSort,\n toServerQuery,\n toText,\n type ColumnDef,\n type DelimitedOptions,\n type FilterModelItem,\n type FormatContext,\n type NavState,\n type ServerQuery,\n type SortDirection,\n} from \"../index\";\nimport { parseEditorInput, type CommitSource } from \"./editors\";\nimport { FilterBar, groupChipText, type Chip } from \"./filter-bar\";\nimport { FilterEditor, type FilterChoice } from \"./filters\";\nimport { GridRowItem, type CellOverride, type GridColumnInfo, type GridEnv, type GridRow, type RowOverrides, type Slot } from \"./grid-rows\";\nimport { HeaderCell, type DropPlacement, type HeaderActions, type HeaderPopover } from \"./header\";\nimport { writeClipboard, downloadText } from \"./internal/clipboard\";\nimport { detectDirection, isTextEntry } from \"./internal/dom\";\nimport { Checkbox } from \"./internal/fields\";\nimport { columnWidth, createFormatters, formatAggregate, plainFormatter, summarizeFilter } from \"./internal/format\";\nimport type { MenuItem } from \"./internal/menu\";\nimport { useControllableState, useEvent } from \"./internal/use-controllable\";\nimport { Pagination } from \"./pagination\";\nimport { Toolbar } from \"./toolbar\";\nimport type { DataGridColumn, DataGridHandle, DataGridProps, PaginationState, ToolbarOptions } from \"./types\";\nimport { fetchAllRows, useServerRowStore } from \"./use-server-rows\";\n\n// Layout numbers that cannot be tokens because the grid does arithmetic with them.\nconst SYSTEM_COLUMN_WIDTH = 44; // the checkbox and expander columns: one touch target\nconst DEFAULT_ROW_HEIGHT = 40; // until `--kit-grid-row-height` is measured\nconst DEFAULT_MAX_HEIGHT = 640; // the scroller's cap when `height` is not set\nconst ROW_VIRTUALIZE_THRESHOLD = 100;\nconst COLUMN_VIRTUALIZE_THRESHOLD = 24;\nconst DEFAULT_BLOCK_SIZE = 100;\nconst INITIAL_VIEWPORT_WIDTH = 1024; // before the scroller is measured\nconst DEFAULT_PAGE_SIZES = [10, 25, 50, 100];\nconst DEFAULT_PAGINATION: PaginationState = { page: 0, pageSize: 25 };\nconst SELECT_ID = \"__select\";\nconst EXPAND_ID = \"__expand\";\n\nconst NO_ROWS: readonly never[] = [];\nconst NO_INDEXES: number[] = [];\nconst NO_IDS: string[] = [];\nconst NO_FLAGS: Record<string, boolean> = {};\nconst NO_DISPLAY = { rows: [] as GridRow<never>[], groups: [] };\n\ntype Editing<Row> = { rowId: string; columnId: string; row: Row; error: string | null };\n\nfunction useDebouncedValue<T>(value: T, delay: number): T {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n if (delay <= 0) return;\n const timer = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n return delay <= 0 ? value : debounced;\n}\n\nfunction resolveToolbar(option: boolean | ToolbarOptions | undefined): Required<ToolbarOptions> | null {\n if (option === false) return null;\n const all = { search: true, columns: true, export: true, copy: true };\n if (option === undefined || option === true) return all;\n return { ...all, ...option };\n}\n\nfunction sameText(a: unknown, b: unknown): boolean {\n if (isEmptyValue(a) && isEmptyValue(b)) return true;\n return Object.is(a, b) || toText(a) === toText(b);\n}\n\nfunction activate(element: Element, event: { shiftKey: boolean }): void {\n element.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true, shiftKey: event.shiftKey }));\n}\n\n/**\n * An accessible, virtualized data grid. See the package README for the full\n * prop reference; this component owns the layout, the keyboard model and the\n * state, and delegates the data work to the headless engine of `@x12i/data`.\n */\nexport function DataGrid<Row>(props: DataGridProps<Row>) {\n const {\n columns,\n rows,\n dataSource,\n locale,\n timeZone,\n density,\n dir,\n height,\n maxHeight,\n estimateRowHeight = DEFAULT_ROW_HEIGHT,\n virtualize = \"auto\",\n overscan = 8,\n columnOverscan = 3,\n selectionMode = \"none\",\n multiSort = true,\n groupsExpandedByDefault = true,\n paginated = false,\n pageSizeOptions = DEFAULT_PAGE_SIZES,\n renderDetail,\n detailHeight,\n isRowSelectable,\n isRowExpandable,\n onRowClick,\n showTotals = false,\n quickFilterDelay = 250,\n } = props;\n\n const serverMode = dataSource !== undefined;\n const getRowId = useEvent(props.getRowId);\n\n // ------------------------------------------------------------- Language\n const messages = useMemo(() => resolveMessages(props.messages), [props.messages]);\n const t = useCallback(\n (key: Exclude<keyof typeof messages, \"operators\">, values?: Record<string, string | number>) =>\n formatMessage(messages[key], values, locale),\n [messages, locale],\n );\n const formatContext = useMemo<FormatContext>(\n () => ({ ...(locale === undefined ? {} : { locale }), ...(timeZone === undefined ? {} : { timeZone }), labels: { yes: messages.yes, no: messages.no } }),\n [locale, timeZone, messages.yes, messages.no],\n );\n const formatters = useMemo(() => createFormatters(columns, formatContext), [columns, formatContext]);\n const byId = useMemo(() => indexColumns(columns) as Map<string, DataGridColumn<Row>>, [columns]);\n\n // ---------------------------------------------------------------- State\n const [initialView] = useState(() => createViewState(columns));\n const [sort, setSort] = useControllableState(props.sort, props.defaultSort ?? [], props.onSortChange);\n const [filter, setFilter] = useControllableState(props.filter, props.defaultFilter ?? [], props.onFilterChange);\n const [quickFilter, setQuickFilter] = useControllableState(props.quickFilter, props.defaultQuickFilter ?? \"\", props.onQuickFilterChange);\n const [group, setGroup] = useControllableState(props.group, props.defaultGroup ?? [], props.onGroupChange);\n const [groupExpansion, setGroupExpansion] = useControllableState(props.groupExpansion, props.defaultGroupExpansion ?? NO_FLAGS, props.onGroupExpansionChange);\n const [columnOrder, setColumnOrder] = useControllableState(props.columnOrder, props.defaultColumnOrder ?? initialView.columnOrder, props.onColumnOrderChange);\n const [columnVisibility, setColumnVisibility] = useControllableState(props.columnVisibility, props.defaultColumnVisibility ?? initialView.columnVisibility, props.onColumnVisibilityChange);\n const [columnSizing, setColumnSizing] = useControllableState(props.columnSizing, props.defaultColumnSizing ?? initialView.columnSizing, props.onColumnSizingChange);\n const [columnPinning, setColumnPinning] = useControllableState(props.columnPinning, props.defaultColumnPinning ?? initialView.columnPinning, props.onColumnPinningChange);\n const [selection, setSelection] = useControllableState(props.selection, props.defaultSelection ?? EMPTY_SELECTION, props.onSelectionChange);\n const [expanded, setExpanded] = useControllableState(props.expanded, props.defaultExpanded ?? NO_FLAGS, props.onExpandedChange);\n const [pagination, setPagination] = useControllableState(props.pagination, props.defaultPagination ?? DEFAULT_PAGINATION, props.onPaginationChange);\n\n const effectiveGroup = useMemo(() => (serverMode ? [] : group.filter((item) => byId.has(item.field))), [serverMode, group, byId]);\n const effectiveFilters = useMemo(() => filter.filter((item) => byId.has(item.field) && isFilterEffective(item)), [filter, byId]);\n\n const [nav, setNav] = useState<NavState>({ row: 0, col: 0 });\n const [editing, setEditing] = useState<Editing<Row> | null>(null);\n const [overrides, setOverrides] = useState<Record<string, Record<string, CellOverride>>>({});\n const [popover, setPopover] = useState<{ columnId: string; kind: HeaderPopover } | null>(null);\n const [announcement, setAnnouncement] = useState({ text: \"\", flip: false });\n const [exporting, setExporting] = useState(false);\n const [rtl, setRtl] = useState(dir === \"rtl\");\n const [rowHeight, setRowHeight] = useState(estimateRowHeight);\n const [viewport, setViewport] = useState({ width: 0, height: 0 });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const scrollerRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLDivElement>(null);\n const focusRequest = useRef(false);\n const scrollRequest = useRef(false);\n const selectionAnchor = useRef<number | null>(null);\n const pendingColumnFocus = useRef<string | null>(null);\n const editingRef = useRef<Editing<Row> | null>(null);\n editingRef.current = editing;\n\n const announce = useCallback((text: string) => {\n setAnnouncement((previous) => ({ text, flip: previous.text === text ? !previous.flip : previous.flip }));\n }, []);\n\n // ------------------------------------------------------------ Direction\n useLayoutEffect(() => {\n setRtl(dir !== undefined ? dir === \"rtl\" : detectDirection(rootRef.current) === \"rtl\");\n }, [dir]);\n\n // ---------------------------------------------------------- Column layout\n const layout = useMemo(\n () => layoutColumns(columns, { columnOrder, columnVisibility, columnPinning }),\n [columns, columnOrder, columnVisibility, columnPinning],\n );\n const hasSelectColumn = selectionMode !== \"none\";\n const hasExpandColumn = renderDetail !== undefined && !serverMode;\n\n const geometry = useMemo(() => {\n const system = (kind: \"select\" | \"expand\", id: string): GridColumnInfo<Row> => ({\n kind,\n id,\n column: null,\n width: SYSTEM_COLUMN_WIDTH,\n minWidth: SYSTEM_COLUMN_WIDTH,\n maxWidth: SYSTEM_COLUMN_WIDTH,\n pin: \"start\",\n pinOffset: 0,\n pinEdge: false,\n align: \"center\",\n first: false,\n });\n const data = (id: string): GridColumnInfo<Row> | null => {\n const column = byId.get(id);\n if (column === undefined) return null;\n return {\n kind: \"data\",\n id,\n column,\n width: columnWidth(column, columnSizing),\n minWidth: column.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH,\n maxWidth: column.maxWidth ?? DEFAULT_COLUMN_MAX_WIDTH,\n pin: null,\n pinOffset: 0,\n pinEdge: false,\n align: resolveColumnAlign(column),\n first: false,\n };\n };\n const known = (ids: string[]) => ids.map(data).filter((info): info is GridColumnInfo<Row> => info !== null);\n\n const start = [\n ...(hasSelectColumn ? [system(\"select\", SELECT_ID)] : []),\n ...(hasExpandColumn ? [system(\"expand\", EXPAND_ID)] : []),\n ...known(layout.start),\n ];\n const center = known(layout.center);\n const end = known(layout.end);\n\n let offset = 0;\n for (const info of start) {\n info.pin = \"start\";\n info.pinOffset = offset;\n offset += info.width;\n }\n const startWidth = offset;\n const lastStart = start[start.length - 1];\n if (lastStart !== undefined) lastStart.pinEdge = true;\n\n offset = 0;\n for (let i = end.length - 1; i >= 0; i -= 1) {\n const info = end[i] as GridColumnInfo<Row>;\n info.pin = \"end\";\n info.pinOffset = offset;\n offset += info.width;\n }\n const endWidth = offset;\n const firstEnd = end[0];\n if (firstEnd !== undefined) firstEnd.pinEdge = true;\n\n const centerOffsets = [0];\n for (const info of center) centerOffsets.push((centerOffsets[centerOffsets.length - 1] ?? 0) + info.width);\n const centerWidth = centerOffsets[centerOffsets.length - 1] ?? 0;\n\n const all = [...start, ...center, ...end];\n const firstData = all.find((info) => info.kind === \"data\");\n if (firstData !== undefined) firstData.first = true;\n\n return {\n all,\n startCount: start.length,\n centerCount: center.length,\n startWidth,\n centerWidth,\n endWidth,\n centerOffsets,\n totalWidth: startWidth + centerWidth + endWidth,\n };\n }, [byId, columnSizing, hasSelectColumn, hasExpandColumn, layout]);\n\n const { all: gridColumns, startCount, centerCount, startWidth, endWidth, centerWidth, centerOffsets, totalWidth } = geometry;\n const dataColumns = useMemo(\n () => gridColumns.flatMap((info) => (info.column === null ? [] : [info.column])),\n [gridColumns],\n );\n const hasColumnGroups = dataColumns.some((column) => column.group !== undefined && column.group !== \"\");\n const headerRowCount = hasColumnGroups ? 2 : 1;\n const headerHeight = rowHeight * headerRowCount;\n\n // ---------------------------------------------------------- Server rows\n const quickText = useDeferredValue(quickFilter).trim();\n const serverQuick = useDebouncedValue(quickFilter.trim(), serverMode ? quickFilterDelay : 0);\n const blockSize = paginated ? Math.max(1, pagination.pageSize) : (props.blockSize ?? DEFAULT_BLOCK_SIZE);\n const queryKey = JSON.stringify([sort, effectiveFilters, serverQuick]);\n const query = useMemo<ServerQuery>(\n () =>\n toServerQuery(columns, {\n sort,\n filter: effectiveFilters,\n group: [],\n ...(serverQuick === \"\" ? {} : { quickFilter: serverQuick }),\n }),\n // `queryKey` stands for the values it was built from, so a new array with the same content is not a new query.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [queryKey, columns],\n );\n const { store, snapshot } = useServerRowStore<Row>({ dataSource, blockSize, query });\n\n // ------------------------------------------------------- Client pipeline\n const rowsArray = (rows ?? NO_ROWS) as readonly Row[];\n const hasQuick = quickText !== \"\";\n const searchIndex = useMemo(\n () => (serverMode || !hasQuick ? undefined : createSearchIndex(rowsArray, columns, formatContext)),\n [serverMode, hasQuick, rowsArray, columns, formatContext],\n );\n const indexes = useMemo(\n () =>\n serverMode\n ? NO_INDEXES\n : computeViewIndexes(rowsArray, columns, {\n filter: effectiveFilters,\n sort,\n quickFilter: quickText,\n searchIndex,\n ...(locale === undefined ? {} : { locale }),\n ...(timeZone === undefined ? {} : { timeZone }),\n labels: formatContext.labels,\n }),\n [serverMode, rowsArray, columns, effectiveFilters, sort, quickText, searchIndex, locale, timeZone, formatContext],\n );\n\n const pageSize = Math.max(1, pagination.pageSize);\n const totalCount: number | null = serverMode ? snapshot.total : indexes.length;\n const lastPageIndex = totalCount === null ? Number.POSITIVE_INFINITY : Math.max(0, Math.ceil(totalCount / pageSize) - 1);\n const page = paginated ? Math.min(Math.max(pagination.page, 0), lastPageIndex) : 0;\n const pageOffset = paginated ? page * pageSize : 0;\n\n const pageIndexes = useMemo(\n () => (!paginated || serverMode ? indexes : indexes.slice(pageOffset, pageOffset + pageSize)),\n [paginated, serverMode, indexes, pageOffset, pageSize],\n );\n\n const withDetail = renderDetail !== undefined;\n const display = useMemo(\n () =>\n serverMode\n ? (NO_DISPLAY as { rows: GridRow<Row>[] })\n : buildDisplayRows(rowsArray, pageIndexes, columns, {\n getRowId,\n group: effectiveGroup,\n groupExpansion,\n groupsExpandedByDefault,\n expandedRows: expanded,\n withDetail,\n sort,\n ...(locale === undefined ? {} : { locale }),\n }),\n [serverMode, rowsArray, pageIndexes, columns, getRowId, effectiveGroup, groupExpansion, groupsExpandedByDefault, expanded, withDetail, sort, locale],\n );\n\n const serverRowCount =\n snapshot.total === null ? 0 : paginated ? Math.max(0, Math.min(pageSize, snapshot.total - pageOffset)) : snapshot.total;\n const rowCount = serverMode ? serverRowCount : display.rows.length;\n\n // A fresh cache whenever the store's contents or the visible page change, so cached row\n // objects stay referentially stable between renders without ever going stale.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const serverItems = useMemo(() => new Map<number, GridRow<Row>>(), [store, snapshot.version, pageOffset]);\n const getItem = useCallback(\n (index: number): GridRow<Row> | undefined => {\n if (!serverMode) return display.rows[index];\n if (index < 0 || index >= serverRowCount) return undefined;\n const cached = serverItems.get(index);\n if (cached !== undefined) return cached;\n const globalIndex = pageOffset + index;\n const row = store?.getRow(globalIndex);\n const item: GridRow<Row> =\n row === undefined\n ? { kind: \"placeholder\", id: `~loading:${globalIndex}`, index: globalIndex, depth: 0, failed: store?.getBlockStatus(globalIndex) === \"error\" }\n : { kind: \"data\", id: getRowId(row, globalIndex), row, index: globalIndex, depth: 0 };\n serverItems.set(index, item);\n return item;\n },\n [serverMode, display, serverRowCount, serverItems, pageOffset, store, getRowId],\n );\n\n const treegrid = effectiveGroup.length > 0;\n const footerRows = showTotals ? 1 : 0;\n const ariaRowOffset = headerRowCount + (treegrid ? 0 : pageOffset);\n const ariaRowCount =\n serverMode && snapshot.total === null\n ? -1\n : (treegrid ? rowCount : serverMode ? (snapshot.total ?? 0) : paginated ? indexes.length : rowCount) + headerRowCount + footerRows;\n\n // ------------------------------------------------------------ Row height\n useLayoutEffect(() => {\n const scroller = scrollerRef.current;\n if (scroller === null) return;\n const measure = () => {\n const token = getComputedStyle(scroller).getPropertyValue(\"--kit-grid-row-height\").trim();\n let next = token.endsWith(\"px\") ? Number.parseFloat(token) : Number.NaN;\n if (Number.isNaN(next)) {\n const measured = headerRef.current?.offsetHeight ?? 0;\n next = measured > 0 ? measured : estimateRowHeight;\n }\n setRowHeight((previous) => (previous === next ? previous : next));\n };\n measure();\n const header = headerRef.current;\n if (header === null || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(header);\n return () => observer.disconnect();\n }, [density, estimateRowHeight, headerRowCount]);\n\n useLayoutEffect(() => {\n const scroller = scrollerRef.current;\n if (scroller === null) return;\n const read = () =>\n setViewport((previous) =>\n previous.width === scroller.clientWidth && previous.height === scroller.clientHeight\n ? previous\n : { width: scroller.clientWidth, height: scroller.clientHeight },\n );\n read();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(read);\n observer.observe(scroller);\n return () => observer.disconnect();\n }, []);\n\n // --------------------------------------------------------- Virtualization\n const virtualizeRows = virtualize === true || (virtualize === \"auto\" && rowCount > ROW_VIRTUALIZE_THRESHOLD);\n const virtualizeColumns =\n !hasColumnGroups && (virtualize === true || (virtualize === \"auto\" && centerCount > COLUMN_VIRTUALIZE_THRESHOLD));\n const detailEstimate = detailHeight ?? rowHeight * 4;\n\n const navClamped = useMemo(\n () => clampNav(nav, { rowCount: rowCount + 1, columnCount: Math.max(gridColumns.length, 1), pageSize: 1 }),\n [nav, rowCount, gridColumns.length],\n );\n const cursorRow = navClamped.row - 1;\n const cursorCenterColumn = navClamped.col - startCount;\n\n const rowRange = useCallback(\n (range: Range) => {\n if (!virtualizeRows) return Array.from({ length: range.count }, (_, index) => index);\n const base = defaultRangeExtractor(range);\n if (cursorRow < 0 || cursorRow >= range.count || base.includes(cursorRow)) return base;\n return [...base, cursorRow].sort((a, b) => a - b);\n },\n [virtualizeRows, cursorRow],\n );\n const estimateRow = useCallback((index: number) => (getItem(index)?.kind === \"detail\" ? detailEstimate : rowHeight), [getItem, detailEstimate, rowHeight]);\n // Server rows are keyed by place: while stale blocks wait for fresh ones after a query change, one id can\n // be on screen twice (a row of the old result and of the new one), and a place is also what the cursor follows.\n const rowKey = useCallback((index: number) => (serverMode ? index : (getItem(index)?.id ?? index)), [serverMode, getItem]);\n\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLElement>({\n count: rowCount,\n getScrollElement: () => scrollerRef.current,\n estimateSize: estimateRow,\n overscan,\n scrollMargin: headerHeight,\n scrollPaddingStart: headerHeight,\n scrollPaddingEnd: footerRows * rowHeight,\n getItemKey: rowKey,\n rangeExtractor: rowRange,\n // Gives the first render (and the server render) a window before the element is measured.\n initialRect: {\n width: 0,\n height: virtualizeRows ? (typeof height === \"number\" ? height : DEFAULT_MAX_HEIGHT) : Math.max(rowCount * rowHeight, 1),\n },\n });\n\n const columnRange = useCallback(\n (range: Range) => {\n if (!virtualizeColumns) return Array.from({ length: range.count }, (_, index) => index);\n const base = defaultRangeExtractor(range);\n if (cursorCenterColumn < 0 || cursorCenterColumn >= range.count || base.includes(cursorCenterColumn)) return base;\n return [...base, cursorCenterColumn].sort((a, b) => a - b);\n },\n [virtualizeColumns, cursorCenterColumn],\n );\n const estimateColumn = useCallback((index: number) => (centerOffsets[index + 1] ?? 0) - (centerOffsets[index] ?? 0), [centerOffsets]);\n const columnKey = useCallback((index: number) => gridColumns[startCount + index]?.id ?? index, [gridColumns, startCount]);\n\n const columnVirtualizer = useVirtualizer<HTMLDivElement, HTMLElement>({\n horizontal: true,\n count: centerCount,\n getScrollElement: () => scrollerRef.current,\n estimateSize: estimateColumn,\n overscan: columnOverscan,\n scrollMargin: startWidth,\n scrollPaddingStart: startWidth,\n scrollPaddingEnd: endWidth,\n getItemKey: columnKey,\n rangeExtractor: columnRange,\n isRtl: rtl,\n initialRect: { width: virtualizeColumns ? INITIAL_VIEWPORT_WIDTH : Math.max(totalWidth, 1), height: 0 },\n });\n\n // Cached sizes are stale when the row height is measured or a column is resized.\n useEffect(() => {\n rowVirtualizer.measure();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowHeight, detailEstimate]);\n useEffect(() => {\n columnVirtualizer.measure();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [centerOffsets]);\n\n const virtualRows = rowVirtualizer.getVirtualItems();\n const virtualColumns = columnVirtualizer.getVirtualItems();\n const firstVirtual = virtualRows[0]?.index ?? 0;\n const lastVirtual = virtualRows[virtualRows.length - 1]?.index ?? 0;\n\n const slots = useMemo<Slot[]>(() => {\n const out: Slot[] = [];\n for (let i = 0; i < startCount; i += 1) out.push({ kind: \"col\", index: i });\n let previous = -1;\n for (const item of virtualColumns) {\n const gap = (centerOffsets[item.index] ?? 0) - (previous < 0 ? 0 : (centerOffsets[previous + 1] ?? 0));\n if (gap > 0) out.push({ kind: \"spacer\", size: gap });\n out.push({ kind: \"col\", index: startCount + item.index });\n previous = item.index;\n }\n const tail = centerWidth - (previous < 0 ? 0 : (centerOffsets[previous + 1] ?? 0));\n if (tail > 0) out.push({ kind: \"spacer\", size: tail });\n for (let i = startCount + centerCount; i < gridColumns.length; i += 1) out.push({ kind: \"col\", index: i });\n return out;\n }, [virtualColumns, centerOffsets, centerWidth, startCount, centerCount, gridColumns.length]);\n\n // ----------------------------------------------------- Server block loading\n useEffect(() => {\n if (store === null) return;\n if (snapshot.total === null) {\n store.request(pageOffset, pageOffset + 1);\n } else if (rowCount > 0) {\n const from = Math.max(0, firstVirtual - overscan);\n store.request(pageOffset + from, pageOffset + Math.min(rowCount, lastVirtual + overscan + 1));\n }\n }, [store, snapshot.version, snapshot.total, pageOffset, rowCount, firstVirtual, lastVirtual, overscan]);\n\n // ------------------------------------------------------ Page resets\n const resetKey = `${JSON.stringify(sort)}|${JSON.stringify(effectiveFilters)}|${serverMode ? serverQuick : quickText}`;\n const lastResetKey = useRef(resetKey);\n const resetPage = useEvent(() => {\n if (paginated && pagination.page !== 0) setPagination({ ...pagination, page: 0 });\n });\n useEffect(() => {\n if (lastResetKey.current === resetKey) return;\n lastResetKey.current = resetKey;\n resetPage();\n }, [resetKey, resetPage]);\n\n const clampPage = useEvent(() => {\n if (paginated && pagination.page !== page) setPagination({ ...pagination, page });\n });\n useEffect(() => {\n clampPage();\n }, [page, pagination.page, clampPage]);\n\n // ---------------------------------------------------- Announcements: filters\n const loadingFlag = serverMode ? snapshot.loading || store === null : props.loading === true;\n const filterKey = `${JSON.stringify(effectiveFilters)}|${serverMode ? serverQuick : quickText}`;\n const lastFilterKey = useRef(filterKey);\n const pendingFilterAnnouncement = useRef(false);\n useEffect(() => {\n if (lastFilterKey.current !== filterKey) {\n lastFilterKey.current = filterKey;\n pendingFilterAnnouncement.current = true;\n }\n // In server mode the store was handed the new query by an effect that ran just before this one, so\n // this render's snapshot may still describe the old query: ask the store, and wait for a fresh answer.\n let count: number | null;\n if (serverMode) {\n const live = store?.getSnapshot();\n count = live !== undefined && !live.loading && !live.stale ? live.total : null;\n } else {\n count = loadingFlag ? null : totalCount;\n }\n if (!pendingFilterAnnouncement.current || count === null) return;\n pendingFilterAnnouncement.current = false;\n const active = effectiveFilters.length > 0 || (serverMode ? serverQuick : quickText) !== \"\";\n announce(active ? t(\"announceFiltered\", { count }) : t(\"announceFilterCleared\", { count }));\n }, [filterKey, totalCount, loadingFlag, store, snapshot.version, effectiveFilters.length, serverMode, serverQuick, quickText, announce, t]);\n\n // Edits made through `onCellEdit` are dropped when the app hands over new rows.\n useEffect(() => {\n setOverrides((previous) => (Object.keys(previous).length === 0 ? previous : {}));\n }, [rows, dataSource]);\n\n // -------------------------------------------------------------- Selection\n const selectableIds = useMemo(() => {\n if (serverMode || selectionMode !== \"multiple\") return NO_IDS;\n const out: string[] = [];\n for (const index of indexes) {\n const row = rowsArray[index] as Row;\n if (isRowSelectable?.(row) === false) continue;\n out.push(getRowId(row, index));\n }\n return out;\n }, [serverMode, selectionMode, indexes, rowsArray, isRowSelectable, getRowId]);\n\n const selectAllState = useMemo<\"none\" | \"some\" | \"all\">(() => {\n if (selectionMode !== \"multiple\") return \"none\";\n if (serverMode) {\n const total = snapshot.total ?? 0;\n const count = countSelected(selection, total);\n return count === 0 ? \"none\" : count >= total ? \"all\" : \"some\";\n }\n return summarizeSelection(selection, selectableIds);\n }, [selectionMode, serverMode, snapshot.total, selection, selectableIds]);\n\n const selectedCount = countSelected(selection, totalCount ?? 0);\n\n const commitSelection = useEvent((next: typeof selection) => {\n setSelection(next);\n announce(t(\"announceSelection\", { count: countSelected(next, totalCount ?? 0) }));\n });\n\n const idsBetween = (from: number, to: number): string[] => {\n const ids: string[] = [];\n for (let index = Math.min(from, to); index <= Math.max(from, to); index += 1) {\n const item = getItem(index);\n if (item?.kind !== \"data\") continue;\n if (isRowSelectable?.(item.row) === false) continue;\n ids.push(item.id);\n }\n return ids;\n };\n\n const toggleSelect = useEvent((rowId: string, displayIndex: number, range: boolean) => {\n if (selectionMode === \"none\") return;\n if (selectionMode === \"single\") {\n commitSelection(isSelected(selection, rowId) ? clearSelection() : selectOnly(rowId));\n selectionAnchor.current = displayIndex;\n return;\n }\n const target = !isSelected(selection, rowId);\n const anchor = selectionAnchor.current;\n if (range && anchor !== null) {\n const ids = idsBetween(anchor, displayIndex);\n commitSelection(selectRange(selection, ids, 0, ids.length - 1, target));\n } else {\n commitSelection(toggleRow(selection, rowId, target));\n }\n selectionAnchor.current = displayIndex;\n });\n\n const toggleSelectAll = useEvent(() => {\n if (selectionMode !== \"multiple\") return;\n if (selectAllState === \"all\") commitSelection(clearSelection());\n else commitSelection(serverMode ? selectAllExceptNone() : selectAll(selectableIds));\n });\n\n // --------------------------------------------------------- Totals and groups\n const totals = useMemo<Record<string, unknown>>(() => {\n if (!showTotals) return {};\n if (serverMode) return props.totals ?? {};\n const subset = indexes.map((index) => rowsArray[index] as Row);\n const out: Record<string, unknown> = {};\n for (const column of dataColumns) {\n if (column.aggregate !== undefined) out[column.id] = computeAggregate(column, subset);\n }\n return out;\n }, [showTotals, serverMode, props.totals, indexes, rowsArray, dataColumns]);\n const hasTotals = showTotals && (dataColumns.some((column) => column.aggregate !== undefined || column.footerCell !== undefined) || Object.keys(totals).length > 0);\n\n const formatGroupValue = useCallback(\n (field: string, value: unknown) => {\n const column = byId.get(field);\n return column === undefined ? toText(value) : plainFormatter(column, formatContext)(value, undefined as Row);\n },\n [byId, formatContext],\n );\n const formatColumnAggregate = useCallback(\n (columnId: string, value: unknown) => {\n const column = byId.get(columnId);\n return column === undefined ? toText(value) : formatAggregate(column, value, formatContext);\n },\n [byId, formatContext],\n );\n\n // ------------------------------------------------------------ User actions\n const totalForAnnouncement = totalCount ?? rowCount;\n\n const sortColumn = useEvent((columnId: string, multi: boolean) => {\n const column = byId.get(columnId);\n if (column === undefined || !isSortable(column)) return;\n const next = toggleSort(sort, columnId, multi && multiSort);\n setSort(next);\n const direction = next.find((item) => item.field === columnId)?.direction;\n announce(\n direction === undefined\n ? t(\"announceSortCleared\", { count: totalForAnnouncement })\n : t(\"announceSorted\", { column: column.header, direction, count: totalForAnnouncement }),\n );\n });\n\n const setColumnSort = (columnId: string, direction: SortDirection | null) => {\n const column = byId.get(columnId);\n if (column === undefined) return;\n setSort(setSortModel(sort, columnId, direction, false));\n announce(\n direction === null\n ? t(\"announceSortCleared\", { count: totalForAnnouncement })\n : t(\"announceSorted\", { column: column.header, direction, count: totalForAnnouncement }),\n );\n };\n\n const resizeTo = useEvent((columnId: string, width: number, announceIt?: boolean) => {\n const column = byId.get(columnId);\n if (column === undefined) return;\n const next = resizeColumn(columns, columnSizing, columnId, width);\n if (next[columnId] === columnSizing[columnId]) return;\n setColumnSizing(next);\n if (announceIt === true) announce(t(\"announceColumnResized\", { column: column.header, width: next[columnId] ?? width }));\n });\n\n // Takes a move that `moveColumn` or `moveColumnTo` worked out, and applies it if it changes anything.\n const applyMove = (columnId: string, moved: ReturnType<typeof moveColumn>) => {\n const column = byId.get(columnId);\n if (column === undefined) return;\n const fingerprint = (order: readonly string[], pinning: { start: readonly string[]; end: readonly string[] }) =>\n JSON.stringify([order, pinning.start, pinning.end]);\n if (fingerprint(moved.columnOrder, moved.columnPinning) === fingerprint(resolveColumnOrder(columns, columnOrder), columnPinning)) return;\n setColumnOrder(moved.columnOrder);\n if (moved.columnPinning !== columnPinning) setColumnPinning(moved.columnPinning);\n const next = layoutColumns(columns, { columnOrder: moved.columnOrder, columnVisibility, columnPinning: moved.columnPinning });\n const ids = [...next.start, ...next.center, ...next.end];\n announce(t(\"announceColumnMoved\", { column: column.header, position: ids.indexOf(columnId) + 1, total: ids.length }));\n pendingColumnFocus.current = columnId;\n };\n\n const moveBy = useEvent((columnId: string, delta: -1 | 1) => {\n applyMove(columnId, moveColumn(columns, { columnOrder, columnVisibility, columnPinning }, columnId, delta));\n });\n\n // ---- Reordering by drag and drop. Only the pointer needs it: moveBy covers the keyboard and the menu.\n const draggedColumn = useRef<string | null>(null);\n const [columnDrag, setColumnDrag] = useState<{ id: string; over: { id: string; placement: DropPlacement } | null } | null>(null);\n\n const zoneOfColumn = (columnId: string) =>\n layout.start.includes(columnId) ? \"start\" : layout.end.includes(columnId) ? \"end\" : layout.center.includes(columnId) ? \"center\" : null;\n\n const dragStartColumn = useEvent((columnId: string) => {\n draggedColumn.current = columnId;\n setColumnDrag({ id: columnId, over: null });\n });\n const dragOverColumn = useEvent((targetId: string, placement: DropPlacement): boolean => {\n const dragged = draggedColumn.current;\n if (dragged === null || dragged === targetId || zoneOfColumn(dragged) !== zoneOfColumn(targetId)) return false;\n setColumnDrag((current) =>\n current === null || (current.over?.id === targetId && current.over.placement === placement) ? current : { ...current, over: { id: targetId, placement } },\n );\n return true;\n });\n const dragLeaveColumn = useEvent((targetId: string) => {\n setColumnDrag((current) => (current?.over?.id === targetId ? { ...current, over: null } : current));\n });\n const dragEndColumn = useEvent(() => {\n draggedColumn.current = null;\n setColumnDrag(null);\n });\n const dropColumn = useEvent((targetId: string, placement: DropPlacement) => {\n const dragged = draggedColumn.current;\n dragEndColumn();\n if (dragged === null) return;\n applyMove(dragged, moveColumnTo(columns, { columnOrder, columnVisibility, columnPinning }, dragged, targetId, placement));\n });\n\n const hideColumn = (columnId: string) => {\n const column = byId.get(columnId);\n if (column === undefined) return;\n setColumnVisibility({ ...columnVisibility, [columnId]: false });\n announce(t(\"announceColumnHidden\", { column: column.header }));\n setNav((previous) => ({ row: 0, col: Math.min(previous.col, Math.max(gridColumns.length - 2, 0)) }));\n };\n\n const pinColumn = (columnId: string, side: \"start\" | \"end\" | false) => {\n const column = byId.get(columnId);\n if (column === undefined) return;\n setColumnPinning(setPinning(columnPinning, columnId, side));\n if (side !== false) announce(t(\"announcePinned\", { column: column.header, side }));\n pendingColumnFocus.current = columnId;\n };\n\n const changeGroup = (columnId: string) => {\n const column = byId.get(columnId);\n if (column === undefined) return;\n const adding = !group.some((item) => item.field === columnId);\n setGroup(toggleGroup(group, columnId));\n if (adding) announce(t(\"announceGrouped\", { column: column.header }));\n };\n\n const applyFilter = (columnId: string, item: FilterModelItem | null) => {\n setFilter(setColumnFilter(filter, columnId, item));\n };\n\n const toggleExpand = useEvent((rowId: string) => {\n if (expanded[rowId] === true) {\n const { [rowId]: _closed, ...rest } = expanded;\n void _closed;\n setExpanded(rest);\n } else setExpanded({ ...expanded, [rowId]: true });\n });\n\n const toggleGroupRow = useEvent((groupId: string) => {\n const current = groupExpansion[groupId] ?? groupsExpandedByDefault;\n setGroupExpansion({ ...groupExpansion, [groupId]: !current });\n });\n\n // ----------------------------------------------------------------- Editing\n const applyEdit = useEvent(async (rowId: string, column: DataGridColumn<Row>, row: Row, value: unknown) => {\n const previousValue = overrides[rowId]?.[column.id]?.value ?? getColumnValue(column, row);\n if (sameText(previousValue, value)) return;\n const put = (status: CellOverride[\"status\"], stored: unknown) =>\n setOverrides((all) => {\n const current = all[rowId]?.[column.id];\n if (status !== \"pending\" && (current === undefined || !Object.is(current.value, value))) return all;\n return { ...all, [rowId]: { ...all[rowId], [column.id]: { value: stored, status } } };\n });\n put(\"pending\", value);\n if (props.onCellEdit === undefined) {\n put(\"saved\", value);\n return;\n }\n try {\n await props.onCellEdit({ row, rowId, column, value, previousValue });\n put(\"saved\", value);\n announce(t(\"cellSaved\", { column: column.header }));\n } catch {\n put(\"error\", previousValue);\n announce(t(\"cellEditFailed\", { column: column.header }));\n }\n });\n\n const focusCellSoon = () => {\n focusRequest.current = true;\n setNav((previous) => ({ ...previous }));\n };\n\n const startEdit = useEvent((rowId: string, columnId: string, row: Row) => {\n const column = byId.get(columnId);\n if (column === undefined || !isEditable(column, row) || resolveEditor(column) === \"boolean\") return;\n setOverrides((all) => {\n const current = all[rowId]?.[columnId];\n if (current?.status !== \"error\") return all;\n const { [columnId]: _failed, ...rest } = all[rowId] ?? {};\n void _failed;\n return { ...all, [rowId]: rest };\n });\n setEditing({ rowId, columnId, row, error: null });\n });\n\n const cancelEdit = useEvent(() => {\n setEditing(null);\n focusCellSoon();\n });\n\n const commitEdit = useEvent((input: string, source: CommitSource) => {\n const edit = editingRef.current;\n if (edit === null) return;\n const column = byId.get(edit.columnId);\n if (column === undefined) return;\n const parsed = parseEditorInput(column, input, edit.row, messages);\n const problem = parsed.ok ? column.validate?.(parsed.value, edit.row) : parsed.message;\n if (problem !== undefined && problem !== null && problem !== \"\") {\n if (source === \"blur\") {\n setEditing(null);\n announce(problem);\n } else {\n setEditing({ ...edit, error: problem });\n }\n return;\n }\n if (!parsed.ok) return;\n setEditing(null);\n if (source !== \"blur\") focusCellSoon();\n void applyEdit(edit.rowId, column, edit.row, parsed.value);\n });\n\n const toggleBoolean = useEvent((rowId: string, columnId: string, value: boolean, row: Row) => {\n const column = byId.get(columnId);\n if (column === undefined || !isEditable(column, row)) return;\n const problem = column.validate?.(value, row);\n if (problem !== undefined && problem !== null && problem !== \"\") {\n announce(problem);\n return;\n }\n void applyEdit(rowId, column, row, value);\n });\n\n // ------------------------------------------------------------ Export, copy\n const visibleColumnList = dataColumns as ColumnDef<Row>[];\n\n const collectRows = useEvent(async (): Promise<Row[]> => {\n if (dataSource !== undefined) return fetchAllRows(dataSource, query);\n return indexes.map((index) => rowsArray[index] as Row);\n });\n\n const exportCsv = useEvent(async (options?: DelimitedOptions): Promise<string> => {\n const all = await collectRows();\n return gridToCsv(all, visibleColumnList, { ...formatContext, ...options });\n });\n\n const selectedRows = useEvent((): Row[] => {\n const out: Row[] = [];\n if (serverMode) {\n for (let index = 0; index < serverRowCount; index += 1) {\n const item = getItem(index);\n if (item?.kind === \"data\" && isSelected(selection, item.id)) out.push(item.row);\n }\n return out;\n }\n for (const index of indexes) {\n const row = rowsArray[index] as Row;\n if (isSelected(selection, getRowId(row, index))) out.push(row);\n }\n return out;\n });\n\n const copySelection = useEvent(async (): Promise<boolean> => {\n let text: string;\n const chosen = selectedRows();\n if (chosen.length > 0) {\n text = gridToTsv(chosen, visibleColumnList, { ...formatContext, header: false });\n } else {\n const info = gridColumns[navClamped.col];\n const item = getItem(navClamped.row - 1);\n if (info?.column == null || item?.kind !== \"data\") return false;\n text = formatters.get(info.column.id)?.(getColumnValue(info.column, item.row), item.row) ?? \"\";\n }\n const ok = await writeClipboard(text);\n announce(ok ? t(\"copied\", { count: Math.max(chosen.length, 1) }) : t(\"copyFailed\"));\n return ok;\n });\n\n const runExport = useEvent(async () => {\n setExporting(true);\n try {\n const csv = await exportCsv({ bom: true });\n if (props.onExport !== undefined) props.onExport(csv);\n else downloadText(csv, props.exportFileName ?? \"export.csv\");\n } finally {\n setExporting(false);\n }\n });\n\n // ----------------------------------------------------------------- Handle\n const moveTo = (next: NavState) => {\n focusRequest.current = true;\n scrollRequest.current = true;\n setNav(next);\n };\n\n useImperativeHandle(\n props.ref,\n (): DataGridHandle<Row> => ({\n scrollToIndex: (index) => rowVirtualizer.scrollToIndex(Math.max(0, Math.min(index, rowCount - 1)), { align: \"auto\" }),\n scrollToRow: (rowId) => {\n for (let index = 0; index < rowCount; index += 1) {\n if (getItem(index)?.id === rowId) {\n rowVirtualizer.scrollToIndex(index, { align: \"auto\" });\n return;\n }\n }\n },\n focusCell: (row, column) => moveTo(clampNav({ row, col: column }, { rowCount: rowCount + 1, columnCount: Math.max(gridColumns.length, 1), pageSize: 1 })),\n exportCsv: (options) => exportCsv(options),\n copySelection: () => copySelection(),\n getSelectedRows: () => selectedRows(),\n reload: () => store?.reset(),\n getViewState: () => ({ sort, filter, group, columnOrder, columnVisibility, columnSizing, columnPinning }),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [rowVirtualizer, rowCount, getItem, gridColumns.length, store, sort, filter, group, columnOrder, columnVisibility, columnSizing, columnPinning],\n );\n\n // ----------------------------------------------------------- Focus handling\n const findCell = (row: number, col: number): HTMLElement | null =>\n scrollerRef.current?.querySelector<HTMLElement>(`[data-nav-row=\"${row}\"][data-nav-col=\"${col}\"]`) ?? null;\n\n useLayoutEffect(() => {\n if (!scrollRequest.current) return;\n scrollRequest.current = false;\n if (navClamped.row >= 1) rowVirtualizer.scrollToIndex(navClamped.row - 1, { align: \"auto\" });\n const centerIndex = navClamped.col - startCount;\n if (centerIndex >= 0 && centerIndex < centerCount) columnVirtualizer.scrollToIndex(centerIndex, { align: \"auto\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [nav]);\n\n useLayoutEffect(() => {\n if (!focusRequest.current) return;\n const cell = findCell(navClamped.row, navClamped.col);\n if (cell === null) return;\n focusRequest.current = false;\n cell.focus({ preventScroll: true });\n });\n\n // A column that was moved or pinned keeps the cursor.\n useLayoutEffect(() => {\n const id = pendingColumnFocus.current;\n if (id === null) return;\n const index = gridColumns.findIndex((info) => info.id === id);\n if (index < 0) return;\n pendingColumnFocus.current = null;\n focusRequest.current = true;\n scrollRequest.current = true;\n setNav({ row: 0, col: index });\n }, [gridColumns]);\n\n const onFocus = (event: FocusEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n if (target.closest('[data-kit=\"data-grid-popover\"]') !== null) return;\n const cell = target.closest<HTMLElement>(\"[data-nav-row]\");\n if (cell === null) return;\n const row = Number(cell.dataset[\"navRow\"]);\n const col = Number(cell.dataset[\"navCol\"]);\n setNav((previous) => (previous.row === row && previous.col === col ? previous : { row, col }));\n };\n\n const pageRows = Math.max(1, Math.floor((viewport.height - headerHeight) / rowHeight));\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.defaultPrevented) return;\n const target = event.target as HTMLElement;\n if (isTextEntry(target) || target.closest('[data-kit=\"data-grid-popover\"]') !== null) return;\n const cell = target.closest<HTMLElement>(\"[data-nav-row]\");\n if (cell === null || scrollerRef.current?.contains(cell) !== true) return;\n\n const row = Number(cell.dataset[\"navRow\"]);\n const col = Number(cell.dataset[\"navCol\"]);\n const onCell = target === cell;\n const info = gridColumns[col];\n const key = event.key;\n const forward = rtl ? \"ArrowLeft\" : \"ArrowRight\";\n const backward = rtl ? \"ArrowRight\" : \"ArrowLeft\";\n\n // ---- Header cell commands\n if (row === 0 && onCell && info?.column != null) {\n const column = info.column;\n if ((event.altKey && key === \"ArrowDown\") || key === \"ContextMenu\" || (event.shiftKey && key === \"F10\")) {\n event.preventDefault();\n setPopover({ columnId: column.id, kind: \"menu\" });\n return;\n }\n if (event.ctrlKey && event.shiftKey && (key === \"ArrowLeft\" || key === \"ArrowRight\")) {\n event.preventDefault();\n moveBy(column.id, key === backward ? -1 : 1);\n return;\n }\n if (event.shiftKey && !event.ctrlKey && (key === \"ArrowLeft\" || key === \"ArrowRight\") && isResizable(column)) {\n event.preventDefault();\n resizeTo(column.id, info.width + (key === forward ? 16 : -16), true);\n return;\n }\n }\n\n // ---- Activation\n if (onCell && (key === \"Enter\" || key === \" \" || key === \"F2\")) {\n const primary = cell.querySelector<HTMLElement>(\"[data-grid-primary]\");\n if (row === 0) {\n if ((key === \"Enter\" || key === \" \") && primary !== null) {\n event.preventDefault();\n activate(primary, event);\n }\n return;\n }\n const item = getItem(row - 1);\n if (item === undefined) return;\n if (item.kind === \"group\" && key !== \"F2\") {\n event.preventDefault();\n toggleGroupRow(item.id);\n return;\n }\n if (item.kind === \"data\") {\n const column = info?.column;\n if ((key === \"Enter\" || key === \"F2\") && column != null && isEditable(column, item.row) && resolveEditor(column) !== \"boolean\") {\n event.preventDefault();\n startEdit(item.id, column.id, item.row);\n return;\n }\n if (key === \" \") {\n event.preventDefault();\n if (primary?.hasAttribute(\"data-grid-space\") === true) activate(primary, event);\n else if (selectionMode !== \"none\" && isRowSelectable?.(item.row) !== false) toggleSelect(item.id, row - 1, event.shiftKey);\n return;\n }\n if (key === \"Enter\" && primary !== null) {\n event.preventDefault();\n activate(primary, event);\n }\n }\n return;\n }\n\n if (!onCell && (key === \"Enter\" || key === \" \")) return;\n\n // ---- Selection and clipboard shortcuts\n if ((event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey) {\n if ((key === \"a\" || key === \"A\") && selectionMode === \"multiple\" && row > 0) {\n event.preventDefault();\n if (selectAllState !== \"all\") toggleSelectAll();\n return;\n }\n if ((key === \"c\" || key === \"C\") && row > 0) {\n event.preventDefault();\n void copySelection();\n return;\n }\n }\n\n // ---- Treegrid: Left and Right collapse and expand a group row\n if (row > 0 && info?.first === true) {\n const item = getItem(row - 1);\n if (item?.kind === \"group\") {\n if (key === forward && !item.expanded) {\n event.preventDefault();\n toggleGroupRow(item.id);\n return;\n }\n if (key === backward && item.expanded) {\n event.preventDefault();\n toggleGroupRow(item.id);\n return;\n }\n }\n }\n\n // ---- Navigation\n if (!isNavigationKey(event)) return;\n if (event.shiftKey && (key === \"ArrowLeft\" || key === \"ArrowRight\")) return;\n event.preventDefault();\n\n const bounds = { rowCount: rowCount + 1, columnCount: Math.max(gridColumns.length, 1), pageSize: pageRows, rtl };\n const from = { row, col };\n let next = navigate(from, event, bounds);\n const step = Math.sign(next.row - from.row);\n while (step !== 0 && next.row > 0 && getItem(next.row - 1)?.kind === \"detail\") {\n const moved = { row: next.row + step, col: next.col };\n if (moved.row < 1 || moved.row > rowCount) {\n next = from;\n break;\n }\n next = moved;\n }\n if (next.row === from.row && next.col === from.col) return;\n\n if (event.shiftKey && selectionMode === \"multiple\" && (key === \"ArrowUp\" || key === \"ArrowDown\") && row > 0 && next.row > 0) {\n const origin = getItem(row - 1);\n const destination = getItem(next.row - 1);\n if (origin?.kind === \"data\" && destination?.kind === \"data\") {\n const anchor = selectionAnchor.current ?? row - 1;\n const ids = idsBetween(anchor, next.row - 1);\n if (selectionAnchor.current === null) selectionAnchor.current = row - 1;\n commitSelection(selectRange(clearSelection(), ids, 0, ids.length - 1, true));\n }\n }\n moveTo(next);\n };\n\n // ------------------------------------------------------------ Header wiring\n const columnChoices = (column: DataGridColumn<Row>): FilterChoice[] => {\n if (column.options !== undefined) return column.options.map((option) => ({ value: option.value, label: option.label }));\n if (serverMode) return [];\n const format = plainFormatter(column, formatContext);\n return distinctValues(rowsArray, column).map((value) => ({ value: String(value), label: format(value, undefined as Row) }));\n };\n\n // Stable, so memoized header cells do not re-render on every scroll. Both\n // read the latest state when they run, which is when a menu or popover opens.\n const getMenuItems = useEvent((columnId: string): MenuItem[] => menuItemsFor(columnId));\n const renderFilter = useEvent((columnId: string, close: () => void): ReactNode => {\n const column = byId.get(columnId);\n if (column === undefined) return null;\n return (\n <FilterEditor\n column={column}\n item={filter.find((entry) => entry.field === columnId)}\n choices={columnChoices(column)}\n messages={messages}\n onApply={(item) => {\n applyFilter(columnId, item);\n close();\n }}\n />\n );\n });\n\n const headerActions = useMemo<HeaderActions>(\n () => ({\n sort: sortColumn,\n setPopover: (columnId, kind) => setPopover(kind === null ? null : { columnId, kind }),\n closePopover: (columnId, kind) =>\n setPopover((current) => (current !== null && current.columnId === columnId && current.kind === kind ? null : current)),\n resize: resizeTo,\n getMenuItems,\n renderFilter,\n dragStart: dragStartColumn,\n dragOver: dragOverColumn,\n dragLeave: dragLeaveColumn,\n drop: dropColumn,\n dragEnd: dragEndColumn,\n }),\n [sortColumn, resizeTo, getMenuItems, renderFilter, dragStartColumn, dragOverColumn, dragLeaveColumn, dropColumn, dragEndColumn],\n );\n\n function menuItemsFor(columnId: string): MenuItem[] {\n const column = byId.get(columnId);\n if (column === undefined) return [];\n const items: MenuItem[] = [];\n const direction = sort.find((item) => item.field === columnId)?.direction ?? null;\n if (isSortable(column)) {\n items.push({ id: \"sort-asc\", label: messages.sortAscending, checked: direction === \"asc\", onSelect: () => setColumnSort(columnId, \"asc\") });\n items.push({ id: \"sort-desc\", label: messages.sortDescending, checked: direction === \"desc\", onSelect: () => setColumnSort(columnId, \"desc\") });\n if (direction !== null) items.push({ id: \"sort-clear\", label: messages.clearSort, onSelect: () => setColumnSort(columnId, null) });\n }\n if (isFilterable(column)) {\n items.push({\n id: \"filter\",\n label: formatMessage(messages.filterColumn, { column: column.header }, locale),\n separatorBefore: items.length > 0,\n onSelect: () => setPopover({ columnId, kind: \"filter\" }),\n });\n }\n if (!serverMode && column.groupable !== false && column.cellType !== \"actions\") {\n const grouped = group.some((item) => item.field === columnId);\n items.push({\n id: \"group\",\n label: formatMessage(grouped ? messages.ungroup : messages.groupBy, { column: column.header }, locale),\n separatorBefore: items.length > 0,\n onSelect: () => changeGroup(columnId),\n });\n }\n const zone = layout.start.includes(columnId) ? \"start\" : layout.end.includes(columnId) ? \"end\" : \"center\";\n const ids = zone === \"start\" ? layout.start : zone === \"end\" ? layout.end : layout.center;\n const position = ids.indexOf(columnId);\n items.push({ id: \"pin-start\", label: messages.pinStart, checked: zone === \"start\", separatorBefore: items.length > 0, onSelect: () => pinColumn(columnId, \"start\") });\n items.push({ id: \"pin-end\", label: messages.pinEnd, checked: zone === \"end\", onSelect: () => pinColumn(columnId, \"end\") });\n if (zone !== \"center\") items.push({ id: \"unpin\", label: messages.unpin, onSelect: () => pinColumn(columnId, false) });\n items.push({ id: \"move-earlier\", label: messages.moveEarlier, disabled: position <= 0, separatorBefore: true, onSelect: () => moveBy(columnId, -1) });\n items.push({ id: \"move-later\", label: messages.moveLater, disabled: position < 0 || position >= ids.length - 1, onSelect: () => moveBy(columnId, 1) });\n if (column.hideable !== false) items.push({ id: \"hide\", label: messages.hideColumn, separatorBefore: true, onSelect: () => hideColumn(columnId) });\n return items;\n }\n\n // ------------------------------------------------------------------- Chips\n const chips: Chip[] = [];\n for (const item of effectiveFilters) {\n const column = byId.get(item.field);\n if (column === undefined) continue;\n const summary = summarizeFilter(item, column, formatContext, messages);\n chips.push({\n key: `filter:${item.field}:${item.operator}:${JSON.stringify(item.value)}`,\n text: summary,\n removeLabel: formatMessage(messages.removeFilter, { summary }, locale),\n kind: \"filter\",\n onRemove: () => setFilter(filter.filter((entry) => entry !== item)),\n });\n }\n for (const item of effectiveGroup) {\n const column = byId.get(item.field);\n if (column === undefined) continue;\n chips.push({\n key: `group:${item.field}`,\n text: groupChipText(messages, column.header, locale),\n removeLabel: formatMessage(messages.removeGrouping, { column: column.header }, locale),\n kind: \"group\",\n onRemove: () => setGroup(group.filter((entry) => entry.field !== item.field)),\n });\n }\n\n // ---------------------------------------------------------------- Row env\n const env = useMemo<GridEnv<Row>>(\n () => ({\n messages,\n locale,\n formatters,\n selectionMode,\n isRowSelectable,\n renderDetail,\n isRowExpandable,\n formatGroupValue,\n formatAggregate: formatColumnAggregate,\n toggleSelect,\n toggleExpand,\n toggleGroup: toggleGroupRow,\n startEdit,\n commitEdit,\n cancelEdit,\n toggleBoolean,\n onRowClick,\n }),\n [messages, locale, formatters, selectionMode, isRowSelectable, renderDetail, isRowExpandable, formatGroupValue, formatColumnAggregate, toggleSelect, toggleExpand, toggleGroupRow, startEdit, commitEdit, cancelEdit, toggleBoolean, onRowClick],\n );\n\n // ----------------------------------------------------------------- Status\n const error = serverMode ? snapshot.error : props.error;\n const hasError = error !== undefined && error !== null && error !== false;\n const retry = () => {\n if (serverMode) store?.retry();\n props.onRetry?.();\n };\n const filteredView = effectiveFilters.length > 0 || (serverMode ? serverQuick : quickText) !== \"\";\n const knowsTotal = serverMode ? snapshot.total !== null : true;\n const showEmpty = !hasError && !loadingFlag && knowsTotal && rowCount === 0;\n const showLoadingOverlay = !hasError && loadingFlag && rowCount === 0;\n const showProgress = loadingFlag && rowCount > 0;\n const toolbar = resolveToolbar(props.toolbar);\n\n const toolbarColumns = columns\n .filter((column) => column.hideable !== false)\n .map((column) => ({ id: column.id, header: column.header, visible: columnVisibility[column.id] !== false }));\n\n const clearFilters = () => {\n setFilter([]);\n setQuickFilter(\"\");\n };\n\n // -------------------------------------------------------- Group header row\n const groupRuns = useMemo(() => {\n if (!hasColumnGroups) return [];\n type Run = { key: string; label: string | undefined; from: number; to: number; width: number; pin: \"start\" | \"end\" | null; offset: number };\n const runs: Run[] = [];\n gridColumns.forEach((info, index) => {\n const label = info.column?.group !== undefined && info.column.group !== \"\" ? info.column.group : undefined;\n const last = runs[runs.length - 1];\n if (last !== undefined && last.label === label && label !== undefined && last.pin === info.pin) {\n last.to = index;\n last.width += info.width;\n if (info.pin === \"end\") last.offset = info.pinOffset;\n return;\n }\n runs.push({ key: `${index}`, label, from: index, to: index, width: info.width, pin: info.pin, offset: info.pinOffset });\n });\n return runs;\n }, [hasColumnGroups, gridColumns]);\n\n // ------------------------------------------------------------------- Render\n const sortDirectionOf = (columnId: string) => sort.find((item) => item.field === columnId)?.direction ?? null;\n const filteredColumns = new Set(effectiveFilters.map((item) => item.field));\n const reorderableColumns = gridColumns.filter((info) => info.kind === \"data\").length > 1;\n const bodyStyle: CSSProperties = { blockSize: rowVirtualizer.getTotalSize(), inlineSize: totalWidth };\n const rowStyle: CSSProperties = { inlineSize: totalWidth };\n const frameStyle: CSSProperties | undefined = height === undefined ? undefined : { blockSize: height };\n const scrollerStyle: CSSProperties = height === undefined ? { maxBlockSize: maxHeight ?? DEFAULT_MAX_HEIGHT } : {};\n\n const renderHeaderCells = () =>\n slots.map((slot, position) => {\n if (slot.kind === \"spacer\") {\n return <div key={`spacer-${position}`} role=\"presentation\" data-kit=\"data-grid-spacer\" style={{ inlineSize: slot.size }} />;\n }\n const info = gridColumns[slot.index] as GridColumnInfo<Row>;\n const cursor = navClamped.row === 0 && navClamped.col === slot.index;\n if (info.kind !== \"data\" || info.column === null) {\n const label = info.kind === \"select\" ? messages.selectAll : messages.detailRegion;\n return (\n <div\n key={info.id}\n role=\"columnheader\"\n aria-label={label}\n aria-colindex={slot.index + 1}\n tabIndex={cursor ? 0 : -1}\n data-kit=\"data-grid-header-cell\"\n data-type={info.kind}\n data-nav-row={0}\n data-nav-col={slot.index}\n data-pinned=\"start\"\n data-pinned-edge={info.pinEdge ? \"\" : undefined}\n style={{ inlineSize: info.width, insetInlineStart: info.pinOffset }}\n >\n {info.kind === \"select\" && selectionMode === \"multiple\" ? (\n <Checkbox\n label={messages.selectAll}\n checked={selectAllState === \"all\" ? true : selectAllState === \"some\" ? \"mixed\" : false}\n tabIndex={-1}\n data-grid-primary=\"\"\n data-grid-space=\"\"\n onChange={toggleSelectAll}\n />\n ) : null}\n </div>\n );\n }\n const column = info.column;\n const direction = sortDirectionOf(column.id);\n return (\n <HeaderCell\n key={info.id}\n column={column}\n navCol={slot.index}\n width={info.width}\n minWidth={info.minWidth}\n maxWidth={info.maxWidth}\n pin={info.pin}\n pinOffset={info.pinOffset}\n pinEdge={info.pinEdge}\n sortDirection={direction}\n sortRank={sort.length > 1 && direction !== null ? sort.findIndex((item) => item.field === column.id) + 1 : null}\n sortable={isSortable(column)}\n filterable={isFilterable(column)}\n filtered={filteredColumns.has(column.id)}\n resizable={isResizable(column)}\n cursor={cursor}\n rtl={rtl}\n popover={popover !== null && popover.columnId === column.id ? popover.kind : null}\n align={info.align}\n messages={messages}\n locale={locale}\n actions={headerActions}\n reorderable={reorderableColumns}\n dragging={columnDrag?.id === column.id}\n dropPlacement={columnDrag?.over?.id === column.id ? columnDrag.over.placement : null}\n />\n );\n });\n\n const renderFooterCells = () =>\n gridColumns.map((info, index) => {\n const column = info.column;\n const value = column === null ? undefined : totals[column.id];\n const text = column === null || value === undefined ? \"\" : formatAggregate(column, value, formatContext);\n let content: ReactNode = text;\n if (column !== null) {\n if (column.footerCell !== undefined) content = column.footerCell({ column, value, text, messages });\n else if (info.first && text === \"\") content = messages.totals;\n }\n return (\n <div\n key={info.id}\n role=\"gridcell\"\n aria-colindex={index + 1}\n data-kit=\"data-grid-cell\"\n data-type={info.kind === \"data\" ? \"total\" : info.kind}\n data-align={info.align}\n data-pinned={info.pin ?? undefined}\n data-pinned-edge={info.pinEdge ? \"\" : undefined}\n style={{\n inlineSize: info.width,\n ...(info.pin === \"start\" ? { insetInlineStart: info.pinOffset } : {}),\n ...(info.pin === \"end\" ? { insetInlineEnd: info.pinOffset } : {}),\n }}\n >\n {content === \"\" ? null : <span data-kit=\"data-grid-text\">{content}</span>}\n </div>\n );\n });\n\n return (\n <div\n ref={rootRef}\n data-kit=\"data-grid\"\n data-density={density}\n data-loading={loadingFlag ? \"\" : undefined}\n data-stale={serverMode && snapshot.stale ? \"\" : undefined}\n data-server={serverMode ? \"\" : undefined}\n dir={dir}\n className={props.className}\n style={frameStyle}\n >\n {toolbar === null ? null : (\n <Toolbar\n messages={messages}\n locale={locale}\n search={toolbar.search}\n columnsMenu={toolbar.columns}\n exportButton={toolbar.export}\n copyButton={toolbar.copy}\n quickFilter={quickFilter}\n onQuickFilterChange={setQuickFilter}\n columns={toolbarColumns}\n onToggleColumn={(id, visible) => setColumnVisibility({ ...columnVisibility, [id]: visible })}\n onShowAllColumns={() => setColumnVisibility({})}\n selectedCount={selectedCount}\n totalCount={totalCount}\n onClearSelection={() => commitSelection(clearSelection())}\n onCopy={() => void copySelection()}\n onExport={() => void runExport()}\n exporting={exporting}\n start={props.toolbarStart}\n end={props.toolbarEnd}\n />\n )}\n\n <FilterBar chips={chips} messages={messages} locale={locale} onClearAll={() => setFilter([])} />\n\n <div data-kit=\"data-grid-viewport\">\n <div\n ref={scrollerRef}\n role={treegrid ? \"treegrid\" : \"grid\"}\n aria-label={props[\"aria-label\"]}\n aria-labelledby={props[\"aria-labelledby\"]}\n aria-rowcount={ariaRowCount}\n aria-colcount={gridColumns.length}\n aria-multiselectable={selectionMode === \"multiple\" ? true : undefined}\n aria-busy={loadingFlag ? true : undefined}\n data-kit=\"data-grid-scroller\"\n data-virtual-rows={virtualizeRows ? \"\" : undefined}\n data-virtual-columns={virtualizeColumns ? \"\" : undefined}\n style={scrollerStyle}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n >\n <div role=\"rowgroup\" data-kit=\"data-grid-header-group\">\n {hasColumnGroups ? (\n <div role=\"row\" aria-rowindex={1} data-kit=\"data-grid-group-header\" style={rowStyle}>\n {groupRuns.map((run) =>\n run.label === undefined ? (\n <div key={run.key} role=\"presentation\" data-kit=\"data-grid-group-header-cell\" data-blank=\"\" style={{ inlineSize: run.width }} />\n ) : (\n <div\n key={run.key}\n role=\"columnheader\"\n aria-colindex={run.from + 1}\n aria-colspan={run.to - run.from + 1}\n data-kit=\"data-grid-group-header-cell\"\n data-pinned={run.pin ?? undefined}\n style={{\n inlineSize: run.width,\n ...(run.pin === \"start\" ? { insetInlineStart: run.offset } : {}),\n ...(run.pin === \"end\" ? { insetInlineEnd: run.offset } : {}),\n }}\n >\n {run.label}\n </div>\n ),\n )}\n </div>\n ) : null}\n <div ref={headerRef} role=\"row\" aria-rowindex={headerRowCount} data-kit=\"data-grid-header\" style={rowStyle}>\n {renderHeaderCells()}\n </div>\n </div>\n\n <div role=\"rowgroup\" data-kit=\"data-grid-body\" style={bodyStyle}>\n {virtualRows.map((virtualRow) => {\n const item = getItem(virtualRow.index);\n if (item === undefined) return null;\n const isData = item.kind === \"data\";\n const isEditingRow = isData && editing !== null && editing.rowId === item.id;\n return (\n <GridRowItem\n key={virtualRow.key}\n item={item}\n ariaRowIndex={ariaRowOffset + virtualRow.index + 1}\n displayIndex={virtualRow.index}\n top={virtualRow.start - headerHeight}\n height={item.kind === \"detail\" ? undefined : rowHeight}\n columns={gridColumns}\n slots={slots}\n totalWidth={totalWidth}\n selected={isData && isSelected(selection, item.id)}\n cursorCol={navClamped.row === virtualRow.index + 1 ? navClamped.col : -1}\n editingColumnId={isEditingRow ? editing.columnId : null}\n editingError={isEditingRow ? editing.error : null}\n overrides={isData ? (overrides[item.id] as RowOverrides | undefined) : undefined}\n expanded={isData && expanded[item.id] === true}\n treegrid={treegrid}\n viewportWidth={viewport.width}\n env={env}\n measureRef={item.kind === \"detail\" ? rowVirtualizer.measureElement : undefined}\n />\n );\n })}\n </div>\n\n {hasTotals ? (\n <div role=\"rowgroup\" data-kit=\"data-grid-footer-group\">\n <div role=\"row\" aria-rowindex={ariaRowCount < 0 ? ariaRowOffset + rowCount + 1 : ariaRowCount} data-kit=\"data-grid-footer\" style={rowStyle}>\n {renderFooterCells()}\n </div>\n </div>\n ) : null}\n </div>\n\n {showProgress ? <div data-kit=\"data-grid-progressbar\" aria-hidden=\"true\" /> : null}\n\n {showLoadingOverlay ? (\n <div data-kit=\"data-grid-overlay\" data-state=\"loading\" style={{ insetBlockStart: headerHeight }}>\n {props.slots?.loading ?? (\n <div role=\"status\" data-kit=\"data-grid-loading\">\n <Spinner size=\"md\" />\n <span>{messages.loading}</span>\n </div>\n )}\n </div>\n ) : null}\n\n {showEmpty ? (\n <div data-kit=\"data-grid-overlay\" data-state=\"empty\" style={{ insetBlockStart: headerHeight }}>\n {props.slots?.empty ?? (\n <div data-kit=\"data-grid-empty\">\n <span>{filteredView ? messages.emptyFiltered : messages.empty}</span>\n {filteredView ? (\n <Button variant=\"outline\" tone=\"neutral\" size=\"sm\" onClick={clearFilters}>\n {messages.clearFilters}\n </Button>\n ) : null}\n </div>\n )}\n </div>\n ) : null}\n\n {hasError ? (\n <div data-kit=\"data-grid-overlay\" data-state=\"error\" data-placement={rowCount > 0 ? \"banner\" : \"overlay\"} style={rowCount > 0 ? undefined : { insetBlockStart: headerHeight }}>\n {props.slots?.error !== undefined ? (\n props.slots.error(error, retry)\n ) : (\n <div role=\"alert\" data-kit=\"data-grid-error\">\n <Icon name=\"alert-triangle\" size={20} />\n <span>{messages.error}</span>\n {serverMode || props.onRetry !== undefined ? (\n <Button variant=\"outline\" tone=\"neutral\" size=\"sm\" onClick={retry}>\n {messages.retry}\n </Button>\n ) : null}\n </div>\n )}\n </div>\n ) : null}\n </div>\n\n {paginated ? (\n <Pagination\n page={page}\n pageSize={pageSize}\n total={totalCount}\n pageSizeOptions={pageSizeOptions}\n messages={props.messages}\n {...(locale === undefined ? {} : { locale })}\n onPageChange={(next) => setPagination({ ...pagination, page: next })}\n onPageSizeChange={(size) => setPagination({ page: 0, pageSize: size })}\n />\n ) : null}\n\n <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-kit=\"data-grid-live\">\n {announcement.text}\n {announcement.flip ? \"\\u00a0\" : \"\"}\n </VisuallyHidden>\n </div>\n );\n}","import { useId, useRef, type KeyboardEvent } from \"react\";\nimport {\n formatMessage,\n isEmptyValue,\n resolveEditor,\n toDayString,\n toText,\n type ColumnEditor,\n type DataGridMessages,\n} from \"../index\";\nimport { SelectInput, TextInput } from \"./internal/fields\";\nimport type { DataGridColumn } from \"./types\";\n\n/** The result of turning an editor's text into a cell value. */\nexport type ParseResult = { ok: true; value: unknown } | { ok: false; message: string };\n\n/**\n * Turns the text of an editor into a value. `column.parseValue` wins. The\n * built-in number editor accepts `1234.5` and `1234,5`; for input in a\n * locale's own format, pass `parseValue`.\n */\nexport function parseEditorInput<Row>(\n column: DataGridColumn<Row>,\n input: string,\n row: Row,\n messages: DataGridMessages,\n): ParseResult {\n if (column.parseValue !== undefined) return { ok: true, value: column.parseValue(input, row) };\n const editor: ColumnEditor = resolveEditor(column);\n const text = input.trim();\n switch (editor) {\n case \"number\": {\n if (text === \"\") return { ok: true, value: null };\n let normalized = text.replace(/\\s/g, \"\");\n if (normalized.includes(\",\") && normalized.includes(\".\")) normalized = normalized.replace(/,/g, \"\");\n else if (normalized.includes(\",\")) normalized = normalized.replace(\",\", \".\");\n const number = Number(normalized);\n return Number.isFinite(number) ? { ok: true, value: number } : { ok: false, message: messages.invalidNumber };\n }\n case \"date\": {\n if (text === \"\") return { ok: true, value: null };\n return toDayString(text) === null ? { ok: false, message: messages.invalidDate } : { ok: true, value: text };\n }\n case \"boolean\":\n return { ok: true, value: text === \"true\" };\n default:\n return { ok: true, value: input };\n }\n}\n\n/** The text an editor starts with for a value. */\nexport function editorStartText<Row>(column: DataGridColumn<Row>, value: unknown): string {\n if (isEmptyValue(value)) return \"\";\n switch (resolveEditor(column)) {\n case \"date\":\n return toDayString(value) ?? \"\";\n default:\n return toText(value);\n }\n}\n\nexport type CommitSource = \"enter\" | \"blur\" | \"change\";\n\nexport interface CellEditorProps<Row> {\n column: DataGridColumn<Row>;\n value: unknown;\n messages: DataGridMessages;\n locale: string | undefined;\n /** The validation message of the last rejected commit. */\n error: string | null;\n onCommit: (input: string, source: CommitSource) => void;\n onCancel: () => void;\n}\n\n/**\n * The editor inside a cell in edit mode: Enter commits, Escape cancels, leaving\n * the field commits. A select commits on change. Boolean cells do not use this:\n * they show a live checkbox.\n */\nexport function CellEditor<Row>({ column, value, messages, locale, error, onCommit, onCancel }: CellEditorProps<Row>) {\n const focused = useRef(false);\n const finished = useRef(false);\n const errorId = useId();\n const editor = resolveEditor(column);\n const label = formatMessage(messages.editCell, { column: column.header }, locale);\n\n const focusOnce = (element: HTMLInputElement | HTMLSelectElement | null) => {\n if (element === null || focused.current) return;\n focused.current = true;\n element.focus({ preventScroll: true });\n if (element instanceof HTMLInputElement) element.select();\n };\n\n const commit = (input: string, source: CommitSource) => {\n if (finished.current) return;\n finished.current = true;\n onCommit(input, source);\n // A rejected commit keeps the editor open, so it may finish again.\n queueMicrotask(() => {\n finished.current = false;\n });\n };\n\n const cancel = () => {\n if (finished.current) return;\n finished.current = true;\n onCancel();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement | HTMLSelectElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n commit(event.currentTarget.value, \"enter\");\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n cancel();\n }\n };\n\n const shared = {\n label,\n \"aria-invalid\": error === null ? undefined : true,\n \"aria-describedby\": error === null ? undefined : errorId,\n onKeyDown,\n onBlur: (event: { currentTarget: { value: string } }) => commit(event.currentTarget.value, \"blur\"),\n } as const;\n\n return (\n <>\n {editor === \"select\" ? (\n <SelectInput\n {...shared}\n ref={focusOnce}\n defaultValue={editorStartText(column, value)}\n onChange={(event) => commit(event.currentTarget.value, \"change\")}\n >\n {isEmptyValue(value) ? <option value=\"\" /> : null}\n {(column.options ?? []).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </SelectInput>\n ) : (\n <TextInput\n {...shared}\n ref={focusOnce}\n type={editor === \"date\" ? \"date\" : \"text\"}\n inputMode={editor === \"number\" ? \"decimal\" : undefined}\n defaultValue={editorStartText(column, value)}\n />\n )}\n {error === null ? null : (\n <span id={errorId} role=\"alert\" data-kit=\"data-grid-edit-error\">\n {error}\n </span>\n )}\n </>\n );\n}\n","import { useLayoutEffect, useRef, type ComponentPropsWithRef } from \"react\";\n\nexport interface CheckboxProps extends Omit<ComponentPropsWithRef<\"input\">, \"type\" | \"checked\" | \"ref\" | \"aria-label\"> {\n checked: boolean | \"mixed\";\n /** Accessible name. Pass a translated string. */\n label: string;\n}\n\n/** A native checkbox. `mixed` sets the DOM `indeterminate` state, which assistive technology reads as \"mixed\". */\nexport function Checkbox({ checked, label, ...props }: CheckboxProps) {\n const ref = useRef<HTMLInputElement>(null);\n useLayoutEffect(() => {\n if (ref.current !== null) ref.current.indeterminate = checked === \"mixed\";\n }, [checked]);\n return (\n <input\n {...props}\n ref={ref}\n type=\"checkbox\"\n data-kit=\"data-grid-checkbox\"\n checked={checked === true}\n aria-label={label}\n />\n );\n}\n\nexport type TextInputProps = Omit<ComponentPropsWithRef<\"input\">, \"aria-label\"> & {\n label: string;\n};\n\n/** A native text-like input. The type, value and handlers come from the caller. */\nexport function TextInput({ label, ...props }: TextInputProps) {\n return <input data-kit=\"data-grid-input\" aria-label={label} {...props} />;\n}\n\nexport type SelectInputProps = Omit<ComponentPropsWithRef<\"select\">, \"aria-label\"> & {\n label: string;\n};\n\n/** A native select. Options are children, so the caller translates them. */\nexport function SelectInput({ label, ...props }: SelectInputProps) {\n return <select data-kit=\"data-grid-select\" aria-label={label} {...props} />;\n}\n","import { Icon } from \"@x12i/icons\";\nimport { Button, IconButton } from \"@x12i/ui\";\nimport { formatMessage, type DataGridMessages } from \"../index\";\n\nexport interface Chip {\n key: string;\n /** What the chip says, for example \"Total is greater than 100\". */\n text: string;\n /** Accessible name of the remove button. */\n removeLabel: string;\n onRemove: () => void;\n kind: \"filter\" | \"group\";\n}\n\nexport interface FilterBarProps {\n chips: Chip[];\n messages: DataGridMessages;\n locale: string | undefined;\n onClearAll: () => void;\n}\n\n/** The active filters and grouping as removable chips, with a \"clear all\" at the end. */\nexport function FilterBar({ chips, messages, onClearAll }: FilterBarProps) {\n if (chips.length === 0) return null;\n const filters = chips.filter((chip) => chip.kind === \"filter\").length;\n return (\n <ul aria-label={messages.activeFilters} data-kit=\"data-grid-chips\">\n {chips.map((chip) => (\n <li key={chip.key} data-kit=\"data-grid-chip\" data-kind={chip.kind}>\n <span data-kit-slot=\"chip-text\">{chip.text}</span>\n <IconButton label={chip.removeLabel} variant=\"ghost\" tone=\"neutral\" size=\"xs\" onClick={chip.onRemove}>\n <Icon name=\"close\" size={12} />\n </IconButton>\n </li>\n ))}\n {filters > 1 ? (\n <li data-kit-slot=\"chips-clear\">\n <Button variant=\"ghost\" tone=\"neutral\" size=\"sm\" onClick={onClearAll}>\n {messages.clearAllFilters}\n </Button>\n </li>\n ) : null}\n </ul>\n );\n}\n\n/** Text for the group chip. Kept here so the grid and tests agree on it. */\nexport function groupChipText(messages: DataGridMessages, column: string, locale: string | undefined): string {\n return formatMessage(messages.groupedBy, { column }, locale);\n}\n","import { Button } from \"@x12i/ui\";\nimport { useId, useState, type FormEvent } from \"react\";\nimport {\n isFilterEffective,\n isValuelessOperator,\n operatorsFor,\n resolveFilterType,\n toBoolean,\n toDayString,\n toText,\n type ColumnFilterType,\n type DataGridMessages,\n type FilterModelItem,\n type FilterOperator,\n} from \"../index\";\nimport { Checkbox, SelectInput, TextInput } from \"./internal/fields\";\nimport type { DataGridColumn } from \"./types\";\n\nexport interface FilterChoice {\n value: string;\n label: string;\n}\n\nexport interface FilterEditorProps<Row> {\n column: DataGridColumn<Row>;\n /** The column's current filter, when it has one. */\n item: FilterModelItem | undefined;\n /** Choices for enum filters: the column's `options`, or the values found in the rows. */\n choices: FilterChoice[];\n messages: DataGridMessages;\n /** Receives the new filter, or `null` to clear the column's filter. */\n onApply: (item: FilterModelItem | null) => void;\n}\n\nfunction textOrEmpty(value: unknown): string {\n return value === undefined || value === null ? \"\" : toText(value);\n}\n\nfunction parseValue(type: ColumnFilterType, text: string): unknown {\n if (text.trim() === \"\") return undefined;\n switch (type) {\n case \"number\": {\n const number = Number(text.replace(\",\", \".\"));\n return Number.isNaN(number) ? undefined : number;\n }\n case \"boolean\":\n return toBoolean(text) ?? undefined;\n default:\n return text;\n }\n}\n\nfunction startText(type: ColumnFilterType, value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (type === \"date\") return toDayString(value) ?? \"\";\n return textOrEmpty(value);\n}\n\n/**\n * The filter form of one column: an operator and a value input that fit the\n * column's filter type. Apply builds a `FilterModelItem`; a value that narrows\n * nothing clears the filter instead of hiding every row.\n */\nexport function FilterEditor<Row>({ column, item, choices, messages, onApply }: FilterEditorProps<Row>) {\n const type = resolveFilterType(column);\n const operators = operatorsFor(type);\n const fieldId = useId();\n\n const initialOperator: FilterOperator = item !== undefined && operators.includes(item.operator) ? item.operator : (operators[0] as FilterOperator);\n const [operator, setOperator] = useState<FilterOperator>(initialOperator);\n const [first, setFirst] = useState(() => {\n if (item === undefined) return \"\";\n return item.operator === \"between\" && Array.isArray(item.value) ? startText(type, item.value[0]) : Array.isArray(item.value) ? \"\" : startText(type, item.value);\n });\n const [second, setSecond] = useState(() =>\n item !== undefined && item.operator === \"between\" && Array.isArray(item.value) ? startText(type, item.value[1]) : \"\",\n );\n const [picked, setPicked] = useState<string[]>(() =>\n item !== undefined && Array.isArray(item.value) && item.operator === \"in\" ? item.value.map(String) : [],\n );\n\n const valueless = isValuelessOperator(operator);\n const showList = type === \"enum\" && operator === \"in\";\n const between = operator === \"between\";\n\n const submit = (event?: FormEvent) => {\n event?.preventDefault();\n let candidate: FilterModelItem;\n if (valueless) candidate = { field: column.id, operator };\n else if (showList) candidate = { field: column.id, operator, value: picked };\n else if (between) candidate = { field: column.id, operator, value: [parseValue(type, first), parseValue(type, second)] };\n else candidate = { field: column.id, operator, value: parseValue(type, first) };\n onApply(isFilterEffective(candidate) ? candidate : null);\n };\n\n const inputType = type === \"number\" ? \"number\" : type === \"date\" ? \"date\" : \"text\";\n const valueInput = (text: string, set: (value: string) => void, label: string) =>\n type === \"boolean\" ? (\n <SelectInput label={label} value={text} onChange={(event) => set(event.currentTarget.value)}>\n <option value=\"\">{messages.filterAny}</option>\n <option value=\"true\">{messages.yes}</option>\n <option value=\"false\">{messages.no}</option>\n </SelectInput>\n ) : (\n <TextInput\n label={label}\n type={inputType}\n step={type === \"number\" ? \"any\" : undefined}\n value={text}\n onChange={(event) => set(event.currentTarget.value)}\n />\n );\n\n return (\n <form data-kit=\"data-grid-filter\" onSubmit={submit}>\n <label data-kit=\"data-grid-field\" htmlFor={`${fieldId}-operator`}>\n <span data-kit-slot=\"field-label\">{messages.filterOperator}</span>\n <select\n id={`${fieldId}-operator`}\n data-kit=\"data-grid-select\"\n value={operator}\n onChange={(event) => setOperator(event.currentTarget.value as FilterOperator)}\n >\n {operators.map((entry) => (\n <option key={entry} value={entry}>\n {messages.operators[entry]}\n </option>\n ))}\n </select>\n </label>\n\n {valueless ? null : showList ? (\n <div role=\"group\" aria-label={messages.filterValue} data-kit=\"data-grid-choices\">\n {choices.length === 0 ? (\n <span data-kit=\"data-grid-hint\">{messages.filterNoOptions}</span>\n ) : (\n choices.map((choice) => (\n <label key={choice.value} data-kit=\"data-grid-choice\">\n <Checkbox\n label={choice.label}\n checked={picked.includes(choice.value)}\n onChange={(event) => {\n const on = event.currentTarget.checked;\n setPicked((previous) => (on ? [...previous, choice.value] : previous.filter((entry) => entry !== choice.value)));\n }}\n />\n <span>{choice.label}</span>\n </label>\n ))\n )}\n </div>\n ) : between ? (\n <div data-kit=\"data-grid-range\">\n <label data-kit=\"data-grid-field\">\n <span data-kit-slot=\"field-label\">{messages.filterFrom}</span>\n {valueInput(first, setFirst, messages.filterFrom)}\n </label>\n <label data-kit=\"data-grid-field\">\n <span data-kit-slot=\"field-label\">{messages.filterTo}</span>\n {valueInput(second, setSecond, messages.filterTo)}\n </label>\n </div>\n ) : (\n <label data-kit=\"data-grid-field\">\n <span data-kit-slot=\"field-label\">{messages.filterValue}</span>\n {valueInput(first, setFirst, messages.filterValue)}\n </label>\n )}\n\n <div data-kit=\"data-grid-filter-actions\">\n <Button type=\"button\" variant=\"ghost\" tone=\"neutral\" size=\"sm\" onClick={() => onApply(null)}>\n {messages.filterClear}\n </Button>\n <Button type=\"submit\" size=\"sm\">\n {messages.filterApply}\n </Button>\n </div>\n </form>\n );\n}\n","import { Icon } from \"@x12i/icons\";\nimport { IconButton, VisuallyHidden } from \"@x12i/ui\";\nimport { memo, type CSSProperties, type MouseEvent, type ReactNode } from \"react\";\nimport {\n formatMessage,\n getColumnValue,\n isEditable,\n isEmptyValue,\n type CellFormatter,\n type ColumnAlign,\n type DataGridMessages,\n type DisplayRow,\n} from \"../index\";\nimport { renderCellContent } from \"./cells\";\nimport { CellEditor, type CommitSource } from \"./editors\";\nimport { Checkbox } from \"./internal/fields\";\nimport type { DataGridColumn } from \"./types\";\n\n/** A column as the grid lays it out, including the checkbox and expander columns. */\nexport interface GridColumnInfo<Row> {\n kind: \"select\" | \"expand\" | \"data\";\n id: string;\n column: DataGridColumn<Row> | null;\n width: number;\n minWidth: number;\n maxWidth: number;\n pin: \"start\" | \"end\" | null;\n /** Distance from the edge of the grid, for sticky positioning. */\n pinOffset: number;\n pinEdge: boolean;\n align: ColumnAlign;\n /** The first data column: group rows put their label here. */\n first: boolean;\n}\n\n/** A row the server has not delivered yet, or could not deliver (`failed`). */\nexport interface PlaceholderRow {\n kind: \"placeholder\";\n id: string;\n index: number;\n depth: number;\n failed?: boolean;\n}\n\nexport type GridRow<Row> = DisplayRow<Row> | PlaceholderRow;\n\nexport interface CellOverride {\n value: unknown;\n status: \"pending\" | \"saved\" | \"error\";\n}\n\nexport type RowOverrides = Readonly<Record<string, CellOverride>>;\n\n/** What fills a row: a column by index, or blank space where virtualized columns are skipped. */\nexport type Slot = { kind: \"col\"; index: number } | { kind: \"spacer\"; size: number };\n\n/** Everything the rows need that does not change while typing or scrolling. */\nexport interface GridEnv<Row> {\n messages: DataGridMessages;\n locale: string | undefined;\n formatters: Map<string, CellFormatter<Row>>;\n selectionMode: \"none\" | \"single\" | \"multiple\";\n isRowSelectable: ((row: Row) => boolean) | undefined;\n renderDetail: ((row: Row) => ReactNode) | undefined;\n isRowExpandable: ((row: Row) => boolean) | undefined;\n formatGroupValue: (field: string, value: unknown) => string;\n /** Text of an aggregate in a group row or the totals row. */\n formatAggregate: (columnId: string, value: unknown) => string;\n toggleSelect: (rowId: string, displayIndex: number, range: boolean) => void;\n toggleExpand: (rowId: string) => void;\n toggleGroup: (groupId: string) => void;\n startEdit: (rowId: string, columnId: string, row: Row) => void;\n commitEdit: (input: string, source: CommitSource) => void;\n cancelEdit: () => void;\n toggleBoolean: (rowId: string, columnId: string, value: boolean, row: Row) => void;\n onRowClick: ((row: Row, event: MouseEvent<HTMLElement>) => void) | undefined;\n}\n\nconst CONTROL_SELECTOR = 'button, a[href], input, select, textarea, label, [role=\"menuitem\"], [role=\"menuitemcheckbox\"]';\n\n/** A click on a checkbox, button or link inside a row belongs to that control, not to the row. */\nfunction startedOnControl(event: MouseEvent<HTMLElement>): boolean {\n const target = event.target;\n if (!(target instanceof Element)) return false;\n const control = target.closest(CONTROL_SELECTOR);\n return control !== null && event.currentTarget.contains(control);\n}\n\nexport interface GridRowProps<Row> {\n item: GridRow<Row>;\n ariaRowIndex: number;\n displayIndex: number;\n top: number;\n height: number | undefined;\n columns: GridColumnInfo<Row>[];\n slots: Slot[];\n totalWidth: number;\n selected: boolean;\n /** Column index of the cursor when it is in this row, else -1. */\n cursorCol: number;\n editingColumnId: string | null;\n editingError: string | null;\n overrides: RowOverrides | undefined;\n expanded: boolean;\n treegrid: boolean;\n viewportWidth: number;\n env: GridEnv<Row>;\n measureRef: ((element: HTMLElement | null) => void) | undefined;\n}\n\nfunction cellStyle<Row>(info: GridColumnInfo<Row>): CSSProperties {\n const style: CSSProperties = { inlineSize: info.width };\n if (info.pin === \"start\") style.insetInlineStart = info.pinOffset;\n if (info.pin === \"end\") style.insetInlineEnd = info.pinOffset;\n return style;\n}\n\nfunction GridCell<Row>({\n info,\n index,\n navRow,\n cursor,\n children,\n state,\n}: {\n info: GridColumnInfo<Row>;\n index: number;\n navRow: number;\n cursor: boolean;\n children: ReactNode;\n state?: Record<string, string | undefined>;\n}) {\n return (\n <div\n role=\"gridcell\"\n aria-colindex={index + 1}\n tabIndex={cursor ? 0 : -1}\n data-kit=\"data-grid-cell\"\n data-nav-row={navRow}\n data-nav-col={index}\n data-type={info.kind === \"data\" ? (info.column?.cellType ?? \"text\") : info.kind}\n data-align={info.align}\n data-pinned={info.pin ?? undefined}\n data-pinned-edge={info.pinEdge ? \"\" : undefined}\n data-first={info.first ? \"\" : undefined}\n style={cellStyle(info)}\n {...state}\n >\n {children}\n </div>\n );\n}\n\nfunction GridRowView<Row>(props: GridRowProps<Row>) {\n const { item, ariaRowIndex, displayIndex, top, height, columns, slots, totalWidth, selected, cursorCol, env, treegrid } = props;\n const { messages, locale } = env;\n const navRow = displayIndex + 1;\n\n const style: CSSProperties = {\n transform: `translateY(${top}px)`,\n inlineSize: totalWidth,\n ...(height === undefined ? {} : { blockSize: height }),\n ...(item.depth > 0 ? ({ \"--_depth\": item.depth } as CSSProperties) : {}),\n };\n\n const renderSlots = (renderColumn: (info: GridColumnInfo<Row>, index: number) => ReactNode) =>\n slots.map((slot, position) =>\n slot.kind === \"spacer\" ? (\n <div key={`spacer-${position}`} role=\"presentation\" data-kit=\"data-grid-spacer\" style={{ inlineSize: slot.size }} />\n ) : (\n renderColumn(columns[slot.index] as GridColumnInfo<Row>, slot.index)\n ),\n );\n\n // ---------------------------------------------------------------- Detail\n if (item.kind === \"detail\") {\n return (\n <div\n ref={props.measureRef}\n role=\"row\"\n aria-rowindex={ariaRowIndex}\n aria-level={treegrid ? item.depth + 1 : undefined}\n data-kit=\"data-grid-row\"\n data-kind=\"detail\"\n data-index={displayIndex}\n style={{ ...style, blockSize: undefined }}\n >\n <div role=\"gridcell\" aria-colindex={1} aria-colspan={Math.max(columns.length, 1)} aria-label={messages.detailRegion} data-kit=\"data-grid-detail\">\n <div data-kit-slot=\"detail-content\" style={{ inlineSize: props.viewportWidth > 0 ? props.viewportWidth : undefined }}>\n {env.renderDetail?.(item.row)}\n </div>\n </div>\n </div>\n );\n }\n\n // ----------------------------------------------------------------- Group\n if (item.kind === \"group\") {\n const label = formatMessage(\n messages.groupLabel,\n { value: isEmptyValue(item.value) ? messages.filterBlank : env.formatGroupValue(item.field, item.value), count: item.count },\n locale,\n );\n return (\n <div\n role=\"row\"\n aria-rowindex={ariaRowIndex}\n aria-level={item.depth + 1}\n aria-expanded={item.expanded}\n data-kit=\"data-grid-row\"\n data-kind=\"group\"\n data-index={displayIndex}\n data-expanded={item.expanded ? \"\" : undefined}\n style={style}\n >\n {renderSlots((info, index) => {\n const cursor = cursorCol === index;\n if (info.kind !== \"data\") return <GridCell key={info.id} info={info} index={index} navRow={navRow} cursor={cursor}>{null}</GridCell>;\n const aggregate = info.column !== null && info.column.aggregate !== undefined ? item.aggregates[info.column.id] : undefined;\n return (\n <GridCell key={info.id} info={info} index={index} navRow={navRow} cursor={cursor}>\n {info.first ? (\n <button\n type=\"button\"\n tabIndex={-1}\n data-kit=\"data-grid-group-toggle\"\n data-grid-primary=\"\"\n data-grid-space=\"\"\n aria-label={item.expanded ? messages.collapseGroup : messages.expandGroup}\n onClick={() => env.toggleGroup(item.id)}\n >\n <span data-flip=\"\" data-expanded={item.expanded ? \"\" : undefined}>\n <Icon name={item.expanded ? \"chevron-down\" : \"chevron-right\"} size={16} />\n </span>\n <span data-kit-slot=\"group-label\">{label}</span>\n </button>\n ) : isEmptyValue(aggregate) ? null : (\n <span data-kit=\"data-grid-text\" data-kit-slot=\"aggregate\">\n {env.formatAggregate(info.id, aggregate)}\n </span>\n )}\n </GridCell>\n );\n })}\n </div>\n );\n }\n\n // ------------------------------------------------------------ Placeholder\n if (item.kind === \"placeholder\") {\n return (\n <div\n role=\"row\"\n aria-rowindex={ariaRowIndex}\n aria-busy={item.failed === true ? undefined : true}\n data-kit=\"data-grid-row\"\n data-kind=\"placeholder\"\n data-failed={item.failed === true ? \"\" : undefined}\n data-index={displayIndex}\n style={style}\n >\n {renderSlots((info, index) => (\n <GridCell key={info.id} info={info} index={index} navRow={navRow} cursor={cursorCol === index}>\n {info.kind === \"data\" ? (\n <>\n <span data-kit=\"data-grid-skeleton\" aria-hidden=\"true\" />\n {info.first ? <VisuallyHidden>{item.failed === true ? messages.rowFailed : messages.rowLoading}</VisuallyHidden> : null}\n </>\n ) : null}\n </GridCell>\n ))}\n </div>\n );\n }\n\n // ------------------------------------------------------------------ Data\n const { row, id } = item;\n const selectable = env.selectionMode !== \"none\" && (env.isRowSelectable?.(row) ?? true);\n const expandable = env.renderDetail !== undefined && (env.isRowExpandable?.(row) ?? true);\n\n return (\n <div\n role=\"row\"\n aria-rowindex={ariaRowIndex}\n aria-selected={env.selectionMode !== \"none\" && selectable ? selected : undefined}\n aria-level={treegrid ? item.depth + 1 : undefined}\n aria-expanded={expandable ? props.expanded : undefined}\n data-kit=\"data-grid-row\"\n data-kind=\"data\"\n data-index={displayIndex}\n data-row-id={id}\n data-selected={selected ? \"\" : undefined}\n data-expanded={props.expanded ? \"\" : undefined}\n style={style}\n onClick={env.onRowClick === undefined ? undefined : (event) => {\n if (!startedOnControl(event)) env.onRowClick?.(row, event);\n }}\n >\n {renderSlots((info, index) => {\n const cursor = cursorCol === index;\n\n if (info.kind === \"select\") {\n return (\n <GridCell key={info.id} info={info} index={index} navRow={navRow} cursor={cursor}>\n {selectable ? (\n <Checkbox\n checked={selected}\n label={messages.selectRow}\n tabIndex={-1}\n data-grid-primary=\"\"\n data-grid-space=\"\"\n onChange={(event) =>\n env.toggleSelect(\n id,\n displayIndex,\n env.selectionMode === \"multiple\" && (event.nativeEvent as { shiftKey?: boolean }).shiftKey === true,\n )\n }\n />\n ) : null}\n </GridCell>\n );\n }\n\n if (info.kind === \"expand\") {\n return (\n <GridCell key={info.id} info={info} index={index} navRow={navRow} cursor={cursor}>\n {expandable ? (\n <IconButton\n label={props.expanded ? messages.collapseRow : messages.expandRow}\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n tabIndex={-1}\n aria-expanded={props.expanded}\n data-grid-primary=\"\"\n data-grid-space=\"\"\n onClick={() => env.toggleExpand(id)}\n >\n <span data-flip=\"\">\n <Icon name={props.expanded ? \"chevron-down\" : \"chevron-right\"} size={16} />\n </span>\n </IconButton>\n ) : null}\n </GridCell>\n );\n }\n\n const column = info.column as DataGridColumn<Row>;\n const override = props.overrides?.[column.id];\n const value = override === undefined ? getColumnValue(column, row) : override.value;\n const format = env.formatters.get(column.id);\n const text = format === undefined ? \"\" : format(value, row);\n const editing = props.editingColumnId === column.id;\n const editable = isEditable(column, row);\n\n const state: Record<string, string | undefined> = {\n \"data-editing\": editing ? \"\" : undefined,\n \"data-editable\": editable ? \"\" : undefined,\n \"data-dirty\": override !== undefined && override.status !== \"error\" ? \"\" : undefined,\n \"data-pending\": override?.status === \"pending\" ? \"\" : undefined,\n \"data-error\": override?.status === \"error\" ? \"\" : undefined,\n };\n\n return (\n <GridCell key={info.id} info={info} index={index} navRow={navRow} cursor={cursor} state={state}>\n {editing ? (\n <CellEditor\n column={column}\n value={value}\n messages={messages}\n locale={locale}\n error={props.editingError}\n onCommit={env.commitEdit}\n onCancel={env.cancelEdit}\n />\n ) : (\n <span\n data-kit-slot=\"cell-content\"\n onDoubleClick={editable ? () => env.startEdit(id, column.id, row) : undefined}\n >\n {renderCellContent(\n {\n row,\n rowId: id,\n rowIndex: item.index,\n column,\n value,\n text,\n selected,\n messages,\n locale,\n },\n {\n width: info.width,\n readOnly: false,\n onToggle: (next) => env.toggleBoolean(id, column.id, next, row),\n },\n )}\n </span>\n )}\n </GridCell>\n );\n })}\n </div>\n );\n}\n\nexport const GridRowItem = memo(GridRowView) as typeof GridRowView;\n","import { Icon } from \"@x12i/icons\";\nimport { Badge, IconButton, VisuallyHidden } from \"@x12i/ui\";\nimport { useState, type ReactNode } from \"react\";\nimport {\n formatMessage,\n isEmptyValue,\n isEditable,\n resolveEditor,\n toBoolean,\n toNumber,\n type ColumnOption,\n type DataGridMessages,\n} from \"../index\";\nimport { initialsOf, isAllowedHref, isSafeHref } from \"./internal/format\";\nimport { Checkbox } from \"./internal/fields\";\nimport { Menu, type MenuItem } from \"./internal/menu\";\nimport type { CellContext, DataGridColumn } from \"./types\";\n\n/** What the default cell renderer needs besides the cell context. */\nexport interface CellRenderOptions {\n /** Width of the column in pixels, used to decide how many tags fit. */\n width: number;\n /** Commits a value straight away, for the always-on boolean editor. */\n onToggle?: (value: boolean) => void;\n readOnly: boolean;\n}\n\nconst TAG_WIDTH = 76;\nconst TAG_PADDING = 16;\n\nfunction optionFor<Row>(column: DataGridColumn<Row>, value: unknown): ColumnOption | undefined {\n return column.options?.find((option) => String(option.value) === String(value));\n}\n\nfunction Sparkline({ values, label }: { values: number[]; label: string }) {\n if (values.length === 0) return null;\n const low = Math.min(...values);\n const high = Math.max(...values);\n const span = high - low || 1;\n const last = Math.max(values.length - 1, 1);\n const points = values\n .map((value, index) => `${((index / last) * 100).toFixed(2)},${(100 - ((value - low) / span) * 100).toFixed(2)}`)\n .join(\" \");\n return (\n <svg data-kit=\"data-grid-sparkline\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" role=\"img\" aria-label={label} focusable=\"false\">\n <polyline points={points} fill=\"none\" />\n </svg>\n );\n}\n\nfunction ProgressBar({ ratio, label, valueText }: { ratio: number; label: string; valueText: string }) {\n return (\n <span data-kit=\"data-grid-progress\">\n <span\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(ratio * 100)}\n aria-valuetext={valueText}\n data-kit=\"data-grid-progress-track\"\n >\n <span data-kit=\"data-grid-progress-fill\" style={{ inlineSize: `${(ratio * 100).toFixed(1)}%` }} />\n </span>\n <span data-kit=\"data-grid-progress-text\" aria-hidden=\"true\">\n {valueText}\n </span>\n </span>\n );\n}\n\n/** The row-actions menu of an `actions` cell. */\nexport function RowActionsCell<Row>({ column, row, messages }: { column: DataGridColumn<Row>; row: Row; messages: DataGridMessages }) {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n const [open, setOpen] = useState(false);\n const actions = column.actions?.(row) ?? [];\n if (actions.length === 0) return null;\n\n const items: MenuItem[] = actions.map((action) => ({\n id: action.id,\n label: action.label,\n onSelect: () => action.onSelect(row),\n ...(action.disabled === undefined ? {} : { disabled: action.disabled }),\n danger: action.tone === \"danger\",\n }));\n\n return (\n <>\n <IconButton\n ref={setAnchor}\n label={messages.rowActions}\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n tabIndex={-1}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n data-grid-primary=\"\"\n onClick={() => setOpen((value) => !value)}\n >\n <Icon name=\"more\" size={16} />\n </IconButton>\n <Menu\n open={open}\n anchor={anchor}\n label={messages.rowActions}\n items={items}\n align=\"end\"\n onClose={(reason) => {\n setOpen(false);\n if (reason === \"escape\" || reason === \"select\") anchor?.closest<HTMLElement>('[role=\"gridcell\"]')?.focus({ preventScroll: true });\n }}\n />\n </>\n );\n}\n\n/**\n * The default content of a data cell, by cell type. A column's `cell` renderer\n * replaces all of it. Everything here is plain React over kit components.\n */\nexport function renderCellContent<Row>(context: CellContext<Row>, options: CellRenderOptions): ReactNode {\n const { column, value, text, messages, row } = context;\n if (column.cell !== undefined) return column.cell(context);\n\n const empty = isEmptyValue(value);\n const editor = resolveEditor(column);\n\n // A boolean column that is editable shows a live checkbox, so a toggle is one gesture.\n if (editor === \"boolean\" && !options.readOnly && isEditable(column, row) && options.onToggle !== undefined) {\n const checked = toBoolean(value) === true;\n return (\n <Checkbox\n checked={checked}\n label={column.header}\n tabIndex={-1}\n data-grid-primary=\"\"\n data-grid-space=\"\"\n onChange={(event) => options.onToggle?.(event.currentTarget.checked)}\n />\n );\n }\n\n switch (column.cellType) {\n case \"boolean\": {\n const flag = toBoolean(value);\n if (flag === null) return empty ? null : <span data-kit=\"data-grid-text\">{text}</span>;\n return (\n <span data-kit=\"data-grid-boolean\" data-value={flag ? \"true\" : \"false\"}>\n <Icon name={flag ? \"check\" : \"close\"} size={16} />\n <VisuallyHidden>{flag ? messages.yes : messages.no}</VisuallyHidden>\n </span>\n );\n }\n case \"status\": {\n if (empty) return null;\n const option = optionFor(column, value);\n return <Badge tone={option?.tone ?? \"neutral\"}>{option?.label ?? text}</Badge>;\n }\n case \"tags\": {\n const items = Array.isArray(value) ? value : empty ? [] : [value];\n if (items.length === 0) return null;\n const fit = Math.max(1, Math.floor((options.width - TAG_PADDING) / TAG_WIDTH));\n const shown = items.length > fit ? items.slice(0, Math.max(fit - 1, 1)) : items;\n const hidden = items.slice(shown.length);\n const labelOf = (item: unknown) => optionFor(column, item)?.label ?? String(item);\n return (\n <span data-kit=\"data-grid-tags\">\n {shown.map((item, index) => (\n <Badge key={`${String(item)}:${index}`} size=\"sm\" tone={optionFor(column, item)?.tone ?? \"neutral\"}>\n {labelOf(item)}\n </Badge>\n ))}\n {hidden.length > 0 ? (\n <Badge size=\"sm\" variant=\"outline\" title={hidden.map(labelOf).join(\", \")}>\n {formatMessage(messages.moreTags, { count: hidden.length })}\n <VisuallyHidden>{`: ${hidden.map(labelOf).join(\", \")}`}</VisuallyHidden>\n </Badge>\n ) : null}\n </span>\n );\n }\n case \"progress\": {\n if (empty) return null;\n const max = column.progressMax ?? 100;\n const number = toNumber(value);\n const ratio = Number.isNaN(number) || max <= 0 ? 0 : Math.min(Math.max(number / max, 0), 1);\n return <ProgressBar ratio={ratio} label={column.header} valueText={text} />;\n }\n case \"link\": {\n if (empty) return null;\n const target = column.href?.(row) ?? (typeof value === \"string\" ? value : undefined);\n const allowed =\n target !== undefined && (column.href === undefined ? isSafeHref(target) : isAllowedHref(target));\n if (!allowed || target === undefined) return <span data-kit=\"data-grid-text\">{text}</span>;\n return (\n <a href={target} tabIndex={-1} data-kit=\"data-grid-link\" data-grid-primary=\"\" rel=\"noopener noreferrer\">\n {text}\n </a>\n );\n }\n case \"actions\":\n return <RowActionsCell column={column} row={row} messages={messages} />;\n case \"avatar\": {\n if (empty) return null;\n return (\n <span data-kit=\"data-grid-avatar-cell\">\n <span data-kit=\"data-grid-avatar\" aria-hidden=\"true\">\n {initialsOf(text)}\n </span>\n <span data-kit=\"data-grid-text\" title={text}>\n {text}\n </span>\n </span>\n );\n }\n case \"sparkline\": {\n const series = (Array.isArray(value) ? value : []).map(toNumber).filter((entry) => !Number.isNaN(entry));\n return <Sparkline values={series} label={text} />;\n }\n default:\n if (empty) return null;\n return (\n <span data-kit=\"data-grid-text\" title={text}>\n {text}\n </span>\n );\n }\n}\n","import {\n clampColumnWidth,\n createCellFormatter,\n formatMessage,\n initialColumnWidth,\n isEmptyValue,\n isValuelessOperator,\n toText,\n type CellFormatter,\n type ColumnDef,\n type DataGridMessages,\n type FilterModelItem,\n type FormatContext,\n} from \"../../index\";\n\n/** One formatter per column, keyed by column id. */\nexport function createFormatters<Row>(\n columns: readonly ColumnDef<Row>[],\n context: FormatContext,\n): Map<string, CellFormatter<Row>> {\n const formatters = new Map<string, CellFormatter<Row>>();\n for (const column of columns) formatters.set(column.id, createCellFormatter(column, context));\n return formatters;\n}\n\n/** The width a column is drawn at: the user's size, else the definition's, clamped to its limits. */\nexport function columnWidth<Row>(column: ColumnDef<Row>, sizing: Readonly<Record<string, number>>): number {\n const stored = sizing[column.id];\n return stored === undefined ? initialColumnWidth(column) : clampColumnWidth(column, stored);\n}\n\n/**\n * A formatter for values that are not cells of the column: aggregates and\n * filter values. The column's own `formatter` is skipped, because it expects a\n * row and a cell value.\n */\nexport function plainFormatter<Row>(column: ColumnDef<Row>, context: FormatContext): CellFormatter<Row> {\n const { formatter: _ignored, ...plain } = column;\n void _ignored;\n return createCellFormatter(plain, context);\n}\n\n/** Text for an aggregate. `count` is a plain locale number, not a currency. */\nexport function formatAggregate<Row>(column: ColumnDef<Row>, value: unknown, context: FormatContext): string {\n if (isEmptyValue(value)) return \"\";\n if (column.aggregate === \"count\") {\n return typeof value === \"number\" ? new Intl.NumberFormat(context.locale).format(value) : toText(value);\n }\n return plainFormatter(column, context)(value, undefined as Row);\n}\n\n/** `Ada Lovelace` becomes `AL`. */\nexport function initialsOf(text: string): string {\n const words = text.trim().split(/\\s+/).filter((word) => word !== \"\");\n if (words.length === 0) return \"\";\n const first = Array.from(words[0] ?? \"\")[0] ?? \"\";\n const last = words.length > 1 ? (Array.from(words[words.length - 1] ?? \"\")[0] ?? \"\") : \"\";\n return `${first}${last}`.toUpperCase();\n}\n\nconst SAFE_SCHEME = /^(?:https?:|mailto:|tel:)/i;\nconst RELATIVE = /^(?:\\/(?!\\/)|#|\\.\\.?\\/)/;\nconst DANGEROUS = /^\\s*(?:javascript|data|vbscript):/i;\n\n/** A value that is safe to put in `href` on its own: web, mail, phone or a relative path. */\nexport function isSafeHref(value: string): boolean {\n const trimmed = value.trim();\n return !DANGEROUS.test(trimmed) && (SAFE_SCHEME.test(trimmed) || RELATIVE.test(trimmed));\n}\n\n/** An href a developer supplied through `column.href`: anything but a script URL. */\nexport function isAllowedHref(value: string): boolean {\n return !DANGEROUS.test(value);\n}\n\n/** The value part of a filter chip: formatted, with `in` and `between` spelled out. */\nexport function describeFilterValue<Row>(\n item: FilterModelItem,\n column: ColumnDef<Row>,\n context: FormatContext,\n messages: DataGridMessages,\n): string {\n if (isValuelessOperator(item.operator)) return \"\";\n const format = plainFormatter(column, context);\n const one = (value: unknown): string => {\n if (isEmptyValue(value)) return \"\";\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n const option = column.options?.find((entry) => String(entry.value) === String(value));\n if (option !== undefined) return option.label;\n return format(value, undefined as Row);\n };\n const value = item.value;\n if (item.operator === \"between\" && Array.isArray(value)) {\n const [from, to] = value;\n return `${one(from)} – ${one(to)}`;\n }\n if (Array.isArray(value)) return value.map(one).join(\", \");\n return one(value);\n}\n\n/** The text of a chip: \"Total is greater than 100\". */\nexport function summarizeFilter<Row>(\n item: FilterModelItem,\n column: ColumnDef<Row>,\n context: FormatContext,\n messages: DataGridMessages,\n): string {\n return formatMessage(\n messages.filterSummary,\n {\n column: column.header,\n operator: messages.operators[item.operator],\n value: describeFilterValue(item, column, context, messages),\n },\n context.locale,\n ).trim();\n}\n","import { Icon } from \"@x12i/icons\";\nimport { useRef, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Popover, type PopoverCloseReason } from \"./popover\";\n\nexport interface MenuItem {\n id: string;\n label: ReactNode;\n onSelect: () => void;\n /** Present for a checkable item (`menuitemcheckbox`). */\n checked?: boolean;\n disabled?: boolean;\n /** Draws the item in the danger tone. */\n danger?: boolean;\n /** Leaves the menu open after the item runs, for toggles. */\n keepOpen?: boolean;\n /** Draws a divider above the item. */\n separatorBefore?: boolean;\n}\n\nexport interface MenuProps {\n open: boolean;\n anchor: HTMLElement | null;\n onClose: (reason: PopoverCloseReason) => void;\n /** Accessible name. Pass a translated string. */\n label: string;\n items: readonly MenuItem[];\n align?: \"start\" | \"end\";\n}\n\n/** A menu of buttons with arrow-key navigation, Home, End and Escape. */\nexport function Menu({ open, anchor, onClose, label, items, align }: MenuProps) {\n const list = useRef<HTMLDivElement>(null);\n\n const enabled = () =>\n Array.from(list.current?.querySelectorAll<HTMLElement>('[role^=\"menuitem\"]:not([aria-disabled=\"true\"])') ?? []);\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const entries = enabled();\n if (entries.length === 0) return;\n const current = entries.indexOf(document.activeElement as HTMLElement);\n let next = -1;\n if (event.key === \"ArrowDown\") next = current < 0 ? 0 : (current + 1) % entries.length;\n else if (event.key === \"ArrowUp\") next = current < 0 ? entries.length - 1 : (current - 1 + entries.length) % entries.length;\n else if (event.key === \"Home\") next = 0;\n else if (event.key === \"End\") next = entries.length - 1;\n else if (event.key === \"Tab\") {\n onClose(\"blur\");\n return;\n }\n if (next < 0) return;\n event.preventDefault();\n entries[next]?.focus();\n };\n\n return (\n <Popover open={open} anchor={anchor} onClose={onClose} role=\"menu\" label={label} {...(align === undefined ? {} : { align })}>\n <div ref={list} data-kit=\"data-grid-menu\" onKeyDown={onKeyDown}>\n {items.map((item) => {\n const checkable = item.checked !== undefined;\n return (\n <div key={item.id} role=\"none\" data-kit=\"data-grid-menu-entry\" data-separator={item.separatorBefore === true ? \"\" : undefined}>\n <button\n type=\"button\"\n role={checkable ? \"menuitemcheckbox\" : \"menuitem\"}\n aria-checked={checkable ? item.checked : undefined}\n aria-disabled={item.disabled === true ? true : undefined}\n tabIndex={-1}\n data-kit=\"data-grid-menu-item\"\n data-danger={item.danger === true ? \"\" : undefined}\n data-checked={item.checked === true ? \"\" : undefined}\n onClick={() => {\n if (item.disabled === true) return;\n item.onSelect();\n if (item.keepOpen !== true) onClose(\"select\");\n }}\n >\n <span data-kit-slot=\"menu-check\" aria-hidden=\"true\">\n {item.checked === true ? <Icon name=\"check\" size={16} /> : null}\n </span>\n <span data-kit-slot=\"menu-label\">{item.label}</span>\n </button>\n </div>\n );\n })}\n </div>\n </Popover>\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { clamp, detectDirection, FOCUSABLE, supportsPopover } from \"./dom\";\n\nexport type PopoverCloseReason = \"escape\" | \"outside\" | \"blur\" | \"select\";\n\nexport interface PopoverProps {\n open: boolean;\n /** The element the popover is positioned against and returns focus to. */\n anchor: HTMLElement | null;\n onClose: (reason: PopoverCloseReason) => void;\n role: \"dialog\" | \"menu\";\n /** Accessible name. Pass a translated string. */\n label: string;\n /** `start` lines the popover up with the anchor's inline-start edge, `end` with its inline-end edge. */\n align?: \"start\" | \"end\";\n /** Where focus lands on open. */\n initialFocus?: \"first\" | \"container\";\n children: ReactNode;\n}\n\ninterface Placement {\n top: number;\n inline: number;\n maxBlock: number;\n}\n\nconst MARGIN = 8;\nconst GAP = 4;\n\n/**\n * A private popover. It lives in the top layer where the platform has the\n * Popover API, so it is never clipped by the grid's scroll container, and falls\n * back to `position: fixed` where it does not. Closes on Escape, on a press\n * outside, and when focus moves away; the owner restores focus on `escape` and\n * `select`.\n */\nexport function Popover({ open, anchor, onClose, role, label, align = \"start\", initialFocus = \"first\", children }: PopoverProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [placement, setPlacement] = useState<Placement | null>(null);\n const native = supportsPopover();\n\n const close = useRef(onClose);\n close.current = onClose;\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!open || element === null || anchor === null) return;\n if (native) {\n try {\n element.showPopover();\n } catch {\n // Already open, or the element left the document: nothing to do.\n }\n }\n\n const place = () => {\n const a = anchor.getBoundingClientRect();\n const box = element.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const rtl = detectDirection(anchor) === \"rtl\";\n\n let top = a.bottom + GAP;\n if (top + box.height > viewportHeight - MARGIN && a.top - GAP - box.height >= MARGIN) {\n top = a.top - GAP - box.height;\n }\n top = clamp(top, MARGIN, viewportHeight - MARGIN - Math.min(box.height, viewportHeight - 2 * MARGIN));\n\n const startsAtLeft = rtl ? align === \"end\" : align === \"start\";\n const left = clamp(startsAtLeft ? a.left : a.right - box.width, MARGIN, viewportWidth - MARGIN - box.width);\n const inline = rtl ? viewportWidth - (left + box.width) : left;\n\n setPlacement((previous) => {\n const next = { top, inline, maxBlock: Math.max(viewportHeight - top - MARGIN, 0) };\n return previous !== null && previous.top === next.top && previous.inline === next.inline && previous.maxBlock === next.maxBlock\n ? previous\n : next;\n });\n };\n place();\n window.addEventListener(\"resize\", place);\n window.addEventListener(\"scroll\", place, true);\n return () => {\n window.removeEventListener(\"resize\", place);\n window.removeEventListener(\"scroll\", place, true);\n setPlacement(null);\n };\n }, [open, anchor, align, native]);\n\n // Focus only once the popover has a position: an element that is still\n // `visibility: hidden` cannot take focus.\n const placed = placement !== null;\n useEffect(() => {\n const element = ref.current;\n if (!open || !placed || element === null) return;\n const first = initialFocus === \"first\" ? element.querySelector<HTMLElement>(FOCUSABLE) : null;\n (first ?? element).focus({ preventScroll: true });\n }, [open, placed, initialFocus]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (ref.current?.contains(target) === true || anchor?.contains(target) === true) return;\n close.current(\"outside\");\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown, true);\n }, [open, anchor]);\n\n if (!open) return null;\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n onClose(\"escape\");\n }\n };\n\n return (\n <div\n ref={ref}\n role={role}\n aria-label={label}\n tabIndex={-1}\n data-kit=\"data-grid-popover\"\n data-role={role}\n {...(native ? { popover: \"manual\" } : {})}\n style={\n placement === null\n ? { visibility: \"hidden\", insetBlockStart: 0, insetInlineStart: 0 }\n : { insetBlockStart: placement.top, insetInlineStart: placement.inline, maxBlockSize: placement.maxBlock }\n }\n onKeyDown={onKeyDown}\n onBlur={(event) => {\n const next = event.relatedTarget;\n if (!(next instanceof Node)) return;\n if (ref.current?.contains(next) === true || anchor?.contains(next) === true) return;\n onClose(\"blur\");\n }}\n >\n {children}\n </div>\n );\n}\n","/** Elements a person can tab to inside a popover or a cell. */\nexport const FOCUSABLE =\n 'input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"]), [role=\"menuitem\"]:not([disabled]), [role=\"menuitemcheckbox\"]:not([disabled])';\n\n/** `ltr` or `rtl`, from the nearest `dir` attribute or the computed style. */\nexport function detectDirection(element: Element | null): \"ltr\" | \"rtl\" {\n if (element === null || typeof getComputedStyle !== \"function\") return \"ltr\";\n const attribute = element.closest(\"[dir]\")?.getAttribute(\"dir\");\n if (attribute === \"rtl\" || attribute === \"ltr\") return attribute;\n return getComputedStyle(element).direction === \"rtl\" ? \"rtl\" : \"ltr\";\n}\n\n/** Whether the element takes typed text, so the grid must leave its keys alone. */\nexport function isTextEntry(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;\n if (target instanceof HTMLInputElement) return target.type !== \"checkbox\" && target.type !== \"radio\";\n return false;\n}\n\n/** The popover API is missing from older browsers and from jsdom. */\nexport function supportsPopover(): boolean {\n return typeof HTMLElement !== \"undefined\" && typeof HTMLElement.prototype.showPopover === \"function\";\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), Math.max(min, max));\n}\n","import { Icon } from \"@x12i/icons\";\nimport { IconButton, VisuallyHidden } from \"@x12i/ui\";\nimport { memo, useState, type CSSProperties, type DragEvent, type KeyboardEvent, type PointerEvent, type ReactNode } from \"react\";\nimport { formatMessage, initialColumnWidth, type DataGridMessages, type SortDirection } from \"../index\";\nimport { Menu, type MenuItem } from \"./internal/menu\";\nimport { Popover } from \"./internal/popover\";\nimport type { DataGridColumn } from \"./types\";\n\n/** The kinds of popover a header cell can open. */\nexport type HeaderPopover = \"menu\" | \"filter\";\n\n/** Handlers the header needs. The identity is stable, so header cells can be memoized. */\nexport interface HeaderActions {\n sort: (columnId: string, multi: boolean) => void;\n /** Opens a popover for a column, or closes whichever is open with `null`. */\n setPopover: (columnId: string, kind: HeaderPopover | null) => void;\n /** Closes a popover only while it is still the open one, so a menu item can open the next without a race. */\n closePopover: (columnId: string, kind: HeaderPopover) => void;\n /** `announce` is true for keyboard resizing, which has no other feedback. */\n resize: (columnId: string, width: number, announce?: boolean) => void;\n getMenuItems: (columnId: string) => MenuItem[];\n renderFilter: (columnId: string, close: () => void) => ReactNode;\n /** Drag-and-drop reordering. The keyboard and the column menu reorder without dragging. */\n dragStart: (columnId: string) => void;\n /** Returns whether the dragged column may be dropped here, and marks where it would land. */\n dragOver: (columnId: string, placement: DropPlacement) => boolean;\n dragLeave: (columnId: string) => void;\n drop: (columnId: string, placement: DropPlacement) => void;\n dragEnd: () => void;\n}\n\n/** Which side of the target column a dragged column would land on. */\nexport type DropPlacement = \"before\" | \"after\";\n\nexport interface HeaderCellProps<Row> {\n column: DataGridColumn<Row>;\n /** Position among the grid's columns, 0-based. `aria-colindex` is this plus one. */\n navCol: number;\n width: number;\n minWidth: number;\n maxWidth: number;\n pin: \"start\" | \"end\" | null;\n pinOffset: number;\n /** Last column of the start zone or first of the end zone: draws the divider. */\n pinEdge: boolean;\n sortDirection: SortDirection | null;\n sortRank: number | null;\n sortable: boolean;\n filterable: boolean;\n filtered: boolean;\n resizable: boolean;\n /** This cell holds the roving tab stop. */\n cursor: boolean;\n rtl: boolean;\n popover: HeaderPopover | null;\n align: \"start\" | \"center\" | \"end\";\n messages: DataGridMessages;\n locale: string | undefined;\n actions: HeaderActions;\n /** The header can be dragged to reorder the columns. */\n reorderable: boolean;\n /** This column is the one being dragged. */\n dragging: boolean;\n /** Set while a dragged column is over this one: the side it would land on. */\n dropPlacement: DropPlacement | null;\n}\n\nconst RESIZE_STEP = 16;\n\n/** The half of the cell the pointer is over, in reading order: the first half means \"before\". */\nfunction placementOf(event: DragEvent<HTMLElement>, rtl: boolean): DropPlacement {\n const box = event.currentTarget.getBoundingClientRect();\n const leftHalf = event.clientX < box.left + box.width / 2;\n return leftHalf !== rtl ? \"before\" : \"after\";\n}\n\nfunction ariaSort(direction: SortDirection | null, sortable: boolean): \"ascending\" | \"descending\" | \"none\" | undefined {\n if (!sortable) return undefined;\n return direction === \"asc\" ? \"ascending\" : direction === \"desc\" ? \"descending\" : \"none\";\n}\n\nfunction HeaderCellView<Row>(props: HeaderCellProps<Row>) {\n const {\n column,\n navCol,\n width,\n minWidth,\n maxWidth,\n pin,\n pinOffset,\n pinEdge,\n sortDirection,\n sortRank,\n sortable,\n filterable,\n filtered,\n resizable,\n cursor,\n rtl,\n popover,\n align,\n messages,\n locale,\n actions,\n reorderable,\n dragging,\n dropPlacement,\n } = props;\n const [menuAnchor, setMenuAnchor] = useState<HTMLElement | null>(null);\n const [filterAnchor, setFilterAnchor] = useState<HTMLElement | null>(null);\n const [drag, setDrag] = useState<{ startX: number; startWidth: number } | null>(null);\n\n const style: CSSProperties = { inlineSize: width };\n if (pin === \"start\") style.insetInlineStart = pinOffset;\n if (pin === \"end\") style.insetInlineEnd = pinOffset;\n\n const label: ReactNode =\n column.headerCell === undefined\n ? column.header\n : column.headerCell({ column, sortDirection, messages });\n\n const restoreFocus = (reason: string) => {\n if (reason === \"escape\" || reason === \"select\") {\n const cell = menuAnchor?.closest<HTMLElement>('[role=\"columnheader\"]') ?? filterAnchor?.closest<HTMLElement>('[role=\"columnheader\"]');\n cell?.focus({ preventScroll: true });\n }\n };\n\n const onResizerKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const grow = rtl ? \"ArrowLeft\" : \"ArrowRight\";\n const shrink = rtl ? \"ArrowRight\" : \"ArrowLeft\";\n const step = event.shiftKey ? RESIZE_STEP * 4 : RESIZE_STEP;\n let next: number | null = null;\n if (event.key === grow) next = width + step;\n else if (event.key === shrink) next = width - step;\n else if (event.key === \"Home\") next = minWidth;\n else if (event.key === \"End\") next = maxWidth;\n if (next === null) return;\n event.preventDefault();\n event.stopPropagation();\n actions.resize(column.id, next, true);\n };\n\n const onDragStart = (event: DragEvent<HTMLElement>) => {\n // Pressing the resize handle must not start a column drag.\n if (drag !== null) {\n event.preventDefault();\n return;\n }\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", column.header); // Firefox starts no drag without data\n actions.dragStart(column.id);\n };\n\n const onDragOver = (event: DragEvent<HTMLElement>) => {\n if (!actions.dragOver(column.id, placementOf(event, rtl))) return;\n event.preventDefault(); // allows the drop\n event.dataTransfer.dropEffect = \"move\";\n };\n\n const onDragLeave = (event: DragEvent<HTMLElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) actions.dragLeave(column.id);\n };\n\n const onDrop = (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n actions.drop(column.id, placementOf(event, rtl));\n };\n\n const onPointerDown = (event: PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return;\n event.preventDefault();\n event.currentTarget.setPointerCapture(event.pointerId);\n setDrag({ startX: event.clientX, startWidth: width });\n };\n\n const onPointerMove = (event: PointerEvent<HTMLDivElement>) => {\n if (drag === null) return;\n const delta = event.clientX - drag.startX;\n actions.resize(column.id, drag.startWidth + (rtl ? -delta : delta));\n };\n\n const endDrag = (event: PointerEvent<HTMLDivElement>) => {\n if (drag === null) return;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);\n setDrag(null);\n };\n\n return (\n <div\n role=\"columnheader\"\n aria-colindex={navCol + 1}\n aria-sort={ariaSort(sortDirection, sortable)}\n tabIndex={cursor ? 0 : -1}\n data-kit=\"data-grid-header-cell\"\n data-nav-row={0}\n data-nav-col={navCol}\n data-column={column.id}\n data-align={align}\n data-sorted={sortDirection ?? undefined}\n data-filtered={filtered ? \"\" : undefined}\n data-pinned={pin ?? undefined}\n data-pinned-edge={pinEdge ? \"\" : undefined}\n data-resizing={drag === null ? undefined : \"\"}\n data-dragging={dragging ? \"\" : undefined}\n data-drop={dropPlacement ?? undefined}\n draggable={reorderable ? true : undefined}\n onDragStart={reorderable ? onDragStart : undefined}\n onDragOver={reorderable ? onDragOver : undefined}\n onDragLeave={reorderable ? onDragLeave : undefined}\n onDrop={reorderable ? onDrop : undefined}\n onDragEnd={reorderable ? actions.dragEnd : undefined}\n style={style}\n >\n <div data-kit=\"data-grid-header-content\">\n {sortable ? (\n <button\n type=\"button\"\n tabIndex={-1}\n data-kit=\"data-grid-sort\"\n data-grid-primary=\"\"\n data-grid-space=\"\"\n onClick={(event) => actions.sort(column.id, event.shiftKey)}\n >\n <span data-kit-slot=\"header-label\">{label}</span>\n <span data-kit-slot=\"sort-icon\" aria-hidden=\"true\">\n <Icon name={sortDirection === \"desc\" ? \"chevron-down\" : \"chevron-up\"} size={12} />\n </span>\n {sortRank !== null ? (\n <span data-kit-slot=\"sort-rank\">\n <span aria-hidden=\"true\">{sortRank}</span>\n <VisuallyHidden>{formatMessage(messages.sortRank, { rank: sortRank }, locale)}</VisuallyHidden>\n </span>\n ) : null}\n </button>\n ) : (\n <span data-kit-slot=\"header-label\">{label}</span>\n )}\n\n {filterable ? (\n <>\n <IconButton\n ref={setFilterAnchor}\n label={formatMessage(messages.filterColumn, { column: column.header }, locale)}\n variant=\"ghost\"\n tone={filtered ? \"accent\" : \"neutral\"}\n size=\"xs\"\n tabIndex={-1}\n aria-haspopup=\"dialog\"\n aria-expanded={popover === \"filter\"}\n data-kit-slot=\"filter-trigger\"\n data-active={filtered ? \"\" : undefined}\n onClick={() => actions.setPopover(column.id, popover === \"filter\" ? null : \"filter\")}\n >\n <Icon name=\"filter\" size={12} />\n </IconButton>\n <Popover\n open={popover === \"filter\"}\n anchor={filterAnchor}\n role=\"dialog\"\n label={formatMessage(messages.filterColumn, { column: column.header }, locale)}\n align={rtl ? \"end\" : \"start\"}\n onClose={(reason) => {\n actions.closePopover(column.id, \"filter\");\n restoreFocus(reason);\n }}\n >\n {popover === \"filter\"\n ? actions.renderFilter(column.id, () => {\n actions.setPopover(column.id, null);\n filterAnchor?.closest<HTMLElement>('[role=\"columnheader\"]')?.focus({ preventScroll: true });\n })\n : null}\n </Popover>\n </>\n ) : null}\n\n <IconButton\n ref={setMenuAnchor}\n label={formatMessage(messages.columnMenu, { column: column.header }, locale)}\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"xs\"\n tabIndex={-1}\n aria-haspopup=\"menu\"\n aria-expanded={popover === \"menu\"}\n data-kit-slot=\"menu-trigger\"\n onClick={() => actions.setPopover(column.id, popover === \"menu\" ? null : \"menu\")}\n >\n <Icon name=\"chevron-down\" size={12} />\n </IconButton>\n <Menu\n open={popover === \"menu\"}\n anchor={menuAnchor}\n label={formatMessage(messages.columnMenu, { column: column.header }, locale)}\n items={popover === \"menu\" ? actions.getMenuItems(column.id) : []}\n align={rtl ? \"end\" : \"start\"}\n onClose={(reason) => {\n actions.closePopover(column.id, \"menu\");\n restoreFocus(reason);\n }}\n />\n </div>\n\n {resizable ? (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={formatMessage(messages.resizeColumn, { column: column.header }, locale)}\n aria-valuenow={width}\n aria-valuemin={minWidth}\n aria-valuemax={maxWidth}\n tabIndex={-1}\n data-kit=\"data-grid-resizer\"\n data-active={drag === null ? undefined : \"\"}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onResizerKeyDown}\n onClick={(event) => event.stopPropagation()}\n onDoubleClick={() => actions.resize(column.id, initialColumnWidth(column))}\n />\n ) : null}\n </div>\n );\n}\n\nexport const HeaderCell = memo(HeaderCellView) as typeof HeaderCellView;\n","/** Copies text. Uses the async clipboard API and falls back to `execCommand` where it is missing. */\nexport async function writeClipboard(text: string): Promise<boolean> {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard !== undefined && typeof navigator.clipboard.writeText === \"function\") {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // Permission denied or insecure context: try the fallback.\n }\n if (typeof document === \"undefined\") return false;\n const area = document.createElement(\"textarea\");\n area.value = text;\n area.setAttribute(\"readonly\", \"\");\n area.style.position = \"fixed\";\n area.style.insetBlockStart = \"0\";\n area.style.opacity = \"0\";\n document.body.append(area);\n area.select();\n let copied: boolean;\n try {\n copied = document.execCommand(\"copy\");\n } catch {\n copied = false;\n }\n area.remove();\n return copied;\n}\n\n/** Offers text as a file download. Does nothing where there is no `Blob` URL support. */\nexport function downloadText(text: string, fileName: string, type = \"text/csv;charset=utf-8\"): void {\n if (typeof document === \"undefined\" || typeof URL === \"undefined\" || typeof URL.createObjectURL !== \"function\") return;\n const url = URL.createObjectURL(new Blob([text], { type }));\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n link.hidden = true;\n document.body.append(link);\n link.click();\n link.remove();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n","import { useCallback, useRef, useState } from \"react\";\n\nexport type Updater<T> = T | ((previous: T) => T);\n\n/**\n * State that is controlled when `value` is given and uncontrolled otherwise.\n * The setter takes a value or an updater, and reads the latest value, so two\n * updates in one event handler compose. `onChange` fires for every change in\n * both modes.\n */\nexport function useControllableState<T>(\n value: T | undefined,\n defaultValue: T | (() => T),\n onChange?: (next: T) => void,\n): [T, (next: Updater<T>) => void] {\n const [inner, setInner] = useState<T>(defaultValue);\n const controlled = value !== undefined;\n const current = controlled ? value : inner;\n\n const latest = useRef(current);\n latest.current = current;\n const isControlled = useRef(controlled);\n isControlled.current = controlled;\n const handler = useRef(onChange);\n handler.current = onChange;\n\n const set = useCallback((next: Updater<T>) => {\n const resolved = typeof next === \"function\" ? (next as (previous: T) => T)(latest.current) : next;\n if (Object.is(resolved, latest.current)) return;\n latest.current = resolved;\n if (!isControlled.current) setInner(resolved);\n handler.current?.(resolved);\n }, []);\n\n return [current, set];\n}\n\n/** A function with a stable identity that always calls the latest closure. */\nexport function useEvent<Args extends unknown[], Result>(\n callback: (...args: Args) => Result,\n): (...args: Args) => Result {\n const ref = useRef(callback);\n ref.current = callback;\n return useCallback((...args: Args) => ref.current(...args), []);\n}\n","import { Icon } from \"@x12i/icons\";\nimport { IconButton } from \"@x12i/ui\";\nimport { useMemo } from \"react\";\nimport { formatMessage, resolveMessages, type DataGridMessageOverrides } from \"../index\";\nimport { SelectInput } from \"./internal/fields\";\n\nexport interface PaginationProps {\n /** Zero-based page index. */\n page: number;\n pageSize: number;\n /** Total rows, or `null` when the server has not said yet. */\n total: number | null;\n pageSizeOptions?: number[];\n onPageChange: (page: number) => void;\n /** Shows the page-size select when given. */\n onPageSizeChange?: (pageSize: number) => void;\n messages?: DataGridMessageOverrides;\n locale?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Page controls for a grid or any list: the visible range, a page-size select,\n * and first, previous, next and last buttons. Pages are zero-based. Use it with\n * `DataGrid` (which shows it for `paginated`) or on its own.\n */\nexport function Pagination({\n page,\n pageSize,\n total,\n pageSizeOptions,\n onPageChange,\n onPageSizeChange,\n messages: overrides,\n locale,\n disabled = false,\n className,\n}: PaginationProps) {\n const messages = useMemo(() => resolveMessages(overrides), [overrides]);\n const pages = total === null ? null : Math.max(1, Math.ceil(total / Math.max(pageSize, 1)));\n const lastPage = pages === null ? Number.POSITIVE_INFINITY : pages - 1;\n const current = Math.min(Math.max(page, 0), lastPage);\n const start = total === 0 ? 0 : current * pageSize + 1;\n const end = total === null ? (current + 1) * pageSize : Math.min((current + 1) * pageSize, total);\n\n const atStart = disabled || current <= 0;\n const atEnd = disabled || current >= lastPage;\n const go = (target: number) => onPageChange(Math.min(Math.max(target, 0), lastPage));\n\n const sizes = useMemo(() => {\n const set = new Set([...(pageSizeOptions ?? []), pageSize]);\n return [...set].sort((a, b) => a - b);\n }, [pageSizeOptions, pageSize]);\n\n return (\n <nav aria-label={messages.paginationLabel} data-kit=\"data-grid-pagination\" {...(className === undefined ? {} : { className })}>\n {onPageSizeChange !== undefined ? (\n <label data-kit-slot=\"page-size\">\n <span>{messages.pageSize}</span>\n <SelectInput\n label={messages.pageSize}\n value={pageSize}\n disabled={disabled}\n onChange={(event) => onPageSizeChange(Number(event.currentTarget.value))}\n >\n {sizes.map((size) => (\n <option key={size} value={size}>\n {new Intl.NumberFormat(locale).format(size)}\n </option>\n ))}\n </SelectInput>\n </label>\n ) : null}\n\n <span data-kit-slot=\"range\">\n {total === null\n ? formatMessage(messages.pageStatus, { page: current + 1, pages: \"?\" }, locale)\n : formatMessage(messages.pageRange, { start, end, total }, locale)}\n </span>\n\n <span data-kit-slot=\"buttons\">\n <IconButton label={messages.firstPage} variant=\"ghost\" tone=\"neutral\" size=\"sm\" disabled={atStart} onClick={() => go(0)}>\n <span data-flip=\"\" data-kit-slot=\"double-chevron\">\n <Icon name=\"chevron-left\" size={12} />\n <Icon name=\"chevron-left\" size={12} />\n </span>\n </IconButton>\n <IconButton label={messages.previousPage} variant=\"ghost\" tone=\"neutral\" size=\"sm\" disabled={atStart} onClick={() => go(current - 1)}>\n <span data-flip=\"\">\n <Icon name=\"chevron-left\" size={16} />\n </span>\n </IconButton>\n {pages === null ? null : (\n <span data-kit-slot=\"status\">{formatMessage(messages.pageStatus, { page: current + 1, pages }, locale)}</span>\n )}\n <IconButton label={messages.nextPage} variant=\"ghost\" tone=\"neutral\" size=\"sm\" disabled={atEnd} onClick={() => go(current + 1)}>\n <span data-flip=\"\">\n <Icon name=\"chevron-right\" size={16} />\n </span>\n </IconButton>\n <IconButton\n label={messages.lastPage}\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n disabled={atEnd || pages === null}\n onClick={() => go(lastPage)}\n >\n <span data-flip=\"\" data-kit-slot=\"double-chevron\">\n <Icon name=\"chevron-right\" size={12} />\n <Icon name=\"chevron-right\" size={12} />\n </span>\n </IconButton>\n </span>\n </nav>\n );\n}\n","import { Icon } from \"@x12i/icons\";\nimport { Button, IconButton } from \"@x12i/ui\";\nimport { useState, type ReactNode } from \"react\";\nimport { formatMessage, type DataGridMessages } from \"../index\";\nimport { TextInput } from \"./internal/fields\";\nimport { Menu, type MenuItem } from \"./internal/menu\";\n\nexport interface ToolbarColumn {\n id: string;\n header: string;\n visible: boolean;\n}\n\nexport interface ToolbarProps {\n messages: DataGridMessages;\n locale: string | undefined;\n search: boolean;\n columnsMenu: boolean;\n exportButton: boolean;\n copyButton: boolean;\n quickFilter: string;\n onQuickFilterChange: (text: string) => void;\n columns: ToolbarColumn[];\n onToggleColumn: (id: string, visible: boolean) => void;\n onShowAllColumns: () => void;\n selectedCount: number;\n totalCount: number | null;\n onClearSelection: () => void;\n onCopy: () => void;\n onExport: () => void;\n exporting: boolean;\n start?: ReactNode;\n end?: ReactNode;\n}\n\n/** Quick search, the columns menu, export, copy, the selection summary and two slots. */\nexport function Toolbar(props: ToolbarProps) {\n const { messages, locale, quickFilter, selectedCount, totalCount } = props;\n const [columnsAnchor, setColumnsAnchor] = useState<HTMLElement | null>(null);\n const [columnsOpen, setColumnsOpen] = useState(false);\n\n const items: MenuItem[] = [\n ...props.columns.map((column) => ({\n id: column.id,\n label: column.header,\n checked: column.visible,\n keepOpen: true,\n onSelect: () => props.onToggleColumn(column.id, !column.visible),\n })),\n {\n id: \"__show-all\",\n label: messages.showAllColumns,\n separatorBefore: true,\n disabled: props.columns.every((column) => column.visible),\n onSelect: props.onShowAllColumns,\n keepOpen: true,\n },\n ];\n\n const hasStart = props.start !== undefined && props.start !== null;\n const hasEnd = props.end !== undefined && props.end !== null;\n const showSelection = selectedCount > 0;\n const showAnything =\n props.search || props.columnsMenu || props.exportButton || props.copyButton || showSelection || hasStart || hasEnd;\n if (!showAnything) return null;\n\n const allSelected = totalCount !== null && totalCount > 0 && selectedCount === totalCount;\n\n return (\n <div role=\"group\" aria-label={messages.toolbarLabel} data-kit=\"data-grid-toolbar\">\n {hasStart ? <div data-kit-slot=\"toolbar-start\">{props.start}</div> : null}\n\n {props.search ? (\n <div data-kit-slot=\"search\">\n <span data-kit-slot=\"search-icon\" aria-hidden=\"true\">\n <Icon name=\"search\" size={16} />\n </span>\n <TextInput\n label={messages.quickSearch}\n type=\"search\"\n value={quickFilter}\n placeholder={messages.quickSearchPlaceholder}\n onChange={(event) => props.onQuickFilterChange(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\" && quickFilter !== \"\") {\n event.preventDefault();\n props.onQuickFilterChange(\"\");\n }\n }}\n />\n {quickFilter !== \"\" ? (\n <IconButton\n label={messages.clearSearch}\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"xs\"\n onClick={() => props.onQuickFilterChange(\"\")}\n >\n <Icon name=\"close\" size={12} />\n </IconButton>\n ) : null}\n </div>\n ) : null}\n\n {showSelection ? (\n <div data-kit-slot=\"selection\">\n <span data-kit-slot=\"selection-count\">\n {allSelected\n ? formatMessage(messages.allSelected, { count: selectedCount }, locale)\n : formatMessage(messages.selectedCount, { count: selectedCount }, locale)}\n </span>\n <Button variant=\"ghost\" tone=\"neutral\" size=\"sm\" onClick={props.onClearSelection}>\n {messages.clearSelection}\n </Button>\n </div>\n ) : null}\n\n <div data-kit-slot=\"toolbar-actions\">\n {props.copyButton && showSelection ? (\n <Button variant=\"outline\" tone=\"neutral\" size=\"sm\" onClick={props.onCopy}>\n <Icon name=\"copy\" size={16} />\n {messages.copySelection}\n </Button>\n ) : null}\n {props.exportButton ? (\n <Button variant=\"outline\" tone=\"neutral\" size=\"sm\" loading={props.exporting} loadingLabel={messages.loading} onClick={props.onExport}>\n <Icon name=\"download\" size={16} />\n {messages.exportCsv}\n </Button>\n ) : null}\n {props.columnsMenu ? (\n <>\n <Button\n ref={setColumnsAnchor}\n variant=\"outline\"\n tone=\"neutral\"\n size=\"sm\"\n aria-haspopup=\"menu\"\n aria-expanded={columnsOpen}\n onClick={() => setColumnsOpen((open) => !open)}\n >\n <Icon name=\"eye\" size={16} />\n {messages.columns}\n </Button>\n <Menu\n open={columnsOpen}\n anchor={columnsAnchor}\n label={messages.columnsMenuLabel}\n items={items}\n align=\"end\"\n onClose={(reason) => {\n setColumnsOpen(false);\n if (reason === \"escape\" || reason === \"select\") columnsAnchor?.focus({ preventScroll: true });\n }}\n />\n </>\n ) : null}\n {hasEnd ? <div data-kit-slot=\"toolbar-end\">{props.end}</div> : null}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport {\n createServerRowStore,\n type GetRowsRequest,\n type ServerDataSource,\n type ServerQuery,\n type ServerRowStore,\n type ServerStoreSnapshot,\n} from \"../index\";\n\nconst EMPTY: ServerStoreSnapshot = { version: 0, total: null, loading: false, error: null, stale: false };\n\nexport interface UseServerRowStoreOptions<Row> {\n dataSource: ServerDataSource<Row> | undefined;\n blockSize: number;\n query: ServerQuery;\n}\n\n/**\n * Owns a `ServerRowStore` for a data source and exposes its snapshot to React.\n * The store is created in an effect and destroyed in its cleanup, so it behaves\n * under Strict Mode's mount, unmount, mount. `store` is `null` for the first\n * render and when there is no data source.\n */\nexport function useServerRowStore<Row>({ dataSource, blockSize, query }: UseServerRowStoreOptions<Row>): {\n store: ServerRowStore<Row> | null;\n snapshot: ServerStoreSnapshot;\n} {\n const [store, setStore] = useState<ServerRowStore<Row> | null>(null);\n const latest = useRef({ blockSize, query });\n latest.current = { blockSize, query };\n\n useEffect(() => {\n if (dataSource === undefined) {\n setStore(null);\n return;\n }\n const created = createServerRowStore<Row>({ dataSource, blockSize: latest.current.blockSize, query: latest.current.query });\n setStore(created);\n return () => {\n created.destroy();\n };\n }, [dataSource]);\n\n useEffect(() => {\n store?.setBlockSize(blockSize);\n }, [store, blockSize]);\n useEffect(() => {\n store?.setQuery(query);\n }, [store, query]);\n\n const subscribe = useCallback((listener: () => void) => (store === null ? () => {} : store.subscribe(listener)), [store]);\n const getSnapshot = useCallback(() => (store === null ? EMPTY : store.getSnapshot()), [store]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return { store, snapshot };\n}\n\n/**\n * Reads every row a query matches, one request after another. Used by CSV\n * export in server mode. Follows cursors when the source returns them.\n */\nexport async function fetchAllRows<Row>(\n dataSource: ServerDataSource<Row>,\n query: ServerQuery,\n options: { signal?: AbortSignal; pageSize?: number } = {},\n): Promise<Row[]> {\n const pageSize = options.pageSize ?? 500;\n const rows: Row[] = [];\n let start = 0;\n let total = Number.POSITIVE_INFINITY;\n let cursor: string | null | undefined;\n while (start < total) {\n const request: GetRowsRequest = {\n startRow: start,\n endRow: start + pageSize,\n sort: query.sort,\n filter: query.filter,\n group: query.group,\n ...(query.quickFilter === undefined || query.quickFilter === \"\" ? {} : { quickFilter: query.quickFilter }),\n ...(cursor === undefined ? {} : { cursor }),\n };\n const result = await dataSource.getRows(request, options.signal === undefined ? {} : { signal: options.signal });\n rows.push(...result.rows);\n total = result.total;\n if (result.rows.length === 0) break;\n start += result.rows.length;\n if (result.nextCursor !== undefined) {\n if (result.nextCursor === null) break;\n cursor = result.nextCursor;\n }\n }\n return rows;\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n createViewState,\n EMPTY_SELECTION,\n type ColumnDef,\n type ColumnPinning,\n type FilterModelItem,\n type GridViewState,\n type GroupModelItem,\n type SelectionState,\n type SortModelItem,\n} from \"../index\";\nimport type { PaginationState } from \"./types\";\n\nexport interface UseGridStateOptions<Row> {\n columns: readonly ColumnDef<Row>[];\n /** Starting values for any part of the view. Columns' `hidden` and `pinned` apply for the rest. */\n initial?: Partial<GridViewState>;\n /** Starting page size. Default 25. */\n initialPageSize?: number;\n}\n\n/** The controlled props of `DataGrid` that `useGridState` fills in. Spread them: `<DataGrid {...grid.props} />`. */\nexport interface GridStateProps {\n sort: SortModelItem[];\n onSortChange: (sort: SortModelItem[]) => void;\n filter: FilterModelItem[];\n onFilterChange: (filter: FilterModelItem[]) => void;\n quickFilter: string;\n onQuickFilterChange: (text: string) => void;\n group: GroupModelItem[];\n onGroupChange: (group: GroupModelItem[]) => void;\n columnOrder: string[];\n onColumnOrderChange: (order: string[]) => void;\n columnVisibility: Record<string, boolean>;\n onColumnVisibilityChange: (visibility: Record<string, boolean>) => void;\n columnSizing: Record<string, number>;\n onColumnSizingChange: (sizing: Record<string, number>) => void;\n columnPinning: ColumnPinning;\n onColumnPinningChange: (pinning: ColumnPinning) => void;\n selection: SelectionState;\n onSelectionChange: (selection: SelectionState) => void;\n pagination: PaginationState;\n onPaginationChange: (pagination: PaginationState) => void;\n}\n\nexport interface UseGridStateResult {\n /** Spread onto `DataGrid` to control it from outside. */\n props: GridStateProps;\n /** The part of the state a saved view keeps. */\n view: GridViewState;\n /** Replaces the whole view, for example with the result of `applySavedView`. */\n setView: (view: GridViewState) => void;\n /** Back to what the column definitions say. Clears quick search and selection too. */\n reset: () => void;\n}\n\n/**\n * All of the grid's state in one hook, so an app can read it, persist it, put\n * it in the URL, or reset it. `DataGrid` works without it; use it when you need\n * to see the sort, filters or selection outside the grid.\n */\nexport function useGridState<Row>({ columns, initial, initialPageSize = 25 }: UseGridStateOptions<Row>): UseGridStateResult {\n const [start] = useState(() => ({ ...createViewState(columns), ...initial }));\n const [sort, setSort] = useState(start.sort);\n const [filter, setFilter] = useState(start.filter);\n const [group, setGroup] = useState(start.group);\n const [columnOrder, setColumnOrder] = useState(start.columnOrder);\n const [columnVisibility, setColumnVisibility] = useState(start.columnVisibility);\n const [columnSizing, setColumnSizing] = useState(start.columnSizing);\n const [columnPinning, setColumnPinning] = useState(start.columnPinning);\n const [quickFilter, setQuickFilter] = useState(\"\");\n const [selection, setSelection] = useState<SelectionState>(EMPTY_SELECTION);\n const [pagination, setPagination] = useState<PaginationState>({ page: 0, pageSize: initialPageSize });\n\n const view = useMemo<GridViewState>(\n () => ({ sort, filter, group, columnOrder, columnVisibility, columnSizing, columnPinning }),\n [sort, filter, group, columnOrder, columnVisibility, columnSizing, columnPinning],\n );\n\n const setView = useCallback((next: GridViewState) => {\n setSort(next.sort);\n setFilter(next.filter);\n setGroup(next.group);\n setColumnOrder(next.columnOrder);\n setColumnVisibility(next.columnVisibility);\n setColumnSizing(next.columnSizing);\n setColumnPinning(next.columnPinning);\n setPagination((previous) => ({ ...previous, page: 0 }));\n }, []);\n\n const reset = useCallback(() => {\n setView(createViewState(columns));\n setQuickFilter(\"\");\n setSelection(EMPTY_SELECTION);\n }, [columns, setView]);\n\n const props = useMemo<GridStateProps>(\n () => ({\n sort,\n onSortChange: setSort,\n filter,\n onFilterChange: setFilter,\n quickFilter,\n onQuickFilterChange: setQuickFilter,\n group,\n onGroupChange: setGroup,\n columnOrder,\n onColumnOrderChange: setColumnOrder,\n columnVisibility,\n onColumnVisibilityChange: setColumnVisibility,\n columnSizing,\n onColumnSizingChange: setColumnSizing,\n columnPinning,\n onColumnPinningChange: setColumnPinning,\n selection,\n onSelectionChange: setSelection,\n pagination,\n onPaginationChange: setPagination,\n }),\n [sort, filter, quickFilter, group, columnOrder, columnVisibility, columnSizing, columnPinning, selection, pagination],\n );\n\n return { props, view, setView, reset };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n applySavedView,\n captureView,\n type ColumnDef,\n type GridViewState,\n type SavedView,\n type SavedViewStore,\n type SavedViewSummary,\n} from \"../index\";\n\n/** Anything that holds a grid view: the result of `useGridState` fits. */\nexport interface GridViewController {\n view: GridViewState;\n setView: (view: GridViewState) => void;\n}\n\nexport interface UseSavedViewsOptions<Row> {\n store: SavedViewStore;\n columns: readonly ColumnDef<Row>[];\n grid: GridViewController;\n}\n\nexport interface UseSavedViewsResult {\n /** The views in the store, from the last refresh. */\n views: SavedViewSummary[];\n loading: boolean;\n /** The error of the last failed store call, or `null`. */\n error: unknown;\n /** The id of the view last applied or saved, or `null`. */\n activeId: string | null;\n refresh: () => Promise<void>;\n /** Saves the grid's current view under an id and refreshes the list. */\n save: (id: string, name?: string) => Promise<void>;\n /** Loads a view and applies it to the grid. Resolves to `false` when the id has no valid view. */\n apply: (id: string) => Promise<boolean>;\n remove: (id: string) => Promise<void>;\n /** The grid's current view as a `SavedView`, without saving it. */\n capture: (name?: string) => SavedView;\n}\n\n/**\n * Saved views for a grid: list, save the current view, apply one, delete one.\n * The store is any `SavedViewStore` (`createLocalStorageSavedViewStore`, your\n * API, the Flowix adapter). A view saved against other columns still applies;\n * ids the grid does not have are ignored.\n */\nexport function useSavedViews<Row>({ store, columns, grid }: UseSavedViewsOptions<Row>): UseSavedViewsResult {\n const [views, setViews] = useState<SavedViewSummary[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<unknown>(null);\n const [activeId, setActiveId] = useState<string | null>(null);\n\n const latest = useRef({ columns, grid });\n latest.current = { columns, grid };\n const alive = useRef(true);\n useEffect(() => {\n alive.current = true;\n return () => {\n alive.current = false;\n };\n }, []);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n try {\n const list = await store.list();\n if (!alive.current) return;\n setViews(list);\n setError(null);\n } catch (caught) {\n if (alive.current) setError(caught);\n } finally {\n if (alive.current) setLoading(false);\n }\n }, [store]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const capture = useCallback(\n (name?: string) => captureView(latest.current.grid.view, latest.current.columns, name === undefined ? {} : { name }),\n [],\n );\n\n const save = useCallback(\n async (id: string, name?: string) => {\n try {\n await store.save(id, capture(name));\n if (alive.current) {\n setActiveId(id);\n setError(null);\n }\n await refresh();\n } catch (caught) {\n if (alive.current) setError(caught);\n }\n },\n [store, capture, refresh],\n );\n\n const apply = useCallback(\n async (id: string) => {\n try {\n const view = await store.load(id);\n if (view === null || !alive.current) return false;\n latest.current.grid.setView(applySavedView(view, latest.current.columns));\n setActiveId(id);\n setError(null);\n return true;\n } catch (caught) {\n if (alive.current) setError(caught);\n return false;\n }\n },\n [store],\n );\n\n const remove = useCallback(\n async (id: string) => {\n try {\n await store.delete(id);\n if (alive.current) setActiveId((current) => (current === id ? null : current));\n await refresh();\n } catch (caught) {\n if (alive.current) setError(caught);\n }\n },\n [store, refresh],\n );\n\n return { views, loading, error, activeId, refresh, save, apply, remove, capture };\n}\n"],"mappings":"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","names":["Icon","Button","VisuallyHidden","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","useRef","jsx","useRef","jsx","jsxs","Button","useId","jsx","jsxs","useId","Button","Icon","IconButton","VisuallyHidden","Icon","IconButton","useState","value","Icon","useRef","useLayoutEffect","useRef","useState","jsx","useRef","useState","useLayoutEffect","jsx","jsxs","useRef","Icon","Fragment","jsx","jsxs","useState","IconButton","Icon","Fragment","jsx","jsxs","Icon","VisuallyHidden","IconButton","Icon","IconButton","VisuallyHidden","memo","useState","Fragment","jsx","jsxs","useState","Icon","VisuallyHidden","IconButton","memo","useRef","useState","Icon","IconButton","jsx","jsxs","IconButton","Icon","Icon","Button","IconButton","useState","Fragment","jsx","jsxs","useState","Icon","IconButton","Button","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","jsx","jsxs","useState","useEffect","useMemo","useCallback","setSort","useRef","useLayoutEffect","startWidth","endWidth","centerOffsets","centerWidth","Button","Icon","VisuallyHidden","useCallback","useMemo","useState","useState","setSort","useMemo","useCallback","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback"]}
|