{"version":3,"file":"index.cjs","names":["defaultColors: TableTheme['colors']","className","Badge: TableTheme['components']['Badge']","Button: TableTheme['components']['Button']","Checkbox: TableTheme['components']['Checkbox']","className","IconButton: TableTheme['components']['IconButton']","TextField: TableTheme['components']['TextField']","className","defaultComponents: TableTheme['components']","ClassNames","css","Export","defaultIcons: TableTheme['icons']","defaultTexts: TableTheme['text']","defaultTableTheme: TableTheme","deps: DependencyList","Store","TableSettingsContext","memo","globalTableTheme","column","mergeThemes","Popover","IconButton","FilterList","ArrowDropDown","filter","ClassNames","cx","css","TextField","lastArgs: Args | undefined","timeout: ReturnType<typeof setTimeout> | undefined","value","IconButton","FilterList","filter","Button","FilterList","filter","FilterDialog","months: DayzedCalendar[]","dates: ('' | DayzedDateObject)[]","weeks: ('' | DayzedDateObject)[][]","className","defaultDate","isIncludedType","maxValues","tabNext","value","localValue","Fragment","value","localValue","Fragment","Temporal","value","Button","IconButton","ChevronRight","today","min","max","getBackProps","getForwardProps","Fragment","getDateProps","value","flatMap","className","asNumber","TextField","minValue","maxValue","value","min","max","throttle","IconButton","Checkbox","Search","Clear","value","column","Button","value","id","key","data: any","state","column","sort","items","id","overrides","defaultProps: InternalTableProps<any>","id","defaults","overrides","state","state","state","Store","state","Button","defaultClasses","defaultClasses","className","Badge","ArrowUpward","index","column","toggle","StoreScope","column","index","defaultClasses","IconButton","Popover","Checkbox","Button","Settings","toggle","column","TableSettingsContext","Button","IconButton","Popover","Clipboard","defaultClasses","Cell","column","className","Details","className","defaultClasses","css","IconButton","Spinner","ChevronRight","toggle","Checkbox","isSelected","itemId","toggle","Row","item","ClassNames","cx","css","defaultClasses","itemIds","from","to","before","after","throttle","TableInner","defaultClasses","IconButton","Search","Clear","value"],"sources":["../src/misc/tableContext.ts","../src/theme/defaultTheme/defaultColors.ts","../src/components/spinnner.tsx","../src/theme/defaultTheme/badge.tsx","../src/theme/defaultTheme/button.tsx","../src/theme/defaultTheme/checkbox.tsx","../src/theme/defaultTheme/iconButton.tsx","../src/theme/defaultTheme/textField.tsx","../src/theme/defaultTheme/defaultComponents.ts","../src/theme/defaultTheme/defaultIcons.tsx","../src/theme/defaultTheme/defaultTexts.tsx","../src/theme/defaultTheme/index.tsx","../src/hooks/useTableMemo.tsx","../src/hooks/useTheme.ts","../src/theme/useCssVariables.ts","../src/components/filterControl.tsx","../src/components/autoFocusTextField.tsx","../src/misc/debounce.ts","../src/hooks/useFilter.ts","../src/components/filterDialog.tsx","../src/components/nestedFilterControl.tsx","../src/components/combinedFilter.tsx","../src/misc/defaults.ts","../src/vendor/dayzed/utils.ts","../src/vendor/dayzed/dayzed.ts","../src/hooks/useLatestRef.ts","../src/components/dateInput.tsx","../src/components/text.tsx","../src/components/timeInput.tsx","../src/components/datePicker.tsx","../src/components/dateFilter.tsx","../src/misc/helpers.ts","../src/components/numberField.tsx","../src/components/rangeFilter.tsx","../src/components/formControlLabel.tsx","../src/components/virtualList.tsx","../src/components/selectFilter.tsx","../src/hooks/useTableRef.ts","../src/misc/queue.ts","../src/internalState/tableStateStorage.ts","../src/internalState/calcItems.ts","../src/exporters/serializer.ts","../src/misc/overrides.ts","../src/internalState/calcProps.ts","../src/internalState/cleanupState.ts","../src/internalState/filterColumns.ts","../src/internalState/normalizeExpanded.ts","../src/internalState/syncSelections.ts","../src/internalState/watchDisplaySize.ts","../src/internalState/useTableState.ts","../src/components/clearFiltersButton.tsx","../src/components/columnFooter.tsx","../src/components/resizeHandle.tsx","../src/components/sortComponent.tsx","../src/components/columnHeader.tsx","../src/components/columnSelection.tsx","../src/components/export.tsx","../src/misc/calcClassNames.ts","../src/components/cell.tsx","../src/components/details.tsx","../src/components/expandControl.tsx","../src/components/selectComponent.tsx","../src/components/row.tsx","../src/components/virtualized.tsx","../src/components/table.tsx","../src/components/textFilter.tsx","../src/misc/textMatch.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport type { Id, InternalTableState } from '../types';\n\nexport const TableContext = createContext<Store<InternalTableState<any>> | null>(null);\n\nexport const TableResetContext = createContext<() => void>(() => undefined);\n\nexport const ColumnContext = createContext<Id | null>(null);\n\nexport function useTableContext<T>(): Store<InternalTableState<T>> {\n  const value = useContext(TableContext);\n  if (!value) throw new Error('No table context available');\n  return value as Store<InternalTableState<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","import type { TableTheme } from '../../types';\n\nexport const defaultColors: TableTheme['colors'] = {\n  primary: { main: '#1976d2', light: '#42a5f5', contrastText: '#fff' },\n  secondary: { main: '#9c27b0', light: '#ba68c8', contrastText: '#fff' },\n  blocked: { main: '#f44336', light: '#f26257', contrastText: '#fff' },\n  background: '#ffffff',\n  text: 'inherit',\n  border: '#777',\n  borderLight: '#eee',\n};\n","import { css } from '@emotion/react';\n\nexport function Spinner({ className }: { className?: string }) {\n  return (\n    <div\n      className={className}\n      css={css`\n        display: inline-block;\n        position: relative;\n        width: 1em;\n        height: 1em;\n\n        div {\n          box-sizing: border-box;\n          display: block;\n          position: absolute;\n          width: 0.8em;\n          height: 0.8em;\n          margin: 0.1em;\n          border: 0.1em solid #fff;\n          border-radius: 50%;\n          animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n          border-color: currentColor transparent transparent transparent;\n        }\n        div:nth-of-type(1) {\n          animation-delay: -0.45s;\n        }\n        div:nth-of-type(2) {\n          animation-delay: -0.3s;\n        }\n        div:nth-of-type(3) {\n          animation-delay: -0.15s;\n        }\n        @keyframes lds-ring {\n          0% {\n            transform: rotate(0deg);\n          }\n          100% {\n            transform: rotate(360deg);\n          }\n        }\n      `}\n    >\n      <div />\n      <div />\n      <div />\n    </div>\n  );\n}\n","import type { TableTheme } from '../../types';\n\nexport const Badge: TableTheme['components']['Badge'] = ({ badgeContent, children }) => {\n  return (\n    <span\n      css={{\n        display: 'inline-flex',\n        position: 'relative',\n        flexShrink: 0,\n        verticalAlign: 'middle',\n      }}\n    >\n      {children}\n\n      <span\n        css={[\n          {\n            top: 0,\n            right: 0,\n            transform: 'scale(1) translate(50%, -50%)',\n            transformOrigin: '100% 0%',\n            height: 20,\n            display: 'flex',\n            padding: '0 6px',\n            zIndex: 1,\n            position: 'absolute',\n            flexWrap: 'wrap',\n            minWidth: 20,\n            transition: 'transform 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n            alignItems: 'center',\n            lineHeight: 1,\n            alignContent: 'center',\n            borderRadius: 10,\n            justifyContent: 'center',\n            fontSize: '0.8em',\n          },\n          !badgeContent && {\n            transform: 'scale(0) translate(50%, -50%)',\n            transition: 'transform 195ms cubic-bezier(0.4, 0, 0.2, 1) 0ms',\n          },\n        ]}\n      >\n        {badgeContent}\n      </span>\n    </span>\n  );\n};\n","import type { TableTheme } from '../../types';\n\nexport const Button: TableTheme['components']['Button'] = ({\n  startIcon,\n  children,\n  variant = 'text',\n  ...props\n}) => {\n  return (\n    <button\n      css={[\n        {\n          padding: `var(--spacing) calc(var(--spacing) * 2)`,\n          display: 'inline-flex',\n          alignItems: 'center',\n          transition: 'background-color 150ms',\n          border: 'none',\n          cursor: 'pointer',\n          background: 'transparent',\n          borderRadius: 4,\n\n          '&:active:not(:disabled)': {\n            transform: 'scale3d(0.95, 0.95, 1)',\n          },\n        },\n        variant === 'text' && {\n          '&:hover': {\n            background: 'rgba(0, 0, 0, 0.1)',\n          },\n        },\n        variant === 'outlined' && {\n          border: '1px solid var(--table-button-border, var(--table-border, #777777))',\n\n          '&:disabled': {\n            borderColor: 'var(--table-button-border-disabled, #eeeeee)',\n          },\n        },\n        variant === 'contained' && {\n          color: 'var(--primaryContrastText)',\n          backgroundColor: 'var(--primaryMain)',\n          boxShadow:\n            '0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)',\n\n          '&:hover': {\n            filter: 'brightness(0.9)',\n          },\n\n          '&:disabled': {\n            filter: 'grayscale()',\n            opacity: 0.5,\n          },\n        },\n      ]}\n      {...props}\n    >\n      {startIcon && <span css={{ marginRight: `calc(var(--spacing) * 2)` }}>{startIcon}</span>}\n      <span>{children}</span>\n    </button>\n  );\n};\n","import type { TableTheme } from '../../types';\n\nexport const Checkbox: TableTheme['components']['Checkbox'] = ({ className, ...props }) => {\n  return (\n    <label\n      css={[\n        {\n          padding: 'calc(var(--spacing) * 1.8)',\n          display: 'flex',\n          color: 'currentcolor',\n          userSelect: 'none',\n\n          '& input': {\n            appearance: 'none',\n            margin: 0,\n          },\n        },\n        props.disabled && { color: 'rgba(0, 0, 0, 0.26)' },\n      ]}\n      className={className}\n    >\n      <input type=\"checkbox\" {...props} />\n\n      {props.checked ? (\n        <svg\n          css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'var(--primaryMain)' }}\n          focusable=\"false\"\n          viewBox=\"0 0 24 24\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"></path>\n        </svg>\n      ) : (\n        <svg\n          css={{ fontSize: '1.25rem', width: '1em', height: '1em', fill: 'currentColor' }}\n          focusable=\"false\"\n          viewBox=\"0 0 24 24\"\n          aria-hidden=\"true\"\n        >\n          <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"></path>\n        </svg>\n      )}\n    </label>\n  );\n};\n","import type { TableTheme } from '../../types';\n\nexport const IconButton: TableTheme['components']['IconButton'] = (props) => {\n  return (\n    <button\n      css={{\n        padding: 'var(--spacing)',\n        borderRadius: '50%',\n        display: 'inline-flex',\n        justifyContent: 'center',\n        alignItems: 'center',\n        transition: 'background-color 150ms',\n        border: 'none',\n        cursor: 'pointer',\n        color: 'inherit',\n        background: 'transparent',\n\n        '&:hover': {\n          backgroundColor: 'rgba(0, 0, 0, 0.04)',\n        },\n\n        '&:active': {\n          transformColor: 'scale3d(0.95, 0.95, 1)',\n        },\n      }}\n      {...props}\n    />\n  );\n};\n","import type { TableTheme } from '../../types';\n\nexport const TextField: TableTheme['components']['TextField'] = ({\n  startIcon,\n  endIcon,\n  className,\n  inputRef,\n  onBlur,\n  ...props\n}) => {\n  return (\n    <div\n      className={className}\n      css={[\n        {\n          flex: 1,\n          display: 'flex',\n          alignItems: 'center',\n          border: '1px solid var(--table-textfield-border, var(--table-border, #777777))',\n          borderRadius: 4,\n\n          '&:focus-within': {\n            border: '2px solid var(--primaryMain)',\n            margin: -1,\n          },\n        },\n      ]}\n    >\n      {startIcon}\n\n      <input\n        ref={inputRef}\n        {...props}\n        value={props.value ?? ''}\n        onBlur={onBlur}\n        css={{\n          minWidth: 0,\n          width: '100%',\n          flex: 1,\n          border: 'none',\n          outline: 'none',\n          borderRadius: 4,\n          padding: 'calc(var(--spacing) * 2)',\n          paddingLeft: startIcon ? 0 : undefined,\n          paddingRight: endIcon ? 0 : undefined,\n          transition: 'outline 500ms',\n        }}\n      />\n\n      {endIcon}\n    </div>\n  );\n};\n","import { Spinner } from '../../components/spinnner';\nimport type { TableTheme } from '../../types';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport { IconButton } from './iconButton';\nimport { Popover } from './popover';\nimport { TextField } from './textField';\n\nexport const defaultComponents: TableTheme['components'] = {\n  IconButton,\n  Checkbox,\n  Popover,\n  Button,\n  Badge,\n  TextField,\n  Spinner,\n};\n","import { ClassNames, css } from '@emotion/react';\nimport type { HTMLProps } from 'react';\nimport { cloneElement } from 'react';\nimport type { TableTheme } from '../../types';\n\nconst IconDefaultStyle = css({\n  width: '1.5em',\n  height: '1.5em',\n  color: 'inherit',\n});\n\nfunction Icon(svg: JSX.Element) {\n  return function IconComponent(props: HTMLProps<Element>) {\n    return (\n      <ClassNames>\n        {({ css }) =>\n          cloneElement(svg, {\n            ...props,\n            className: css(IconDefaultStyle, props.className),\n          })\n        }\n      </ClassNames>\n    );\n  };\n}\n\nconst Settings = Icon(\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    fill=\"currentColor\"\n  >\n    <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n    <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n  </svg>,\n);\n\nconst Export = Icon(\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    enableBackground=\"new 0 0 24 24\"\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    fill=\"currentColor\"\n  >\n    <g>\n      <rect fill=\"none\" height=\"24\" width=\"24\" />\n    </g>\n    <g>\n      <path d=\"M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z\" />\n    </g>\n  </svg>,\n);\n\nconst Clipboard = Icon(\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    fill=\"currentColor\"\n  >\n    <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n    <path d=\"M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\" />\n  </svg>,\n);\n\nconst ChevronRight = Icon(\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    fill=\"currentColor\"\n  >\n    <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n    <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z\" />\n  </svg>,\n);\n\nconst Search = Icon(\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    fill=\"currentColor\"\n  >\n    <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n    <path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n  </svg>,\n);\n\nconst Clear = Icon(\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    fill=\"currentColor\"\n  >\n    <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n    <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n  </svg>,\n);\n\nconst ArrowDropDown = Icon(\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    fill=\"currentColor\"\n  >\n    <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n    <path d=\"M7 10l5 5 5-5H7z\" />\n  </svg>,\n);\n\nconst FilterList = Icon(\n  <svg viewBox=\"0 0 24 24\">\n    <path\n      fill=\"currentColor\"\n      d=\"M14,12V19.88C14.04,20.18 13.94,20.5 13.71,20.71C13.32,21.1 12.69,21.1 12.3,20.71L10.29,18.7C10.06,18.47 9.96,18.16 10,17.87V12H9.97L4.21,4.62C3.87,4.19 3.95,3.56 4.38,3.22C4.57,3.08 4.78,3 5,3V3H19V3C19.22,3 19.43,3.08 19.62,3.22C20.05,3.56 20.13,4.19 19.79,4.62L14.03,12H14Z\"\n    />\n  </svg>,\n);\n\nconst ArrowUpward = Icon(\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    height=\"24px\"\n    viewBox=\"0 0 24 24\"\n    width=\"24px\"\n    fill=\"currentColor\"\n  >\n    <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n    <path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n  </svg>,\n);\n\nexport const defaultIcons: TableTheme['icons'] = {\n  Settings,\n  Export,\n  Clipboard,\n  ChevronRight,\n  Search,\n  Clear,\n  ArrowDropDown,\n  FilterList,\n  ArrowUpward,\n};\n","import type { TableTheme } from '../../types';\n\nexport const defaultTexts: TableTheme['text'] = {\n  selectColumns: 'Select visible columns',\n  showAllColumns: 'Show all',\n  hideAllColumns: 'Hide all',\n  noResults: 'No results',\n  exportTitle: 'Export',\n  exportCopy: 'To clipboard',\n  exportDownload: 'Download',\n  today: 'Today',\n  thisWeek: 'This week',\n  thisMonth: 'This month',\n  thisYear: 'This year',\n  lastSevenDays: 'Last 7 days',\n  lastThirtyDays: 'Last 30 days',\n  clearFilters: 'Clear all filters',\n  reset: 'Reset',\n  loading: 'Loading',\n  deselectAll: 'Deselect all',\n  resetAll: 'Reset table state',\n  rangeMin: 'Min',\n  rangeMax: 'Max',\n  calendarWeek: 'Wk',\n};\n","import type { TableTheme } from '../../types';\nimport { defaultColors } from './defaultColors';\nimport { defaultComponents } from './defaultComponents';\nimport { defaultIcons } from './defaultIcons';\nimport { defaultTexts } from './defaultTexts';\n\nexport const defaultTableTheme: TableTheme = {\n  text: defaultTexts,\n  components: defaultComponents,\n  icons: defaultIcons,\n  colors: defaultColors,\n  spacing: '5px',\n};\n","import type { DependencyList, ReactNode } from 'react';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { FunctionWithDeps } from '../types';\n\nconst TableMemoContext = createContext(new Map<string, [value: any, deps: DependencyList]>());\n\nexport function TableMemoContextProvider({ children }: { children: ReactNode }) {\n  return (\n    <TableMemoContext.Provider value={useMemo(() => new Map(), [])}>\n      {children}\n    </TableMemoContext.Provider>\n  );\n}\n\nexport function useTableMemo() {\n  const memoCache = useContext(TableMemoContext);\n\n  return <Function_ extends (...args: any[]) => any>(\n    key: string,\n    function_: FunctionWithDeps<Function_>,\n  ): Function_ => {\n    let deps: DependencyList;\n    if (Array.isArray(function_)) {\n      deps = function_.slice(1);\n      function_ = function_[0];\n    } else {\n      deps = [function_.toString()];\n    }\n\n    let cachedValue = memoCache.get(key);\n    const hit =\n      cachedValue &&\n      cachedValue[1].length === deps.length &&\n      cachedValue[1].every((x, i) => x === deps[i]);\n    if (!cachedValue || !hit) {\n      cachedValue = [function_, deps];\n      memoCache.set(key, cachedValue);\n    }\n    return cachedValue[0];\n  };\n}\n","import { useContext } from 'react';\nimport { Store } from 'schummar-state/react';\nimport { ColumnContext, TableContext } from '../misc/tableContext';\nimport { defaultTableTheme } from '../theme/defaultTheme';\nimport { globalTableTheme, mergeThemes } from '../theme/tableTheme';\nimport type { MemoizedTableTheme, TableTheme } from '../types';\nimport { useTableMemo } from './useTableMemo';\nimport { TableSettingsContext } from '../misc/tableSettings';\n\nconst emptyStore = new Store(undefined);\n\nexport function useTheme<T, S>(selector: (theme: MemoizedTableTheme<T>) => S): S {\n  const { theme: contextTableTheme = {} } = useContext(TableSettingsContext);\n  const table = useContext(TableContext);\n  const columnId = useContext(ColumnContext);\n  const memo = useTableMemo();\n  const _globalTableTheme = globalTableTheme.useState();\n\n  const process = (t: TableTheme<T>): MemoizedTableTheme<T> => {\n    const rowClass = t.classes?.row;\n    const rowStyles = t.styles?.row;\n    const cellClass = t.classes?.cell;\n    const cellStyles = t.styles?.cell;\n    const detailsClass = t.classes?.details;\n    const detailsStyles = t.styles?.details;\n\n    return {\n      ...t,\n      classes: {\n        ...t.classes,\n        row:\n          rowClass instanceof Function || Array.isArray(rowClass)\n            ? memo('theme.classes.row', rowClass)\n            : rowClass,\n        cell:\n          cellClass instanceof Function || Array.isArray(cellClass)\n            ? memo('theme.classes.cell', cellClass)\n            : cellClass,\n        details:\n          detailsClass instanceof Function || Array.isArray(detailsClass)\n            ? memo('theme.classes.details', detailsClass)\n            : detailsClass,\n      },\n      styles: {\n        ...t.styles,\n        row:\n          rowStyles instanceof Function || Array.isArray(rowStyles)\n            ? memo('theme.styles.row', rowStyles)\n            : rowStyles,\n        cell:\n          cellStyles instanceof Function || Array.isArray(cellStyles)\n            ? memo('theme.styles.cell', cellStyles)\n            : cellStyles,\n        details:\n          detailsStyles instanceof Function || Array.isArray(detailsStyles)\n            ? memo('theme.styles.details', detailsStyles)\n            : detailsStyles,\n      },\n      text: {\n        ...t.text,\n      },\n    };\n  };\n\n  const theme =\n    table?.useState((state) => {\n      const localTheme = {\n        text: state.props.text,\n        classes: state.props.classes,\n        styles: state.props.styles,\n        components: state.props.components,\n        icons: state.props.icons,\n        colors: state.props.colors,\n        spacing: state.props.spacing,\n      };\n\n      const column = state.activeColumns.find((column) => column.id === columnId);\n      const columnsTheme = {\n        classes: column?.classes,\n        styles: column?.styles,\n      };\n\n      const theme = mergeThemes(\n        defaultTableTheme,\n        _globalTableTheme,\n        contextTableTheme,\n        localTheme,\n        columnsTheme,\n      ) as TableTheme<T>;\n\n      return selector(process(theme));\n    }) ??\n    emptyStore.useState() ??\n    selector(\n      process(\n        mergeThemes(defaultTableTheme, _globalTableTheme, contextTableTheme) as TableTheme<T>,\n      ),\n    );\n\n  return theme;\n}\n","import { useTheme } from '../hooks/useTheme';\n\nexport function useCssVariables() {\n  return useTheme(({ spacing, colors }) => {\n    return {\n      '--spacing': spacing,\n      '--primaryMain': colors.primary.main,\n      '--primaryLight': colors.primary.light,\n      '--primaryContrastText': colors.primary.contrastText,\n      '--secondaryMain': colors.secondary.main,\n      '--secondaryLight': colors.secondary.light,\n      '--secondaryContrastText': colors.secondary.contrastText,\n      '--blockedMain': colors.blocked.main,\n      '--blockedLight': colors.blocked.light,\n      '--blockedContrastText': colors.blocked.contrastText,\n      '--table-background-color': colors.background,\n      '--table-text-color': colors.text,\n      '--table-border-color': colors.border,\n      '--table-border-light-color': colors.borderLight,\n    };\n  });\n}\n","import { ClassNames } from '@emotion/react';\nimport { createContext, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport const FilterControlContext = createContext({\n  isActive: false,\n  close: (): void => undefined,\n});\n\nexport function FilterControl<T>(): JSX.Element | null {\n  const table = useTableContext<T>();\n  const columnId = useColumnContext();\n\n  const Popover = useTheme((t) => t.components.Popover);\n  const classes = useTheme((t) => t.classes);\n  const styles = useTheme((t) => t.styles);\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  const cssVariables = useCssVariables();\n\n  const [anchor, setAnchor] = useState<Element | null>(null);\n  const isActive = table.useState((state) => {\n    const filter = state.filters.get(columnId);\n    const filterValue = state.filterValues.get(columnId);\n    return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n  });\n  const filterClassNames = table.useState((state) => {\n    const filter = state.filters.get(columnId);\n    return filter?.classNames;\n  });\n  const filter = table.useState(\n    (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n  );\n\n  function reset() {\n    const impl = table.getState().filters.get(columnId);\n\n    impl?.onChange?.(undefined);\n\n    if (impl?.value === undefined) {\n      table.update((state) => {\n        state.filterValues.delete(columnId);\n      });\n    }\n  }\n\n  if (!filter) return null;\n\n  function close() {\n    setAnchor(null);\n  }\n\n  return (\n    <FilterControlContext.Provider value={{ isActive: !!anchor, close }}>\n      <IconButton\n        onClick={(event) => setAnchor(event.currentTarget)}\n        onContextMenu={(event) => {\n          reset();\n          event.preventDefault();\n          return false;\n        }}\n        css={[\n          { color: '#b0bac9' },\n          isActive && {\n            color: 'var(--primaryMain) !important',\n          },\n        ]}\n      >\n        {isActive ? <FilterList /> : <ArrowDropDown />}\n      </IconButton>\n\n      <div\n        onPointerDown={(event) => {\n          event.stopPropagation();\n        }}\n        onPointerMove={(event) => {\n          event.stopPropagation();\n        }}\n      >\n        <ClassNames>\n          {({ css, cx }) => (\n            <Popover\n              open\n              hidden={!anchor}\n              onClose={close}\n              anchorEl={anchor ?? document.body}\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              {filter}\n            </Popover>\n          )}\n        </ClassNames>\n      </div>\n    </FilterControlContext.Provider>\n  );\n}\n","import type { ComponentType } from 'react';\nimport { useContext, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\nimport { FilterControlContext } from './filterControl';\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  const { isActive } = useContext(FilterControlContext);\n\n  useLayoutEffect(() => {\n    if (isActive && ref.current) {\n      setTimeout(() => {\n        ref.current?.focus();\n      });\n    }\n  }, [isActive]);\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","export function debounce<Args extends any[]>(\n  function_: (...args: Args) => void,\n  ms: number,\n): { (...args: Args): void; flush(): void; cancel(): void } {\n  let lastArgs: Args | undefined;\n  let timeout: ReturnType<typeof setTimeout> | undefined;\n\n  function run() {\n    const args = lastArgs;\n\n    lastArgs = undefined;\n    timeout = undefined;\n\n    function_(...(args as Args));\n  }\n\n  return Object.assign(\n    function (...args: Args) {\n      lastArgs = args;\n\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n\n      timeout = setTimeout(run, ms);\n    },\n    {\n      flush() {\n        if (timeout) {\n          clearTimeout(timeout);\n          run();\n        }\n      },\n\n      cancel() {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = undefined;\n          lastArgs = undefined;\n        }\n      },\n    },\n  );\n}\n","import { castDraft } from 'immer';\nimport { nanoid } from 'nanoid';\nimport { useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { FilterControlContext } from '../components/filterControl';\nimport { debounce } from '../misc/debounce';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { FilterImplementation } from '../types';\nimport { useTableMemo } from './useTableMemo';\n\nexport function useFilter<TItem, TColumnValue, TFilterBy, TFilterValue>(\n  impl: FilterImplementation<TItem, TColumnValue, TFilterBy, TFilterValue>,\n) {\n  const table = useTableContext<TItem>();\n  const columnId = useColumnContext();\n  const cache = useTableMemo();\n  const cacheId = useMemo(() => nanoid(), []);\n  const filterBy = impl.filterBy && cache(cacheId, impl.filterBy);\n\n  // On mount and reset: Fire onChange\n  useEffect(() => {\n    if (impl.value === undefined) {\n      impl.onChange?.(impl.defaultValue);\n    }\n  }, [table]);\n\n  // Update implementation\n  useEffect(() => {\n    table.update((state) => {\n      if (impl.defaultValue !== undefined) {\n        state.filterValues.set(columnId, impl.defaultValue);\n      }\n    });\n  }, [table]);\n\n  useEffect(() => {\n    table.update((state) => {\n      state.filters.set(columnId, castDraft({ ...impl, filterBy }));\n\n      if (impl.value !== undefined) {\n        state.filterValues.set(columnId, impl.value);\n      }\n    });\n\n    return () => {\n      table.update((state) => {\n        state.filters.delete(columnId);\n      });\n    };\n  }, [table, columnId, impl]);\n\n  // Track local value and update it globally after delay\n  const value = table.useState(\n    (state) => state.filterValues.get(columnId) as TFilterValue | undefined,\n  );\n  const [dirtyValue, setDirtyValue] = useState<TFilterValue>();\n  const implRef = useRef(impl);\n\n  useLayoutEffect(() => {\n    implRef.current = impl;\n  });\n\n  const delayedUpdate = useMemo(\n    () =>\n      debounce((value?: TFilterValue) => {\n        const { value: controlledValue, onChange } = implRef.current;\n\n        if (controlledValue === undefined) {\n          table.update((state) => {\n            state.filterValues.set(columnId, value);\n          });\n        }\n\n        onChange?.(value);\n        setDirtyValue(undefined);\n      }, 500),\n    [table],\n  );\n\n  function onChange(value?: TFilterValue) {\n    setDirtyValue(value);\n    delayedUpdate(value);\n  }\n\n  useEffect(() => delayedUpdate.flush(), [delayedUpdate]);\n\n  const context = useContext(FilterControlContext);\n\n  return {\n    value: dirtyValue ?? value,\n    onChange,\n    filterBy: filterBy ?? ((x) => x as unknown as TFilterBy | TFilterBy[]),\n    ...context,\n  };\n}\n","import { forwardRef, useContext } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { FilterControlContext } from './filterControl';\n\nexport default forwardRef(FilterDialog);\n\nfunction FilterDialog(_props: {}, ref: React.Ref<HTMLDialogElement>): JSX.Element | null {\n  const table = useTableContext();\n  const columnId = useColumnContext();\n\n  const classes = useTheme((t) => t.classes);\n  const styles = useTheme((t) => t.styles);\n  const IconButton = useTheme((t) => t.components.IconButton);\n  const FilterList = useTheme((t) => t.icons.FilterList);\n\n  const filter = table.useState(\n    (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n  );\n\n  const label = table.useState((state) => {\n    return state.activeColumns.find((column) => column.id === columnId)?.header ?? null;\n  });\n\n  const isActive = table.useState((state) => {\n    const filter = state.filters.get(columnId);\n    const filterValue = state.filterValues.get(columnId);\n    return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n  });\n\n  const { close } = useContext(FilterControlContext);\n\n  return (\n    <dialog\n      ref={ref}\n      onClick={close}\n      className={classes?.dialog}\n      css={[\n        {\n          padding: 0,\n          border: 'none',\n          borderRadius: 4,\n\n          '::backdrop': {\n            backgroundColor: 'rgba(0, 0, 0, 0.7)',\n          },\n        },\n        styles?.dialog,\n      ]}\n    >\n      <div onClick={(e) => e.stopPropagation()}>\n        <div\n          css={{\n            position: 'relative',\n            padding: 10,\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center',\n            gap: 10,\n          }}\n        >\n          <FilterList\n            css={{\n              color: isActive ? 'var(--primaryMain)' : '#b0bac9',\n            }}\n          />\n\n          <div\n            css={{\n              whiteSpace: 'nowrap',\n              overflow: 'hidden',\n              textOverflow: 'ellipsis',\n              paddingRight: '2em',\n            }}\n          >\n            {label}\n          </div>\n\n          <IconButton\n            onClick={close}\n            css={{\n              position: 'absolute',\n              right: 0,\n              top: 0,\n              fontSize: '1em',\n              padding: '0.5em',\n              margin: '0.5em',\n              lineHeight: 1,\n            }}\n          >\n            ✕\n          </IconButton>\n        </div>\n\n        <div\n          css={{\n            overflow: 'auto',\n          }}\n        >\n          {filter}\n        </div>\n      </div>\n    </dialog>\n  );\n}\n","import { useContext, useEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { FilterControlContext } from './filterControl';\nimport FilterDialog from './filterDialog';\n\nexport function NestedFilterControl<T>(): JSX.Element | null {\n  const table = useTableContext<T>();\n  const columnId = useColumnContext();\n  const Button = useTheme((t) => t.components.Button);\n  const FilterList = useTheme((t) => t.icons.FilterList);\n  const dialog = useRef<HTMLDialogElement>(null);\n  const label = table.useState((state) => {\n    return state.activeColumns.find((column) => column.id === columnId)?.header ?? null;\n  });\n\n  const isActive = table.useState((state) => {\n    const filter = state.filters.get(columnId);\n    const filterValue = state.filterValues.get(columnId);\n    return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n  });\n\n  const filter = table.useState(\n    (state) => state.activeColumns.find((column) => column.id === columnId)?.filter,\n  );\n\n  useEffect(\n    () => () => {\n      dialog.current?.close();\n    },\n    [],\n  );\n\n  if (!filter) return null;\n\n  function reset() {\n    const impl = table.getState().filters.get(columnId);\n\n    impl?.onChange?.(undefined);\n\n    if (impl?.value === undefined) {\n      table.update((state) => {\n        state.filterValues.delete(columnId);\n      });\n    }\n  }\n\n  const parentContext = useContext(FilterControlContext);\n\n  function close() {\n    dialog.current?.close();\n    parentContext.close();\n  }\n\n  return (\n    <FilterControlContext.Provider value={{ isActive: true, close }}>\n      <Button\n        onClick={() => dialog.current?.showModal()}\n        onContextMenu={(event) => {\n          reset();\n          event.preventDefault();\n          return false;\n        }}\n        startIcon={\n          <FilterList\n            css={{\n              color: isActive ? 'var(--primaryMain)' : '#b0bac9',\n            }}\n          />\n        }\n        css={{\n          width: '100%',\n          color: isActive ? 'var(--primaryMain)' : 'var(--color-text)',\n        }}\n      >\n        {label}\n      </Button>\n\n      <div\n        onPointerDown={(event) => {\n          event.stopPropagation();\n        }}\n        onPointerMove={(event) => {\n          event.stopPropagation();\n        }}\n      >\n        <FilterDialog ref={dialog} />\n      </div>\n    </FilterControlContext.Provider>\n  );\n}\n","import { useFilter } from '../hooks/useFilter';\nimport { ColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps } from '../types';\nimport { NestedFilterControl } from './nestedFilterControl';\n\nexport interface CombinedFilterProps\n  extends Pick<CommonFilterProps<any, any, any, any>, 'classNames'> {\n  columnIds?: string[];\n}\n\nexport default function CombinedFilter({\n  columnIds: inputColumnIds,\n  ...props\n}: CombinedFilterProps) {\n  const table = useTableContext();\n\n  const columnIds = table.useState((state) => {\n    return (\n      inputColumnIds ??\n      state.activeColumns\n        .filter(\n          (column) =>\n            column.filter !== undefined && !state.visibleColumns.some((c) => c.id === column.id),\n        )\n        .map((column) => column.id)\n    );\n  });\n\n  const isActive = table.useState((state) => {\n    return columnIds.some((columnId) => {\n      const filter = state.filters.get(columnId);\n      const filterValue = state.filterValues.get(columnId);\n      return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n    });\n  });\n\n  useFilter({\n    ...props,\n\n    id: 'combinedFilter',\n\n    value: isActive,\n\n    isActive(filterValue) {\n      return filterValue;\n    },\n\n    test() {\n      return true;\n    },\n\n    onChange(value) {\n      if (value === undefined) {\n        for (const columnId of columnIds) {\n          const impl = table.getState().filters.get(columnId);\n\n          impl?.onChange?.(undefined);\n\n          if (impl?.value === undefined) {\n            table.update((state) => {\n              state.filterValues.delete(columnId);\n            });\n          }\n        }\n      }\n    },\n  });\n\n  return (\n    <div>\n      {columnIds.map((columnId) => (\n        <ColumnContext.Provider key={columnId} value={columnId}>\n          <NestedFilterControl />\n        </ColumnContext.Provider>\n      ))}\n    </div>\n  );\n}\n","export function defaults<T extends object>(first: T, ...more: Partial<T>[]): T {\n  return more.reduce<T>((acc, source) => {\n    const copy = { ...acc };\n\n    for (const [key, value] of Object.entries(source)) {\n      copy[key as keyof T] ??= value as any;\n    }\n\n    return copy;\n  }, first);\n}\n","import { addDays, isBefore, isToday, startOfDay, differenceInCalendarMonths } from 'date-fns';\nimport { SyntheticEvent } from 'react';\n\nexport type DayzedDateObject = {\n  date: Date;\n  nextMonth: boolean;\n  prevMonth: boolean;\n  selectable: boolean;\n  selected: boolean;\n  today: boolean;\n};\n\nexport type DayzedCalendar = {\n  firstDayOfMonth: Date;\n  lastDayOfMonth: Date;\n  month: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\n  weeks: Array<Array<DayzedDateObject | ''>>;\n  year: number;\n};\n\n/**\n * This is intended to be used to compose event handlers\n * They are executed in order until one of them calls\n * `event.preventDefault()`. Not sure this is the best\n * way to do this, but it seems legit...\n * @param {Function} fns the event hanlder functions\n * @return {Function} the event handler to add to an element\n */\nexport function composeEventHandlers(\n  ...fns: (((event: SyntheticEvent, ...args: any[]) => any) | undefined)[]\n) {\n  return (event: SyntheticEvent, ...args: any[]) =>\n    fns.some((fn) => {\n      if (fn) {\n        fn(event, ...args);\n      }\n      return event.defaultPrevented;\n    });\n}\n\n/**\n * Throws a helpful error message for required properties. Useful\n * to be used as a default in destructuring or object params.\n * @param {String} fnName the function name\n * @param {String} propName the prop name\n */\nexport function requiredProp(fnName: string, propName: string): never {\n  throw new Error(`The property \"${propName}\" is required in \"${fnName}\"`);\n}\n\n/**\n * Takes a calendars array and figures out the number of months to subtract\n * based on the current offset and the minDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Number} param.offset The num of months to be subtracted\n * @param {Date} param.minDate The earliest date we are allow to subtract back to\n * @returns {Number} The number of months to subtract\n */\nexport function subtractMonth({\n  calendars,\n  offset,\n  minDate,\n}: {\n  calendars: DayzedCalendar[];\n  offset: number;\n  minDate?: Date;\n}) {\n  if (offset > 1 && minDate) {\n    const { firstDayOfMonth } = calendars[0]!;\n    const diffInMonths = differenceInCalendarMonths(firstDayOfMonth, minDate);\n    if (diffInMonths < offset) {\n      offset = diffInMonths;\n    }\n  }\n  return offset;\n}\n\n/**\n * Takes a calendars array and figures out the number of months to add\n * based on the current offset and the maxDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Number} param.offset The num of months to be added\n * @param {Date} param.maxDate The furthest date we are allow to add forward to\n * @returns {Number} The number of months to add\n */\nexport function addMonth({\n  calendars,\n  offset,\n  maxDate,\n}: {\n  calendars: DayzedCalendar[];\n  offset: number;\n  maxDate?: Date;\n}) {\n  if (offset > 1 && maxDate) {\n    const { lastDayOfMonth } = calendars[calendars.length - 1]!;\n    const diffInMonths = differenceInCalendarMonths(maxDate, lastDayOfMonth);\n    if (diffInMonths < offset) {\n      offset = diffInMonths;\n    }\n  }\n  return offset;\n}\n\n/**\n * Takes a calendars array and figures out if the back button should be\n * disabled based on the minDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Date} param.minDate The earliest date available\n * @returns {Boolean} Whether the back button should be disabled.\n */\nexport function isBackDisabled({\n  calendars,\n  minDate,\n}: {\n  calendars: DayzedCalendar[];\n  minDate?: Date;\n}) {\n  if (!minDate) {\n    return false;\n  }\n  const { firstDayOfMonth } = calendars[0]!;\n  const firstDayOfMonthMinusOne = addDays(firstDayOfMonth, -1);\n  if (isBefore(firstDayOfMonthMinusOne, minDate)) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Takes a calendars array and figures out if the forward button should be\n * disabled based on the maxDate allowed.\n * @param {Object} param The param object\n * @param {Array} param.calendars The calendars array created by the getCalendars function\n * @param {Date} param.maxDate The furthest date available\n * @returns {Boolean} Whether the forward button should be disabled.\n */\nexport function isForwardDisabled({\n  calendars,\n  maxDate,\n}: {\n  calendars: DayzedCalendar[];\n  maxDate?: Date;\n}) {\n  if (!maxDate) {\n    return false;\n  }\n  const { lastDayOfMonth } = calendars[calendars.length - 1]!;\n  const lastDayOfMonthPlusOne = addDays(lastDayOfMonth, 1);\n  if (isBefore(maxDate, lastDayOfMonthPlusOne)) {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Figures out the months data needed based off the number of monthsToDisplay\n * and other options provided.\n * @param {Object} param The param object\n * @param {Date} param.date The date to start the calendar at\n * @param {Array.<Date>} param.selected An array of dates currently selected\n * @param {Number} param.monthsToDisplay The number of months to return in the calendar view\n * @param {Number} param.offset The number of months to offset based off the param.date given\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Object>} An array of objects with month data\n */\nexport function getCalendars({\n  date,\n  selected,\n  monthsToDisplay,\n  offset,\n  minDate,\n  maxDate,\n  firstDayOfWeek,\n  showOutsideDays,\n}: {\n  date: Date;\n  selected: Date[];\n  monthsToDisplay: number;\n  offset: number;\n  minDate?: Date;\n  maxDate?: Date;\n  firstDayOfWeek: number;\n  showOutsideDays: boolean;\n}): DayzedCalendar[] {\n  const months: DayzedCalendar[] = [];\n  const startDate = getStartDate(date, minDate, maxDate);\n  for (let i = 0; i < monthsToDisplay; i++) {\n    const calendarDates = getMonths({\n      month: startDate.getMonth() + i + offset,\n      year: startDate.getFullYear(),\n      selectedDates: selected,\n      minDate,\n      maxDate,\n      firstDayOfWeek,\n      showOutsideDays,\n    });\n    months.push(calendarDates);\n  }\n  return months;\n}\n\n/**\n * Figures out the actual start date based on\n * the min and max dates available.\n * @param {Date} date The we want to start the calendar at\n * @param {Date} minDate The earliest date available to start at\n * @param {Date} maxDate The latest date available to start at\n * @returns {Date} The actual start date\n */\nfunction getStartDate(date: Date, minDate?: Date, maxDate?: Date): Date {\n  let startDate = startOfDay(date);\n  if (minDate) {\n    const minDateNormalized = startOfDay(minDate);\n    if (isBefore(startDate, minDateNormalized)) {\n      startDate = minDateNormalized;\n    }\n  }\n  if (maxDate) {\n    const maxDateNormalized = startOfDay(maxDate);\n    if (isBefore(maxDateNormalized, startDate)) {\n      startDate = maxDateNormalized;\n    }\n  }\n  return startDate;\n}\n\n/**\n * Figures what week/day data to return for the given month\n * and year. Adds flags to day data if found in the given selectedDates,\n * if is selectable inside the given min and max dates, or is today.\n * @param {Object} param The param object\n * @param {Number} param.month The month to grab data for\n * @param {Number} param.year The year to grab data for\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Object} The data for the selected month/year\n */\nfunction getMonths({\n  month,\n  year,\n  selectedDates,\n  minDate,\n  maxDate,\n  firstDayOfWeek,\n  showOutsideDays,\n}: {\n  month: number;\n  year: number;\n  selectedDates: Date[];\n  minDate?: Date;\n  maxDate?: Date;\n  firstDayOfWeek: number;\n  showOutsideDays: boolean;\n}): DayzedCalendar {\n  // Get the normalized month and year, along with days in the month.\n  const daysMonthYear = getNumDaysMonthYear(month, year);\n  const daysInMonth = daysMonthYear.daysInMonth;\n  month = daysMonthYear.month;\n  year = daysMonthYear.year;\n\n  // Fill out the dates for the month.\n  const dates: ('' | DayzedDateObject)[] = [];\n  for (let day = 1; day <= daysInMonth; day++) {\n    const date = new Date(year, month, day);\n    const dateObj = {\n      date,\n      selected: isSelected(selectedDates, date),\n      selectable: isSelectable(minDate, maxDate, date),\n      today: isToday(date),\n      prevMonth: false,\n      nextMonth: false,\n    };\n    dates.push(dateObj);\n  }\n\n  const firstDayOfMonth = new Date(year, month, 1);\n  const lastDayOfMonth = new Date(year, month, daysInMonth);\n\n  const frontWeekBuffer = fillFrontWeek({\n    firstDayOfMonth,\n    minDate,\n    maxDate,\n    selectedDates,\n    firstDayOfWeek,\n    showOutsideDays,\n  });\n\n  const backWeekBuffer = fillBackWeek({\n    lastDayOfMonth,\n    minDate,\n    maxDate,\n    selectedDates,\n    firstDayOfWeek,\n    showOutsideDays,\n  });\n\n  dates.unshift(...frontWeekBuffer);\n  dates.push(...backWeekBuffer);\n\n  // Get the filled out weeks for the\n  // given dates.\n  const weeks = getWeeks(dates);\n  // return the calendar data.\n  return {\n    firstDayOfMonth,\n    lastDayOfMonth,\n    month: month as DayzedCalendar['month'],\n    year,\n    weeks,\n  };\n}\n\n/**\n * Fill front week with either empty buffer or dates from previous month,\n * depending on showOutsideDays flag\n * @param {Object} param The param object\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Date} param.firstDayOfMonth First day of the month\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Date>} Buffer to fill front week\n */\nfunction fillFrontWeek({\n  firstDayOfMonth,\n  minDate,\n  maxDate,\n  selectedDates,\n  firstDayOfWeek,\n  showOutsideDays,\n}: {\n  firstDayOfMonth: Date;\n  minDate?: Date;\n  maxDate?: Date;\n  selectedDates: Date[];\n  firstDayOfWeek: number;\n  showOutsideDays: boolean;\n}) {\n  const dates: ('' | DayzedDateObject)[] = [];\n  let firstDay = (firstDayOfMonth.getDay() + 7 - firstDayOfWeek) % 7;\n\n  if (showOutsideDays) {\n    const lastDayOfPrevMonth = addDays(firstDayOfMonth, -1);\n    const prevDate = lastDayOfPrevMonth.getDate();\n    const prevDateMonth = lastDayOfPrevMonth.getMonth();\n    const prevDateYear = lastDayOfPrevMonth.getFullYear();\n\n    // Fill out front week for days from\n    // preceding month with dates from previous month.\n    let counter = 0;\n    while (counter < firstDay) {\n      const date = new Date(prevDateYear, prevDateMonth, prevDate - counter);\n      const dateObj = {\n        date,\n        selected: isSelected(selectedDates, date),\n        selectable: isSelectable(minDate, maxDate, date),\n        today: false,\n        prevMonth: true,\n        nextMonth: false,\n      };\n      dates.unshift(dateObj);\n      counter++;\n    }\n  } else {\n    // Fill out front week for days from\n    // preceding month with buffer.\n    while (firstDay > 0) {\n      dates.unshift('');\n      firstDay--;\n    }\n  }\n\n  return dates;\n}\n\n/**\n * Fill back weeks with either empty buffer or dates from next month,\n * depending on showOutsideDays flag\n * @param {Object} param The param object\n * @param {Array.<Date>} param.selectedDates An array of dates currently selected\n * @param {Date} param.minDate The earliest date available\n * @param {Date} param.maxDate The furthest date available\n * @param {Date} param.lastDayOfMonth Last day of the month\n * @param {Number} param.firstDayOfWeek First day of week, 0-6 (Sunday to Saturday)\n * @param {Bool} param.showOutsideDays Flag to fill front and back weeks with dates from adjacent months\n * @returns {Array.<Date>} Buffer to fill back week\n */\nfunction fillBackWeek({\n  lastDayOfMonth,\n  minDate,\n  maxDate,\n  selectedDates,\n  firstDayOfWeek,\n  showOutsideDays,\n}: {\n  lastDayOfMonth: Date;\n  minDate?: Date;\n  maxDate?: Date;\n  selectedDates: Date[];\n  firstDayOfWeek: number;\n  showOutsideDays: boolean;\n}) {\n  const dates: ('' | DayzedDateObject)[] = [];\n  let lastDay = (lastDayOfMonth.getDay() + 7 - firstDayOfWeek) % 7;\n\n  if (showOutsideDays) {\n    const firstDayOfNextMonth = addDays(lastDayOfMonth, 1);\n    const nextDateMonth = firstDayOfNextMonth.getMonth();\n    const nextDateYear = firstDayOfNextMonth.getFullYear();\n\n    // Fill out back week for days from\n    // following month with dates from next month.\n    let counter = 0;\n    while (counter < 6 - lastDay) {\n      const date = new Date(nextDateYear, nextDateMonth, 1 + counter);\n      const dateObj = {\n        date,\n        selected: isSelected(selectedDates, date),\n        selectable: isSelectable(minDate, maxDate, date),\n        today: false,\n        prevMonth: false,\n        nextMonth: true,\n      };\n      dates.push(dateObj);\n      counter++;\n    }\n  } else {\n    // Fill out back week for days from\n    // following month with buffer.\n    while (lastDay < 6) {\n      dates.push('');\n      lastDay++;\n    }\n  }\n\n  return dates;\n}\n\n/**\n * Normalizes month (could be overflow) and year pairs and returns the\n * normalized month and year along with the number of days in the month.\n * @param {Number} month The month to normalize\n * @param {Number} year The year to normalize\n * @returns {Object} The normalized month and year along with the number of days in the month\n */\nfunction getNumDaysMonthYear(month: number, year: number) {\n  // If a parameter you specify is outside of the expected range for Month or Day,\n  // JS Date attempts to update the date information in the Date object accordingly!\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate\n\n  // Let Date handle the overflow of the month,\n  // which should return the normalized month and year.\n  const normalizedMonthYear = new Date(year, month, 1);\n  month = normalizedMonthYear.getMonth();\n  year = normalizedMonthYear.getFullYear();\n  // Overflow the date to the next month, then subtract the difference\n  // to get the number of days in the previous month.\n  // This will also account for leap years!\n  const daysInMonth = 32 - new Date(year, month, 32).getDate();\n  return { daysInMonth, month, year };\n}\n\n/**\n * Takes an array of dates, and turns them into a multi dimensional\n * array with 7 entries for each week.\n * @param {Array.<Object>} dates An array of dates\n * @returns {Array} The weeks as a multi dimensional array\n */\nfunction getWeeks(dates: ('' | DayzedDateObject)[]) {\n  const weeksLength = Math.ceil(dates.length / 7);\n  const weeks: ('' | DayzedDateObject)[][] = [];\n  for (let i = 0; i < weeksLength; i++) {\n    weeks[i] = [];\n    for (let x = 0; x < 7; x++) {\n      weeks[i]!.push(dates[i * 7 + x]!);\n    }\n  }\n  return weeks;\n}\n\n/**\n * Normalizes dates to the beginning of the day,\n * then checks to see if the day given is found\n * in the selectedDates.\n * @param {Array.<Date>} selectedDates An array of dates currently selected\n * @param {Date} date The date to search with against selectedDates\n * @returns {Boolean} Whether day is found in selectedDates\n */\nfunction isSelected(selectedDates: Date[], date: Date): boolean {\n  selectedDates = Array.isArray(selectedDates) ? selectedDates : [selectedDates];\n  return selectedDates.some((selectedDate) => {\n    if (\n      selectedDate instanceof Date &&\n      startOfDay(selectedDate).getTime() === startOfDay(date).getTime()\n    ) {\n      return true;\n    }\n    return false;\n  });\n}\n\n/**\n * Checks to see if the date given is\n * between the min and max dates.\n * @param {Date} minDate The earliest date available\n * @param {Date} maxDate The furthest date available\n * @param {Date} date The date to compare with\n * @returns {Boolean} Whether the date is between min and max date\n */\nfunction isSelectable(minDate: Date | undefined, maxDate: Date | undefined, date: Date): boolean {\n  if ((minDate && isBefore(date, minDate)) || (maxDate && isBefore(maxDate, date))) {\n    return false;\n  }\n  return true;\n}\n","import { HTMLProps, SyntheticEvent, useState } from 'react';\n\nimport {\n  composeEventHandlers,\n  requiredProp,\n  subtractMonth,\n  addMonth,\n  isBackDisabled,\n  isForwardDisabled,\n  getCalendars,\n  type DayzedDateObject,\n  type DayzedCalendar,\n} from './utils';\n\nfunction isOffsetControlled(propOffset: number | undefined) {\n  return propOffset !== undefined;\n}\n\nfunction getOffset(prop: number | undefined, state: number) {\n  return isOffsetControlled(prop) ? prop : state;\n}\n\nfunction getDateProps(\n  onDateSelected: ((date: DayzedDateObject, event: SyntheticEvent) => void) | undefined,\n  {\n    onClick,\n    dateObj = requiredProp('getDateProps', 'dateObj'),\n    ...rest\n  }: Partial<GetDatePropsOptions> = {},\n) {\n  return {\n    onClick: composeEventHandlers(onClick as any, (event) => {\n      onDateSelected?.(dateObj, event);\n    }),\n    disabled: !dateObj.selectable,\n    'aria-label': dateObj.date.toDateString(),\n    'aria-pressed': dateObj.selected,\n    role: 'button',\n    ...rest,\n  };\n}\n\nfunction getBackProps(\n  {\n    minDate,\n    offsetMonth,\n    handleOffsetChanged,\n  }: {\n    minDate?: Date;\n    offsetMonth: number;\n    handleOffsetChanged: (offset: number) => void;\n  },\n  {\n    onClick,\n    offset = 1,\n    calendars = requiredProp('getBackProps', 'calendars'),\n    ...rest\n  }: Partial<GetBackForwardPropsOptions> = {},\n) {\n  return {\n    onClick: composeEventHandlers(onClick as any, () => {\n      handleOffsetChanged(offsetMonth - subtractMonth({ calendars, offset, minDate }));\n    }),\n    disabled: isBackDisabled({ calendars, minDate }),\n    'aria-label': `Go back ${offset} month${offset === 1 ? '' : 's'}`,\n    ...rest,\n  };\n}\n\nfunction getForwardProps(\n  {\n    maxDate,\n    offsetMonth,\n    handleOffsetChanged,\n  }: {\n    maxDate?: Date;\n    offsetMonth: number;\n    handleOffsetChanged: (offset: number) => void;\n  },\n  {\n    onClick,\n    offset = 1,\n    calendars = requiredProp('getForwardProps', 'calendars'),\n    ...rest\n  }: Partial<GetBackForwardPropsOptions> = {},\n) {\n  return {\n    onClick: composeEventHandlers(onClick as any, () => {\n      handleOffsetChanged(offsetMonth + addMonth({ calendars, offset, maxDate }));\n    }),\n    disabled: isForwardDisabled({ calendars, maxDate }),\n    'aria-label': `Go forward ${offset} month${offset === 1 ? '' : 's'}`,\n    ...rest,\n  };\n}\n\nexport function useDayzed({\n  date = new Date(),\n  maxDate,\n  minDate,\n  monthsToDisplay = 1,\n  firstDayOfWeek = 0,\n  showOutsideDays = false,\n  offset,\n  onDateSelected,\n  onOffsetChanged = () => {},\n  selected,\n}: {\n  date?: Date;\n  maxDate?: Date;\n  minDate?: Date;\n  monthsToDisplay?: number;\n  firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n  showOutsideDays?: boolean;\n  selected?: Date | Date[];\n  offset?: number;\n  onOffsetChanged?(offset: number): void;\n  onDateSelected(selectedDate: DayzedDateObject, event: SyntheticEvent): void;\n}): RenderProps {\n  const [stateOffset, setStateOffset] = useState(0);\n  const offsetMonth = getOffset(offset, stateOffset);\n\n  function handleOffsetChanged(newOffset: number) {\n    if (!isOffsetControlled(offset)) {\n      setStateOffset(newOffset);\n    }\n    onOffsetChanged(newOffset);\n  }\n\n  const calendars = getCalendars({\n    date,\n    selected: Array.isArray(selected) ? selected : selected ? [selected] : [],\n    monthsToDisplay,\n    minDate,\n    maxDate,\n    offset: offsetMonth,\n    firstDayOfWeek,\n    showOutsideDays,\n  });\n  return {\n    calendars,\n    getDateProps: getDateProps.bind(null, onDateSelected),\n    getBackProps: getBackProps.bind(null, {\n      minDate,\n      offsetMonth,\n      handleOffsetChanged,\n    }),\n    getForwardProps: getForwardProps.bind(null, {\n      maxDate,\n      offsetMonth,\n      handleOffsetChanged,\n    }),\n  };\n}\n\ninterface GetBackForwardPropsOptions extends HTMLProps<HTMLButtonElement> {\n  calendars: DayzedCalendar[];\n  offset?: number;\n}\n\ninterface GetDatePropsOptions extends HTMLProps<HTMLButtonElement> {\n  dateObj: DayzedDateObject;\n}\n\ninterface RenderProps {\n  calendars: DayzedCalendar[];\n  getBackProps: (data: GetBackForwardPropsOptions) => Record<string, any>;\n  getForwardProps: (data: GetBackForwardPropsOptions) => Record<string, any>;\n  getDateProps: (data: GetDatePropsOptions) => Record<string, any>;\n}\n\nexport type { DayzedDateObject } from './utils';\n","import { useEffect, useRef } from 'react';\n\nexport default function useLatestRef<T>(value: T) {\n  const latestValue = useRef(value);\n\n  useEffect(() => {\n    latestValue.current = value;\n  }, [value]);\n\n  return latestValue;\n}\n","import { nanoid } from 'nanoid';\nimport { Fragment, useMemo, useState } from 'react';\nimport useLatestRef from '../hooks/useLatestRef';\nimport { debounce } from '../misc/debounce';\n\nexport interface DateInputProps {\n  value: Date | null;\n  onChange: (date: Date | null) => void;\n  locale?: string;\n}\n\ntype Part = 'day' | 'month' | 'year';\n\nconst className = 'schummar-table-date-input';\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is Part =>\n  type === 'day' || type === 'month' || type === 'year';\n\nconst maxValues = {\n  day: 31,\n  month: 12,\n  year: 9999,\n};\n\nconst tabNext = (event: Element, id: string) => {\n  const all = Array.from(document.querySelectorAll(`.${className}-${id}`));\n  const index = all.indexOf(event);\n  const next = all[index + 1];\n\n  if (next instanceof HTMLElement) {\n    next.focus();\n  }\n};\n\nfunction buildDate(value: Partial<Record<Part, string>>, baseDate = new Date()): Date {\n  const date = new Date(baseDate);\n\n  if (value.year) {\n    date.setFullYear(Number(value.year));\n  }\n\n  if (value.month) {\n    date.setMonth(Number(value.month) - 1);\n  }\n\n  if (value.day) {\n    date.setDate(Number(value.day));\n  }\n\n  return date;\n}\n\nexport function DateInput({ value, onChange, locale }: DateInputProps) {\n  const id = useMemo(() => nanoid(), []);\n  const [localValue, setLocalValue] = useState<Partial<Record<Part, string>>>();\n  const latestValue = useLatestRef(value);\n\n  const commit = useMemo(\n    () =>\n      debounce(\n        (\n          localValue: Partial<Record<Part, string>> = {},\n          value: Date | null,\n          onChange: (date: Date | null) => void,\n        ) => {\n          if (value !== latestValue.current) {\n            // Value has been changed from outside, don't override it.\n            return;\n          }\n\n          const date = buildDate(localValue, value ?? undefined);\n          setLocalValue(undefined);\n          onChange(isNaN(date.getTime()) ? null : date);\n        },\n        100,\n      ),\n    [],\n  );\n\n  const format = useMemo(\n    () =>\n      new Intl.DateTimeFormat(locale, {\n        day: '2-digit',\n        month: '2-digit',\n        year: 'numeric',\n      }),\n    [locale],\n  );\n\n  let parts;\n  try {\n    parts = format.formatToParts(value ?? defaultDate);\n  } catch {\n    parts = format.formatToParts(defaultDate);\n  }\n\n  const isEmpty = !value;\n\n  return (\n    <div\n      css={{\n        display: 'flex',\n        alignItems: 'baseline',\n      }}\n    >\n      {parts.map(({ type, value: partValue }, index) => (\n        <Fragment key={index}>\n          {isIncludedType(type) ? (\n            <input\n              className={`${className}-${id}`}\n              css={{\n                boxSizing: 'content-box',\n                overflow: 'visible',\n                border: 'none',\n                borderBottom: '2px solid transparent',\n                outline: 'none',\n                fontSize: 'inherit',\n                backgroundColor: 'inherit',\n                color: 'inherit',\n\n                '::placeholder': {\n                  color: 'inherit',\n                  opacity: 0.5,\n                },\n\n                '&:focus': {\n                  borderBottom: '2px solid var(--primaryMain)',\n                },\n              }}\n              style={{\n                width: `${String(maxValues[type]).length}ch`,\n              }}\n              placeholder={''.padEnd(String(maxValues[type]).length, '0')}\n              value={localValue?.[type] ?? (isEmpty ? '' : partValue)}\n              onChange={(event) => {\n                const input = event.target.value;\n                if (!/^\\d*$/.test(input)) return;\n\n                const newValue = { ...localValue, [type]: input };\n\n                if (Number(input) > maxValues[type]) {\n                  newValue[type] = String(maxValues[type]);\n                }\n\n                setLocalValue(newValue);\n\n                if (input.length >= String(maxValues[type]).length) {\n                  setTimeout(() => tabNext(event.target, id));\n                }\n              }}\n              onFocus={(event) => {\n                commit.cancel();\n                event.target.select();\n              }}\n              onBlur={() => {\n                commit(localValue, value, onChange);\n              }}\n            />\n          ) : type === 'literal' ? (\n            <span>{partValue}</span>\n          ) : null}\n        </Fragment>\n      ))}\n    </div>\n  );\n}\n","import { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\nexport interface TextProps {\n  id: keyof TableTheme['text'];\n}\n\nexport function Text({ id }: TextProps) {\n  const text = useTheme((t) => t.text[id]);\n\n  return <>{text}</>;\n}\n","import { nanoid } from 'nanoid';\nimport { Fragment, useMemo, useState } from 'react';\nimport { debounce } from '../misc/debounce';\nimport useLatestRef from '../hooks/useLatestRef';\n\nexport interface TimeInputProps {\n  value: Date | null;\n  onChange: (date: Date | null) => void;\n  locale?: string;\n  showSeconds?: boolean;\n}\n\ntype Part = 'hour' | 'minute' | 'second';\n\nconst className = 'schummar-table-time-input';\nconst defaultDate = new Date(1970, 0, 1);\n\nconst isIncludedType = (type: Intl.DateTimeFormatPartTypes): type is Part =>\n  type === 'hour' || type === 'minute' || type === 'second';\n\nconst maxValues = {\n  hour: 23,\n  minute: 59,\n  second: 59,\n};\n\nconst tabNext = (event: Element, id: string) => {\n  const all = Array.from(document.querySelectorAll(`.${className}-${id}`));\n  const index = all.indexOf(event);\n  const next = all[index + 1];\n\n  if (next instanceof HTMLElement) {\n    next.focus();\n  }\n};\n\nfunction buildTime(value: Partial<Record<Part, string>>, baseDate = new Date()): Date {\n  const date = new Date(baseDate);\n\n  if (value.hour) {\n    date.setHours(Number(value.hour));\n  }\n\n  if (value.minute) {\n    date.setMinutes(Number(value.minute));\n  }\n\n  if (value.second) {\n    date.setSeconds(Number(value.second));\n  }\n\n  return date;\n}\n\nexport function TimeInput({ value, onChange, locale, showSeconds = true }: TimeInputProps) {\n  const id = useMemo(() => nanoid(), []);\n  const [localValue, setLocalValue] = useState<Partial<Record<Part, string>>>();\n  const latestValue = useLatestRef(value);\n\n  const commit = useMemo(\n    () =>\n      debounce(\n        (\n          localValue: Partial<Record<Part, string>> = {},\n          value: Date | null,\n          onChange: (date: Date | null) => void,\n        ) => {\n          if (value !== latestValue.current) {\n            // Value has been changed from outside, don't override it.\n            return;\n          }\n\n          const date = buildTime(localValue, value ?? undefined);\n          setLocalValue(undefined);\n          onChange(isNaN(date.getTime()) ? null : date);\n        },\n        100,\n      ),\n    [],\n  );\n\n  const format = useMemo(\n    () =>\n      new Intl.DateTimeFormat(locale, {\n        hour: '2-digit',\n        minute: '2-digit',\n        second: showSeconds ? '2-digit' : undefined,\n      }),\n    [locale],\n  );\n\n  let parts;\n  try {\n    parts = format.formatToParts(value ?? defaultDate);\n  } catch {\n    parts = format.formatToParts(defaultDate);\n  }\n\n  const isEmpty = !value;\n\n  return (\n    <div\n      css={{\n        display: 'flex',\n        alignItems: 'baseline',\n      }}\n    >\n      {parts.map(({ type, value: partValue }, index) => (\n        <Fragment key={index}>\n          {isIncludedType(type) ? (\n            <input\n              className={`${className}-${id}`}\n              css={{\n                boxSizing: 'content-box',\n                overflow: 'visible',\n                border: 'none',\n                borderBottom: '2px solid transparent',\n                outline: 'none',\n                fontSize: 'inherit',\n                backgroundColor: 'inherit',\n                color: 'inherit',\n\n                '::placeholder': {\n                  color: 'inherit',\n                  opacity: 0.5,\n                },\n\n                '&:focus': {\n                  borderBottom: '2px solid var(--primaryMain)',\n                },\n              }}\n              style={{\n                width: `${String(maxValues[type]).length}ch`,\n              }}\n              placeholder={''.padEnd(String(maxValues[type]).length, '0')}\n              value={localValue?.[type] ?? (isEmpty ? '' : partValue)}\n              onChange={(event) => {\n                const input = event.target.value;\n                if (!/^\\d*$/.test(input)) return;\n\n                const newValue = { ...localValue, [type]: input };\n\n                if (Number(input) > maxValues[type]) {\n                  newValue[type] = String(maxValues[type]);\n                }\n\n                setLocalValue(newValue);\n\n                if (input.length >= String(maxValues[type]).length) {\n                  setTimeout(() => tabNext(event.target, id));\n                }\n              }}\n              onFocus={(event) => {\n                commit.cancel();\n                event.target.select();\n              }}\n              onBlur={() => {\n                commit(localValue, value, onChange);\n              }}\n            />\n          ) : type === 'literal' ? (\n            <span>{partValue}</span>\n          ) : null}\n        </Fragment>\n      ))}\n    </div>\n  );\n}\n","import { Interpolation, Theme } from '@emotion/react';\nimport {\n  Fragment,\n  ReactNode,\n  createContext,\n  useContext,\n  useEffect,\n  useMemo,\n  useState,\n} from 'react';\nimport { Temporal } from 'temporal-polyfill';\nimport { useTheme } from '../hooks/useTheme';\nimport { defaults } from '../misc/defaults';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport { useDayzed, type DayzedDateObject } from '../vendor/dayzed/dayzed';\nimport { DateInput } from './dateInput';\nimport { Text } from './text';\nimport { TimeInput } from './timeInput';\n\nexport type DateRange = { min: Date; max: Date };\n\nexport type DatePickerQuickOption =\n  | 'today'\n  | 'thisWeek'\n  | 'thisMonth'\n  | 'thisYear'\n  | 'lastSevenDays'\n  | 'lastThirtyDays'\n  | { label: ReactNode; value: Date | DateRange | (() => Date | DateRange) }\n  | ((onChange: (value: Date | DateRange | null) => void) => ReactNode);\n\nexport type DatePickerChangeSource = 'input' | 'calendarWeek' | 'calendar' | 'quickOption';\n\nexport type DatePickerProps = {\n  /** Currently selected day or range of days. */\n  value: Date | DateRange | null;\n  /** Callback for when the day (range) changes. */\n  onChange: (value: Date | DateRange | null, source: DatePickerChangeSource) => void;\n  /** Currently visible date. */\n  dateInView?: Date;\n  /** Callback for when the currently visible date changes. */\n  onDateInViewChange?: (value: Date) => void;\n  /** If enabled, ranges can be selected. */\n  rangeSelect?: boolean;\n  /** Which locale to use to render the calendar. */\n  locale?: string;\n  /** Which day of the week should be in the first column. (0=Sunday, 1=Monday, ...)\n   * @default 1\n   */\n  firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n  /** Which month to show initially */\n  defaultDateInView?: Date;\n  /** Show buttons to quickly select suggested dates or date ranges */\n  quickOptions?: DatePickerQuickOption[];\n  noReset?: boolean;\n  /** Minimum selectable date */\n  /** Date ranges that are visually marked as blocked */\n  blockedRanges?: DateRange[];\n  minDate?: Date;\n  /** Maximum selectable date */\n  maxDate?: Date;\n  /** Whether to show the calendar week in the first column */\n  showCalendarWeek?: boolean;\n  /** Whether to show and allow editing of time */\n  showTime?: boolean | { showSeconds?: boolean };\n};\n\nconst DatePickerContext = createContext<Partial<Omit<DatePickerProps, 'value' | 'onChange'>>>({});\n\nexport function DatePickerProvider({\n  children,\n  ...props\n}: Partial<Omit<DatePickerProps, 'value' | 'onChange'>> & { children?: ReactNode }) {\n  const value = useMemo(() => props, [JSON.stringify(props)]);\n\n  return <DatePickerContext.Provider value={value}>{children}</DatePickerContext.Provider>;\n}\n\nconst weekDays = [0, 1, 2, 3, 4, 5, 6] as const;\n\n/** Rounds a date down to the start of the day. */\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n/** Rounds a date up to the end of the day. */\nexport const endOfDay = (d: Date) =>\n  new Date(d.getFullYear(), d.getMonth(), d.getDate() + 1, 0, 0, 0, -1);\n\nexport const lastDays = (days: number): DateRange => {\n  const now = new Date();\n  const min = new Date(now);\n  min.setDate(min.getDate() - days + 1);\n\n  return {\n    min: startOfDay(min),\n    max: endOfDay(now),\n  };\n};\n\nexport const today = () => lastDays(1);\n\nexport const thisWeek = (delta = 0, firstDayOfWeek = 1): DateRange => {\n  const now = new Date();\n  const min = new Date(now);\n\n  let diff = min.getDay() - firstDayOfWeek;\n  if (diff < 0) {\n    diff += 7;\n  }\n  min.setDate(min.getDate() - diff + delta * 7);\n\n  const max = new Date(min);\n  max.setDate(max.getDate() + 6);\n\n  return {\n    min: startOfDay(min),\n    max: endOfDay(max),\n  };\n};\n\nexport const thisMonth = (delta = 0): DateRange => {\n  const now = new Date();\n  const min = new Date(now);\n  min.setDate(1);\n  min.setMonth(min.getMonth() + delta);\n  const max = new Date(min);\n  max.setMonth(max.getMonth() + 1);\n  max.setDate(max.getDate() - 1);\n\n  return {\n    min: startOfDay(min),\n    max: endOfDay(max),\n  };\n};\n\nexport const thisYear = (delta = 0): DateRange => {\n  const now = new Date();\n  const min = new Date(now);\n  min.setDate(1);\n  min.setMonth(0);\n  min.setFullYear(min.getFullYear() + delta);\n  const max = new Date(min);\n  max.setFullYear(max.getFullYear() + 1);\n  max.setDate(max.getDate() - 1);\n\n  return {\n    min: startOfDay(min),\n    max: endOfDay(max),\n  };\n};\n\nexport const getCalendarWeek = (date: Date): number => {\n  // ISO 8601: Week 1 is the week with the first Thursday of the year.\n  // https://en.wikipedia.org/wiki/ISO_week_date\n\n  const tz = Temporal.Now.timeZoneId();\n  return (\n    Temporal.Instant.fromEpochMilliseconds(date.getTime()).toZonedDateTimeISO(tz).weekOfYear ?? 0\n  );\n};\n\nexport const commonQuickOptions = {\n  today: { label: <Text id=\"today\" />, value: today },\n  thisWeek: { label: <Text id=\"thisWeek\" />, value: (props) => thisWeek(0, props.firstDayOfWeek) },\n  thisMonth: { label: <Text id=\"thisMonth\" />, value: () => thisMonth() },\n  thisYear: { label: <Text id=\"thisYear\" />, value: () => thisYear() },\n  lastSevenDays: { label: <Text id=\"lastSevenDays\" />, value: () => lastDays(7) },\n  lastThirtyDays: { label: <Text id=\"lastThirtyDays\" />, value: () => lastDays(30) },\n} satisfies Record<\n  DatePickerQuickOption & string,\n  { label: ReactNode; value: Date | DateRange | ((props: DatePickerProps) => Date | DateRange) }\n>;\n\n/** Returns whether two dates and/or date ranges intersect. Intersection is considered per day. */\nexport function dateIntersect(\n  a: Date | DateRange | null | undefined,\n  b: Date | DateRange | null | undefined,\n) {\n  if (a instanceof Date) {\n    a = { min: a, max: a };\n  }\n  if (b instanceof Date) {\n    b = { min: b, max: b };\n  }\n\n  if (!a?.min || !a.max || !b?.min || !b.max) {\n    return false;\n  }\n\n  return !(endOfDay(a.max) < startOfDay(b.min) || startOfDay(a.min) > endOfDay(b.max));\n}\n\nexport function dateClamp(date: Date, min?: Date, max?: Date) {\n  if (min && date < min) {\n    return min;\n  }\n\n  if (max && date > max) {\n    return max;\n  }\n\n  return date;\n}\n\nfunction getValueForComparison(value?: Date | DateRange | null) {\n  if (!value) {\n    return value;\n  }\n  if (value instanceof Date) {\n    return value.getTime();\n  }\n  return `${value.min?.getTime()}-${value.max?.getTime()}`;\n}\n\nexport function DatePicker(props: DatePickerProps) {\n  const context = useContext(DatePickerContext);\n\n  const {\n    value,\n    rangeSelect,\n    locale,\n    firstDayOfWeek = 1,\n    defaultDateInView,\n    quickOptions = ['today', 'thisWeek'],\n    noReset,\n    minDate,\n    maxDate,\n    showCalendarWeek,\n    blockedRanges = [],\n    showTime,\n  } = defaults<DatePickerProps>(props, context);\n\n  function onChange(value: Date | DateRange | null, source: DatePickerChangeSource) {\n    if (value instanceof Date) {\n      value = dateClamp(value, minDate, maxDate);\n    } else if (value) {\n      value = {\n        min: dateClamp(value.min, minDate, maxDate),\n        max: dateClamp(value.max, minDate, maxDate),\n      };\n    }\n\n    props.onChange(value, source);\n  }\n\n  const Button = useTheme((t) => t.components.Button);\n  const IconButton = useTheme((t) => t.components.IconButton);\n  const ChevronRight = useTheme((t) => t.icons.ChevronRight);\n  const cssVariables = useCssVariables();\n  function getDayCssStyles({\n    disabled,\n    prevMonth,\n    nextMonth,\n    today,\n    blocked,\n    selected,\n    preSelected,\n  }: {\n    disabled?: boolean;\n    prevMonth?: boolean;\n    nextMonth?: boolean;\n    today?: boolean;\n    blocked?: boolean;\n    selected?: boolean;\n    preSelected?: boolean;\n  }): Interpolation<Theme> {\n    return [\n      {\n        padding: 10,\n        border: 'none',\n        background: 'transparent',\n        cursor: disabled ? undefined : 'pointer',\n        font: 'inherit',\n        color: 'inherit',\n      },\n      (prevMonth || nextMonth) && {\n        color: 'var(--date-picker-disemphasized, #bdbdbd)',\n      },\n      today && {\n        outline: '1px solid var(--secondaryMain)',\n      },\n      blocked && {\n        background: 'var(--blockedMain)',\n        color: 'var(--blockedContrastText)',\n      },\n      selected && {\n        background: 'var(--primaryMain)',\n        color: 'var(--primaryContrastText)',\n      },\n      blocked &&\n        selected && {\n          position: 'relative',\n          '::before': {\n            content: '\"\"',\n            position: 'absolute',\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0,\n            background: 'var(--blockedMain)',\n            clipPath: 'polygon(0 0, 0 50%, 50% 0)',\n          },\n        },\n      preSelected && {\n        background: 'var(--primaryLight)',\n        color: 'var(--primaryContrastText)',\n      },\n    ];\n  }\n\n  const mountTime = useMemo(() => new Date(), []);\n  const [dirty, setDirty] = useState<Partial<DateRange>>();\n  const [hovered, setHovered] = useState<DateRange>();\n  const [dateInViewLocal, setDateInViewLocal] = useState<Date>(defaultDateInView ?? mountTime);\n  const dateInView = props.dateInView ?? dateInViewLocal;\n\n  function setDateInView(date: Date) {\n    setDateInViewLocal(date);\n    props.onDateInViewChange?.(date);\n  }\n\n  const min = dirty ? dirty.min : value instanceof Date ? value : value?.min;\n  const max = dirty ? dirty.max : value instanceof Date ? value : value?.max;\n\n  const resolvedQuickOptions = [\n    ...quickOptions,\n    ...(noReset ? [] : [{ label: <Text id=\"reset\" />, value: null }]),\n  ].map((option, index) => {\n    if (option instanceof Function) {\n      return option((value) => {\n        setDirty(undefined);\n        onChange(value, 'quickOption');\n      });\n    }\n\n    const { label, value } = typeof option === 'string' ? commonQuickOptions[option] : option;\n\n    return (\n      <Button\n        key={index}\n        variant=\"text\"\n        type=\"button\"\n        css={{\n          color: 'inherit',\n        }}\n        onClick={() => {\n          setDirty(undefined);\n\n          if (value instanceof Function) {\n            onChange(value(props), 'quickOption');\n          } else {\n            onChange(value, 'quickOption');\n          }\n        }}\n      >\n        {label}\n      </Button>\n    );\n  });\n\n  const { calendars, getBackProps, getForwardProps, getDateProps } = useDayzed({\n    onDateSelected: () => undefined,\n    firstDayOfWeek,\n    showOutsideDays: true,\n    date: dateInView,\n    onOffsetChanged: (offset) =>\n      setDateInView(new Date(dateInView.getFullYear(), dateInView.getMonth() + offset)),\n    offset: 0,\n    minDate,\n    maxDate,\n  });\n  const now = useMemo(() => startOfDay(new Date()), []);\n\n  const formatWeekday = useMemo(() => {\n    const { format } = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n    return (weekDay: number) =>\n      format(new Date(Date.UTC(2021, 7, ((weekDay + firstDayOfWeek) % 7) + 1)));\n  }, [locale, firstDayOfWeek]);\n\n  useEffect(\n    () =>\n      setDateInView(\n        value === null ? defaultDateInView ?? mountTime : value instanceof Date ? value : value.max,\n      ),\n    [getValueForComparison(value), getValueForComparison(defaultDateInView), mountTime],\n  );\n\n  useEffect(() => {\n    if (!rangeSelect) {\n      setDirty(undefined);\n    }\n  }, [rangeSelect]);\n\n  function set(source: DatePickerChangeSource, min?: Date, max?: Date, edit?: 'min' | 'max') {\n    if (!rangeSelect) {\n      onChange(min ?? null, source);\n      return;\n    }\n\n    if (min && max && min > max) {\n      if (edit === 'min') {\n        max = min;\n      } else if (edit === 'max') {\n        min = max;\n      } else {\n        [min, max] = [max, min];\n      }\n    }\n\n    if (!min === !max) {\n      setDirty(undefined);\n      onChange(min && max ? { min, max: endOfDay(max) } : null, source);\n    } else {\n      setDirty({ min, max });\n    }\n  }\n\n  const formatMonth = useMemo(() => {\n    const { format } = new Intl.DateTimeFormat(locale, { month: 'long' });\n    return (month: number) => format(new Date(2021, month));\n  }, [locale]);\n\n  const formatYear = useMemo(() => {\n    const { format } = new Intl.DateTimeFormat(locale, { year: 'numeric' });\n    return (year: number) => format(new Date(year, 0, 1));\n  }, [locale]);\n\n  return (\n    <div\n      css={[\n        cssVariables,\n        {\n          color: 'var(--table-text-color)',\n        },\n      ]}\n    >\n      <div\n        css={{\n          display: 'grid',\n          gridAutoFlow: 'column',\n          justifyContent: 'center',\n          alignItems: 'center',\n          gap: 'calc(var(--spacing) * 4)',\n\n          '& > div': {\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n          },\n        }}\n      >\n        <div>\n          <DateInput\n            value={min ?? null}\n            onChange={(newMin) => set('input', newMin ?? undefined, max, 'min')}\n            locale={locale}\n          />\n\n          {showTime && (\n            <TimeInput\n              value={min ?? null}\n              onChange={(newMin) => set('input', newMin ?? undefined, max, 'min')}\n              locale={locale}\n              showSeconds={typeof showTime === 'boolean' ? true : showTime.showSeconds}\n            />\n          )}\n        </div>\n\n        {rangeSelect && (\n          <>\n            {' - '}\n\n            <div>\n              <DateInput\n                value={max ?? null}\n                onChange={(newMax) => set('input', min, newMax ?? undefined, 'max')}\n                locale={locale}\n              />\n\n              {showTime && (\n                <TimeInput\n                  value={max ?? null}\n                  onChange={(newMax) => set('input', min, newMax ?? undefined, 'max')}\n                  locale={locale}\n                  showSeconds={typeof showTime === 'boolean' ? true : showTime.showSeconds}\n                />\n              )}\n            </div>\n          </>\n        )}\n      </div>\n\n      {calendars.map(({ month, year, weeks }) => (\n        <div key={`${month}${year}`} css={{ display: 'grid' }}>\n          <div\n            css={{\n              margin: 'calc(var(--spacing) * 4) 0',\n              display: 'grid',\n              gridAutoFlow: 'column',\n              justifyContent: 'space-between',\n              alignItems: 'center',\n            }}\n          >\n            <IconButton type=\"button\" {...getBackProps({ calendars })}>\n              <ChevronRight css={{ transform: 'rotate3d(0, 0, 1, 180deg)' }} />\n            </IconButton>\n\n            <div css={{ display: 'flex' }}>\n              {formatMonth(month)} {formatYear(year)}\n            </div>\n\n            <IconButton type=\"button\" {...getForwardProps({ calendars })}>\n              <ChevronRight />\n            </IconButton>\n          </div>\n\n          <div\n            css={{\n              justifySelf: 'center',\n              display: 'grid',\n              gridTemplateColumns: 'repeat(8, max-content)',\n            }}\n          >\n            {showCalendarWeek ? (\n              <div\n                css={{\n                  justifySelf: 'center',\n                  padding: 10,\n                  borderRight:\n                    '1px solid var(--date-picker-separator, var(--table-border, #bdbdbd))',\n                }}\n              >\n                <Text id=\"calendarWeek\" />\n              </div>\n            ) : (\n              <div />\n            )}\n\n            {weekDays.map((_v, weekDay) => (\n              <div\n                key={weekDay}\n                css={{\n                  justifySelf: 'center',\n                  padding: 10,\n                }}\n              >\n                {formatWeekday(weekDay)}\n              </div>\n            ))}\n\n            {weeks.map((week, index) => {\n              const weekStart = week[0] as DayzedDateObject;\n              const weekEnd = week[6] as DayzedDateObject;\n              const weekDisabled =\n                !rangeSelect ||\n                (minDate && weekEnd.date < minDate) ||\n                (maxDate && weekStart.date > maxDate);\n\n              return (\n                <Fragment key={index}>\n                  {showCalendarWeek ? (\n                    <button\n                      type=\"button\"\n                      css={{\n                        padding: 10,\n                        border: 'none',\n                        background: 'transparent',\n                        cursor: weekDisabled ? undefined : 'pointer',\n                        font: 'inherit',\n                        borderRight:\n                          '1px solid var(--date-picker-separator, var(--table-border, #bdbdbd))',\n                        color: 'inherit',\n                      }}\n                      onClick={() => {\n                        if (weekDisabled) {\n                          return;\n                        }\n\n                        const min = minDate && weekStart.date < minDate ? minDate : weekStart.date;\n                        const max = maxDate && weekEnd.date > maxDate ? maxDate : weekEnd.date;\n                        set('calendarWeek', min, max);\n                      }}\n                      onPointerOver={() =>\n                        !weekDisabled && setHovered({ min: weekStart.date, max: weekEnd.date })\n                      }\n                      onPointerOut={() => !weekDisabled && setHovered(undefined)}\n                    >\n                      {getCalendarWeek(weekEnd.date)}\n                    </button>\n                  ) : (\n                    <div />\n                  )}\n\n                  {week.map((dateObject, dayIndex) => {\n                    if (!dateObject) {\n                      return <div key={dayIndex} />;\n                    }\n\n                    const { prevMonth, nextMonth, date } = dateObject;\n                    const today = startOfDay(date).getTime() === now.getTime();\n                    const disabled = (minDate && date < minDate) || (maxDate && date > maxDate);\n\n                    const selected =\n                      date.getTime() === min?.getTime() ||\n                      (min && max && dateIntersect(date, { min, max }));\n                    const preSelected =\n                      !selected &&\n                      !disabled &&\n                      (dateIntersect(date, hovered) ||\n                        (min &&\n                          !max &&\n                          hovered &&\n                          dateIntersect(\n                            date,\n                            min <= hovered.min\n                              ? { min, max: hovered.min }\n                              : { min: hovered.max, max: min },\n                          )));\n                    const blocked = blockedRanges.some((range) => dateIntersect(date, range));\n\n                    return (\n                      <button\n                        type=\"button\"\n                        key={`${index}-${dayIndex}`}\n                        css={getDayCssStyles({\n                          disabled,\n                          prevMonth,\n                          nextMonth,\n                          today,\n                          blocked,\n                          selected,\n                          preSelected,\n                        })}\n                        {...getDateProps({ dateObj: dateObject })}\n                        onClick={() => {\n                          if (dirty) {\n                            if (min) set('calendar', min, date);\n                            else set('calendar', date, max);\n                          } else {\n                            set('calendar', date);\n                          }\n                        }}\n                        onPointerOver={() => setHovered({ min: date, max: date })}\n                        onPointerOut={() => setHovered(undefined)}\n                        disabled={disabled}\n                      >\n                        {date.getDate()}\n                      </button>\n                    );\n                  })}\n                </Fragment>\n              );\n            })}\n          </div>\n        </div>\n      ))}\n\n      <div\n        css={{\n          marginTop: 'var(--spacing)',\n          display: 'grid',\n          gridAutoFlow: 'column',\n          justifyContent: 'center',\n        }}\n      >\n        {resolvedQuickOptions}\n      </div>\n    </div>\n  );\n}\n","import { useFilter } from '../hooks/useFilter';\nimport type { CommonFilterProps } from '../types';\nimport type { DatePickerProps, DateRange } from './datePicker';\nimport { dateIntersect, DatePicker } from './datePicker';\n\nfunction convertDate(x: unknown): Date | null {\n  if (x instanceof Date) return x;\n  if (typeof x === 'number' || typeof x === 'string') return new Date(x);\n  return null;\n}\n\nfunction convertDateOrRange(x: unknown): Date | DateRange | null {\n  if (x instanceof Object && 'min' in x && 'max' in x) {\n    const range = {\n      min: convertDate((x as any).min),\n      max: convertDate((x as any).max),\n    };\n    return range.min && range.max ? (range as DateRange) : null;\n  }\n  return convertDate(x);\n}\n\nfunction convertDateOrArray(x: unknown): Date | DateRange | (Date | DateRange)[] | null {\n  if (Array.isArray(x)) return x.map(convertDateOrRange).filter(Boolean) as (Date | DateRange)[];\n  return convertDateOrRange(x);\n}\n\nexport function DateFilter<TItem, TColumnValue>({\n  locale,\n  firstDayOfWeek,\n  defaultDateInView,\n  quickOptions,\n  singleSelect,\n  filterBy = convertDateOrArray,\n  minDate,\n  maxDate,\n  showCalendarWeek,\n  showTime,\n  ...props\n}: {\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  CommonFilterProps<\n    TItem,\n    TColumnValue,\n    Date | DateRange | null,\n    Date | DateRange | null\n  >): JSX.Element {\n  const {\n    value = null,\n    onChange,\n    close,\n  } = useFilter({\n    ...props,\n    filterBy,\n\n    id: 'dateFilter',\n\n    isActive(filterValue) {\n      return !!filterValue;\n    },\n\n    test(filterValue, value) {\n      return dateIntersect(filterValue, value);\n    },\n  });\n\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}\n        onChange={(value, source) => {\n          onChange(value);\n          if (source !== 'input') {\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","import type { Id, TableItem } from '../types';\n\nexport const flatMap = <T, S>(array: Iterable<T>, flatMap: (t: T) => S[]): S[] => {\n  return [...array].flatMap(flatMap);\n};\n\nexport const orderBy = <T>(\n  array: T[],\n  selectors: ((t: T) => any)[] = [],\n  direction: ('desc' | 'asc')[] = [],\n  locale?: (string | undefined)[],\n  options?: (Intl.CollatorOptions | undefined)[],\n): T[] => {\n  if (selectors.length === 0) selectors = [(t) => t];\n\n  return [...array].sort((a, b) => {\n    for (let i = 0; i < selectors.length; i++) {\n      const _a = selectors[i]?.(a);\n      const _b = selectors[i]?.(b);\n      const _direction = direction[i] === 'desc' ? -1 : 1;\n      const _locale = locale?.[i];\n      const _options = options?.[i];\n\n      if (typeof _a === 'string' && typeof _b === 'string') {\n        return _a.localeCompare(_b, _locale, _options) * _direction;\n      }\n\n      if (_a > _b) return _direction;\n      if (_a < _b) return -_direction;\n    }\n    return 0;\n  });\n};\n\nexport const uniq = <T>(array: T[]): T[] => {\n  const set = new Set<T>();\n  for (const t of array) set.add(t);\n  return Array.from(set);\n};\n\nexport const intersect = <T>(a: Iterable<T>, b: { has(t: T): boolean }): Set<T> => {\n  const result = new Set<T>();\n  for (const x of a) if (b.has(x)) result.add(x);\n  return result;\n};\n\nexport const getAncestors = <T>(\n  activeItemsById: Map<Id, TableItem<T>>,\n  ...items: TableItem<T>[]\n): Set<Id> => {\n  const result = new Set<Id>();\n\n  const find = ({ parentId }: TableItem<T>): void => {\n    const parent =\n      parentId !== undefined && parentId !== null ? activeItemsById.get(parentId) : undefined;\n    if (parent && !result.has(parent.id)) {\n      result.add(parent.id);\n      find(parent);\n    }\n  };\n  items.forEach(find);\n  return result;\n};\n\nexport const getDescendants = <T>(...items: TableItem<T>[]): Set<Id> => {\n  const result = new Set<Id>();\n\n  const find = (item: TableItem<T>): void => {\n    for (const child of item.children) {\n      if (!result.has(child.id)) {\n        result.add(child.id);\n        find(child);\n      }\n    }\n  };\n  items.forEach(find);\n  return result;\n};\n\nexport const identity = (x: unknown): any => x;\n\nexport const asString = (x: unknown): string => {\n  if (Array.isArray(x)) return x.map(asString).join(', ');\n  if (x instanceof Object) return JSON.stringify(x);\n  return String(x ?? '');\n};\n\nexport const asStringOrArray = (x: unknown): string | string[] => {\n  if (Array.isArray(x)) return x.map(asString);\n  return asString(x);\n};\n\nexport const asNumber = (x: unknown): number | null => {\n  const n = Number(x);\n  return Number.isNaN(n) ? null : n;\n};\n\nexport const asNumberOrArray = (x: unknown): number | null | (number | null)[] => {\n  if (Array.isArray(x)) return x.map(asNumber);\n  return asNumber(x);\n};\n\nexport const defaultEquals = (a: unknown, b: unknown): boolean => a === b;\n\nexport const subStringMatch = (a: string, b: string): boolean =>\n  a.toLowerCase().includes(b.toLowerCase());\n\nexport const castArray = <T>(a: T | T[]) => (Array.isArray(a) ? a : [a]);\n\nexport const cx = (\n  ...classNames: (string | false | undefined | null | Record<string, boolean>)[]\n) =>\n  classNames\n    .flatMap((entry) => {\n      if (!entry) return [];\n      if (typeof entry === 'string') return [entry];\n      return Object.entries(entry)\n        .filter(([, predicate]) => predicate)\n        .map(([className]) => className);\n    })\n    .join(' ');\n\ntype Falsy = false | 0 | '' | null | undefined;\nexport function isTruthy<T>(x: T): x is Exclude<T, Falsy> {\n  return !!x;\n}\n","import { useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport type { TableTheme } from '../types';\n\ntype TextFieldProps = TableTheme['components']['TextField'] extends React.ComponentType<infer T>\n  ? T\n  : 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 { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asNumberOrArray, castArray } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps } from '../types';\nimport { NumberField } from './numberField';\n\nexport interface RangeFilterProps<T, V>\n  extends CommonFilterProps<T, V, number | null, [number | null, number | null] | null> {\n  min?: number;\n  max?: number;\n}\n\nexport function RangeFilter<TItem, TColumnValue>({\n  min,\n  max,\n  filterBy = asNumberOrArray,\n  ...props\n}: RangeFilterProps<TItem, TColumnValue>): JSX.Element {\n  const rangeMinText = useTheme((t) => t.text.rangeMin);\n  const rangeMaxText = useTheme((t) => t.text.rangeMax);\n\n  const table = useTableContext<TItem>();\n  const columnId = useColumnContext();\n  const filterByFunction = filterBy instanceof Function ? filterBy : filterBy[0];\n\n  const [minValue, maxValue] = table.useState((state) => {\n    if (typeof min === 'number' && typeof max === 'number') {\n      return [min, max];\n    }\n\n    const column = state.activeColumns.find((c) => c.id === columnId);\n\n    if (!column) {\n      return [0, 100];\n    }\n\n    let minValue;\n    let maxValue;\n\n    for (const item of state.items) {\n      const columnValue = column.value(item.value) as TColumnValue;\n      const numberValues = castArray(filterByFunction(columnValue, item.value)).filter(\n        (value): value is number => value !== null,\n      );\n\n      for (const value of numberValues) {\n        minValue = Math.min(minValue ?? value, value);\n        maxValue = Math.max(maxValue ?? value, value);\n      }\n    }\n\n    return [min ?? minValue, max ?? maxValue];\n  });\n\n  const { value, onChange } = useFilter({\n    ...props,\n    filterBy,\n\n    id: 'rangeFilter',\n\n    isActive(filterValue) {\n      return !!filterValue;\n    },\n\n    test(filterValue, value) {\n      if (!filterValue || (filterValue[0] === null && filterValue[1] === null)) {\n        return true;\n      }\n\n      const min = filterValue[0] ?? Number.NEGATIVE_INFINITY;\n      const max = filterValue[1] ?? Number.POSITIVE_INFINITY;\n      return value !== null && value >= min && value <= max;\n    },\n  });\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\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 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 type { HTMLProps, ReactNode } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { throttle } from '../misc/throttle';\n\nexport interface VirtualListProps<T> extends Omit<HTMLProps<HTMLDivElement>, 'children'> {\n  virtual?:\n    | boolean\n    | {\n        rowHeight?: number;\n        initalRowHeight?: number;\n        throttleScroll?: number;\n        overscan?: number;\n        overscanBottom?: number;\n        overscanTop?: number;\n      };\n  items: T[];\n  children: (item: T, index: number) => ReactNode;\n}\n\nexport function VirtualList<T>({\n  virtual = true,\n  items,\n  children,\n  ...props\n}: VirtualListProps<T>): JSX.Element {\n  const container = useRef<HTMLDivElement>(null);\n  const [, setId] = useState({});\n\n  const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n  const update = useMemo(() => throttle(() => setId({}), throttleScroll), [throttleScroll]);\n\n  useEffect(() => {\n    if (!virtual) return;\n\n    const ro = new ResizeObserver(update);\n\n    if (container.current) {\n      ro.observe(container.current);\n    }\n\n    window.addEventListener('resize', update, true);\n    return () => {\n      ro.disconnect();\n      window.removeEventListener('resize', update, true);\n      update.cancel();\n    };\n  }, [update, virtual, throttleScroll]);\n\n  if (!virtual) {\n    return (\n      <div\n        {...props}\n        css={{\n          overflowY: 'auto',\n          display: 'grid',\n        }}\n      >\n        {items.map((item, index) => children(item, index))}\n      </div>\n    );\n  }\n\n  const {\n    rowHeight,\n    initalRowHeight = 38,\n    overscan = 100,\n    overscanTop,\n    overscanBottom,\n  } = (virtual instanceof Object ? virtual : undefined) ?? {};\n\n  const itemHeight = rowHeight ?? (averageItemHeight(container.current) || initalRowHeight);\n  const from = container.current?.clientHeight\n    ? Math.max(\n        0,\n        Math.floor((container.current.scrollTop - (overscanTop ?? overscan)) / itemHeight),\n      )\n    : 0;\n  const to = container.current?.clientHeight\n    ? Math.min(\n        items.length,\n        Math.ceil(\n          (container.current.scrollTop +\n            container.current.clientHeight +\n            (overscanBottom ?? overscan)) /\n            itemHeight,\n        ),\n      )\n    : 1;\n  const before = from * itemHeight;\n  const after = (items.length - to) * itemHeight;\n\n  return (\n    <div\n      {...props}\n      onScroll={(event) => {\n        update();\n        props.onScroll?.(event);\n      }}\n      ref={container}\n      css={{\n        overflowY: 'auto',\n        display: 'grid',\n      }}\n    >\n      <div data-virtual-before style={{ height: before }} />\n      {items.slice(from, to).map((item, index) => children(item, index + from))}\n      <div data-virtual-after style={{ height: after }} />\n    </div>\n  );\n}\n\nfunction averageItemHeight(container: HTMLDivElement | null) {\n  if (!container?.children.length) {\n    return undefined;\n  }\n\n  const heights = Array.from(container.children)\n    .slice(1, -1)\n    .map((child) => child.clientHeight);\n  return heights.reduce((a, b) => a + b, 0) / heights.length;\n}\n","import type { ReactNode } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asString, castArray, flatMap, orderBy, uniq } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport type { CommonFilterProps, InternalColumn } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\nimport { FormControlLabel } from './formControlLabel';\nimport type { VirtualListProps } from './virtualList';\nimport { VirtualList } from './virtualList';\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\nexport function SelectFilter<TItem, TColumnValue, TFilterBy>({\n  options: providedOptions,\n  stringValue = asString,\n  render = stringValue,\n  singleSelect,\n  hideSearchField,\n  hideResetButton,\n  ...props\n}: {\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} & CommonFilterProps<TItem, TColumnValue, TFilterBy, Set<TFilterBy>>): JSX.Element {\n  const IconButton = useTheme((t) => t.components.IconButton);\n  const Checkbox = useTheme((t) => t.components.Checkbox);\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 table = useTableContext<TItem>();\n  const columnId = useColumnContext();\n\n  const {\n    value = new Set<TFilterBy>(),\n    onChange,\n    filterBy,\n    isActive,\n  } = useFilter({\n    ...props,\n\n    id: 'selectFilter',\n\n    isActive(filterValue) {\n      return filterValue.size > 0;\n    },\n\n    test(filterValue, value) {\n      return filterValue.has(value);\n    },\n  });\n\n  const options = table.useState((state) => {\n    if (providedOptions) return uniq(providedOptions);\n\n    const column = state.activeColumns.find((column) => column.id === columnId) as\n      | InternalColumn<TItem, TColumnValue>\n      | undefined;\n    if (!column) return [];\n\n    return orderBy(\n      uniq(\n        flatMap(state.items, (item) => castArray(filterBy(column.value(item.value), item.value))),\n      ),\n    );\n  });\n\n  const [query, setQuery] = useState('');\n  const filtered = options.filter(\n    (option) => !query || stringValue(option).toLowerCase().includes(query.toLowerCase()),\n  );\n  const delayedValue = useMemo(() => value, [isActive]);\n  const ordered = filtered\n    .filter((option) => delayedValue.has(option))\n    .concat(filtered.filter((option) => !delayedValue.has(option)));\n\n  const Button = useTheme((t) => t.components.Button);\n\n  useEffect(() => {\n    setQuery('');\n  }, [isActive]);\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        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","import { useImperativeHandle, type ForwardedRef } from 'react';\nimport { Store } from 'schummar-state/react';\nimport type { InternalTableState, TableRef } from '../types';\n\nexport default function useTableRef<T>(\n  table: Store<InternalTableState<T>>,\n  ref: ForwardedRef<TableRef>,\n) {\n  useImperativeHandle(\n    ref,\n    () => ({\n      getSort() {\n        return table.getState().sort;\n      },\n\n      setSort(sort) {\n        table.update((state) => {\n          state.sort = sort;\n        });\n      },\n\n      getSelection() {\n        return table.getState().selection;\n      },\n\n      setSelection(selection) {\n        table.update((state) => {\n          state.selection = selection;\n        });\n      },\n\n      getExpanded() {\n        return table.getState().expanded;\n      },\n\n      setExpanded(expanded) {\n        table.update((state) => {\n          state.expanded = expanded;\n        });\n      },\n\n      getHiddenColumns() {\n        return table.getState().hiddenColumns;\n      },\n\n      setHiddenColumns(hidden) {\n        table.update((state) => {\n          state.hiddenColumns = hidden;\n        });\n      },\n    }),\n    [table],\n  );\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      if (!this.isRunning) 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 type { Draft } from 'immer';\nimport { useEffect, useState } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { Queue } from '../misc/queue';\nimport type { InternalTableState } from '../types';\n\nconst KEYS = [\n  'sort',\n  'selection',\n  'expanded',\n  'hiddenColumns',\n  'filterValues',\n  'columnWidths',\n  'columnOrder',\n] as const;\n\nconst storageName = (id: string) => `schummar-table_state-v1_${id}`;\n\nexport type TableStateStorage = {\n  getItem: (key: string) => string | null | Promise<string | null>;\n  setItem: (key: string, value: string) => unknown | Promise<unknown>;\n  removeItem: (key: string) => unknown | Promise<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\nexport function useTableStateStorage(table: Store<InternalTableState<any>>) {\n  const [isHydrated, setIsHydrated] = useState(false);\n  const [q] = useState(() => new Queue());\n\n  // On mount: load\n  useEffect(() => {\n    const { persist } = table.getState().props;\n    if (!persist) {\n      setIsHydrated(true);\n      return;\n    }\n\n    let isCanceled = false;\n\n    (async () => {\n      try {\n        const { storage, id, include, exclude } = persist;\n        const json = await storage.getItem(storageName(id));\n        if (isCanceled || !json) return;\n\n        const data = parse(json);\n        table.getState().props.debug?.('load', json, data);\n\n        // eslint-disable-next-line no-inner-declarations\n        function applyUpdate(state: Draft<InternalTableState<any>>, key: (typeof KEYS)[number]) {\n          if (\n            //\n            (!include || include.includes(key)) &&\n            !exclude?.includes(key) &&\n            key in data\n          ) {\n            if (key === 'filterValues') {\n              for (const [id, value] of data[key]) {\n                const filter = state.filters.get(id);\n\n                if (filter && (filter.persist ?? filter.value === undefined)) {\n                  state.filterValues.set(id, value);\n                  state.filters.get(id)?.onChange?.(value);\n                }\n              }\n            } else {\n              if (\n                key === 'expanded' ||\n                key === 'hiddenColumns' ||\n                key === 'selection' ||\n                key === 'sort'\n              ) {\n                if (state.props[key] !== undefined) {\n                  return;\n                }\n\n                state.props[\n                  `on${\n                    (key.slice(0, 1).toUpperCase() + key.slice(1)) as Capitalize<typeof key>\n                  }Change`\n                ]?.(data[key]);\n              }\n\n              state[key] = data[key];\n            }\n          }\n        }\n\n        table.update((state) => {\n          for (const key of KEYS.filter((key) => key !== 'filterValues')) {\n            applyUpdate(state, key);\n          }\n        });\n\n        // First apply other keys and wait until changes take effect. Filters cannot be applied to hidden columns.\n        await new Promise((resolve) => {\n          setTimeout(resolve);\n        });\n        table.update((state) => applyUpdate(state, 'filterValues'));\n      } catch (error) {\n        console.error('Failed to load table state:', error);\n      } finally {\n        setIsHydrated(true);\n      }\n    })();\n\n    return () => {\n      isCanceled = true;\n    };\n  }, [table]);\n\n  // After isHydrated, watch and save state\n  useEffect(() => {\n    if (!isHydrated) return;\n\n    return table.subscribe(\n      (state) => {\n        if (!state.props.persist) return;\n\n        const { storage, id, include, exclude } = state.props.persist;\n        const data: any = {};\n\n        for (const key of KEYS) {\n          if (\n            //\n            (!include || include.includes(key)) &&\n            !exclude?.includes(key)\n          ) {\n            if (key === 'filterValues') {\n              data[key] = new Map();\n              for (const [id, value] of state.filterValues) {\n                if (state.filters.get(id)?.persist ?? state.filters.get(id)?.value === undefined) {\n                  data.filterValues.set(id, value);\n                }\n              }\n            } else {\n              if (\n                (key === 'expanded' ||\n                  key === 'hiddenColumns' ||\n                  key === 'selection' ||\n                  key === 'sort') &&\n                state.props[key] !== undefined\n              ) {\n                continue;\n              }\n\n              data[key] = state[key];\n            }\n          }\n        }\n\n        return { storage, id, data };\n      },\n      (props) => {\n        if (!props) return;\n        const { storage, id, data } = props;\n\n        table.getState().props.debug?.('save', data, stringify(data));\n        q.run(async () => {\n          await storage.setItem(storageName(id), stringify(data));\n        }, true);\n      },\n      { throttle: 1000 },\n    );\n  }, [table, isHydrated]);\n\n  async function clear() {\n    await q.run(async () => {\n      const persist = table.getState().props.persist;\n      if (!persist) {\n        return;\n      }\n\n      const { storage, id } = persist;\n      await storage.removeItem(storageName(id));\n\n      setIsHydrated(false);\n      q.clear();\n    });\n  }\n\n  return [isHydrated, clear] as const;\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { castArray, flatMap, orderBy } from '../misc/helpers';\nimport type { Id, InternalTableState, TableItem } from '../types';\n\nexport function calcItems<T>(state: Store<InternalTableState<T>>): void {\n  useEffect(\n    () =>\n      state.addReaction(\n        (state) =>\n          [\n            state.props.items,\n            state.props.id,\n            state.props.parentId,\n            state.props.revealFiltered,\n            state.props.externalSort,\n            state.props.locale,\n            state.sort,\n            state.filters,\n            state.filterValues,\n            state.activeColumns,\n            state.expanded,\n          ] as const,\n        (\n          [\n            items = [],\n            id,\n            parentId,\n            revealFiltered,\n            externalSort,\n            locale,\n            sort,\n            filters,\n            filterValues,\n            activeColumns,\n          ],\n          draft,\n        ) => {\n          const tableItems = items.map<TableItem<T>>((item) => ({\n            id: id(item),\n            parentId: parentId?.(item),\n            children: [],\n            value: item,\n          }));\n\n          let sorted;\n          if (sort.length === 0 || externalSort) {\n            sorted = tableItems;\n          } else {\n            const selectors = flatMap(sort, (sort) => {\n              const column = activeColumns.find((column) => column.id === sort.columnId);\n              if (!column) return [];\n              return column.sortBy.map((sortBy) => ({\n                selector: (item: T) => sortBy(column.value(item), item),\n                direction: sort.direction,\n                locale: sort.locale ?? locale,\n                options: sort.options,\n              }));\n            }).filter(Boolean);\n\n            sorted = orderBy(\n              tableItems,\n              selectors.map((x) => (item) => x.selector(item.value)),\n              selectors.map((x) => x.direction),\n              selectors.map((x) => x.locale),\n              selectors.map((x) => x.options),\n            );\n          }\n\n          const lookup = new Map<Id, TableItem<T>>();\n          for (const item of sorted) {\n            lookup.set(item.id, item);\n          }\n\n          for (const item of sorted) {\n            const parent =\n              item.parentId !== undefined && item.parentId !== null\n                ? lookup.get(item.parentId)\n                : undefined;\n            parent?.children.push(item);\n          }\n\n          const allItems = new Array<TableItem<T>>();\n          const allItemsById = new Map<Id, TableItem<T>>();\n\n          const traverse = (items: TableItem<T>[]): void => {\n            for (const item of items) {\n              allItems.push(item);\n              allItemsById.set(item.id, item);\n              traverse(item.children);\n            }\n          };\n          traverse(sorted.filter((item) => item.parentId === undefined || item.parentId === null));\n\n          let expandedChanged = false;\n          const activeItemsById = new Map<Id, TableItem<T>>();\n          const activeSet = new Set<Id>();\n          const activeItems = [...allItems]\n            .reverse()\n            .filter((item) => {\n              let isActive = activeSet.has(item.id);\n\n              isActive ||= activeColumns.every((column) => {\n                const filter = filters.get(column.id);\n                if (!filter || filter.external) return true;\n\n                const filterValue = filterValues.get(column.id);\n                if (filterValue === undefined || !filter.isActive(filterValue)) return true;\n\n                const filterBy = filter.filterBy ?? ((x) => x);\n                const value = filterBy(column.value(item.value), item.value);\n                return castArray(value).some((value) => filter.test(filterValue, value));\n              });\n\n              if (isActive && item.parentId !== undefined && item.parentId !== null) {\n                activeSet.add(item.parentId);\n\n                if (\n                  revealFiltered &&\n                  Array.from(filters.entries()).some(([id, filter]) => {\n                    const filterValue = filterValues.get(id);\n                    return !!filter && filterValue !== undefined && filter.isActive(filterValue);\n                  })\n                ) {\n                  expandedChanged ||= !draft.expanded.has(item.parentId);\n                  draft.expanded.add(item.parentId);\n                } else if (!draft.expanded.has(item.parentId)) {\n                  isActive = false;\n                }\n              }\n\n              if (isActive) {\n                activeItemsById.set(item.id, item);\n              }\n\n              return isActive;\n            })\n            .reverse();\n\n          draft.items = castDraft(allItems);\n          draft.itemsById = castDraft(allItemsById);\n          draft.activeItems = castDraft(activeItems);\n          draft.activeItemsById = castDraft(activeItemsById);\n\n          if (expandedChanged) {\n            setTimeout(() => {\n              state.getState().props.onExpandedChange?.(state.getState().expanded);\n            });\n          }\n        },\n        { runNow: true },\n      ),\n    [state],\n  );\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","export function overrides<T extends object>(first: T, ...overrides: (Partial<T> | undefined)[]): T {\n  return overrides.reduce<T>(\n    (result, source) => {\n      for (const [key, value] of Object.entries(source ?? {})) {\n        if (value !== undefined) {\n          result[key as keyof T] = value as any;\n        }\n      }\n\n      return result;\n    },\n    { ...first },\n  );\n}\n","import { useMemo } from 'react';\nimport { defaultSerializer } from '../exporters/serializer';\nimport { useTableMemo } from '../hooks/useTableMemo';\nimport { asString, castArray } from '../misc/helpers';\nimport { overrides } from '../misc/overrides';\nimport type { Column, Id, InternalColumn, InternalTableProps, TableProps } from '../types';\n\nconst defaultProps: InternalTableProps<any> = {\n  id: () => '',\n  columns: [],\n  enableSelection: true,\n  selectSyncChildren: true,\n  stickyHeader: true,\n  stickyFooter: true,\n  enableColumnSelection: true,\n  enableColumnResize: true,\n  enableColumnReorder: true,\n  displaySizeOverrides: {\n    mobile: {\n      enableSelection: false,\n      enableColumnSelection: false,\n      enableExport: false,\n      enableColumnResize: false,\n      enableColumnReorder: false,\n    },\n  },\n};\n\nexport function calcProps<T>(props: TableProps<T>): InternalTableProps<T> {\n  const cache = useTableMemo();\n\n  return useMemo(\n    () => overrides(defaultProps, calc(props, cache)) as InternalTableProps<T>,\n    [props],\n  );\n}\n\nfunction calc<T>(\n  props: Partial<TableProps<T>>,\n  cache: ReturnType<typeof useTableMemo>,\n): Partial<InternalTableProps<T>> {\n  let id;\n  if (props.id instanceof Function || Array.isArray(props.id)) {\n    id = cache('id', props.id);\n  } else if (props.id !== undefined) {\n    id = cache('id', [(item: T) => item[props.id as keyof T] as unknown as Id, props.id]);\n  }\n\n  let parentId;\n  if (props.parentId instanceof Function || Array.isArray(props.parentId)) {\n    parentId = cache('parentId', props.parentId);\n  } else if (props.parentId !== undefined) {\n    parentId = cache('parentId', [\n      (item: T) => item[props.parentId as keyof T] as unknown as Id | undefined,\n      props.parentId,\n    ]);\n  }\n\n  const columnProps = props.columnProps && cache('columnProps', props.columnProps);\n\n  let inputColumns;\n  if (props.columns instanceof Function) {\n    inputColumns = props.columns((value, column) => ({ ...column, value }));\n  } else if (props.columns !== undefined) {\n    inputColumns = props.columns.map((column) => column && { ...column, dependecies: undefined });\n  }\n\n  const globalDefaults = props.defaultColumnProps;\n  const mapColumn = <V>(\n    {\n      id: _id,\n      header,\n      exportHeader,\n      footer,\n      value,\n      renderCell,\n      exportCell,\n      sortBy,\n      disableSort,\n      hidden,\n      classes,\n      styles,\n      filter,\n      width,\n      displaySize,\n    }: Column<T, V>,\n    index: number,\n  ): InternalColumn<T, V> => {\n    const id = _id ?? index;\n    const cacheKey = typeof id === 'string' ? `s${id}` : `n${id}`;\n    const defaults = { ...globalDefaults, ...columnProps?.(id) };\n\n    return {\n      id,\n      header: header ?? defaults?.header ?? null,\n      exportHeader: exportHeader ?? defaults?.exportHeader ?? id,\n      footer: footer ?? defaults?.footer ?? null,\n      value: cache(`columns.${cacheKey}.value`, value),\n      renderCell: cache(\n        `columns.${cacheKey}.renderCell`,\n        renderCell ?? defaults?.renderCell ?? asString,\n      ),\n      exportCell: exportCell ?? defaults?.exportCell ?? defaultSerializer,\n      sortBy: (\n        sortBy ??\n        defaults?.sortBy ?? [\n          (v) =>\n            typeof v === 'number' || v instanceof Date\n              ? v\n              : v === null || v === undefined\n                ? ''\n                : String(v),\n        ]\n      ).map((function_, i) => cache(`columns.${cacheKey}.sortBy.${i}`, function_)),\n      disableSort: disableSort ?? defaults?.disableSort ?? false,\n      hidden: hidden ?? defaults?.hidden,\n      classes: classes ?? defaults?.classes,\n      styles: styles ?? defaults?.styles,\n      filter: filter ?? defaults?.filter,\n      width: width ?? defaults?.width,\n      displaySize:\n        (displaySize ?? defaults.displaySize) !== undefined\n          ? castArray((displaySize ?? defaults.displaySize)!)\n          : undefined,\n    };\n  };\n\n  const columns = inputColumns?.filter((x): x is Column<T, any> => !!x).map(mapColumn);\n\n  const wrapRow = props.wrapRow && cache('wrapRow', props.wrapRow);\n  const wrapCell = props.wrapCell && cache('wrapCell', props.wrapCell);\n\n  const rowAction =\n    props.rowAction instanceof Function || Array.isArray(props.rowAction)\n      ? cache('rowAction', props.rowAction)\n      : props.rowAction;\n\n  const rowDetails =\n    props.rowDetails instanceof Function || Array.isArray(props.rowDetails)\n      ? cache('rowDetails', props.rowDetails)\n      : props.rowDetails;\n\n  const displaySizeOverrides =\n    props.displaySizeOverrides &&\n    Object.fromEntries(\n      Object.entries(props.displaySizeOverrides ?? {}).map(([size, overrides]) => [\n        size,\n        overrides && calc(overrides, cache),\n      ]),\n    );\n\n  return {\n    ...props,\n    id,\n    parentId,\n    columns,\n    columnProps,\n    wrapRow,\n    wrapCell,\n    rowAction,\n    rowDetails,\n    enableSelection: props.enableSelection,\n    selectSyncChildren: props.selectSyncChildren,\n    stickyHeader: props.stickyHeader,\n    stickyFooter: props.stickyFooter,\n    enableColumnSelection: props.enableColumnSelection,\n    enableExport: props.enableExport,\n    enableClearFiltersButton: props.enableClearFiltersButton,\n    enableColumnResize: props.enableColumnResize,\n    enableColumnReorder: props.enableColumnReorder,\n    displaySizeOverrides,\n  };\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { intersect } from '../misc/helpers';\nimport type { InternalTableState } from '../types';\n\nexport function cleanupState<T>(state: Store<InternalTableState<T>>): void {\n  useEffect(\n    () =>\n      state.addReaction(\n        (state) =>\n          [\n            state.props.columns,\n            state.itemsById,\n            state.activeItemsById,\n            state.activeColumns,\n          ] as const,\n        ([columns, itemsById, activeItemsById, activeColumns], draft) => {\n          const columnIds = new Set(columns.map((column) => column.id));\n          const activeColumnIds = new Set(activeColumns.map((column) => column.id));\n\n          // Remove sort entries for non active columns\n          const newSort = draft.sort.filter((s) => activeColumnIds.has(s.columnId));\n          if (newSort.length < draft.sort.length) {\n            draft.sort = newSort;\n            setTimeout(() => {\n              state.getState().props.onSortChange?.(newSort);\n            });\n          }\n\n          // Remove filters for non active columns\n          for (const id of draft.filters.keys()) {\n            if (!activeColumnIds.has(id)) draft.filters.delete(id);\n          }\n\n          // Remove filterValues for non active columns\n          for (const id of draft.filterValues.keys()) {\n            if (!activeColumnIds.has(id)) draft.filterValues.delete(id);\n          }\n\n          // Remove hiddenColumns for non existing columns\n          for (const id of draft.hiddenColumns.keys()) {\n            if (!columnIds.has(id)) draft.hiddenColumns.delete(id);\n          }\n\n          // Remove columnWidth for non existing columns\n          for (const id of draft.columnWidths.keys()) {\n            if (!columnIds.has(id)) draft.columnWidths.delete(id);\n          }\n\n          // Remove non existing columns from columnOrder\n          for (const id of draft.columnOrder) {\n            if (!columnIds.has(id)) draft.columnOrder = draft.columnOrder.filter((x) => x !== id);\n          }\n\n          if (draft.props.items) {\n            // Remove selection for non active items\n            const newSelection = intersect(draft.selection, activeItemsById);\n            if (newSelection.size !== draft.selection.size) {\n              draft.selection = newSelection;\n              setTimeout(() => {\n                state.getState().props.onSelectionChange?.(newSelection);\n              });\n            }\n\n            // Remove expanded for non existing items\n            const newExpanded = intersect(draft.expanded, itemsById);\n            if (newExpanded.size < draft.expanded.size) {\n              draft.expanded = newExpanded;\n              setTimeout(() => {\n                state.getState().props.onExpandedChange?.(newExpanded);\n              });\n            }\n          }\n        },\n        { runNow: true },\n      ),\n    [state],\n  );\n}\n","import type { Draft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { orderBy } from '../misc/helpers';\nimport { InternalColumn, type InternalTableState } from '../types';\n\nexport function filterColumns<T>(state: Store<InternalTableState<T>>): void {\n  useEffect(\n    () =>\n      state.addReaction(\n        (state) =>\n          [state.props.columns, state.hiddenColumns, state.columnOrder, state.displaySize] as const,\n        ([columns, hiddenColumns, columnOrder, displaySize], draft) => {\n          draft.activeColumns = orderBy(\n            columns.filter((column) => !(column.hidden ?? hiddenColumns.has(column.id))),\n            [(column) => columnOrder.indexOf(column.id)],\n          ) as Draft<InternalColumn<T, unknown>[]>;\n\n          draft.visibleColumns = draft.activeColumns.filter(\n            (column) =>\n              displaySize === undefined ||\n              column.displaySize === undefined ||\n              column.displaySize.includes(displaySize),\n          );\n        },\n        { runNow: true },\n      ),\n    [state],\n  );\n\n  useEffect(\n    () =>\n      state.addReaction(\n        (state) => new Set(state.visibleColumns.map((column) => column.id)),\n        (_, draft) => {\n          draft.rowHeights.clear();\n          draft.rowHeightsKey = Math.random();\n        },\n        { runNow: false },\n      ),\n    [state],\n  );\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { getAncestors, orderBy } from '../misc/helpers';\nimport type { Id, InternalTableState } from '../types';\n\nexport function normalizeExpanded<T>(table: Store<InternalTableState<T>>): void {\n  useEffect(\n    () =>\n      table.addReaction(\n        (state) => [state.props.expandOnlyOne, state.expanded, state.itemsById] as const,\n        ([expandOnlyOne, , itemsById], state) => {\n          let expanded = state.expanded;\n          let hasChanged = false;\n\n          const allAncestors = [...expanded].map((id) => {\n            const item = itemsById.get(id);\n            return {\n              id,\n              ancestors: item ? getAncestors(itemsById, item) : new Set<Id>(),\n            };\n          });\n\n          // If only one branch may be expanded, check if there are more and close if necessary\n          if (expandOnlyOne) {\n            const withMostAncestors = orderBy(allAncestors, [(x) => x.ancestors.size], ['desc'])[0];\n\n            if (\n              [...expanded].some(\n                (id) => id !== withMostAncestors?.id && !withMostAncestors?.ancestors.has(id),\n              )\n            ) {\n              expanded = withMostAncestors?.ancestors ?? new Set();\n              state.expanded = expanded;\n\n              state.props.onExpandedChange?.(expanded);\n              return;\n            }\n          }\n\n          for (const { ancestors } of allAncestors) {\n            for (const ancestor of ancestors ?? []) {\n              if (!expanded.has(ancestor)) {\n                expanded.add(ancestor);\n                hasChanged = true;\n              }\n            }\n          }\n\n          if (hasChanged) {\n            state.props.onExpandedChange?.(new Set(expanded));\n          }\n        },\n        { runNow: true },\n      ),\n    [table],\n  );\n}\n","import { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport type { InternalTableState } from '../types';\n\nexport function syncSelections<T>(table: Store<InternalTableState<T>>): void {\n  useEffect(\n    () =>\n      table.addReaction(\n        (state) => [state.props.selectSyncChildren, state.selection, state.activeItems] as const,\n        ([selectSyncChildren, selection, activeItems], state) => {\n          if (!selectSyncChildren) return;\n\n          const newSelection = new Set(selection);\n          for (const item of activeItems) {\n            if (\n              item.parentId !== undefined &&\n              item.parentId !== null &&\n              newSelection.has(item.parentId)\n            ) {\n              newSelection.add(item.id);\n            }\n          }\n\n          if (newSelection.size !== selection.size) {\n            state.selection = newSelection;\n            setTimeout(() => {\n              table.getState().props.onSelectionChange?.(newSelection);\n            });\n          }\n        },\n        { runNow: true },\n      ),\n    [table],\n  );\n}\n","import { castDraft } from 'immer';\nimport { useEffect } from 'react';\nimport type { Store } from 'schummar-state/react';\nimport { overrides } from '../misc/overrides';\nimport type { InternalTableState } from '../types';\n\nexport function watchDisplaySize<T>(state: Store<InternalTableState<T>>): void {\n  useEffect(() => {\n    function onResize() {\n      state.update((draft) => {\n        draft.displaySizePx = window.innerWidth;\n      });\n    }\n\n    onResize();\n    document.defaultView?.addEventListener('resize', onResize);\n    return () => document.defaultView?.removeEventListener('resize', onResize);\n  }, [state]);\n\n  useEffect(\n    () =>\n      state.addReaction(\n        (state) => ({\n          displaySizePx: state.displaySizePx,\n          displaySize: state.props.displaySize,\n        }),\n        ({ displaySizePx, displaySize }, draft) => {\n          if (displaySizePx === undefined) {\n            return;\n          }\n\n          if (typeof displaySize === 'object') {\n            const entry = Object.entries(displaySize).find(\n              ([, maxWidth]) => maxWidth !== undefined && maxWidth >= displaySizePx,\n            );\n            draft.displaySize = entry?.[0];\n          } else {\n            draft.displaySize = displaySize;\n          }\n        },\n      ),\n    [state],\n  );\n\n  useEffect(\n    () =>\n      state.addReaction(\n        (state) => ({\n          props: state.normalizedProps,\n          displaySize: state.displaySize,\n        }),\n        ({ props, displaySize }, draft) => {\n          draft.props = castDraft(\n            overrides(props, displaySize ? props.displaySizeOverrides?.[displaySize] : undefined),\n          );\n        },\n      ),\n    [state],\n  );\n}\n","import { castDraft } from 'immer';\nimport { useEffect, useMemo, useState } from 'react';\nimport { Store } from 'schummar-state/react';\nimport type { InternalTableState, TableProps } from '../types';\nimport { calcItems } from './calcItems';\nimport { calcProps } from './calcProps';\nimport { cleanupState } from './cleanupState';\nimport { filterColumns } from './filterColumns';\nimport { normalizeExpanded } from './normalizeExpanded';\nimport { syncSelections } from './syncSelections';\nimport { watchDisplaySize } from './watchDisplaySize';\n\nexport function useTableState<T>(\n  _props: TableProps<T>,\n): [Store<InternalTableState<T>>, () => void] {\n  const [key, setKey] = useState({});\n  const props = calcProps(_props);\n\n  function reset() {\n    setKey({});\n\n    if (props.sort === undefined) {\n      props.onSortChange?.(props.defaultSort ?? []);\n    }\n\n    if (props.expanded === undefined) {\n      props.onExpandedChange?.(props.defaultExpanded ?? new Set());\n    }\n\n    if (props.selection === undefined) {\n      props.onSelectionChange?.(props.defaultSelection ?? new Set());\n    }\n\n    if (props.hiddenColumns === undefined) {\n      props.onHiddenColumnsChange?.(props.defaultHiddenColumns ?? new Set());\n    }\n\n    props.onReset?.('table');\n  }\n\n  const state = useMemo(\n    () =>\n      new Store<InternalTableState<T>>({\n        normalizedProps: props,\n        props,\n\n        key,\n        sort: props.defaultSort ?? [],\n        selection: props.defaultSelection ?? new Set(),\n        expanded: props.defaultExpanded ?? new Set(),\n        rowHeights: new Map(),\n        rowHeightsKey: Math.random(),\n        filters: new Map(),\n        filterValues: new Map(),\n        hiddenColumns: props.defaultHiddenColumns ?? new Set(),\n        columnWidths: new Map(),\n        columnOrder: props.columns.map((column) => column.id),\n        columnStyleOverride: new Map(),\n\n        activeColumns: [],\n        visibleColumns: [],\n        items: [],\n        itemsById: new Map(),\n        activeItems: [],\n        activeItemsById: new Map(),\n        lastSelectedId: undefined,\n        displaySizePx: undefined,\n        displaySize: undefined,\n      }),\n    [key],\n  );\n\n  filterColumns(state);\n  calcItems(state);\n  normalizeExpanded(state);\n  syncSelections(state);\n  cleanupState(state);\n  watchDisplaySize(state);\n\n  useEffect(() => {\n    state.update((state) => {\n      state.normalizedProps = castDraft(props);\n\n      if (props.sort) state.sort = props.sort;\n      if (props.selection) state.selection = props.selection;\n      if (props.expanded) state.expanded = props.expanded;\n      if (props.hiddenColumns) state.hiddenColumns = props.hiddenColumns;\n      for (const column of props.columns) {\n        if (!state.columnOrder.includes(column.id)) {\n          const index = props.columns.indexOf(column);\n          state.columnOrder.splice(index, 0, column.id);\n        }\n      }\n    });\n  }, [state, props]);\n\n  return [state, reset];\n}\n","import { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\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 table = useTableContext<T>();\n\n  return (\n    <div css={defaultClasses.clearFiltersButton}>\n      <Button\n        variant=\"outlined\"\n        onClick={() => {\n          table.update((state) => {\n            state.activeColumns.forEach((column) => {\n              state.filterValues.delete(column.id);\n            });\n            table.getState().props.onReset?.('filters');\n          });\n        }}\n      >\n        {textClearFilters}\n      </Button>\n    </div>\n  );\n}\n","import { useTheme } from '../hooks/useTheme';\nimport { cx } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\n\nexport function ColumnFooter() {\n  const table = useTableContext();\n  const columnId = useColumnContext();\n  const stickyFooter = table.useState((state) => state.props.stickyFooter);\n  const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n    throttle: 16,\n  });\n  const columnClasses = table.useState(\n    (state) => state.activeColumns.find((column) => column.id === columnId)?.classes?.footerCell,\n  );\n  const classes = useTheme((theme) => theme.classes?.footerCell);\n  const columnCss = table.useState(\n    (state) => state.activeColumns.find((column) => column.id === columnId)?.styles?.footerCell,\n  );\n  const styles = useTheme((theme) => theme.styles?.footerCell);\n\n  const content = table.useState((state) => {\n    const column = state.activeColumns.find((column) => column.id === columnId);\n\n    return column?.footer;\n  });\n\n  return (\n    <div\n      className={cx(classes, columnClasses)}\n      css={[\n        defaultClasses.footerCell,\n        stickyFooter && defaultClasses.stickyBottom,\n        stickyFooter instanceof Object && stickyFooter,\n        styles,\n        columnCss,\n      ]}\n      style={columnStyleOverride}\n    >\n      {content}\n    </div>\n  );\n}\n","import type React from 'react';\nimport type { HTMLProps } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\n\nexport function ResizeHandle() {\n  const table = useTableContext();\n  const columnId = useColumnContext();\n  const enabled = table.useState((state) => state.props.enableColumnResize);\n  const hasFilter = table.useState((state) => state.filters.get(columnId) !== undefined);\n\n  function onPointerDown(event: React.PointerEvent) {\n    event.stopPropagation();\n\n    const div = event.target as HTMLDivElement;\n    div.setPointerCapture(event.pointerId);\n  }\n\n  function onPointerMove(event: React.PointerEvent) {\n    event.stopPropagation();\n\n    const div = event.target as HTMLDivElement;\n    if (!div.hasPointerCapture(event.pointerId)) return;\n\n    const parent = div.parentElement as HTMLDivElement;\n    const minWidth = hasFilter ? 80 : 50;\n    const width = Math.max(event.clientX - parent.getBoundingClientRect().left + 5, minWidth);\n\n    table.update((state) => {\n      state.columnWidths.set(columnId, `${width}px`);\n    });\n  }\n\n  function onPointerUp(event: React.PointerEvent) {\n    event.stopPropagation();\n\n    const div = event.target as HTMLDivElement;\n    div.releasePointerCapture(event.pointerId);\n  }\n\n  function onDoubleClick(event: React.MouseEvent) {\n    table.update((state) => {\n      if (event.getModifierState('Control')) {\n        state.columnWidths.delete(columnId);\n      } else {\n        state.columnWidths.set(columnId, 'max-content');\n      }\n    });\n  }\n\n  if (!enabled) {\n    return null;\n  }\n\n  return (\n    <ResizeHandleView\n      enabled={enabled}\n      onPointerDown={enabled ? onPointerDown : undefined}\n      onPointerMove={enabled ? onPointerMove : undefined}\n      onPointerUp={enabled ? onPointerUp : undefined}\n      onDoubleClick={enabled ? onDoubleClick : undefined}\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 type { ReactNode } from 'react';\nimport type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\n\nexport function SortComponent<T>({ children }: { children: ReactNode }): JSX.Element {\n  const table = useTableContext<T>();\n  const columnId = useColumnContext();\n  const Badge = useTheme((t) => t.components.Badge);\n  const ArrowUpward = useTheme((t) => t.icons.ArrowUpward);\n\n  const { direction, index, sortDisabled } = table.useState((state) => {\n    const index = state.sort.findIndex((s) => s.columnId === columnId) ?? -1;\n    const column = state.activeColumns.find((column) => column.id === columnId);\n\n    return {\n      direction: state.sort[index]?.direction,\n      index: index >= 0 && state.sort.length > 1 ? index + 1 : undefined,\n      sortDisabled: column?.disableSort ?? state.props.disableSort,\n    };\n  });\n\n  function toggle(event: React.MouseEvent, off?: boolean) {\n    if (sortDisabled) {\n      return;\n    }\n\n    const {\n      props: { sort: controlledSort, onSortChange },\n    } = table.getState();\n\n    const newDirection = direction === 'asc' ? 'desc' : 'asc';\n    const newSort =\n      event.getModifierState('Control') || off\n        ? table.getState().sort.filter((s) => s.columnId !== columnId)\n        : [];\n    if (!off) {\n      newSort.push({\n        columnId,\n        direction: newDirection,\n      });\n    }\n\n    onSortChange?.(newSort);\n\n    if (!controlledSort) {\n      table.update((state) => {\n        state.sort = newSort;\n      });\n    }\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        '& > div': {\n          overflow: 'hidden',\n          textOverflow: 'ellipsis',\n        },\n      }}\n      onClick={(event) => toggle(event)}\n      onContextMenu={(event) => toggle(event, true)}\n    >\n      <div>{children}</div>\n\n      {\n        <Badge badgeContent={sortDisabled ? 0 : index}>\n          <span\n            css={[\n              { 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 { castDraft } from 'immer';\nimport type React from 'react';\nimport { useEffect, useRef } from 'react';\nimport { StoreScope } from 'schummar-state/react';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { useTheme } from '../hooks/useTheme';\nimport { cx } from '../misc/helpers';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\nimport { FilterControl } from './filterControl';\nimport { ResizeHandle } from './resizeHandle';\nimport { SortComponent } from './sortComponent';\n\nexport interface ColumnHeaderProps {\n  index: number;\n}\n\nexport const ColumnHeaderContext = new StoreScope({\n  items: new Map<Id, HTMLDivElement>(),\n});\n\nexport function ColumnHeader({ index }: ColumnHeaderProps): JSX.Element {\n  const ref = useRef<HTMLDivElement>(null);\n  const columnId = useColumnContext();\n  const table = useTableContext();\n  const enabled = table.useState((state) => state.props.enableColumnReorder);\n  const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n    throttle: 16,\n  });\n  const stickyHeader = table.useState((state) => state.props.stickyHeader);\n  const classes = useTheme((theme) => theme.classes?.headerCell);\n  const styles = useTheme((theme) => theme.styles?.headerCell);\n\n  const { header, columnClasses, columnStyles } = table.useState((state) => {\n    const column = state.activeColumns.find((column) => column.id === columnId);\n    return {\n      header: column?.header,\n      columnClasses: column?.classes?.headerCell,\n      columnStyles: column?.styles?.headerCell,\n    };\n  });\n\n  const store = ColumnHeaderContext.useStore();\n  const draggingStart = useRef<{ mouseX: number; bounds: DOMRect }>();\n  const clone = useRef<HTMLDivElement>();\n\n  // Track each headers div in a store\n  useEffect(() => {\n    const div = ref.current;\n    if (!div) return;\n\n    store.update((state) => {\n      state.items.set(columnId, castDraft(div));\n    });\n\n    return () => {\n      store.update((state) => {\n        state.items.delete(columnId);\n      });\n    };\n  }, [store, columnId]);\n\n  // Calculate which index the current header would get, given the current offset\n  function calcTargetIndex(offsetLeft: number) {\n    const cols = table\n      .getState()\n      .columnOrder.map((id) => ({ id, div: store.getState().items.get(id) }));\n\n    const otherCols = cols.filter((col) => col.id !== columnId);\n\n    const firstOffsetleft = cols.find((col) => col.div)?.div?.offsetLeft ?? 0;\n\n    let sum = 0;\n    const targetIndex = otherCols.findIndex((col) => {\n      const width = col.div?.offsetWidth ?? 0;\n      if (sum + width / 2 > offsetLeft - firstOffsetleft) return true;\n      sum += width;\n      return false;\n    });\n\n    return targetIndex === -1 ? otherCols.length : targetIndex;\n  }\n\n  // When starting clicking: Record initial mouse and div's bounds\n  function onPointerDown(event: React.PointerEvent) {\n    const div = ref.current;\n    if (!div) return;\n    draggingStart.current = { mouseX: event.clientX, bounds: div.getBoundingClientRect() };\n  }\n\n  // When mouse moves while clicked: Calculate transforms\n  function onPointerMove(event: React.PointerEvent) {\n    table.update((state) => {\n      const div = ref.current;\n      if (\n        !div ||\n        draggingStart.current === undefined ||\n        Math.abs(event.clientX - draggingStart.current.mouseX) < 5\n      )\n        return;\n\n      event.stopPropagation();\n      div.setPointerCapture(event.pointerId);\n\n      // Create clone of header div to move around with mouse\n      if (!clone.current) {\n        clone.current = div.cloneNode(true) as HTMLDivElement;\n        document.body.append(clone.current);\n\n        for (const [key, value] of Object.entries(getComputedStyle(div))) {\n          try {\n            clone.current.style[key as any] = value;\n          } catch {\n            // ignore\n          }\n        }\n\n        Object.assign(clone.current.style, {\n          pointerEvents: 'none',\n          position: 'fixed',\n          boxShadow:\n            '0px 5px 5px -3px rgb(0 0 0 / 20%), 0px 8px 10px 1px rgb(0 0 0 / 14%), 0px 3px 14px 2px rgb(0 0 0 / 12%)',\n          left: `${draggingStart.current.bounds.left}px`,\n          top: `${draggingStart.current.bounds.top}px`,\n        });\n\n        div.style.color = 'rgba(0, 0, 0, 0.2)';\n      }\n\n      // Update clone's position each time\n      clone.current.style.left = `${\n        draggingStart.current.bounds.left + event.clientX - draggingStart.current.mouseX\n      }px`;\n\n      // Calculate target index\n      const index = state.columnOrder.indexOf(columnId);\n      const targetIndex = calcTargetIndex(\n        div.offsetLeft + event.clientX - draggingStart.current.mouseX,\n      );\n\n      // Apply transforms to each column\n      const columns = table.getState().columnOrder.map((id, index) => ({\n        id,\n        index,\n        width: store.getState().items.get(id)?.offsetWidth ?? 0,\n      }));\n\n      state.columnOrder.forEach((id, i) => {\n        let offset = 0;\n        if (i === index) {\n          // Current column: Move to target pos\n          if (targetIndex > index) {\n            offset = columns\n              .slice(index + 1, targetIndex + 1)\n              .reduce((sum, col) => sum + col.width, 0);\n          } else if (targetIndex < index) {\n            offset = -columns.slice(targetIndex, index).reduce((sum, col) => sum + col.width, 0);\n          }\n        } else if (i >= targetIndex && i < index) {\n          // Left columns: Move right to make room if needed\n          offset = div.offsetWidth;\n        } else if (i > index && i <= targetIndex) {\n          // Right columns: Move left to make room if needed\n          offset = -div.offsetWidth;\n        }\n\n        state.columnStyleOverride.set(id, {\n          transition: 'transform 500ms',\n          transform: `translate3d(${offset}px, 0, 0)`,\n          zIndex: i === index ? 1 : undefined,\n        });\n      });\n    });\n  }\n\n  // When releasing mouse: Reset draggin state and apply column move\n  function onPointerUp(event: React.PointerEvent) {\n    table.update((state) => {\n      const div = ref.current;\n      if (!div || draggingStart.current === undefined) return;\n\n      // Apply column move\n      const index = state.columnOrder.indexOf(columnId);\n      const targetIndex = calcTargetIndex(\n        div.offsetLeft + event.clientX - draggingStart.current.mouseX,\n      );\n\n      state.columnOrder.splice(index, 1);\n      state.columnOrder.splice(targetIndex, 0, columnId);\n\n      // Cleanup\n      clone.current?.remove();\n      div.style.color = '';\n      state.columnStyleOverride.clear();\n      draggingStart.current = undefined;\n      clone.current = undefined;\n    });\n  }\n\n  return (\n    <div\n      ref={ref}\n      className={cx(classes, columnClasses)}\n      css={[\n        defaultClasses.headerCell,\n        {\n          gridRow: 1,\n          gridColumn: index + 3,\n          position: 'relative',\n          userSelect: 'none',\n        },\n        stickyHeader && defaultClasses.sticky,\n        stickyHeader instanceof Object && stickyHeader,\n        styles,\n        columnStyles,\n      ]}\n      style={columnStyleOverride}\n      onPointerDown={enabled ? onPointerDown : undefined}\n      onPointerMove={enabled ? onPointerMove : undefined}\n      onPointerUp={enabled ? onPointerUp : undefined}\n    >\n      <SortComponent>{header}</SortComponent>\n      <div css={{ flex: 1 }} />\n      <FilterControl />\n      <ResizeHandle />\n    </div>\n  );\n}\n","import { useContext, useState } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { TableResetContext, useTableContext } from '../misc/tableContext';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { InternalColumn } from '../types';\nimport { FormControlLabel } from './formControlLabel';\n\nexport function ColumnSelection<T>(): JSX.Element {\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 table = useTableContext<T>();\n  const reset = useContext(TableResetContext);\n  const columns = table.useState((state) =>\n    state.props.columns.filter(\n      (column) =>\n        state.displaySize === undefined ||\n        column.displaySize === undefined ||\n        column.displaySize.includes(state.displaySize),\n    ),\n  );\n  const hiddenColumns = table.useState((state) => state.hiddenColumns);\n\n  const [anchorElement, setAnchorElement] = useState<Element | null>(null);\n\n  const toggle = (column?: InternalColumn<T, unknown>, state?: boolean) => {\n    const {\n      props: { hiddenColumns: controlledHiddenColumns, onHiddenColumnsChange },\n    } = table.getState();\n\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    if (!controlledHiddenColumns) {\n      table.update((state) => {\n        state.hiddenColumns = newValue;\n      });\n    }\n\n    onHiddenColumnsChange?.(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={reset}>\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 } from 'react';\nimport { ExportOptions, ExporterEntry } from '../exporters/exporter';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\nimport { TableSettingsContext } from '../misc/tableSettings';\nimport { useCssVariables } from '../theme/useCssVariables';\n\nexport function Export<T>(): JSX.Element {\n  const { exporters: contextExporters } = useContext(TableSettingsContext);\n  const table = useTableContext<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 } = table.useState((state): ExportOptions => {\n    if (typeof state.props.enableExport === 'boolean' || state.props.enableExport === undefined) {\n      return {\n        all: false,\n        exporters: contextExporters,\n      };\n    }\n\n    return state.props.enableExport;\n  });\n\n  const [anchor, setAnchor] = useState<Element | null>(null);\n\n  function execute({ action, exporter }: ExporterEntry) {\n    const { activeColumns, activeItems, items } = table.getState();\n    const columns = activeColumns.map((column) => column.exportHeader);\n    const rows = (all ? items : activeItems).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);\n    } else {\n      const blob = exporter.exportToBlob(columns, rows);\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  }\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 type { MemoizedTableTheme } from '../types';\n\nexport function calcClassNames<T>(\n  classes: MemoizedTableTheme<T>['classes'] | undefined,\n  item: T,\n  index: number,\n) {\n  return [\n    classes?.cell instanceof Function ? classes.cell(item, index) : classes?.cell,\n    index % 2 === 0 && classes?.evenCell,\n    index % 2 === 1 && classes?.oddCell,\n  ];\n}\n\nexport function calcCss<T>(\n  styles: MemoizedTableTheme<T>['styles'] | undefined,\n  item: T | undefined,\n  index: number,\n) {\n  return [\n    styles?.cell instanceof Function\n      ? item !== undefined\n        ? styles.cell(item, index)\n        : undefined\n      : styles?.cell,\n    index % 2 === 0 && styles?.evenCell,\n    index % 2 === 1 && styles?.oddCell,\n  ];\n}\n","import type { ReactNode } from 'react';\nimport { memo, useLayoutEffect } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { calcClassNames, calcCss } from '../misc/calcClassNames';\nimport { cx } from '../misc/helpers';\nimport { useColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\n\nconst defaultWrapCell = (content: ReactNode) => {\n  if (typeof content === 'string') {\n    return (\n      <span css={defaultClasses.text} title={content}>\n        {content}\n      </span>\n    );\n  }\n  return content;\n};\n\nexport const Cell = memo(function Cell<T>({ itemId, rowIndex }: { itemId: Id; rowIndex: number }) {\n  const table = useTableContext<T>();\n  const columnId = useColumnContext();\n\n  const column = table.useState((state) => {\n    const col = state.activeColumns.find((column) => column.id === columnId);\n    return (\n      col && {\n        value: col.value,\n        renderCell: col.renderCell,\n      }\n    );\n  });\n  const wrapCell = table.useState((state) => state.props.wrapCell) ?? defaultWrapCell;\n  const item = table.useState((state) => state.activeItemsById.get(itemId));\n  const columnStyleOverride = table.useState((state) => state.columnStyleOverride.get(columnId), {\n    throttle: 16,\n  });\n\n  useLayoutEffect(() => {\n    table.getState().props.debugRender?.('render cell', itemId, columnId);\n  });\n  const className = useTheme((t) => cx(...calcClassNames(t.classes, item?.value, rowIndex)));\n  const styles = useTheme((t) => calcCss<T>(t.styles, item?.value, rowIndex));\n\n  if (!column || !item) return null;\n\n  const content = column.renderCell(column.value(item.value), item.value);\n\n  return (\n    <div className={className} css={[defaultClasses.cell, styles]} style={columnStyleOverride}>\n      {wrapCell(content, column.value(item.value), item.value, rowIndex)}\n    </div>\n  );\n});\n","import { forwardRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { Id } from '../types';\n\nexport const Details = forwardRef<\n  HTMLDivElement,\n  {\n    itemId: Id;\n    rowIndex: number;\n  }\n>(function Details({ itemId, rowIndex }, ref) {\n  const table = useTableContext<unknown>();\n  const classes = useTheme((t) => t.classes);\n  const styles = useTheme((t) => t.styles);\n\n  const { details, className, css } = table.useState((state) => {\n    const item = state.activeItemsById.get(itemId);\n\n    return {\n      details: state.expanded.has(itemId)\n        ? state.props.rowDetails instanceof Function\n          ? item\n            ? state.props.rowDetails(item.value, rowIndex)\n            : null\n          : state.props.rowDetails\n        : undefined,\n      className:\n        classes?.details instanceof Function\n          ? classes.details(item?.value, rowIndex)\n          : classes?.details,\n      css:\n        styles?.details instanceof Function\n          ? styles.details(item?.value, rowIndex)\n          : styles?.details,\n    };\n  });\n\n  return details ? (\n    <div ref={ref} className={className} css={[defaultClasses.details, css]}>\n      {details}\n    </div>\n  ) : null;\n});\n","import type { MouseEvent } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { useTableContext } from '../misc/tableContext';\nimport type { Id } from '../types';\n\nexport function ExpandControl<T>({\n  itemId,\n  hasDeferredChildren,\n}: {\n  itemId: Id;\n  hasDeferredChildren?: boolean;\n}): JSX.Element {\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\n  const table = useTableContext<T>();\n  const isExpanded = table.useState((state) => state.expanded.has(itemId));\n  const hasChildren = table.useState(\n    (state) => !!state.activeItemsById.get(itemId)?.children.length,\n  );\n\n  function toggle(e: MouseEvent) {\n    e.preventDefault();\n    e.stopPropagation();\n\n    const {\n      props: { expanded: controlledExpanded, expandOnlyOne, onExpandedChange },\n      expanded,\n      activeItemsById,\n    } = table.getState();\n\n    const newExpanded = new Set(expanded);\n\n    if (expandOnlyOne) {\n      newExpanded.clear();\n\n      const item = activeItemsById.get(itemId);\n      for (const ancestor of item ? getAncestors(activeItemsById, item) : []) {\n        newExpanded.add(ancestor);\n      }\n    }\n\n    if (isExpanded) {\n      newExpanded.delete(itemId);\n\n      const item = activeItemsById.get(itemId);\n      for (const descendant of item ? getDescendants(item) : []) {\n        newExpanded.delete(descendant);\n      }\n    } else {\n      newExpanded.add(itemId);\n    }\n\n    onExpandedChange?.(newExpanded);\n\n    if (!controlledExpanded) {\n      table.update((state) => {\n        state.expanded = newExpanded;\n      });\n    }\n  }\n\n  if (isExpanded && hasDeferredChildren && !hasChildren) {\n    return <Spinner css={{ margin: '0 var(--spacing)' }} />;\n  }\n\n  return (\n    <IconButton onClick={toggle}>\n      <span\n        css={{\n          display: 'inline-flex',\n          transition: 'all 300ms',\n          transform: isExpanded ? 'rotate3d(0, 0, 1, 90deg)' : 'rotate3d(0, 0, 1, 0deg)',\n        }}\n      >\n        <ChevronRight />\n      </span>\n    </IconButton>\n  );\n}\n","import type React from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { getAncestors, getDescendants } from '../misc/helpers';\nimport { useTableContext } from '../misc/tableContext';\nimport type { Id } from '../types';\n\nexport function SelectComponent<T>({ itemId }: { itemId?: Id }): JSX.Element {\n  const table = useTableContext<T>();\n  const Checkbox = useTheme((t) => t.components.Checkbox);\n\n  const isSelected = table.useState((state) => {\n    const itemIds = itemId ? [itemId] : Array.from(state.activeItemsById.keys());\n    return state.activeItemsById.size > 0 && itemIds.every((itemId) => state.selection.has(itemId));\n  });\n\n  function toggle(event: React.ChangeEvent) {\n    const mouseEvent = event.nativeEvent as MouseEvent;\n\n    const {\n      activeItems,\n      activeItemsById,\n      lastSelectedId,\n      selection,\n      props: { selectSyncChildren, selection: controlledSelection, onSelectionChange },\n    } = table.getState();\n\n    let range;\n    if (mouseEvent.shiftKey && itemId) {\n      const a = lastSelectedId ? activeItems.findIndex((i) => lastSelectedId === i.id) : 0;\n      const b = activeItems.findIndex((item) => item.id === itemId);\n      range = activeItems.slice(Math.min(a, b), Math.max(a, b) + 1);\n    } else {\n      const item = itemId ? activeItemsById.get(itemId) : undefined;\n      range = item ? [item] : activeItems;\n    }\n\n    const newSelection = new Set(selection);\n    for (const item of range) {\n      if (isSelected) newSelection.delete(item.id);\n      else newSelection.add(item.id);\n    }\n\n    if (selectSyncChildren && isSelected) {\n      for (const ancestor of getAncestors(activeItemsById, ...range)) {\n        newSelection.delete(ancestor);\n      }\n      for (const descendant of getDescendants(...range)) {\n        newSelection.delete(descendant);\n      }\n    }\n\n    onSelectionChange?.(newSelection);\n\n    if (!controlledSelection) {\n      table.update((state) => {\n        state.selection = newSelection;\n      });\n    }\n\n    table.update((state) => {\n      state.lastSelectedId = itemId;\n    });\n  }\n\n  return (\n    <Checkbox\n      css={{\n        justifySelf: 'start',\n        color: '#c9cfda',\n      }}\n      checked={isSelected}\n      onChange={toggle}\n    />\n  );\n}\n","import { ClassNames } from '@emotion/react';\nimport { memo, useLayoutEffect, useRef } from 'react';\nimport { useTheme } from '../hooks/useTheme';\nimport { calcClassNames, calcCss } from '../misc/calcClassNames';\nimport { cx, getAncestors } from '../misc/helpers';\nimport { ColumnContext, useTableContext } from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport type { Id } from '../types';\nimport { Cell } from './cell';\nimport { Details } from './details';\nimport { ExpandControl } from './expandControl';\nimport { SelectComponent } from './selectComponent';\n\nexport const Row = memo(function Row<T>({\n  itemId,\n  rowIndex,\n  rowHeightsKey,\n}: {\n  itemId: Id;\n  rowIndex: number;\n  rowHeightsKey: {};\n}): JSX.Element | null {\n  const table = useTableContext<T>();\n  const divRef = useRef<HTMLDivElement>(null);\n  const detailsDivRef = useRef<HTMLDivElement>(null);\n\n  const classes = useTheme((t) => t.classes);\n  const styles = useTheme((t) => t.styles);\n\n  const item = table.useState((state) => state.activeItemsById.get(itemId));\n  const wrapRow = table.useState((state) => state.props.wrapRow) ?? ((props) => <div {...props} />);\n  const rowClassName =\n    classes?.row instanceof Function ? classes.row(item?.value, rowIndex) : classes?.row;\n  const rowStyles =\n    styles?.row instanceof Function ? styles.row(item?.value, rowIndex) : styles?.row;\n  const subgrid = table.useState((state) => state.props.subgrid);\n\n  const {\n    cellClassName,\n    css_,\n    indent,\n    hasChildren,\n    hasDeferredChildren,\n    columnIds,\n    enableSelection,\n    rowAction,\n    hasDetails,\n  } = table.useState((state) => {\n    const item = state.activeItemsById.get(itemId);\n\n    return {\n      cellClassName: cx(...calcClassNames(classes, item?.value, rowIndex)),\n      css_: calcCss<T>(styles, item?.value, rowIndex),\n      indent: item ? getAncestors(state.activeItemsById, item).size : 0,\n      hasChildren: !!item?.children.length,\n      hasDeferredChildren: item && state.props.hasDeferredChildren?.(item.value),\n      columnIds: state.visibleColumns.map((column) => column.id),\n      enableSelection: state.props.enableSelection,\n      rowAction:\n        state.props.rowAction instanceof Function\n          ? item\n            ? state.props.rowAction(item.value, rowIndex)\n            : null\n          : state.props.rowAction,\n      hasDetails:\n        state.props.rowDetails instanceof Function\n          ? item\n            ? !!state.props.rowDetails(item.value, rowIndex)\n            : null\n          : !!state.props.rowDetails,\n    };\n  });\n\n  useLayoutEffect(() => {\n    function update() {\n      table.update((state) => {\n        if (!divRef.current) {\n          return;\n        }\n\n        const h1 = divRef.current.offsetHeight;\n        const h2 =\n          detailsDivRef.current && document.contains(detailsDivRef.current)\n            ? detailsDivRef.current.offsetHeight\n            : 0;\n\n        state.rowHeights.set(itemId, h1 + h2);\n      });\n    }\n\n    update();\n\n    const handles = [divRef.current, detailsDivRef.current]\n      .filter((x): x is HTMLDivElement => !!x)\n      .map((div) => {\n        const o = new ResizeObserver(update);\n        o.observe(div);\n        return () => o.disconnect();\n      });\n\n    return () => {\n      handles.forEach((h) => h());\n    };\n  }, [table, itemId, divRef.current, detailsDivRef.current, rowHeightsKey]);\n\n  useLayoutEffect(() => {\n    table.getState().props.debugRender?.('render row', itemId);\n  });\n\n  if (!item) {\n    return null;\n  }\n\n  return (\n    <ClassNames>\n      {({ css, cx }) => (\n        <>\n          {wrapRow(\n            {\n              className: cx(\n                css([\n                  subgrid\n                    ? {\n                        gridColumn: `1 / -1`,\n                        display: 'grid',\n                        gridTemplateColumns: 'subgrid',\n                      }\n                    : {\n                        display: 'contents',\n                      },\n                  rowStyles,\n                ]),\n                rowClassName,\n              ),\n\n              children: (\n                <>\n                  <div\n                    className={cellClassName}\n                    css={[defaultClasses.cellFill, css_]}\n                    ref={divRef}\n                  />\n\n                  <div\n                    className={cellClassName}\n                    css={[defaultClasses.cell, defaultClasses.firstCell, css_]}\n                  >\n                    {indent > 0 && <div css={{ width: indent * 20 }} />}\n\n                    {enableSelection && <SelectComponent itemId={itemId} />}\n\n                    {(hasChildren || hasDeferredChildren || hasDetails) && (\n                      <ExpandControl itemId={itemId} hasDeferredChildren={hasDeferredChildren} />\n                    )}\n\n                    {rowAction}\n                  </div>\n\n                  {columnIds.map((columnId) => (\n                    <ColumnContext.Provider key={columnId} value={columnId}>\n                      <Cell itemId={itemId} rowIndex={rowIndex} />\n                    </ColumnContext.Provider>\n                  ))}\n\n                  <div className={cellClassName} css={[defaultClasses.cellFill, css_]} />\n\n                  <Details ref={detailsDivRef} itemId={itemId} rowIndex={rowIndex} />\n                </>\n              ),\n            },\n            item.value,\n            rowIndex,\n          )}\n        </>\n      )}\n    </ClassNames>\n  );\n});\n","import type { HTMLProps, ReactNode } from 'react';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useTableContext } from '../misc/tableContext';\nimport { throttle } from '../misc/throttle';\nimport type { Id } from '../types';\n\nconst findScrollRoot = (x: HTMLElement): HTMLElement => {\n  const parent = x.parentElement;\n  if (!parent) return document.documentElement;\n  if (parent.scrollHeight > parent.clientHeight && getComputedStyle(parent).overflowY !== 'visible')\n    return parent;\n  return findScrollRoot(parent);\n};\n\nconst relativeOffset = (x: HTMLElement, y: HTMLElement): number => {\n  if (x.offsetParent === y.offsetParent || !x.offsetParent) return x.offsetTop - y.offsetTop;\n  if (x.offsetParent instanceof HTMLElement) return relativeOffset(x.offsetParent, y) + x.offsetTop;\n  return 0;\n};\n\nexport function Virtualized<T>({\n  header,\n  footer,\n  children,\n  ...props\n}: {\n  header: ReactNode;\n  footer: ReactNode;\n  children: (itemIds: Id[], startIndex: number) => ReactNode;\n} & Omit<HTMLProps<HTMLDivElement>, 'children'>): JSX.Element {\n  const table = useTableContext<T>();\n  const virtual = table.useState((state) => state.props.virtual);\n  const probeRef = useRef<HTMLDivElement>(null);\n  const [, setId] = useState({});\n\n  const {\n    itemIds = [],\n    from = 0,\n    to,\n    before = 0,\n    after = 0,\n  } = table.useState(\n    (state) => {\n      const itemIds = state.activeItems.map((item) => item.id);\n      const root = probeRef.current && findScrollRoot(probeRef.current);\n      if (!state.props.virtual) return { itemIds };\n      if (!probeRef.current || !root || !document.contains(root)) return {};\n\n      const {\n        rowHeight,\n        initalRowHeight,\n        overscan = 100,\n        overscanTop,\n        overscanBottom,\n      } = (state.props.virtual instanceof Object ? state.props.virtual : undefined) ?? {};\n\n      let totalHeight = 0;\n      const rowHeights = itemIds.map((itemId, index) => {\n        const h =\n          rowHeight ??\n          state.rowHeights.get(itemId) ??\n          initalRowHeight ??\n          (index === 0 ? 100 : totalHeight / index);\n        totalHeight += h;\n        return h;\n      });\n\n      const probeOffset = relativeOffset(probeRef.current, root);\n      const headerHeight = probeRef.current.offsetTop;\n      const topOfTable = root.scrollTop - probeOffset + headerHeight;\n      const bottomOfTable = topOfTable + root.clientHeight - headerHeight;\n\n      let from = 0;\n      let to = itemIds.length;\n      let before = 0;\n      let after = 0;\n      for (const h of rowHeights) {\n        if (before + h > topOfTable - (overscanTop ?? overscan)) break;\n        from++;\n        before += h;\n      }\n\n      for (const h of rowHeights.reverse()) {\n        if (after + h > totalHeight - bottomOfTable - (overscanBottom ?? overscan)) break;\n        to--;\n        after += h;\n      }\n\n      return { itemIds: itemIds.slice(from, to), from, to, before, after };\n    },\n    { throttle: 16 },\n  );\n\n  const throttleScroll = (typeof virtual === 'boolean' ? undefined : virtual)?.throttleScroll ?? 16;\n  const update = useMemo(() => throttle(() => setId({}), throttleScroll), [throttleScroll]);\n\n  useEffect(() => {\n    if (!virtual || !probeRef.current) return;\n\n    window.addEventListener('scroll', update, true);\n    window.addEventListener('resize', update, true);\n    return () => {\n      window.removeEventListener('scroll', update, true);\n      window.removeEventListener('resize', update, true);\n    };\n  }, [update, virtual]);\n\n  useEffect(() => update.cancel, [update]);\n\n  useLayoutEffect(() => {\n    table.getState().props.debugRender?.(`Virtualized render ${from} to ${to}`);\n  });\n\n  return (\n    <div {...props}>\n      {header}\n\n      {virtual && <div style={{ gridColumn: '1 / -1', height: before }} ref={probeRef} />}\n\n      {children(itemIds, from)}\n\n      {virtual && <div style={{ gridColumn: '1 / -1', height: after }} />}\n\n      {footer}\n    </div>\n  );\n}\n","import { forwardRef, memo, useEffect, useLayoutEffect, useState, type ForwardedRef } from 'react';\nimport { TableMemoContextProvider } from '../hooks/useTableMemo';\nimport useTableRef from '../hooks/useTableRef';\nimport { useTheme } from '../hooks/useTheme';\nimport { useTableStateStorage } from '../internalState/tableStateStorage';\nimport { useTableState } from '../internalState/useTableState';\nimport {\n  ColumnContext,\n  TableContext,\n  TableResetContext,\n  useTableContext,\n} from '../misc/tableContext';\nimport { defaultClasses } from '../theme/defaultTheme/defaultClasses';\nimport { useCssVariables } from '../theme/useCssVariables';\nimport type { TableProps, TableRef } from '../types';\nimport ClearFiltersButton from './clearFiltersButton';\nimport { ColumnFooter } from './columnFooter';\nimport { ColumnHeader, ColumnHeaderContext } from './columnHeader';\nimport { ColumnSelection } from './columnSelection';\nimport { Export } from './export';\nimport { ResizeHandleView } from './resizeHandle';\nimport { Row } from './row';\nimport { SelectComponent } from './selectComponent';\nimport { Virtualized } from './virtualized';\n\nexport const Table = forwardRef(_Table) as <T>(\n  props: TableProps<T> & { ref?: ForwardedRef<TableRef> },\n) => ReturnType<typeof _Table>;\n\nfunction _Table<T>(props: TableProps<T>, ref: ForwardedRef<TableRef>): JSX.Element {\n  const [table, resetState] = useTableState(props);\n  const [isHydrated, clearStorage] = useTableStateStorage(table);\n  useTableRef(table, ref);\n\n  async function reset() {\n    await clearStorage();\n    resetState();\n  }\n\n  useLayoutEffect(() => {\n    table.getState().props.debugRender?.('render table');\n  });\n\n  return (\n    <TableContext.Provider value={table}>\n      <TableResetContext.Provider value={reset}>\n        <TableMemoContextProvider>\n          <TableLoadingState isHydrated={isHydrated} />\n        </TableMemoContextProvider>\n      </TableResetContext.Provider>\n    </TableContext.Provider>\n  );\n}\n\nfunction TableLoadingState({ isHydrated }: { isHydrated: boolean }) {\n  const loadingText = useTheme((t) => t.text.loading);\n  const [showLoading, setShowLoading] = useState(false);\n\n  useEffect(() => {\n    const handle = setTimeout(() => setShowLoading(true), 500);\n    return () => clearTimeout(handle);\n  });\n\n  return (\n    <>\n      {!isHydrated && showLoading && <div>{loadingText}</div>}\n      <TableInner hidden={!isHydrated} />\n    </>\n  );\n}\n\nconst TableInner = memo(function TableInner<T>({ hidden }: { hidden: boolean }) {\n  const table = useTableContext<T>();\n  const fullWidth = table.useState((state) => state.props.fullWidth);\n\n  const visibleColumns = table.useState((state) =>\n    state.visibleColumns.map((column) => ({\n      id: column.id,\n      width: column.width,\n      classes: column.classes,\n      styles: column.styles,\n      footer: column.footer,\n    })),\n  );\n\n  const hasActiveFilters = table.useState((state) => {\n    return state.activeColumns.some((column) => {\n      const filter = state.filters.get(column.id);\n      const filterValue = state.filterValues.get(column.id);\n      return filter !== undefined && filterValue !== undefined && filter.isActive(filterValue);\n    });\n  });\n  const columnWidths = table.useState((state) => state.columnWidths, { throttle: 16 });\n  const hasFooter = table.useState((state) => state.activeColumns.some((column) => column.footer));\n\n  const classes = useTheme((theme) => theme.classes);\n  const styles = useTheme((theme) => theme.styles);\n  const stickyHeader = table.useState((state) => state.props.stickyHeader);\n  const stickyFooter = table.useState((state) => state.props.stickyFooter);\n\n  const enableSelection = table.useState((state) => state.props.enableSelection);\n  const enableColumnSelection = table.useState((state) => state.props.enableColumnSelection);\n  const enableExport = table.useState((state) => state.props.enableExport);\n  const cssVariables = useCssVariables();\n  const rowHeightsKey = table.useState((state) => state.rowHeightsKey);\n\n  const enableClearFiltersButton = table.useState((state) => state.props.enableClearFiltersButton);\n\n  useLayoutEffect(() => {\n    table.getState().props.debugRender?.('render table inner');\n  });\n\n  return (\n    <Virtualized\n      className={classes?.table}\n      css={[cssVariables, defaultClasses.table, styles?.table, hidden && { visibility: 'hidden' }]}\n      style={{\n        gridTemplateColumns: [\n          //\n          fullWidth === 'right' || fullWidth === true ? 'auto' : '0',\n          'max-content',\n          ...visibleColumns.map(\n            (column) => columnWidths.get(column.id) ?? column.width ?? 'max-content',\n          ),\n          fullWidth === 'left' || fullWidth === true ? 'auto' : '0',\n        ].join(' '),\n      }}\n      header={\n        <>\n          <div\n            className={classes?.headerCell}\n            css={[\n              { gridRow: 1, gridColumn: 1 },\n              defaultClasses.headerFill,\n              stickyHeader && defaultClasses.sticky,\n              stickyHeader instanceof Object && stickyHeader,\n              styles?.headerCell,\n            ]}\n          />\n\n          <div\n            className={classes?.headerCell}\n            css={[\n              { gridRow: 1, gridColumn: 2 },\n              defaultClasses.headerCell,\n              stickyHeader && defaultClasses.sticky,\n              stickyHeader instanceof Object && stickyHeader,\n              styles?.headerCell,\n            ]}\n          >\n            {enableSelection && <SelectComponent />}\n\n            {enableColumnSelection && <ColumnSelection />}\n\n            {enableExport && <Export />}\n\n            {(enableSelection || enableColumnSelection || enableExport) && (\n              <>\n                <div css={{ flex: 1 }} />\n                <ResizeHandleView />\n              </>\n            )}\n          </div>\n\n          <ColumnHeaderContext.Provider>\n            {visibleColumns.map((column, index) => (\n              <ColumnContext.Provider key={column.id} value={column.id}>\n                <ColumnHeader index={index} />\n              </ColumnContext.Provider>\n            ))}\n          </ColumnHeaderContext.Provider>\n\n          <div\n            className={classes?.headerCell}\n            css={[\n              { gridRow: 1, gridColumn: visibleColumns.length + 3 },\n              defaultClasses.headerFill,\n              stickyHeader && defaultClasses.sticky,\n              stickyHeader instanceof Object && stickyHeader,\n              styles?.headerCell,\n            ]}\n          />\n        </>\n      }\n      footer={\n        <>\n          {enableClearFiltersButton && hasActiveFilters && <ClearFiltersButton />}\n          {hasFooter && (\n            <>\n              <div\n                className={classes?.footerCell}\n                css={[\n                  { gridColumn: 1 },\n                  defaultClasses.footerFill,\n                  stickyFooter && defaultClasses.stickyBottom,\n                  stickyFooter instanceof Object && stickyFooter,\n                  styles?.footerCell,\n                ]}\n              />\n              <div\n                className={classes?.footerCell}\n                css={[\n                  defaultClasses.footerFill,\n                  stickyFooter && defaultClasses.stickyBottom,\n                  stickyFooter instanceof Object && stickyFooter,\n                  styles?.footerCell,\n                ]}\n              />\n\n              {visibleColumns.map((column) => (\n                <ColumnContext.Provider key={column.id} value={column.id}>\n                  <ColumnFooter />\n                </ColumnContext.Provider>\n              ))}\n\n              <div\n                className={classes?.footerCell}\n                css={[\n                  defaultClasses.footerFill,\n                  stickyFooter && defaultClasses.stickyBottom,\n                  stickyFooter instanceof Object && stickyFooter,\n                  styles?.footerCell,\n                ]}\n              />\n            </>\n          )}\n        </>\n      }\n    >\n      {(itemIds, startIndex) =>\n        itemIds.map((itemId, index) => (\n          <Row\n            key={itemId}\n            itemId={itemId}\n            rowIndex={startIndex + index}\n            rowHeightsKey={rowHeightsKey}\n          />\n        ))\n      }\n    </Virtualized>\n  );\n});\n","import { useFilter } from '../hooks/useFilter';\nimport { useTheme } from '../hooks/useTheme';\nimport { asStringOrArray } from '../misc/helpers';\nimport type { CommonFilterProps } from '../types';\nimport { AutoFocusTextField } from './autoFocusTextField';\n\nexport function substringCompare(itemValue: string, filterValue: string): boolean {\n  return itemValue.toLowerCase().includes(filterValue.toLowerCase());\n}\n\nexport function prefixCompare(itemValue: string, filterValue: string): boolean {\n  return itemValue.toLowerCase().includes(filterValue.toLowerCase());\n}\n\nexport function exactCompare(itemValue: string, filterValue: string): boolean {\n  return itemValue.toLowerCase() === filterValue.toLowerCase();\n}\n\nexport function TextFilter<TItem, TColumnValue>({\n  compare = substringCompare,\n  filterBy = asStringOrArray,\n  placeholder,\n  ...props\n}: {\n  /** Custom comparison function. Should return true if an item value matches the current filter value.\n   * By default a fuzzy text comparison is used.\n   */\n  compare?: (itemValue: string, filterValue: string) => boolean;\n  placeholder?: string;\n} & CommonFilterProps<TItem, TColumnValue, string, string>): JSX.Element {\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  const {\n    value = '',\n    onChange,\n    close,\n  } = useFilter({\n    ...props,\n    filterBy,\n\n    id: 'textFilter',\n\n    isActive(filterValue) {\n      return !!filterValue;\n    },\n\n    test(filterValue, value) {\n      return compare(value, filterValue);\n    },\n  });\n\n  return (\n    <div\n      css={{\n        padding: `calc(var(--spacing) * 2)`,\n        display: 'grid',\n      }}\n    >\n      <AutoFocusTextField\n        value={value}\n        onChange={(event) => onChange(event.target.value)}\n        onKeyUp={(event) => {\n          if (event.key === 'Enter') {\n            close();\n          }\n        }}\n        endIcon={\n          <IconButton onClick={() => onChange('')}>{!value ? <Search /> : <Clear />}</IconButton>\n        }\n        placeholder={placeholder}\n      />\n    </div>\n  );\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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"}