schummar-table 0.43.1 → 0.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/mui5Theme/index.tsx","../src/misc/tableSettings.tsx","../src/exporters/csvExporter.ts","../src/theme/defaultTheme/popover.tsx","../src/theme/defaultTheme/defaultClasses.ts","../node_modules/schummar-state/src/persist/persistPathHelpers.ts","../node_modules/schummar-state/src/persist/storePersist.ts","../node_modules/schummar-state/src/helpers/hash.ts","../node_modules/schummar-state/node_modules/fast-deep-equal/es6/react.js","../node_modules/schummar-state/src/helpers/stringSelector.ts","../node_modules/schummar-state/src/helpers/throttle.ts","../node_modules/schummar-state/src/store.ts","../node_modules/schummar-state/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","../node_modules/schummar-state/node_modules/use-sync-external-store/shim/index.js","../node_modules/schummar-state/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js","../node_modules/schummar-state/node_modules/use-sync-external-store/shim/with-selector.js","../node_modules/schummar-state/src/react/useStoreState.ts","../node_modules/schummar-state/src/react/useStoreProp.ts","../node_modules/schummar-state/src/react/store.ts","../node_modules/schummar-state/src/react/storeScope.tsx","../node_modules/schummar-state/src/react/useResource.ts","../src/theme/tableTheme.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Checkbox,\n CircularProgress,\n IconButton,\n TextField,\n useTheme,\n} from '@mui/material';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { TableSettingsProvider } from '../../misc/tableSettings';\nimport type { PartialTableTheme } from '../../types';\nimport { Popover } from '../defaultTheme/popover';\nimport { mergeThemes } from '../tableTheme';\n\nexport const mui5Theme: PartialTableTheme = {\n components: {\n Button: (props) => (\n <Button\n {...props}\n size=\"small\"\n fullWidth\n css={{ justifyContent: 'start !important' }}\n color={props.variant === 'contained' ? 'primary' : 'inherit'}\n />\n ),\n IconButton: (props) => (\n <IconButton {...props} size=\"small\" css={{ fontSize: '0.8em' }} color=\"inherit\" />\n ),\n Checkbox: (props) => <Checkbox {...props} color=\"primary\" size=\"small\" />,\n Popover,\n Badge,\n TextField: ({ startIcon, endIcon, ...props }) => (\n <TextField\n {...props}\n InputProps={{ startAdornment: startIcon, endAdornment: endIcon }}\n size=\"small\"\n />\n ),\n Spinner: (props) => <CircularProgress {...props} size={20} />,\n },\n};\n\nexport function Mui5TableThemeProvider({\n theme,\n children,\n}: {\n theme?: PartialTableTheme;\n children: ReactNode;\n}) {\n const muiTheme = useTheme();\n\n const _theme = useMemo(() => {\n return mergeThemes(\n {\n colors: {\n primary: muiTheme.palette.primary,\n secondary: muiTheme.palette.secondary,\n background: muiTheme.palette.background.default,\n text: muiTheme.palette.text.primary,\n border: muiTheme.palette.divider,\n borderLight: muiTheme.palette.divider,\n },\n },\n mui5Theme,\n theme ?? {},\n );\n }, [muiTheme, theme]);\n\n return <TableSettingsProvider theme={_theme}>{children}</TableSettingsProvider>;\n}\n","import { ReactNode, createContext, useContext } from 'react';\nimport CsvExporter from '../exporters/csvExporter';\nimport { ExporterEntry } from '../exporters/exporter';\nimport { PartialTableTheme } from '../types';\n\nexport interface TableSettingsContextType {\n theme: PartialTableTheme;\n exporters: ExporterEntry[];\n}\n\nexport const TableSettingsContext = createContext<TableSettingsContextType>({\n theme: {},\n exporters: [\n { action: 'copy', exporter: new CsvExporter() },\n { action: 'download', exporter: new CsvExporter() },\n ],\n});\n\nexport function TableSettingsProvider({\n theme,\n exporters,\n additionalExporters,\n children,\n}: Partial<TableSettingsContextType> & {\n additionalExporters?: ExporterEntry[];\n children?: ReactNode;\n}) {\n const inherited = useContext(TableSettingsContext);\n theme ??= inherited.theme;\n exporters ??= inherited.exporters;\n\n if (additionalExporters) {\n exporters = [...exporters, ...additionalExporters];\n }\n\n return (\n <TableSettingsContext.Provider\n value={{\n theme,\n exporters,\n }}\n >\n {children}\n </TableSettingsContext.Provider>\n );\n}\n","import { BlobExporter, StringExporter } from './exporter';\n\nexport interface CsvExporterOptions {\n sepPrefix?: boolean;\n separator?: string;\n quote?: string;\n eol?: string;\n}\n\nexport default class CsvExporter implements StringExporter, BlobExporter {\n readonly type = 'csv';\n readonly fileEnding = 'csv';\n\n constructor(public readonly options: CsvExporterOptions = {}) {}\n\n exportToString(\n columns: (string | number | Date)[],\n rows: (string | number | Date)[][],\n options = this.options,\n ): string {\n const { sepPrefix, separator = '\\t', quote = '\"', eol = '\\n' } = options;\n\n const cells = [columns, ...rows].map((line) =>\n line.map((value) => {\n let stringValue: string;\n if (typeof value === 'number') {\n stringValue = String(value);\n } else if (value instanceof Date) {\n stringValue = value.toISOString();\n } else {\n stringValue = value;\n }\n\n if (![separator, quote, eol].some((c) => stringValue.includes(c))) {\n return value;\n }\n\n const clean = stringValue.replace(new RegExp(quote, 'g'), `${quote}${quote}`);\n return `${quote}${clean}${quote}`;\n }),\n );\n\n return (\n (sepPrefix ? `SEP=${separator}\\n` : '') + cells.map((line) => line.join(separator)).join(eol)\n );\n }\n\n exportToBlob(columns: (string | number | Date)[], rows: (string | number | Date)[][]): Blob {\n const data = this.exportToString(columns, rows, {\n ...this.options,\n sepPrefix: this.options.sepPrefix ?? true,\n });\n return new Blob([data], { type: 'text/csv' });\n }\n}\n","import { useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { TableTheme } from '../../types';\nimport { defaultClasses } from './defaultClasses';\n\nconst MARGIN = 10;\nconst MAX_OFFSET = 20;\n\nexport const Popover: TableTheme['components']['Popover'] = ({\n anchorEl,\n open,\n hidden,\n onClose,\n children,\n className,\n backdropClassName,\n align,\n}) => {\n const popper = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ left: number; top: number }>();\n const [maxHeight, setMaxHeight] = useState(document.documentElement.clientHeight - 2 * MARGIN);\n const [zIndex, setZIndex] = useState(1);\n\n useLayoutEffect(() => {\n if (!anchorEl || !open) {\n setPosition(undefined);\n return;\n }\n\n let last: { left: number; top: number } | undefined;\n\n function check() {\n if (!anchorEl) return;\n const {\n left: anchorLeft,\n bottom: anchorBottom,\n width: anchorWidth,\n } = anchorEl.getBoundingClientRect();\n const { width: popperWidth = 0 } = popper.current?.getBoundingClientRect() ?? {};\n const viewportWidth = document.documentElement.clientWidth;\n const viewportHeight = document.documentElement.clientHeight;\n\n const next = {\n left:\n align === 'center'\n ? anchorLeft + anchorWidth / 2 - popperWidth / 2\n : anchorLeft -\n Math.min(popperWidth ? popperWidth / 2 : Number.POSITIVE_INFINITY, MAX_OFFSET),\n top: anchorBottom,\n };\n\n if (next.left < MARGIN) {\n next.left = MARGIN;\n }\n if (next.left + popperWidth > viewportWidth - MARGIN) {\n next.left = viewportWidth - MARGIN - popperWidth;\n }\n if (next.top < MARGIN) {\n next.top = MARGIN;\n }\n\n if (next.left !== last?.left || next.top !== last?.top) {\n setPosition(next);\n }\n\n setMaxHeight(viewportHeight - MARGIN - next.top);\n\n last = next;\n }\n check();\n\n const handle = setInterval(check, 16);\n return () => {\n clearInterval(handle);\n };\n }, [anchorEl, open, align]);\n\n function updateZIndex(div: HTMLDivElement | null) {\n const ancestors = [];\n for (let node = div?.parentElement; node; node = node.parentElement) {\n ancestors.push(node);\n }\n\n for (const node of ancestors.reverse()) {\n const value = document.defaultView?.getComputedStyle(node).getPropertyValue('z-index');\n\n if (value && !Number.isNaN(Number(value))) {\n setZIndex(Number(value) + 1);\n return;\n }\n }\n }\n\n if (!open) return null;\n\n return (\n <>\n <div\n ref={updateZIndex}\n css={{\n display: 'none',\n }}\n />\n\n {createPortal(\n <>\n <div\n className={backdropClassName}\n css={[\n {\n position: 'fixed',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n zIndex,\n },\n hidden && { display: 'none' },\n ]}\n onClick={() => onClose()}\n />\n\n <div\n ref={popper}\n className={className}\n css={[\n defaultClasses.card,\n {\n position: 'fixed',\n maxWidth: document.documentElement.clientWidth - 2 * MARGIN,\n maxHeight,\n ...position,\n zIndex: zIndex + 1,\n overflowY: 'auto',\n color: 'var(--table-text-color)',\n },\n hidden && { display: 'none' },\n !position && { visibility: 'hidden' },\n ]}\n >\n {children}\n </div>\n </>,\n document.body,\n )}\n </>\n );\n};\n","import { css } from '@emotion/react';\n\nconst cell = css({\n display: 'flex',\n alignItems: 'center',\n borderBottom: '1px solid var(--table-border-light-color)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n\n '&:not(:empty)': {\n padding: `calc(var(--spacing) * 0.1) calc(2 * var(--spacing))`,\n },\n});\n\nexport const defaultClasses = {\n table: css({\n position: 'relative',\n display: 'grid',\n color: 'var(--table-text-color)',\n }),\n\n cell,\n\n cellFill: css({\n borderBottom: '1px solid var(--table-border-light-color)',\n }),\n\n headerCell: css(cell, {\n borderBottom: '1px solid var(--table-border-color)',\n background: 'var(--table-background-color)',\n\n '&:not(:empty)': {\n padding: `var(--spacing) 0 var(--spacing) calc(2 * var(--spacing))`,\n },\n }),\n\n footerCell: css(cell, {\n padding: `var(--spacing) calc(2 * var(--spacing))`,\n borderTop: '1px solid var(--table-border-color)',\n borderBottom: 'none',\n background: 'var(--table-background-color)',\n }),\n\n firstCell: css({\n justifyContent: 'start',\n }),\n\n sticky: css({\n position: 'sticky',\n top: 0,\n zIndex: 2,\n }),\n\n stickyBottom: css({\n position: 'sticky',\n bottom: 0,\n zIndex: 2,\n }),\n\n headerFill: css({\n borderBottom: '1px solid var(--table-border-color)',\n background: 'var(--table-background-color)',\n }),\n\n footerFill: css({\n borderTop: '1px solid var(--table-border-color)',\n background: 'var(--table-background-color)',\n }),\n\n text: css({\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n\n card: css({\n borderRadius: 4,\n boxShadow: '0px 3px 14px 2px rgb(0 0 0 / 12%)',\n background: 'var(--table-background-color)',\n }),\n\n clearFiltersButton: css({\n padding: `0 calc(2 * var(--spacing))`,\n fontWeight: 'bold',\n position: 'sticky',\n left: 0,\n maxWidth: 'fit-content',\n gridColumn: '2/-1',\n button: {\n color: 'var(--primaryMain) !important',\n border: 'solid 1px',\n borderColor: 'var(--primaryMain) !important',\n margin: 'var(--spacing)',\n },\n }),\n\n details: css(cell, {\n gridColumn: '1 / -1',\n whiteSpace: 'normal',\n }),\n};\n","export type Path = (string | number)[];\n\nexport const isAncestor = (ancestor: Path, path: Path): boolean => {\n return ancestor.length <= path.length && ancestor.every((v, i) => v === '*' || path[i] === '*' || String(v) === String(path[i]));\n};\n\nexport const get = (value: unknown, path: Path): unknown => {\n for (const part of path) {\n if (value instanceof Object && part in value) value = value[part as keyof typeof value];\n else {\n value = undefined;\n break;\n }\n }\n return value;\n};\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport const split = (value: any, path: Path): [value: unknown, subValues: { path: Path; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*') return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: Path; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!(newValue[key] instanceof Object)) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import { Patch } from 'immer';\nimport { Store } from '../store';\nimport { get, isAncestor, Path, split } from './persistPathHelpers';\nimport { PersistPaths } from './persistPaths';\nimport { StorePersistStorage } from './persistStorage';\n\nexport class StorePersist<T> {\n private replayPatches = new Array<Patch>();\n isInitialized = false;\n whenInitialized = this.load();\n private isStopped = false;\n private sub?: () => void;\n private saveQueue = new Array<{ path: Path; t: number }>();\n private isSaving = false;\n private saveTimeout?: ReturnType<typeof setTimeout>;\n private paths: { path: Path; throttleMs?: number }[];\n\n constructor(\n public readonly store: Store<T>,\n public readonly storage: StorePersistStorage,\n public readonly options: {\n paths?: (PersistPaths<T> | { path: PersistPaths<T>; throttleMs?: number })[];\n throttleMs?: number;\n log?: (...args: any[]) => void;\n } = {}\n ) {\n if (!options.paths) {\n this.paths = [{ path: [], throttleMs: options.throttleMs }];\n } else {\n this.paths = options.paths.map((p) => ({\n path: (typeof p === 'object' ? p.path : p).split('.'),\n throttleMs: (typeof p === 'object' ? p.throttleMs : undefined) ?? options.throttleMs,\n }));\n }\n\n this.paths.sort((a, b) => b.path.length - a.path.length);\n this.watch();\n }\n\n private async load() {\n try {\n const storage = this.storage;\n\n let keys;\n if ('keys' in storage) {\n keys = await storage.keys();\n } else {\n const length = storage.length instanceof Function ? await storage.length() : storage.length;\n keys = new Array<string>();\n for (let i = 0; i < length; i++) {\n const key = await storage.key(i);\n if (key !== null) keys.push(key);\n }\n }\n keys.sort((a, b) => a.length - b.length);\n\n const patches = new Array<Patch & { persist: StorePersist<T> }>();\n for (const key of keys) {\n const value = await storage.getItem(key);\n if (value) {\n patches.push({\n path: key.split('.'),\n op: 'replace',\n value: value === 'undefined' ? undefined : JSON.parse(value),\n persist: this,\n });\n }\n }\n\n if (this.isStopped) {\n return false;\n }\n\n if (patches.length > 0) {\n this.store.applyPatches(patches);\n }\n\n this.isInitialized = true;\n if (this.replayPatches.length > 0) {\n this.store.applyPatches(this.replayPatches);\n this.replayPatches = [];\n }\n\n return true;\n } catch (e) {\n (this.options.log ?? console.error)('Failed to load storePersist:', e);\n return false;\n }\n }\n\n private watch() {\n this.sub = this.store.subscribePatches((patches) => {\n for (const patch of patches) {\n if ((patch as any).persist === this) {\n continue;\n } else if (this.isInitialized === true) {\n this.addToSaveQueue(patch.path);\n } else {\n this.replayPatches.push(patch);\n }\n }\n });\n }\n\n private addToSaveQueue(path: Path) {\n const match = this.paths.find((p) => isAncestor(p.path, path));\n if (!match) return;\n\n path = path.slice(0, match.path.length);\n const t = Date.now() + (match.throttleMs ?? 0);\n\n if (this.saveQueue.some((i) => i.t <= t && isAncestor(i.path, path))) return;\n this.saveQueue.push({ path, t });\n this.saveQueue.sort((a, b) => a.t - b.t);\n this.run();\n }\n\n private async run() {\n if (this.saveTimeout) clearTimeout(this.saveTimeout);\n const next = this.saveQueue[0];\n\n if (!next) return;\n if (next.t > Date.now()) {\n this.saveTimeout = setTimeout(() => this.run(), next.t - Date.now());\n return;\n }\n\n try {\n this.isSaving = true;\n this.saveQueue.shift();\n await this.save(next.path);\n } finally {\n this.isSaving = false;\n this.run();\n }\n }\n\n private async save(path: Path) {\n const { store, storage } = this;\n let value = get(store.getState(), path);\n\n const subPaths = this.paths\n .filter((p) => isAncestor(path, p.path) && p.path.length > path.length)\n .map((p) => p.path.slice(path.length));\n\n const subValues = new Array<{ path: Path; value: unknown }>();\n for (const subPath of subPaths) {\n const result = split(value, subPath);\n value = result[0];\n subValues.push(...result[1].map((s) => ({ path: [...path, ...s.path], value: s.value })));\n }\n\n const result = storage.setItem(path.join('.'), JSON.stringify(value) ?? 'undefined');\n if (result instanceof Promise) await result;\n for (const { path, value } of subValues) {\n const result = storage.setItem(path.join('.'), JSON.stringify(value) ?? 'undefined');\n if (result instanceof Promise) await result;\n }\n }\n\n stop(): void {\n this.isStopped = true;\n this.sub?.();\n }\n}\n","export function hash(arg: unknown): string {\n return JSON.stringify({ arg }, (_key, value) => {\n if (value instanceof Object && !(value instanceof Array)) {\n const obj: any = {};\n for (const key of Object.keys(value).sort()) {\n obj[key] = value[key as keyof typeof value];\n }\n return obj;\n }\n return value;\n });\n}\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n if ((a instanceof Map) && (b instanceof Map)) {\n if (a.size !== b.size) return false;\n for (i of a.entries())\n if (!b.has(i[0])) return false;\n for (i of a.entries())\n if (!equal(i[1], b.get(i[0]))) return false;\n return true;\n }\n\n if ((a instanceof Set) && (b instanceof Set)) {\n if (a.size !== b.size) return false;\n for (i of a.entries())\n if (!b.has(i[0])) return false;\n return true;\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (a[i] !== b[i]) return false;\n return true;\n }\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (key === '_owner' && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner.\n // _owner contains circular references\n // and is not needed when comparing the actual elements (and not their owners)\n continue;\n }\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","type FilterString<T> = T extends string ? T : never;\n\nexport declare type SelectorPaths<T> = FilterString<\n keyof {\n [K in keyof NonNullable<T> as\n | K\n | (0 extends 1 & NonNullable<T>[K]\n ? `${FilterString<K>}.${any}`\n : NonNullable<NonNullable<T>[K]> extends Record<string, unknown>\n ? `${FilterString<K>}.${SelectorPaths<NonNullable<T>[K]>}`\n : never)]: 1;\n }\n>;\n\ntype Value<T, K> = K extends keyof T ? T[K] : K extends keyof NonNullable<T> ? NonNullable<T>[K] | undefined : undefined;\n\nexport type SelectorValue<T, K> = K extends `${infer K}.${infer Rest}` ? SelectorValue<Value<T, K>, Rest> : Value<T, K>;\n\nexport function createSelector<T, S>(stringSelector: string): (state: T) => S {\n const parts = stringSelector.split('.');\n return (state) => parts.reduce<any>((v, p) => (v instanceof Object && p in v ? v[p as keyof typeof v] : undefined), state);\n}\n\nexport function setWithSelector(state: unknown, stringSelector: string, value: unknown): void {\n const parts = stringSelector.split('.');\n const prefix = parts.slice(0, -1);\n const last = parts[parts.length - 1]!;\n\n for (const part of prefix) {\n if (state instanceof Object && part in state) {\n state = state[part as keyof typeof state];\n } else {\n throw Error(`Could not set ${stringSelector} because path ${stringSelector} doesn't exist`);\n }\n }\n\n if (state instanceof Object) {\n state[last as keyof typeof state] = value as any;\n } else {\n throw Error(`Could not set ${stringSelector} because path ${stringSelector} doesn't exist`);\n }\n}\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): (...args: Args) => void {\n let last = 0;\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n last = Date.now();\n lastArgs = undefined;\n timeout = undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(...args!);\n }\n\n return function (...args: Args) {\n const now = Date.now();\n lastArgs = args;\n\n if (timeout) {\n // do nothing\n } else if (now < last + ms) {\n timeout = setTimeout(run, last + ms - now);\n } else {\n run();\n }\n };\n}\n","import eq from 'fast-deep-equal/es6/react';\nimport { applyPatches, Draft, enableMapSet, enablePatches, freeze, Patch, produce } from 'immer';\nimport { Cancel } from './helpers/misc';\nimport { createSelector, SelectorPaths, SelectorValue } from './helpers/stringSelector';\nimport { throttle as throttleFn } from './helpers/throttle';\n\nexport type StoreOptions = {\n /** Log errors. Default: console.error */\n log?: (...data: any[]) => void;\n};\n\nexport type StoreSubscribeOptions = {\n /** Invoke callback immediately with the current value? Default: true */\n runNow?: boolean;\n /** Throttle invocations of callback. */\n throttle?: number;\n /** Comparison function to determine if the data has changed. Default: fast-deep-equal */\n compare?: (a: any, b: any) => boolean;\n};\n\nexport type StoreAddReactionOptions = {\n /** Invoke callback immediately with the current value? Default: true */\n runNow?: boolean;\n /** Comparison function to determine if the data has changed. Default: fast-deep-equal */\n compare?: (a: any, b: any) => boolean;\n};\n\nconst RESTART_UPDATE = Symbol('RESTART_UPDATE');\n\nexport class Store<T> {\n private subscriptions = new Set<(state: T, patches: Patch[]) => void>();\n private batchCounter = 0;\n private reactions = new Set<() => void>();\n private patches = new Array<Patch>();\n private lock?: 'reaction';\n private options;\n\n constructor(private state: T, { log = (...data: any[]) => console.error(...data) }: StoreOptions = {}) {\n freeze(state, true);\n enableMapSet();\n enablePatches();\n\n this.options = {\n log,\n };\n }\n\n getState(): T {\n return this.state;\n }\n\n update(update: (draft: Draft<T>, original: T) => Draft<T> | void | undefined): void {\n this.checkLock();\n\n this.state = produce(\n this.state,\n (draft) => update(draft, this.state),\n (patches) => this.patches.push(...patches)\n );\n\n this.notify();\n }\n\n set(state: T): void {\n this.checkLock();\n\n this.state = produce(\n this.state,\n () => state,\n (patches) => this.patches.push(...patches)\n ) as T;\n\n this.notify();\n }\n\n applyPatches(patches: Patch[]): void {\n this.checkLock();\n\n this.state = applyPatches(this.state, patches);\n this.patches.push(...patches);\n\n this.notify();\n }\n\n batchUpdates(fn: () => void): void {\n try {\n this.batchCounter++;\n fn();\n } finally {\n this.batchCounter--;\n if (this.batchCounter === 0) {\n this.notify();\n }\n }\n }\n\n subscribe(listener: (value: T, prev: T, state: T) => void, options?: StoreSubscribeOptions): Cancel;\n subscribe<S>(selector: (state: T) => S, listener: (value: S, prev: S, state: T) => void, options?: StoreSubscribeOptions): Cancel;\n subscribe<K extends SelectorPaths<T>>(\n selector: K,\n listener: (value: SelectorValue<T, K>, prev: SelectorValue<T, K>, state: T) => void,\n options?: StoreSubscribeOptions\n ): Cancel;\n subscribe<S>(...args: any[]): Cancel {\n let selector: (state: T) => S, listener: (value: S, prev: S, state: T) => void, options: StoreSubscribeOptions | undefined;\n\n if (args[1] instanceof Function) {\n [selector, listener, options] = args;\n if (typeof selector === 'string') {\n selector = createSelector<T, S>(selector);\n }\n } else {\n [selector, listener, options] = [(x) => x as any, ...args];\n }\n\n const { runNow = true, throttle = 0, compare = eq } = options ?? {};\n const throttledListener = throttle ? throttleFn(listener, throttle) : listener;\n\n let value = selector(this.state);\n\n const internalListener = (state: T, _patches: Patch[], init?: boolean) => {\n try {\n const oldValue = value;\n value = selector(state);\n if (!init && compare(value, oldValue)) return;\n (init ? listener : throttledListener)(value, oldValue, this.state);\n } catch (e) {\n this.options.log('Failed to execute listener:', e);\n }\n };\n\n this.subscriptions.add(internalListener);\n if (runNow) internalListener(this.state, [], true);\n return () => {\n this.subscriptions.delete(internalListener);\n };\n }\n\n addReaction(reaction: (value: T, draft: Draft<T>, original: T, prev: T) => void, options?: StoreAddReactionOptions): Cancel;\n addReaction<S>(\n selector: (state: T) => S,\n reaction: (value: S, draft: Draft<T>, original: T, prev: S) => void,\n options?: StoreAddReactionOptions\n ): Cancel;\n addReaction<K extends SelectorPaths<T>>(\n selector: K,\n reaction: (value: SelectorValue<T, K>, draft: Draft<T>, original: T, prev: SelectorValue<T, K>) => void,\n options?: StoreAddReactionOptions\n ): Cancel;\n addReaction<S>(...args: any[]): Cancel {\n let selector: (state: T) => S,\n reaction: (value: S, draft: Draft<T>, original: T, prev: S) => void,\n options: StoreAddReactionOptions | undefined;\n\n if (args[1] instanceof Function) {\n [selector, reaction, options] = args;\n if (typeof selector === 'string') {\n selector = createSelector<T, S>(selector);\n }\n } else {\n [selector, reaction, options] = [(x) => x as any, ...args];\n }\n const { runNow = true, compare = eq } = options ?? {};\n\n let value = selector(this.state);\n\n const internalListener = (init?: boolean) => {\n let hasChanged = false;\n\n try {\n this.lock = 'reaction';\n const oldValue = value;\n value = selector(this.state);\n if (!init && compare(value, oldValue)) return;\n\n this.state = produce(\n this.state,\n (draft) => reaction(value, draft, this.state, oldValue),\n (patches) => {\n hasChanged = true;\n this.patches.push(...patches);\n }\n );\n } catch (e) {\n this.options.log('Failed to execute reaction:', e);\n } finally {\n delete this.lock;\n }\n\n if (hasChanged && !init) throw RESTART_UPDATE;\n if (hasChanged && init) this.notify();\n };\n\n this.reactions.add(internalListener);\n if (runNow) internalListener(true);\n return () => {\n this.reactions.delete(internalListener);\n };\n }\n\n subscribePatches(listener: (patches: Patch[]) => void): Cancel {\n const internalListener = (_state: T, patches: Patch[]) => {\n try {\n listener(patches);\n } catch (e) {\n this.options.log('Failed to execute patch listener:', e);\n }\n };\n\n this.subscriptions.add(internalListener);\n return () => {\n this.subscriptions.delete(internalListener);\n };\n }\n\n private checkLock() {\n if (this.lock === 'reaction') {\n throw Error('You cannot call update from within a reaction. Use the passed draft instead.');\n }\n }\n\n private notify(): void {\n if (this.batchCounter > 0 || this.patches.length === 0) return;\n\n try {\n for (const reaction of this.reactions) {\n reaction();\n }\n } catch (e) {\n return this.notify();\n }\n\n const patches = this.patches;\n this.patches = [];\n\n this.batchUpdates(() => {\n for (const subscription of this.subscriptions) {\n subscription(this.state, patches);\n }\n });\n }\n}\n","/** @license React vundefined\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var e=require(\"react\");function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c})},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c})})},[a]);p(d);return d}\nfunction r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return!k(a,d)}catch(f){return!0}}function t(a,b){return b()}var u=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t:q;exports.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/** @license React vundefined\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var h=require(\"react\"),n=require(\"use-sync-external-store/shim\");function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q=\"function\"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;\nexports.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return[function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);\nu(function(){f.hasValue=!0;f.value=d},[d]);w(d);return d};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import eq from 'fast-deep-equal/es6/react';\nimport { useCallback, useDebugValue } from 'react';\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector';\nimport { StoreSubscribeOptions } from '..';\nimport { createSelector, SelectorPaths, SelectorValue } from '../helpers/stringSelector';\nimport { Store } from './store';\n\nexport type UseStoreStateOptions = Omit<StoreSubscribeOptions, 'runNow'>;\n\nexport function useStoreState<T>(store: Store<T>, options?: UseStoreStateOptions): T;\nexport function useStoreState<T, S>(store: Store<T>, selector: (state: T) => S, options?: UseStoreStateOptions): S;\nexport function useStoreState<T, K extends SelectorPaths<T>>(\n store: Store<T>,\n selector: K,\n options?: UseStoreStateOptions\n): SelectorValue<T, K>;\nexport function useStoreState<T, S>(store: Store<T>, ...args: any[]): S {\n let selector: (state: T) => S, options: UseStoreStateOptions;\n\n if (args[0] instanceof Function) {\n selector = args[0];\n options = args[1] ?? {};\n } else if (typeof args[0] === 'string') {\n selector = createSelector(args[0]);\n options = args[1] ?? {};\n } else {\n selector = (x) => x as any;\n options = args[0] ?? {};\n }\n\n const subscribe = useCallback(\n (listener: () => void) => {\n return store.subscribe((x) => x, listener, {\n throttle: options.throttle,\n runNow: false,\n compare: (a, b) => a === b,\n });\n },\n [store, options.throttle]\n );\n\n const getSnapshot = useCallback(() => store.getState(), [store]);\n\n const value = useSyncExternalStoreWithSelector(\n //\n subscribe,\n getSnapshot,\n getSnapshot,\n selector,\n options.compare ?? eq\n );\n\n useDebugValue(value);\n return value;\n}\n","import { SelectorPaths, SelectorValue, setWithSelector } from '../helpers/stringSelector';\nimport { Store } from './store';\nimport { useStoreState } from './useStoreState';\n\nexport type UseStorePropResult<T, K extends SelectorPaths<T>> = [value: SelectorValue<T, K>, update: (value: SelectorValue<T, K>) => void];\n\nexport function useStoreProp<T, K extends SelectorPaths<T>>(store: Store<T>, selector: K): UseStorePropResult<T, K> {\n const value = useStoreState(store, selector);\n const update = (value: SelectorValue<T, K>) => store.update((state) => setWithSelector(state, selector, value));\n\n return [value, update];\n}\n","import { Store as BaseStore } from '../store';\nimport { SelectorPaths, SelectorValue } from '../helpers/stringSelector';\nimport { useStoreProp, UseStorePropResult } from './useStoreProp';\nimport { useStoreState, UseStoreStateOptions } from './useStoreState';\n\nexport class Store<T> extends BaseStore<T> {\n useState(options?: { throttle?: number }): T;\n useState<S>(selector: (state: T) => S, options?: UseStoreStateOptions): S;\n useState<K extends SelectorPaths<T>>(selector: K, options?: UseStoreStateOptions): SelectorValue<T, K>;\n useState(...args: any[]): any {\n return useStoreState(this, ...args);\n }\n\n useProp<K extends SelectorPaths<T>>(selector: K): UseStorePropResult<T, K> {\n return useStoreProp(this, selector);\n }\n}\n","import React, { Context, createContext, ReactNode, useContext, useMemo } from 'react';\nimport { SelectorPaths, SelectorValue } from '../helpers/stringSelector';\nimport { Store } from './store';\nimport { useStoreProp, UseStorePropResult } from './useStoreProp';\nimport { useStoreState, UseStoreStateOptions } from './useStoreState';\n\nexport class StoreScope<T> {\n readonly context: Context<Store<T>>;\n\n constructor(public readonly defaultValue: T) {\n this.context = createContext(new Store(defaultValue));\n }\n\n Provider = ({ children, store }: { children: ReactNode; store?: Store<T> }): JSX.Element => {\n const _store = useMemo(() => store ?? new Store(this.defaultValue), [store]);\n\n return <this.context.Provider value={_store}>{children}</this.context.Provider>;\n };\n\n withScope = <Args extends Record<string, unknown>>(Component: (args: Args) => JSX.Element) => {\n return (args: Args): JSX.Element => (\n <this.Provider>\n <Component {...args} />\n </this.Provider>\n );\n };\n\n useStore(): Store<T> {\n return useContext(this.context);\n }\n\n useState(options?: { throttle?: number }): T;\n useState<S>(selector: (state: T) => S, dependencies?: any[], options?: { throttle?: number }): S;\n useState<K extends SelectorPaths<T>>(selector: K, options?: UseStoreStateOptions): SelectorValue<T, K>;\n useState(...args: any[]): any {\n const store = this.useStore();\n return useStoreState(store, ...args);\n }\n\n useProp<K extends SelectorPaths<T>>(selector: K): UseStorePropResult<T, K> {\n const store = this.useStore();\n return useStoreProp(store, selector);\n }\n}\n","import eq from 'fast-deep-equal/es6/react';\nimport { useCallback, useDebugValue, useEffect } from 'react';\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector';\nimport { ResourceInfo, ResourceInstance, ResourceSubscribeOptions } from '..';\nimport { hash } from '../helpers/hash';\n\nexport type UseResource<Value> = Pick<ResourceInstance<unknown, Value>, 'id' | 'invalidateCache' | 'subscribe' | 'getCache' | 'get'>;\n\nexport type UseResourceOptions = Omit<ResourceSubscribeOptions, 'runNow'> & {\n /** Invalidate the resource on mount, causing it to update in the background */\n updateOnMount?: boolean;\n /** Don't subscribe resource while this is true */\n dormant?: boolean;\n};\n\n/** Subscribe to a resource. This will immediately return cached values, if available, and update for future updates.\n * @param resource the resource to subscribe to.\n * @param options options\n */\nexport function useResource<Value>(resource: UseResource<Value>, options?: UseResourceOptions): ResourceInfo<Value> {\n const { compare, dormant, throttle, updateOnMount, watchOnly } = options ?? {};\n\n useEffect(() => {\n if (updateOnMount && !dormant) {\n resource.invalidateCache();\n }\n }, []);\n\n const subscribe = useCallback(\n (listener: () => void) => {\n if (dormant)\n return () => {\n // nothing to do\n };\n\n return resource.subscribe(listener, {\n watchOnly,\n throttle,\n runNow: false,\n compare,\n });\n },\n [resource.id, watchOnly, dormant, throttle]\n );\n\n const getSnapshot = useCallback(() => resource.getCache(), [resource.id]);\n\n let value = useSyncExternalStoreWithSelector(\n //\n subscribe,\n getSnapshot,\n getSnapshot,\n (x) => x,\n eq\n );\n\n if (dormant) {\n value = { state: 'empty', isLoading: false };\n }\n\n useDebugValue(value);\n return value;\n}\n\n/** Subscribe to a resource. This will immediately return cached values, if available, and update for future updates. While waiting for data, it throws so that the Component will be suspended. If there is an error, it throws.\n * @param resource the resource to subscribe to.\n * @param options options\n */\nexport function useReadResource<Value>(resource: UseResource<Value>, options?: UseResourceOptions): Value {\n const info = useResource(resource, options);\n\n if (info.state === 'error') {\n throw info.error;\n }\n\n if (info.state === 'empty') {\n throw resource.get();\n }\n\n useDebugValue(info.value);\n return info.value;\n}\n\nexport type CombineValues<T> = T extends [UseResource<infer Value>]\n ? [Value]\n : T extends [UseResource<infer Value>, ...infer Rest]\n ? [Value, ...CombineValues<Rest>]\n : T extends readonly UseResource<infer Value>[]\n ? Value[]\n : any[];\n\n/** Combine multiple resources into one that can be fed into useResource or useReadResource. Return value will be an array of the combined resources' values.\n * @param resources resources to be combined\n */\nexport function combineResources<Resources extends readonly UseResource<any>[]>(\n ...resources: Resources\n): UseResource<CombineValues<Resources>> {\n return {\n id: hash(resources.map((resource) => resource.id)),\n\n invalidateCache() {\n for (const resource of resources) {\n resource.invalidateCache();\n }\n },\n\n subscribe(listener, options) {\n const handles = resources.map((resource) => resource.subscribe(listener, options));\n\n return () => {\n for (const handle of handles) {\n handle();\n }\n };\n },\n\n getCache() {\n const caches = resources.map((resource) => resource.getCache());\n const isStale = caches.some((cache) => cache.isStale);\n const isLoading = caches.some((cache) => cache.isLoading);\n\n if (caches.some((resource) => resource.state === 'error')) {\n const error = caches.find((cache) => cache.error !== undefined)?.error;\n return { state: 'error', error, isStale, isLoading };\n }\n\n if (caches.every((resource) => resource.state === 'value')) {\n const value = caches.map((cache) => cache.value) as CombineValues<Resources>;\n return { state: 'value', value, isStale, isLoading };\n }\n\n return { state: 'empty', isLoading };\n },\n\n get() {\n return Promise.all(resources.map((resource) => resource.get())) as Promise<CombineValues<Resources>>;\n },\n };\n}\n","import { Store } from 'schummar-state/react';\nimport type { PartialTableTheme } from '../types';\n\nexport const globalTableTheme = new Store<PartialTableTheme>({});\n\nexport function configureTableTheme(tableTheme: PartialTableTheme) {\n globalTableTheme.set(tableTheme);\n}\n\nexport function mergeThemes<T>(...themes: PartialTableTheme<T>[]): PartialTableTheme<T> {\n return {\n text: Object.assign({}, ...themes.map((theme) => theme.text)),\n classes: Object.assign({}, ...themes.map((theme) => theme.classes)),\n styles: Object.assign({}, ...themes.map((theme) => theme.styles)),\n components: Object.assign({}, ...themes.map((theme) => theme.components)),\n icons: Object.assign({}, ...themes.map((theme) => theme.icons)),\n colors: {\n primary: Object.assign({}, ...themes.map((theme) => theme.colors?.primary)),\n secondary: Object.assign({}, ...themes.map((theme) => theme.colors?.secondary)),\n blocked: Object.assign({}, ...themes.map((theme) => theme.colors?.blocked)),\n background: themes\n .map((theme) => theme.colors?.background)\n .reverse()\n .find((x) => x !== undefined),\n text: themes\n .map((theme) => theme.colors?.text)\n .reverse()\n .find((x) => x !== undefined),\n border: themes\n .map((theme) => theme.colors?.border)\n .reverse()\n .find((x) => x !== undefined),\n borderLight: themes\n .map((theme) => theme.colors?.borderLight)\n .reverse()\n .find((x) => x !== undefined),\n },\n spacing: themes\n .map((theme) => theme.spacing)\n .reverse()\n .find((x) => x !== undefined),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAQO;AAEP,IAAAA,gBAAwB;;;ACVxB,mBAAqD;;;ACSrD,IAAqB,cAArB,MAAyE;AAAA,EAIvE,YAA4B,UAA8B,CAAC,GAAG;AAAlC;AAH5B,SAAS,OAAO;AAChB,SAAS,aAAa;AAAA,EAEyC;AAAA,EAE/D,eACE,SACA,MACA,UAAU,KAAK,SACP;AACR,UAAM,EAAE,WAAW,YAAY,KAAM,QAAQ,KAAK,MAAM,KAAK,IAAI;AAEjE,UAAM,QAAQ,CAAC,SAAS,GAAG,IAAI,EAAE;AAAA,MAAI,CAAC,SACpC,KAAK,IAAI,CAAC,UAAU;AAClB,YAAI;AACJ,YAAI,OAAO,UAAU,UAAU;AAC7B,wBAAc,OAAO,KAAK;AAAA,QAC5B,WAAW,iBAAiB,MAAM;AAChC,wBAAc,MAAM,YAAY;AAAA,QAClC,OAAO;AACL,wBAAc;AAAA,QAChB;AAEA,YAAI,CAAC,CAAC,WAAW,OAAO,GAAG,EAAE,KAAK,CAAC,MAAM,YAAY,SAAS,CAAC,CAAC,GAAG;AACjE,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,YAAY,QAAQ,IAAI,OAAO,OAAO,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,EAAE;AAC5E,eAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,YACG,YAAY,OAAO,SAAS;AAAA,IAAO,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,SAAS,CAAC,EAAE,KAAK,GAAG;AAAA,EAEhG;AAAA,EAEA,aAAa,SAAqC,MAA0C;AA/C9F;AAgDI,UAAM,OAAO,KAAK,eAAe,SAAS,MAAM,iCAC3C,KAAK,UADsC;AAAA,MAE9C,YAAW,UAAK,QAAQ,cAAb,YAA0B;AAAA,IACvC,EAAC;AACD,WAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,WAAW,CAAC;AAAA,EAC9C;AACF;;;ADlBI;AA1BG,IAAM,2BAAuB,4BAAwC;AAAA,EAC1E,OAAO,CAAC;AAAA,EACR,WAAW;AAAA,IACT,EAAE,QAAQ,QAAQ,UAAU,IAAI,YAAY,EAAE;AAAA,IAC9C,EAAE,QAAQ,YAAY,UAAU,IAAI,YAAY,EAAE;AAAA,EACpD;AACF,CAAC;AAEM,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGG;AACD,QAAM,gBAAY,yBAAW,oBAAoB;AACjD,kCAAU,UAAU;AACpB,8CAAc,UAAU;AAExB,MAAI,qBAAqB;AACvB,gBAAY,CAAC,GAAG,WAAW,GAAG,mBAAmB;AAAA,EACnD;AAEA,SACE;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AE7CA,IAAAC,gBAAkD;AAClD,uBAA6B;;;ACD7B,IAAAC,gBAAoB;AAEpB,IAAM,WAAO,mBAAI;AAAA,EACf,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,UAAU;AAAA,EAEV,iBAAiB;AAAA,IACf,SAAS;AAAA,EACX;AACF,CAAC;AAEM,IAAM,iBAAiB;AAAA,EAC5B,WAAO,mBAAI;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AAAA,EAED;AAAA,EAEA,cAAU,mBAAI;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAAA,EAED,gBAAY,mBAAI,MAAM;AAAA,IACpB,cAAc;AAAA,IACd,YAAY;AAAA,IAEZ,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAAA,EAED,gBAAY,mBAAI,MAAM;AAAA,IACpB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AAAA,EAED,eAAW,mBAAI;AAAA,IACb,gBAAgB;AAAA,EAClB,CAAC;AAAA,EAED,YAAQ,mBAAI;AAAA,IACV,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,kBAAc,mBAAI;AAAA,IAChB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,gBAAY,mBAAI;AAAA,IACd,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AAAA,EAED,gBAAY,mBAAI;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,EACd,CAAC;AAAA,EAED,UAAM,mBAAI;AAAA,IACR,UAAU;AAAA,IACV,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,CAAC;AAAA,EAED,UAAM,mBAAI;AAAA,IACR,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,EACd,CAAC;AAAA,EAED,wBAAoB,mBAAI;AAAA,IACtB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAAA,EAED,aAAS,mBAAI,MAAM;AAAA,IACjB,YAAY;AAAA,IACZ,YAAY;AAAA,EACd,CAAC;AACH;;;ADHM,IAAAC,sBAAA;AA5FN,IAAM,SAAS;AACf,IAAM,aAAa;AAEZ,IAAM,UAA+C,CAAC;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAS,sBAAuB,IAAI;AAC1C,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAwC;AACxE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,SAAS,gBAAgB,eAAe,IAAI,MAAM;AAC7F,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,CAAC;AAEtC,qCAAgB,MAAM;AACpB,QAAI,CAAC,YAAY,CAAC,MAAM;AACtB,kBAAY,MAAS;AACrB;AAAA,IACF;AAEA,QAAI;AAEJ,aAAS,QAAQ;AA/BrB;AAgCM,UAAI,CAAC,SAAU;AACf,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,IAAI,SAAS,sBAAsB;AACnC,YAAM,EAAE,OAAO,cAAc,EAAE,KAAI,kBAAO,YAAP,mBAAgB,4BAAhB,YAA2C,CAAC;AAC/E,YAAM,gBAAgB,SAAS,gBAAgB;AAC/C,YAAM,iBAAiB,SAAS,gBAAgB;AAEhD,YAAM,OAAO;AAAA,QACX,MACE,UAAU,WACN,aAAa,cAAc,IAAI,cAAc,IAC7C,aACA,KAAK,IAAI,cAAc,cAAc,IAAI,OAAO,mBAAmB,UAAU;AAAA,QACnF,KAAK;AAAA,MACP;AAEA,UAAI,KAAK,OAAO,QAAQ;AACtB,aAAK,OAAO;AAAA,MACd;AACA,UAAI,KAAK,OAAO,cAAc,gBAAgB,QAAQ;AACpD,aAAK,OAAO,gBAAgB,SAAS;AAAA,MACvC;AACA,UAAI,KAAK,MAAM,QAAQ;AACrB,aAAK,MAAM;AAAA,MACb;AAEA,UAAI,KAAK,UAAS,6BAAM,SAAQ,KAAK,SAAQ,6BAAM,MAAK;AACtD,oBAAY,IAAI;AAAA,MAClB;AAEA,mBAAa,iBAAiB,SAAS,KAAK,GAAG;AAE/C,aAAO;AAAA,IACT;AACA,UAAM;AAEN,UAAM,SAAS,YAAY,OAAO,EAAE;AACpC,WAAO,MAAM;AACX,oBAAc,MAAM;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,UAAU,MAAM,KAAK,CAAC;AAE1B,WAAS,aAAa,KAA4B;AA7EpD;AA8EI,UAAM,YAAY,CAAC;AACnB,aAAS,OAAO,2BAAK,eAAe,MAAM,OAAO,KAAK,eAAe;AACnE,gBAAU,KAAK,IAAI;AAAA,IACrB;AAEA,eAAW,QAAQ,UAAU,QAAQ,GAAG;AACtC,YAAM,SAAQ,cAAS,gBAAT,mBAAsB,iBAAiB,MAAM,iBAAiB;AAE5E,UAAI,SAAS,CAAC,OAAO,MAAM,OAAO,KAAK,CAAC,GAAG;AACzC,kBAAU,OAAO,KAAK,IAAI,CAAC;AAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,KAAM,QAAO;AAElB,SACE,8EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,KAAK;AAAA,UACH,SAAS;AAAA,QACX;AAAA;AAAA,IACF;AAAA,QAEC;AAAA,MACC,8EACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,YACX,KAAK;AAAA,cACH;AAAA,gBACE,UAAU;AAAA,gBACV,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,KAAK;AAAA,gBACL,QAAQ;AAAA,gBACR;AAAA,cACF;AAAA,cACA,UAAU,EAAE,SAAS,OAAO;AAAA,YAC9B;AAAA,YACA,SAAS,MAAM,QAAQ;AAAA;AAAA,QACzB;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL;AAAA,YACA,KAAK;AAAA,cACH,eAAe;AAAA,cACf;AAAA,gBACE,UAAU;AAAA,gBACV,UAAU,SAAS,gBAAgB,cAAc,IAAI;AAAA,gBACrD;AAAA,iBACG,WAJL;AAAA,gBAKE,QAAQ,SAAS;AAAA,gBACjB,WAAW;AAAA,gBACX,OAAO;AAAA,cACT;AAAA,cACA,UAAU,EAAE,SAAS,OAAO;AAAA,cAC5B,CAAC,YAAY,EAAE,YAAY,SAAS;AAAA,YACtC;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,KACF;AAEJ;;;;IK3IA,QAAiB,SAAA,MAAe,GAAG,GAAG;AACpC,MAAI,MAAM;AAAG,WAAO;AAEpB,MAAI,KAAK,KAAK,OAAO,KAAK,YAAY,OAAO,KAAK,UAAU;AAC1D,QAAI,EAAE,gBAAgB,EAAE;AAAa,aAAO;AAE5C,QAAI,QAAQ,GAAG;AACf,QAAI,MAAM,QAAQ,CAAA,GAAI;AACpB,eAAS,EAAE;AACX,UAAI,UAAU,EAAE;AAAQ,eAAO;AAC/B,WAAK,IAAI,QAAQ,QAAQ;AACvB,YAAI,CAAC,MAAM,EAAE,CAAA,GAAI,EAAE,CAAA,CAAA;AAAK,iBAAO;AACjC,aAAO;IAAA;AAIT,QAAK,aAAa,OAAS,aAAa,KAAM;AAC5C,UAAI,EAAE,SAAS,EAAE;AAAM,eAAO;AAC9B,WAAK,KAAK,EAAE,QAAA;AACV,YAAI,CAAC,EAAE,IAAI,EAAE,CAAA,CAAA;AAAK,iBAAO;AAC3B,WAAK,KAAK,EAAE,QAAA;AACV,YAAI,CAAC,MAAM,EAAE,CAAA,GAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAM,iBAAO;AACxC,aAAO;IAAA;AAGT,QAAK,aAAa,OAAS,aAAa,KAAM;AAC5C,UAAI,EAAE,SAAS,EAAE;AAAM,eAAO;AAC9B,WAAK,KAAK,EAAE,QAAA;AACV,YAAI,CAAC,EAAE,IAAI,EAAE,CAAA,CAAA;AAAK,iBAAO;AAC3B,aAAO;IAAA;AAGT,QAAI,YAAY,OAAO,CAAA,KAAM,YAAY,OAAO,CAAA,GAAI;AAClD,eAAS,EAAE;AACX,UAAI,UAAU,EAAE;AAAQ,eAAO;AAC/B,WAAK,IAAI,QAAQ,QAAQ;AACvB,YAAI,EAAE,CAAA,MAAO,EAAE,CAAA;AAAI,iBAAO;AAC5B,aAAO;IAAA;AAIT,QAAI,EAAE,gBAAgB;AAAQ,aAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE;AAC5E,QAAI,EAAE,YAAY,OAAO,UAAU;AAAS,aAAO,EAAE,QAAA,MAAc,EAAE,QAAA;AACrE,QAAI,EAAE,aAAa,OAAO,UAAU;AAAU,aAAO,EAAE,SAAA,MAAe,EAAE,SAAA;AAExE,WAAO,OAAO,KAAK,CAAA;AACnB,aAAS,KAAK;AACd,QAAI,WAAW,OAAO,KAAK,CAAA,EAAG;AAAQ,aAAO;AAE7C,SAAK,IAAI,QAAQ,QAAQ;AACvB,UAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,KAAK,CAAA,CAAA;AAAK,eAAO;AAEhE,SAAK,IAAI,QAAQ,QAAQ,KAAI;AAC3B,UAAI,MAAM,KAAK,CAAA;AAEf,UAAI,QAAQ,YAAY,EAAE,UAAU;AAIlC;MAAA;AAGF,UAAI,CAAC,MAAM,EAAE,GAAA,GAAM,EAAE,GAAA,CAAA;AAAO,eAAO;IAAA;AAGrC,WAAO;EAAA;AAIT,SAAO,MAAI,KAAK,MAAI;AAAA;wBC3De,gBAAyC;QACtE,QAAQ,eAAe,MAAM,GAAA;SAC5B,CAAC,UAAU,MAAM,OAAY,CAACC,IAAGC,OAAOD,cAAa,UAAUC,MAAKD,KAAIA,GAAEC,EAAA,IAAuB,QAAY,KAAA;AAAA;yBAGtF,OAAgB,gBAAwB,OAAsB;QACtF,QAAQ,eAAe,MAAM,GAAA;QAC7B,SAAS,MAAM,MAAM,GAAG,EAAA;QACxB,OAAO,MAAM,MAAM,SAAS,CAAA;aAEvB,QAAQ,QAAQ;QACrB,iBAAiB,UAAU,QAAQ,OAAO;cACpC,MAAM,IAAA;IAAA,OACT;YACC,MAAM,iBAAiB,cAAA,iBAA+B,cAAA,gBAAA;IAAA;EAAA;MAI5D,iBAAiB,QAAQ;UACrB,IAAA,IAA8B;EAAA,OAC/B;UACC,MAAM,iBAAiB,cAAA,iBAA+B,cAAA,gBAAA;EAAA;AAAA;kBCvCnB,IAA6B,IAAqC;MACzG,OAAO;MACP;MACA;iBAEW;UACP,OAAO;WAEN,KAAK,IAAA;eACD;cACD;OAGP,GAAG,IAAA;EAAA;SAGD,YAAa,MAAY;UACxB,MAAM,KAAK,IAAA;eACN;QAEP;AAAS;aAEF,MAAM,OAAO,IAAI;gBAChB,WAAW,KAAK,OAAO,KAAK,GAAA;IAAA,OACjC;;;;;ACGX,IAAM,iBAAiB,OAAO,gBAAA;kBAER;EAQpB,YAAoB,OAAU,EAAE,MAAM,IAAI,SAAgB,QAAQ,MAAM,GAAG,IAAA,EAAA,IAAwB,CAAA,GAAI;;yBAP/E,oBAAI,IAAA;wBACL;qBACH,oBAAI,IAAA;mBACN,IAAI,MAAA;6BAKb,OAAO,IAAA;;;SAIT,UAAU;MACb;IAAA;EAAA;EAIJ,WAAc;WACL,KAAK;EAAA;EAGd,OAAO,QAA6E;SAC7E,UAAA;SAEA,YAAQ,sBACX,KAAK,OACL,CAAC,UAAU,OAAO,OAAO,KAAK,KAAA,GAC9B,CAAC,YAAY,KAAK,QAAQ,KAAK,GAAG,OAAA,CAAA;SAG/B,OAAA;EAAA;EAGP,IAAI,OAAgB;SACb,UAAA;SAEA,YAAQ,sBACX,KAAK,OACL,MAAM,OACN,CAAC,YAAY,KAAK,QAAQ,KAAK,GAAG,OAAA,CAAA;SAG/B,OAAA;EAAA;EAGP,aAAa,SAAwB;SAC9B,UAAA;SAEA,YAAQ,2BAAa,KAAK,OAAO,OAAA;SACjC,QAAQ,KAAK,GAAG,OAAA;SAEhB,OAAA;EAAA;EAGP,aAAa,IAAsB;QAC7B;WACG;;;WAGA;UACD,KAAK,iBAAiB,GAAG;aACtB,OAAA;MAAA;IAAA;EAAA;EAYX,aAAgB,MAAqB;QAC/B,UAA2B,UAAiD;QAE5E,KAAK,CAAA,aAAc,UAAU;OAC9B,UAAU,UAAU,OAAA,IAAW;UAC5B,OAAO,aAAa,UAAU;mBACrB,eAAqB,QAAA;MAAA;IAAA,OAE7B;OACJ,UAAU,UAAU,OAAA,IAAW,CAAC,CAAC,MAAM,GAAU,GAAG,IAAA;IAAA;UAGjD,EAAE,SAAS,MAAA,UAAMC,aAAW,GAAG,UAAUC,MAAAA,IAAO,WAAA,OAAA,UAAW,CAAA;UAC3D,oBAAoBD,aAAWE,SAAW,UAAUF,UAAAA,IAAY;QAElE,QAAQ,SAAS,KAAK,KAAA;UAEpB,mBAAmB,CAAC,OAAU,UAAmB,SAAmB;UACpE;cACI,WAAW;gBACT,SAAS,KAAA;YACb,CAAC,QAAQ,QAAQ,OAAO,QAAA;;AAC3B,SAAA,OAAO,WAAW,mBAAmB,OAAO,UAAU,KAAK,KAAA;MAAA,SACrDG,IAAA;aACF,QAAQ,IAAI,+BAA+BA,EAAA;MAAA;IAAA;SAI/C,cAAc,IAAI,gBAAA;QACnB;uBAAyB,KAAK,OAAO,CAAA,GAAI,IAAA;WACtC,MAAM;WACN,cAAc,OAAO,gBAAA;IAAA;EAAA;EAe9B,eAAkB,MAAqB;QACjC,UACF,UACA;QAEE,KAAK,CAAA,aAAc,UAAU;OAC9B,UAAU,UAAU,OAAA,IAAW;UAC5B,OAAO,aAAa,UAAU;mBACrB,eAAqB,QAAA;MAAA;IAAA,OAE7B;OACJ,UAAU,UAAU,OAAA,IAAW,CAAC,CAAC,MAAM,GAAU,GAAG,IAAA;IAAA;UAEjD,EAAE,SAAS,MAAM,UAAUF,MAAAA,IAAO,WAAA,OAAA,UAAW,CAAA;QAE/C,QAAQ,SAAS,KAAK,KAAA;UAEpB,mBAAmB,CAAC,SAAmB;UACvC,aAAa;UAEb;aACG,OAAO;cACN,WAAW;gBACT,SAAS,KAAK,KAAA;YAClB,CAAC,QAAQ,QAAQ,OAAO,QAAA;;aAEvB,YAAQ,sBACX,KAAK,OACL,CAAC,UAAU,SAAS,OAAO,OAAO,KAAK,OAAO,QAAA,GAC9C,CAAC,YAAY;uBACE;eACR,QAAQ,KAAK,GAAG,OAAA;QAAA,CAAA;MAAA,SAGlBE,IAAA;aACF,QAAQ,IAAI,+BAA+BA,EAAA;MAAA,UAAA;eAEzC,KAAK;MAAA;UAGV,cAAc,CAAC;cAAY;UAC3B,cAAc;aAAW,OAAA;IAAA;SAG1B,UAAU,IAAI,gBAAA;QACf;uBAAyB,IAAA;WACtB,MAAM;WACN,UAAU,OAAO,gBAAA;IAAA;EAAA;EAI1B,iBAAiB,UAA8C;UACvD,mBAAmB,CAAC,QAAW,YAAqB;UACpD;iBACO,OAAA;MAAA,SACFA,IAAA;aACF,QAAQ,IAAI,qCAAqCA,EAAA;MAAA;IAAA;SAIrD,cAAc,IAAI,gBAAA;WAChB,MAAM;WACN,cAAc,OAAO,gBAAA;IAAA;EAAA;EAItB,YAAY;QACd,KAAK,SAAS,YAAY;YACtB,MAAM,8EAAA;IAAA;EAAA;EAIR,SAAe;QACjB,KAAK,eAAe,KAAK,KAAK,QAAQ,WAAW;;QAEjD;iBACS,YAAY,KAAK,WAAW;;;aAGhCA,IAAA;aACA,KAAK,OAAA;IAAA;UAGR,UAAU,KAAK;SAChB,UAAU,CAAA;SAEV,aAAa,MAAM;iBACX,gBAAgB,KAAK,eAAe;qBAChC,KAAK,OAAO,OAAA;MAAA;IAAA,CAAA;EAAA;AAAA;;;;;;;;;ACrOpB,IAAI,IAAEC,cAAAA;AAAiB,SAAA,IAAW,IAAE,GAAE;AAAC,SAAO,OAAI,MAAQ,OAAJ,KAAO,IAAE,OAAI,IAAE,MAAI,OAAI,MAAG,MAAI;AAAA;AAAE,IAAI,IAAe,OAAO,OAAO,OAA3B,aAA8B,OAAO,KAAGC;AAA9C,IAAgD,IAAE,EAAE;AAApD,IAA6D,IAAE,EAAE;AAAjE,IAA2EC,MAAE,EAAE;AAA/E,IAA+FC,MAAE,EAAE;AAAc,SAAA,IAAW,IAAE,GAAE;AAAC,MAAI,IAAE,EAAA,GAAI,IAAE,EAAE,EAAC,MAAK,EAAC,OAAM,GAAE,aAAY,EAAA,EAAA,CAAA,GAAK,IAAE,EAAE,CAAA,EAAG,MAAK,IAAE,EAAE,CAAA;AAAGD,MAAE,WAAU;AAAC,MAAE,QAAM;AAAE,MAAE,cAAY;AAAEE,QAAE,CAAA,KAAI,EAAE,EAAC,MAAK,EAAA,CAAA;EAAA,GAAK,CAAC,IAAE,GAAE,CAAA,CAAA;AAAI,IAAE,WAAU;AAACA,QAAE,CAAA,KAAI,EAAE,EAAC,MAAK,EAAA,CAAA;AAAI,WAAO,GAAE,WAAU;AAACA,UAAE,CAAA,KAAI,EAAE,EAAC,MAAK,EAAA,CAAA;IAAA,CAAA;EAAA,GAAO,CAAC,EAAA,CAAA;AAAID,MAAE,CAAA;AAAG,SAAO;AAAA;AACjc,SAAA,IAAW,IAAE;AAAC,MAAI,IAAE,GAAE;AAAY,OAAE,GAAE;AAAM,MAAG;AAAC,QAAI,IAAE,EAAA;AAAI,WAAM,CAAC,EAAE,IAAE,CAAA;EAAA,SAAS,GAAN;AAAS,WAAM;EAAA;AAAA;AAAI,SAAA,IAAW,IAAE,GAAE;AAAC,SAAO,EAAA;AAAA;AAAI,IAAIE,MAAgB,OAAO,WAArB,eAA2C,OAAO,OAAO,aAA5B,eAAoD,OAAO,OAAO,SAAS,kBAArC,cAAmDC,MAAEC;+DAAwC,EAAE,yBAAX,SAAgC,EAAE,uBAAqBF;ACP/R;AACzCG,OAAAA,UAAiBR;AAAAA;ACKN,IAAI,IAAEA,cAAAA;AAAN,IAAuB,IAAES,KAAAA;AAAwC,SAAA,EAAW,IAAE,GAAE;AAAC,SAAO,OAAI,MAAQ,OAAJ,KAAO,IAAE,OAAI,IAAE,MAAI,OAAI,MAAG,MAAI;AAAA;AAAE,IAAI,IAAe,OAAO,OAAO,OAA3B,aAA8B,OAAO,KAAG;AAA9C,IAAgD,IAAE,EAAE;AAApD,IAAyE,IAAE,EAAE;AAA7E,IAAoF,IAAE,EAAE;AAAxF,IAAkG,IAAE,EAAE;AAAtG,IAA8G,IAAE,EAAE;+DACtN,SAAS,IAAE,GAAE,IAAE,IAAE,GAAE;AAAC,MAAI,IAAE,EAAE,IAAA;AAAM,MAAU,EAAE,YAAT,MAAiB;AAAC,QAAI,IAAE,EAAC,UAAS,OAAG,OAAM,KAAA;AAAM,MAAE,UAAQ;EAAA;AAAO,QAAE,EAAE;AAAQ,MAAE,EAAE,WAAU;AAAC,aAAA,GAAW,IAAE;AAAC,UAAG,CAAC,IAAE;AAAC,aAAE;AAAG,aAAE;AAAE,aAAE,GAAE,EAAA;AAAG,YAAY,MAAT,UAAY,EAAE,UAAS;AAAC,cAAI,KAAE,EAAE;AAAM,cAAG,EAAE,IAAE,EAAA;AAAG,mBAAO,KAAE;QAAA;AAAE,eAAO,KAAE;MAAA;AAAE,WAAE;AAAE,UAAG,EAAE,IAAE,EAAA;AAAG,eAAO;AAAE,UAAI,KAAE,GAAE,EAAA;AAAG,UAAY,MAAT,UAAY,EAAE,IAAE,EAAA;AAAG,eAAO;AAAE,WAAE;AAAE,aAAO,KAAE;IAAA;AAAE,QAAI,KAAE,OAAG,IAAE,IAAE,KAAW,OAAT,SAAW,OAAK;AAAE,WAAM,CAAC,WAAU;AAAC,aAAO,GAAE,EAAA,CAAA;IAAA,GAAa,OAAP,OAAS,SAAO,WAAU;AAAC,aAAO,GAAE,GAAA,CAAA;IAAA,CAAA;EAAA,GAAQ,CAAC,GAAE,IAAE,IAAE,CAAA,CAAA;AAAI,MAAI,IAAE,EAAE,IAAE,EAAE,CAAA,GAAG,EAAE,CAAA,CAAA;AACnf,IAAE,WAAU;AAAC,MAAE,WAAS;AAAG,MAAE,QAAM;EAAA,GAAG,CAAC,CAAA,CAAA;AAAI,IAAE,CAAA;AAAG,SAAO;AAAA;ACRZ;AACzCC,eAAAA,UAAiBV;AAAAA;uBCaiB,UAAoB,MAAgB;;MAClE,UAA2B;MAE3B,KAAK,CAAA,aAAc,UAAU;eACpB,KAAK,CAAA;eACN,KAAA,KAAK,CAAA,MAAL,OAAA,KAAW,CAAA;EAAA,WACZ,OAAO,KAAK,CAAA,MAAO,UAAU;eAC3B,eAAe,KAAK,CAAA,CAAA;eACrB,KAAA,KAAK,CAAA,MAAL,OAAA,KAAW,CAAA;EAAA,OAChB;eACM,CAAC,MAAM;eACR,KAAA,KAAK,CAAA,MAAL,OAAA,KAAW,CAAA;EAAA;QAGjB,gBAAY,2BAChB,CAAC,aAAyB;WACjB,MAAM,UAAU,CAAC,MAAM,GAAG,UAAU;MACzC,UAAU,QAAQ;MAClB,QAAQ;MACR,SAAS,CAAC,IAAG,MAAM,OAAM;IAAA,CAAA;EAAA,GAG7B,CAAC,OAAO,QAAQ,QAAA,CAAA;QAGZ,kBAAc,2BAAY,MAAM,MAAM,SAAA,GAAY,CAAC,KAAA,CAAA;QAEnD,QAAQW,aAAAA,QAAAA,iCAEZ,WACA,aACA,aACA,WACA,KAAA,QAAQ,YAAR,OAAA,KAAmBC,KAAAA;mCAGP,KAAA;SACP;AAAA;sBC/CmD,OAAiB,UAAuC;QAC5G,QAAQ,cAAc,OAAO,QAAA;QAC7B,SAAS,CAAC,WAA+B,MAAM,OAAO,CAAC,UAAU,gBAAgB,OAAO,UAAU,MAAA,CAAA;SAEjG,CAAC,OAAO,MAAA;AAAA;2BCLaC,MAAa;EAIzC,YAAY,MAAkB;WACrB,cAAc,MAAM,GAAG,IAAA;EAAA;EAGhC,QAAoC,UAAuC;WAClE,aAAa,MAAM,QAAA;EAAA;AAAA;;;AGXvB,IAAM,mBAAmB,IAAIC,OAAyB,CAAC,CAAC;AAMxD,SAAS,eAAkB,QAAsD;AACtF,SAAO;AAAA,IACL,MAAM,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAAA,IAC5D,SAAS,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AAAA,IAClE,QAAQ,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC;AAAA,IAChE,YAAY,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,UAAU,CAAC;AAAA,IACxE,OAAO,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAAA,IAC9D,QAAQ;AAAA,MACN,SAAS,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,UAAO;AAjBvD;AAiB0D,2BAAM,WAAN,mBAAc;AAAA,OAAO,CAAC;AAAA,MAC1E,WAAW,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,UAAO;AAlBzD;AAkB4D,2BAAM,WAAN,mBAAc;AAAA,OAAS,CAAC;AAAA,MAC9E,SAAS,OAAO,OAAO,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,UAAO;AAnBvD;AAmB0D,2BAAM,WAAN,mBAAc;AAAA,OAAO,CAAC;AAAA,MAC1E,YAAY,OACT,IAAI,CAAC,UAAO;AArBrB;AAqBwB,2BAAM,WAAN,mBAAc;AAAA,OAAU,EACvC,QAAQ,EACR,KAAK,CAAC,MAAM,MAAM,MAAS;AAAA,MAC9B,MAAM,OACH,IAAI,CAAC,UAAO;AAzBrB;AAyBwB,2BAAM,WAAN,mBAAc;AAAA,OAAI,EACjC,QAAQ,EACR,KAAK,CAAC,MAAM,MAAM,MAAS;AAAA,MAC9B,QAAQ,OACL,IAAI,CAAC,UAAO;AA7BrB;AA6BwB,2BAAM,WAAN,mBAAc;AAAA,OAAM,EACnC,QAAQ,EACR,KAAK,CAAC,MAAM,MAAM,MAAS;AAAA,MAC9B,aAAa,OACV,IAAI,CAAC,UAAO;AAjCrB;AAiCwB,2BAAM,WAAN,mBAAc;AAAA,OAAW,EACxC,QAAQ,EACR,KAAK,CAAC,MAAM,MAAM,MAAS;AAAA,IAChC;AAAA,IACA,SAAS,OACN,IAAI,CAAC,UAAU,MAAM,OAAO,EAC5B,QAAQ,EACR,KAAK,CAAC,MAAM,MAAM,MAAS;AAAA,EAChC;AACF;;;ArBvBM,IAAAC,sBAAA;AAHC,IAAM,YAA+B;AAAA,EAC1C,YAAY;AAAA,IACV,QAAQ,CAAC,UACP;AAAA,MAAC;AAAA,uCACK,QADL;AAAA,QAEC,MAAK;AAAA,QACL,WAAS;AAAA,QACT,KAAK,EAAE,gBAAgB,mBAAmB;AAAA,QAC1C,OAAO,MAAM,YAAY,cAAc,YAAY;AAAA;AAAA,IACrD;AAAA,IAEF,YAAY,CAAC,UACX,6CAAC,6DAAe,QAAf,EAAsB,MAAK,SAAQ,KAAK,EAAE,UAAU,QAAQ,GAAG,OAAM,YAAU;AAAA,IAElF,UAAU,CAAC,UAAU,6CAAC,2DAAa,QAAb,EAAoB,OAAM,WAAU,MAAK,UAAQ;AAAA,IACvE;AAAA,IACA;AAAA,IACA,WAAW,CAAC,OAAkC;AAAlC,mBAAE,aAAW,QAjC7B,IAiCgB,IAAyB,kBAAzB,IAAyB,CAAvB,aAAW;AACvB;AAAA,QAAC;AAAA,yCACK,QADL;AAAA,UAEC,YAAY,EAAE,gBAAgB,WAAW,cAAc,QAAQ;AAAA,UAC/D,MAAK;AAAA;AAAA,MACP;AAAA;AAAA,IAEF,SAAS,CAAC,UAAU,6CAAC,mEAAqB,QAArB,EAA4B,MAAM,KAAI;AAAA,EAC7D;AACF;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AACF,GAGG;AACD,QAAM,eAAW,0BAAS;AAE1B,QAAM,aAAS,uBAAQ,MAAM;AAC3B,WAAO;AAAA,MACL;AAAA,QACE,QAAQ;AAAA,UACN,SAAS,SAAS,QAAQ;AAAA,UAC1B,WAAW,SAAS,QAAQ;AAAA,UAC5B,YAAY,SAAS,QAAQ,WAAW;AAAA,UACxC,MAAM,SAAS,QAAQ,KAAK;AAAA,UAC5B,QAAQ,SAAS,QAAQ;AAAA,UACzB,aAAa,SAAS,QAAQ;AAAA,QAChC;AAAA,MACF;AAAA,MACA;AAAA,MACA,wBAAS,CAAC;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,SAAO,6CAAC,yBAAsB,OAAO,QAAS,UAAS;AACzD;","names":["import_react","import_react","import_react","import_jsx_runtime","v","p","throttle","eq","throttleFn","e","require$$0","h","n","p","r","u","t","q","shimModule","require$$1","withSelectorModule","useSyncExternalStoreWithSelector","eq","BaseStore","Store","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/theme/mui5Theme/index.tsx","../src/misc/tableSettings.tsx","../src/exporters/csvExporter.ts","../src/theme/defaultTheme/popover.tsx","../src/theme/defaultTheme/defaultClasses.ts","../node_modules/schummar-state/src/persist/persistPathHelpers.ts","../node_modules/schummar-state/src/persist/storePersist.ts","../node_modules/schummar-state/src/helpers/hash.ts","../node_modules/schummar-state/node_modules/fast-deep-equal/es6/react.js","../node_modules/schummar-state/src/helpers/stringSelector.ts","../node_modules/schummar-state/src/helpers/throttle.ts","../node_modules/schummar-state/src/store.ts","../node_modules/schummar-state/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","../node_modules/schummar-state/node_modules/use-sync-external-store/shim/index.js","../node_modules/schummar-state/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js","../node_modules/schummar-state/node_modules/use-sync-external-store/shim/with-selector.js","../node_modules/schummar-state/src/react/useStoreState.ts","../node_modules/schummar-state/src/react/useStoreProp.ts","../node_modules/schummar-state/src/react/store.ts","../node_modules/schummar-state/src/react/storeScope.tsx","../node_modules/schummar-state/src/react/useResource.ts","../src/theme/tableTheme.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Checkbox,\n CircularProgress,\n IconButton,\n TextField,\n useTheme,\n} from '@mui/material';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { TableSettingsProvider } from '../../misc/tableSettings';\nimport type { PartialTableTheme } from '../../types';\nimport { Popover } from '../defaultTheme/popover';\nimport { mergeThemes } from '../tableTheme';\n\nexport const mui5Theme: PartialTableTheme = {\n components: {\n Button: (props) => (\n <Button\n {...props}\n size=\"small\"\n fullWidth\n css={{ justifyContent: 'start !important' }}\n color={props.variant === 'contained' ? 'primary' : 'inherit'}\n />\n ),\n IconButton: (props) => (\n <IconButton {...props} size=\"small\" css={{ fontSize: '0.8em' }} color=\"inherit\" />\n ),\n Checkbox: (props) => <Checkbox {...props} color=\"primary\" size=\"small\" />,\n Popover,\n Badge,\n TextField: ({ startIcon, endIcon, ...props }) => (\n <TextField\n {...props}\n InputProps={{ startAdornment: startIcon, endAdornment: endIcon }}\n size=\"small\"\n />\n ),\n Spinner: (props) => <CircularProgress {...props} size={20} />,\n },\n};\n\nexport function Mui5TableThemeProvider({\n theme,\n children,\n}: {\n theme?: PartialTableTheme;\n children: ReactNode;\n}) {\n const muiTheme = useTheme();\n\n const _theme = useMemo(() => {\n return mergeThemes(\n {\n colors: {\n primary: muiTheme.palette.primary,\n secondary: muiTheme.palette.secondary,\n background: muiTheme.palette.background.default,\n text: muiTheme.palette.text.primary,\n border: muiTheme.palette.divider,\n borderLight: muiTheme.palette.divider,\n },\n },\n mui5Theme,\n theme ?? {},\n );\n }, [muiTheme, theme]);\n\n return <TableSettingsProvider theme={_theme}>{children}</TableSettingsProvider>;\n}\n","import { ReactNode, createContext, useContext } from 'react';\nimport CsvExporter from '../exporters/csvExporter';\nimport { ExporterEntry } from '../exporters/exporter';\nimport { PartialTableTheme } from '../types';\n\nexport interface TableSettingsContextType {\n theme: PartialTableTheme;\n exporters: ExporterEntry[];\n}\n\nexport const TableSettingsContext = createContext<TableSettingsContextType>({\n theme: {},\n exporters: [\n { action: 'copy', exporter: new CsvExporter() },\n { action: 'download', exporter: new CsvExporter() },\n ],\n});\n\nexport function TableSettingsProvider({\n theme,\n exporters,\n additionalExporters,\n children,\n}: Partial<TableSettingsContextType> & {\n additionalExporters?: ExporterEntry[];\n children?: ReactNode;\n}) {\n const inherited = useContext(TableSettingsContext);\n theme ??= inherited.theme;\n exporters ??= inherited.exporters;\n\n if (additionalExporters) {\n exporters = [...exporters, ...additionalExporters];\n }\n\n return (\n <TableSettingsContext.Provider\n value={{\n theme,\n exporters,\n }}\n >\n {children}\n </TableSettingsContext.Provider>\n );\n}\n","import { BlobExporter, StringExporter } from './exporter';\n\nexport interface CsvExporterOptions {\n sepPrefix?: boolean;\n separator?: string;\n quote?: string;\n eol?: string;\n}\n\nexport default class CsvExporter implements StringExporter, BlobExporter {\n readonly type = 'csv';\n readonly fileEnding = 'csv';\n\n constructor(public readonly options: CsvExporterOptions = {}) {}\n\n exportToString(\n columns: (string | number | Date)[],\n rows: (string | number | Date)[][],\n options = this.options,\n ): string {\n const { sepPrefix, separator = '\\t', quote = '\"', eol = '\\n' } = options;\n\n const cells = [columns, ...rows].map((line) =>\n line.map((value) => {\n let stringValue: string;\n if (typeof value === 'number') {\n stringValue = String(value);\n } else if (value instanceof Date) {\n stringValue = value.toISOString();\n } else {\n stringValue = value;\n }\n\n if (![separator, quote, eol].some((c) => stringValue.includes(c))) {\n return value;\n }\n\n const clean = stringValue.replace(new RegExp(quote, 'g'), `${quote}${quote}`);\n return `${quote}${clean}${quote}`;\n }),\n );\n\n return (\n (sepPrefix ? `SEP=${separator}\\n` : '') + cells.map((line) => line.join(separator)).join(eol)\n );\n }\n\n exportToBlob(columns: (string | number | Date)[], rows: (string | number | Date)[][]): Blob {\n const data = this.exportToString(columns, rows, {\n ...this.options,\n sepPrefix: this.options.sepPrefix ?? true,\n });\n return new Blob([data], { type: 'text/csv' });\n }\n}\n","import { useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { TableTheme } from '../../types';\nimport { defaultClasses } from './defaultClasses';\n\nconst MARGIN = 10;\nconst MAX_OFFSET = 20;\n\nexport const Popover: TableTheme['components']['Popover'] = ({\n anchorEl,\n open,\n hidden,\n onClose,\n children,\n className,\n backdropClassName,\n align,\n}) => {\n const popper = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ left: number; top: number }>();\n const [maxHeight, setMaxHeight] = useState(document.documentElement.clientHeight - 2 * MARGIN);\n const [zIndex, setZIndex] = useState(1);\n\n useLayoutEffect(() => {\n if (!anchorEl || !open) {\n setPosition(undefined);\n return;\n }\n\n let last: { left: number; top: number } | undefined;\n\n function check() {\n if (!anchorEl) return;\n const {\n left: anchorLeft,\n bottom: anchorBottom,\n width: anchorWidth,\n } = anchorEl.getBoundingClientRect();\n const { width: popperWidth = 0 } = popper.current?.getBoundingClientRect() ?? {};\n const viewportWidth = document.documentElement.clientWidth;\n const viewportHeight = document.documentElement.clientHeight;\n\n const next = {\n left:\n align === 'center'\n ? anchorLeft + anchorWidth / 2 - popperWidth / 2\n : anchorLeft -\n Math.min(popperWidth ? popperWidth / 2 : Number.POSITIVE_INFINITY, MAX_OFFSET),\n top: anchorBottom,\n };\n\n if (next.left < MARGIN) {\n next.left = MARGIN;\n }\n if (next.left + popperWidth > viewportWidth - MARGIN) {\n next.left = viewportWidth - MARGIN - popperWidth;\n }\n if (next.top < MARGIN) {\n next.top = MARGIN;\n }\n\n if (next.left !== last?.left || next.top !== last?.top) {\n setPosition(next);\n }\n\n setMaxHeight(viewportHeight - MARGIN - next.top);\n\n last = next;\n }\n check();\n\n const handle = setInterval(check, 16);\n return () => {\n clearInterval(handle);\n };\n }, [anchorEl, open, align]);\n\n function updateZIndex(div: HTMLDivElement | null) {\n const ancestors = [];\n for (let node = div?.parentElement; node; node = node.parentElement) {\n ancestors.push(node);\n }\n\n for (const node of ancestors.reverse()) {\n const value = document.defaultView?.getComputedStyle(node).getPropertyValue('z-index');\n\n if (value && !Number.isNaN(Number(value))) {\n setZIndex(Number(value) + 1);\n return;\n }\n }\n }\n\n if (!open) return null;\n\n return (\n <>\n <div\n ref={updateZIndex}\n css={{\n display: 'none',\n }}\n />\n\n {createPortal(\n <>\n <div\n className={backdropClassName}\n css={[\n {\n position: 'fixed',\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n zIndex,\n },\n hidden && { display: 'none' },\n ]}\n onClick={() => onClose()}\n />\n\n <div\n ref={popper}\n className={className}\n css={[\n defaultClasses.card,\n {\n position: 'fixed',\n maxWidth: document.documentElement.clientWidth - 2 * MARGIN,\n maxHeight,\n ...position,\n zIndex: zIndex + 1,\n overflowY: 'auto',\n color: 'var(--table-text-color)',\n },\n hidden && { display: 'none' },\n !position && { visibility: 'hidden' },\n ]}\n >\n {children}\n </div>\n </>,\n document.body,\n )}\n </>\n );\n};\n","import { css } from '@emotion/react';\n\nconst cell = css({\n padding: `calc(var(--spacing) * 0.1) calc(2 * var(--spacing))`,\n display: 'flex',\n alignItems: 'center',\n borderBottom: '1px solid var(--table-border-light-color)',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n\n '&:empty': {\n padding: 0,\n },\n});\n\nexport const defaultClasses = {\n table: css({\n position: 'relative',\n display: 'grid',\n color: 'var(--table-text-color)',\n }),\n\n cell,\n\n cellFill: css({\n borderBottom: '1px solid var(--table-border-light-color)',\n }),\n\n headerCell: css(cell, {\n borderBottom: '1px solid var(--table-border-color)',\n background: 'var(--table-background-color)',\n\n '&:not(:empty)': {\n padding: `var(--spacing) 0 var(--spacing) calc(2 * var(--spacing))`,\n },\n }),\n\n footerCell: css(cell, {\n padding: `var(--spacing) calc(2 * var(--spacing))`,\n borderTop: '1px solid var(--table-border-color)',\n borderBottom: 'none',\n background: 'var(--table-background-color)',\n }),\n\n firstCell: css({\n justifyContent: 'start',\n }),\n\n sticky: css({\n position: 'sticky',\n top: 0,\n zIndex: 2,\n }),\n\n stickyBottom: css({\n position: 'sticky',\n bottom: 0,\n zIndex: 2,\n }),\n\n headerFill: css({\n borderBottom: '1px solid var(--table-border-color)',\n background: 'var(--table-background-color)',\n }),\n\n footerFill: css({\n borderTop: '1px solid var(--table-border-color)',\n background: 'var(--table-background-color)',\n }),\n\n text: css({\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n\n card: css({\n borderRadius: 4,\n boxShadow: '0px 3px 14px 2px rgb(0 0 0 / 12%)',\n background: 'var(--table-background-color)',\n }),\n\n clearFiltersButton: css({\n padding: `0 calc(2 * var(--spacing))`,\n fontWeight: 'bold',\n position: 'sticky',\n left: 0,\n maxWidth: 'fit-content',\n gridColumn: '2/-1',\n button: {\n color: 'var(--primaryMain) !important',\n border: 'solid 1px',\n borderColor: 'var(--primaryMain) !important',\n margin: 'var(--spacing)',\n },\n }),\n\n details: css(cell, {\n gridColumn: '1 / -1',\n whiteSpace: 'normal',\n }),\n};\n","export type Path = (string | number)[];\n\nexport const isAncestor = (ancestor: Path, path: Path): boolean => {\n return ancestor.length <= path.length && ancestor.every((v, i) => v === '*' || path[i] === '*' || String(v) === String(path[i]));\n};\n\nexport const get = (value: unknown, path: Path): unknown => {\n for (const part of path) {\n if (value instanceof Object && part in value) value = value[part as keyof typeof value];\n else {\n value = undefined;\n break;\n }\n }\n return value;\n};\n\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport const split = (value: any, path: Path): [value: unknown, subValues: { path: Path; value: unknown }[]] => {\n const [first, ...rest] = path;\n if (first === undefined) return [value, []];\n\n if (rest.length === 0) {\n if (first === '*') return [{}, Object.entries(value).map(([k, v]) => ({ path: [k], value: v }))];\n if (!(first in value)) return [value, []];\n const { [first]: subValue, ...newValue } = value;\n return [newValue, [{ path: [first], value: subValue }]];\n }\n\n const newValue = { ...value };\n const subValues = new Array<{ path: Path; value: unknown }>();\n for (const key of first === '*' ? Object.keys(value) : [first]) {\n if (!(newValue[key] instanceof Object)) return [value, []];\n const result = split(newValue[key], rest);\n newValue[key] = result[0];\n subValues.push(...result[1].map((s) => ({ path: [key, ...s.path], value: s.value })));\n }\n return [newValue, subValues];\n};\n","import { Patch } from 'immer';\nimport { Store } from '../store';\nimport { get, isAncestor, Path, split } from './persistPathHelpers';\nimport { PersistPaths } from './persistPaths';\nimport { StorePersistStorage } from './persistStorage';\n\nexport class StorePersist<T> {\n private replayPatches = new Array<Patch>();\n isInitialized = false;\n whenInitialized = this.load();\n private isStopped = false;\n private sub?: () => void;\n private saveQueue = new Array<{ path: Path; t: number }>();\n private isSaving = false;\n private saveTimeout?: ReturnType<typeof setTimeout>;\n private paths: { path: Path; throttleMs?: number }[];\n\n constructor(\n public readonly store: Store<T>,\n public readonly storage: StorePersistStorage,\n public readonly options: {\n paths?: (PersistPaths<T> | { path: PersistPaths<T>; throttleMs?: number })[];\n throttleMs?: number;\n log?: (...args: any[]) => void;\n } = {}\n ) {\n if (!options.paths) {\n this.paths = [{ path: [], throttleMs: options.throttleMs }];\n } else {\n this.paths = options.paths.map((p) => ({\n path: (typeof p === 'object' ? p.path : p).split('.'),\n throttleMs: (typeof p === 'object' ? p.throttleMs : undefined) ?? options.throttleMs,\n }));\n }\n\n this.paths.sort((a, b) => b.path.length - a.path.length);\n this.watch();\n }\n\n private async load() {\n try {\n const storage = this.storage;\n\n let keys;\n if ('keys' in storage) {\n keys = await storage.keys();\n } else {\n const length = storage.length instanceof Function ? await storage.length() : storage.length;\n keys = new Array<string>();\n for (let i = 0; i < length; i++) {\n const key = await storage.key(i);\n if (key !== null) keys.push(key);\n }\n }\n keys.sort((a, b) => a.length - b.length);\n\n const patches = new Array<Patch & { persist: StorePersist<T> }>();\n for (const key of keys) {\n const value = await storage.getItem(key);\n if (value) {\n patches.push({\n path: key.split('.'),\n op: 'replace',\n value: value === 'undefined' ? undefined : JSON.parse(value),\n persist: this,\n });\n }\n }\n\n if (this.isStopped) {\n return false;\n }\n\n if (patches.length > 0) {\n this.store.applyPatches(patches);\n }\n\n this.isInitialized = true;\n if (this.replayPatches.length > 0) {\n this.store.applyPatches(this.replayPatches);\n this.replayPatches = [];\n }\n\n return true;\n } catch (e) {\n (this.options.log ?? console.error)('Failed to load storePersist:', e);\n return false;\n }\n }\n\n private watch() {\n this.sub = this.store.subscribePatches((patches) => {\n for (const patch of patches) {\n if ((patch as any).persist === this) {\n continue;\n } else if (this.isInitialized === true) {\n this.addToSaveQueue(patch.path);\n } else {\n this.replayPatches.push(patch);\n }\n }\n });\n }\n\n private addToSaveQueue(path: Path) {\n const match = this.paths.find((p) => isAncestor(p.path, path));\n if (!match) return;\n\n path = path.slice(0, match.path.length);\n const t = Date.now() + (match.throttleMs ?? 0);\n\n if (this.saveQueue.some((i) => i.t <= t && isAncestor(i.path, path))) return;\n this.saveQueue.push({ path, t });\n this.saveQueue.sort((a, b) => a.t - b.t);\n this.run();\n }\n\n private async run() {\n if (this.saveTimeout) clearTimeout(this.saveTimeout);\n const next = this.saveQueue[0];\n\n if (!next) return;\n if (next.t > Date.now()) {\n this.saveTimeout = setTimeout(() => this.run(), next.t - Date.now());\n return;\n }\n\n try {\n this.isSaving = true;\n this.saveQueue.shift();\n await this.save(next.path);\n } finally {\n this.isSaving = false;\n this.run();\n }\n }\n\n private async save(path: Path) {\n const { store, storage } = this;\n let value = get(store.getState(), path);\n\n const subPaths = this.paths\n .filter((p) => isAncestor(path, p.path) && p.path.length > path.length)\n .map((p) => p.path.slice(path.length));\n\n const subValues = new Array<{ path: Path; value: unknown }>();\n for (const subPath of subPaths) {\n const result = split(value, subPath);\n value = result[0];\n subValues.push(...result[1].map((s) => ({ path: [...path, ...s.path], value: s.value })));\n }\n\n const result = storage.setItem(path.join('.'), JSON.stringify(value) ?? 'undefined');\n if (result instanceof Promise) await result;\n for (const { path, value } of subValues) {\n const result = storage.setItem(path.join('.'), JSON.stringify(value) ?? 'undefined');\n if (result instanceof Promise) await result;\n }\n }\n\n stop(): void {\n this.isStopped = true;\n this.sub?.();\n }\n}\n","export function hash(arg: unknown): string {\n return JSON.stringify({ arg }, (_key, value) => {\n if (value instanceof Object && !(value instanceof Array)) {\n const obj: any = {};\n for (const key of Object.keys(value).sort()) {\n obj[key] = value[key as keyof typeof value];\n }\n return obj;\n }\n return value;\n });\n}\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n var envHasBigInt64Array = typeof BigInt64Array !== 'undefined';\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n if ((a instanceof Map) && (b instanceof Map)) {\n if (a.size !== b.size) return false;\n for (i of a.entries())\n if (!b.has(i[0])) return false;\n for (i of a.entries())\n if (!equal(i[1], b.get(i[0]))) return false;\n return true;\n }\n\n if ((a instanceof Set) && (b instanceof Set)) {\n if (a.size !== b.size) return false;\n for (i of a.entries())\n if (!b.has(i[0])) return false;\n return true;\n }\n\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (a[i] !== b[i]) return false;\n return true;\n }\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (key === '_owner' && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner.\n // _owner contains circular references\n // and is not needed when comparing the actual elements (and not their owners)\n continue;\n }\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","type FilterString<T> = T extends string ? T : never;\n\nexport declare type SelectorPaths<T> = FilterString<\n keyof {\n [K in keyof NonNullable<T> as\n | K\n | (0 extends 1 & NonNullable<T>[K]\n ? `${FilterString<K>}.${any}`\n : NonNullable<NonNullable<T>[K]> extends Record<string, unknown>\n ? `${FilterString<K>}.${SelectorPaths<NonNullable<T>[K]>}`\n : never)]: 1;\n }\n>;\n\ntype Value<T, K> = K extends keyof T ? T[K] : K extends keyof NonNullable<T> ? NonNullable<T>[K] | undefined : undefined;\n\nexport type SelectorValue<T, K> = K extends `${infer K}.${infer Rest}` ? SelectorValue<Value<T, K>, Rest> : Value<T, K>;\n\nexport function createSelector<T, S>(stringSelector: string): (state: T) => S {\n const parts = stringSelector.split('.');\n return (state) => parts.reduce<any>((v, p) => (v instanceof Object && p in v ? v[p as keyof typeof v] : undefined), state);\n}\n\nexport function setWithSelector(state: unknown, stringSelector: string, value: unknown): void {\n const parts = stringSelector.split('.');\n const prefix = parts.slice(0, -1);\n const last = parts[parts.length - 1]!;\n\n for (const part of prefix) {\n if (state instanceof Object && part in state) {\n state = state[part as keyof typeof state];\n } else {\n throw Error(`Could not set ${stringSelector} because path ${stringSelector} doesn't exist`);\n }\n }\n\n if (state instanceof Object) {\n state[last as keyof typeof state] = value as any;\n } else {\n throw Error(`Could not set ${stringSelector} because path ${stringSelector} doesn't exist`);\n }\n}\n","export function throttle<Args extends any[]>(fn: (...args: Args) => void, ms: number): (...args: Args) => void {\n let last = 0;\n let lastArgs: Args | undefined;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n function run() {\n const args = lastArgs;\n\n last = Date.now();\n lastArgs = undefined;\n timeout = undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n fn(...args!);\n }\n\n return function (...args: Args) {\n const now = Date.now();\n lastArgs = args;\n\n if (timeout) {\n // do nothing\n } else if (now < last + ms) {\n timeout = setTimeout(run, last + ms - now);\n } else {\n run();\n }\n };\n}\n","import eq from 'fast-deep-equal/es6/react';\nimport { applyPatches, Draft, enableMapSet, enablePatches, freeze, Patch, produce } from 'immer';\nimport { Cancel } from './helpers/misc';\nimport { createSelector, SelectorPaths, SelectorValue } from './helpers/stringSelector';\nimport { throttle as throttleFn } from './helpers/throttle';\n\nexport type StoreOptions = {\n /** Log errors. Default: console.error */\n log?: (...data: any[]) => void;\n};\n\nexport type StoreSubscribeOptions = {\n /** Invoke callback immediately with the current value? Default: true */\n runNow?: boolean;\n /** Throttle invocations of callback. */\n throttle?: number;\n /** Comparison function to determine if the data has changed. Default: fast-deep-equal */\n compare?: (a: any, b: any) => boolean;\n};\n\nexport type StoreAddReactionOptions = {\n /** Invoke callback immediately with the current value? Default: true */\n runNow?: boolean;\n /** Comparison function to determine if the data has changed. Default: fast-deep-equal */\n compare?: (a: any, b: any) => boolean;\n};\n\nconst RESTART_UPDATE = Symbol('RESTART_UPDATE');\n\nexport class Store<T> {\n private subscriptions = new Set<(state: T, patches: Patch[]) => void>();\n private batchCounter = 0;\n private reactions = new Set<() => void>();\n private patches = new Array<Patch>();\n private lock?: 'reaction';\n private options;\n\n constructor(private state: T, { log = (...data: any[]) => console.error(...data) }: StoreOptions = {}) {\n freeze(state, true);\n enableMapSet();\n enablePatches();\n\n this.options = {\n log,\n };\n }\n\n getState(): T {\n return this.state;\n }\n\n update(update: (draft: Draft<T>, original: T) => Draft<T> | void | undefined): void {\n this.checkLock();\n\n this.state = produce(\n this.state,\n (draft) => update(draft, this.state),\n (patches) => this.patches.push(...patches)\n );\n\n this.notify();\n }\n\n set(state: T): void {\n this.checkLock();\n\n this.state = produce(\n this.state,\n () => state,\n (patches) => this.patches.push(...patches)\n ) as T;\n\n this.notify();\n }\n\n applyPatches(patches: Patch[]): void {\n this.checkLock();\n\n this.state = applyPatches(this.state, patches);\n this.patches.push(...patches);\n\n this.notify();\n }\n\n batchUpdates(fn: () => void): void {\n try {\n this.batchCounter++;\n fn();\n } finally {\n this.batchCounter--;\n if (this.batchCounter === 0) {\n this.notify();\n }\n }\n }\n\n subscribe(listener: (value: T, prev: T, state: T) => void, options?: StoreSubscribeOptions): Cancel;\n subscribe<S>(selector: (state: T) => S, listener: (value: S, prev: S, state: T) => void, options?: StoreSubscribeOptions): Cancel;\n subscribe<K extends SelectorPaths<T>>(\n selector: K,\n listener: (value: SelectorValue<T, K>, prev: SelectorValue<T, K>, state: T) => void,\n options?: StoreSubscribeOptions\n ): Cancel;\n subscribe<S>(...args: any[]): Cancel {\n let selector: (state: T) => S, listener: (value: S, prev: S, state: T) => void, options: StoreSubscribeOptions | undefined;\n\n if (args[1] instanceof Function) {\n [selector, listener, options] = args;\n if (typeof selector === 'string') {\n selector = createSelector<T, S>(selector);\n }\n } else {\n [selector, listener, options] = [(x) => x as any, ...args];\n }\n\n const { runNow = true, throttle = 0, compare = eq } = options ?? {};\n const throttledListener = throttle ? throttleFn(listener, throttle) : listener;\n\n let value = selector(this.state);\n\n const internalListener = (state: T, _patches: Patch[], init?: boolean) => {\n try {\n const oldValue = value;\n value = selector(state);\n if (!init && compare(value, oldValue)) return;\n (init ? listener : throttledListener)(value, oldValue, this.state);\n } catch (e) {\n this.options.log('Failed to execute listener:', e);\n }\n };\n\n this.subscriptions.add(internalListener);\n if (runNow) internalListener(this.state, [], true);\n return () => {\n this.subscriptions.delete(internalListener);\n };\n }\n\n addReaction(reaction: (value: T, draft: Draft<T>, original: T, prev: T) => void, options?: StoreAddReactionOptions): Cancel;\n addReaction<S>(\n selector: (state: T) => S,\n reaction: (value: S, draft: Draft<T>, original: T, prev: S) => void,\n options?: StoreAddReactionOptions\n ): Cancel;\n addReaction<K extends SelectorPaths<T>>(\n selector: K,\n reaction: (value: SelectorValue<T, K>, draft: Draft<T>, original: T, prev: SelectorValue<T, K>) => void,\n options?: StoreAddReactionOptions\n ): Cancel;\n addReaction<S>(...args: any[]): Cancel {\n let selector: (state: T) => S,\n reaction: (value: S, draft: Draft<T>, original: T, prev: S) => void,\n options: StoreAddReactionOptions | undefined;\n\n if (args[1] instanceof Function) {\n [selector, reaction, options] = args;\n if (typeof selector === 'string') {\n selector = createSelector<T, S>(selector);\n }\n } else {\n [selector, reaction, options] = [(x) => x as any, ...args];\n }\n const { runNow = true, compare = eq } = options ?? {};\n\n let value = selector(this.state);\n\n const internalListener = (init?: boolean) => {\n let hasChanged = false;\n\n try {\n this.lock = 'reaction';\n const oldValue = value;\n value = selector(this.state);\n if (!init && compare(value, oldValue)) return;\n\n this.state = produce(\n this.state,\n (draft) => reaction(value, draft, this.state, oldValue),\n (patches) => {\n hasChanged = true;\n this.patches.push(...patches);\n }\n );\n } catch (e) {\n this.options.log('Failed to execute reaction:', e);\n } finally {\n delete this.lock;\n }\n\n if (hasChanged && !init) throw RESTART_UPDATE;\n if (hasChanged && init) this.notify();\n };\n\n this.reactions.add(internalListener);\n if (runNow) internalListener(true);\n return () => {\n this.reactions.delete(internalListener);\n };\n }\n\n subscribePatches(listener: (patches: Patch[]) => void): Cancel {\n const internalListener = (_state: T, patches: Patch[]) => {\n try {\n listener(patches);\n } catch (e) {\n this.options.log('Failed to execute patch listener:', e);\n }\n };\n\n this.subscriptions.add(internalListener);\n return () => {\n this.subscriptions.delete(internalListener);\n };\n }\n\n private checkLock() {\n if (this.lock === 'reaction') {\n throw Error('You cannot call update from within a reaction. Use the passed draft instead.');\n }\n }\n\n private notify(): void {\n if (this.batchCounter > 0 || this.patches.length === 0) return;\n\n try {\n for (const reaction of this.reactions) {\n reaction();\n }\n } catch (e) {\n return this.notify();\n }\n\n const patches = this.patches;\n this.patches = [];\n\n this.batchUpdates(() => {\n for (const subscription of this.subscriptions) {\n subscription(this.state, patches);\n }\n });\n }\n}\n","/** @license React vundefined\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var e=require(\"react\");function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c})},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c})})},[a]);p(d);return d}\nfunction r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return!k(a,d)}catch(f){return!0}}function t(a,b){return b()}var u=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t:q;exports.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/** @license React vundefined\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var h=require(\"react\"),n=require(\"use-sync-external-store/shim\");function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q=\"function\"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;\nexports.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return[function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);\nu(function(){f.hasValue=!0;f.value=d},[d]);w(d);return d};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import eq from 'fast-deep-equal/es6/react';\nimport { useCallback, useDebugValue } from 'react';\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector';\nimport { StoreSubscribeOptions } from '..';\nimport { createSelector, SelectorPaths, SelectorValue } from '../helpers/stringSelector';\nimport { Store } from './store';\n\nexport type UseStoreStateOptions = Omit<StoreSubscribeOptions, 'runNow'>;\n\nexport function useStoreState<T>(store: Store<T>, options?: UseStoreStateOptions): T;\nexport function useStoreState<T, S>(store: Store<T>, selector: (state: T) => S, options?: UseStoreStateOptions): S;\nexport function useStoreState<T, K extends SelectorPaths<T>>(\n store: Store<T>,\n selector: K,\n options?: UseStoreStateOptions\n): SelectorValue<T, K>;\nexport function useStoreState<T, S>(store: Store<T>, ...args: any[]): S {\n let selector: (state: T) => S, options: UseStoreStateOptions;\n\n if (args[0] instanceof Function) {\n selector = args[0];\n options = args[1] ?? {};\n } else if (typeof args[0] === 'string') {\n selector = createSelector(args[0]);\n options = args[1] ?? {};\n } else {\n selector = (x) => x as any;\n options = args[0] ?? {};\n }\n\n const subscribe = useCallback(\n (listener: () => void) => {\n return store.subscribe((x) => x, listener, {\n throttle: options.throttle,\n runNow: false,\n compare: (a, b) => a === b,\n });\n },\n [store, options.throttle]\n );\n\n const getSnapshot = useCallback(() => store.getState(), [store]);\n\n const value = useSyncExternalStoreWithSelector(\n //\n subscribe,\n getSnapshot,\n getSnapshot,\n selector,\n options.compare ?? eq\n );\n\n useDebugValue(value);\n return value;\n}\n","import { SelectorPaths, SelectorValue, setWithSelector } from '../helpers/stringSelector';\nimport { Store } from './store';\nimport { useStoreState } from './useStoreState';\n\nexport type UseStorePropResult<T, K extends SelectorPaths<T>> = [value: SelectorValue<T, K>, update: (value: SelectorValue<T, K>) => void];\n\nexport function useStoreProp<T, K extends SelectorPaths<T>>(store: Store<T>, selector: K): UseStorePropResult<T, K> {\n const value = useStoreState(store, selector);\n const update = (value: SelectorValue<T, K>) => store.update((state) => setWithSelector(state, selector, value));\n\n return [value, update];\n}\n","import { Store as BaseStore } from '../store';\nimport { SelectorPaths, SelectorValue } from '../helpers/stringSelector';\nimport { useStoreProp, UseStorePropResult } from './useStoreProp';\nimport { useStoreState, UseStoreStateOptions } from './useStoreState';\n\nexport class Store<T> extends BaseStore<T> {\n useState(options?: { throttle?: number }): T;\n useState<S>(selector: (state: T) => S, options?: UseStoreStateOptions): S;\n useState<K extends SelectorPaths<T>>(selector: K, options?: UseStoreStateOptions): SelectorValue<T, K>;\n useState(...args: any[]): any {\n return useStoreState(this, ...args);\n }\n\n useProp<K extends SelectorPaths<T>>(selector: K): UseStorePropResult<T, K> {\n return useStoreProp(this, selector);\n }\n}\n","import React, { Context, createContext, ReactNode, useContext, useMemo } from 'react';\nimport { SelectorPaths, SelectorValue } from '../helpers/stringSelector';\nimport { Store } from './store';\nimport { useStoreProp, UseStorePropResult } from './useStoreProp';\nimport { useStoreState, UseStoreStateOptions } from './useStoreState';\n\nexport class StoreScope<T> {\n readonly context: Context<Store<T>>;\n\n constructor(public readonly defaultValue: T) {\n this.context = createContext(new Store(defaultValue));\n }\n\n Provider = ({ children, store }: { children: ReactNode; store?: Store<T> }): JSX.Element => {\n const _store = useMemo(() => store ?? new Store(this.defaultValue), [store]);\n\n return <this.context.Provider value={_store}>{children}</this.context.Provider>;\n };\n\n withScope = <Args extends Record<string, unknown>>(Component: (args: Args) => JSX.Element) => {\n return (args: Args): JSX.Element => (\n <this.Provider>\n <Component {...args} />\n </this.Provider>\n );\n };\n\n useStore(): Store<T> {\n return useContext(this.context);\n }\n\n useState(options?: { throttle?: number }): T;\n useState<S>(selector: (state: T) => S, dependencies?: any[], options?: { throttle?: number }): S;\n useState<K extends SelectorPaths<T>>(selector: K, options?: UseStoreStateOptions): SelectorValue<T, K>;\n useState(...args: any[]): any {\n const store = this.useStore();\n return useStoreState(store, ...args);\n }\n\n useProp<K extends SelectorPaths<T>>(selector: K): UseStorePropResult<T, K> {\n const store = this.useStore();\n return useStoreProp(store, selector);\n }\n}\n","import eq from 'fast-deep-equal/es6/react';\nimport { useCallback, useDebugValue, useEffect } from 'react';\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector';\nimport { ResourceInfo, ResourceInstance, ResourceSubscribeOptions } from '..';\nimport { hash } from '../helpers/hash';\n\nexport type UseResource<Value> = Pick<ResourceInstance<unknown, Value>, 'id' | 'invalidateCache' | 'subscribe' | 'getCache' | 'get'>;\n\nexport type UseResourceOptions = Omit<ResourceSubscribeOptions, 'runNow'> & {\n /** Invalidate the resource on mount, causing it to update in the background */\n updateOnMount?: boolean;\n /** Don't subscribe resource while this is true */\n dormant?: boolean;\n};\n\n/** Subscribe to a resource. This will immediately return cached values, if available, and update for future updates.\n * @param resource the resource to subscribe to.\n * @param options options\n */\nexport function useResource<Value>(resource: UseResource<Value>, options?: UseResourceOptions): ResourceInfo<Value> {\n const { compare, dormant, throttle, updateOnMount, watchOnly } = options ?? {};\n\n useEffect(() => {\n if (updateOnMount && !dormant) {\n resource.invalidateCache();\n }\n }, []);\n\n const subscribe = useCallback(\n (listener: () => void) => {\n if (dormant)\n return () => {\n // nothing to do\n };\n\n return resource.subscribe(listener, {\n watchOnly,\n throttle,\n runNow: false,\n compare,\n });\n },\n [resource.id, watchOnly, dormant, throttle]\n );\n\n const getSnapshot = useCallback(() => resource.getCache(), [resource.id]);\n\n let value = useSyncExternalStoreWithSelector(\n //\n subscribe,\n getSnapshot,\n getSnapshot,\n (x) => x,\n eq\n );\n\n if (dormant) {\n value = { state: 'empty', isLoading: false };\n }\n\n useDebugValue(value);\n return value;\n}\n\n/** Subscribe to a resource. This will immediately return cached values, if available, and update for future updates. While waiting for data, it throws so that the Component will be suspended. If there is an error, it throws.\n * @param resource the resource to subscribe to.\n * @param options options\n */\nexport function useReadResource<Value>(resource: UseResource<Value>, options?: UseResourceOptions): Value {\n const info = useResource(resource, options);\n\n if (info.state === 'error') {\n throw info.error;\n }\n\n if (info.state === 'empty') {\n throw resource.get();\n }\n\n useDebugValue(info.value);\n return info.value;\n}\n\nexport type CombineValues<T> = T extends [UseResource<infer Value>]\n ? [Value]\n : T extends [UseResource<infer Value>, ...infer Rest]\n ? [Value, ...CombineValues<Rest>]\n : T extends readonly UseResource<infer Value>[]\n ? Value[]\n : any[];\n\n/** Combine multiple resources into one that can be fed into useResource or useReadResource. Return value will be an array of the combined resources' values.\n * @param resources resources to be combined\n */\nexport function combineResources<Resources extends readonly UseResource<any>[]>(\n ...resources: Resources\n): UseResource<CombineValues<Resources>> {\n return {\n id: hash(resources.map((resource) => resource.id)),\n\n invalidateCache() {\n for (const resource of resources) {\n resource.invalidateCache();\n }\n },\n\n subscribe(listener, options) {\n const handles = resources.map((resource) => resource.subscribe(listener, options));\n\n return () => {\n for (const handle of handles) {\n handle();\n }\n };\n },\n\n getCache() {\n const caches = resources.map((resource) => resource.getCache());\n const isStale = caches.some((cache) => cache.isStale);\n const isLoading = caches.some((cache) => cache.isLoading);\n\n if (caches.some((resource) => resource.state === 'error')) {\n const error = caches.find((cache) => cache.error !== undefined)?.error;\n return { state: 'error', error, isStale, isLoading };\n }\n\n if (caches.every((resource) => resource.state === 'value')) {\n const value = caches.map((cache) => cache.value) as CombineValues<Resources>;\n return { state: 'value', value, isStale, isLoading };\n }\n\n return { state: 'empty', isLoading };\n },\n\n get() {\n return Promise.all(resources.map((resource) => resource.get())) as Promise<CombineValues<Resources>>;\n },\n };\n}\n","import { Store } from 'schummar-state/react';\nimport type { PartialTableTheme } from '../types';\n\nexport const globalTableTheme = new Store<PartialTableTheme>({});\n\nexport function configureTableTheme(tableTheme: PartialTableTheme) {\n globalTableTheme.set(tableTheme);\n}\n\nexport function mergeThemes<T>(...themes: PartialTableTheme<T>[]): PartialTableTheme<T> {\n return {\n text: Object.assign({}, ...themes.map((theme) => theme.text)),\n classes: Object.assign({}, ...themes.map((theme) => theme.classes)),\n styles: Object.assign({}, ...themes.map((theme) => theme.styles)),\n components: Object.assign({}, ...themes.map((theme) => theme.components)),\n icons: Object.assign({}, ...themes.map((theme) => theme.icons)),\n colors: {\n primary: Object.assign({}, ...themes.map((theme) => theme.colors?.primary)),\n secondary: Object.assign({}, ...themes.map((theme) => theme.colors?.secondary)),\n blocked: Object.assign({}, ...themes.map((theme) => theme.colors?.blocked)),\n background: themes\n .map((theme) => theme.colors?.background)\n .reverse()\n .find((x) => x !== undefined),\n text: themes\n .map((theme) => theme.colors?.text)\n .reverse()\n .find((x) => x !== undefined),\n border: themes\n .map((theme) => theme.colors?.border)\n .reverse()\n .find((x) => x !== undefined),\n borderLight: themes\n .map((theme) => theme.colors?.borderLight)\n .reverse()\n .find((x) => x !== undefined),\n },\n spacing: themes\n .map((theme) => theme.spacing)\n .reverse()\n .find((x) => x !== undefined),\n };\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","import_jsx_runtime","v","p","throttle","eq","throttleFn","e","require$$0","h","n","p","r","u","t","q","shimModule","require$$1","withSelectorModule","useSyncExternalStoreWithSelector","eq","BaseStore","Store","import_jsx_runtime"]}
@@ -1,6 +1,6 @@
1
1
  import * as _emotion_react_jsx_runtime from '@emotion/react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
- import { P as PartialTableTheme } from './types-CkiMjwT9.cjs';
3
+ import { P as PartialTableTheme } from './types-DKqBJ_4v.cjs';
4
4
  import '@emotion/react';
5
5
  import './exporter-u6SatTo6.cjs';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import * as _emotion_react_jsx_runtime from '@emotion/react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
- import { P as PartialTableTheme } from './types-C_rP1nwr.js';
3
+ import { P as PartialTableTheme } from './types-cAzUt-yT.js';
4
4
  import '@emotion/react';
5
5
  import './exporter-u6SatTo6.js';
6
6
 
package/dist/mui5Theme.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  Popover,
3
3
  TableSettingsProvider,
4
4
  mergeThemes
5
- } from "./chunk-FTCKJOPQ.js";
5
+ } from "./chunk-NTYYITKA.js";
6
6
  import "./chunk-WFCJ3D3G.js";
