schummar-table 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +10 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/components/autoFocusTextField.tsx","../src/state/context.ts","../src/misc/queue.ts","../src/state/persistence.ts","../src/state/useControllableState.ts","../src/state/useColumns.ts","../src/state/useExpanded.ts","../src/state/useFilters.ts","../src/state/useSort.ts","../src/state/useItems.ts","../src/state/useSelection.ts","../src/exporters/serializer.ts","../src/misc/equal.ts","../src/state/useTableProps.ts","../src/state/useTable.ts","../src/state/useTableImperativeHandle.ts","../src/state/useTableReset.ts","../src/components/resizeHandle.tsx","../src/components/cellScheduler.ts","../src/components/cell.tsx","../src/components/details.tsx","../src/components/expandControl.tsx","../src/components/catchClicks.tsx","../src/components/selectComponent.tsx","../src/components/row.tsx","../src/components/rowStyles.ts","../src/components/clearFiltersButton.tsx","../src/components/columnFooter.tsx","../src/components/tableFooter.tsx","../src/components/filterPanel.tsx","../src/components/filterControl.tsx","../src/components/hiddenColumnFilters.tsx","../src/components/sortComponent.tsx","../src/components/columnHeader.tsx","../src/components/formControlLabel.tsx","../src/components/columnSelection.tsx","../src/components/export.tsx","../src/components/tableHeader.tsx","../src/components/virtualized.tsx","../src/components/tableGrid.tsx","../src/components/tableLoadingState.tsx","../src/components/table.tsx","../src/filters/defineFilter.ts","../src/filters/dateFilter.tsx","../src/components/numberField.tsx","../src/filters/rangeFilter.tsx","../src/components/virtualList.tsx","../src/filters/selectFilter.tsx","../src/filters/textFilter.tsx","../src/misc/textMatch.ts"],"sourcesContent":["import type { ComponentType } from 'react';\nimport { useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const TextField = useTheme((t) => t.components.TextField);\n\n const ref = useRef<HTMLInputElement>(null);\n // Filters mount when their popover opens. The popover positions itself first.\n useLayoutEffect(() => {\n const timeout = setTimeout(() => ref.current?.focus());\n return () => clearTimeout(timeout);\n }, []);\n\n return (\n <TextField\n {...props}\n inputRef={ref}\n css={{\n input: {\n backgroundColor: 'inherit',\n color: 'inherit',\n },\n }}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { Id, TableActions, TableContextValue, TableStructure } from '../types';\n\n/** Full table state. Changes on every state change: rows and cells must not consume it. */\nexport const TableContext = createContext<TableContextValue<any> | null>(null);\n\n/** Header, footer and filter components use this so that row interactions (selection,\n * expansion) don't render them. */\nexport const TableStructureContext = createContext<TableStructure<any> | null>(null);\n\n/** Stable for the lifetime of the table. */\nexport const TableActionsContext = createContext<TableActions<any> | null>(null);\n\n/** Only the row checkboxes consume this, so a selection change does not render rows. */\nexport const SelectionContext = createContext<Set<Id>>(new Set());\n\nexport const ColumnContext = createContext<Id | null>(null);\n\nexport function useTableContext<T>(): TableContextValue<T> {\n const value = useContext(TableContext);\n if (!value) throw new Error('No table context available');\n return value as TableContextValue<T>;\n}\n\nexport function useTableStructure<T>(): TableStructure<T> {\n const value = useContext(TableStructureContext);\n if (!value) throw new Error('No table context available');\n return value as TableStructure<T>;\n}\n\nexport function useTableActions<T>(): TableActions<T> {\n const value = useContext(TableActionsContext);\n if (!value) throw new Error('No table context available');\n return value as TableActions<T>;\n}\n\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw new Error('No column context available');\n return value;\n}\n","export class Queue {\n private q = new Array<{\n job: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n }>();\n\n private isRunning = false;\n\n run<T>(job: () => Promise<T>, replace?: boolean) {\n return new Promise<T>((resolve, reject) => {\n if (replace) {\n this.q = [];\n }\n this.q.push({ job, resolve, reject });\n\n // start() never rejects: each job's outcome goes to its own promise.\n if (!this.isRunning) void this.start();\n });\n }\n\n clear() {\n this.q = [];\n }\n\n private async start() {\n this.isRunning = true;\n\n let next;\n while ((next = this.q.shift())) {\n try {\n const result = await next.job();\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Queue } from '../misc/queue';\nimport type { Id, TableProps } from '../types';\n\nexport const PERSIST_KEYS = [\n 'sort',\n 'selection',\n 'expanded',\n 'hiddenColumns',\n 'filterValues',\n 'columnWidths',\n] as const;\n\nexport type PersistKey = (typeof PERSIST_KEYS)[number];\nexport type PersistedData = Partial<Record<PersistKey, any>>;\n\nconst storageName = (id: string) => `schummar-table_state-v1_${id}`;\n\nexport type TableStateStorage = {\n getItem: (key: string) => string | null | Promise<string | null>;\n /** May return a promise. */\n setItem: (key: string, value: string) => unknown;\n /** May return a promise. */\n removeItem: (key: string) => unknown;\n} & (\n | {\n keys: () => string[] | Promise<string[]>;\n }\n | {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n }\n);\n\nfunction stringify(value: unknown) {\n function prepare(value: unknown): any {\n if (value instanceof Date) {\n return { __date: value.toJSON() };\n }\n\n if (value instanceof Set) {\n return { __set: Array.from(value).map(prepare) };\n }\n\n if (value instanceof Map) {\n return { __map: Array.from(value.entries()).map((entry) => entry.map(prepare)) };\n }\n\n if (Array.isArray(value)) {\n return value.map(prepare);\n }\n\n if (value instanceof Object) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, prepare(v)]));\n }\n\n return value;\n }\n\n return JSON.stringify(prepare(value));\n}\n\nfunction parse(value: string) {\n return JSON.parse(value, (_key, value) => {\n if (value instanceof Object && '__date' in value) {\n return new Date(value.__date);\n }\n\n if (value instanceof Object && '__set' in value) {\n return new Set(value.__set);\n }\n\n if (value instanceof Object && '__map' in value) {\n return new Map(value.__map);\n }\n\n return value;\n });\n}\n\n/** A persisted key, or `{ filterValues: [...] }` for the values of some filters only. */\nexport type PersistEntry = PersistKey | { filterValues: readonly Id[] };\n\ntype Persist = NonNullable<TableProps<any>['persist']>;\n\nconst filterIds = (entries: readonly PersistEntry[] | undefined) =>\n entries?.flatMap((entry) => (typeof entry === 'object' ? entry.filterValues : []));\n\nexport function isPersisted(persist: Persist, key: PersistKey) {\n const isIncluded =\n !persist.include ||\n persist.include.includes(key) ||\n (key === 'filterValues' && filterIds(persist.include)!.length > 0);\n return isIncluded && !persist.exclude?.includes(key);\n}\n\nexport function isFilterValuePersisted(persist: Persist, columnId: Id) {\n if (!isPersisted(persist, 'filterValues')) return false;\n const included = persist.include?.includes('filterValues')\n ? undefined\n : filterIds(persist.include);\n return (\n (included === undefined || included.includes(columnId)) &&\n !filterIds(persist.exclude)?.includes(columnId)\n );\n}\n\n/**\n * Loads the persisted state once on mount and saves `data` (at most once per second) after that.\n * `data` must already be reduced to what should be saved.\n */\nexport function usePersistence(\n persist: TableProps<any>['persist'],\n data: PersistedData,\n restore: (data: PersistedData) => void,\n debug?: (...output: any) => void,\n) {\n const [isHydrated, setIsHydrated] = useState(!persist);\n const [queue] = useState(() => new Queue());\n const latest = useRef({ persist, data, restore, debug });\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined);\n const lastSave = useRef(0);\n\n useEffect(() => {\n latest.current = { persist, data, restore, debug };\n });\n\n useEffect(() => {\n const { persist } = latest.current;\n if (!persist) return;\n\n let isCanceled = false;\n\n void (async () => {\n try {\n const json = await persist.storage.getItem(storageName(persist.id));\n if (isCanceled || !json) return;\n\n const data = parse(json);\n latest.current.debug?.('load', json, data);\n latest.current.restore(\n Object.fromEntries(\n PERSIST_KEYS.filter((key) => key in data && isPersisted(persist, key)).map((key) => [\n key,\n data[key],\n ]),\n ),\n );\n } catch (error) {\n console.error('Failed to load table state:', error);\n } finally {\n if (!isCanceled) setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, []);\n\n useEffect(() => {\n if (!isHydrated || !latest.current.persist || timer.current) return;\n\n timer.current = setTimeout(\n () => {\n timer.current = undefined;\n lastSave.current = Date.now();\n\n const { persist, data, debug } = latest.current;\n if (!persist) return;\n\n const json = stringify(data);\n debug?.('save', data, json);\n void queue.run(async () => {\n await persist.storage.setItem(storageName(persist.id), json);\n }, true);\n },\n Math.max(0, lastSave.current + 1000 - Date.now()),\n );\n }, [isHydrated, data, queue]);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n async function clear() {\n clearTimeout(timer.current);\n timer.current = undefined;\n\n const { persist } = latest.current;\n if (!persist) return;\n\n await queue.run(async () => {\n await persist.storage.removeItem(storageName(persist.id));\n }, true);\n }\n\n return [isHydrated, clear] as const;\n}\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * State that can be controlled through a prop. Setting it reports the new value and only stores\n * it when uncontrolled, like a React <input>.\n */\nexport function useControllableState<V>(\n controlled: V | undefined,\n initial: () => V,\n onChange: ((value: V) => void) | undefined,\n) {\n const [internal, setInternal] = useState(initial);\n const value = controlled ?? internal;\n\n const latest = useRef({ controlled, onChange });\n useEffect(() => {\n latest.current = { controlled, onChange };\n });\n\n const [set] = useState(() => (next: V) => {\n latest.current.onChange?.(next);\n if (latest.current.controlled === undefined) {\n setInternal(next);\n }\n });\n\n return [value, set, setInternal] as const;\n}\n\n/**\n * Keeps a state normalized: renders use the normalized value right away, and an effect writes it\n * back (reporting it like any other change) when it differs. `normalize` must return its input\n * unchanged when there is nothing to fix, or this loops.\n */\nexport function useNormalized<V>(value: V, normalized: V, set: (value: V) => void) {\n useEffect(() => {\n if (normalized !== value) {\n set(normalized);\n }\n }, [value, normalized, set]);\n\n return normalized;\n}\n","import { useMemo, useState } from 'react';\nimport type { DisplaySize, Id, InternalColumn, InternalTableProps } from '../types';\nimport { useControllableState } from './useControllableState';\n\nexport function useColumns<T>(props: InternalTableProps<T>, displaySize: DisplaySize | undefined) {\n const [hiddenColumns, setHiddenColumns, setHiddenColumnsInternal] = useControllableState(\n props.hiddenColumns,\n () => props.defaultHiddenColumns ?? new Set<Id>(),\n props.onHiddenColumnsChange,\n );\n const [columnWidths, setColumnWidths] = useState(() => new Map<Id, string>());\n\n const allColumns = props.columns;\n\n const matchesDisplaySize = (column: InternalColumn<T, unknown>) =>\n displaySize === undefined ||\n column.displaySize === undefined ||\n column.displaySize.includes(displaySize);\n\n const columns = useMemo(() => allColumns.filter(matchesDisplaySize), [allColumns, displaySize]);\n\n const activeColumns = useMemo(\n () => allColumns.filter((column) => !(column.hidden ?? hiddenColumns.has(column.id))),\n [allColumns, hiddenColumns],\n );\n\n const visibleColumns = useMemo(\n () => activeColumns.filter(matchesDisplaySize),\n [activeColumns, displaySize],\n );\n\n return {\n hiddenColumns,\n setHiddenColumns,\n setHiddenColumnsInternal,\n columnWidths,\n setColumnWidths,\n columns,\n activeColumns,\n visibleColumns,\n };\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport { getAncestors } from '../misc/helpers';\nimport type { Id, InternalTableProps, TableItem } from '../types';\nimport { useControllableState, useNormalized } from './useControllableState';\n\nexport function useExpanded<T>(\n props: InternalTableProps<T>,\n itemsById: Map<Id, TableItem<T>>,\n matching: Set<Id> | undefined,\n) {\n const [value, setExpanded, setExpandedInternal] = useControllableState(\n props.expanded,\n () => props.defaultExpanded ?? new Set<Id>(),\n props.onExpandedChange,\n );\n\n const expandOnlyOne = props.expandOnlyOne && !(props.revealFiltered && matching);\n\n const normalized = useMemo(() => {\n let result = value;\n const add = (id: Id) => {\n if (result.has(id)) return;\n if (result === value) result = new Set(value);\n result.add(id);\n };\n\n if (expandOnlyOne && value.size > 1) {\n // Keep the deepest expanded item and its ancestors, collapse every other branch.\n const deepest = [...value]\n .map((id) => itemsById.get(id))\n .filter((item) => item !== undefined)\n .sort((a, b) => b.depth - a.depth)[0];\n const branch = deepest ? getAncestors(itemsById, deepest).add(deepest.id) : new Set<Id>();\n if ([...value].some((id) => !branch.has(id))) return branch;\n }\n\n for (const id of value) {\n const item = itemsById.get(id);\n if (item) getAncestors(itemsById, item).forEach(add);\n }\n\n if (props.items !== undefined) {\n for (const id of value) {\n if (!itemsById.has(id)) {\n if (result === value) result = new Set(value);\n result.delete(id);\n }\n }\n }\n\n return result;\n }, [value, itemsById, props.items, expandOnlyOne]);\n\n const expanded = useNormalized(value, normalized, setExpanded);\n\n // Once per filter result rather than in normalization, so revealed rows can be collapsed.\n const latest = useRef({ expanded, itemsById });\n useEffect(() => {\n latest.current = { expanded, itemsById };\n });\n useEffect(() => {\n if (!props.revealFiltered || !matching) return;\n const { expanded, itemsById } = latest.current;\n const next = new Set(expanded);\n for (const id of matching) {\n const parentId = itemsById.get(id)?.parentId;\n if (parentId !== undefined && parentId !== null) next.add(parentId);\n }\n if (next.size > expanded.size) setExpanded(next);\n }, [matching, props.revealFiltered, setExpanded]);\n\n return { expanded, expandOnlyOne, setExpanded, setExpandedInternal };\n}\n","import { useMemo } from 'react';\nimport type { Filter, Id, InternalColumn, InternalTableProps, TableItem } from '../types';\nimport { useControllableState } from './useControllableState';\n\nexport const isActiveFilter = (filter: Filter<any, any> | undefined, value: unknown) =>\n filter !== undefined &&\n value !== undefined &&\n value !== null &&\n filter.isActive(value, filter.options);\n\n/** Columns whose filters apply: the visible ones, or all with `enableHiddenColumnFilters`. */\nexport function filteredColumns<T>(\n props: InternalTableProps<T>,\n visibleColumns: InternalColumn<T, unknown>[],\n) {\n return props.enableHiddenColumnFilters ? props.columns : visibleColumns;\n}\n\n/** Adds controlled values and defaults. Returns `stored` itself when there are none. */\n// Outside the hook: React Compiler miscompiles the reassigned `result` into a memo that never hits.\nfunction withFilterDefaults(stored: Map<Id, unknown>, columns: InternalColumn<any, unknown>[]) {\n let result = stored;\n for (const { id, filter } of columns) {\n const value =\n filter?.value !== undefined || stored.has(id) ? filter?.value : filter?.defaultValue;\n if (value === undefined) continue;\n if (result === stored) result = new Map(stored);\n result.set(id, value);\n }\n return result;\n}\n\nexport function useFilters<T>(\n props: InternalTableProps<T>,\n visibleColumns: InternalColumn<T, unknown>[],\n items: TableItem<T>[],\n) {\n const [stored, setFilterValues, setFilterValuesInternal] = useControllableState(\n props.filterValues,\n () => props.defaultFilterValues ?? new Map<Id, unknown>(),\n props.onFilterValuesChange,\n );\n\n const filterValues = useMemo(\n () => withFilterDefaults(stored, props.columns),\n [stored, props.columns],\n );\n\n const applied = filteredColumns(props, visibleColumns);\n\n /** Ids of matching items and of all their ancestors; undefined when no filter is active. */\n const matching = useMemo(() => {\n const active = applied.flatMap((column) => {\n const { filter } = column;\n const value = filterValues.get(column.id);\n if (!filter || filter.external || !isActiveFilter(filter, value)) return [];\n return [{ column, filter, value }];\n });\n\n if (active.length === 0) return undefined;\n\n const result = new Set<Id>();\n // Children come after their parent, so walking backwards sees descendants first.\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]!;\n const isMatch =\n result.has(item.id) ||\n active.every(({ column, filter, value }) =>\n filter.test(value, column.filterBy(column.value(item.value), item.value), filter.options),\n );\n\n if (isMatch) {\n result.add(item.id);\n if (item.parentId !== undefined && item.parentId !== null) result.add(item.parentId);\n }\n }\n return result;\n }, [applied, filterValues, items]);\n\n return { stored, filterValues, setFilterValues, setFilterValuesInternal, matching };\n}\n","import { useMemo } from 'react';\nimport type { InternalColumn, InternalTableProps } from '../types';\nimport { useControllableState, useNormalized } from './useControllableState';\n\ntype Criterion<T> = {\n key: (item: T) => unknown;\n direction: 1 | -1;\n collator: Intl.Collator;\n};\n\nconst collators = new Map<string, Intl.Collator>();\n\nfunction getCollator(locale: string | undefined, options: Intl.CollatorOptions | undefined) {\n const cacheKey = `${locale}|${JSON.stringify(options)}`;\n let collator = collators.get(cacheKey);\n if (!collator) {\n collator = new Intl.Collator(locale, options);\n collators.set(cacheKey, collator);\n }\n return collator;\n}\n\nexport function useSort<T>(\n props: InternalTableProps<T>,\n activeColumns: InternalColumn<T, unknown>[],\n) {\n const [value, setSort, setSortInternal] = useControllableState(\n props.sort,\n () => props.defaultSort ?? [],\n props.onSortChange,\n );\n\n const normalized = useMemo(() => {\n const filtered = value.filter((s) => activeColumns.some((column) => column.id === s.columnId));\n return filtered.length === value.length ? value : filtered;\n }, [value, activeColumns]);\n\n const sort = useNormalized(value, normalized, setSort);\n\n const criteria = useMemo(() => {\n if (props.externalSort) return [];\n\n return sort.flatMap((s): Criterion<T>[] => {\n const column = activeColumns.find((column) => column.id === s.columnId);\n if (!column) return [];\n\n return column.sortBy.map((sortBy) => ({\n key: (item: T) => sortBy(column.value(item), item),\n direction: s.direction === 'desc' ? -1 : 1,\n collator: getCollator(s.locale ?? props.locale, s.options),\n }));\n });\n }, [sort, activeColumns, props.externalSort, props.locale]);\n\n return { sort, setSort, setSortInternal, criteria };\n}\n\n/** Stable sort that evaluates each sort key once per item instead of once per comparison. */\nexport function sortBy<R>(records: R[], criteria: Criterion<any>[], getValue: (record: R) => any) {\n if (criteria.length === 0) return records;\n\n const keys = criteria.map((criterion) =>\n records.map((record) => criterion.key(getValue(record))),\n );\n const indices = records.map((_, index) => index);\n\n indices.sort((a, b) => {\n for (let i = 0; i < criteria.length; i++) {\n const { direction, collator } = criteria[i]!;\n const x = keys[i]![a];\n const y = keys[i]![b];\n\n if (typeof x === 'string' && typeof y === 'string') {\n const result = collator.compare(x, y);\n if (result !== 0) return result * direction;\n continue;\n }\n\n if ((x as any) > (y as any)) return direction;\n if ((x as any) < (y as any)) return -direction;\n }\n return a - b;\n });\n\n return indices.map((index) => records[index]!);\n}\n","import { useMemo } from 'react';\nimport type { Id, InternalTableProps, TableItem } from '../types';\nimport { sortBy } from './useSort';\nimport type { useSort } from './useSort';\n\ntype ItemRecord<T> = { id: Id; parentId: Id | undefined | null; value: T };\n\nconst isRoot = (parentId: Id | undefined | null) => parentId === undefined || parentId === null;\n\n/** All items, sorted, as a flattened tree. */\nexport function useItems<T>(\n props: InternalTableProps<T>,\n criteria: ReturnType<typeof useSort<T>>['criteria'],\n) {\n const { items: input, id, parentId } = props;\n\n const records = useMemo(\n () =>\n (input ?? []).map<ItemRecord<T>>((value) => ({\n id: id(value),\n parentId: parentId?.(value),\n value,\n })),\n [input, id, parentId],\n );\n\n const sorted = useMemo(\n () => sortBy(records, criteria, (record) => record.value),\n [records, criteria],\n );\n\n return useMemo(() => {\n const byId = new Map<Id, TableItem<T>>();\n for (const record of sorted) {\n byId.set(record.id, { ...record, children: [], depth: 0 });\n }\n\n const roots: TableItem<T>[] = [];\n for (const item of byId.values()) {\n if (isRoot(item.parentId)) {\n roots.push(item);\n } else {\n byId.get(item.parentId!)?.children.push(item);\n }\n }\n\n // Items whose parent is missing are dropped, like before: they are unreachable from a root.\n const items: TableItem<T>[] = [];\n const itemsById = new Map<Id, TableItem<T>>();\n const traverse = (level: TableItem<T>[], depth: number) => {\n for (const item of level) {\n item.depth = depth;\n items.push(item);\n itemsById.set(item.id, item);\n traverse(item.children, depth + 1);\n }\n };\n traverse(roots, 0);\n\n return { items, itemsById };\n }, [sorted]);\n}\n\n/** Items that pass the filters and whose ancestors are all expanded. */\nexport function useActiveItems<T>(\n items: TableItem<T>[],\n matching: Set<Id> | undefined,\n expanded: Set<Id>,\n) {\n return useMemo(() => {\n const activeItems: TableItem<T>[] = [];\n const activeItemsById = new Map<Id, TableItem<T>>();\n\n for (const item of items) {\n if (matching && !matching.has(item.id)) continue;\n if (\n !isRoot(item.parentId) &&\n !(activeItemsById.has(item.parentId!) && expanded.has(item.parentId!))\n ) {\n continue;\n }\n\n activeItems.push(item);\n activeItemsById.set(item.id, item);\n }\n\n return { activeItems, activeItemsById };\n }, [items, matching, expanded]);\n}\n","import { useMemo } from 'react';\nimport type { Id, InternalTableProps, TableItem } from '../types';\nimport { useControllableState, useNormalized } from './useControllableState';\n\nexport function useSelection<T>(\n props: InternalTableProps<T>,\n activeItems: TableItem<T>[],\n activeItemsById: Map<Id, TableItem<T>>,\n) {\n const [value, setSelection, setSelectionInternal] = useControllableState(\n props.selection,\n () => props.defaultSelection ?? new Set<Id>(),\n props.onSelectionChange,\n );\n\n const hasItems = props.items !== undefined;\n\n const normalized = useMemo(() => {\n let result = value;\n const copy = () => (result === value ? (result = new Set(value)) : result);\n\n if (props.selectSyncChildren) {\n for (const item of activeItems) {\n if (\n item.parentId !== undefined &&\n item.parentId !== null &&\n result.has(item.parentId) &&\n !result.has(item.id)\n ) {\n copy().add(item.id);\n }\n }\n }\n\n // Selection only covers what is shown: filtered out or collapsed items are deselected.\n if (hasItems) {\n for (const id of result) {\n if (!activeItemsById.has(id)) copy().delete(id);\n }\n }\n\n return result;\n }, [value, activeItems, activeItemsById, props.selectSyncChildren, hasItems]);\n\n const selection = useNormalized(value, normalized, setSelection);\n\n return { selection, setSelection, setSelectionInternal };\n}\n","export function defaultSerializer(x: unknown): string | number | Date {\n if (x instanceof Date || typeof x === 'number' || typeof x === 'string') {\n return x;\n }\n\n return JSON.stringify(x) ?? '';\n}\n","import { isValidElement } from 'react';\n\nconst isPlainObject = (x: object) => {\n const prototype = Object.getPrototypeOf(x);\n return prototype === Object.prototype || prototype === null;\n};\n\n/**\n * Structural equality for props. Functions and class instances compare by reference: keeping those\n * stable is up to the caller (or the React Compiler). React elements compare by type, key and props.\n */\nconst handlerTarget = Symbol('eventHandler');\n\ntype EventHandler<F> = F & { [handlerTarget]: F };\n\nconst isEventHandler = (x: unknown): x is EventHandler<(...args: any[]) => unknown> =>\n typeof x === 'function' && handlerTarget in x;\n\n/**\n * Wraps a callback that `deepEqual` compares like an event handler: any two are equal, so passing a\n * new function on every render doesn't make its object unequal. The previous one, which the\n * caller keeps, then calls the next one's function.\n */\nexport function eventHandler<F extends (...args: any[]) => unknown>(fn: F): F {\n const handler = ((...args: Parameters<F>) => handler[handlerTarget](...args)) as EventHandler<F>;\n handler[handlerTarget] = fn;\n return handler;\n}\n\n/** `a` is the next value, `b` the previous one, see `eventHandler`. */\nexport function deepEqual(a: unknown, b: unknown, depth = 0): boolean {\n if (Object.is(a, b)) return true;\n if (isEventHandler(a) && isEventHandler(b)) {\n b[handlerTarget] = a[handlerTarget];\n return true;\n }\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (depth > 20) return false;\n\n if (Array.isArray(a)) {\n return (\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((value, index) => deepEqual(value, b[index], depth + 1))\n );\n }\n\n if (a instanceof Set) {\n if (!(b instanceof Set) || a.size !== b.size) return false;\n for (const value of a) if (!b.has(value)) return false;\n return true;\n }\n\n if (a instanceof Map) {\n if (!(b instanceof Map) || a.size !== b.size) return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !deepEqual(value, b.get(key), depth + 1)) return false;\n }\n return true;\n }\n\n if (a instanceof Date) return b instanceof Date && a.getTime() === b.getTime();\n\n if (isValidElement(a)) {\n return (\n isValidElement(b) &&\n a.type === b.type &&\n a.key === b.key &&\n deepEqual(a.props, b.props, depth + 1)\n );\n }\n\n if (!isPlainObject(a) || !isPlainObject(b)) return false;\n\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) return false;\n return keys.every(\n (key) =>\n key in b &&\n deepEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n depth + 1,\n ),\n );\n}\n\n/** Same length and the same elements by reference. For large arrays like `items`. */\nexport function shallowArrayEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n","import { useMemo, useRef, useSyncExternalStore } from 'react';\nimport { defaultSerializer } from '../exporters/serializer';\nimport { deepEqual, shallowArrayEqual } from '../misc/equal';\nimport { asString, castArray } from '../misc/helpers';\nimport type {\n Column,\n DisplaySize,\n DisplaySizes,\n Id,\n InternalColumn,\n InternalTableProps,\n TableProps,\n} from '../types';\n\nconst defaultProps = {\n enableSelection: true,\n selectSyncChildren: true,\n stickyHeader: true,\n stickyFooter: true,\n enableColumnSelection: true,\n enableColumnResize: true,\n displaySizeOverrides: {\n mobile: {\n enableSelection: false,\n enableColumnSelection: false,\n enableExport: false,\n enableColumnResize: false,\n },\n },\n} satisfies Partial<TableProps<any>>;\n\nconst identity = (value: unknown) => value;\n\nconst defaultSortBy = (v: unknown) =>\n typeof v === 'number' || v instanceof Date ? v : asString(v);\n\nfunction normalizeId<T>(id: TableProps<T>['id']): (item: T) => Id {\n return id instanceof Function ? id : (item) => item[id] as Id;\n}\n\nfunction normalizeParentId<T>(\n parentId: TableProps<T>['parentId'],\n): ((item: T) => Id | undefined) | undefined {\n if (parentId === undefined) return undefined;\n return parentId instanceof Function ? parentId : (item) => item[parentId] as Id | undefined;\n}\n\nfunction normalizeColumns<T>(\n columns: TableProps<T>['columns'],\n defaultColumnProps: TableProps<T>['defaultColumnProps'],\n columnProps: TableProps<T>['columnProps'],\n disableSort: boolean | undefined,\n): InternalColumn<T, unknown>[] {\n const input =\n columns instanceof Function ? columns((value, column) => ({ ...column, value })) : columns;\n\n return input\n .filter((column): column is Column<T, unknown> => !!column)\n .map((column, index) => {\n const id = column.id ?? index;\n const defaults = { ...defaultColumnProps, ...columnProps?.(id) };\n const displaySize = column.displaySize ?? defaults.displaySize;\n\n return {\n id,\n header: column.header ?? defaults.header ?? null,\n exportHeader: column.exportHeader ?? defaults.exportHeader ?? id,\n footer: column.footer ?? defaults.footer ?? null,\n value: column.value,\n renderCell: column.renderCell ?? defaults.renderCell ?? asString,\n exportCell: column.exportCell ?? defaults.exportCell ?? defaultSerializer,\n sortBy: column.sortBy ?? defaults.sortBy ?? [defaultSortBy],\n disableSort: column.disableSort ?? defaults.disableSort ?? disableSort ?? false,\n deferred: column.deferred ?? defaults.deferred,\n hidden: column.hidden ?? defaults.hidden,\n classes: column.classes ?? defaults.classes,\n styles: column.styles ?? defaults.styles,\n filterBy: column.filterBy ?? defaults.filterBy ?? identity,\n filter: column.filter ?? defaults.filter,\n width: column.width ?? defaults.width,\n displaySize: displaySize !== undefined ? castArray(displaySize) : undefined,\n };\n });\n}\n\nfunction subscribeResize(onChange: () => void) {\n window.addEventListener('resize', onChange);\n return () => window.removeEventListener('resize', onChange);\n}\n\nfunction useDisplaySize(displaySize: DisplaySize | DisplaySizes | undefined) {\n const width = useSyncExternalStore(\n subscribeResize,\n () => window.innerWidth,\n () => undefined,\n );\n\n if (typeof displaySize !== 'object') return displaySize;\n if (width === undefined) return undefined;\n\n return Object.entries(displaySize).find(\n ([, maxWidth]) => maxWidth !== undefined && maxWidth >= width,\n )?.[0];\n}\n\nfunction definedOnly<T extends object>(object: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(object).filter(([, value]) => value !== undefined),\n ) as Partial<T>;\n}\n\n/**\n * Returns the previous props object while every prop is equal to the previous one: structurally,\n * with functions by reference, and `items` element by element. Parents creating equal objects,\n * Sets or arrays on each render then don't cause any recomputation.\n */\nfunction useStableProps<T>(raw: TableProps<T>): TableProps<T> {\n const previous = useRef<TableProps<T>>(undefined);\n const last = previous.current;\n\n if (last) {\n const keys = Object.keys(raw) as (keyof TableProps<T>)[];\n const isEqual =\n keys.length === Object.keys(last).length &&\n keys.every((key) =>\n key === 'items' ? shallowArrayEqual(raw[key], last[key]) : deepEqual(raw[key], last[key]),\n );\n if (isEqual) return last;\n }\n\n previous.current = raw;\n return raw;\n}\n\n/** Keeps the previous column objects (and array) for columns that are structurally unchanged. */\nfunction useStableColumns<T>(columns: InternalColumn<T, unknown>[]) {\n const previous = useRef<InternalColumn<T, unknown>[]>(undefined);\n const last = previous.current;\n if (!last || last === columns) {\n previous.current = columns;\n return columns;\n }\n\n const lastById = new Map(last.map((column) => [column.id, column]));\n const result = columns.map((column) => {\n const lastColumn = lastById.get(column.id);\n return lastColumn && deepEqual(column, lastColumn) ? lastColumn : column;\n });\n\n const isUnchanged =\n result.length === last.length && result.every((column, index) => column === last[index]);\n previous.current = isUnchanged ? last : result;\n return previous.current;\n}\n\n/**\n * Normalizes the props. Every derived value keeps its identity as long as its inputs do, so memos\n * downstream only recompute when the relevant props change.\n */\nexport function useTableProps<T>(input: TableProps<T>) {\n const raw = useStableProps(input);\n const displaySize = useDisplaySize(raw.displaySize);\n\n const id = useMemo(() => normalizeId(raw.id), [raw.id]);\n const parentId = useMemo(() => normalizeParentId(raw.parentId), [raw.parentId]);\n const columns = useStableColumns(\n useMemo(\n () => normalizeColumns(raw.columns, raw.defaultColumnProps, raw.columnProps, raw.disableSort),\n [raw.columns, raw.defaultColumnProps, raw.columnProps, raw.disableSort],\n ),\n );\n\n const displaySizeOverrides: TableProps<T>['displaySizeOverrides'] =\n raw.displaySizeOverrides ?? defaultProps.displaySizeOverrides;\n const override = displaySize !== undefined ? displaySizeOverrides[displaySize] : undefined;\n\n const overrideId = useMemo(\n () => (override?.id !== undefined ? normalizeId(override.id) : undefined),\n [override?.id],\n );\n const overrideParentId = useMemo(\n () => normalizeParentId(override?.parentId),\n [override?.parentId],\n );\n const overrideColumns = useMemo(\n () =>\n override?.columns !== undefined\n ? normalizeColumns(\n override.columns,\n override.defaultColumnProps ?? raw.defaultColumnProps,\n override.columnProps ?? raw.columnProps,\n override.disableSort ?? raw.disableSort,\n )\n : undefined,\n [\n override?.columns,\n override?.defaultColumnProps,\n override?.columnProps,\n override?.disableSort,\n raw.defaultColumnProps,\n raw.columnProps,\n raw.disableSort,\n ],\n );\n\n const props = useMemo(\n () =>\n ({\n ...defaultProps,\n ...definedOnly(raw),\n ...(override && definedOnly(override)),\n id: overrideId ?? id,\n parentId: overrideParentId ?? parentId,\n columns: overrideColumns ?? columns,\n }) as InternalTableProps<T>,\n [raw, override, id, parentId, columns, overrideId, overrideParentId, overrideColumns],\n );\n\n return { props, displaySize };\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTableTheme } from '../hooks/useTheme';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport type {\n Id,\n InternalColumn,\n TableActions,\n TableContextValue,\n TableProps,\n TableState,\n TableStructure,\n} from '../types';\nimport {\n isFilterValuePersisted,\n isPersisted,\n usePersistence,\n type PersistedData,\n} from './persistence';\nimport { useColumns } from './useColumns';\nimport { useExpanded } from './useExpanded';\nimport { useFilters } from './useFilters';\nimport { useActiveItems, useItems } from './useItems';\nimport { useSelection } from './useSelection';\nimport { useSort } from './useSort';\nimport { useTableProps } from './useTableProps';\n\nconst isControlledFilter = (columns: InternalColumn<any, unknown>[], columnId: Id) =>\n columns.find((column) => column.id === columnId)?.filter?.value !== undefined;\n\nfunction withEntry<K, V>(map: Map<K, V>, key: K, value: V | undefined) {\n const result = new Map(map);\n if (value === undefined) result.delete(key);\n else result.set(key, value);\n return result;\n}\n\n/** `isReset`: whether this state replaces one that got reset. */\nexport function useTable<T>(raw: TableProps<T>, onReset: () => void, isReset = false) {\n const { props, displaySize } = useTableProps(raw);\n const theme = useTableTheme(props);\n const columns = useColumns(props, displaySize);\n const sort = useSort(props, columns.activeColumns);\n const { items, itemsById } = useItems(props, sort.criteria);\n const filters = useFilters(props, columns.visibleColumns, items);\n const expanded = useExpanded(props, itemsById, filters.matching);\n const { activeItems, activeItemsById } = useActiveItems(\n items,\n filters.matching,\n expanded.expanded,\n );\n const selection = useSelection(props, activeItems, activeItemsById);\n\n const state: TableState<T> = {\n props,\n displaySize,\n sort: sort.sort,\n selection: selection.selection,\n expanded: expanded.expanded,\n hiddenColumns: columns.hiddenColumns,\n columnWidths: columns.columnWidths,\n filterValues: filters.filterValues,\n columns: columns.columns,\n activeColumns: columns.activeColumns,\n visibleColumns: columns.visibleColumns,\n items,\n itemsById,\n activeItems,\n activeItemsById,\n };\n\n const { persist } = props;\n const persistData = useMemo(() => {\n const data: PersistedData = {};\n if (!persist) return data;\n\n const add = (key: keyof PersistedData, value: unknown, isControlled = false) => {\n if (!isControlled && isPersisted(persist, key)) data[key] = value;\n };\n\n add('sort', sort.sort, props.sort !== undefined);\n add('selection', selection.selection, props.selection !== undefined);\n add('expanded', expanded.expanded, props.expanded !== undefined);\n add('hiddenColumns', columns.hiddenColumns, props.hiddenColumns !== undefined);\n add('columnWidths', columns.columnWidths);\n add(\n 'filterValues',\n new Map(\n [...filters.stored].filter(\n ([columnId]) =>\n isFilterValuePersisted(persist, columnId) &&\n !isControlledFilter(props.columns, columnId),\n ),\n ),\n props.filterValues !== undefined,\n );\n\n return data;\n }, [\n persist?.storage,\n persist?.id,\n JSON.stringify(persist?.include),\n JSON.stringify(persist?.exclude),\n sort.sort,\n selection.selection,\n expanded.expanded,\n columns.hiddenColumns,\n columns.columnWidths,\n filters.stored,\n props.columns,\n props.sort !== undefined,\n props.selection !== undefined,\n props.expanded !== undefined,\n props.hiddenColumns !== undefined,\n props.filterValues !== undefined,\n ]);\n\n const latest = useRef({ state, sort, selection, expanded, columns, filters, onReset });\n useLayoutEffect(() => {\n latest.current = { state, sort, selection, expanded, columns, filters, onReset };\n });\n\n function restore(data: PersistedData) {\n const { state, sort, selection, expanded, columns } = latest.current;\n const { props } = state;\n\n if (data.sort && props.sort === undefined) sort.setSort(data.sort);\n if (data.selection && props.selection === undefined) selection.setSelection(data.selection);\n if (data.expanded && props.expanded === undefined) expanded.setExpanded(data.expanded);\n if (data.hiddenColumns && props.hiddenColumns === undefined) {\n columns.setHiddenColumns(data.hiddenColumns);\n }\n if (data.columnWidths) columns.setColumnWidths(data.columnWidths);\n\n const filterValues = data.filterValues as Map<Id, unknown> | undefined;\n if (filterValues && props.filterValues === undefined) {\n const next = new Map(state.filterValues);\n for (const [columnId, value] of filterValues) {\n if (\n props.persist &&\n isFilterValuePersisted(props.persist, columnId) &&\n !isControlledFilter(props.columns, columnId)\n ) {\n next.set(columnId, value);\n }\n }\n commitFilterValues(next);\n }\n }\n\n useEffect(() => {\n if (!isReset) return;\n if (props.filterValues === undefined) props.onFilterValuesChange?.(filters.filterValues);\n\n for (const { id, filter } of props.columns) {\n filter?.onChange?.(filters.stored.has(id) ? filters.stored.get(id) : filter.defaultValue);\n }\n }, []);\n\n const [isHydrated, clearStorage] = usePersistence(persist, persistData, restore, props.debug);\n const clearStorageRef = useRef(clearStorage);\n clearStorageRef.current = clearStorage;\n\n const lastSelectedId = useRef<Id | undefined>(undefined);\n\n // `latest` only catches up after the next render.\n function patchState(patch: Partial<TableState<T>>) {\n latest.current = { ...latest.current, state: { ...latest.current.state, ...patch } };\n }\n\n /** Sets filter values and notifies the `onChange` of each filter whose value changed. */\n function commitFilterValues(next: Map<Id, unknown>) {\n const { state, filters } = latest.current;\n const previous = state.filterValues;\n filters.setFilterValues(next);\n patchState({ filterValues: next });\n\n for (const { id, filter } of state.props.columns) {\n const value = next.get(id);\n if (filter?.onChange && !Object.is(value, previous.get(id))) filter.onChange(value);\n }\n }\n\n const [actions] = useState((): TableActions<T> => {\n const get = () => latest.current;\n\n return {\n getState: () => get().state,\n\n setSort: (sort) => get().sort.setSort(sort),\n\n setSelection: (selection) => get().selection.setSelection(selection),\n\n toggleSelection(itemId, { range: isRange } = {}) {\n const { state, selection } = get();\n const { activeItems, activeItemsById, props } = state;\n const current = state.selection;\n\n const isSelected =\n itemId !== undefined\n ? current.has(itemId)\n : activeItems.length > 0 && activeItems.every((item) => current.has(item.id));\n\n let range;\n if (isRange && itemId !== undefined) {\n const b = activeItems.findIndex((item) => item.id === itemId);\n const last = lastSelectedId.current;\n const a = last !== undefined ? activeItems.findIndex((item) => item.id === last) : 0;\n range = activeItems.slice(Math.min(a < 0 ? b : a, b), Math.max(a, b) + 1);\n } else {\n const item = itemId !== undefined ? activeItemsById.get(itemId) : undefined;\n range = item ? [item] : activeItems;\n }\n\n const next = new Set(current);\n for (const item of range) {\n if (isSelected) next.delete(item.id);\n else next.add(item.id);\n }\n\n if (props.selectSyncChildren && isSelected) {\n for (const id of getAncestors(activeItemsById, ...range)) next.delete(id);\n for (const id of getDescendants(...range)) next.delete(id);\n }\n\n lastSelectedId.current = itemId;\n selection.setSelection(next);\n // A second action before the next render must build on this one.\n patchState({ selection: next });\n },\n\n setExpanded: (value) => get().expanded.setExpanded(value),\n\n toggleExpanded(itemId) {\n const { state, expanded } = get();\n const { activeItemsById } = state;\n const item = activeItemsById.get(itemId);\n const isExpanded = state.expanded.has(itemId);\n const next = new Set(state.expanded);\n\n if (expanded.expandOnlyOne) {\n next.clear();\n for (const id of item ? getAncestors(activeItemsById, item) : []) next.add(id);\n }\n\n if (isExpanded) {\n next.delete(itemId);\n for (const id of item ? getDescendants(item) : []) next.delete(id);\n } else {\n next.add(itemId);\n }\n\n expanded.setExpanded(next);\n patchState({ expanded: next });\n },\n\n setHiddenColumns: (hiddenColumns) => get().columns.setHiddenColumns(hiddenColumns),\n\n setColumnWidth(columnId, width) {\n get().columns.setColumnWidths((widths) => withEntry(widths, columnId, width));\n },\n\n setFilterValues: (filterValues) => commitFilterValues(filterValues),\n\n setFilterValue(columnId, value) {\n const next = new Map(get().state.filterValues);\n next.set(columnId, value);\n commitFilterValues(next);\n },\n\n clearFilters() {\n const { state } = get();\n const next = new Map(state.filterValues);\n for (const column of state.props.columns) {\n if (column.filter) next.set(column.id, undefined);\n }\n commitFilterValues(next);\n state.props.onReset?.('filters');\n },\n\n async resetTable() {\n await clearStorageRef.current();\n get().onReset();\n },\n };\n });\n const { sort: sortValue, hiddenColumns, columnWidths, filterValues } = state;\n const { columns: allColumns, activeColumns, visibleColumns } = state;\n const structure = useMemo(\n (): TableStructure<T> => ({\n props,\n displaySize,\n sort: sortValue,\n hiddenColumns,\n columnWidths,\n filterValues,\n columns: allColumns,\n activeColumns,\n visibleColumns,\n items,\n itemsById,\n actions,\n }),\n [\n props,\n displaySize,\n sortValue,\n hiddenColumns,\n columnWidths,\n filterValues,\n allColumns,\n activeColumns,\n visibleColumns,\n items,\n itemsById,\n actions,\n ],\n );\n\n const context = useMemo(\n (): TableContextValue<T> => ({\n ...structure,\n selection: state.selection,\n expanded: state.expanded,\n activeItems,\n activeItemsById,\n }),\n [structure, state.selection, state.expanded, activeItems, activeItemsById],\n );\n\n return {\n context,\n structure,\n actions,\n theme,\n isHydrated,\n setSortInternal: sort.setSortInternal,\n setSelectionInternal: selection.setSelectionInternal,\n setExpandedInternal: expanded.setExpandedInternal,\n setHiddenColumnsInternal: columns.setHiddenColumnsInternal,\n setFilterValuesInternal: filters.setFilterValuesInternal,\n };\n}\n","import { useImperativeHandle, type Ref } from 'react';\nimport type { TableRef } from '../types';\nimport type { useTable } from './useTable';\n\n/** The setters bypass the on*Change callbacks, as they always have. */\nexport function useTableImperativeHandle(\n ref: Ref<TableRef> | undefined,\n table: ReturnType<typeof useTable<any>>,\n) {\n const { actions } = table;\n\n useImperativeHandle(\n ref,\n () => ({\n getSort: () => actions.getState().sort,\n setSort: table.setSortInternal,\n getSelection: () => actions.getState().selection,\n setSelection: table.setSelectionInternal,\n getExpanded: () => actions.getState().expanded,\n setExpanded: table.setExpandedInternal,\n getHiddenColumns: () => actions.getState().hiddenColumns,\n setHiddenColumns: table.setHiddenColumnsInternal,\n getFilterValues: () => actions.getState().filterValues,\n setFilterValues: table.setFilterValuesInternal,\n }),\n [actions],\n );\n}\n","import { useCallback, useRef, useState } from 'react';\nimport type { TableProps } from '../types';\n\n/** Resetting remounts the table state under a new key and reports the defaults. */\nexport function useTableReset<T>(props: TableProps<T>) {\n const [resetKey, setResetKey] = useState(0);\n const latestProps = useRef(props);\n latestProps.current = props;\n\n const onReset = useCallback(() => {\n const props = latestProps.current;\n setResetKey((key) => key + 1);\n\n if (props.sort === undefined) props.onSortChange?.(props.defaultSort ?? []);\n if (props.expanded === undefined) props.onExpandedChange?.(props.defaultExpanded ?? new Set());\n if (props.selection === undefined) {\n props.onSelectionChange?.(props.defaultSelection ?? new Set());\n }\n if (props.hiddenColumns === undefined) {\n props.onHiddenColumnsChange?.(props.defaultHiddenColumns ?? new Set());\n }\n props.onReset?.('table');\n }, []);\n\n return [resetKey, onReset] as const;\n}\n","import type React from 'react';\nimport { useEffect, useRef, type HTMLProps } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\n\nexport const columnWidthVariable = (index: number) => `--column-width-${index}`;\n\nexport function ResizeHandle() {\n const { props, visibleColumns, actions } = useTableStructure();\n const columnId = useColumnContext();\n const enabled = props.enableColumnResize;\n const index = visibleColumns.findIndex((column) => column.id === columnId);\n const table = useRef<HTMLElement | null>(null);\n const hasMoved = useRef(false);\n\n // The drag width lives in a CSS variable, keyed by visible index, so dragging renders nothing.\n const variable = columnWidthVariable(index);\n useEffect(\n () => () => {\n table.current?.style.removeProperty(variable);\n },\n [variable],\n );\n\n function onPointerDown(event: React.PointerEvent<HTMLDivElement>) {\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n table.current = event.currentTarget.closest('[data-schummar-table]');\n hasMoved.current = false;\n }\n\n function widthAt(event: React.PointerEvent<HTMLDivElement>) {\n const header = event.currentTarget.parentElement!;\n const minWidth = visibleColumns.find((column) => column.id === columnId)?.filter ? 80 : 50;\n return Math.max(event.clientX - header.getBoundingClientRect().left + 5, minWidth);\n }\n\n function onPointerMove(event: React.PointerEvent<HTMLDivElement>) {\n event.stopPropagation();\n if (!event.currentTarget.hasPointerCapture(event.pointerId)) return;\n hasMoved.current = true;\n table.current?.style.setProperty(variable, `${widthAt(event)}px`);\n }\n\n function onPointerUp(event: React.PointerEvent<HTMLDivElement>) {\n event.stopPropagation();\n if (!event.currentTarget.hasPointerCapture(event.pointerId)) return;\n event.currentTarget.releasePointerCapture(event.pointerId);\n // The committed width renders before the next paint, so dropping the variable doesn't flash.\n table.current?.style.removeProperty(variable);\n if (hasMoved.current) actions.setColumnWidth(columnId, `${widthAt(event)}px`);\n }\n\n function onDoubleClick(event: React.MouseEvent) {\n actions.setColumnWidth(columnId, event.getModifierState('Control') ? undefined : 'max-content');\n }\n\n if (!enabled) {\n return null;\n }\n\n return (\n <ResizeHandleView\n enabled={enabled}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onDoubleClick={onDoubleClick}\n />\n );\n}\n\nexport function ResizeHandleView({\n enabled,\n ...props\n}: HTMLProps<HTMLDivElement> & { enabled?: boolean | 'visualOnly' }) {\n const className = useTheme((theme) => theme.classes?.columnDivider);\n const styles = useTheme((theme) => theme.styles?.columnDivider);\n\n return (\n <div\n className={className}\n css={[\n {\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled === true ? 'col-resize' : 'initial',\n display: 'flex',\n alignItems: 'center',\n\n '&:after': {\n content: '\"\"',\n width: 1,\n height: '1.5em',\n background: '#c9cfda',\n transition: 'transform 300ms',\n },\n\n '@media (pointer: coarse)': {\n pointerEvents: 'none',\n },\n },\n styles,\n ]}\n {...props}\n />\n );\n}\n","import { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\n\nconst FRAME_BUDGET_MS = 8;\n\ninterface Task {\n rowIndex: number;\n reveal: () => void;\n}\n\n/**\n * Spreads the rendering of deferred cells over time, a row at a time. Rows render synchronously until\n * the current frame's budget is used up; the deferred cells of the rest show a placeholder and get\n * revealed here, visible rows first, in slices of the same budget. Slices run as separate tasks, so the browser paints and handles input\n * in between, like React's own scheduler.\n */\nexport class CellScheduler {\n private frameStart: number | undefined;\n private queue = new Set<Task>();\n private visible = { start: 0, end: Infinity };\n private isScheduled = false;\n private channel: MessageChannel | undefined;\n // Pessimistic until measured, so the first batch is a single row.\n private costPerRow = FRAME_BUDGET_MS;\n\n /** Called while rendering a row for the first time: whether it may render right away. */\n claim(): boolean {\n const now = performance.now();\n if (this.frameStart === undefined) {\n this.frameStart = now;\n requestAnimationFrame(() => {\n this.frameStart = undefined;\n });\n }\n return now - this.frameStart < FRAME_BUDGET_MS;\n }\n\n /** Returns a function that removes the task again, e.g. when its cell unmounts. */\n enqueue(task: Task) {\n this.queue.add(task);\n this.schedule();\n return () => {\n this.queue.delete(task);\n };\n }\n\n setVisibleRange(start: number, end: number) {\n this.visible = { start, end };\n }\n\n dispose() {\n this.queue.clear();\n }\n\n private schedule() {\n if (this.isScheduled) return;\n this.isScheduled = true;\n if (!this.channel) {\n this.channel = new MessageChannel();\n this.channel.port1.onmessage = this.run;\n }\n this.channel.port2.postMessage(null);\n }\n\n private isVisible(task: Task) {\n return task.rowIndex >= this.visible.start && task.rowIndex <= this.visible.end;\n }\n\n private next(count: number) {\n return [...this.queue]\n .sort(\n (a, b) => Number(this.isVisible(b)) - Number(this.isVisible(a)) || a.rowIndex - b.rowIndex,\n )\n .slice(0, count);\n }\n\n private run = () => {\n this.isScheduled = false;\n const start = performance.now();\n\n while (this.queue.size > 0) {\n const remaining = FRAME_BUDGET_MS - (performance.now() - start);\n if (remaining <= 0) break;\n\n const batch = this.next(Math.max(1, Math.floor(remaining / this.costPerRow)));\n const batchStart = performance.now();\n flushSync(() => {\n for (const task of batch) {\n this.queue.delete(task);\n task.reveal();\n }\n });\n const cost = (performance.now() - batchStart) / batch.length;\n this.costPerRow = this.costPerRow * 0.7 + cost * 0.3;\n }\n\n if (this.queue.size > 0) this.schedule();\n };\n}\n\nexport const CellSchedulerContext = createContext<CellScheduler | null>(null);\n\nexport function useCellScheduler() {\n const [scheduler] = useState(() => new CellScheduler());\n useEffect(() => () => scheduler.dispose(), [scheduler]);\n return scheduler;\n}\n\n/** Whether a row with deferred cells renders them. Once revealed, it stays revealed. */\nexport function useReveal(deferred: boolean, rowIndex: number) {\n const scheduler = useContext(CellSchedulerContext);\n const [revealed, setRevealed] = useState(() => !deferred || !scheduler || scheduler.claim());\n const task = useRef<Task>({ rowIndex, reveal: () => setRevealed(true) });\n task.current.rowIndex = rowIndex;\n\n useEffect(() => {\n if (revealed || !scheduler) return;\n return scheduler.enqueue(task.current);\n }, [revealed, scheduler]);\n\n return revealed;\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { memo, useLayoutEffect } from 'react';\nimport type { InternalColumn } from '../types';\nimport type { RowConfig } from './row';\n\nfunction wrapText(content: ReactNode, className: string) {\n if (typeof content === 'string') {\n return (\n <span className={className} title={content}>\n {content}\n </span>\n );\n }\n return content;\n}\n\nexport const Cell = memo(function Cell<T>({\n column,\n placeholder,\n value,\n rowIndex,\n config,\n}: {\n column: InternalColumn<T, unknown>;\n /** A deferred cell whose row hasn't been revealed yet. */\n placeholder: boolean;\n value: T;\n rowIndex: number;\n config: RowConfig<T>;\n}) {\n const { styles, wrapCell } = config;\n const className = styles.cells.get(column.id)!(value, rowIndex);\n\n useLayoutEffect(() => {\n config.debugRender(placeholder ? 'defer cell' : 'render cell', column.id);\n });\n\n if (placeholder) {\n return (\n <div\n className={className}\n data-deferred=\"\"\n style={{ boxSizing: 'border-box', minHeight: config.placeholderHeight }}\n />\n );\n }\n\n const columnValue = column.value(value);\n const content = column.renderCell(columnValue, value);\n\n return (\n <div className={className}>\n {wrapCell ? wrapCell(content, columnValue, value, rowIndex) : wrapText(content, styles.text)}\n </div>\n );\n}) as <T>(props: {\n column: InternalColumn<T, unknown>;\n placeholder: boolean;\n value: T;\n rowIndex: number;\n config: RowConfig<T>;\n}) => ReactElement;\n","import type { RowConfig } from './row';\n\nexport function Details<T>({\n value,\n rowIndex,\n config,\n}: {\n value: T;\n rowIndex: number;\n config: RowConfig<T>;\n}) {\n const { rowDetails, styles } = config;\n const details = rowDetails instanceof Function ? rowDetails(value, rowIndex) : rowDetails;\n if (!details) return null;\n\n return <div className={styles.details(value, rowIndex)}>{details}</div>;\n}\n","import { css } from '@emotion/react';\nimport type { MouseEvent, ReactElement } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableActions } from '../state/context';\nimport { useLibraryClassName } from '../theme/emotion';\nimport type { Id } from '../types';\n\nconst spinnerCss = css({ margin: '0 var(--spacing)' });\n\nconst chevronCss = css({\n display: 'inline-flex',\n transition: 'all 300ms',\n transform: 'rotate3d(0, 0, 1, 0deg)',\n});\n\nconst expandedChevronCss = css({ transform: 'rotate3d(0, 0, 1, 90deg)' });\n\nexport function ExpandControl({\n itemId,\n expanded,\n hasChildren,\n hasDeferredChildren,\n}: {\n itemId: Id;\n expanded: boolean;\n hasChildren: boolean;\n hasDeferredChildren?: boolean;\n}): ReactElement {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Spinner = useTheme((t) => t.components.Spinner);\n const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n const actions = useTableActions();\n const libraryClass = useLibraryClassName();\n\n function toggle(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n actions.toggleExpanded(itemId);\n }\n\n if (expanded && hasDeferredChildren && !hasChildren) {\n return <Spinner className={libraryClass(spinnerCss)} />;\n }\n\n return (\n <IconButton onClick={toggle}>\n <span className={libraryClass(chevronCss, expanded && expandedChevronCss)}>\n <ChevronRight />\n </span>\n </IconButton>\n );\n}\n","import { css } from '@emotion/react';\nimport type React from 'react';\nimport { useLibraryClassName } from '../theme/emotion';\n\nconst wrapperCss = css({ display: 'contents' });\n\n/** Rows may be wrapped in links. Theme checkboxes only guarantee that clicks on the input itself\n * toggle; a click on their padding would reach the link instead. */\nexport function CatchClicks({\n onToggle,\n children,\n}: {\n onToggle: (event: React.MouseEvent) => void;\n children: React.ReactNode;\n}) {\n const libraryClass = useLibraryClassName();\n\n return (\n <span\n className={libraryClass(wrapperCss)}\n onClick={(event) => {\n event.stopPropagation();\n if (!(event.target instanceof HTMLInputElement)) {\n event.preventDefault();\n onToggle(event);\n }\n }}\n >\n {children}\n </span>\n );\n}\n","import { css } from '@emotion/react';\nimport { memo, useContext } from 'react';\nimport type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { SelectionContext, useTableActions, useTableContext } from '../state/context';\nimport { useUserClassName } from '../theme/emotion';\nimport type { Id } from '../types';\nimport { CatchClicks } from './catchClicks';\n\n// In the app cache, like a user override, so it beats the theme Checkbox's own colour.\nconst checkboxCss = css({ justifySelf: 'start', color: '#c9cfda' });\n\nexport const SelectComponent = memo(function SelectComponent({ itemId }: { itemId: Id }) {\n const selected = useContext(SelectionContext).has(itemId);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const overrideClass = useUserClassName();\n const actions = useTableActions();\n\n return (\n <CatchClicks onToggle={(event) => actions.toggleSelection(itemId, { range: event.shiftKey })}>\n <Checkbox\n className={overrideClass(checkboxCss)}\n checked={selected}\n onChange={(event: React.ChangeEvent) =>\n actions.toggleSelection(itemId, { range: (event.nativeEvent as MouseEvent).shiftKey })\n }\n />\n </CatchClicks>\n );\n});\n\nexport function SelectAll() {\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const overrideClass = useUserClassName();\n const { activeItems, selection, actions } = useTableContext();\n const selected = activeItems.length > 0 && activeItems.every((item) => selection.has(item.id));\n\n return (\n <CatchClicks onToggle={() => actions.toggleSelection(undefined)}>\n <Checkbox\n className={overrideClass(checkboxCss)}\n checked={selected}\n onChange={() => actions.toggleSelection(undefined)}\n />\n </CatchClicks>\n );\n}\n","import { memo, useLayoutEffect, type ReactElement, type ReactNode, type RefCallback } from 'react';\nimport { ColumnContext } from '../state/context';\nimport type { Id, InternalColumn, TableProps, WrapRowProps } from '../types';\nimport { Cell } from './cell';\nimport { useReveal } from './cellScheduler';\nimport { Details } from './details';\nimport { ExpandControl } from './expandControl';\nimport type { RowStyles } from './rowStyles';\nimport { SelectComponent } from './selectComponent';\n\n/** Everything rows need from the table props. Changing it renders every row. */\nexport interface RowConfig<T> {\n styles: RowStyles<T>;\n /** Columns whose cells render progressively. */\n deferredColumns: Set<Id>;\n placeholderHeight: number;\n columns: InternalColumn<T, unknown>[];\n enableSelection: boolean | undefined;\n rowAction: TableProps<T>['rowAction'];\n rowDetails: TableProps<T>['rowDetails'];\n wrapRow: TableProps<T>['wrapRow'];\n wrapCell: TableProps<T>['wrapCell'];\n hasDeferredChildren: TableProps<T>['hasDeferredChildren'];\n debugRender: (...output: any) => void;\n}\n\ninterface RowProps<T> {\n id: Id;\n value: T;\n rowIndex: number;\n depth: number;\n hasChildren: boolean;\n expanded: boolean;\n config: RowConfig<T>;\n measureRef?: RefCallback<HTMLElement>;\n}\n\nconst defaultWrapRow = (props: WrapRowProps) => <div {...props} />;\n\nexport const Row = memo(function Row<T>({\n id,\n value,\n rowIndex,\n depth,\n hasChildren,\n expanded,\n config,\n measureRef,\n}: RowProps<T>): ReactElement {\n const { styles, columns, enableSelection, rowAction, rowDetails, hasDeferredChildren } = config;\n const wrapRow = config.wrapRow ?? defaultWrapRow;\n\n useLayoutEffect(() => {\n config.debugRender('render row', id);\n });\n\n const fillClassName = styles.fillCell(value, rowIndex);\n const revealed = useReveal(config.deferredColumns.size > 0, rowIndex);\n const deferred = hasDeferredChildren?.(value) ?? false;\n const action = rowAction instanceof Function ? rowAction(value, rowIndex) : rowAction;\n const hasDetails = rowDetails instanceof Function ? !!rowDetails(value, rowIndex) : !!rowDetails;\n\n const children: ReactNode = (\n <>\n <div className={fillClassName} />\n\n <div className={styles.firstCell(value, rowIndex)}>\n {depth > 0 && <div style={{ width: depth * 20 }} />}\n\n {enableSelection && <SelectComponent itemId={id} />}\n\n {(hasChildren || deferred || hasDetails) && (\n <ExpandControl\n itemId={id}\n expanded={expanded}\n hasChildren={hasChildren}\n hasDeferredChildren={deferred}\n />\n )}\n\n {action}\n </div>\n\n {columns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <Cell\n column={column}\n placeholder={!revealed && config.deferredColumns.has(column.id)}\n value={value}\n rowIndex={rowIndex}\n config={config}\n />\n </ColumnContext.Provider>\n ))}\n\n <div className={fillClassName} />\n\n {expanded && hasDetails && <Details value={value} rowIndex={rowIndex} config={config} />}\n </>\n );\n\n return wrapRow(\n {\n ref: measureRef ?? null,\n 'data-index': rowIndex,\n className: styles.row(value, rowIndex),\n children,\n },\n value,\n rowIndex,\n ) as ReactElement;\n}) as <T>(props: RowProps<T>) => ReactElement;\n","import { css, type Interpolation } from '@emotion/react';\nimport { useMemo } from 'react';\nimport { columnTheme } from '../hooks/useTheme';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useLibraryClassName, useUserClassName } from '../theme/emotion';\nimport type { Id, InternalColumn, TableTheme } from '../types';\n\ntype ClassOf<T> = (value: T, index: number) => string;\n\n/** Class names for everything a row renders, resolved once per theme and column change. */\nexport interface RowStyles<T> {\n row: ClassOf<T>;\n fillCell: ClassOf<T>;\n firstCell: ClassOf<T>;\n cells: Map<Id, ClassOf<T>>;\n details: ClassOf<T>;\n text: string;\n}\n\nconst rowCss = css({ gridColumn: '1 / -1', display: 'grid', gridTemplateColumns: 'subgrid' });\n\nexport function useRowStyles<T>(\n theme: TableTheme<T>,\n columns: InternalColumn<T, unknown>[],\n): RowStyles<T> {\n const libraryClass = useLibraryClassName();\n const userClass = useUserClassName();\n\n return useMemo(() => {\n // Static parts are resolved here; only function classes and styles run per row or cell.\n const cellClassOf = ({ classes, styles }: TableTheme<T>, baseClass: string): ClassOf<T> => {\n const { cell: cellClass, evenCell, oddCell } = classes ?? {};\n const { cell: cellStyle, evenCell: evenStyle, oddCell: oddStyle } = styles ?? {};\n\n if (!(cellClass instanceof Function) && !(cellStyle instanceof Function)) {\n const even = cx(baseClass, cellClass, evenCell, userClass(cellStyle, evenStyle));\n const odd = cx(baseClass, cellClass, oddCell, userClass(cellStyle, oddStyle));\n return (_value, index) => (index % 2 === 0 ? even : odd);\n }\n\n return (value, index) => {\n const isEven = index % 2 === 0;\n return cx(\n baseClass,\n cellClass instanceof Function ? cellClass(value, index) : cellClass,\n isEven ? evenCell : oddCell,\n userClass(\n cellStyle instanceof Function ? cellStyle(value, index) : cellStyle,\n isEven ? evenStyle : oddStyle,\n ),\n );\n };\n };\n\n const elementClassOf = (\n baseClass: string,\n className: string | ((value: T, index: number) => string | undefined) | undefined,\n style: Interpolation<any> | ((value: T, index: number) => Interpolation<any>),\n ): ClassOf<T> => {\n if (!(className instanceof Function) && !(style instanceof Function)) {\n const result = cx(baseClass, className, userClass(style));\n return () => result;\n }\n return (value, index) =>\n cx(\n baseClass,\n className instanceof Function ? className(value, index) : className,\n userClass(style instanceof Function ? style(value, index) : style),\n );\n };\n\n const cellBase = libraryClass(defaultClasses.cell);\n\n return {\n row: elementClassOf(libraryClass(rowCss), theme.classes?.row, theme.styles?.row),\n fillCell: cellClassOf(theme, libraryClass(defaultClasses.cellFill)),\n firstCell: cellClassOf(theme, libraryClass(defaultClasses.cell, defaultClasses.firstCell)),\n cells: new Map(\n columns.map((column) => [column.id, cellClassOf(columnTheme(theme, column), cellBase)]),\n ),\n details: elementClassOf(\n libraryClass(defaultClasses.details),\n theme.classes?.details,\n theme.styles?.details,\n ),\n text: libraryClass(defaultClasses.text),\n };\n }, [libraryClass, userClass, theme, columns]);\n}\n","import { useTheme } from '../hooks/useTheme';\nimport { useTableActions } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport default function ClearFiltersButton<T>() {\n const Button = useTheme((t) => t.components.Button);\n const textClearFilters = useTheme((t) => t.text.clearFilters);\n const actions = useTableActions<T>();\n\n return (\n <div css={defaultClasses.clearFiltersButton}>\n <Button variant=\"outlined\" onClick={() => actions.clearFilters()}>\n {textClearFilters}\n </Button>\n </div>\n );\n}\n","import { columnTheme, useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport function ColumnFooter() {\n const columnId = useColumnContext();\n const { activeColumns } = useTableStructure();\n const column = activeColumns.find((column) => column.id === columnId);\n const { classes, styles } = useTheme((theme) => columnTheme(theme, column));\n\n return (\n <div className={classes?.footerCell} css={[defaultClasses.footerCell, styles?.footerCell]}>\n {column?.footer}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { ColumnContext, useTableStructure } from '../state/context';\nimport { filteredColumns, isActiveFilter } from '../state/useFilters';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport ClearFiltersButton from './clearFiltersButton';\nimport { ColumnFooter } from './columnFooter';\n\n// Memoized so that rendering the rows (e.g. on selection) leaves it alone.\nexport const TableFooter = memo(function TableFooter() {\n const { props, visibleColumns, activeColumns, filterValues } = useTableStructure();\n const classes = useTheme((t) => t.classes?.footerCell);\n const styles = useTheme((t) => t.styles?.footerCell);\n const { stickyFooter, enableClearFiltersButton } = props;\n\n const hasActiveFilters = filteredColumns(props, visibleColumns).some((column) =>\n isActiveFilter(column.filter, filterValues.get(column.id)),\n );\n const hasFooter = activeColumns.some((column) => column.footer);\n\n return (\n <>\n {enableClearFiltersButton && hasActiveFilters && <ClearFiltersButton />}\n\n {hasFooter && (\n <div\n css={[\n { gridColumn: '1 / -1', display: 'grid', gridTemplateColumns: 'subgrid' },\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n ]}\n >\n <div className={classes} css={[defaultClasses.footerFill, styles]} />\n <div className={classes} css={[defaultClasses.footerFill, styles]} />\n\n {visibleColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnFooter />\n </ColumnContext.Provider>\n ))}\n\n <div className={classes} css={[defaultClasses.footerFill, styles]} />\n </div>\n )}\n </>\n );\n});\n","import { useEffect, useMemo, useState, type ReactElement } from 'react';\nimport { debounce } from '../misc/debounce';\nimport { toSingles, uniq } from '../misc/helpers';\nimport { useTableStructure } from '../state/context';\nimport type { InternalColumn } from '../types';\n\n/** Renders a column's filter UI. Changes apply after the filter's `debounce`, or on unmount. */\nexport function FilterPanel<T>({\n column,\n close,\n}: {\n column: InternalColumn<T, unknown>;\n close: () => void;\n}): ReactElement | null {\n const { filterValues, items, actions } = useTableStructure<T>();\n const [draft, setDraft] = useState<{ value: unknown }>();\n const { filter } = column;\n const delay = filter?.debounce ?? 0;\n\n const commit = useMemo(\n () =>\n debounce((value: unknown) => {\n actions.setFilterValue(column.id, value);\n setDraft(undefined);\n }, delay),\n [actions, column.id, delay],\n );\n\n useEffect(() => () => commit.flush(), [commit]);\n\n const getValues = useMemo(() => {\n let values: unknown[] | undefined;\n return () =>\n (values ??= uniq(\n items.flatMap((item) =>\n toSingles(column.filterBy(column.value(item.value), item.value) as unknown[]),\n ),\n ));\n }, [items, column]);\n\n if (!filter) return null;\n\n function onChange(value: unknown) {\n if (delay > 0) {\n setDraft({ value });\n commit(value);\n } else {\n actions.setFilterValue(column.id, value);\n }\n }\n\n const { Component } = filter;\n\n return (\n <Component\n value={draft ? draft.value : filterValues.get(column.id)}\n onChange={onChange}\n close={close}\n options={filter.options}\n getValues={getValues}\n />\n );\n}\n","import { ClassNames } from '@emotion/react';\nimport { useState, type ReactElement } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\nimport { isActiveFilter } from '../state/useFilters';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { InternalColumn } from '../types';\nimport { FilterPanel } from './filterPanel';\n\nexport function FilterControl<T>(): ReactElement | null {\n const { filterValues, visibleColumns, actions } = useTableStructure<T>();\n const columnId = useColumnContext();\n const column = visibleColumns.find((column) => column.id === columnId);\n\n const IconButton = useTheme((t) => t.components.IconButton);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const ArrowDropDown = useTheme((t) => t.icons.ArrowDropDown);\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n if (!column?.filter) return null;\n\n const isActive = isActiveFilter(column.filter, filterValues.get(columnId));\n\n return (\n <>\n <IconButton\n onClick={(event) => setAnchor(event.currentTarget)}\n onContextMenu={(event) => {\n actions.setFilterValue(columnId, undefined);\n event.preventDefault();\n return false;\n }}\n css={[{ color: '#b0bac9' }, isActive && { color: 'var(--primaryMain) !important' }]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n\n {anchor && (\n <FilterPopover anchor={anchor} onClose={() => setAnchor(null)} column={column}>\n <FilterPanel column={column} close={() => setAnchor(null)} />\n </FilterPopover>\n )}\n </>\n );\n}\n\nexport function FilterPopover<T>({\n anchor,\n onClose,\n column,\n children,\n}: {\n anchor: Element;\n onClose: () => void;\n column?: InternalColumn<T, unknown>;\n children: React.ReactNode;\n}): ReactElement {\n const Popover = useTheme((t) => t.components.Popover);\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n const cssVariables = useCssVariables();\n const filterClassNames = column?.filter?.classNames;\n\n return (\n // Keeps pointer events from reaching the header, e.g. the resize handle.\n <div\n onPointerDown={(event) => event.stopPropagation()}\n onPointerMove={(event) => event.stopPropagation()}\n >\n <ClassNames>\n {({ css, cx }) => (\n <Popover\n open\n onClose={onClose}\n anchorEl={anchor}\n css={[cssVariables, styles?.popover]}\n className={cx(classes?.popover, filterClassNames?.popover)}\n backdropClassName={cx(\n classes?.popoverBackdrop,\n filterClassNames?.popoverBackdrop,\n css(styles?.popoverBackdrop),\n )}\n >\n {children}\n </Popover>\n )}\n </ClassNames>\n </div>\n );\n}\n","import { useState, type ReactElement } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStructure } from '../state/context';\nimport { isActiveFilter } from '../state/useFilters';\nimport type { Id } from '../types';\nimport { FilterPanel } from './filterPanel';\nimport { FilterPopover } from './filterControl';\n\n/** Lets users edit the filters of columns that are not visible, see `enableHiddenColumnFilters`. */\nexport function HiddenColumnFilters<T>(): ReactElement | null {\n const { props, visibleColumns, filterValues, actions } = useTableStructure<T>();\n const IconButton = useTheme((t) => t.components.IconButton);\n const Button = useTheme((t) => t.components.Button);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const title = useTheme((t) => t.text.hiddenColumnFilters);\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n const [selected, setSelected] = useState<Id>();\n\n const columns = props.columns.filter(\n (column) => column.filter && !visibleColumns.some((visible) => visible.id === column.id),\n );\n if (columns.length === 0) return null;\n\n const isActive = (columnId: Id) =>\n isActiveFilter(\n columns.find((column) => column.id === columnId)?.filter,\n filterValues.get(columnId),\n );\n const anyActive = columns.some((column) => isActive(column.id));\n const selectedColumn = columns.find((column) => column.id === selected);\n\n function close() {\n setAnchor(null);\n setSelected(undefined);\n }\n\n const color = (active: boolean) => (active ? 'var(--primaryMain)' : '#b0bac9');\n\n return (\n <>\n <IconButton\n onClick={(event) => setAnchor(event.currentTarget)}\n css={{ color: color(anyActive) }}\n >\n <FilterList />\n </IconButton>\n\n {anchor && (\n <FilterPopover anchor={anchor} onClose={close} column={selectedColumn}>\n {selectedColumn ? (\n <div css={{ display: 'grid' }}>\n <Button\n onClick={() => setSelected(undefined)}\n css={{ justifyContent: 'flex-start', color: 'inherit' }}\n >\n ‹ {selectedColumn.header}\n </Button>\n <FilterPanel key={selectedColumn.id} column={selectedColumn} close={close} />\n </div>\n ) : (\n <div\n css={{ padding: 'calc(var(--spacing) * 2)', display: 'grid', gap: 'var(--spacing)' }}\n >\n <div>{title}</div>\n {columns.map((column) => (\n <Button\n key={column.id}\n onClick={() => setSelected(column.id)}\n onContextMenu={(event) => {\n actions.setFilterValue(column.id, undefined);\n event.preventDefault();\n }}\n startIcon={<FilterList css={{ color: color(isActive(column.id)) }} />}\n css={{\n justifyContent: 'flex-start',\n color: isActive(column.id) ? 'var(--primaryMain)' : 'inherit',\n }}\n >\n {column.header}\n </Button>\n ))}\n </div>\n )}\n </FilterPopover>\n )}\n </>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): ReactElement {\n const { sort, activeColumns, props, actions } = useTableStructure<T>();\n const columnId = useColumnContext();\n const Badge = useTheme((t) => t.components.Badge);\n const ArrowUpward = useTheme((t) => t.icons.ArrowUpward);\n\n const sortIndex = sort.findIndex((s) => s.columnId === columnId);\n const direction = sort[sortIndex]?.direction;\n const index = sortIndex >= 0 && sort.length > 1 ? sortIndex + 1 : undefined;\n const sortDisabled =\n activeColumns.find((column) => column.id === columnId)?.disableSort ?? props.disableSort;\n\n function toggle(event: React.MouseEvent, off?: boolean) {\n if (sortDisabled) {\n return;\n }\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort =\n event.getModifierState('Control') || off ? sort.filter((s) => s.columnId !== columnId) : [];\n if (!off) {\n newSort.push({\n columnId,\n direction: newDirection,\n });\n }\n\n actions.setSort(newSort);\n\n event.preventDefault();\n return false;\n }\n\n return (\n <div\n css={{\n userSelect: 'none',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) max-content',\n alignItems: 'center',\n cursor: 'pointer',\n }}\n onClick={(event) => toggle(event)}\n onContextMenu={(event) => toggle(event, true)}\n >\n <div css={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>{children}</div>\n\n {\n <Badge badgeContent={sortDisabled ? 0 : index}>\n <span\n css={[\n { display: 'inline-flex', transition: 'all 300ms', fontSize: '0.8em' },\n !direction && { opacity: 0 },\n direction === 'desc' && { transform: 'rotate3d(0, 0, 1, 180deg)' },\n ]}\n >\n <ArrowUpward />\n </span>\n </Badge>\n }\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { columnTheme, useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { FilterControl } from './filterControl';\nimport { HiddenColumnFilters } from './hiddenColumnFilters';\nimport { ResizeHandle } from './resizeHandle';\nimport { SortComponent } from './sortComponent';\n\nexport function ColumnHeader(): ReactElement {\n const columnId = useColumnContext();\n const { props, activeColumns, visibleColumns } = useTableStructure();\n const column = activeColumns.find((column) => column.id === columnId);\n const { classes, styles } = useTheme((theme) => columnTheme(theme, column));\n\n return (\n <div\n data-column-header=\"\"\n className={classes?.headerCell}\n css={[\n defaultClasses.headerCell,\n { position: 'relative', userSelect: 'none' },\n styles?.headerCell,\n ]}\n >\n <SortComponent>{column?.header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n {props.enableHiddenColumnFilters &&\n visibleColumns[visibleColumns.length - 1]?.id === columnId && <HiddenColumnFilters />}\n <ResizeHandle />\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function FormControlLabel({\n control,\n label,\n disabled,\n}: {\n control: ReactNode;\n label: ReactNode;\n disabled?: boolean;\n}) {\n return (\n <label\n css={[\n {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n userSelect: 'none',\n\n '& > *': {\n cursor: 'pointer',\n },\n },\n disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n >\n {control}\n <span css={{ marginLeft: 'var(--spacing)' }}>{label}</span>\n </label>\n );\n}\n","import { useState, type ReactElement } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStructure } from '../state/context';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\n\nexport function ColumnSelection<T>(): ReactElement {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Button = useTheme((t) => t.components.Button);\n const Settings = useTheme((t) => t.icons.Settings);\n const selectColumns = useTheme((t) => t.text.selectColumns);\n const resetAll = useTheme((t) => t.text.resetAll);\n const showAll = useTheme((t) => t.text.showAllColumns);\n const hideAll = useTheme((t) => t.text.hideAllColumns);\n const classes = useTheme((t) => t.classes);\n const cssVariables = useCssVariables();\n\n const { columns, hiddenColumns, actions } = useTableStructure<T>();\n\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n\n const toggle = (column?: InternalColumn<T, unknown>, state?: boolean) => {\n const newValue = new Set(hiddenColumns);\n\n for (const columnId of column ? [column.id] : columns.map((column) => column.id)) {\n if (state ?? hiddenColumns.has(columnId)) {\n newValue.delete(columnId);\n } else {\n newValue.add(columnId);\n }\n }\n\n actions.setHiddenColumns(newValue);\n };\n\n const allVisible = columns.every((column) => !hiddenColumns.has(column.id));\n\n return (\n <>\n <IconButton onClick={(event) => setAnchorElement(anchorElement ? null : event.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover\n anchorEl={anchorElement}\n open={!!anchorElement}\n onClose={() => setAnchorElement(null)}\n css={cssVariables}\n className={classes?.popover}\n backdropClassName={classes?.popoverBackdrop}\n >\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{selectColumns}</div>\n\n <div css={{ margin: '0.5em 0', display: 'flex', gap: '0.5em' }}>\n <Button variant=\"outlined\" onClick={() => toggle(undefined, !allVisible)}>\n {allVisible ? hideAll : showAll}\n </Button>\n\n <Button variant=\"outlined\" onClick={() => actions.resetTable()}>\n {resetAll}\n </Button>\n </div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={\n <Checkbox\n checked={!(column.hidden ?? hiddenColumns.has(column.id))}\n onChange={() => toggle(column)}\n disabled={column.hidden !== undefined}\n />\n }\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","import { useContext, useState, type ReactElement } from 'react';\nimport { ExportOptions, ExporterEntry } from '../exporters/exporter';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStructure } from '../state/context';\nimport { TableSettingsContext } from '../misc/tableSettings';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport function Export<T>(): ReactElement {\n const { exporters: contextExporters } = useContext(TableSettingsContext);\n const { props, actions } = useTableStructure<T>();\n const Button = useTheme((t) => t.components.Button);\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const ExportIcon = useTheme((t) => t.icons.Export);\n const Clipboard = useTheme((t) => t.icons.Clipboard);\n const exportTitle = useTheme((t) => t.text.exportTitle);\n const exportCopy = useTheme((t) => t.text.exportCopy);\n const exportDownload = useTheme((t) => t.text.exportDownload);\n const classes = useTheme((t) => t.classes);\n const cssVariables = useCssVariables();\n\n const { all, exporters }: ExportOptions =\n typeof props.enableExport === 'boolean' || props.enableExport === undefined\n ? { all: false, exporters: contextExporters }\n : props.enableExport;\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n function execute({ action, exporter }: ExporterEntry) {\n const { activeColumns, activeItems, selection, items } = actions.getState();\n const columns = activeColumns.map((column) => column.exportHeader);\n\n let exportedItems = items;\n if (!all) {\n exportedItems = activeItems;\n\n if (selection.size > 0) {\n exportedItems = exportedItems.filter((item) => selection.has(item.id));\n }\n }\n\n const rows = exportedItems.map((item) =>\n activeColumns.map((column) => column.exportCell(column.value(item.value), item.value)),\n );\n\n if (action === 'copy') {\n const data = exporter.exportToString(columns, rows);\n navigator.clipboard.writeText(data).catch((error: unknown) => {\n console.error('Failed to copy the export to the clipboard:', error);\n });\n } else {\n Promise.resolve(exporter.exportToBlob(columns, rows))\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `export.${exporter.fileEnding}`;\n document.body.append(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n })\n .catch((error: unknown) => {\n console.error('Failed to export:', error);\n });\n }\n }\n\n return (\n <>\n <IconButton onClick={(event) => setAnchor(anchor ? null : event.currentTarget)}>\n <ExportIcon css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover\n open={!!anchor}\n onClose={() => setAnchor(null)}\n anchorEl={anchor}\n css={cssVariables}\n className={classes?.popover}\n backdropClassName={classes?.popoverBackdrop}\n >\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n justifyItems: 'stretch',\n gap: 'var(--spacing)',\n\n '& > *': {\n justifyContent: 'start',\n },\n }}\n >\n <div css={{ marginBottom: 'var(--spacing)' }}>{exportTitle}</div>\n\n {exporters.map((entry, index) => (\n <Button\n key={index}\n startIcon={entry.action === 'copy' ? <Clipboard /> : <ExportIcon />}\n onClick={() => execute(entry)}\n >\n {entry.action === 'copy' ? exportCopy : exportDownload} (.{entry.exporter.type})\n </Button>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","import { memo } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { ColumnContext, useTableStructure } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { ColumnHeader } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { HiddenColumnFilters } from './hiddenColumnFilters';\nimport { ResizeHandleView } from './resizeHandle';\nimport { SelectAll } from './selectComponent';\n\n// Memoized so that rendering the rows (e.g. on selection) leaves it alone.\nexport const TableHeader = memo(function TableHeader() {\n const { props, visibleColumns } = useTableStructure();\n const classes = useTheme((t) => t.classes?.headerCell);\n const styles = useTheme((t) => t.styles?.headerCell);\n const { stickyHeader, enableSelection, enableColumnSelection, enableExport } = props;\n const { enableHiddenColumnFilters } = props;\n\n return (\n <div\n css={[\n { gridColumn: '1 / -1', display: 'grid', gridTemplateColumns: 'subgrid' },\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n ]}\n >\n <div className={classes} css={[defaultClasses.headerFill, styles]} />\n\n <div className={classes} css={[defaultClasses.headerCell, styles]}>\n {enableSelection && <SelectAll />}\n {enableColumnSelection && <ColumnSelection />}\n {enableExport && <Export />}\n {/* Normally in the last column's header, so it doesn't take up a column of its own. */}\n {enableHiddenColumnFilters && visibleColumns.length === 0 && <HiddenColumnFilters />}\n\n {(enableSelection ||\n enableColumnSelection ||\n enableExport ||\n (enableHiddenColumnFilters && visibleColumns.length === 0)) && (\n <>\n <div css={{ flex: 1 }} />\n <ResizeHandleView />\n </>\n )}\n </div>\n\n {visibleColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader />\n </ColumnContext.Provider>\n ))}\n\n <div className={classes} css={[defaultClasses.headerFill, styles]} />\n </div>\n );\n});\n","import { useVirtualizer, useWindowVirtualizer, type Virtualizer } from '@tanstack/react-virtual';\nimport {\n useContext,\n useLayoutEffect,\n useState,\n type ReactNode,\n type RefCallback,\n type RefObject,\n} from 'react';\nimport { CellSchedulerContext } from './cellScheduler';\nimport type { Id, TableProps } from '../types';\n\ntype VirtualOptions = Exclude<TableProps<unknown>['virtual'], boolean | undefined>;\n\nexport type RenderRow = (index: number, measureRef?: RefCallback<HTMLElement>) => ReactNode;\n\nconst spacerCss = { gridColumn: '1 / -1' } as const;\n\nconst scrolls = (element: HTMLElement) =>\n element.scrollHeight > element.clientHeight && getComputedStyle(element).overflowY !== 'visible';\n\nfunction findScrollRoot(element: HTMLElement): HTMLElement | undefined {\n for (let parent = element.parentElement; parent; parent = parent.parentElement) {\n if (parent === document.documentElement) return undefined;\n if (parent === document.body) {\n // body's overflow applies to the viewport unless <html> sets its own.\n const ownScroller = getComputedStyle(document.documentElement).overflowY !== 'visible';\n return ownScroller && scrolls(parent) ? parent : undefined;\n }\n if (scrolls(parent)) return parent;\n }\n return undefined;\n}\n\n/** Offset of the first row from the start of the scroll root's content. */\nfunction measureScrollMargin(probe: HTMLElement, root: HTMLElement | undefined) {\n if (!root) return probe.getBoundingClientRect().top + window.scrollY;\n return probe.getBoundingClientRect().top - root.getBoundingClientRect().top + root.scrollTop;\n}\n\n/**\n * Finds the scroll root and the rows' offset in it. Both are re-measured when the table or the\n * page layout resizes: a container only becomes a scroll root once its content overflows, and\n * content above the table shifts the offset.\n */\nfunction useScrollRoot(tableRef: RefObject<HTMLElement | null>, probe: HTMLElement | null) {\n const [root, setRoot] = useState<{ element: HTMLElement | undefined; margin: number }>();\n\n useLayoutEffect(() => {\n const table = tableRef.current;\n if (!probe || !table) return;\n\n function update() {\n setRoot((current) => {\n // A container stays the scroll root while it can scroll, even when a filter shrinks the\n // content below its height: switching virtualizers would remount every row.\n const keep =\n current?.element?.contains(probe) &&\n getComputedStyle(current.element).overflowY !== 'visible';\n const element = keep ? current!.element : findScrollRoot(probe!);\n const margin = Math.round(measureScrollMargin(probe!, element));\n return current && current.element === element && current.margin === margin\n ? current\n : { element, margin };\n });\n }\n\n update();\n const observer = new ResizeObserver(update);\n observer.observe(table);\n observer.observe(document.body);\n return () => observer.disconnect();\n }, [tableRef, probe]);\n\n return root;\n}\n\ninterface VirtualRowsProps {\n count: number;\n getKey: (index: number) => Id;\n options: VirtualOptions;\n scrollMargin: number;\n renderRow: RenderRow;\n}\n\nfunction VirtualWindow({\n virtualizer,\n renderRow,\n measure,\n}: {\n virtualizer: Virtualizer<any, HTMLDivElement>;\n renderRow: RenderRow;\n measure: boolean;\n}) {\n 'use no memo';\n const items = virtualizer.getVirtualItems();\n const scheduler = useContext(CellSchedulerContext);\n\n // Deferred cells of rows in the viewport are revealed before those in the overscan.\n useLayoutEffect(() => {\n const { range } = virtualizer;\n if (range) scheduler?.setVisibleRange(range.startIndex, range.endIndex);\n });\n\n const margin = virtualizer.options.scrollMargin;\n const before = items.length ? items[0]!.start - margin : 0;\n const after = items.length\n ? virtualizer.getTotalSize() - (items[items.length - 1]!.end - margin)\n : 0;\n\n return (\n <>\n <div style={{ ...spacerCss, height: before }} />\n {items.map((item) => renderRow(item.index, measure ? virtualizer.measureElement : undefined))}\n <div style={{ ...spacerCss, height: after }} />\n </>\n );\n}\n\nfunction virtualizerOptions({ count, getKey, options, scrollMargin }: VirtualRowsProps) {\n return {\n count,\n getItemKey: getKey,\n estimateSize: () => options.rowHeight ?? options.estimatedRowHeight ?? 40,\n overscan: options.overscan ?? 5,\n scrollMargin,\n };\n}\n\n// The virtualizers return the same mutable object on every render: memoizing on it would freeze\n// the rows, so these must stay out of React Compiler.\nfunction ElementRows(props: VirtualRowsProps & { root: HTMLElement }) {\n 'use no memo';\n const virtualizer = useVirtualizer<HTMLElement, HTMLDivElement>({\n ...virtualizerOptions(props),\n getScrollElement: () => props.root,\n });\n return (\n <VirtualWindow\n virtualizer={virtualizer}\n renderRow={props.renderRow}\n measure={props.options.rowHeight === undefined}\n />\n );\n}\n\nfunction WindowRows(props: VirtualRowsProps) {\n 'use no memo';\n const virtualizer = useWindowVirtualizer<HTMLDivElement>(virtualizerOptions(props));\n return (\n <VirtualWindow\n virtualizer={virtualizer}\n renderRow={props.renderRow}\n measure={props.options.rowHeight === undefined}\n />\n );\n}\n\nexport function VirtualRows({\n tableRef,\n ...props\n}: Omit<VirtualRowsProps, 'scrollMargin'> & { tableRef: RefObject<HTMLElement | null> }) {\n const [probe, setProbe] = useState<HTMLDivElement | null>(null);\n const root = useScrollRoot(tableRef, probe);\n const estimate = props.options.rowHeight ?? props.options.estimatedRowHeight ?? 40;\n\n return (\n <>\n <div ref={setProbe} style={spacerCss} />\n {/* Takes the rows' estimated space until the scroll root is known, so the container that\n will scroll already overflows and gets picked right away. */}\n {!root && <div style={{ ...spacerCss, height: props.count * estimate }} />}\n {root &&\n (root.element ? (\n <ElementRows {...props} root={root.element} scrollMargin={root.margin} />\n ) : (\n <WindowRows {...props} scrollMargin={root.margin} />\n ))}\n </>\n );\n}\n","import { useCallback, useLayoutEffect, useMemo, useRef, type RefCallback } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { TableTheme } from '../types';\nimport { columnWidthVariable } from './resizeHandle';\nimport { CellSchedulerContext, useCellScheduler } from './cellScheduler';\nimport { Row, type RowConfig } from './row';\nimport { useRowStyles } from './rowStyles';\nimport { TableFooter } from './tableFooter';\nimport { TableHeader } from './tableHeader';\nimport { VirtualRows } from './virtualized';\n\nexport function TableGrid<T>({ hidden }: { hidden: boolean }) {\n const state = useTableContext<T>();\n const theme = useTheme((t: TableTheme<T>) => t);\n const { props, visibleColumns, columnWidths, activeItems, expanded } = state;\n const cssVariables = useCssVariables();\n const tableRef = useRef<HTMLDivElement>(null);\n\n const debugRenderRef = useRef(props.debugRender);\n debugRenderRef.current = props.debugRender;\n const debugRender = useCallback((...output: any) => debugRenderRef.current?.(...output), []);\n\n useLayoutEffect(() => {\n debugRender('render table');\n });\n\n const { enableSelection, rowAction, rowDetails, wrapRow, wrapCell, hasDeferredChildren } = props;\n const styles = useRowStyles(theme, visibleColumns);\n const scheduler = useCellScheduler();\n const virtualOptions = props.virtual instanceof Object ? props.virtual : undefined;\n const deferCells = virtualOptions?.deferCells;\n const placeholderHeight = virtualOptions?.rowHeight ?? virtualOptions?.estimatedRowHeight ?? 40;\n const deferredColumns = useMemo(\n () =>\n new Set(\n visibleColumns.filter((column) => column.deferred ?? deferCells).map((column) => column.id),\n ),\n [visibleColumns, deferCells],\n );\n const config = useMemo(\n (): RowConfig<T> => ({\n styles,\n deferredColumns,\n placeholderHeight,\n columns: visibleColumns,\n enableSelection,\n rowAction,\n rowDetails,\n wrapRow,\n wrapCell,\n hasDeferredChildren,\n debugRender,\n }),\n [\n styles,\n deferredColumns,\n placeholderHeight,\n visibleColumns,\n enableSelection,\n rowAction,\n rowDetails,\n wrapRow,\n wrapCell,\n hasDeferredChildren,\n debugRender,\n ],\n );\n\n const renderRow = (index: number, measureRef?: RefCallback<HTMLElement>) => {\n const item = activeItems[index]!;\n return (\n <Row\n key={item.id}\n id={item.id}\n value={item.value}\n rowIndex={index}\n depth={item.depth}\n hasChildren={item.children.length > 0}\n expanded={expanded.has(item.id)}\n config={config}\n measureRef={measureRef}\n />\n );\n };\n\n const getKey = useCallback((index: number) => activeItems[index]!.id, [activeItems]);\n const { fullWidth, virtual } = props;\n\n return (\n <CellSchedulerContext.Provider value={scheduler}>\n <div\n ref={tableRef}\n data-schummar-table=\"\"\n className={theme.classes?.table}\n css={[\n cssVariables,\n defaultClasses.table,\n theme.styles?.table,\n hidden && { visibility: 'hidden' },\n ]}\n style={{\n gridTemplateColumns: [\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...visibleColumns.map(\n (column, index) =>\n `var(${columnWidthVariable(index)}, ${columnWidths.get(column.id) ?? column.width ?? 'max-content'})`,\n ),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n }}\n >\n <TableHeader />\n\n {virtual ? (\n <VirtualRows\n tableRef={tableRef}\n count={activeItems.length}\n getKey={getKey}\n options={virtual === true ? {} : virtual}\n renderRow={renderRow}\n />\n ) : (\n activeItems.map((_, index) => renderRow(index))\n )}\n\n <TableFooter />\n </div>\n </CellSchedulerContext.Provider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\n\nexport function TableLoadingState({ isHydrated }: { isHydrated: boolean }) {\n const [showLoading, setShowLoading] = useState(false);\n const loadingText = useTheme((t) => t.text.loading);\n\n useEffect(() => {\n const handle = setTimeout(() => setShowLoading(true), 500);\n return () => clearTimeout(handle);\n }, []);\n\n return !isHydrated && showLoading ? <div>{loadingText}</div> : null;\n}\n","import type { ReactElement, Ref } from 'react';\nimport { ThemeContext } from '../hooks/useTheme';\nimport {\n SelectionContext,\n TableActionsContext,\n TableContext,\n TableStructureContext,\n} from '../state/context';\nimport { useTable } from '../state/useTable';\nimport { useTableImperativeHandle } from '../state/useTableImperativeHandle';\nimport { useTableReset } from '../state/useTableReset';\nimport type { TableProps, TableRef } from '../types';\nimport { TableGrid } from './tableGrid';\nimport { TableLoadingState } from './tableLoadingState';\n\nexport function Table<T>({ ref, ...props }: TableProps<T> & { ref?: Ref<TableRef> }): ReactElement {\n const [resetKey, onReset] = useTableReset(props);\n return (\n <TableWithState\n key={resetKey}\n props={props}\n tableRef={ref}\n onReset={onReset}\n isReset={resetKey > 0}\n />\n );\n}\n\nfunction TableWithState<T>({\n props,\n tableRef,\n onReset,\n isReset,\n}: {\n props: TableProps<T>;\n tableRef?: Ref<TableRef>;\n onReset: () => void;\n isReset: boolean;\n}): ReactElement {\n const table = useTable(props, onReset, isReset);\n const { context, structure, actions, theme, isHydrated } = table;\n useTableImperativeHandle(tableRef, table);\n\n return (\n <ThemeContext.Provider value={theme}>\n <TableActionsContext.Provider value={actions}>\n <TableStructureContext.Provider value={structure}>\n <TableContext.Provider value={context}>\n <TableLoadingState isHydrated={isHydrated} />\n <SelectionContext.Provider value={context.selection}>\n <TableGrid hidden={!isHydrated} />\n </SelectionContext.Provider>\n </TableContext.Provider>\n </TableStructureContext.Provider>\n </TableActionsContext.Provider>\n </ThemeContext.Provider>\n );\n}\n","import type { ReactNode } from 'react';\nimport { eventHandler } from '../misc/equal';\nimport type { Filter, FilterComponentProps, FilterOptions } from '../types';\n\nexport interface FilterDefinition<TInput, TState, TOptions> {\n isActive(value: TState, options: TOptions): boolean;\n /** `input` is the column's `filterBy` value, see `SingleOrMultiple` and `toSingles`. */\n test(value: TState, input: TInput, options: TOptions): boolean;\n /** Delay in ms before changes made in the UI apply, unless the `debounce` option overrides it. */\n debounce?: number;\n Component(props: FilterComponentProps<TInput, TState, TOptions>): ReactNode;\n}\n\n/**\n * Creates a filter factory, like `textFilter`. `TInput` is what the filter accepts from a column,\n * typically a `SingleOrMultiple<…>`. A `debounce` option overrides the definition's.\n *\n * The definition's functions are shared by every filter created from it and everything else\n * passed goes into `options`, so a filter created inline on every render stays deep equal and\n * doesn't cause refiltering. Keep options to plain data where possible: functions are compared by\n * reference.\n */\nexport function defineFilter<TInput, TState, TOptions extends object = {}>(\n definition: FilterDefinition<TInput, TState, TOptions>,\n) {\n return (input?: FilterOptions<TState> & TOptions): Filter<TInput, TState, TOptions> => {\n const { defaultValue, value, onChange, external, classNames, ...options } =\n input ?? ({} as FilterOptions<TState>);\n\n return {\n isActive: definition.isActive,\n test: definition.test,\n debounce: (options as { debounce?: number }).debounce ?? definition.debounce,\n Component: definition.Component,\n defaultValue,\n value,\n onChange: onChange && eventHandler(onChange),\n external,\n classNames,\n options: options as TOptions,\n };\n };\n}\n","import type { ReactElement } from 'react';\nimport type { DatePickerProps, DateRange } from '../components/datePicker';\nimport { dateIntersect, DatePicker } from '../components/datePicker';\nimport { toSingles } from '../misc/helpers';\nimport type { FilterComponentProps, SingleOrMultiple } from '../types';\nimport { defineFilter } from './defineFilter';\n\n/** An ISO 8601 date or date-time string, e.g. `2024-05-03` or `2024-05-03T13:47:23Z`. */\nexport type ISODate = `${number}-${number}-${number}${string}`;\n\ntype DateValue = Date | DateRange | null;\ntype DateInput = SingleOrMultiple<Date | DateRange | ISODate | null | undefined>;\n\nconst toDate = (x: Date | DateRange | ISODate | null | undefined) =>\n typeof x === 'string' ? new Date(x) : x;\n\nexport type DateFilterOptions = {\n /** If enabled, only single days can be selected. Ranges otherwise. */\n singleSelect?: boolean;\n} & Pick<\n DatePickerProps,\n | 'locale'\n | 'firstDayOfWeek'\n | 'defaultDateInView'\n | 'quickOptions'\n | 'minDate'\n | 'maxDate'\n | 'showCalendarWeek'\n | 'showTime'\n>;\n\nfunction DateFilterComponent({\n value = null,\n onChange,\n close,\n options: {\n locale,\n firstDayOfWeek,\n defaultDateInView,\n quickOptions,\n singleSelect,\n minDate,\n maxDate,\n showCalendarWeek,\n showTime,\n },\n}: FilterComponentProps<DateInput, DateValue, DateFilterOptions>): ReactElement {\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n <DatePicker\n rangeSelect={!singleSelect}\n value={value ?? null}\n onChange={(value, source) => {\n onChange(value);\n if (source === 'quickOption' || (source !== 'input' && !showTime)) {\n close();\n }\n }}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n defaultDateInView={defaultDateInView}\n quickOptions={quickOptions}\n minDate={minDate}\n maxDate={maxDate}\n showCalendarWeek={showCalendarWeek}\n showTime={showTime}\n />\n </div>\n );\n}\n\nexport const dateFilter = defineFilter<DateInput, DateValue, DateFilterOptions>({\n isActive: (value) => !!value,\n test: (value, input) => toSingles(input).some((x) => dateIntersect(value, toDate(x))),\n Component: DateFilterComponent,\n});\n","import { useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\ntype TextFieldProps =\n TableTheme['components']['TextField'] extends React.ComponentType<infer T> ? T : never;\n\nexport interface NumberFieldProps extends Omit<TextFieldProps, 'value' | 'onChange'> {\n value?: number | null;\n onChange?: (value: number | null) => void;\n}\n\nconst Pattern = /^-?\\d*(?:[.,]\\d*)?$/;\n\nconst printNumber = (value: number | null, locale?: string) => {\n if (value === null) {\n return '';\n }\n\n return value.toLocaleString(locale);\n};\n\nconst parseNumber = (value: string) => {\n if (value === '') {\n return null;\n }\n\n const asNumber = Number(value.replace(',', '.'));\n return Number.isNaN(asNumber) ? null : asNumber;\n};\n\nexport function NumberField({\n value: commitedValue = null,\n onChange,\n ...textFieldProps\n}: NumberFieldProps) {\n const locale = useTheme((t) => t.locale);\n const TextField = useTheme((t) => t.components.TextField);\n const [value = printNumber(commitedValue, locale), setValue] = useState<string>();\n\n return (\n <TextField\n value={value}\n onChange={(event) => {\n if (Pattern.test(event.target.value)) {\n setValue(event.target.value);\n }\n }}\n onBlur={() => {\n onChange?.(parseNumber(value));\n setValue(undefined);\n }}\n {...textFieldProps}\n css={{\n input: {\n backgroundColor: 'inherit',\n color: 'inherit',\n },\n }}\n />\n );\n}\n","import { useMemo, type ReactElement } from 'react';\nimport { NumberField } from '../components/numberField';\nimport { useTheme } from '../hooks/useTheme';\nimport { toSingles } from '../misc/helpers';\nimport type { FilterComponentProps, SingleOrMultiple } from '../types';\nimport { defineFilter } from './defineFilter';\n\ntype Range = [number | null, number | null] | null;\ntype RangeInput = SingleOrMultiple<number | bigint | null | undefined>;\n\nexport interface RangeFilterOptions {\n min?: number;\n max?: number;\n /** Delay in ms before changes apply. The inputs apply on blur anyway. */\n debounce?: number;\n}\n\nfunction RangeFilterComponent({\n value,\n onChange,\n options: { min, max },\n getValues,\n}: FilterComponentProps<RangeInput, Range, RangeFilterOptions>): ReactElement {\n const rangeMinText = useTheme((t) => t.text.rangeMin);\n const rangeMaxText = useTheme((t) => t.text.rangeMax);\n\n const [minValue, maxValue] = useMemo(() => {\n if (typeof min === 'number' && typeof max === 'number') {\n return [min, max];\n }\n\n let minValue;\n let maxValue;\n\n for (const value of getValues()) {\n if (value === null || value === undefined) continue;\n const number = Number(value);\n minValue = Math.min(minValue ?? number, number);\n maxValue = Math.max(maxValue ?? number, number);\n }\n\n return [min ?? minValue, max ?? maxValue];\n }, [min, max, getValues]);\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n gap: '1em',\n }}\n >\n <div\n css={{\n display: 'flex',\n gap: '1em',\n alignItems: 'center',\n\n '& > *': {\n width: '10em',\n },\n }}\n >\n <NumberField\n value={value?.[0]}\n onChange={(newMin) => onChange(normalize(newMin, value?.[1], 'min', { min, max }))}\n startIcon={<span css={{ margin: '0 calc(var(--spacing) * 2)' }}>{rangeMinText}</span>}\n placeholder={String(minValue ?? '')}\n css={{\n alignItems: 'baseline',\n }}\n />\n -\n <NumberField\n value={value?.[1]}\n onChange={(newMax) => onChange(normalize(value?.[0], newMax, 'max', { min, max }))}\n startIcon={<span css={{ margin: '0 calc(var(--spacing) * 2)' }}>{rangeMaxText}</span>}\n placeholder={String(maxValue ?? '')}\n css={{\n alignItems: 'baseline',\n }}\n />\n </div>\n </div>\n );\n}\n\nexport const rangeFilter = defineFilter<RangeInput, Range, RangeFilterOptions>({\n isActive: (value) => !!value,\n test(value, input) {\n if (!value || (value[0] === null && value[1] === null)) {\n return true;\n }\n\n const min = value[0] ?? Number.NEGATIVE_INFINITY;\n const max = value[1] ?? Number.POSITIVE_INFINITY;\n return toSingles(input).some(\n (x) => (typeof x === 'number' || typeof x === 'bigint') && x >= min && x <= max,\n );\n },\n Component: RangeFilterComponent,\n});\n\nfunction normalize(\n min: number | null | undefined,\n max: number | null | undefined,\n changed: 'min' | 'max',\n limits: { min?: number; max?: number },\n): [number | null, number | null] | null {\n min ??= null;\n max ??= null;\n\n if (min !== null && max !== null && min > max) {\n if (changed === 'min') {\n max = min;\n } else {\n min = max;\n }\n }\n\n return min !== null || max !== null\n ? [clamp(min, limits.min, limits.max), clamp(max, limits.min, limits.max)]\n : null;\n}\n\nfunction clamp(\n value: number | null,\n min = Number.NEGATIVE_INFINITY,\n max = Number.POSITIVE_INFINITY,\n): number | null {\n return value === null ? null : Math.min(Math.max(value, min), max);\n}\n","import { useVirtualizer } from '@tanstack/react-virtual';\nimport type { HTMLProps, ReactElement, ReactNode } from 'react';\nimport { useState } from 'react';\n\ntype VirtualOptions = { rowHeight?: number; estimatedRowHeight?: number; overscan?: number };\n\nexport interface VirtualListProps<T> extends Omit<HTMLProps<HTMLDivElement>, 'children'> {\n virtual?: boolean | VirtualOptions;\n items: T[];\n children: (item: T, index: number) => ReactNode;\n}\n\nconst containerCss = { overflowY: 'auto', display: 'grid' } as const;\n\nexport function VirtualList<T>({\n virtual = true,\n items,\n children,\n ...props\n}: VirtualListProps<T>): ReactElement {\n if (!virtual) {\n return (\n <div {...props} css={containerCss}>\n {items.map((item, index) => children(item, index))}\n </div>\n );\n }\n\n return (\n <VirtualItems {...props} items={items} options={virtual === true ? {} : virtual}>\n {children}\n </VirtualItems>\n );\n}\n\nfunction VirtualItems<T>({\n items,\n options,\n children,\n ...props\n}: Omit<VirtualListProps<T>, 'virtual'> & { options: VirtualOptions }) {\n const [scrollElement, setScrollElement] = useState<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLDivElement>({\n count: items.length,\n getScrollElement: () => scrollElement,\n estimateSize: () => options.rowHeight ?? options.estimatedRowHeight ?? 38,\n overscan: options.overscan ?? 5,\n useFlushSync: false,\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n const measure = options.rowHeight === undefined ? virtualizer.measureElement : undefined;\n const before = virtualItems[0]?.start ?? 0;\n // With no items rendered yet the spacer must still take up the full size: the virtualizer\n // renders nothing while the container has no height.\n const after = virtualizer.getTotalSize() - (virtualItems[virtualItems.length - 1]?.end ?? 0);\n\n return (\n <div {...props} ref={setScrollElement} css={containerCss}>\n <div style={{ height: before }} />\n {virtualItems.map((virtualItem) => (\n <div\n key={virtualItem.key}\n ref={measure}\n data-index={virtualItem.index}\n css={{ display: 'grid' }}\n >\n {children(items[virtualItem.index]!, virtualItem.index)}\n </div>\n ))}\n <div style={{ height: after }} />\n </div>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { useMemo, useState } from 'react';\nimport { AutoFocusTextField } from '../components/autoFocusTextField';\nimport { FormControlLabel } from '../components/formControlLabel';\nimport type { VirtualListProps } from '../components/virtualList';\nimport { VirtualList } from '../components/virtualList';\nimport { useTheme } from '../hooks/useTheme';\nimport { asString, orderBy, toSingles, uniq } from '../misc/helpers';\nimport type { Filter, FilterComponentProps, FilterOptions, SingleOrMultiple } from '../types';\nimport { defineFilter } from './defineFilter';\n\nexport interface SelectFilterOptions<TFilterBy> {\n /** Which options are provided to select. By default all unique item values are used. */\n options?: TFilterBy[];\n /** String representation of a value. Used to filter options via the text field. */\n stringValue?: (value: TFilterBy) => string;\n /** Render values. By default a string representation of the value is used. */\n render?: (value: TFilterBy) => ReactNode;\n /** If enabled, only one option can be selected at a time. */\n singleSelect?: boolean;\n /** If enabled, the search field is hidden. */\n hideSearchField?: boolean;\n /** If enabled, the reset button is hidden. */\n hideResetButton?: boolean;\n /** Virtual list props.\n * @default true */\n virtual?: VirtualListProps<unknown>['virtual'];\n}\n\nfunction toggle<T>(set: Set<T>, value: T, singleSelect?: boolean) {\n const newSet = new Set(singleSelect ? [] : set);\n if (set.has(value)) {\n newSet.delete(value);\n } else {\n newSet.add(value);\n }\n\n return newSet;\n}\n\nfunction SelectFilterComponent({\n value: currentValue,\n onChange,\n options: {\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n hideSearchField,\n hideResetButton,\n virtual,\n },\n getValues,\n}: FilterComponentProps<unknown, Set<unknown>, SelectFilterOptions<unknown>>): ReactElement {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Button = useTheme((t) => t.components.Button);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n const deselectAll = useTheme((t) => t.text.deselectAll);\n const noResults = useTheme((t) => t.text.noResults);\n\n const value = currentValue ?? new Set<unknown>();\n\n const options = useMemo(\n () => (providedOptions ? uniq(providedOptions) : orderBy(getValues())),\n [providedOptions, getValues],\n );\n\n const [query, setQuery] = useState('');\n // Selected options come first, as they were when the filter opened.\n const [initialValue] = useState(value);\n const filtered = options.filter(\n (option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()),\n );\n const ordered = filtered\n .filter((option) => initialValue.has(option))\n .concat(filtered.filter((option) => !initialValue.has(option)));\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n gap: 'var(--spacing)',\n }}\n >\n {!hideSearchField && (\n <AutoFocusTextField\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n endIcon={\n <IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>\n }\n css={{ marginBottom: 'var(--spacing)' }}\n />\n )}\n\n {!hideResetButton && (\n <Button\n disabled={value.size === 0}\n onClick={() => onChange(new Set())}\n variant=\"outlined\"\n css={{\n justifyContent: 'center',\n width: '100%',\n marginBottom: 'var(--spacing)',\n color: 'inherit',\n }}\n >\n {deselectAll}\n </Button>\n )}\n\n <VirtualList\n items={ordered}\n virtual={virtual}\n css={{\n width: '20em',\n maxWidth: '100%',\n maxHeight: 'min(20em, 50vh)',\n overflow: 'hidden auto',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n }}\n >\n {(option, index) => (\n <FormControlLabel\n key={index}\n control={\n <Checkbox\n checked={value.has(option)}\n onChange={() => onChange(toggle(value, option, singleSelect))}\n />\n }\n label={render(option)}\n />\n )}\n </VirtualList>\n\n {ordered.length === 0 && <span css={{ textAlign: 'center' }}>{noResults}</span>}\n </div>\n );\n}\n\n/** Accepts any value; typing `options`, `defaultValue`, `render` etc. narrows it. */\n// defineFilter can't make the factory generic, hence the cast.\nexport const selectFilter = defineFilter<\n SingleOrMultiple<unknown>,\n Set<unknown>,\n SelectFilterOptions<unknown>\n>({\n isActive: (value) => value.size > 0,\n test: (value, input) => toSingles(input).some((x) => value.has(x)),\n Component: SelectFilterComponent,\n}) as <T>(\n options?: FilterOptions<Set<T>> & SelectFilterOptions<T>,\n) => Filter<SingleOrMultiple<T>, Set<T>, SelectFilterOptions<T>>;\n","import type { ReactElement } from 'react';\nimport { AutoFocusTextField } from '../components/autoFocusTextField';\nimport { useTheme } from '../hooks/useTheme';\nimport { toSingles } from '../misc/helpers';\nimport type { FilterComponentProps, SingleOrMultiple } from '../types';\nimport { defineFilter } from './defineFilter';\n\nconst compares = {\n contains: (itemValue: string, filterValue: string) =>\n itemValue.toLowerCase().includes(filterValue.toLowerCase()),\n prefix: (itemValue: string, filterValue: string) =>\n itemValue.toLowerCase().startsWith(filterValue.toLowerCase()),\n exact: (itemValue: string, filterValue: string) =>\n itemValue.toLowerCase() === filterValue.toLowerCase(),\n};\n\nexport interface TextFilterOptions {\n /** How item values are matched, ignoring case. A function gets the item value and the filter\n * value and returns whether they match.\n * @default 'contains'\n */\n compare?: keyof typeof compares | ((itemValue: string, filterValue: string) => boolean);\n placeholder?: string;\n /** Delay in ms before typed text applies.\n * @default 300\n */\n debounce?: number;\n}\n\ntype TextInput = SingleOrMultiple<string | number | bigint | null | undefined>;\n\nfunction TextFilterComponent({\n value,\n onChange,\n close,\n options,\n}: FilterComponentProps<TextInput, string, TextFilterOptions>): ReactElement {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n\n return (\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <AutoFocusTextField\n value={value ?? ''}\n onChange={(event) => onChange(event.target.value)}\n onKeyUp={(event) => {\n if (event.key === 'Enter') close();\n }}\n endIcon={\n <IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>\n }\n placeholder={options.placeholder}\n />\n </div>\n );\n}\n\nexport const textFilter = defineFilter<TextInput, string, TextFilterOptions>({\n isActive: (value) => !!value,\n test(value, input, { compare = 'contains' }) {\n const match = typeof compare === 'function' ? compare : compares[compare];\n return toSingles(input).some((x) => x !== null && x !== undefined && match(String(x), value));\n },\n debounce: 300,\n Component: TextFilterComponent,\n});\n","export const textMatch = (text: string, query: string): boolean => {\n text = text.toLowerCase();\n query = query.toLowerCase();\n return query.split(/\\s+/).every((part) => termMatch(text, part));\n};\n\nexport const termMatch = (text: string, query: string): boolean => {\n let i = 0;\n outer: for (const char of query) {\n for (; i < text.length; i++) {\n if (text[i] === char) {\n i++;\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/components/autoFocusTextField.tsx","../src/state/context.ts","../src/misc/queue.ts","../src/state/persistence.ts","../src/state/useControllableState.ts","../src/state/useColumns.ts","../src/state/useExpanded.ts","../src/state/useFilters.ts","../src/state/useSort.ts","../src/state/useItems.ts","../src/state/useSelection.ts","../src/exporters/serializer.ts","../src/misc/equal.ts","../src/state/useTableProps.ts","../src/state/useTable.ts","../src/state/useTableImperativeHandle.ts","../src/state/useTableReset.ts","../src/components/resizeHandle.tsx","../src/components/cellScheduler.ts","../src/components/cell.tsx","../src/components/details.tsx","../src/components/expandControl.tsx","../src/components/catchClicks.tsx","../src/components/selectComponent.tsx","../src/components/row.tsx","../src/components/rowStyles.ts","../src/components/clearFiltersButton.tsx","../src/components/columnFooter.tsx","../src/components/tableFooter.tsx","../src/components/filterPanel.tsx","../src/components/filterControl.tsx","../src/components/hiddenColumnFilters.tsx","../src/components/sortComponent.tsx","../src/components/columnHeader.tsx","../src/components/formControlLabel.tsx","../src/components/columnSelection.tsx","../src/components/export.tsx","../src/components/tableHeader.tsx","../src/components/virtualized.tsx","../src/components/tableGrid.tsx","../src/components/tableLoadingState.tsx","../src/components/table.tsx","../src/filters/defineFilter.ts","../src/filters/dateFilter.tsx","../src/components/numberField.tsx","../src/filters/rangeFilter.tsx","../src/components/virtualList.tsx","../src/filters/selectFilter.tsx","../src/filters/textFilter.tsx","../src/misc/textMatch.ts"],"sourcesContent":["import type { ComponentType } from 'react';\nimport { useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\ntype Props = TableTheme['components']['TextField'] extends ComponentType<infer T> ? T : never;\n\nexport function AutoFocusTextField(props: Omit<Props, 'inputRef'>) {\n const TextField = useTheme((t) => t.components.TextField);\n\n const ref = useRef<HTMLInputElement>(null);\n // Filters mount when their popover opens. The popover positions itself first.\n useLayoutEffect(() => {\n const timeout = setTimeout(() => ref.current?.focus());\n return () => clearTimeout(timeout);\n }, []);\n\n return (\n <TextField\n {...props}\n inputRef={ref}\n css={{\n input: {\n backgroundColor: 'inherit',\n color: 'inherit',\n },\n }}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { Id, TableActions, TableContextValue, TableStructure } from '../types';\n\n/** Full table state. Changes on every state change: rows and cells must not consume it. */\nexport const TableContext = createContext<TableContextValue<any> | null>(null);\n\n/** Header, footer and filter components use this so that row interactions (selection,\n * expansion) don't render them. */\nexport const TableStructureContext = createContext<TableStructure<any> | null>(null);\n\n/** Stable for the lifetime of the table. */\nexport const TableActionsContext = createContext<TableActions<any> | null>(null);\n\n/** Only the row checkboxes consume this, so a selection change does not render rows. */\nexport const SelectionContext = createContext<Set<Id>>(new Set());\n\nexport const ColumnContext = createContext<Id | null>(null);\n\nexport function useTableContext<T>(): TableContextValue<T> {\n const value = useContext(TableContext);\n if (!value) throw new Error('No table context available');\n return value as TableContextValue<T>;\n}\n\nexport function useTableStructure<T>(): TableStructure<T> {\n const value = useContext(TableStructureContext);\n if (!value) throw new Error('No table context available');\n return value as TableStructure<T>;\n}\n\nexport function useTableActions<T>(): TableActions<T> {\n const value = useContext(TableActionsContext);\n if (!value) throw new Error('No table context available');\n return value as TableActions<T>;\n}\n\nexport function useColumnContext(): Id {\n const value = useContext(ColumnContext);\n if (value === null) throw new Error('No column context available');\n return value;\n}\n","export class Queue {\n private q = new Array<{\n job: () => Promise<any>;\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n }>();\n\n private isRunning = false;\n\n run<T>(job: () => Promise<T>, replace?: boolean) {\n return new Promise<T>((resolve, reject) => {\n if (replace) {\n this.q = [];\n }\n this.q.push({ job, resolve, reject });\n\n // start() never rejects: each job's outcome goes to its own promise.\n if (!this.isRunning) void this.start();\n });\n }\n\n clear() {\n this.q = [];\n }\n\n private async start() {\n this.isRunning = true;\n\n let next;\n while ((next = this.q.shift())) {\n try {\n const result = await next.job();\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n this.isRunning = false;\n }\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { Queue } from '../misc/queue';\nimport type { Id, TableProps } from '../types';\n\nexport const PERSIST_KEYS = [\n 'sort',\n 'selection',\n 'expanded',\n 'hiddenColumns',\n 'filterValues',\n 'columnWidths',\n] as const;\n\nexport type PersistKey = (typeof PERSIST_KEYS)[number];\nexport type PersistedData = Partial<Record<PersistKey, any>>;\n\nconst storageName = (id: string) => `schummar-table_state-v1_${id}`;\n\nexport type TableStateStorage = {\n getItem: (key: string) => string | null | Promise<string | null>;\n /** May return a promise. */\n setItem: (key: string, value: string) => unknown;\n /** May return a promise. */\n removeItem: (key: string) => unknown;\n} & (\n | {\n keys: () => string[] | Promise<string[]>;\n }\n | {\n length: number | (() => number | Promise<number>);\n key: (keyIndex: number) => string | null | Promise<string | null>;\n }\n);\n\nfunction stringify(value: unknown) {\n function prepare(value: unknown): any {\n if (value instanceof Date) {\n return { __date: value.toJSON() };\n }\n\n if (value instanceof Set) {\n return { __set: Array.from(value).map(prepare) };\n }\n\n if (value instanceof Map) {\n return { __map: Array.from(value.entries()).map((entry) => entry.map(prepare)) };\n }\n\n if (Array.isArray(value)) {\n return value.map(prepare);\n }\n\n if (value instanceof Object) {\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, prepare(v)]));\n }\n\n return value;\n }\n\n return JSON.stringify(prepare(value));\n}\n\nfunction parse(value: string) {\n return JSON.parse(value, (_key, value) => {\n if (value instanceof Object && '__date' in value) {\n return new Date(value.__date);\n }\n\n if (value instanceof Object && '__set' in value) {\n return new Set(value.__set);\n }\n\n if (value instanceof Object && '__map' in value) {\n return new Map(value.__map);\n }\n\n return value;\n });\n}\n\n/** A persisted key, or `{ filterValues: [...] }` for the values of some filters only. */\nexport type PersistEntry = PersistKey | { filterValues: readonly Id[] };\n\ntype Persist = NonNullable<TableProps<any>['persist']>;\n\nconst filterIds = (entries: readonly PersistEntry[] | undefined) =>\n entries?.flatMap((entry) => (typeof entry === 'object' ? entry.filterValues : []));\n\nexport function isPersisted(persist: Persist, key: PersistKey) {\n const isIncluded =\n !persist.include ||\n persist.include.includes(key) ||\n (key === 'filterValues' && filterIds(persist.include)!.length > 0);\n return isIncluded && !persist.exclude?.includes(key);\n}\n\nexport function isFilterValuePersisted(persist: Persist, columnId: Id) {\n if (!isPersisted(persist, 'filterValues')) return false;\n const included = persist.include?.includes('filterValues')\n ? undefined\n : filterIds(persist.include);\n return (\n (included === undefined || included.includes(columnId)) &&\n !filterIds(persist.exclude)?.includes(columnId)\n );\n}\n\n/**\n * Loads the persisted state once on mount and saves `data` (at most once per second) after that.\n * `data` must already be reduced to what should be saved.\n */\nexport function usePersistence(\n persist: TableProps<any>['persist'],\n data: PersistedData,\n restore: (data: PersistedData) => void,\n debug?: (...output: any) => void,\n) {\n const [isHydrated, setIsHydrated] = useState(!persist);\n const [queue] = useState(() => new Queue());\n const latest = useRef({ persist, data, restore, debug });\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined);\n const lastSave = useRef(0);\n\n useEffect(() => {\n latest.current = { persist, data, restore, debug };\n });\n\n useEffect(() => {\n const { persist } = latest.current;\n if (!persist) return;\n\n let isCanceled = false;\n\n void (async () => {\n try {\n const json = await persist.storage.getItem(storageName(persist.id));\n if (isCanceled || !json) return;\n\n const data = parse(json);\n latest.current.debug?.('load', json, data);\n latest.current.restore(\n Object.fromEntries(\n PERSIST_KEYS.filter((key) => key in data && isPersisted(persist, key)).map((key) => [\n key,\n data[key],\n ]),\n ),\n );\n } catch (error) {\n console.error('Failed to load table state:', error);\n } finally {\n if (!isCanceled) setIsHydrated(true);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n }, []);\n\n useEffect(() => {\n if (!isHydrated || !latest.current.persist || timer.current) return;\n\n timer.current = setTimeout(\n () => {\n timer.current = undefined;\n lastSave.current = Date.now();\n\n const { persist, data, debug } = latest.current;\n if (!persist) return;\n\n const json = stringify(data);\n debug?.('save', data, json);\n void queue.run(async () => {\n await persist.storage.setItem(storageName(persist.id), json);\n }, true);\n },\n Math.max(0, lastSave.current + 1000 - Date.now()),\n );\n }, [isHydrated, data, queue]);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n async function clear() {\n clearTimeout(timer.current);\n timer.current = undefined;\n\n const { persist } = latest.current;\n if (!persist) return;\n\n await queue.run(async () => {\n await persist.storage.removeItem(storageName(persist.id));\n }, true);\n }\n\n return [isHydrated, clear] as const;\n}\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * State that can be controlled through a prop. Setting it reports the new value and only stores\n * it when uncontrolled, like a React <input>.\n */\nexport function useControllableState<V>(\n controlled: V | undefined,\n initial: () => V,\n onChange: ((value: V) => void) | undefined,\n) {\n const [internal, setInternal] = useState(initial);\n const value = controlled ?? internal;\n\n const latest = useRef({ controlled, onChange });\n useEffect(() => {\n latest.current = { controlled, onChange };\n });\n\n const [set] = useState(() => (next: V) => {\n latest.current.onChange?.(next);\n if (latest.current.controlled === undefined) {\n setInternal(next);\n }\n });\n\n return [value, set, setInternal] as const;\n}\n\n/**\n * Keeps a state normalized: renders use the normalized value right away, and an effect writes it\n * back (reporting it like any other change) when it differs. `normalize` must return its input\n * unchanged when there is nothing to fix, or this loops.\n */\nexport function useNormalized<V>(value: V, normalized: V, set: (value: V) => void) {\n useEffect(() => {\n if (normalized !== value) {\n set(normalized);\n }\n }, [value, normalized, set]);\n\n return normalized;\n}\n","import { useMemo, useState } from 'react';\nimport type { DisplaySize, Id, InternalColumn, InternalTableProps } from '../types';\nimport { useControllableState } from './useControllableState';\n\nexport function useColumns<T>(props: InternalTableProps<T>, displaySize: DisplaySize | undefined) {\n const [hiddenColumns, setHiddenColumns, setHiddenColumnsInternal] = useControllableState(\n props.hiddenColumns,\n () => props.defaultHiddenColumns ?? new Set<Id>(),\n props.onHiddenColumnsChange,\n );\n const [columnWidths, setColumnWidths] = useState(() => new Map<Id, string>());\n\n const allColumns = props.columns;\n\n const matchesDisplaySize = (column: InternalColumn<T, unknown>) =>\n displaySize === undefined ||\n column.displaySize === undefined ||\n column.displaySize.includes(displaySize);\n\n const columns = useMemo(() => allColumns.filter(matchesDisplaySize), [allColumns, displaySize]);\n\n const activeColumns = useMemo(\n () => allColumns.filter((column) => !(column.hidden ?? hiddenColumns.has(column.id))),\n [allColumns, hiddenColumns],\n );\n\n const visibleColumns = useMemo(\n () => activeColumns.filter(matchesDisplaySize),\n [activeColumns, displaySize],\n );\n\n return {\n hiddenColumns,\n setHiddenColumns,\n setHiddenColumnsInternal,\n columnWidths,\n setColumnWidths,\n columns,\n activeColumns,\n visibleColumns,\n };\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport { getAncestors } from '../misc/helpers';\nimport type { Id, InternalTableProps, TableItem } from '../types';\nimport { useControllableState, useNormalized } from './useControllableState';\n\nexport function useExpanded<T>(\n props: InternalTableProps<T>,\n itemsById: Map<Id, TableItem<T>>,\n matching: Set<Id> | undefined,\n) {\n const [value, setExpanded, setExpandedInternal] = useControllableState(\n props.expanded,\n () => props.defaultExpanded ?? new Set<Id>(),\n props.onExpandedChange,\n );\n\n const expandOnlyOne = props.expandOnlyOne && !(props.revealFiltered && matching);\n\n const normalized = useMemo(() => {\n let result = value;\n const add = (id: Id) => {\n if (result.has(id)) return;\n if (result === value) result = new Set(value);\n result.add(id);\n };\n\n if (expandOnlyOne && value.size > 1) {\n // Keep the deepest expanded item and its ancestors, collapse every other branch.\n const deepest = [...value]\n .map((id) => itemsById.get(id))\n .filter((item) => item !== undefined)\n .sort((a, b) => b.depth - a.depth)[0];\n const branch = deepest ? getAncestors(itemsById, deepest).add(deepest.id) : new Set<Id>();\n if ([...value].some((id) => !branch.has(id))) return branch;\n }\n\n for (const id of value) {\n const item = itemsById.get(id);\n if (item) getAncestors(itemsById, item).forEach(add);\n }\n\n if (props.items !== undefined) {\n for (const id of value) {\n if (!itemsById.has(id)) {\n if (result === value) result = new Set(value);\n result.delete(id);\n }\n }\n }\n\n return result;\n }, [value, itemsById, props.items, expandOnlyOne]);\n\n const expanded = useNormalized(value, normalized, setExpanded);\n\n // Once per filter result rather than in normalization, so revealed rows can be collapsed.\n const latest = useRef({ expanded, itemsById });\n useEffect(() => {\n latest.current = { expanded, itemsById };\n });\n useEffect(() => {\n if (!props.revealFiltered || !matching) return;\n const { expanded, itemsById } = latest.current;\n const next = new Set(expanded);\n for (const id of matching) {\n const parentId = itemsById.get(id)?.parentId;\n if (parentId !== undefined && parentId !== null) next.add(parentId);\n }\n if (next.size > expanded.size) setExpanded(next);\n }, [matching, props.revealFiltered, setExpanded]);\n\n return { expanded, expandOnlyOne, setExpanded, setExpandedInternal };\n}\n","import { useMemo } from 'react';\nimport type { Filter, Id, InternalColumn, InternalTableProps, TableItem } from '../types';\nimport { useControllableState } from './useControllableState';\n\nexport const isActiveFilter = (filter: Filter<any, any> | undefined, value: unknown) =>\n filter !== undefined &&\n value !== undefined &&\n value !== null &&\n filter.isActive(value, filter.options);\n\n/** Columns whose filters apply: the visible ones, or all with `enableHiddenColumnFilters`. */\nexport function filteredColumns<T>(\n props: InternalTableProps<T>,\n visibleColumns: InternalColumn<T, unknown>[],\n) {\n return props.enableHiddenColumnFilters ? props.columns : visibleColumns;\n}\n\n/** Adds controlled values and defaults. Returns `stored` itself when there are none. */\n// Outside the hook: React Compiler miscompiles the reassigned `result` into a memo that never hits.\nfunction withFilterDefaults(stored: Map<Id, unknown>, columns: InternalColumn<any, unknown>[]) {\n let result = stored;\n for (const { id, filter } of columns) {\n const value =\n filter?.value !== undefined || stored.has(id) ? filter?.value : filter?.defaultValue;\n if (value === undefined) continue;\n if (result === stored) result = new Map(stored);\n result.set(id, value);\n }\n return result;\n}\n\nexport function useFilters<T>(\n props: InternalTableProps<T>,\n visibleColumns: InternalColumn<T, unknown>[],\n items: TableItem<T>[],\n) {\n const [stored, setFilterValues, setFilterValuesInternal] = useControllableState(\n props.filterValues,\n () => props.defaultFilterValues ?? new Map<Id, unknown>(),\n props.onFilterValuesChange,\n );\n\n const filterValues = useMemo(\n () => withFilterDefaults(stored, props.columns),\n [stored, props.columns],\n );\n\n const applied = filteredColumns(props, visibleColumns);\n\n /** Ids of matching items and of all their ancestors; undefined when no filter is active. */\n const matching = useMemo(() => {\n const active = applied.flatMap((column) => {\n const { filter } = column;\n const value = filterValues.get(column.id);\n if (!filter || filter.external || !isActiveFilter(filter, value)) return [];\n return [{ column, filter, value }];\n });\n\n if (active.length === 0) return undefined;\n\n const result = new Set<Id>();\n // Children come after their parent, so walking backwards sees descendants first.\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i]!;\n const isMatch =\n result.has(item.id) ||\n active.every(({ column, filter, value }) =>\n filter.test(value, column.filterBy(column.value(item.value), item.value), filter.options),\n );\n\n if (isMatch) {\n result.add(item.id);\n if (item.parentId !== undefined && item.parentId !== null) result.add(item.parentId);\n }\n }\n return result;\n }, [applied, filterValues, items]);\n\n return { stored, filterValues, setFilterValues, setFilterValuesInternal, matching };\n}\n","import { useMemo } from 'react';\nimport type { InternalColumn, InternalTableProps } from '../types';\nimport { useControllableState, useNormalized } from './useControllableState';\n\ntype Criterion<T> = {\n key: (item: T) => unknown;\n direction: 1 | -1;\n collator: Intl.Collator;\n};\n\nconst collators = new Map<string, Intl.Collator>();\n\nfunction getCollator(locale: string | undefined, options: Intl.CollatorOptions | undefined) {\n const cacheKey = `${locale}|${JSON.stringify(options)}`;\n let collator = collators.get(cacheKey);\n if (!collator) {\n collator = new Intl.Collator(locale, options);\n collators.set(cacheKey, collator);\n }\n return collator;\n}\n\nexport function useSort<T>(\n props: InternalTableProps<T>,\n activeColumns: InternalColumn<T, unknown>[],\n) {\n const [value, setSort, setSortInternal] = useControllableState(\n props.sort,\n () => props.defaultSort ?? [],\n props.onSortChange,\n );\n\n const normalized = useMemo(() => {\n const filtered = value.filter((s) => activeColumns.some((column) => column.id === s.columnId));\n return filtered.length === value.length ? value : filtered;\n }, [value, activeColumns]);\n\n const sort = useNormalized(value, normalized, setSort);\n\n const criteria = useMemo(() => {\n if (props.externalSort) return [];\n\n return sort.flatMap((s): Criterion<T>[] => {\n const column = activeColumns.find((column) => column.id === s.columnId);\n if (!column) return [];\n\n return column.sortBy.map((sortBy) => ({\n key: (item: T) => sortBy(column.value(item), item),\n direction: s.direction === 'desc' ? -1 : 1,\n collator: getCollator(s.locale ?? props.locale, s.options),\n }));\n });\n }, [sort, activeColumns, props.externalSort, props.locale]);\n\n return { sort, setSort, setSortInternal, criteria };\n}\n\n/** Stable sort that evaluates each sort key once per item instead of once per comparison. */\nexport function sortBy<R>(records: R[], criteria: Criterion<any>[], getValue: (record: R) => any) {\n if (criteria.length === 0) return records;\n\n const keys = criteria.map((criterion) =>\n records.map((record) => criterion.key(getValue(record))),\n );\n const indices = records.map((_, index) => index);\n\n indices.sort((a, b) => {\n for (let i = 0; i < criteria.length; i++) {\n const { direction, collator } = criteria[i]!;\n const x = keys[i]![a];\n const y = keys[i]![b];\n\n if (typeof x === 'string' && typeof y === 'string') {\n const result = collator.compare(x, y);\n if (result !== 0) return result * direction;\n continue;\n }\n\n if ((x as any) > (y as any)) return direction;\n if ((x as any) < (y as any)) return -direction;\n }\n return a - b;\n });\n\n return indices.map((index) => records[index]!);\n}\n","import { useMemo } from 'react';\nimport type { Id, InternalTableProps, TableItem } from '../types';\nimport { sortBy } from './useSort';\nimport type { useSort } from './useSort';\n\ntype ItemRecord<T> = { id: Id; parentId: Id | undefined | null; value: T };\n\nconst isRoot = (parentId: Id | undefined | null) => parentId === undefined || parentId === null;\n\n/** All items, sorted, as a flattened tree. */\nexport function useItems<T>(\n props: InternalTableProps<T>,\n criteria: ReturnType<typeof useSort<T>>['criteria'],\n) {\n const { items: input, id, parentId } = props;\n\n const records = useMemo(\n () =>\n (input ?? []).map<ItemRecord<T>>((value) => ({\n id: id(value),\n parentId: parentId?.(value),\n value,\n })),\n [input, id, parentId],\n );\n\n const sorted = useMemo(\n () => sortBy(records, criteria, (record) => record.value),\n [records, criteria],\n );\n\n return useMemo(() => {\n const byId = new Map<Id, TableItem<T>>();\n for (const record of sorted) {\n byId.set(record.id, { ...record, children: [], depth: 0 });\n }\n\n const roots: TableItem<T>[] = [];\n for (const item of byId.values()) {\n if (isRoot(item.parentId)) {\n roots.push(item);\n } else {\n byId.get(item.parentId!)?.children.push(item);\n }\n }\n\n // Items whose parent is missing are dropped, like before: they are unreachable from a root.\n const items: TableItem<T>[] = [];\n const itemsById = new Map<Id, TableItem<T>>();\n const traverse = (level: TableItem<T>[], depth: number) => {\n for (const item of level) {\n item.depth = depth;\n items.push(item);\n itemsById.set(item.id, item);\n traverse(item.children, depth + 1);\n }\n };\n traverse(roots, 0);\n\n return { items, itemsById };\n }, [sorted]);\n}\n\n/** Items that pass the filters and whose ancestors are all expanded. */\nexport function useActiveItems<T>(\n items: TableItem<T>[],\n matching: Set<Id> | undefined,\n expanded: Set<Id>,\n) {\n return useMemo(() => {\n const activeItems: TableItem<T>[] = [];\n const activeItemsById = new Map<Id, TableItem<T>>();\n\n for (const item of items) {\n if (matching && !matching.has(item.id)) continue;\n if (\n !isRoot(item.parentId) &&\n !(activeItemsById.has(item.parentId!) && expanded.has(item.parentId!))\n ) {\n continue;\n }\n\n activeItems.push(item);\n activeItemsById.set(item.id, item);\n }\n\n return { activeItems, activeItemsById };\n }, [items, matching, expanded]);\n}\n","import { useMemo } from 'react';\nimport type { Id, InternalTableProps, TableItem } from '../types';\nimport { useControllableState, useNormalized } from './useControllableState';\n\nexport function useSelection<T>(\n props: InternalTableProps<T>,\n activeItems: TableItem<T>[],\n activeItemsById: Map<Id, TableItem<T>>,\n) {\n const [value, setSelection, setSelectionInternal] = useControllableState(\n props.selection,\n () => props.defaultSelection ?? new Set<Id>(),\n props.onSelectionChange,\n );\n\n const hasItems = props.items !== undefined;\n\n const normalized = useMemo(() => {\n let result = value;\n const copy = () => (result === value ? (result = new Set(value)) : result);\n\n if (props.selectSyncChildren) {\n for (const item of activeItems) {\n if (\n item.parentId !== undefined &&\n item.parentId !== null &&\n result.has(item.parentId) &&\n !result.has(item.id)\n ) {\n copy().add(item.id);\n }\n }\n }\n\n // Selection only covers what is shown: filtered out or collapsed items are deselected.\n if (hasItems) {\n for (const id of result) {\n if (!activeItemsById.has(id)) copy().delete(id);\n }\n }\n\n return result;\n }, [value, activeItems, activeItemsById, props.selectSyncChildren, hasItems]);\n\n const selection = useNormalized(value, normalized, setSelection);\n\n return { selection, setSelection, setSelectionInternal };\n}\n","export function defaultSerializer(x: unknown): string | number | Date {\n if (x instanceof Date || typeof x === 'number' || typeof x === 'string') {\n return x;\n }\n\n return JSON.stringify(x) ?? '';\n}\n","import { isValidElement } from 'react';\n\nconst isPlainObject = (x: object) => {\n const prototype = Object.getPrototypeOf(x);\n return prototype === Object.prototype || prototype === null;\n};\n\n/**\n * Structural equality for props. Functions and class instances compare by reference: keeping those\n * stable is up to the caller (or the React Compiler). React elements compare by type, key and props.\n */\nconst handlerTarget = Symbol('eventHandler');\n\ntype EventHandler<F> = F & { [handlerTarget]: F };\n\nconst isEventHandler = (x: unknown): x is EventHandler<(...args: any[]) => unknown> =>\n typeof x === 'function' && handlerTarget in x;\n\n/**\n * Wraps a callback that `deepEqual` compares like an event handler: any two are equal, so passing a\n * new function on every render doesn't make its object unequal. The previous one, which the\n * caller keeps, then calls the next one's function.\n */\nexport function eventHandler<F extends (...args: any[]) => unknown>(fn: F): F {\n const handler = ((...args: Parameters<F>) => handler[handlerTarget](...args)) as EventHandler<F>;\n handler[handlerTarget] = fn;\n return handler;\n}\n\n/** `a` is the next value, `b` the previous one, see `eventHandler`. */\nexport function deepEqual(a: unknown, b: unknown, depth = 0): boolean {\n if (Object.is(a, b)) return true;\n if (isEventHandler(a) && isEventHandler(b)) {\n b[handlerTarget] = a[handlerTarget];\n return true;\n }\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (depth > 20) return false;\n\n if (Array.isArray(a)) {\n return (\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((value, index) => deepEqual(value, b[index], depth + 1))\n );\n }\n\n if (a instanceof Set) {\n if (!(b instanceof Set) || a.size !== b.size) return false;\n for (const value of a) if (!b.has(value)) return false;\n return true;\n }\n\n if (a instanceof Map) {\n if (!(b instanceof Map) || a.size !== b.size) return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !deepEqual(value, b.get(key), depth + 1)) return false;\n }\n return true;\n }\n\n if (a instanceof Date) return b instanceof Date && a.getTime() === b.getTime();\n\n if (isValidElement(a)) {\n return (\n isValidElement(b) &&\n a.type === b.type &&\n a.key === b.key &&\n deepEqual(a.props, b.props, depth + 1)\n );\n }\n\n if (!isPlainObject(a) || !isPlainObject(b)) return false;\n\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) return false;\n return keys.every(\n (key) =>\n key in b &&\n deepEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n depth + 1,\n ),\n );\n}\n\n/** Same length and the same elements by reference. For large arrays like `items`. */\nexport function shallowArrayEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n","import { useMemo, useRef, useSyncExternalStore } from 'react';\nimport { defaultSerializer } from '../exporters/serializer';\nimport { deepEqual, shallowArrayEqual } from '../misc/equal';\nimport { asString, castArray } from '../misc/helpers';\nimport type {\n Column,\n DisplaySize,\n DisplaySizes,\n Id,\n InternalColumn,\n InternalTableProps,\n TableProps,\n} from '../types';\n\nconst defaultProps = {\n enableSelection: true,\n selectSyncChildren: true,\n stickyHeader: true,\n stickyFooter: true,\n enableColumnSelection: true,\n enableColumnResize: true,\n displaySizeOverrides: {\n mobile: {\n enableSelection: false,\n enableColumnSelection: false,\n enableExport: false,\n enableColumnResize: false,\n },\n },\n} satisfies Partial<TableProps<any>>;\n\nconst identity = (value: unknown) => value;\n\nconst defaultSortBy = (v: unknown) =>\n typeof v === 'number' || v instanceof Date ? v : asString(v);\n\nfunction normalizeId<T>(id: TableProps<T>['id']): (item: T) => Id {\n return id instanceof Function ? id : (item) => item[id] as Id;\n}\n\nfunction normalizeParentId<T>(\n parentId: TableProps<T>['parentId'],\n): ((item: T) => Id | undefined) | undefined {\n if (parentId === undefined) return undefined;\n return parentId instanceof Function ? parentId : (item) => item[parentId] as Id | undefined;\n}\n\nfunction normalizeColumns<T>(\n columns: TableProps<T>['columns'],\n defaultColumnProps: TableProps<T>['defaultColumnProps'],\n columnProps: TableProps<T>['columnProps'],\n disableSort: boolean | undefined,\n): InternalColumn<T, unknown>[] {\n const input =\n columns instanceof Function ? columns((value, column) => ({ ...column, value })) : columns;\n\n return input\n .filter((column): column is Column<T, unknown> => !!column)\n .map((column, index) => {\n const id = column.id ?? index;\n const defaults = { ...defaultColumnProps, ...columnProps?.(id) };\n const displaySize = column.displaySize ?? defaults.displaySize;\n\n return {\n id,\n header: column.header ?? defaults.header ?? null,\n exportHeader: column.exportHeader ?? defaults.exportHeader ?? id,\n footer: column.footer ?? defaults.footer ?? null,\n value: column.value,\n renderCell: column.renderCell ?? defaults.renderCell ?? asString,\n exportCell: column.exportCell ?? defaults.exportCell ?? defaultSerializer,\n sortBy: column.sortBy ?? defaults.sortBy ?? [defaultSortBy],\n disableSort: column.disableSort ?? defaults.disableSort ?? disableSort ?? false,\n deferred: column.deferred ?? defaults.deferred,\n hidden: column.hidden ?? defaults.hidden,\n classes: column.classes ?? defaults.classes,\n styles: column.styles ?? defaults.styles,\n filterBy: column.filterBy ?? defaults.filterBy ?? identity,\n filter: column.filter ?? defaults.filter,\n width: column.width ?? defaults.width,\n displaySize: displaySize !== undefined ? castArray(displaySize) : undefined,\n };\n });\n}\n\nfunction subscribeResize(onChange: () => void) {\n window.addEventListener('resize', onChange);\n return () => window.removeEventListener('resize', onChange);\n}\n\nfunction useDisplaySize(displaySize: DisplaySize | DisplaySizes | undefined) {\n const width = useSyncExternalStore(\n subscribeResize,\n () => window.innerWidth,\n () => undefined,\n );\n\n if (typeof displaySize !== 'object') return displaySize;\n if (width === undefined) return undefined;\n\n return Object.entries(displaySize).find(\n ([, maxWidth]) => maxWidth !== undefined && maxWidth >= width,\n )?.[0];\n}\n\nfunction definedOnly<T extends object>(object: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(object).filter(([, value]) => value !== undefined),\n ) as Partial<T>;\n}\n\n/**\n * Returns the previous props object while every prop is equal to the previous one: structurally,\n * with functions by reference, and `items` element by element. Parents creating equal objects,\n * Sets or arrays on each render then don't cause any recomputation.\n */\nfunction useStableProps<T>(raw: TableProps<T>): TableProps<T> {\n const previous = useRef<TableProps<T>>(undefined);\n const last = previous.current;\n\n if (last) {\n const keys = Object.keys(raw) as (keyof TableProps<T>)[];\n const isEqual =\n keys.length === Object.keys(last).length &&\n keys.every((key) =>\n key === 'items' ? shallowArrayEqual(raw[key], last[key]) : deepEqual(raw[key], last[key]),\n );\n if (isEqual) return last;\n }\n\n previous.current = raw;\n return raw;\n}\n\n/** Keeps the previous column objects (and array) for columns that are structurally unchanged. */\nfunction useStableColumns<T>(columns: InternalColumn<T, unknown>[]) {\n const previous = useRef<InternalColumn<T, unknown>[]>(undefined);\n const last = previous.current;\n if (!last || last === columns) {\n previous.current = columns;\n return columns;\n }\n\n const lastById = new Map(last.map((column) => [column.id, column]));\n const result = columns.map((column) => {\n const lastColumn = lastById.get(column.id);\n return lastColumn && deepEqual(column, lastColumn) ? lastColumn : column;\n });\n\n const isUnchanged =\n result.length === last.length && result.every((column, index) => column === last[index]);\n previous.current = isUnchanged ? last : result;\n return previous.current;\n}\n\n/**\n * Normalizes the props. Every derived value keeps its identity as long as its inputs do, so memos\n * downstream only recompute when the relevant props change.\n */\nexport function useTableProps<T>(input: TableProps<T>) {\n const raw = useStableProps(input);\n const displaySize = useDisplaySize(raw.displaySize);\n\n const id = useMemo(() => normalizeId(raw.id), [raw.id]);\n const parentId = useMemo(() => normalizeParentId(raw.parentId), [raw.parentId]);\n const columns = useStableColumns(\n useMemo(\n () => normalizeColumns(raw.columns, raw.defaultColumnProps, raw.columnProps, raw.disableSort),\n [raw.columns, raw.defaultColumnProps, raw.columnProps, raw.disableSort],\n ),\n );\n\n const displaySizeOverrides: TableProps<T>['displaySizeOverrides'] =\n raw.displaySizeOverrides ?? defaultProps.displaySizeOverrides;\n const override = displaySize !== undefined ? displaySizeOverrides[displaySize] : undefined;\n\n const overrideId = useMemo(\n () => (override?.id !== undefined ? normalizeId(override.id) : undefined),\n [override?.id],\n );\n const overrideParentId = useMemo(\n () => normalizeParentId(override?.parentId),\n [override?.parentId],\n );\n const overrideColumns = useMemo(\n () =>\n override?.columns !== undefined\n ? normalizeColumns(\n override.columns,\n override.defaultColumnProps ?? raw.defaultColumnProps,\n override.columnProps ?? raw.columnProps,\n override.disableSort ?? raw.disableSort,\n )\n : undefined,\n [\n override?.columns,\n override?.defaultColumnProps,\n override?.columnProps,\n override?.disableSort,\n raw.defaultColumnProps,\n raw.columnProps,\n raw.disableSort,\n ],\n );\n\n const props = useMemo(\n () =>\n ({\n ...defaultProps,\n ...definedOnly(raw),\n ...(override && definedOnly(override)),\n id: overrideId ?? id,\n parentId: overrideParentId ?? parentId,\n columns: overrideColumns ?? columns,\n }) as InternalTableProps<T>,\n [raw, override, id, parentId, columns, overrideId, overrideParentId, overrideColumns],\n );\n\n return { props, displaySize };\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTableTheme } from '../hooks/useTheme';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport type {\n Id,\n InternalColumn,\n TableActions,\n TableContextValue,\n TableProps,\n TableState,\n TableStructure,\n} from '../types';\nimport {\n isFilterValuePersisted,\n isPersisted,\n usePersistence,\n type PersistedData,\n} from './persistence';\nimport { useColumns } from './useColumns';\nimport { useExpanded } from './useExpanded';\nimport { useFilters } from './useFilters';\nimport { useActiveItems, useItems } from './useItems';\nimport { useSelection } from './useSelection';\nimport { useSort } from './useSort';\nimport { useTableProps } from './useTableProps';\n\nconst isControlledFilter = (columns: InternalColumn<any, unknown>[], columnId: Id) =>\n columns.find((column) => column.id === columnId)?.filter?.value !== undefined;\n\nfunction withEntry<K, V>(map: Map<K, V>, key: K, value: V | undefined) {\n const result = new Map(map);\n if (value === undefined) result.delete(key);\n else result.set(key, value);\n return result;\n}\n\n/** `isReset`: whether this state replaces one that got reset. */\nexport function useTable<T>(raw: TableProps<T>, onReset: () => void, isReset = false) {\n const { props, displaySize } = useTableProps(raw);\n const theme = useTableTheme(props);\n const columns = useColumns(props, displaySize);\n const sort = useSort(props, columns.activeColumns);\n const { items, itemsById } = useItems(props, sort.criteria);\n const filters = useFilters(props, columns.visibleColumns, items);\n const expanded = useExpanded(props, itemsById, filters.matching);\n const { activeItems, activeItemsById } = useActiveItems(\n items,\n filters.matching,\n expanded.expanded,\n );\n const selection = useSelection(props, activeItems, activeItemsById);\n\n const state: TableState<T> = {\n props,\n displaySize,\n sort: sort.sort,\n selection: selection.selection,\n expanded: expanded.expanded,\n hiddenColumns: columns.hiddenColumns,\n columnWidths: columns.columnWidths,\n filterValues: filters.filterValues,\n columns: columns.columns,\n activeColumns: columns.activeColumns,\n visibleColumns: columns.visibleColumns,\n items,\n itemsById,\n activeItems,\n activeItemsById,\n };\n\n const { persist } = props;\n const persistData = useMemo(() => {\n const data: PersistedData = {};\n if (!persist) return data;\n\n const add = (key: keyof PersistedData, value: unknown, isControlled = false) => {\n if (!isControlled && isPersisted(persist, key)) data[key] = value;\n };\n\n add('sort', sort.sort, props.sort !== undefined);\n add('selection', selection.selection, props.selection !== undefined);\n add('expanded', expanded.expanded, props.expanded !== undefined);\n add('hiddenColumns', columns.hiddenColumns, props.hiddenColumns !== undefined);\n add('columnWidths', columns.columnWidths);\n add(\n 'filterValues',\n new Map(\n [...filters.stored].filter(\n ([columnId]) =>\n isFilterValuePersisted(persist, columnId) &&\n !isControlledFilter(props.columns, columnId),\n ),\n ),\n props.filterValues !== undefined,\n );\n\n return data;\n }, [\n persist?.storage,\n persist?.id,\n JSON.stringify(persist?.include),\n JSON.stringify(persist?.exclude),\n sort.sort,\n selection.selection,\n expanded.expanded,\n columns.hiddenColumns,\n columns.columnWidths,\n filters.stored,\n props.columns,\n props.sort !== undefined,\n props.selection !== undefined,\n props.expanded !== undefined,\n props.hiddenColumns !== undefined,\n props.filterValues !== undefined,\n ]);\n\n const latest = useRef({ state, sort, selection, expanded, columns, filters, onReset });\n useLayoutEffect(() => {\n latest.current = { state, sort, selection, expanded, columns, filters, onReset };\n });\n\n function restore(data: PersistedData) {\n const { state, sort, selection, expanded, columns } = latest.current;\n const { props } = state;\n\n if (data.sort && props.sort === undefined) sort.setSort(data.sort);\n if (data.selection && props.selection === undefined) selection.setSelection(data.selection);\n if (data.expanded && props.expanded === undefined) expanded.setExpanded(data.expanded);\n if (data.hiddenColumns && props.hiddenColumns === undefined) {\n columns.setHiddenColumns(data.hiddenColumns);\n }\n if (data.columnWidths) columns.setColumnWidths(data.columnWidths);\n\n const filterValues = data.filterValues as Map<Id, unknown> | undefined;\n if (filterValues && props.filterValues === undefined) {\n const next = new Map(state.filterValues);\n for (const [columnId, value] of filterValues) {\n if (\n props.persist &&\n isFilterValuePersisted(props.persist, columnId) &&\n !isControlledFilter(props.columns, columnId)\n ) {\n next.set(columnId, value);\n }\n }\n commitFilterValues(next);\n }\n }\n\n useEffect(() => {\n if (!isReset) return;\n if (props.filterValues === undefined) props.onFilterValuesChange?.(filters.filterValues);\n\n for (const { id, filter } of props.columns) {\n filter?.onChange?.(filters.stored.has(id) ? filters.stored.get(id) : filter.defaultValue);\n }\n }, []);\n\n const [isHydrated, clearStorage] = usePersistence(persist, persistData, restore, props.debug);\n const clearStorageRef = useRef(clearStorage);\n clearStorageRef.current = clearStorage;\n\n const lastSelectedId = useRef<Id | undefined>(undefined);\n\n // `latest` only catches up after the next render.\n function patchState(patch: Partial<TableState<T>>) {\n latest.current = { ...latest.current, state: { ...latest.current.state, ...patch } };\n }\n\n /** Sets filter values and notifies the `onChange` of each filter whose value changed. */\n function commitFilterValues(next: Map<Id, unknown>) {\n const { state, filters } = latest.current;\n const previous = state.filterValues;\n filters.setFilterValues(next);\n patchState({ filterValues: next });\n\n for (const { id, filter } of state.props.columns) {\n const value = next.get(id);\n if (filter?.onChange && !Object.is(value, previous.get(id))) filter.onChange(value);\n }\n }\n\n const [actions] = useState((): TableActions<T> => {\n const get = () => latest.current;\n\n return {\n getState: () => get().state,\n\n setSort: (sort) => get().sort.setSort(sort),\n\n setSelection: (selection) => get().selection.setSelection(selection),\n\n toggleSelection(itemId, { range: isRange } = {}) {\n const { state, selection } = get();\n const { activeItems, activeItemsById, props } = state;\n const current = state.selection;\n\n const isSelected =\n itemId !== undefined\n ? current.has(itemId)\n : activeItems.length > 0 && activeItems.every((item) => current.has(item.id));\n\n let range;\n if (isRange && itemId !== undefined) {\n const b = activeItems.findIndex((item) => item.id === itemId);\n const last = lastSelectedId.current;\n const a = last !== undefined ? activeItems.findIndex((item) => item.id === last) : 0;\n range = activeItems.slice(Math.min(a < 0 ? b : a, b), Math.max(a, b) + 1);\n } else {\n const item = itemId !== undefined ? activeItemsById.get(itemId) : undefined;\n range = item ? [item] : activeItems;\n }\n\n const next = new Set(current);\n for (const item of range) {\n if (isSelected) next.delete(item.id);\n else next.add(item.id);\n }\n\n if (props.selectSyncChildren && isSelected) {\n for (const id of getAncestors(activeItemsById, ...range)) next.delete(id);\n for (const id of getDescendants(...range)) next.delete(id);\n }\n\n lastSelectedId.current = itemId;\n selection.setSelection(next);\n // A second action before the next render must build on this one.\n patchState({ selection: next });\n },\n\n setExpanded: (value) => get().expanded.setExpanded(value),\n\n toggleExpanded(itemId) {\n const { state, expanded } = get();\n const { activeItemsById } = state;\n const item = activeItemsById.get(itemId);\n const isExpanded = state.expanded.has(itemId);\n const next = new Set(state.expanded);\n\n if (expanded.expandOnlyOne) {\n next.clear();\n for (const id of item ? getAncestors(activeItemsById, item) : []) next.add(id);\n }\n\n if (isExpanded) {\n next.delete(itemId);\n for (const id of item ? getDescendants(item) : []) next.delete(id);\n } else {\n next.add(itemId);\n }\n\n expanded.setExpanded(next);\n patchState({ expanded: next });\n },\n\n setHiddenColumns: (hiddenColumns) => get().columns.setHiddenColumns(hiddenColumns),\n\n setColumnWidth(columnId, width) {\n get().columns.setColumnWidths((widths) => withEntry(widths, columnId, width));\n },\n\n setFilterValues: (filterValues) => commitFilterValues(filterValues),\n\n setFilterValue(columnId, value) {\n const next = new Map(get().state.filterValues);\n next.set(columnId, value);\n commitFilterValues(next);\n },\n\n clearFilters() {\n const { state } = get();\n const next = new Map(state.filterValues);\n for (const column of state.props.columns) {\n if (column.filter) next.set(column.id, undefined);\n }\n commitFilterValues(next);\n state.props.onReset?.('filters');\n },\n\n async resetTable() {\n await clearStorageRef.current();\n get().onReset();\n },\n };\n });\n const { sort: sortValue, hiddenColumns, columnWidths, filterValues } = state;\n const { columns: allColumns, activeColumns, visibleColumns } = state;\n const structure = useMemo(\n (): TableStructure<T> => ({\n props,\n displaySize,\n sort: sortValue,\n hiddenColumns,\n columnWidths,\n filterValues,\n columns: allColumns,\n activeColumns,\n visibleColumns,\n items,\n itemsById,\n actions,\n }),\n [\n props,\n displaySize,\n sortValue,\n hiddenColumns,\n columnWidths,\n filterValues,\n allColumns,\n activeColumns,\n visibleColumns,\n items,\n itemsById,\n actions,\n ],\n );\n\n const context = useMemo(\n (): TableContextValue<T> => ({\n ...structure,\n selection: state.selection,\n expanded: state.expanded,\n activeItems,\n activeItemsById,\n }),\n [structure, state.selection, state.expanded, activeItems, activeItemsById],\n );\n\n return {\n context,\n structure,\n actions,\n theme,\n isHydrated,\n setSortInternal: sort.setSortInternal,\n setSelectionInternal: selection.setSelectionInternal,\n setExpandedInternal: expanded.setExpandedInternal,\n setHiddenColumnsInternal: columns.setHiddenColumnsInternal,\n setFilterValuesInternal: filters.setFilterValuesInternal,\n };\n}\n","import { useImperativeHandle, type Ref } from 'react';\nimport type { TableRef } from '../types';\nimport type { useTable } from './useTable';\n\n/** The setters bypass the on*Change callbacks, as they always have. */\nexport function useTableImperativeHandle(\n ref: Ref<TableRef> | undefined,\n table: ReturnType<typeof useTable<any>>,\n) {\n const { actions } = table;\n\n useImperativeHandle(\n ref,\n () => ({\n getSort: () => actions.getState().sort,\n setSort: table.setSortInternal,\n getSelection: () => actions.getState().selection,\n setSelection: table.setSelectionInternal,\n getExpanded: () => actions.getState().expanded,\n setExpanded: table.setExpandedInternal,\n getHiddenColumns: () => actions.getState().hiddenColumns,\n setHiddenColumns: table.setHiddenColumnsInternal,\n getFilterValues: () => actions.getState().filterValues,\n setFilterValues: table.setFilterValuesInternal,\n }),\n [actions],\n );\n}\n","import { useCallback, useRef, useState } from 'react';\nimport type { TableProps } from '../types';\n\n/** Resetting remounts the table state under a new key and reports the defaults. */\nexport function useTableReset<T>(props: TableProps<T>) {\n const [resetKey, setResetKey] = useState(0);\n const latestProps = useRef(props);\n latestProps.current = props;\n\n const onReset = useCallback(() => {\n const props = latestProps.current;\n setResetKey((key) => key + 1);\n\n if (props.sort === undefined) props.onSortChange?.(props.defaultSort ?? []);\n if (props.expanded === undefined) props.onExpandedChange?.(props.defaultExpanded ?? new Set());\n if (props.selection === undefined) {\n props.onSelectionChange?.(props.defaultSelection ?? new Set());\n }\n if (props.hiddenColumns === undefined) {\n props.onHiddenColumnsChange?.(props.defaultHiddenColumns ?? new Set());\n }\n props.onReset?.('table');\n }, []);\n\n return [resetKey, onReset] as const;\n}\n","import type React from 'react';\nimport { useEffect, useRef, type HTMLProps } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\n\nexport const columnWidthVariable = (index: number) => `--column-width-${index}`;\n\nexport function ResizeHandle() {\n const { props, visibleColumns, actions } = useTableStructure();\n const columnId = useColumnContext();\n const enabled = props.enableColumnResize;\n const index = visibleColumns.findIndex((column) => column.id === columnId);\n const table = useRef<HTMLElement | null>(null);\n const hasMoved = useRef(false);\n\n // The drag width lives in a CSS variable, keyed by visible index, so dragging renders nothing.\n const variable = columnWidthVariable(index);\n useEffect(\n () => () => {\n table.current?.style.removeProperty(variable);\n },\n [variable],\n );\n\n function onPointerDown(event: React.PointerEvent<HTMLDivElement>) {\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n table.current = event.currentTarget.closest('[data-schummar-table]');\n hasMoved.current = false;\n }\n\n function widthAt(event: React.PointerEvent<HTMLDivElement>) {\n const header = event.currentTarget.parentElement!;\n const minWidth = visibleColumns.find((column) => column.id === columnId)?.filter ? 80 : 50;\n return Math.max(event.clientX - header.getBoundingClientRect().left + 5, minWidth);\n }\n\n function onPointerMove(event: React.PointerEvent<HTMLDivElement>) {\n event.stopPropagation();\n if (!event.currentTarget.hasPointerCapture(event.pointerId)) return;\n hasMoved.current = true;\n table.current?.style.setProperty(variable, `${widthAt(event)}px`);\n }\n\n function onPointerUp(event: React.PointerEvent<HTMLDivElement>) {\n event.stopPropagation();\n if (!event.currentTarget.hasPointerCapture(event.pointerId)) return;\n event.currentTarget.releasePointerCapture(event.pointerId);\n // The committed width renders before the next paint, so dropping the variable doesn't flash.\n table.current?.style.removeProperty(variable);\n if (hasMoved.current) actions.setColumnWidth(columnId, `${widthAt(event)}px`);\n }\n\n function onDoubleClick(event: React.MouseEvent) {\n actions.setColumnWidth(columnId, event.getModifierState('Control') ? undefined : 'max-content');\n }\n\n if (!enabled) {\n return null;\n }\n\n return (\n <ResizeHandleView\n enabled={enabled}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onDoubleClick={onDoubleClick}\n />\n );\n}\n\nexport function ResizeHandleView({\n enabled,\n ...props\n}: HTMLProps<HTMLDivElement> & { enabled?: boolean | 'visualOnly' }) {\n const className = useTheme((theme) => theme.classes?.columnDivider);\n const styles = useTheme((theme) => theme.styles?.columnDivider);\n\n return (\n <div\n className={className}\n css={[\n {\n alignSelf: 'stretch',\n padding: '0 5px',\n cursor: enabled === true ? 'col-resize' : 'initial',\n display: 'flex',\n alignItems: 'center',\n\n '&:after': {\n content: '\"\"',\n width: 1,\n height: '1.5em',\n background: '#c9cfda',\n transition: 'transform 300ms',\n },\n\n '@media (pointer: coarse)': {\n pointerEvents: 'none',\n },\n },\n styles,\n ]}\n {...props}\n />\n );\n}\n","import { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\n\nconst FRAME_BUDGET_MS = 8;\n\ninterface Task {\n rowIndex: number;\n reveal: () => void;\n}\n\n/**\n * Spreads the rendering of deferred cells over time, a row at a time. Rows render synchronously until\n * the current frame's budget is used up; the deferred cells of the rest show a placeholder and get\n * revealed here, visible rows first, in slices of the same budget. Slices run as separate tasks, so the browser paints and handles input\n * in between, like React's own scheduler.\n */\nexport class CellScheduler {\n private frameStart: number | undefined;\n private queue = new Set<Task>();\n private visible = { start: 0, end: Infinity };\n private isScheduled = false;\n private channel: MessageChannel | undefined;\n // Pessimistic until measured, so the first batch is a single row.\n private costPerRow = FRAME_BUDGET_MS;\n\n /** Called while rendering a row for the first time: whether it may render right away. */\n claim(): boolean {\n const now = performance.now();\n if (this.frameStart === undefined) {\n this.frameStart = now;\n requestAnimationFrame(() => {\n this.frameStart = undefined;\n });\n }\n return now - this.frameStart < FRAME_BUDGET_MS;\n }\n\n /** Returns a function that removes the task again, e.g. when its cell unmounts. */\n enqueue(task: Task) {\n this.queue.add(task);\n this.schedule();\n return () => {\n this.queue.delete(task);\n };\n }\n\n setVisibleRange(start: number, end: number) {\n this.visible = { start, end };\n }\n\n dispose() {\n this.queue.clear();\n }\n\n private schedule() {\n if (this.isScheduled) return;\n this.isScheduled = true;\n if (!this.channel) {\n this.channel = new MessageChannel();\n this.channel.port1.onmessage = this.run;\n }\n this.channel.port2.postMessage(null);\n }\n\n private isVisible(task: Task) {\n return task.rowIndex >= this.visible.start && task.rowIndex <= this.visible.end;\n }\n\n private next(count: number) {\n return [...this.queue]\n .sort(\n (a, b) => Number(this.isVisible(b)) - Number(this.isVisible(a)) || a.rowIndex - b.rowIndex,\n )\n .slice(0, count);\n }\n\n private run = () => {\n this.isScheduled = false;\n const start = performance.now();\n\n while (this.queue.size > 0) {\n const remaining = FRAME_BUDGET_MS - (performance.now() - start);\n if (remaining <= 0) break;\n\n const batch = this.next(Math.max(1, Math.floor(remaining / this.costPerRow)));\n const batchStart = performance.now();\n flushSync(() => {\n for (const task of batch) {\n this.queue.delete(task);\n task.reveal();\n }\n });\n const cost = (performance.now() - batchStart) / batch.length;\n this.costPerRow = this.costPerRow * 0.7 + cost * 0.3;\n }\n\n if (this.queue.size > 0) this.schedule();\n };\n}\n\nexport const CellSchedulerContext = createContext<CellScheduler | null>(null);\n\nexport function useCellScheduler() {\n const [scheduler] = useState(() => new CellScheduler());\n useEffect(() => () => scheduler.dispose(), [scheduler]);\n return scheduler;\n}\n\n/** Whether a row with deferred cells renders them. Once revealed, it stays revealed. */\nexport function useReveal(deferred: boolean, rowIndex: number) {\n const scheduler = useContext(CellSchedulerContext);\n const [revealed, setRevealed] = useState(() => !deferred || !scheduler || scheduler.claim());\n const task = useRef<Task>({ rowIndex, reveal: () => setRevealed(true) });\n task.current.rowIndex = rowIndex;\n\n useEffect(() => {\n if (revealed || !scheduler) return;\n return scheduler.enqueue(task.current);\n }, [revealed, scheduler]);\n\n return revealed;\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { memo, useLayoutEffect } from 'react';\nimport type { InternalColumn } from '../types';\nimport type { RowConfig } from './row';\n\nfunction wrapText(content: ReactNode, className: string) {\n if (typeof content === 'string') {\n return (\n <span className={className} title={content}>\n {content}\n </span>\n );\n }\n return content;\n}\n\nexport const Cell = memo(function Cell<T>({\n column,\n placeholder,\n value,\n rowIndex,\n config,\n}: {\n column: InternalColumn<T, unknown>;\n /** A deferred cell whose row hasn't been revealed yet. */\n placeholder: boolean;\n value: T;\n rowIndex: number;\n config: RowConfig<T>;\n}) {\n const { styles, wrapCell } = config;\n const className = styles.cells.get(column.id)!(value, rowIndex);\n\n useLayoutEffect(() => {\n config.debugRender(placeholder ? 'defer cell' : 'render cell', column.id);\n });\n\n if (placeholder) {\n return (\n <div\n className={className}\n data-deferred=\"\"\n style={{ boxSizing: 'border-box', minHeight: config.placeholderHeight }}\n />\n );\n }\n\n const columnValue = column.value(value);\n const content = column.renderCell(columnValue, value);\n\n return (\n <div className={className}>\n {wrapCell ? wrapCell(content, columnValue, value, rowIndex) : wrapText(content, styles.text)}\n </div>\n );\n}) as <T>(props: {\n column: InternalColumn<T, unknown>;\n placeholder: boolean;\n value: T;\n rowIndex: number;\n config: RowConfig<T>;\n}) => ReactElement;\n","import type { RowConfig } from './row';\n\nexport function Details<T>({\n value,\n rowIndex,\n config,\n}: {\n value: T;\n rowIndex: number;\n config: RowConfig<T>;\n}) {\n const { rowDetails, styles } = config;\n const details = rowDetails instanceof Function ? rowDetails(value, rowIndex) : rowDetails;\n if (!details) return null;\n\n return <div className={styles.details(value, rowIndex)}>{details}</div>;\n}\n","import { css } from '@emotion/react';\nimport type { MouseEvent, ReactElement } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableActions } from '../state/context';\nimport { useLibraryClassName } from '../theme/emotion';\nimport type { Id } from '../types';\n\nconst spinnerCss = css({ margin: '0 var(--spacing)' });\n\nconst chevronCss = css({\n display: 'inline-flex',\n transition: 'all 300ms',\n transform: 'rotate3d(0, 0, 1, 0deg)',\n});\n\nconst expandedChevronCss = css({ transform: 'rotate3d(0, 0, 1, 90deg)' });\n\nexport function ExpandControl({\n itemId,\n expanded,\n hasChildren,\n hasDeferredChildren,\n}: {\n itemId: Id;\n expanded: boolean;\n hasChildren: boolean;\n hasDeferredChildren?: boolean;\n}): ReactElement {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Spinner = useTheme((t) => t.components.Spinner);\n const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n const actions = useTableActions();\n const libraryClass = useLibraryClassName();\n\n function toggle(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n actions.toggleExpanded(itemId);\n }\n\n if (expanded && hasDeferredChildren && !hasChildren) {\n return <Spinner className={libraryClass(spinnerCss)} />;\n }\n\n return (\n <IconButton onClick={toggle}>\n <span className={libraryClass(chevronCss, expanded && expandedChevronCss)}>\n <ChevronRight />\n </span>\n </IconButton>\n );\n}\n","import { css } from '@emotion/react';\nimport type React from 'react';\nimport { useLibraryClassName } from '../theme/emotion';\n\nconst wrapperCss = css({ display: 'contents' });\n\n/** Rows may be wrapped in links. Theme checkboxes only guarantee that clicks on the input itself\n * toggle; a click on their padding would reach the link instead. */\nexport function CatchClicks({\n onToggle,\n children,\n}: {\n onToggle: (event: React.MouseEvent) => void;\n children: React.ReactNode;\n}) {\n const libraryClass = useLibraryClassName();\n\n return (\n <span\n className={libraryClass(wrapperCss)}\n onClick={(event) => {\n event.stopPropagation();\n if (!(event.target instanceof HTMLInputElement)) {\n event.preventDefault();\n onToggle(event);\n }\n }}\n >\n {children}\n </span>\n );\n}\n","import { css } from '@emotion/react';\nimport { memo, useContext } from 'react';\nimport type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { SelectionContext, useTableActions, useTableContext } from '../state/context';\nimport { useUserClassName } from '../theme/emotion';\nimport type { Id } from '../types';\nimport { CatchClicks } from './catchClicks';\n\n// In the app cache, like a user override, so it beats the theme Checkbox's own colour.\nconst checkboxCss = css({ justifySelf: 'start', color: '#c9cfda' });\n\nexport const SelectComponent = memo(function SelectComponent({ itemId }: { itemId: Id }) {\n const selected = useContext(SelectionContext).has(itemId);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const overrideClass = useUserClassName();\n const actions = useTableActions();\n\n return (\n <CatchClicks onToggle={(event) => actions.toggleSelection(itemId, { range: event.shiftKey })}>\n <Checkbox\n className={overrideClass(checkboxCss)}\n checked={selected}\n onChange={(event: React.ChangeEvent) =>\n actions.toggleSelection(itemId, { range: (event.nativeEvent as MouseEvent).shiftKey })\n }\n />\n </CatchClicks>\n );\n});\n\nexport function SelectAll() {\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const overrideClass = useUserClassName();\n const { activeItems, selection, actions } = useTableContext();\n const selected = activeItems.length > 0 && activeItems.every((item) => selection.has(item.id));\n\n return (\n <CatchClicks onToggle={() => actions.toggleSelection(undefined)}>\n <Checkbox\n className={overrideClass(checkboxCss)}\n checked={selected}\n onChange={() => actions.toggleSelection(undefined)}\n />\n </CatchClicks>\n );\n}\n","import { memo, useLayoutEffect, type ReactElement, type ReactNode, type RefCallback } from 'react';\nimport { ColumnContext } from '../state/context';\nimport type { Id, InternalColumn, TableProps, WrapRowProps } from '../types';\nimport { Cell } from './cell';\nimport { useReveal } from './cellScheduler';\nimport { Details } from './details';\nimport { ExpandControl } from './expandControl';\nimport type { RowStyles } from './rowStyles';\nimport { SelectComponent } from './selectComponent';\n\n/** Everything rows need from the table props. Changing it renders every row. */\nexport interface RowConfig<T> {\n styles: RowStyles<T>;\n /** Columns whose cells render progressively. */\n deferredColumns: Set<Id>;\n placeholderHeight: number;\n columns: InternalColumn<T, unknown>[];\n enableSelection: boolean | undefined;\n rowAction: TableProps<T>['rowAction'];\n rowDetails: TableProps<T>['rowDetails'];\n wrapRow: TableProps<T>['wrapRow'];\n wrapCell: TableProps<T>['wrapCell'];\n hasDeferredChildren: TableProps<T>['hasDeferredChildren'];\n debugRender: (...output: any) => void;\n}\n\ninterface RowProps<T> {\n id: Id;\n value: T;\n rowIndex: number;\n depth: number;\n hasChildren: boolean;\n expanded: boolean;\n config: RowConfig<T>;\n measureRef?: RefCallback<HTMLElement>;\n}\n\nconst defaultWrapRow = (props: WrapRowProps) => <div {...props} />;\n\nexport const Row = memo(function Row<T>({\n id,\n value,\n rowIndex,\n depth,\n hasChildren,\n expanded,\n config,\n measureRef,\n}: RowProps<T>): ReactElement {\n const { styles, columns, enableSelection, rowAction, rowDetails, hasDeferredChildren } = config;\n const wrapRow = config.wrapRow ?? defaultWrapRow;\n\n useLayoutEffect(() => {\n config.debugRender('render row', id);\n });\n\n const fillClassName = styles.fillCell(value, rowIndex);\n const revealed = useReveal(config.deferredColumns.size > 0, rowIndex);\n const deferred = hasDeferredChildren?.(value) ?? false;\n const action = rowAction instanceof Function ? rowAction(value, rowIndex) : rowAction;\n const hasDetails = rowDetails instanceof Function ? !!rowDetails(value, rowIndex) : !!rowDetails;\n\n const children: ReactNode = (\n <>\n <div className={fillClassName} />\n\n <div className={styles.firstCell(value, rowIndex)}>\n {depth > 0 && <div style={{ width: depth * 20 }} />}\n\n {enableSelection && <SelectComponent itemId={id} />}\n\n {(hasChildren || deferred || hasDetails) && (\n <ExpandControl\n itemId={id}\n expanded={expanded}\n hasChildren={hasChildren}\n hasDeferredChildren={deferred}\n />\n )}\n\n {action}\n </div>\n\n {columns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <Cell\n column={column}\n placeholder={!revealed && config.deferredColumns.has(column.id)}\n value={value}\n rowIndex={rowIndex}\n config={config}\n />\n </ColumnContext.Provider>\n ))}\n\n <div className={fillClassName} />\n\n {expanded && hasDetails && <Details value={value} rowIndex={rowIndex} config={config} />}\n </>\n );\n\n return wrapRow(\n {\n ref: measureRef ?? null,\n 'data-index': rowIndex,\n className: styles.row(value, rowIndex),\n children,\n },\n value,\n rowIndex,\n ) as ReactElement;\n}) as <T>(props: RowProps<T>) => ReactElement;\n","import { css, type Interpolation } from '@emotion/react';\nimport { useMemo } from 'react';\nimport { columnTheme } from '../hooks/useTheme';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useLibraryClassName, useUserClassName } from '../theme/emotion';\nimport type { Id, InternalColumn, TableTheme } from '../types';\n\ntype ClassOf<T> = (value: T, index: number) => string;\n\n/** Class names for everything a row renders, resolved once per theme and column change. */\nexport interface RowStyles<T> {\n row: ClassOf<T>;\n fillCell: ClassOf<T>;\n firstCell: ClassOf<T>;\n cells: Map<Id, ClassOf<T>>;\n details: ClassOf<T>;\n text: string;\n}\n\nconst rowCss = css({ gridColumn: '1 / -1', display: 'grid', gridTemplateColumns: 'subgrid' });\n\nexport function useRowStyles<T>(\n theme: TableTheme<T>,\n columns: InternalColumn<T, unknown>[],\n): RowStyles<T> {\n const libraryClass = useLibraryClassName();\n const userClass = useUserClassName();\n\n return useMemo(() => {\n // Static parts are resolved here; only function classes and styles run per row or cell.\n const cellClassOf = ({ classes, styles }: TableTheme<T>, baseClass: string): ClassOf<T> => {\n const { cell: cellClass, evenCell, oddCell } = classes ?? {};\n const { cell: cellStyle, evenCell: evenStyle, oddCell: oddStyle } = styles ?? {};\n\n if (!(cellClass instanceof Function) && !(cellStyle instanceof Function)) {\n const even = cx(baseClass, cellClass, evenCell, userClass(cellStyle, evenStyle));\n const odd = cx(baseClass, cellClass, oddCell, userClass(cellStyle, oddStyle));\n return (_value, index) => (index % 2 === 0 ? even : odd);\n }\n\n return (value, index) => {\n const isEven = index % 2 === 0;\n return cx(\n baseClass,\n cellClass instanceof Function ? cellClass(value, index) : cellClass,\n isEven ? evenCell : oddCell,\n userClass(\n cellStyle instanceof Function ? cellStyle(value, index) : cellStyle,\n isEven ? evenStyle : oddStyle,\n ),\n );\n };\n };\n\n const elementClassOf = (\n baseClass: string,\n className: string | ((value: T, index: number) => string | undefined) | undefined,\n style: Interpolation<any> | ((value: T, index: number) => Interpolation<any>),\n ): ClassOf<T> => {\n if (!(className instanceof Function) && !(style instanceof Function)) {\n const result = cx(baseClass, className, userClass(style));\n return () => result;\n }\n return (value, index) =>\n cx(\n baseClass,\n className instanceof Function ? className(value, index) : className,\n userClass(style instanceof Function ? style(value, index) : style),\n );\n };\n\n const cellBase = libraryClass(defaultClasses.cell);\n\n return {\n row: elementClassOf(libraryClass(rowCss), theme.classes?.row, theme.styles?.row),\n fillCell: cellClassOf(theme, libraryClass(defaultClasses.cellFill)),\n firstCell: cellClassOf(theme, libraryClass(defaultClasses.cell, defaultClasses.firstCell)),\n cells: new Map(\n columns.map((column) => [column.id, cellClassOf(columnTheme(theme, column), cellBase)]),\n ),\n details: elementClassOf(\n libraryClass(defaultClasses.details),\n theme.classes?.details,\n theme.styles?.details,\n ),\n text: libraryClass(defaultClasses.text),\n };\n }, [libraryClass, userClass, theme, columns]);\n}\n","import { useTheme } from '../hooks/useTheme';\nimport { useTableActions } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport default function ClearFiltersButton<T>() {\n const Button = useTheme((t) => t.components.Button);\n const textClearFilters = useTheme((t) => t.text.clearFilters);\n const actions = useTableActions<T>();\n\n return (\n <div css={defaultClasses.clearFiltersButton}>\n <Button variant=\"outlined\" onClick={() => actions.clearFilters()}>\n {textClearFilters}\n </Button>\n </div>\n );\n}\n","import { columnTheme, useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport function ColumnFooter() {\n const columnId = useColumnContext();\n const { activeColumns } = useTableStructure();\n const column = activeColumns.find((column) => column.id === columnId);\n const { classes, styles } = useTheme((theme) => columnTheme(theme, column));\n\n return (\n <div className={classes?.footerCell} css={[defaultClasses.footerCell, styles?.footerCell]}>\n {column?.footer}\n </div>\n );\n}\n","import { memo } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { ColumnContext, useTableStructure } from '../state/context';\nimport { filteredColumns, isActiveFilter } from '../state/useFilters';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport ClearFiltersButton from './clearFiltersButton';\nimport { ColumnFooter } from './columnFooter';\n\n// Memoized so that rendering the rows (e.g. on selection) leaves it alone.\nexport const TableFooter = memo(function TableFooter() {\n const { props, visibleColumns, activeColumns, filterValues } = useTableStructure();\n const classes = useTheme((t) => t.classes?.footerCell);\n const styles = useTheme((t) => t.styles?.footerCell);\n const { stickyFooter, enableClearFiltersButton } = props;\n\n const hasActiveFilters = filteredColumns(props, visibleColumns).some((column) =>\n isActiveFilter(column.filter, filterValues.get(column.id)),\n );\n const hasFooter = activeColumns.some((column) => column.footer);\n\n return (\n <>\n {enableClearFiltersButton && hasActiveFilters && <ClearFiltersButton />}\n\n {hasFooter && (\n <div\n css={[\n { gridColumn: '1 / -1', display: 'grid', gridTemplateColumns: 'subgrid' },\n stickyFooter && defaultClasses.stickyBottom,\n stickyFooter instanceof Object && stickyFooter,\n ]}\n >\n <div className={classes} css={[defaultClasses.footerFill, styles]} />\n <div className={classes} css={[defaultClasses.footerFill, styles]} />\n\n {visibleColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnFooter />\n </ColumnContext.Provider>\n ))}\n\n <div className={classes} css={[defaultClasses.footerFill, styles]} />\n </div>\n )}\n </>\n );\n});\n","import { useEffect, useMemo, useState, type ReactElement } from 'react';\nimport { debounce } from '../misc/debounce';\nimport { toSingles, uniq } from '../misc/helpers';\nimport { useTableStructure } from '../state/context';\nimport type { InternalColumn } from '../types';\n\n/** Renders a column's filter UI. Changes apply after the filter's `debounce`, or on unmount. */\nexport function FilterPanel<T>({\n column,\n close,\n}: {\n column: InternalColumn<T, unknown>;\n close: () => void;\n}): ReactElement | null {\n const { filterValues, items, actions } = useTableStructure<T>();\n const [draft, setDraft] = useState<{ value: unknown }>();\n const { filter } = column;\n const delay = filter?.debounce ?? 0;\n\n const commit = useMemo(\n () =>\n debounce((value: unknown) => {\n actions.setFilterValue(column.id, value);\n setDraft(undefined);\n }, delay),\n [actions, column.id, delay],\n );\n\n useEffect(() => () => commit.flush(), [commit]);\n\n const getValues = useMemo(() => {\n let values: unknown[] | undefined;\n return () =>\n (values ??= uniq(\n items.flatMap((item) =>\n toSingles(column.filterBy(column.value(item.value), item.value) as unknown[]),\n ),\n ));\n }, [items, column]);\n\n if (!filter) return null;\n\n function onChange(value: unknown) {\n if (delay > 0) {\n setDraft({ value });\n commit(value);\n } else {\n actions.setFilterValue(column.id, value);\n }\n }\n\n const { Component } = filter;\n\n return (\n <Component\n value={draft ? draft.value : filterValues.get(column.id)}\n onChange={onChange}\n close={close}\n options={filter.options}\n getValues={getValues}\n />\n );\n}\n","import { ClassNames } from '@emotion/react';\nimport { useState, type ReactElement } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\nimport { isActiveFilter } from '../state/useFilters';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { InternalColumn } from '../types';\nimport { FilterPanel } from './filterPanel';\n\nexport function FilterControl<T>(): ReactElement | null {\n const { filterValues, visibleColumns, actions } = useTableStructure<T>();\n const columnId = useColumnContext();\n const column = visibleColumns.find((column) => column.id === columnId);\n\n const IconButton = useTheme((t) => t.components.IconButton);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const ArrowDropDown = useTheme((t) => t.icons.ArrowDropDown);\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n if (!column?.filter) return null;\n\n const isActive = isActiveFilter(column.filter, filterValues.get(columnId));\n\n return (\n <>\n <IconButton\n onClick={(event) => setAnchor(event.currentTarget)}\n onContextMenu={(event) => {\n actions.setFilterValue(columnId, undefined);\n event.preventDefault();\n return false;\n }}\n css={[{ color: '#b0bac9' }, isActive && { color: 'var(--primaryMain) !important' }]}\n >\n {isActive ? <FilterList /> : <ArrowDropDown />}\n </IconButton>\n\n {anchor && (\n <FilterPopover anchor={anchor} onClose={() => setAnchor(null)} column={column}>\n <FilterPanel column={column} close={() => setAnchor(null)} />\n </FilterPopover>\n )}\n </>\n );\n}\n\nexport function FilterPopover<T>({\n anchor,\n onClose,\n column,\n children,\n}: {\n anchor: Element;\n onClose: () => void;\n column?: InternalColumn<T, unknown>;\n children: React.ReactNode;\n}): ReactElement {\n const Popover = useTheme((t) => t.components.Popover);\n const classes = useTheme((t) => t.classes);\n const styles = useTheme((t) => t.styles);\n const cssVariables = useCssVariables();\n const filterClassNames = column?.filter?.classNames;\n\n return (\n // Keeps pointer events from reaching the header, e.g. the resize handle.\n <div\n onPointerDown={(event) => event.stopPropagation()}\n onPointerMove={(event) => event.stopPropagation()}\n >\n <ClassNames>\n {({ css, cx }) => (\n <Popover\n open\n onClose={onClose}\n anchorEl={anchor}\n css={[cssVariables, styles?.popover]}\n className={cx(classes?.popover, filterClassNames?.popover)}\n backdropClassName={cx(\n classes?.popoverBackdrop,\n filterClassNames?.popoverBackdrop,\n css(styles?.popoverBackdrop),\n )}\n >\n {children}\n </Popover>\n )}\n </ClassNames>\n </div>\n );\n}\n","import { useState, type ReactElement } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStructure } from '../state/context';\nimport { isActiveFilter } from '../state/useFilters';\nimport type { Id } from '../types';\nimport { FilterPanel } from './filterPanel';\nimport { FilterPopover } from './filterControl';\n\n/** Lets users edit the filters of columns that are not visible, see `enableHiddenColumnFilters`. */\nexport function HiddenColumnFilters<T>(): ReactElement | null {\n const { props, visibleColumns, filterValues, actions } = useTableStructure<T>();\n const IconButton = useTheme((t) => t.components.IconButton);\n const Button = useTheme((t) => t.components.Button);\n const FilterList = useTheme((t) => t.icons.FilterList);\n const title = useTheme((t) => t.text.hiddenColumnFilters);\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n const [selected, setSelected] = useState<Id>();\n\n const columns = props.columns.filter(\n (column) => column.filter && !visibleColumns.some((visible) => visible.id === column.id),\n );\n if (columns.length === 0) return null;\n\n const isActive = (columnId: Id) =>\n isActiveFilter(\n columns.find((column) => column.id === columnId)?.filter,\n filterValues.get(columnId),\n );\n const anyActive = columns.some((column) => isActive(column.id));\n const selectedColumn = columns.find((column) => column.id === selected);\n\n function close() {\n setAnchor(null);\n setSelected(undefined);\n }\n\n const color = (active: boolean) => (active ? 'var(--primaryMain)' : '#b0bac9');\n\n return (\n <>\n <IconButton\n onClick={(event) => setAnchor(event.currentTarget)}\n css={{ color: color(anyActive) }}\n >\n <FilterList />\n </IconButton>\n\n {anchor && (\n <FilterPopover anchor={anchor} onClose={close} column={selectedColumn}>\n {selectedColumn ? (\n <div css={{ display: 'grid' }}>\n <Button\n onClick={() => setSelected(undefined)}\n css={{ justifyContent: 'flex-start', color: 'inherit' }}\n >\n ‹ {selectedColumn.header}\n </Button>\n <FilterPanel key={selectedColumn.id} column={selectedColumn} close={close} />\n </div>\n ) : (\n <div\n css={{ padding: 'calc(var(--spacing) * 2)', display: 'grid', gap: 'var(--spacing)' }}\n >\n <div>{title}</div>\n {columns.map((column) => (\n <Button\n key={column.id}\n onClick={() => setSelected(column.id)}\n onContextMenu={(event) => {\n actions.setFilterValue(column.id, undefined);\n event.preventDefault();\n }}\n startIcon={<FilterList css={{ color: color(isActive(column.id)) }} />}\n css={{\n justifyContent: 'flex-start',\n color: isActive(column.id) ? 'var(--primaryMain)' : 'inherit',\n }}\n >\n {column.header}\n </Button>\n ))}\n </div>\n )}\n </FilterPopover>\n )}\n </>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): ReactElement {\n const { sort, activeColumns, props, actions } = useTableStructure<T>();\n const columnId = useColumnContext();\n const Badge = useTheme((t) => t.components.Badge);\n const ArrowUpward = useTheme((t) => t.icons.ArrowUpward);\n\n const sortIndex = sort.findIndex((s) => s.columnId === columnId);\n const direction = sort[sortIndex]?.direction;\n const index = sortIndex >= 0 && sort.length > 1 ? sortIndex + 1 : undefined;\n const sortDisabled =\n activeColumns.find((column) => column.id === columnId)?.disableSort ?? props.disableSort;\n\n function toggle(event: React.MouseEvent, off?: boolean) {\n if (sortDisabled) {\n return;\n }\n\n const newDirection = direction === 'asc' ? 'desc' : 'asc';\n const newSort =\n event.getModifierState('Control') || off ? sort.filter((s) => s.columnId !== columnId) : [];\n if (!off) {\n newSort.push({\n columnId,\n direction: newDirection,\n });\n }\n\n actions.setSort(newSort);\n\n event.preventDefault();\n return false;\n }\n\n return (\n <div\n css={{\n userSelect: 'none',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) max-content',\n alignItems: 'center',\n cursor: 'pointer',\n }}\n onClick={(event) => toggle(event)}\n onContextMenu={(event) => toggle(event, true)}\n >\n <div css={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>{children}</div>\n\n {\n <Badge badgeContent={sortDisabled ? 0 : index}>\n <span\n css={[\n { display: 'inline-flex', transition: 'all 300ms', fontSize: '0.8em' },\n !direction && { opacity: 0 },\n direction === 'desc' && { transform: 'rotate3d(0, 0, 1, 180deg)' },\n ]}\n >\n <ArrowUpward />\n </span>\n </Badge>\n }\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { columnTheme, useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableStructure } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { FilterControl } from './filterControl';\nimport { HiddenColumnFilters } from './hiddenColumnFilters';\nimport { ResizeHandle } from './resizeHandle';\nimport { SortComponent } from './sortComponent';\n\nexport function ColumnHeader(): ReactElement {\n const columnId = useColumnContext();\n const { props, activeColumns, visibleColumns } = useTableStructure();\n const column = activeColumns.find((column) => column.id === columnId);\n const { classes, styles } = useTheme((theme) => columnTheme(theme, column));\n\n return (\n <div\n data-column-header=\"\"\n className={classes?.headerCell}\n css={[\n defaultClasses.headerCell,\n { position: 'relative', userSelect: 'none' },\n styles?.headerCell,\n ]}\n >\n <SortComponent>{column?.header}</SortComponent>\n <div css={{ flex: 1 }} />\n <FilterControl />\n {props.enableHiddenColumnFilters &&\n visibleColumns[visibleColumns.length - 1]?.id === columnId && <HiddenColumnFilters />}\n <ResizeHandle />\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport function FormControlLabel({\n control,\n label,\n disabled,\n}: {\n control: ReactNode;\n label: ReactNode;\n disabled?: boolean;\n}) {\n return (\n <label\n css={[\n {\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n userSelect: 'none',\n\n '& > *': {\n cursor: 'pointer',\n },\n },\n disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n ]}\n >\n {control}\n <span css={{ marginLeft: 'var(--spacing)' }}>{label}</span>\n </label>\n );\n}\n","import { useState, type ReactElement } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStructure } from '../state/context';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\n\nexport function ColumnSelection<T>(): ReactElement {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Button = useTheme((t) => t.components.Button);\n const Settings = useTheme((t) => t.icons.Settings);\n const selectColumns = useTheme((t) => t.text.selectColumns);\n const resetAll = useTheme((t) => t.text.resetAll);\n const showAll = useTheme((t) => t.text.showAllColumns);\n const hideAll = useTheme((t) => t.text.hideAllColumns);\n const classes = useTheme((t) => t.classes);\n const cssVariables = useCssVariables();\n\n const { columns, hiddenColumns, actions } = useTableStructure<T>();\n\n const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n\n const toggle = (column?: InternalColumn<T, unknown>, state?: boolean) => {\n const newValue = new Set(hiddenColumns);\n\n for (const columnId of column ? [column.id] : columns.map((column) => column.id)) {\n if (state ?? hiddenColumns.has(columnId)) {\n newValue.delete(columnId);\n } else {\n newValue.add(columnId);\n }\n }\n\n actions.setHiddenColumns(newValue);\n };\n\n const allVisible = columns.every((column) => !hiddenColumns.has(column.id));\n\n return (\n <>\n <IconButton onClick={(event) => setAnchorElement(anchorElement ? null : event.currentTarget)}>\n <Settings />\n </IconButton>\n\n <Popover\n anchorEl={anchorElement}\n open={!!anchorElement}\n onClose={() => setAnchorElement(null)}\n css={cssVariables}\n className={classes?.popover}\n backdropClassName={classes?.popoverBackdrop}\n >\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <div css={{ marginBottom: 'var(--spacing)' }}>{selectColumns}</div>\n\n <div css={{ margin: '0.5em 0', display: 'flex', gap: '0.5em' }}>\n <Button variant=\"outlined\" onClick={() => toggle(undefined, !allVisible)}>\n {allVisible ? hideAll : showAll}\n </Button>\n\n <Button variant=\"outlined\" onClick={() => actions.resetTable()}>\n {resetAll}\n </Button>\n </div>\n\n {columns.map((column) => (\n <FormControlLabel\n key={column.id}\n control={\n <Checkbox\n checked={!(column.hidden ?? hiddenColumns.has(column.id))}\n onChange={() => toggle(column)}\n disabled={column.hidden !== undefined}\n />\n }\n label={column.header}\n ></FormControlLabel>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","import { useContext, useState, type ReactElement } from 'react';\nimport { ExportOptions, ExporterEntry } from '../exporters/exporter';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStructure } from '../state/context';\nimport { TableSettingsContext } from '../misc/tableSettings';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport function Export<T>(): ReactElement {\n const { exporters: contextExporters } = useContext(TableSettingsContext);\n const { props, actions } = useTableStructure<T>();\n const Button = useTheme((t) => t.components.Button);\n const IconButton = useTheme((t) => t.components.IconButton);\n const Popover = useTheme((t) => t.components.Popover);\n const ExportIcon = useTheme((t) => t.icons.Export);\n const Clipboard = useTheme((t) => t.icons.Clipboard);\n const exportTitle = useTheme((t) => t.text.exportTitle);\n const exportCopy = useTheme((t) => t.text.exportCopy);\n const exportDownload = useTheme((t) => t.text.exportDownload);\n const classes = useTheme((t) => t.classes);\n const cssVariables = useCssVariables();\n\n const { all, exporters }: ExportOptions =\n typeof props.enableExport === 'boolean' || props.enableExport === undefined\n ? { all: false, exporters: contextExporters }\n : props.enableExport;\n\n const [anchor, setAnchor] = useState<Element | null>(null);\n\n function execute({ action, exporter }: ExporterEntry) {\n const { activeColumns, activeItems, selection, items } = actions.getState();\n const columns = activeColumns.map((column) => column.exportHeader);\n\n let exportedItems = items;\n if (!all) {\n exportedItems = activeItems;\n\n if (selection.size > 0) {\n exportedItems = exportedItems.filter((item) => selection.has(item.id));\n }\n }\n\n const rows = exportedItems.map((item) =>\n activeColumns.map((column) => column.exportCell(column.value(item.value), item.value)),\n );\n\n if (action === 'copy') {\n const data = exporter.exportToString(columns, rows);\n navigator.clipboard.writeText(data).catch((error: unknown) => {\n console.error('Failed to copy the export to the clipboard:', error);\n });\n } else {\n Promise.resolve(exporter.exportToBlob(columns, rows))\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `export.${exporter.fileEnding}`;\n document.body.append(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n })\n .catch((error: unknown) => {\n console.error('Failed to export:', error);\n });\n }\n }\n\n return (\n <>\n <IconButton onClick={(event) => setAnchor(anchor ? null : event.currentTarget)}>\n <ExportIcon css={!!anchor && { color: 'var(--primaryMain)' }} />\n </IconButton>\n\n <Popover\n open={!!anchor}\n onClose={() => setAnchor(null)}\n anchorEl={anchor}\n css={cssVariables}\n className={classes?.popover}\n backdropClassName={classes?.popoverBackdrop}\n >\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n justifyItems: 'stretch',\n gap: 'var(--spacing)',\n\n '& > *': {\n justifyContent: 'start',\n },\n }}\n >\n <div css={{ marginBottom: 'var(--spacing)' }}>{exportTitle}</div>\n\n {exporters.map((entry, index) => (\n <Button\n key={index}\n startIcon={entry.action === 'copy' ? <Clipboard /> : <ExportIcon />}\n onClick={() => execute(entry)}\n >\n {entry.action === 'copy' ? exportCopy : exportDownload} (.{entry.exporter.type})\n </Button>\n ))}\n </div>\n </Popover>\n </>\n );\n}\n","import { memo } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { ColumnContext, useTableStructure } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { ColumnHeader } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { HiddenColumnFilters } from './hiddenColumnFilters';\nimport { ResizeHandleView } from './resizeHandle';\nimport { SelectAll } from './selectComponent';\n\n// Memoized so that rendering the rows (e.g. on selection) leaves it alone.\nexport const TableHeader = memo(function TableHeader() {\n const { props, visibleColumns } = useTableStructure();\n const classes = useTheme((t) => t.classes?.headerCell);\n const styles = useTheme((t) => t.styles?.headerCell);\n const { stickyHeader, enableSelection, enableColumnSelection, enableExport } = props;\n const { enableHiddenColumnFilters } = props;\n\n return (\n <div\n css={[\n { gridColumn: '1 / -1', display: 'grid', gridTemplateColumns: 'subgrid' },\n stickyHeader && defaultClasses.sticky,\n stickyHeader instanceof Object && stickyHeader,\n ]}\n >\n <div className={classes} css={[defaultClasses.headerFill, styles]} />\n\n <div className={classes} css={[defaultClasses.headerCell, styles]}>\n {enableSelection && <SelectAll />}\n {enableColumnSelection && <ColumnSelection />}\n {enableExport && <Export />}\n {/* Normally in the last column's header, so it doesn't take up a column of its own. */}\n {enableHiddenColumnFilters && visibleColumns.length === 0 && <HiddenColumnFilters />}\n\n {(enableSelection ||\n enableColumnSelection ||\n enableExport ||\n (enableHiddenColumnFilters && visibleColumns.length === 0)) && (\n <>\n <div css={{ flex: 1 }} />\n <ResizeHandleView />\n </>\n )}\n </div>\n\n {visibleColumns.map((column) => (\n <ColumnContext.Provider key={column.id} value={column.id}>\n <ColumnHeader />\n </ColumnContext.Provider>\n ))}\n\n <div className={classes} css={[defaultClasses.headerFill, styles]} />\n </div>\n );\n});\n","import { useVirtualizer, useWindowVirtualizer, type Virtualizer } from '@tanstack/react-virtual';\nimport {\n useContext,\n useLayoutEffect,\n useState,\n type ReactNode,\n type RefCallback,\n type RefObject,\n} from 'react';\nimport { CellSchedulerContext } from './cellScheduler';\nimport type { Id, TableProps } from '../types';\n\ntype VirtualOptions = Exclude<TableProps<unknown>['virtual'], boolean | undefined>;\n\nexport type RenderRow = (index: number, measureRef?: RefCallback<HTMLElement>) => ReactNode;\n\nconst spacerCss = { gridColumn: '1 / -1' } as const;\n\nconst scrolls = (element: HTMLElement) =>\n element.scrollHeight > element.clientHeight && getComputedStyle(element).overflowY !== 'visible';\n\nfunction findScrollRoot(element: HTMLElement): HTMLElement | undefined {\n for (let parent = element.parentElement; parent; parent = parent.parentElement) {\n if (parent === document.documentElement) return undefined;\n if (parent === document.body) {\n // body's overflow applies to the viewport unless <html> sets its own.\n const ownScroller = getComputedStyle(document.documentElement).overflowY !== 'visible';\n return ownScroller && scrolls(parent) ? parent : undefined;\n }\n if (scrolls(parent)) return parent;\n }\n return undefined;\n}\n\n/** Offset of the first row from the start of the scroll root's content. */\nfunction measureScrollMargin(probe: HTMLElement, root: HTMLElement | undefined) {\n if (!root) return probe.getBoundingClientRect().top + window.scrollY;\n return probe.getBoundingClientRect().top - root.getBoundingClientRect().top + root.scrollTop;\n}\n\n/**\n * Finds the scroll root and the rows' offset in it. Both are re-measured when the table or the\n * page layout resizes: a container only becomes a scroll root once its content overflows, and\n * content above the table shifts the offset.\n */\nfunction useScrollRoot(tableRef: RefObject<HTMLElement | null>, probe: HTMLElement | null) {\n const [root, setRoot] = useState<{ element: HTMLElement | undefined; margin: number }>();\n\n useLayoutEffect(() => {\n const table = tableRef.current;\n if (!probe || !table) return;\n\n function update() {\n setRoot((current) => {\n // A container stays the scroll root while it can scroll, even when a filter shrinks the\n // content below its height: switching virtualizers would remount every row.\n const keep =\n current?.element?.contains(probe) &&\n getComputedStyle(current.element).overflowY !== 'visible';\n const element = keep ? current!.element : findScrollRoot(probe!);\n const margin = Math.round(measureScrollMargin(probe!, element));\n return current && current.element === element && current.margin === margin\n ? current\n : { element, margin };\n });\n }\n\n update();\n const observer = new ResizeObserver(update);\n observer.observe(table);\n observer.observe(document.body);\n return () => observer.disconnect();\n }, [tableRef, probe]);\n\n return root;\n}\n\ninterface VirtualRowsProps {\n count: number;\n getKey: (index: number) => Id;\n options: VirtualOptions;\n scrollMargin: number;\n renderRow: RenderRow;\n}\n\nfunction VirtualWindow({\n virtualizer,\n renderRow,\n measure,\n}: {\n virtualizer: Virtualizer<any, HTMLDivElement>;\n renderRow: RenderRow;\n measure: boolean;\n}) {\n 'use no memo';\n const items = virtualizer.getVirtualItems();\n const scheduler = useContext(CellSchedulerContext);\n\n // Deferred cells of rows in the viewport are revealed before those in the overscan.\n useLayoutEffect(() => {\n const { range } = virtualizer;\n if (range) scheduler?.setVisibleRange(range.startIndex, range.endIndex);\n });\n\n const margin = virtualizer.options.scrollMargin;\n const before = items.length ? items[0]!.start - margin : 0;\n const after = items.length\n ? virtualizer.getTotalSize() - (items[items.length - 1]!.end - margin)\n : 0;\n\n return (\n <>\n <div style={{ ...spacerCss, height: before }} />\n {items.map((item) => renderRow(item.index, measure ? virtualizer.measureElement : undefined))}\n <div style={{ ...spacerCss, height: after }} />\n </>\n );\n}\n\nfunction virtualizerOptions({ count, getKey, options, scrollMargin }: VirtualRowsProps) {\n return {\n count,\n getItemKey: getKey,\n estimateSize: () => options.rowHeight ?? options.estimatedRowHeight ?? 40,\n overscan: options.overscan ?? 5,\n scrollMargin,\n };\n}\n\n// The virtualizers return the same mutable object on every render: memoizing on it would freeze\n// the rows, so these must stay out of React Compiler.\nfunction ElementRows(props: VirtualRowsProps & { root: HTMLElement }) {\n 'use no memo';\n const virtualizer = useVirtualizer<HTMLElement, HTMLDivElement>({\n ...virtualizerOptions(props),\n getScrollElement: () => props.root,\n });\n return (\n <VirtualWindow\n virtualizer={virtualizer}\n renderRow={props.renderRow}\n measure={props.options.rowHeight === undefined}\n />\n );\n}\n\nfunction WindowRows(props: VirtualRowsProps) {\n 'use no memo';\n const virtualizer = useWindowVirtualizer<HTMLDivElement>(virtualizerOptions(props));\n return (\n <VirtualWindow\n virtualizer={virtualizer}\n renderRow={props.renderRow}\n measure={props.options.rowHeight === undefined}\n />\n );\n}\n\nexport function VirtualRows({\n tableRef,\n ...props\n}: Omit<VirtualRowsProps, 'scrollMargin'> & { tableRef: RefObject<HTMLElement | null> }) {\n const [probe, setProbe] = useState<HTMLDivElement | null>(null);\n const root = useScrollRoot(tableRef, probe);\n const estimate = props.options.rowHeight ?? props.options.estimatedRowHeight ?? 40;\n\n return (\n <>\n <div ref={setProbe} style={spacerCss} />\n {/* Takes the rows' estimated space until the scroll root is known, so the container that\n will scroll already overflows and gets picked right away. */}\n {!root && <div style={{ ...spacerCss, height: props.count * estimate }} />}\n {root &&\n (root.element ? (\n <ElementRows {...props} root={root.element} scrollMargin={root.margin} />\n ) : (\n <WindowRows {...props} scrollMargin={root.margin} />\n ))}\n </>\n );\n}\n","import { useCallback, useLayoutEffect, useMemo, useRef, type RefCallback } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../state/context';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { TableTheme } from '../types';\nimport { columnWidthVariable } from './resizeHandle';\nimport { CellSchedulerContext, useCellScheduler } from './cellScheduler';\nimport { Row, type RowConfig } from './row';\nimport { useRowStyles } from './rowStyles';\nimport { TableFooter } from './tableFooter';\nimport { TableHeader } from './tableHeader';\nimport { VirtualRows } from './virtualized';\n\nexport function TableGrid<T>({ hidden }: { hidden: boolean }) {\n const state = useTableContext<T>();\n const theme = useTheme((t: TableTheme<T>) => t);\n const { props, visibleColumns, columnWidths, activeItems, expanded } = state;\n const cssVariables = useCssVariables();\n const tableRef = useRef<HTMLDivElement>(null);\n\n const debugRenderRef = useRef(props.debugRender);\n debugRenderRef.current = props.debugRender;\n const debugRender = useCallback((...output: any) => debugRenderRef.current?.(...output), []);\n\n useLayoutEffect(() => {\n debugRender('render table');\n });\n\n const { enableSelection, rowAction, rowDetails, wrapRow, wrapCell, hasDeferredChildren } = props;\n const styles = useRowStyles(theme, visibleColumns);\n const scheduler = useCellScheduler();\n const virtualOptions = props.virtual instanceof Object ? props.virtual : undefined;\n const deferCells = virtualOptions?.deferCells;\n const placeholderHeight = virtualOptions?.rowHeight ?? virtualOptions?.estimatedRowHeight ?? 40;\n const deferredColumns = useMemo(\n () =>\n new Set(\n visibleColumns.filter((column) => column.deferred ?? deferCells).map((column) => column.id),\n ),\n [visibleColumns, deferCells],\n );\n const config = useMemo(\n (): RowConfig<T> => ({\n styles,\n deferredColumns,\n placeholderHeight,\n columns: visibleColumns,\n enableSelection,\n rowAction,\n rowDetails,\n wrapRow,\n wrapCell,\n hasDeferredChildren,\n debugRender,\n }),\n [\n styles,\n deferredColumns,\n placeholderHeight,\n visibleColumns,\n enableSelection,\n rowAction,\n rowDetails,\n wrapRow,\n wrapCell,\n hasDeferredChildren,\n debugRender,\n ],\n );\n\n const renderRow = (index: number, measureRef?: RefCallback<HTMLElement>) => {\n const item = activeItems[index]!;\n return (\n <Row\n key={item.id}\n id={item.id}\n value={item.value}\n rowIndex={index}\n depth={item.depth}\n hasChildren={item.children.length > 0}\n expanded={expanded.has(item.id)}\n config={config}\n measureRef={measureRef}\n />\n );\n };\n\n const getKey = useCallback((index: number) => activeItems[index]!.id, [activeItems]);\n const { fullWidth, virtual } = props;\n\n return (\n <CellSchedulerContext.Provider value={scheduler}>\n <div\n ref={tableRef}\n data-schummar-table=\"\"\n className={theme.classes?.table}\n css={[\n cssVariables,\n defaultClasses.table,\n theme.styles?.table,\n hidden && { visibility: 'hidden' },\n ]}\n style={{\n gridTemplateColumns: [\n fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n 'max-content',\n ...visibleColumns.map(\n (column, index) =>\n `var(${columnWidthVariable(index)}, ${columnWidths.get(column.id) ?? column.width ?? 'max-content'})`,\n ),\n fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n ].join(' '),\n }}\n >\n <TableHeader />\n\n {virtual ? (\n <VirtualRows\n tableRef={tableRef}\n count={activeItems.length}\n getKey={getKey}\n options={virtual === true ? {} : virtual}\n renderRow={renderRow}\n />\n ) : (\n activeItems.map((_, index) => renderRow(index))\n )}\n\n <TableFooter />\n </div>\n </CellSchedulerContext.Provider>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\n\nexport function TableLoadingState({ isHydrated }: { isHydrated: boolean }) {\n const [showLoading, setShowLoading] = useState(false);\n const loadingText = useTheme((t) => t.text.loading);\n\n useEffect(() => {\n const handle = setTimeout(() => setShowLoading(true), 500);\n return () => clearTimeout(handle);\n }, []);\n\n return !isHydrated && showLoading ? <div>{loadingText}</div> : null;\n}\n","import type { ReactElement, Ref } from 'react';\nimport { ThemeContext } from '../hooks/useTheme';\nimport {\n SelectionContext,\n TableActionsContext,\n TableContext,\n TableStructureContext,\n} from '../state/context';\nimport { useTable } from '../state/useTable';\nimport { useTableImperativeHandle } from '../state/useTableImperativeHandle';\nimport { useTableReset } from '../state/useTableReset';\nimport type { TableProps, TableRef } from '../types';\nimport { TableGrid } from './tableGrid';\nimport { TableLoadingState } from './tableLoadingState';\n\nexport function Table<T>({ ref, ...props }: TableProps<T> & { ref?: Ref<TableRef> }): ReactElement {\n const [resetKey, onReset] = useTableReset(props);\n return (\n <TableWithState\n key={resetKey}\n props={props}\n tableRef={ref}\n onReset={onReset}\n isReset={resetKey > 0}\n />\n );\n}\n\nfunction TableWithState<T>({\n props,\n tableRef,\n onReset,\n isReset,\n}: {\n props: TableProps<T>;\n tableRef?: Ref<TableRef>;\n onReset: () => void;\n isReset: boolean;\n}): ReactElement {\n const table = useTable(props, onReset, isReset);\n const { context, structure, actions, theme, isHydrated } = table;\n useTableImperativeHandle(tableRef, table);\n\n return (\n <ThemeContext.Provider value={theme}>\n <TableActionsContext.Provider value={actions}>\n <TableStructureContext.Provider value={structure}>\n <TableContext.Provider value={context}>\n <TableLoadingState isHydrated={isHydrated} />\n <SelectionContext.Provider value={context.selection}>\n <TableGrid hidden={!isHydrated} />\n </SelectionContext.Provider>\n </TableContext.Provider>\n </TableStructureContext.Provider>\n </TableActionsContext.Provider>\n </ThemeContext.Provider>\n );\n}\n","import type { ReactNode } from 'react';\nimport { eventHandler } from '../misc/equal';\nimport type { Filter, FilterComponentProps, FilterOptions } from '../types';\n\nexport interface FilterDefinition<TInput, TState, TOptions> {\n isActive(value: TState, options: TOptions): boolean;\n /** `input` is the column's `filterBy` value, see `SingleOrMultiple` and `toSingles`. */\n test(value: TState, input: TInput, options: TOptions): boolean;\n /** Delay in ms before changes made in the UI apply, unless the `debounce` option overrides it. */\n debounce?: number;\n Component(props: FilterComponentProps<TInput, TState, TOptions>): ReactNode;\n}\n\n/**\n * Creates a filter factory, like `textFilter`. `TInput` is what the filter accepts from a column,\n * typically a `SingleOrMultiple<…>`. A `debounce` option overrides the definition's.\n *\n * The definition's functions are shared by every filter created from it and everything else\n * passed goes into `options`, so a filter created inline on every render stays deep equal and\n * doesn't cause refiltering. Keep options to plain data where possible: functions are compared by\n * reference.\n */\nexport function defineFilter<TInput, TState, TOptions extends object = {}>(\n definition: FilterDefinition<TInput, TState, TOptions>,\n) {\n return (input?: FilterOptions<TState> & TOptions): Filter<TInput, TState, TOptions> => {\n const { defaultValue, value, onChange, external, classNames, ...options } =\n input ?? ({} as FilterOptions<TState>);\n\n return {\n isActive: definition.isActive,\n test: definition.test,\n debounce: (options as { debounce?: number }).debounce ?? definition.debounce,\n Component: definition.Component,\n defaultValue,\n value,\n onChange: onChange && eventHandler(onChange),\n external,\n classNames,\n options: options as TOptions,\n };\n };\n}\n","import type { ReactElement } from 'react';\nimport type { DatePickerProps, DateRange } from '../components/datePicker';\nimport { dateIntersect, DatePicker } from '../components/datePicker';\nimport { toSingles } from '../misc/helpers';\nimport type { FilterComponentProps, SingleOrMultiple } from '../types';\nimport { defineFilter } from './defineFilter';\n\n/** An ISO 8601 date or date-time string, e.g. `2024-05-03` or `2024-05-03T13:47:23Z`. */\nexport type ISODate = `${number}-${number}-${number}${string}`;\n\ntype DateValue = Date | DateRange | null;\ntype DateInput = SingleOrMultiple<Date | DateRange | ISODate | null | undefined>;\n\nconst toDate = (x: Date | DateRange | ISODate | null | undefined) =>\n typeof x === 'string' ? new Date(x) : x;\n\nexport type DateFilterOptions = {\n /** If enabled, only single days can be selected. Ranges otherwise. */\n singleSelect?: boolean;\n} & Pick<\n DatePickerProps,\n | 'locale'\n | 'firstDayOfWeek'\n | 'defaultDateInView'\n | 'quickOptions'\n | 'minDate'\n | 'maxDate'\n | 'showCalendarWeek'\n | 'showTime'\n>;\n\nfunction DateFilterComponent({\n value = null,\n onChange,\n close,\n options: {\n locale,\n firstDayOfWeek,\n defaultDateInView,\n quickOptions,\n singleSelect,\n minDate,\n maxDate,\n showCalendarWeek,\n showTime,\n },\n}: FilterComponentProps<DateInput, DateValue, DateFilterOptions>): ReactElement {\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n }}\n >\n <DatePicker\n rangeSelect={!singleSelect}\n value={value ?? null}\n onChange={(value, source) => {\n onChange(value);\n if (source === 'quickOption' || (source !== 'input' && !showTime)) {\n close();\n }\n }}\n locale={locale}\n firstDayOfWeek={firstDayOfWeek}\n defaultDateInView={defaultDateInView}\n quickOptions={quickOptions}\n minDate={minDate}\n maxDate={maxDate}\n showCalendarWeek={showCalendarWeek}\n showTime={showTime}\n />\n </div>\n );\n}\n\n/** Like dateIntersect, but compares the exact times instead of whole days. */\nfunction timeIntersect(range: DateRange, x: Date | DateRange | null | undefined) {\n if (!x) {\n return false;\n }\n const { min, max } = x instanceof Date ? { min: x, max: x } : x;\n return !(range.max < min || range.min > max);\n}\n\nexport const dateFilter = defineFilter<DateInput, DateValue, DateFilterOptions>({\n isActive: (value) => !!value,\n test: (value, input, { showTime }) =>\n toSingles(input).some((x) =>\n showTime && value && !(value instanceof Date)\n ? timeIntersect(value, toDate(x))\n : dateIntersect(value, toDate(x)),\n ),\n Component: DateFilterComponent,\n});\n","import { useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\ntype TextFieldProps =\n TableTheme['components']['TextField'] extends React.ComponentType<infer T> ? T : never;\n\nexport interface NumberFieldProps extends Omit<TextFieldProps, 'value' | 'onChange'> {\n value?: number | null;\n onChange?: (value: number | null) => void;\n}\n\nconst Pattern = /^-?\\d*(?:[.,]\\d*)?$/;\n\nconst printNumber = (value: number | null, locale?: string) => {\n if (value === null) {\n return '';\n }\n\n return value.toLocaleString(locale);\n};\n\nconst parseNumber = (value: string) => {\n if (value === '') {\n return null;\n }\n\n const asNumber = Number(value.replace(',', '.'));\n return Number.isNaN(asNumber) ? null : asNumber;\n};\n\nexport function NumberField({\n value: commitedValue = null,\n onChange,\n ...textFieldProps\n}: NumberFieldProps) {\n const locale = useTheme((t) => t.locale);\n const TextField = useTheme((t) => t.components.TextField);\n const [value = printNumber(commitedValue, locale), setValue] = useState<string>();\n\n return (\n <TextField\n value={value}\n onChange={(event) => {\n if (Pattern.test(event.target.value)) {\n setValue(event.target.value);\n }\n }}\n onBlur={() => {\n onChange?.(parseNumber(value));\n setValue(undefined);\n }}\n {...textFieldProps}\n css={{\n input: {\n backgroundColor: 'inherit',\n color: 'inherit',\n },\n }}\n />\n );\n}\n","import { useMemo, type ReactElement } from 'react';\nimport { NumberField } from '../components/numberField';\nimport { useTheme } from '../hooks/useTheme';\nimport { toSingles } from '../misc/helpers';\nimport type { FilterComponentProps, SingleOrMultiple } from '../types';\nimport { defineFilter } from './defineFilter';\n\ntype Range = [number | null, number | null] | null;\ntype RangeInput = SingleOrMultiple<number | bigint | null | undefined>;\n\nexport interface RangeFilterOptions {\n min?: number;\n max?: number;\n /** Delay in ms before changes apply. The inputs apply on blur anyway. */\n debounce?: number;\n}\n\nfunction RangeFilterComponent({\n value,\n onChange,\n options: { min, max },\n getValues,\n}: FilterComponentProps<RangeInput, Range, RangeFilterOptions>): ReactElement {\n const rangeMinText = useTheme((t) => t.text.rangeMin);\n const rangeMaxText = useTheme((t) => t.text.rangeMax);\n\n const [minValue, maxValue] = useMemo(() => {\n if (typeof min === 'number' && typeof max === 'number') {\n return [min, max];\n }\n\n let minValue;\n let maxValue;\n\n for (const value of getValues()) {\n if (value === null || value === undefined) continue;\n const number = Number(value);\n minValue = Math.min(minValue ?? number, number);\n maxValue = Math.max(maxValue ?? number, number);\n }\n\n return [min ?? minValue, max ?? maxValue];\n }, [min, max, getValues]);\n\n return (\n <div\n css={{\n padding: `calc(var(--spacing) * 2)`,\n display: 'grid',\n gap: '1em',\n }}\n >\n <div\n css={{\n display: 'flex',\n gap: '1em',\n alignItems: 'center',\n\n '& > *': {\n width: '10em',\n },\n }}\n >\n <NumberField\n value={value?.[0]}\n onChange={(newMin) => onChange(normalize(newMin, value?.[1], 'min', { min, max }))}\n startIcon={<span css={{ margin: '0 calc(var(--spacing) * 2)' }}>{rangeMinText}</span>}\n placeholder={String(minValue ?? '')}\n css={{\n alignItems: 'baseline',\n }}\n />\n -\n <NumberField\n value={value?.[1]}\n onChange={(newMax) => onChange(normalize(value?.[0], newMax, 'max', { min, max }))}\n startIcon={<span css={{ margin: '0 calc(var(--spacing) * 2)' }}>{rangeMaxText}</span>}\n placeholder={String(maxValue ?? '')}\n css={{\n alignItems: 'baseline',\n }}\n />\n </div>\n </div>\n );\n}\n\nexport const rangeFilter = defineFilter<RangeInput, Range, RangeFilterOptions>({\n isActive: (value) => !!value,\n test(value, input) {\n if (!value || (value[0] === null && value[1] === null)) {\n return true;\n }\n\n const min = value[0] ?? Number.NEGATIVE_INFINITY;\n const max = value[1] ?? Number.POSITIVE_INFINITY;\n return toSingles(input).some(\n (x) => (typeof x === 'number' || typeof x === 'bigint') && x >= min && x <= max,\n );\n },\n Component: RangeFilterComponent,\n});\n\nfunction normalize(\n min: number | null | undefined,\n max: number | null | undefined,\n changed: 'min' | 'max',\n limits: { min?: number; max?: number },\n): [number | null, number | null] | null {\n min ??= null;\n max ??= null;\n\n if (min !== null && max !== null && min > max) {\n if (changed === 'min') {\n max = min;\n } else {\n min = max;\n }\n }\n\n return min !== null || max !== null\n ? [clamp(min, limits.min, limits.max), clamp(max, limits.min, limits.max)]\n : null;\n}\n\nfunction clamp(\n value: number | null,\n min = Number.NEGATIVE_INFINITY,\n max = Number.POSITIVE_INFINITY,\n): number | null {\n return value === null ? null : Math.min(Math.max(value, min), max);\n}\n","import { useVirtualizer } from '@tanstack/react-virtual';\nimport type { HTMLProps, ReactElement, ReactNode } from 'react';\nimport { useState } from 'react';\n\ntype VirtualOptions = { rowHeight?: number; estimatedRowHeight?: number; overscan?: number };\n\nexport interface VirtualListProps<T> extends Omit<HTMLProps<HTMLDivElement>, 'children'> {\n virtual?: boolean | VirtualOptions;\n items: T[];\n children: (item: T, index: number) => ReactNode;\n}\n\nconst containerCss = { overflowY: 'auto', display: 'grid' } as const;\n\nexport function VirtualList<T>({\n virtual = true,\n items,\n children,\n ...props\n}: VirtualListProps<T>): ReactElement {\n if (!virtual) {\n return (\n <div {...props} css={containerCss}>\n {items.map((item, index) => children(item, index))}\n </div>\n );\n }\n\n return (\n <VirtualItems {...props} items={items} options={virtual === true ? {} : virtual}>\n {children}\n </VirtualItems>\n );\n}\n\nfunction VirtualItems<T>({\n items,\n options,\n children,\n ...props\n}: Omit<VirtualListProps<T>, 'virtual'> & { options: VirtualOptions }) {\n const [scrollElement, setScrollElement] = useState<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLDivElement>({\n count: items.length,\n getScrollElement: () => scrollElement,\n estimateSize: () => options.rowHeight ?? options.estimatedRowHeight ?? 38,\n overscan: options.overscan ?? 5,\n useFlushSync: false,\n });\n\n const virtualItems = virtualizer.getVirtualItems();\n const measure = options.rowHeight === undefined ? virtualizer.measureElement : undefined;\n const before = virtualItems[0]?.start ?? 0;\n // With no items rendered yet the spacer must still take up the full size: the virtualizer\n // renders nothing while the container has no height.\n const after = virtualizer.getTotalSize() - (virtualItems[virtualItems.length - 1]?.end ?? 0);\n\n return (\n <div {...props} ref={setScrollElement} css={containerCss}>\n <div style={{ height: before }} />\n {virtualItems.map((virtualItem) => (\n <div\n key={virtualItem.key}\n ref={measure}\n data-index={virtualItem.index}\n css={{ display: 'grid' }}\n >\n {children(items[virtualItem.index]!, virtualItem.index)}\n </div>\n ))}\n <div style={{ height: after }} />\n </div>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { useMemo, useState } from 'react';\nimport { AutoFocusTextField } from '../components/autoFocusTextField';\nimport { FormControlLabel } from '../components/formControlLabel';\nimport type { VirtualListProps } from '../components/virtualList';\nimport { VirtualList } from '../components/virtualList';\nimport { useTheme } from '../hooks/useTheme';\nimport { asString, orderBy, toSingles, uniq } from '../misc/helpers';\nimport type { Filter, FilterComponentProps, FilterOptions, SingleOrMultiple } from '../types';\nimport { defineFilter } from './defineFilter';\n\nexport interface SelectFilterOptions<TFilterBy> {\n /** Which options are provided to select. By default all unique item values are used. */\n options?: TFilterBy[];\n /** String representation of a value. Used to filter options via the text field. */\n stringValue?: (value: TFilterBy) => string;\n /** Render values. By default a string representation of the value is used. */\n render?: (value: TFilterBy) => ReactNode;\n /** If enabled, only one option can be selected at a time. */\n singleSelect?: boolean;\n /** If enabled, the search field is hidden. */\n hideSearchField?: boolean;\n /** If enabled, the reset button is hidden. */\n hideResetButton?: boolean;\n /** Virtual list props.\n * @default true */\n virtual?: VirtualListProps<unknown>['virtual'];\n}\n\nfunction toggle<T>(set: Set<T>, value: T, singleSelect?: boolean) {\n const newSet = new Set(singleSelect ? [] : set);\n if (set.has(value)) {\n newSet.delete(value);\n } else {\n newSet.add(value);\n }\n\n return newSet;\n}\n\nfunction SelectFilterComponent({\n value: currentValue,\n onChange,\n options: {\n options: providedOptions,\n stringValue = asString,\n render = stringValue,\n singleSelect,\n hideSearchField,\n hideResetButton,\n virtual,\n },\n getValues,\n}: FilterComponentProps<unknown, Set<unknown>, SelectFilterOptions<unknown>>): ReactElement {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Checkbox = useTheme((t) => t.components.Checkbox);\n const Button = useTheme((t) => t.components.Button);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n const deselectAll = useTheme((t) => t.text.deselectAll);\n const noResults = useTheme((t) => t.text.noResults);\n\n const value = currentValue ?? new Set<unknown>();\n\n const options = useMemo(\n () => (providedOptions ? uniq(providedOptions) : orderBy(getValues())),\n [providedOptions, getValues],\n );\n\n const [query, setQuery] = useState('');\n // Selected options come first, as they were when the filter opened.\n const [initialValue] = useState(value);\n const filtered = options.filter(\n (option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()),\n );\n const ordered = filtered\n .filter((option) => initialValue.has(option))\n .concat(filtered.filter((option) => !initialValue.has(option)));\n\n return (\n <div\n css={{\n padding: 'calc(var(--spacing) * 2)',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n gap: 'var(--spacing)',\n }}\n >\n {!hideSearchField && (\n <AutoFocusTextField\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n endIcon={\n <IconButton onClick={() => setQuery('')}>{!query ? <Search /> : <Clear />}</IconButton>\n }\n css={{ marginBottom: 'var(--spacing)' }}\n />\n )}\n\n {!hideResetButton && (\n <Button\n disabled={value.size === 0}\n onClick={() => onChange(new Set())}\n variant=\"outlined\"\n css={{\n justifyContent: 'center',\n width: '100%',\n marginBottom: 'var(--spacing)',\n color: 'inherit',\n }}\n >\n {deselectAll}\n </Button>\n )}\n\n <VirtualList\n items={ordered}\n virtual={virtual}\n css={{\n width: '20em',\n maxWidth: '100%',\n maxHeight: 'min(20em, 50vh)',\n overflow: 'hidden auto',\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr)',\n }}\n >\n {(option, index) => (\n <FormControlLabel\n key={index}\n control={\n <Checkbox\n checked={value.has(option)}\n onChange={() => onChange(toggle(value, option, singleSelect))}\n />\n }\n label={render(option)}\n />\n )}\n </VirtualList>\n\n {ordered.length === 0 && <span css={{ textAlign: 'center' }}>{noResults}</span>}\n </div>\n );\n}\n\n/** Accepts any value; typing `options`, `defaultValue`, `render` etc. narrows it. */\n// defineFilter can't make the factory generic, hence the cast.\nexport const selectFilter = defineFilter<\n SingleOrMultiple<unknown>,\n Set<unknown>,\n SelectFilterOptions<unknown>\n>({\n isActive: (value) => value.size > 0,\n test: (value, input) => toSingles(input).some((x) => value.has(x)),\n Component: SelectFilterComponent,\n}) as <T>(\n options?: FilterOptions<Set<T>> & SelectFilterOptions<T>,\n) => Filter<SingleOrMultiple<T>, Set<T>, SelectFilterOptions<T>>;\n","import type { ReactElement } from 'react';\nimport { AutoFocusTextField } from '../components/autoFocusTextField';\nimport { useTheme } from '../hooks/useTheme';\nimport { toSingles } from '../misc/helpers';\nimport type { FilterComponentProps, SingleOrMultiple } from '../types';\nimport { defineFilter } from './defineFilter';\n\nconst compares = {\n contains: (itemValue: string, filterValue: string) =>\n itemValue.toLowerCase().includes(filterValue.toLowerCase()),\n prefix: (itemValue: string, filterValue: string) =>\n itemValue.toLowerCase().startsWith(filterValue.toLowerCase()),\n exact: (itemValue: string, filterValue: string) =>\n itemValue.toLowerCase() === filterValue.toLowerCase(),\n};\n\nexport interface TextFilterOptions {\n /** How item values are matched, ignoring case. A function gets the item value and the filter\n * value and returns whether they match.\n * @default 'contains'\n */\n compare?: keyof typeof compares | ((itemValue: string, filterValue: string) => boolean);\n placeholder?: string;\n /** Delay in ms before typed text applies.\n * @default 300\n */\n debounce?: number;\n}\n\ntype TextInput = SingleOrMultiple<string | number | bigint | null | undefined>;\n\nfunction TextFilterComponent({\n value,\n onChange,\n close,\n options,\n}: FilterComponentProps<TextInput, string, TextFilterOptions>): ReactElement {\n const IconButton = useTheme((t) => t.components.IconButton);\n const Search = useTheme((t) => t.icons.Search);\n const Clear = useTheme((t) => t.icons.Clear);\n\n return (\n <div css={{ padding: `calc(var(--spacing) * 2)`, display: 'grid' }}>\n <AutoFocusTextField\n value={value ?? ''}\n onChange={(event) => onChange(event.target.value)}\n onKeyUp={(event) => {\n if (event.key === 'Enter') close();\n }}\n endIcon={\n <IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>\n }\n placeholder={options.placeholder}\n />\n </div>\n );\n}\n\nexport const textFilter = defineFilter<TextInput, string, TextFilterOptions>({\n isActive: (value) => !!value,\n test(value, input, { compare = 'contains' }) {\n const match = typeof compare === 'function' ? compare : compares[compare];\n return toSingles(input).some((x) => x !== null && x !== undefined && match(String(x), value));\n },\n debounce: 300,\n Component: TextFilterComponent,\n});\n","export const textMatch = (text: string, query: string): boolean => {\n text = text.toLowerCase();\n query = query.toLowerCase();\n return query.split(/\\s+/).every((part) => termMatch(text, part));\n};\n\nexport const termMatch = (text: string, query: string): boolean => {\n let i = 0;\n outer: for (const char of query) {\n for (; i < text.length; i++) {\n if (text[i] === char) {\n i++;\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n"],"mappings":"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"}
|