7
7
  import {
8
8
  __objRest,
@@ -27,6 +27,8 @@ type MemoizedFunctions<T> = {
27
27
  [K in keyof T]: Exclude<T[K], [function: (...args: any[]) => any, ...deps: DependencyList]>;
28
28
  };
29
29
  type CSSInterpolation = Exclude<Interpolation<Theme>, ((...args: any[]) => any) | Array<any>>;
30
+ type DisplaySize = 'desktop' | 'mobile' | (string & {});
31
+ type DisplaySizes = Record<DisplaySize, number>;
30
32
  interface TableTheme<TItem = unknown> {
31
33
  /** Define display texts. */
32
34
  text: {
@@ -82,12 +84,14 @@ interface TableTheme<TItem = unknown> {
82
84
  IconButton: ComponentType<{
83
85
  children: ReactNode;
84
86
  onClick?: (event: React__default.MouseEvent<Element>) => void;
87
+ onContextMenu?: (event: React__default.MouseEvent<Element>) => void;
85
88
  className?: string;
86
89
  type?: React__default.ButtonHTMLAttributes<HTMLButtonElement>['type'];
87
90
  }>;
88
91
  Button: ComponentType<{
89
92
  children: ReactNode;
90
93
  onClick?: (event: React__default.MouseEvent<Element>) => void;
94
+ onContextMenu?: (event: React__default.MouseEvent<Element>) => void;
91
95
  startIcon?: ReactNode;
92
96
  variant?: 'text' | 'outlined' | 'contained';
93
97
  disabled?: boolean;
@@ -282,7 +286,7 @@ interface TableProps<TItem> extends PartialTableTheme<TItem> {
282
286
  /** Allow to drag and drop column separators to resize the column left of it.
283
287
  * @default true
284
288
  */
285
- enableColumnResize?: boolean;
289
+ enableColumnResize?: boolean | 'visualOnly';
286
290
  /** Allow to drag and drop column header to reorder columns.
287
291
  * @default true
288
292
  */
@@ -294,15 +298,26 @@ interface TableProps<TItem> extends PartialTableTheme<TItem> {
294
298
  include?: ('sort' | 'selection' | 'expanded' | 'hiddenColumns' | 'filterValues' | 'columnWidths' | 'columnOrder')[];
295
299
  exclude?: ('sort' | 'selection' | 'expanded' | 'hiddenColumns' | 'filterValues' | 'columnWidths' | 'columnOrder')[];
296
300
  };
301
+ /** The current screen size. Used to determine which columns to display.
302
+ * Either assert the size manually - e.g. "mobile" or "desktop".
303
+ * Or provide a map of screen sizes to maximum pixel widths of the screen.
304
+ * If not provided, <= 400 px will be "mobile", else "desktop".
305
+ *
306
+ * @example
307
+ * displaySize: 'mobile' // assert the size manually
308
+ * displaySize: { mobile: 450, desktop: Infinity } // provide a map of screen sizes
309
+ * */
310
+ displaySize?: DisplaySize | DisplaySizes;
311
+ displaySizeOverrides?: Partial<Record<DisplaySize, Partial<Omit<TableProps<TItem>, 'displaySize' | 'displaySizeOverrides'>>>>;
297
312
  debug?: (...output: any) => void;
298
313
  debugRender?: (...output: any) => void;
299
314
  onReset?: (scope?: 'table' | 'filters') => void;
300
315
  }
301
- type InternalTableProps<TItem> = MemoizedFunctions<Omit<TableProps<TItem>, 'id' | 'parentId' | 'columns' | 'defaultColumnProps' | 'enableExport'> & {
316
+ type InternalTableProps<TItem> = MemoizedFunctions<Omit<TableProps<TItem>, 'id' | 'parentId' | 'columns' | 'defaultColumnProps' | 'displaySizeOverrides'> & {
302
317
  id: (item: TItem) => Id;
303
318
  parentId?: (item: TItem) => Id | undefined;
304
319
  columns: InternalColumn<TItem, unknown>[];
305
- enableExport: boolean | ExportOptions;
320
+ displaySizeOverrides?: Partial<Record<DisplaySize, Partial<Omit<InternalTableProps<TItem>, 'displaySize' | 'displaySizeOverrides'>>>>;
306
321
  }>;
307
322
  type TableItem<TItem = unknown> = {
308
323
  id: Id;
@@ -342,15 +357,19 @@ type Column<TItem, TColumnValue> = {
342
357
  classes?: Omit<NonNullable<TableTheme<TItem>['classes']>, 'table' | 'details'>;
343
358
  /** Provide css styles to override columns styles. */
344
359
  styles?: Omit<NonNullable<TableTheme<TItem>['styles']>, 'table' | 'details'>;
360
+ /** Specify the screen size(s) for which this column should be displayed. */
361
+ displaySize?: DisplaySize | DisplaySize[];
345
362
  };
346
- type InternalColumn<TItem, TColumnValue> = MemoizedFunctions<Required<Omit<Column<TItem, TColumnValue>, 'id' | 'sortBy'>, 'header' | 'exportHeader' | 'renderCell' | 'exportCell' | 'sortBy'> & {
363
+ type InternalColumn<TItem, TColumnValue> = MemoizedFunctions<Required<Omit<Column<TItem, TColumnValue>, 'id' | 'sortBy' | 'displaySize'>, 'header' | 'exportHeader' | 'renderCell' | 'exportCell' | 'sortBy'> & {
347
364
  id: Id;
348
365
  sortBy: ((value: TColumnValue, item: TItem) => unknown)[];
366
+ displaySize: DisplaySize[] | undefined;
349
367
  }>;
350
368
  type Required<T, S> = T & {
351
369
  [P in keyof T as P extends S ? P : never]-?: T[P];
352
370
  };
353
371
  type InternalTableState<TItem> = {
372
+ normalizedProps: InternalTableProps<TItem>;
354
373
  props: InternalTableProps<TItem>;
355
374
  key: any;
356
375
  sort: Sort[];
@@ -364,11 +383,14 @@ type InternalTableState<TItem> = {
364
383
  columnOrder: Id[];
365
384
  columnStyleOverride: Map<Id, CSSProperties>;
366
385
  activeColumns: InternalColumn<TItem, unknown>[];
386
+ visibleColumns: InternalColumn<TItem, unknown>[];
367
387
  items: TableItem<TItem>[];
368
388
  itemsById: Map<Id, TableItem<TItem>>;
369
389
  activeItems: TableItem<TItem>[];
370
390
  activeItemsById: Map<Id, TableItem<TItem>>;
371
391
  lastSelectedId?: Id;
392
+ displaySizePx: number | undefined;
393
+ displaySize: DisplaySize | undefined;
372
394
  };
373
395
  type CommonFilterProps<TItem, TColumnValue, TFilterBy, TFilterValue> = {
374
396
  /** Filter by? By default the column value will be used. If filterBy returns an array, an items will be active if at least one entry matches the active filter. */
@@ -27,6 +27,8 @@ type MemoizedFunctions<T> = {
27
27
  [K in keyof T]: Exclude<T[K], [function: (...args: any[]) => any, ...deps: DependencyList]>;
28
28
  };
29
29
  type CSSInterpolation = Exclude<Interpolation<Theme>, ((...args: any[]) => any) | Array<any>>;
30
+ type DisplaySize = 'desktop' | 'mobile' | (string & {});
31
+ type DisplaySizes = Record<DisplaySize, number>;
30
32
  interface TableTheme<TItem = unknown> {
31
33
  /** Define display texts. */
32
34
  text: {
@@ -82,12 +84,14 @@ interface TableTheme<TItem = unknown> {
82
84
  IconButton: ComponentType<{
83
85
  children: ReactNode;
84
86
  onClick?: (event: React__default.MouseEvent<Element>) => void;
87
+ onContextMenu?: (event: React__default.MouseEvent<Element>) => void;
85
88
  className?: string;
86
89
  type?: React__default.ButtonHTMLAttributes<HTMLButtonElement>['type'];
87
90
  }>;
88
91
  Button: ComponentType<{
89
92
  children: ReactNode;
90
93
  onClick?: (event: React__default.MouseEvent<Element>) => void;
94
+ onContextMenu?: (event: React__default.MouseEvent<Element>) => void;
91
95
  startIcon?: ReactNode;
92
96
  variant?: 'text' | 'outlined' | 'contained';
93
97
  disabled?: boolean;
@@ -282,7 +286,7 @@ interface TableProps<TItem> extends PartialTableTheme<TItem> {
282
286
  /** Allow to drag and drop column separators to resize the column left of it.
283
287
  * @default true
284
288
  */
285
- enableColumnResize?: boolean;
289
+ enableColumnResize?: boolean | 'visualOnly';
286
290
  /** Allow to drag and drop column header to reorder columns.
287
291
  * @default true
288
292
  */
@@ -294,15 +298,26 @@ interface TableProps<TItem> extends PartialTableTheme<TItem> {
294
298
  include?: ('sort' | 'selection' | 'expanded' | 'hiddenColumns' | 'filterValues' | 'columnWidths' | 'columnOrder')[];
295
299
  exclude?: ('sort' | 'selection' | 'expanded' | 'hiddenColumns' | 'filterValues' | 'columnWidths' | 'columnOrder')[];
296
300
  };
301
+ /** The current screen size. Used to determine which columns to display.
302
+ * Either assert the size manually - e.g. "mobile" or "desktop".
303
+ * Or provide a map of screen sizes to maximum pixel widths of the screen.
304
+ * If not provided, <= 400 px will be "mobile", else "desktop".
305
+ *
306
+ * @example
307
+ * displaySize: 'mobile' // assert the size manually
308
+ * displaySize: { mobile: 450, desktop: Infinity } // provide a map of screen sizes
309
+ * */
310
+ displaySize?: DisplaySize | DisplaySizes;
311
+ displaySizeOverrides?: Partial<Record<DisplaySize, Partial<Omit<TableProps<TItem>, 'displaySize' | 'displaySizeOverrides'>>>>;
297
312
  debug?: (...output: any) => void;
298
313
  debugRender?: (...output: any) => void;
299
314
  onReset?: (scope?: 'table' | 'filters') => void;
300
315
  }
301
- type InternalTableProps<TItem> = MemoizedFunctions<Omit<TableProps<TItem>, 'id' | 'parentId' | 'columns' | 'defaultColumnProps' | 'enableExport'> & {
316
+ type InternalTableProps<TItem> = MemoizedFunctions<Omit<TableProps<TItem>, 'id' | 'parentId' | 'columns' | 'defaultColumnProps' | 'displaySizeOverrides'> & {
302
317
  id: (item: TItem) => Id;
303
318
  parentId?: (item: TItem) => Id | undefined;
304
319
  columns: InternalColumn<TItem, unknown>[];
305
- enableExport: boolean | ExportOptions;
320
+ displaySizeOverrides?: Partial<Record<DisplaySize, Partial<Omit<InternalTableProps<TItem>, 'displaySize' | 'displaySizeOverrides'>>>>;
306
321
  }>;
307
322
  type TableItem<TItem = unknown> = {
308
323
  id: Id;
@@ -342,15 +357,19 @@ type Column<TItem, TColumnValue> = {
342
357
  classes?: Omit<NonNullable<TableTheme<TItem>['classes']>, 'table' | 'details'>;
343
358
  /** Provide css styles to override columns styles. */
344
359
  styles?: Omit<NonNullable<TableTheme<TItem>['styles']>, 'table' | 'details'>;
360
+ /** Specify the screen size(s) for which this column should be displayed. */
361
+ displaySize?: DisplaySize | DisplaySize[];
345
362
  };
346
- type InternalColumn<TItem, TColumnValue> = MemoizedFunctions<Required<Omit<Column<TItem, TColumnValue>, 'id' | 'sortBy'>, 'header' | 'exportHeader' | 'renderCell' | 'exportCell' | 'sortBy'> & {
363
+ type InternalColumn<TItem, TColumnValue> = MemoizedFunctions<Required<Omit<Column<TItem, TColumnValue>, 'id' | 'sortBy' | 'displaySize'>, 'header' | 'exportHeader' | 'renderCell' | 'exportCell' | 'sortBy'> & {
347
364
  id: Id;
348
365
  sortBy: ((value: TColumnValue, item: TItem) => unknown)[];
366
+ displaySize: DisplaySize[] | undefined;
349
367
  }>;
350
368
  type Required<T, S> = T & {
351
369
  [P in keyof T as P extends S ? P : never]-?: T[P];
352
370
  };
353
371
  type InternalTableState<TItem> = {
372
+ normalizedProps: InternalTableProps<TItem>;
354
373
  props: InternalTableProps<TItem>;
355
374
  key: any;
356
375
  sort: Sort[];
@@ -364,11 +383,14 @@ type InternalTableState<TItem> = {
364
383
  columnOrder: Id[];
365
384
  columnStyleOverride: Map<Id, CSSProperties>;
366
385
  activeColumns: InternalColumn<TItem, unknown>[];
386
+ visibleColumns: InternalColumn<TItem, unknown>[];
367
387
  items: TableItem<TItem>[];
368
388
  itemsById: Map<Id, TableItem<TItem>>;
369
389
  activeItems: TableItem<TItem>[];
370
390
  activeItemsById: Map<Id, TableItem<TItem>>;
371
391
  lastSelectedId?: Id;
392
+ displaySizePx: number | undefined;
393
+ displaySize: DisplaySize | undefined;
372
394
  };
373
395
  type CommonFilterProps<TItem, TColumnValue, TFilterBy, TFilterValue> = {
374
396
  /** Filter by? By default the column value will be used. If filterBy returns an array, an items will be active if at least one entry matches the active filter. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "schummar-table",
3
- "version": "0.43.1",
3
+ "version": "0.44.1",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "repository": "schummar/schummar-table",