@sylwellsoftware/fray 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -27
- package/colors/README.md +28 -13
- package/colors/gray/colors.css +54 -26
- package/colors/green/colors.css +54 -26
- package/colors/iceblue/colors.css +54 -26
- package/colors/ocean/colors.css +54 -26
- package/colors/orange/colors.css +54 -26
- package/colors/purple/colors.css +54 -26
- package/colors/red/colors.css +54 -26
- package/colors/yellow/colors.css +54 -26
- package/dist/Components/data/descriptionList.d.ts.map +1 -1
- package/dist/Components/data/listview/listview.d.ts.map +1 -1
- package/dist/Components/data/table/DataTable.d.ts.map +1 -1
- package/dist/Components/data/table/FilterPanel.d.ts.map +1 -1
- package/dist/Components/data/table/TableHeaderCell.d.ts.map +1 -1
- package/dist/Components/data/treeview/treeview.d.ts.map +1 -1
- package/dist/Components/dialog/dialog.d.ts.map +1 -1
- package/dist/Components/layout/panel.d.ts +0 -1
- package/dist/Components/layout/panel.d.ts.map +1 -1
- package/dist/Components/layout/sidebar.d.ts +0 -1
- package/dist/Components/layout/sidebar.d.ts.map +1 -1
- package/dist/Components/layout/tabpanel/tabline.d.ts.map +1 -1
- package/dist/Components/layout/tabpanel/tabpanel.d.ts.map +1 -1
- package/dist/Components/lineinputs/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/Components/lineinputs/dropdown.d.ts.map +1 -1
- package/dist/Components/lineinputs/textbox.d.ts.map +1 -1
- package/dist/Components/lineinputs/toggle.d.ts.map +1 -1
- package/dist/Components/menu/toolbar.d.ts +0 -1
- package/dist/Components/menu/toolbar.d.ts.map +1 -1
- package/dist/Components/status/progressBar.d.ts.map +1 -1
- package/dist/Components/theme/stylesheetPicker.d.ts.map +1 -1
- package/dist/index.js +1214 -1409
- package/dist/index.js.map +1 -1
- package/dist/{jsx-dev-runtime-pzseD2Sz.js → jsx-dev-runtime-CqunwZ8j.js} +404 -486
- package/dist/jsx-dev-runtime-CqunwZ8j.js.map +1 -0
- package/dist/jsx-dev-runtime.js +1 -1
- package/dist/jsx-runtime.js +1 -1
- package/dist/styling/baseStyleDefinitions.d.ts +0 -82
- package/dist/styling/baseStyleDefinitions.d.ts.map +1 -1
- package/dist/styling/theme.d.ts +3 -3
- package/dist/styling/theme.d.ts.map +1 -1
- package/package.json +3 -3
- package/styles/structural.css +72 -413
- package/themes/README.md +68 -66
- package/themes/dark.css +48 -1
- package/themes/java/theme.css +410 -135
- package/themes/light.css +48 -1
- package/themes/minimal/theme.css +408 -125
- package/themes/shiny/theme.css +484 -294
- package/dist/jsx-dev-runtime-pzseD2Sz.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/Components/layout/tabpanel/tab.ts","../src/util/filterMode.ts","../src/Components/controlUtils.ts","../src/Components/layout/tabpanel/tabline.tsx","../src/Components/layout/tabpanel/tabpanel.tsx","../src/Components/layout/panel.tsx","../src/Components/layout/sidebar.tsx","../src/Components/layout/splitView.tsx","../src/Components/data/descriptionList.tsx","../src/Components/Placeholder.tsx","../src/Components/data/filterState.ts","../src/Components/data/selectionhandler.ts","../src/Components/data/listview/listview.tsx","../src/Components/lineinputs/checkbox/Checkbox.tsx","../src/Components/data/table/FilterPanel.tsx","../src/Components/data/table/TableHeaderCell.tsx","../src/Components/data/table/TableHeader.tsx","../src/Components/data/table/tableQuery.ts","../src/Components/data/table/tableDataSource.ts","../src/Components/data/table/DataTable.tsx","../src/Components/data/treeview/treeitem.tsx","../src/Components/data/treeview/treeModel.ts","../src/Components/data/treeview/treeview.tsx","../src/Components/menu/button.tsx","../src/Components/dialog/dialog.tsx","../src/Components/lineinputs/checkbox/QuadCheckbox.ts","../src/Components/lineinputs/checkbox/TriCheckbox.ts","../src/Components/lineinputs/dropdown.tsx","../src/Components/lineinputs/textbox.tsx","../src/Components/lineinputs/toggle.tsx","../src/Components/menu/toolbar.tsx","../src/Components/status/progressBar.tsx","../src/styling/theme.ts","../src/Components/theme/stylesheetPicker.tsx"],"sourcesContent":["import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\n\nexport interface TabProps extends ComponentProps {\n id?: Key\n label?: FrayChild\n disabled?: boolean\n}\n\n/** Declarative content marker consumed by TabPanel. */\nexport class Tab extends Component<TabProps> {\n render(): FrayChild {\n return this.props.children ?? []\n }\n}\n","/** Represents the filter mode for a query. */\nexport const FilterMode = {\n /** Deny mode: Excludes items that match the filter. */\n Deny: 'deny',\n /** Require mode: Includes only items that match the filter. */\n Require: 'require',\n /** Prefer mode: If there are any filter options that are set to Prefer, at least one of the preferred filter options must match. Otherwise, it is treated as Neutral. */\n Prefer: 'prefer',\n /** Neutral mode: Does not affect the inclusion or exclusion of items. */\n Neutral: 'neutral',\n} as const\n\nexport type FilterModeValue = typeof FilterMode[keyof typeof FilterMode]\n\n/** Return whether a value is one of Fray's semantic filter modes. */\nexport function isFilterMode(value: unknown): value is FilterModeValue {\n return Object.values(FilterMode).some((mode) => mode === value)\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {EmitterOptions, ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport type {Component, ComponentProps} from './component.js'\nimport {isFilterMode} from '../util/filterMode.js'\n\nexport interface ValueEmitter<TValue> extends ReadableEmitter<TValue, unknown> {\n set(value: TValue, eventOrCause?: unknown): boolean\n}\n\nexport interface ValueControlProps<TValue> extends ComponentProps {\n valueEmitter?: ValueEmitter<TValue>\n value?: TValue\n defaultValue?: TValue\n initialValue?: TValue\n}\n\nlet nextControlId = 1\n\nexport function controlId(prefix: string, provided?: string | number | null): string {\n if (provided != null && String(provided).length > 0) return String(provided)\n return `fray-${prefix}-${nextControlId++}`\n}\n\nexport function createValueEmitter<TValue>(\n component: Component,\n props: ValueControlProps<TValue>,\n fallback: TValue,\n purpose: string,\n): ValueEmitter<TValue> {\n if (props.valueEmitter != null) {\n assertEmitter<TValue>(props.valueEmitter, 'valueEmitter')\n return props.valueEmitter\n }\n const initialValue = props.defaultValue\n ?? props.value\n ?? props.initialValue\n ?? fallback\n const options: EmitterOptions<TValue> = {owner: component, purpose}\n return new Emitter(initialValue, options)\n}\n\nexport function assertEmitter<TValue = unknown>(\n value: unknown,\n name = 'emitter',\n): asserts value is ValueEmitter<TValue> {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'get') !== 'function'\n || typeof Reflect.get(value, 'set') !== 'function'\n || typeof Reflect.get(value, 'subscribe') !== 'function') {\n throw new TypeError(`${name} must be an emitter`)\n }\n}\n\nexport function classNames(...values: unknown[]): string {\n return values\n .flatMap((value) => typeof value === 'string' ? value.split(/\\s+/) : [])\n .filter(Boolean)\n .join(' ')\n}\n\nexport function componentClass(props: Pick<ComponentProps, 'class' | 'className'>): string {\n return props.className ?? props.class ?? ''\n}\n\nexport function invoke<TArguments extends unknown[]>(\n callback: ((...args: TArguments) => void) | null | undefined,\n ...args: TArguments\n): void {\n if (callback == null) return\n if (typeof callback !== 'function') throw new TypeError('Control callback must be a function')\n callback(...args)\n}\n\nexport function assertOptions<TOption>(\n options: unknown,\n name = 'options',\n): asserts options is TOption[] {\n if (!Array.isArray(options)) throw new TypeError(`${name} must be an array`)\n}\n\nexport function describeState(value: unknown): string {\n if (isFilterMode(value)) return value\n return String(value)\n}\n","import {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport {\n componentClass,\n createValueEmitter,\n invoke,\n} from '../../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../../controlUtils.js'\n\nexport interface TabLineTab {\n id: Key\n label?: FrayChild\n disabled?: boolean\n}\n\nexport interface TabLineProps extends ValueControlProps<Key | null> {\n tabs?: readonly TabLineTab[]\n activeTabEmitter?: ValueEmitter<Key | null>\n initialActiveTabId?: Key | null\n label?: string\n baseId?: string\n onChange?: (value: Key, event: Event | null) => void\n}\n\nexport class TabLine extends Component<TabLineProps> {\n readonly valueEmitter: ValueEmitter<Key | null>\n readonly activeTabEmitter: ValueEmitter<Key | null>\n\n constructor(props: TabLineProps = {}) {\n super(props)\n const tabs = props.tabs ?? []\n validateTabs(tabs)\n const emitterProps: TabLineProps = {...props}\n if (emitterProps.valueEmitter == null && props.activeTabEmitter != null) {\n emitterProps.valueEmitter = props.activeTabEmitter\n }\n if (emitterProps.defaultValue == null && props.initialActiveTabId != null) {\n emitterProps.defaultValue = props.initialActiveTabId\n }\n this.valueEmitter = createValueEmitter<Key | null>(\n this,\n emitterProps,\n tabs.find((tab) => !tab.disabled)?.id ?? null,\n 'active tab',\n )\n this.activeTabEmitter = this.valueEmitter\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n selectTab(tab: TabLineTab | undefined, event: Event | null = null): void {\n if (tab == null || tab.disabled) return\n this.valueEmitter.set(tab.id, 'tab selected')\n invoke(this.props.onChange, tab.id, event)\n }\n\n render(): FrayChild {\n const {tabs = [], label = 'Sections', baseId = 'fray-tabs'} = this.props\n validateTabs(tabs)\n const activeTabId = this.valueEmitter.get()\n\n const Host = this.Host\n return <Host\n role=\"tablist\"\n className={componentClass(this.props) || null}\n aria-label={label}\n >\n {tabs.map((tab, index) => <button\n key={String(tab.id)}\n id={tabButtonId(baseId, tab.id)}\n type=\"button\"\n role=\"tab\"\n disabled={Boolean(tab.disabled)}\n data-part=\"tab\"\n aria-selected={Object.is(activeTabId, tab.id) ? 'true' : 'false'}\n aria-controls={tabPanelId(baseId, tab.id)}\n tabIndex={Object.is(activeTabId, tab.id) ? 0 : -1}\n onClick={(event: MouseEvent) => this.selectTab(tab, event)}\n onKeyDown={(event: KeyboardEvent) => this.handleKeyDown(event, index, tabs)}\n >{tab.label ?? String(tab.id)}</button>)}\n </Host>\n }\n\n handleKeyDown(event: KeyboardEvent, index: number, tabs: readonly TabLineTab[]): void {\n const enabled = tabs\n .map((tab, tabIndex) => ({tab, tabIndex}))\n .filter(({tab}) => !tab.disabled)\n if (enabled.length === 0) return\n const current = Math.max(0,\n enabled.findIndex(({tabIndex}) => tabIndex === index))\n let next: {tab: TabLineTab; tabIndex: number} | undefined\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n next = enabled[(current + 1) % enabled.length]\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n next = enabled[(current - 1 + enabled.length) % enabled.length]\n } else if (event.key === 'Home') next = enabled[0]\n else if (event.key === 'End') next = enabled.at(-1)\n else return\n\n if (next == null) return\n event.preventDefault()\n this.selectTab(next.tab, event)\n if (this.dom instanceof Element) {\n const tab = this.dom.querySelectorAll<HTMLElement>('[role=\"tab\"]')[next.tabIndex]\n tab?.focus()\n }\n }\n\n static override hostName = 'tab-line'\n static override standaloneHostName = 'tab-line'\n\n static baseStyles = [\n ['& > [data-part=\"tab\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n & {\n display: flex;\n flex-flow: row wrap;\n padding-top: 3px;\n background: var(--fray-tabline-background, var(--tabline-bg));\n }\n\n & > [data-part=\"tab\"] {\n background: var(--fray-tab-button-background, var(--fray-button-background));\n border-radius: var(--fray-radius-md, var(--ui-border-radius)) var(--fray-radius-md, var(--ui-border-radius)) 0 0;\n }\n\n & > [data-part=\"tab\"][aria-selected=\"true\"] {\n background: var(\n --fray-tab-button-background-active,\n var(--fray-tab-active-background, var(--tab-bg-active))\n );\n }\n `\n}\n\nexport function tabButtonId(baseId: string, id: Key): string {\n return `${baseId}-tab-${safeId(id)}`\n}\n\nexport function tabPanelId(baseId: string, id: Key): string {\n return `${baseId}-panel-${safeId(id)}`\n}\n\nfunction safeId(value: Key): string {\n return encodeURIComponent(String(value)).replaceAll('%', '-')\n}\n\nfunction validateTabs(tabs: unknown): asserts tabs is readonly TabLineTab[] {\n if (!Array.isArray(tabs)) throw new TypeError('TabLine tabs must be an array')\n const ids = new Set<Key>()\n for (const tab of tabs) {\n if (tab == null || tab.id == null) throw new TypeError('Each tab requires an id')\n if (ids.has(tab.id)) throw new Error(`Duplicate tab id: ${String(tab.id)}`)\n ids.add(tab.id)\n }\n}\n","import {Component, css, isVNode} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n} from '../../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../../controlUtils.js'\nimport {Tab} from './tab.js'\nimport type {TabProps} from './tab.js'\nimport {TabLine, tabButtonId, tabPanelId} from './tabline.js'\n\nexport interface TabDefinition {\n id: Key\n label?: FrayChild\n disabled?: boolean\n content?: FrayChild\n component?: FrayChild\n}\n\nexport interface TabPanelProps extends ValueControlProps<Key | null> {\n id?: string | number | null\n tabs?: readonly TabDefinition[]\n activeTabEmitter?: ValueEmitter<Key | null>\n initialActiveTabId?: Key | null\n label?: string\n onChange?: (value: Key, event: Event | null) => void\n}\n\ninterface NormalizedTab {\n id: Key\n label: FrayChild\n disabled: boolean\n content: FrayChild\n}\n\nexport class TabPanel extends Component<TabPanelProps> {\n readonly valueEmitter: ValueEmitter<Key | null>\n readonly activeTabEmitter: ValueEmitter<Key | null>\n readonly baseId: string\n\n constructor(props: TabPanelProps = {}) {\n super(props)\n const tabs = extractTabs(props)\n const emitterProps: TabPanelProps = {...props}\n if (emitterProps.valueEmitter == null && props.activeTabEmitter != null) {\n emitterProps.valueEmitter = props.activeTabEmitter\n }\n if (emitterProps.defaultValue == null && props.initialActiveTabId != null) {\n emitterProps.defaultValue = props.initialActiveTabId\n }\n this.valueEmitter = createValueEmitter<Key | null>(\n this,\n emitterProps,\n tabs.find((tab) => !tab.disabled)?.id ?? null,\n 'active tab',\n )\n this.activeTabEmitter = this.valueEmitter\n this.baseId = controlId('tabs', props.id)\n }\n\n initialize(): void {\n const tabs = extractTabs(this.props)\n if (!tabs.some(({id}) => Object.is(id, this.valueEmitter.get()))) {\n this.valueEmitter.set(tabs.find((tab) => !tab.disabled)?.id ?? null)\n }\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: TabPanelProps): this {\n super.setProps(nextProps)\n const tabs = extractTabs(nextProps)\n if (!tabs.some(({id}) => Object.is(id, this.valueEmitter.get()))) {\n this.valueEmitter.set(tabs.find((tab) => !tab.disabled)?.id ?? null)\n }\n return this\n }\n\n render(): FrayChild {\n const tabs = extractTabs(this.props)\n const selected = tabs.find(({id}) => Object.is(id, this.valueEmitter.get()))\n ?? tabs.find((tab) => !tab.disabled)\n ?? null\n const Host = this.Host\n return <Host\n id={this.baseId}\n className={componentClass(this.props) || null}\n >\n <TabLine\n key=\"tab-list\"\n tabs={tabs.map(({id, label, disabled}) => ({id, label, disabled}))}\n valueEmitter={this.valueEmitter}\n baseId={this.baseId}\n {...(this.props.label == null ? {} : {label: this.props.label})}\n {...(this.props.onChange == null ? {} : {onChange: this.props.onChange})}\n />\n {selected == null ? null : <div\n key={String(selected.id)}\n id={tabPanelId(this.baseId, selected.id)}\n role=\"tabpanel\"\n data-part=\"content\"\n aria-labelledby={tabButtonId(this.baseId, selected.id)}\n tabIndex={0}\n >{selected.content}</div>}\n </Host>\n }\n\n static dependencies = [TabLine, Tab]\n\n static override hostName = 'tab-panel'\n static override standaloneHostName = 'tab-panel'\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 0;\n overflow: hidden;\n background: var(--fray-panel-background, var(--panel-bg, transparent));\n border-radius: var(--fray-panel-radius, var(--panel-radius));\n box-shadow: var(--fray-panel-shadow, var(--panel-shadow, none));\n }\n\n & > [data-part=\"content\"] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: auto;\n background: var(--fray-panel-background, var(--panel-bg, transparent));\n }\n `\n}\n\nfunction extractTabs(props: TabPanelProps): NormalizedTab[] {\n const direct = props.tabs ?? []\n if (!Array.isArray(direct)) throw new TypeError('TabPanel tabs must be an array')\n const children = Array.isArray(props.children)\n ? props.children\n : props.children == null ? [] : [props.children]\n const declarative: NormalizedTab[] = children\n .filter((child) => isVNode(child) && child.type === Tab)\n .map((child, index) => {\n if (!isVNode(child)) throw new TypeError('TabPanel children must be Tab nodes')\n // The preceding vnode type check identifies the declarative Tab;\n // its public constructor contract supplies the corresponding props.\n const tabProps = child.props as TabProps\n return {\n id: tabProps.id ?? `tab-${index + 1}`,\n label: tabProps.label ?? `Tab ${index + 1}`,\n disabled: Boolean(tabProps.disabled),\n content: tabProps.children ?? [],\n }\n })\n const tabs: NormalizedTab[] = direct.length > 0\n ? direct.map((tab: TabDefinition) => ({\n ...tab,\n label: tab.label ?? String(tab.id),\n disabled: Boolean(tab.disabled),\n content: tab.content ?? tab.component ?? [],\n }))\n : declarative\n const ids = new Set<Key>()\n for (const tab of tabs) {\n if (tab?.id == null) throw new TypeError('Each tab requires an id')\n if (ids.has(tab.id)) throw new Error(`Duplicate tab id: ${String(tab.id)}`)\n ids.add(tab.id)\n }\n return tabs\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nexport interface PanelProps extends ComponentProps {\n id?: string | number | null\n header?: FrayChild\n toolbar?: FrayChild\n orientation?: 'horizontal' | 'vertical'\n disabled?: boolean\n}\n\nexport class Panel extends Component<PanelProps> {\n readonly panelId: string\n readonly headerId: string\n\n constructor(props: PanelProps = {}) {\n super(props)\n this.panelId = controlId('panel', props.id)\n this.headerId = `${this.panelId}-title`\n }\n\n render() {\n const {\n header = null,\n toolbar = null,\n children = [],\n orientation = 'vertical',\n disabled = false,\n } = this.props\n if (!['horizontal', 'vertical'].includes(orientation)) {\n throw new TypeError('Panel orientation must be horizontal or vertical')\n }\n\n const Host = this.Host\n const title = header == null\n ? null\n : <header data-part=\"header\">\n {typeof header === 'string' || typeof header === 'number'\n ? <h2 id={this.headerId}>{header}</h2>\n : <div id={this.headerId}>{header}</div>}\n </header>\n\n return <Host\n id={this.panelId}\n role={header == null ? null : 'region'}\n className={componentClass(this.props) || null}\n data-orientation={orientation}\n data-disabled={disabled ? '' : null}\n aria-disabled={disabled ? 'true' : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {toolbar}\n <div data-part=\"content\" data-orientation={orientation}>{children}</div>\n </Host>\n }\n\n static override hostName = 'panel'\n static override standaloneHostName = 'layout-panel'\n\n static baseStyles = [\n ['&', ['panel']],\n ['& > [data-part=\"header\"]', ['sectionheader']],\n ]\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n overflow: auto;\n flex: 0 0 auto;\n }\n\n & > [data-part=\"header\"] h2 {\n margin: 0;\n font: inherit;\n }\n\n & > [data-part=\"header\"] {\n background: var(\n --fray-panel-header-background,\n var(--fray-section-header-background, var(--fray-header-background))\n );\n color: var(\n --fray-panel-header-color,\n var(--fray-section-header-color, var(--fray-header-color))\n );\n border: var(--fray-section-header-border, var(--fray-header-border));\n box-shadow: var(--fray-section-header-shadow, var(--fray-header-shadow));\n }\n\n & > [data-part=\"content\"] {\n display: flex;\n flex: 1;\n overflow: auto;\n padding: var(--panel-padding, 0.75rem);\n gap: var(--spacing-medium, 1rem);\n }\n\n & > [data-part=\"content\"][data-orientation=\"horizontal\"] {\n flex-direction: row;\n }\n\n & > [data-part=\"content\"][data-orientation=\"vertical\"] {\n flex-direction: column;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nexport interface SidebarProps extends ComponentProps {\n id?: string | number | null\n header?: FrayChild\n toolbar?: FrayChild\n ariaLabel?: string\n}\n\n/** Labelled side region whose content owns vertical scrolling. */\nexport class Sidebar extends Component<SidebarProps> {\n readonly sidebarId: string\n readonly headerId: string\n\n constructor(props: SidebarProps = {}) {\n super(props)\n this.sidebarId = controlId('sidebar', props.id)\n this.headerId = `${this.sidebarId}-title`\n }\n\n render(): FrayChild {\n const {\n header = null,\n toolbar = null,\n ariaLabel,\n children = [],\n } = this.props\n const title = header == null\n ? null\n : <header data-part=\"header\">\n {typeof header === 'string' || typeof header === 'number'\n ? <h2 id={this.headerId}>{header}</h2>\n : <div id={this.headerId}>{header}</div>}\n </header>\n\n return <aside\n id={this.sidebarId}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"sidebar\"\n aria-label={header == null ? ariaLabel : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {toolbar == null ? null : <div data-part=\"toolbar\">{toolbar}</div>}\n <div data-part=\"content\" tabIndex={0}>{children}</div>\n </aside>\n }\n\n static baseStyles = [\n ['aside[data-fray-component=\"sidebar\"]', ['panel']],\n ['aside[data-fray-component=\"sidebar\"] > [data-part=\"header\"]', ['sectionheader']],\n ]\n\n static css = css`\n aside[data-fray-component=\"sidebar\"] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n aside[data-fray-component=\"sidebar\"] > [data-part=\"header\"],\n aside[data-fray-component=\"sidebar\"] > [data-part=\"toolbar\"] {\n flex: 0 0 auto;\n }\n\n aside[data-fray-component=\"sidebar\"] > [data-part=\"header\"] h2 {\n margin: 0;\n font: inherit;\n }\n\n aside[data-fray-component=\"sidebar\"] > [data-part=\"content\"] {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\nexport interface SplitViewProps extends ComponentProps {\n primary?: FrayChild\n secondary?: FrayChild\n direction?: 'horizontal' | 'vertical'\n primarySize?: string\n primaryLabel?: string\n secondaryLabel?: string\n}\n\n/** Two-pane layout with explicit overflow ownership and no resizing behavior. */\nexport class SplitView extends Component<SplitViewProps> {\n render(): FrayChild {\n const {\n primary = null,\n secondary = null,\n direction = 'horizontal',\n primarySize,\n primaryLabel,\n secondaryLabel,\n } = this.props\n if (direction !== 'horizontal' && direction !== 'vertical') {\n throw new TypeError('SplitView direction must be horizontal or vertical')\n }\n if (primarySize != null && (typeof primarySize !== 'string' || primarySize.length === 0)) {\n throw new TypeError('SplitView primarySize must be a non-empty CSS size')\n }\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-direction={direction}\n style={primarySize == null ? undefined : {'--split-primary-size': primarySize}}\n >\n <div\n data-part=\"primary\"\n role={primaryLabel == null ? null : 'region'}\n aria-label={primaryLabel}\n >{primary}</div>\n <div\n data-part=\"secondary\"\n role={secondaryLabel == null ? null : 'region'}\n aria-label={secondaryLabel}\n >{secondary ?? this.props.children ?? []}</div>\n </Host>\n }\n\n static override hostName = 'split-view'\n static override standaloneHostName = 'split-view'\n\n static css = css`\n & {\n display: grid;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n &[data-direction=\"horizontal\"] {\n grid-template-columns:\n var(--split-primary-size, minmax(16rem, 0.8fr))\n minmax(0, 1.2fr);\n }\n\n &[data-direction=\"vertical\"] {\n grid-template-rows:\n var(--split-primary-size, minmax(12rem, 0.8fr))\n minmax(0, 1.2fr);\n }\n\n & > [data-part] {\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n &[data-direction=\"horizontal\"] > [data-part=\"primary\"] {\n border-inline-end: 1px solid var(--ui-border-color);\n }\n\n &[data-direction=\"vertical\"] > [data-part=\"primary\"] {\n border-block-end: 1px solid var(--ui-border-color);\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\nexport interface DescriptionItemProps extends ComponentProps {\n term: FrayChild\n value?: FrayChild\n}\n\n/** A term/value group with standards-valid `dl` children. */\nexport class DescriptionItem extends Component<DescriptionItemProps> {\n render(): FrayChild {\n const {term, value, children = []} = this.props\n return <div\n className={componentClass(this.props) || undefined}\n data-fray-component=\"description-item\"\n >\n <dt>{term}</dt>\n <dd>{value ?? children}</dd>\n </div>\n }\n\n static css = css`\n div[data-fray-component=\"description-item\"] {\n display: grid;\n grid-template-columns: minmax(7rem, 0.7fr) minmax(0, 1.3fr);\n gap: var(--spacing-small, 0.5rem);\n padding-block: var(--spacing-small, 0.5rem);\n border-block-end: 1px solid var(--ui-border-color);\n }\n\n div[data-fray-component=\"description-item\"] > dt {\n color: var(--ui-muted-text-color, var(--ui-text-color));\n font-weight: 600;\n }\n\n div[data-fray-component=\"description-item\"] > dd {\n min-width: 0;\n margin: 0;\n overflow-wrap: anywhere;\n }\n\n @media (max-width: 36rem) {\n div[data-fray-component=\"description-item\"] {\n grid-template-columns: minmax(0, 1fr);\n gap: 0.15rem;\n }\n }\n `\n}\n\nexport interface DescriptionListProps extends ComponentProps {\n label?: string\n}\n\n/** Semantic description-list container for compact record summaries. */\nexport class DescriptionList extends Component<DescriptionListProps> {\n render(): FrayChild {\n return <dl\n className={componentClass(this.props) || undefined}\n data-fray-component=\"description-list\"\n aria-label={this.props.label}\n >{this.props.children ?? []}</dl>\n }\n\n static dependencies = [DescriptionItem]\n\n static css = css`\n dl[data-fray-component=\"description-list\"] {\n display: grid;\n margin: 0;\n }\n `\n}\n","import {Component, css} from './component.js'\nimport type {ComponentProps} from './component.js'\n\nexport interface PlaceholderProps extends ComponentProps {\n width?: number | string\n}\n\n/** Deterministic loading placeholder for data components. */\nexport class Placeholder extends Component<PlaceholderProps> {\n render() {\n const width = normalizeWidth(this.props.width ?? 65)\n const Host = this.Host\n return <Host style={{width: `${width}%`}} aria-hidden=\"true\" />\n }\n\n static override hostName = 'placeholder'\n static override standaloneHostName = 'loading-placeholder'\n\n static baseStyles = [\n ['&::after', ['after', 'working']],\n ]\n\n static css = css`\n & {\n display: block;\n min-width: 3rem;\n height: 1em;\n overflow: hidden;\n background: currentColor;\n border-radius: var(--ui-border-radius);\n opacity: 0.18;\n position: relative;\n }\n\n @keyframes fray-placeholder-progress {\n from { background-position: 0 0; }\n to { background-position: 2rem 0; }\n }\n `\n}\n\nfunction normalizeWidth(width: number | string): number {\n const numeric = Number(width)\n if (!Number.isFinite(numeric)) throw new TypeError('Placeholder width must be numeric')\n return Math.min(100, Math.max(10, numeric))\n}\n","import {DerivedEmitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {FilterMode, isFilterMode} from '../../util/filterMode.js'\nimport type {FilterModeValue} from '../../util/filterMode.js'\n\nexport type FilterOptionState = Readonly<Record<string, FilterModeValue>>\nexport type FilterState = Readonly<Record<string, FilterOptionState>>\n\nexport interface SerializedFilterState {\n readonly version: 1\n readonly dimensions: Record<string, Record<string, FilterModeValue>>\n}\n\nexport interface FilterOptionDefinition<TItem> {\n /** Stable persisted identity within its dimension. */\n key: string\n matches: (item: TItem) => boolean\n}\n\nexport interface FilterDimensionDefinition<TItem> {\n /** Stable persisted identity for the dimension. */\n key: string\n options: readonly FilterOptionDefinition<TItem>[]\n}\n\n/**\n * Test an item against semantic filter state.\n *\n * Dimensions combine with AND. Within one dimension, deny wins, every required\n * option must match, and at least one preferred option must match when any are\n * active. Unknown persisted dimensions and options are retained by\n * serialization but do not constrain matching.\n */\nexport function matchesFilterState<TItem>(\n item: TItem,\n state: FilterState,\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n): boolean {\n assertDefinitions(dimensions)\n for (const dimension of dimensions) {\n const optionState = state[dimension.key]\n if (optionState == null) continue\n const active = dimension.options.flatMap((option) => {\n const mode = optionState[option.key]\n return mode == null || mode === FilterMode.Neutral ? [] : [{option, mode}]\n })\n if (active.some(({option, mode}) => mode === FilterMode.Deny && option.matches(item))) {\n return false\n }\n const required = active.filter(({mode}) => mode === FilterMode.Require)\n if (required.some(({option}) => !option.matches(item))) {\n return false\n }\n const preferred = active.filter(({mode}) => mode === FilterMode.Prefer)\n if (preferred.length > 0 && !preferred.some(({option}) => option.matches(item))) {\n return false\n }\n }\n return true\n}\n\nexport function filterByState<TItem>(\n items: readonly TItem[],\n state: FilterState,\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n): TItem[] {\n if (!Array.isArray(items)) throw new TypeError('Filtered items must be an array')\n return items.filter((item) => matchesFilterState(item, state, dimensions))\n}\n\n/** Derive a reusable predicate without giving Fray ownership of persistence. */\nexport function deriveFilterPredicate<TItem>(\n state: ReadableEmitter<FilterState, unknown>,\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n owner: unknown = null,\n): DerivedEmitter<(item: TItem) => boolean, readonly [ReadableEmitter<FilterState, unknown>]> {\n assertDefinitions(dimensions)\n return new DerivedEmitter(\n [state] as const,\n ([current]) => (item: TItem) => matchesFilterState(item, current, dimensions),\n {owner, purpose: 'filter predicate'},\n )\n}\n\n/** Derive a filtered collection from application-owned items and filter state. */\nexport function deriveFilteredItems<TItem>(\n items: ReadableEmitter<readonly TItem[], unknown>,\n state: ReadableEmitter<FilterState, unknown>,\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n owner: unknown = null,\n): DerivedEmitter<\n TItem[],\n readonly [ReadableEmitter<readonly TItem[], unknown>, ReadableEmitter<FilterState, unknown>]\n> {\n assertDefinitions(dimensions)\n return new DerivedEmitter(\n [items, state] as const,\n ([currentItems, currentState]) => filterByState(currentItems, currentState, dimensions),\n {owner, purpose: 'filtered items'},\n )\n}\n\n/** Convert state to deterministic, versioned, plain JSON-compatible data. */\nexport function serializeFilterState(state: FilterState): SerializedFilterState {\n assertFilterState(state)\n const dimensions: Record<string, Record<string, FilterModeValue>> = {}\n for (const dimensionKey of Object.keys(state).sort()) {\n const options: Record<string, FilterModeValue> = {}\n const dimension = state[dimensionKey]!\n for (const optionKey of Object.keys(dimension).sort()) {\n options[optionKey] = dimension[optionKey]!\n }\n dimensions[dimensionKey] = options\n }\n return {version: 1, dimensions}\n}\n\n/** Validate and restore versioned filter data. Unknown keys are preserved. */\nexport function parseFilterState(value: unknown): FilterState {\n if (!isRecord(value) || value.version !== 1 || !isRecord(value.dimensions)) {\n throw new TypeError('Filter state must use version 1 with a dimensions object')\n }\n const state: Record<string, Record<string, FilterModeValue>> = {}\n for (const [dimensionKey, rawOptions] of Object.entries(value.dimensions)) {\n assertKey(dimensionKey, 'Filter dimension')\n if (!isRecord(rawOptions)) {\n throw new TypeError(`Filter dimension ${dimensionKey} must be an object`)\n }\n const options: Record<string, FilterModeValue> = {}\n for (const [optionKey, mode] of Object.entries(rawOptions)) {\n assertKey(optionKey, `Filter option in ${dimensionKey}`)\n if (!isFilterMode(mode)) {\n throw new TypeError(\n `Unknown filter mode for ${dimensionKey}.${optionKey}: ${String(mode)}`,\n )\n }\n options[optionKey] = mode\n }\n state[dimensionKey] = options\n }\n return state\n}\n\nfunction assertFilterState(value: unknown): asserts value is FilterState {\n if (!isRecord(value)) throw new TypeError('Filter state must be an object')\n for (const [dimensionKey, options] of Object.entries(value)) {\n assertKey(dimensionKey, 'Filter dimension')\n if (!isRecord(options)) {\n throw new TypeError(`Filter dimension ${dimensionKey} must be an object`)\n }\n for (const [optionKey, mode] of Object.entries(options)) {\n assertKey(optionKey, `Filter option in ${dimensionKey}`)\n if (!isFilterMode(mode)) {\n throw new TypeError(\n `Unknown filter mode for ${dimensionKey}.${optionKey}: ${String(mode)}`,\n )\n }\n }\n }\n}\n\nfunction assertDefinitions<TItem>(\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n): void {\n if (!Array.isArray(dimensions)) throw new TypeError('Filter dimensions must be an array')\n const dimensionKeys = new Set<string>()\n for (const dimension of dimensions) {\n assertKey(dimension.key, 'Filter dimension')\n if (dimensionKeys.has(dimension.key)) {\n throw new Error(`Duplicate filter dimension: ${dimension.key}`)\n }\n dimensionKeys.add(dimension.key)\n if (!Array.isArray(dimension.options)) {\n throw new TypeError(`Filter dimension ${dimension.key} options must be an array`)\n }\n const optionKeys = new Set<string>()\n for (const option of dimension.options) {\n assertKey(option.key, `Filter option in ${dimension.key}`)\n if (optionKeys.has(option.key)) {\n throw new Error(`Duplicate filter option: ${dimension.key}.${option.key}`)\n }\n optionKeys.add(option.key)\n if (typeof option.matches !== 'function') {\n throw new TypeError(`Filter matcher ${dimension.key}.${option.key} must be a function`)\n }\n }\n }\n}\n\nfunction assertKey(value: string, name: string): void {\n if (value.length === 0 || value === '__proto__' || value === 'prototype'\n || value === 'constructor') {\n throw new TypeError(`${name} key is not safe for persisted state`)\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {\n EmitterNotification,\n SubscribeOptions,\n} from '@sylwellsoftware/glue'\n\nimport type {ValueEmitter} from '../controlUtils.js'\n\nexport type ItemKeyGetter<TItem> = (item: TItem, index: number) => unknown\n\ninterface SelectionHandlerCommonConfig<TItem> {\n getItems: () => readonly TItem[]\n getKey?: ItemKeyGetter<TItem>\n owner?: unknown\n}\n\nexport interface SingleSelectionHandlerConfig<TItem>\nextends SelectionHandlerCommonConfig<TItem> {\n multiSelect?: false\n selectedItemEmitter?: ValueEmitter<TItem | null>\n selectedItemsEmitter?: never\n}\n\nexport interface MultiSelectionHandlerConfig<TItem>\nextends SelectionHandlerCommonConfig<TItem> {\n multiSelect: true\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n selectedItemEmitter?: never\n}\n\nexport type SelectionHandlerConfig<TItem> =\n | SingleSelectionHandlerConfig<TItem>\n | MultiSelectionHandlerConfig<TItem>\n\ninterface BaseSelectionHandlerConfig<TItem> extends SelectionHandlerCommonConfig<TItem> {\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n}\n\ntype SelectionEvent = MouseEvent | KeyboardEvent\n\n/**\n * DOM selection behavior backed by an explicit row-data provider.\n *\n * Construction is side-effect free. Row listeners are installed by\n * `rowsUpdated()` and are always released before the next row set is wired.\n */\nexport class BaseSelectionHandler<TItem = unknown> {\n readonly getItems: () => readonly TItem[]\n readonly getKey: ItemKeyGetter<TItem>\n readonly selectedItemsEmitter: ValueEmitter<TItem[]>\n readonly selectedItems$: ValueEmitter<TItem[]>\n readonly ownsSelectedItemsEmitter: boolean\n protected rows: HTMLElement[] = []\n private readonly rowCleanups: Array<() => void> = []\n protected activeIndex = 0\n protected anchorIndex: number | null = null\n private dragStartIndex: number | null = null\n private dragOriginEvent: MouseEvent | null = null\n private dragMoved = false\n private dragCleanup: (() => void) | null = null\n private suppressNextClick = false\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null\n private destroyed = false\n private readonly ownedSelectedItemsEmitter: Emitter<TItem[]> | null\n\n constructor({\n getItems,\n getKey = defaultItemKey,\n selectedItemsEmitter,\n owner = null,\n }: BaseSelectionHandlerConfig<TItem>) {\n if (typeof getItems !== 'function') {\n throw new TypeError('Selection handler getItems must be a function')\n }\n if (typeof getKey !== 'function') {\n throw new TypeError('Selection handler getKey must be a function')\n }\n this.getItems = getItems\n this.getKey = getKey\n this.ownedSelectedItemsEmitter = selectedItemsEmitter == null\n ? new Emitter<TItem[]>([], {owner, purpose: 'selected items'})\n : null\n this.selectedItemsEmitter = selectedItemsEmitter\n ?? this.ownedSelectedItemsEmitter!\n this.selectedItems$ = this.selectedItemsEmitter\n this.ownsSelectedItemsEmitter = this.ownedSelectedItemsEmitter != null\n }\n\n rowsUpdated(rows: Iterable<HTMLElement> | ArrayLike<HTMLElement> | null): void {\n if (this.destroyed) return\n this.releaseRows()\n this.rows = Array.from(rows ?? [])\n this.rows.forEach((row, index) => this.wireRow(row, index))\n this.activeIndex = clampIndex(this.activeIndex, this.rows.length)\n this.reconcileSelectedItems()\n this.syncRows()\n }\n\n private wireRow(row: HTMLElement, index: number): void {\n const onClick = (event: MouseEvent): void => this.handleClick(index, event)\n const onKeyDown = (event: KeyboardEvent): void => this.handleKeyDown(index, event)\n const onMouseDown = (event: MouseEvent): void => this.handleMouseDown(index, event, row)\n const onMouseEnter = (event: MouseEvent): void => this.handleMouseEnter(index, event)\n row.addEventListener('click', onClick)\n row.addEventListener('keydown', onKeyDown)\n row.addEventListener('mousedown', onMouseDown)\n row.addEventListener('mouseenter', onMouseEnter)\n this.rowCleanups.push(() => {\n row.removeEventListener('click', onClick)\n row.removeEventListener('keydown', onKeyDown)\n row.removeEventListener('mousedown', onMouseDown)\n row.removeEventListener('mouseenter', onMouseEnter)\n })\n }\n\n private handleClick(index: number, event: MouseEvent): void {\n event.preventDefault()\n if (this.suppressNextClick) {\n this.clearClickSuppression()\n return\n }\n this.activeIndex = index\n this.selectIndex(index, event)\n this.rows[index]?.focus()\n }\n\n private handleMouseDown(index: number, event: MouseEvent, row: HTMLElement): void {\n if (event.button !== 0 || !this.supportsDragSelection()) return\n this.finishDrag(false)\n this.clearClickSuppression()\n this.dragStartIndex = index\n this.dragOriginEvent = event\n this.dragMoved = false\n const ownerDocument = row.ownerDocument\n const onMouseUp = (): void => this.finishDrag(this.dragMoved)\n ownerDocument.addEventListener('mouseup', onMouseUp)\n this.dragCleanup = () => ownerDocument.removeEventListener('mouseup', onMouseUp)\n }\n\n private handleMouseEnter(index: number, event: MouseEvent): void {\n if (this.dragStartIndex == null) return\n if (index === this.dragStartIndex && !this.dragMoved) return\n if (index === this.activeIndex && this.dragMoved) return\n event.preventDefault()\n this.dragMoved = true\n this.activeIndex = index\n this.selectDragRange(this.dragStartIndex, index, this.dragOriginEvent ?? event)\n this.rows[index]?.focus()\n }\n\n private handleKeyDown(index: number, event: KeyboardEvent): void {\n const lastIndex = this.rows.length - 1\n let nextIndex: number\n if (event.key === 'ArrowDown') nextIndex = Math.min(index + 1, lastIndex)\n else if (event.key === 'ArrowUp') nextIndex = Math.max(index - 1, 0)\n else if (event.key === 'Home') nextIndex = 0\n else if (event.key === 'End') nextIndex = lastIndex\n else if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n this.activeIndex = index\n this.selectIndex(index, event)\n return\n } else return\n\n event.preventDefault()\n this.activeIndex = nextIndex\n this.onKeyboardMove(nextIndex, event)\n this.syncRows()\n this.rows[nextIndex]?.focus()\n }\n\n protected onKeyboardMove(index: number, event: KeyboardEvent): void {\n this.selectIndex(index, event)\n }\n\n protected supportsDragSelection(): boolean {\n return false\n }\n\n protected selectDragRange(\n _startIndex: number,\n _endIndex: number,\n _event: MouseEvent,\n ): void {}\n\n protected selectIndex(_index: number, _event: SelectionEvent): void {}\n\n protected setSelectedItems(items: TItem[], cause = 'selection changed'): void {\n this.selectedItemsEmitter.set(items, cause)\n this.syncRows()\n }\n\n getSelectedItems(): TItem[] {\n return this.selectedItemsEmitter.get() ?? []\n }\n\n getSelectedItemsEmitter(): ValueEmitter<TItem[]> {\n return this.selectedItemsEmitter\n }\n\n private reconcileSelectedItems(): void {\n const selected = this.getSelectedItems()\n if (selected.length === 0) return\n const selectedKeys = new Set(selected.map((item, index) => this.getKey(item, index)))\n const current = this.getItems().filter((item, index) =>\n selectedKeys.has(this.getKey(item, index)))\n if (current.length !== selected.length\n || current.some((item, index) => !Object.is(item, selected[index]))) {\n this.selectedItemsEmitter.set([...current], 'selection reconciled with rows')\n }\n }\n\n private syncRows(): void {\n const selectedKeys = new Set(this.getSelectedItems().map((item, index) =>\n this.getKey(item, index)))\n const items = this.getItems()\n this.rows.forEach((row, index) => {\n const item = items[index]\n const selected = item !== undefined\n && selectedKeys.has(this.getKey(item, index))\n row.classList.toggle('selected', selected)\n row.setAttribute('aria-selected', String(selected))\n row.tabIndex = index === this.activeIndex ? 0 : -1\n })\n }\n\n private releaseRows(): void {\n for (const cleanup of this.rowCleanups.splice(0)) cleanup()\n this.rows = []\n }\n\n private finishDrag(suppressClick: boolean): void {\n this.dragCleanup?.()\n this.dragCleanup = null\n this.dragStartIndex = null\n this.dragOriginEvent = null\n this.dragMoved = false\n if (!suppressClick) return\n this.suppressNextClick = true\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = setTimeout(() => this.clearClickSuppression(), 0)\n }\n\n private clearClickSuppression(): void {\n this.suppressNextClick = false\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = null\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.finishDrag(false)\n this.clearClickSuppression()\n this.releaseRows()\n this.ownedSelectedItemsEmitter?.dispose()\n }\n}\n\nexport class SingleSelectionHandler<TItem = unknown> extends BaseSelectionHandler<TItem> {\n readonly selectedItemEmitter: ValueEmitter<TItem | null>\n readonly selectedItem$: ValueEmitter<TItem | null>\n private readonly ownedSelectedItemEmitter: Emitter<TItem | null> | null\n\n constructor(config: SingleSelectionHandlerConfig<TItem>) {\n const owned = config.selectedItemEmitter == null\n ? new Emitter<TItem | null>(null, {\n owner: config.owner,\n purpose: 'selected item',\n })\n : null\n const selectedItemEmitter = config.selectedItemEmitter ?? owned!\n super({\n getItems: config.getItems,\n ...(config.getKey == null ? {} : {getKey: config.getKey}),\n ...(config.owner === undefined ? {} : {owner: config.owner}),\n selectedItemsEmitter: new SingleSelectionArrayView(selectedItemEmitter),\n })\n this.ownedSelectedItemEmitter = owned\n this.selectedItemEmitter = selectedItemEmitter\n this.selectedItem$ = selectedItemEmitter\n }\n\n protected selectIndex(index: number): void {\n const item = this.getItems()[index]\n if (item === undefined) return\n this.anchorIndex = index\n this.setSelectedItems([item], 'single selection changed')\n }\n\n getSelectedItem(): TItem | null {\n return this.selectedItemEmitter.get()\n }\n\n override destroy(): void {\n super.destroy()\n this.ownedSelectedItemEmitter?.dispose()\n }\n}\n\nexport class MultiSelectionHandler<TItem = unknown> extends BaseSelectionHandler<TItem> {\n protected selectIndex(index: number, event: SelectionEvent): void {\n const items = this.getItems()\n const item = items[index]\n if (item === undefined) return\n\n if (event.shiftKey && this.anchorIndex != null) {\n const first = Math.min(this.anchorIndex, index)\n const last = Math.max(this.anchorIndex, index)\n const range = items.slice(first, last + 1)\n const next = isCommandPressed(event)\n ? mergeByKey(this.getSelectedItems(), range, this.getKey)\n : [...range]\n this.setSelectedItems(next, 'range selection changed')\n return\n }\n\n if (isCommandPressed(event) || ('key' in event && event.key === ' ')) {\n const selected = this.getSelectedItems()\n const key = this.getKey(item, index)\n const exists = selected.some((candidate, candidateIndex) =>\n Object.is(this.getKey(candidate, candidateIndex), key))\n const next = exists\n ? selected.filter((candidate, candidateIndex) =>\n !Object.is(this.getKey(candidate, candidateIndex), key))\n : [...selected, item]\n this.anchorIndex = index\n this.setSelectedItems(next, 'multi selection toggled')\n return\n }\n\n this.anchorIndex = index\n this.setSelectedItems([item], 'multi selection changed')\n }\n\n protected onKeyboardMove(index: number, event: KeyboardEvent): void {\n if (event.shiftKey) this.selectIndex(index, event)\n }\n\n protected supportsDragSelection(): boolean {\n return true\n }\n\n protected selectDragRange(\n startIndex: number,\n endIndex: number,\n event: MouseEvent,\n ): void {\n const items = this.getItems()\n const first = Math.min(startIndex, endIndex)\n const last = Math.max(startIndex, endIndex)\n const range = items.slice(first, last + 1)\n const next = isCommandPressed(event)\n ? mergeByKey(this.getSelectedItems(), range, this.getKey)\n : [...range]\n this.anchorIndex = startIndex\n this.setSelectedItems(next, 'drag selection changed')\n }\n}\n\nexport function createSelectionHandler<TItem>(\n config: MultiSelectionHandlerConfig<TItem>,\n): MultiSelectionHandler<TItem>\nexport function createSelectionHandler<TItem>(\n config: SingleSelectionHandlerConfig<TItem>,\n): SingleSelectionHandler<TItem>\nexport function createSelectionHandler<TItem>(\n config: SelectionHandlerConfig<TItem>,\n): BaseSelectionHandler<TItem> {\n return config.multiSelect\n ? new MultiSelectionHandler(config)\n : new SingleSelectionHandler(config)\n}\n\nclass SingleSelectionArrayView<TItem> implements ValueEmitter<TItem[]> {\n constructor(private readonly source: ValueEmitter<TItem | null>) {}\n\n get(): TItem[] {\n const value = this.source.get()\n return value == null ? [] : [value]\n }\n\n getError(): unknown {\n return this.source.getError()\n }\n\n getFetchState(): ReturnType<ValueEmitter<TItem | null>['getFetchState']> {\n return this.source.getFetchState()\n }\n\n set(value: TItem[], eventOrCause?: unknown): boolean {\n return this.source.set(value[0] ?? null, eventOrCause)\n }\n\n subscribe(\n listener: (notification: EmitterNotification<TItem[], unknown>) => void,\n options?: SubscribeOptions,\n ): () => void {\n return this.source.subscribe((notification) => listener({\n ...notification,\n value: notification.value == null ? [] : [notification.value],\n }), options)\n }\n}\n\nexport function defaultItemKey<TItem>(item: TItem, index: number): unknown {\n if (item != null && typeof item === 'object') {\n const id = Reflect.get(item, 'id')\n if (id != null) return id\n }\n if (typeof item === 'string' || typeof item === 'number') return item\n throw new TypeError(\n `Selection item at index ${index} needs an id or an explicit itemKey/rowKey`,\n )\n}\n\nfunction isCommandPressed(event: MouseEvent | KeyboardEvent): boolean {\n return Boolean(event.ctrlKey || event.metaKey)\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) return 0\n return Math.min(Math.max(index, 0), length - 1)\n}\n\nfunction mergeByKey<TItem>(\n left: readonly TItem[],\n right: readonly TItem[],\n getKey: ItemKeyGetter<TItem>,\n): TItem[] {\n const result = [...left]\n const keys = new Set(left.map((item, index) => getKey(item, index)))\n for (const item of right) {\n const key = getKey(item, result.length)\n if (!keys.has(key)) {\n keys.add(key)\n result.push(item)\n }\n }\n return result\n}\n","import {Emitter, FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {\n createSelectionHandler,\n defaultItemKey,\n SingleSelectionHandler,\n} from '../selectionhandler.js'\nimport type {\n BaseSelectionHandler,\n ItemKeyGetter,\n} from '../selectionhandler.js'\n\ninterface ListViewCommonProps<TItem> extends ComponentProps {\n items?: readonly TItem[] | ReadableEmitter<readonly TItem[], unknown>\n itemKey?: string | ItemKeyGetter<TItem>\n label?: string\n placeholderCount?: number\n renderItem?: (item: TItem, index: number) => FrayChild\n}\n\nexport type ListViewProps<TItem = unknown> = ListViewCommonProps<TItem> & (\n | {\n multiSelect?: false\n selectedItemEmitter?: ValueEmitter<TItem | null>\n selectedItemsEmitter?: never\n }\n | {\n multiSelect: true\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n selectedItemEmitter?: never\n }\n)\n\n/** Accessible listbox with stable-key selection. */\nexport class ListView<TItem = unknown> extends Component<ListViewProps<TItem>> {\n readonly itemsEmitter: ReadableEmitter<readonly TItem[], unknown>\n readonly items$: ReadableEmitter<readonly TItem[], unknown>\n readonly selectedItemsEmitter: ValueEmitter<TItem[]>\n readonly selectedItems$: ValueEmitter<TItem[]>\n readonly selectedItemEmitter: ValueEmitter<TItem | null> | null\n readonly selectedItem$: ValueEmitter<TItem | null> | null\n readonly getItemKey: ItemKeyGetter<TItem>\n readonly selectionHandler: BaseSelectionHandler<TItem>\n private readonly ownedItemsEmitter: Emitter<readonly TItem[]> | null\n\n constructor(props: ListViewProps<TItem> = {}) {\n super(props)\n if (isReadableEmitter<readonly TItem[]>(props.items)) {\n this.itemsEmitter = props.items\n this.ownedItemsEmitter = null\n } else {\n this.ownedItemsEmitter = new Emitter<readonly TItem[]>(props.items ?? [], {\n owner: this,\n purpose: 'list items',\n })\n this.itemsEmitter = this.ownedItemsEmitter\n }\n this.items$ = this.itemsEmitter\n this.getItemKey = normalizeKeyGetter(props.itemKey)\n this.selectionHandler = props.multiSelect === true\n ? createSelectionHandler({\n owner: this,\n multiSelect: true,\n ...(props.selectedItemsEmitter == null\n ? {}\n : {selectedItemsEmitter: props.selectedItemsEmitter}),\n getItems: () => this.itemsEmitter.get(),\n getKey: this.getItemKey,\n })\n : createSelectionHandler({\n owner: this,\n ...(props.selectedItemEmitter == null\n ? {}\n : {selectedItemEmitter: props.selectedItemEmitter}),\n getItems: () => this.itemsEmitter.get(),\n getKey: this.getItemKey,\n })\n this.selectedItemsEmitter = this.selectionHandler.selectedItemsEmitter\n this.selectedItems$ = this.selectedItemsEmitter\n this.selectedItemEmitter = this.selectionHandler instanceof SingleSelectionHandler\n ? this.selectionHandler.selectedItemEmitter\n : null\n this.selectedItem$ = this.selectedItemEmitter\n }\n\n initialize(): void {\n this.watch(this.itemsEmitter, this.selectedItemsEmitter)\n }\n\n render(): FrayChild {\n const rows = this.itemsEmitter.get()\n if (!Array.isArray(rows)) throw new TypeError('ListView items must be an array')\n const status = this.itemsEmitter.getFetchState()\n const error = this.itemsEmitter.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const selectedKeys = new Set(this.selectedItemsEmitter.get()\n .map((item, index) => this.getItemKey(item, index)))\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n >\n {status === FetchState.Error\n ? <p role=\"alert\" data-part=\"error\">\n {errorMessage(error, 'Unable to load items')}\n </p>\n : null}\n {isLoading && rows.length === 0\n ? <div role=\"status\" data-part=\"loading\">\n <span>Loading items…</span>\n {Array.from({length: this.props.placeholderCount ?? 5}, (_, index) =>\n <div key={`placeholder-${index}`} data-part=\"placeholder-row\">\n <Placeholder width={45 + index * 7} />\n </div>)}\n </div>\n : null}\n {status === FetchState.Ready && rows.length === 0\n ? <p role=\"status\" data-part=\"empty\">No items</p>\n : null}\n {rows.length > 0\n ? <div\n role=\"listbox\"\n data-part=\"list\"\n aria-label={this.props.label ?? 'Items'}\n aria-busy={isLoading ? 'true' : null}\n aria-multiselectable={this.props.multiSelect ? 'true' : null}\n >{rows.map((item, index) => {\n const key = this.getItemKey(item, index)\n const selected = selectedKeys.has(key)\n const content = this.props.renderItem\n ? this.props.renderItem(item, index)\n : defaultItemLabel(item)\n return <div\n key={String(key)}\n role=\"option\"\n data-part=\"row\"\n data-fray-selectable-row=\"\"\n data-index={index}\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >{content}</div>\n })}</div>\n : null}\n </Host>\n }\n\n afterUpdate(dom: ChildNode | null): void {\n const rows = dom instanceof Element\n ? dom.querySelectorAll<HTMLElement>('[data-fray-selectable-row]')\n : []\n this.selectionHandler.rowsUpdated(rows)\n }\n\n getSelectedItems(): TItem[] {\n return this.selectionHandler.getSelectedItems()\n }\n\n getSelectedItemsEmitter(): ValueEmitter<TItem[]> {\n return this.selectedItemsEmitter\n }\n\n getSelectedItem(): TItem | null {\n return this.selectedItemEmitter?.get() ?? null\n }\n\n getSelectedItemEmitter(): ValueEmitter<TItem | null> | null {\n return this.selectedItemEmitter\n }\n\n onDestroy(): void {\n this.selectionHandler.destroy()\n this.ownedItemsEmitter?.dispose()\n }\n\n static dependencies = [Placeholder]\n\n static override hostName = 'list-view'\n static override standaloneHostName = 'list-view'\n\n static baseStyles = [\n ['&', 'inputlike'],\n ['& > [data-part=\"list\"] > [data-part=\"row\"]', 'inputline'],\n ]\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n min-height: 0;\n }\n\n & > [data-part=\"list\"],\n & > [data-part=\"loading\"] {\n display: flex;\n flex-direction: column;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"] {\n cursor: default;\n user-select: none;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"]:hover,\n & > [data-part=\"list\"] > [data-part=\"row\"]:focus-visible {\n background: var(--button-background-hover);\n outline: 2px solid var(--ui-accent-color);\n outline-offset: -2px;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"][aria-selected=\"true\"] {\n color: var(--toggle-selected-text);\n background: var(--toggle-selected-bg);\n }\n\n & > [data-part=\"empty\"],\n & > [data-part=\"error\"] {\n margin: 0;\n padding: var(--ui-padding);\n }\n\n & > [data-part=\"error\"] {\n color: var(--error-color);\n }\n `\n}\n\nfunction normalizeKeyGetter<TItem>(\n itemKey: ListViewProps<TItem>['itemKey'],\n): ItemKeyGetter<TItem> {\n if (itemKey == null) return defaultItemKey\n if (typeof itemKey === 'function') return itemKey\n if (typeof itemKey === 'string' && itemKey.length > 0) {\n return (item, index) => {\n if (item == null || (typeof item !== 'object' && typeof item !== 'function')) {\n throw new TypeError(`ListView item at index ${index} lacks ${itemKey}`)\n }\n const key = Reflect.get(item, itemKey)\n if (key == null) {\n throw new TypeError(`ListView item at index ${index} lacks ${itemKey}`)\n }\n return key\n }\n }\n throw new TypeError('ListView itemKey must be a function or property name')\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction defaultItemLabel(item: unknown): FrayChild {\n if (item != null && (typeof item === 'object' || typeof item === 'function')) {\n const label = Reflect.get(item, 'label')\n if (isRenderablePrimitive(label)) return label\n }\n return String(item)\n}\n\nfunction isRenderablePrimitive(value: unknown): value is string | number | null | undefined {\n return value == null || typeof value === 'string' || typeof value === 'number'\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {\n componentClass,\n createValueEmitter,\n describeState,\n invoke,\n} from '../../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../../controlUtils.js'\nimport {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport type CheckboxValue = string | number\nexport type CheckboxSymbol<TValue extends CheckboxValue = FilterModeValue> = readonly [\n symbol: FrayChild,\n value: TValue,\n]\n\nexport interface CheckboxProps<TValue extends CheckboxValue = FilterModeValue>\n extends ValueControlProps<TValue> {\n symbols?: readonly CheckboxSymbol<TValue>[]\n initialSemanticState?: TValue\n label?: FrayChild\n disabled?: boolean\n required?: boolean\n name?: string\n onChange?: (value: TValue, event: Event | null) => void\n}\n\n/** Keyboard-operable semantic state cycler. */\nexport class Checkbox<TValue extends CheckboxValue = FilterModeValue>\n extends Component<CheckboxProps<TValue>> {\n static symbols: readonly CheckboxSymbol<FilterModeValue>[] = [\n ['☐', FilterMode.Neutral],\n ['✓', FilterMode.Prefer],\n ]\n static defaultSemanticState = FilterMode.Neutral\n\n readonly symbols: readonly CheckboxSymbol<TValue>[]\n readonly valueEmitter: ValueEmitter<TValue>\n readonly semanticStateEmitter: ValueEmitter<TValue>\n\n constructor(props: CheckboxProps<TValue> = {}) {\n super(props)\n const componentType = this.constructor as typeof Checkbox\n // Static members cannot carry the instance's generic state parameter;\n // subclasses validate the tuple values before this boundary is used.\n this.symbols = props.symbols\n ?? componentType.symbols as unknown as readonly CheckboxSymbol<TValue>[]\n validateSymbols(this.symbols)\n const fallback = props.initialSemanticState\n ?? componentType.defaultSemanticState as TValue\n ?? this.symbols[0]![1]\n const emitterProps: CheckboxProps<TValue> = {...props}\n if (emitterProps.defaultValue == null && props.initialSemanticState != null) {\n emitterProps.defaultValue = props.initialSemanticState\n }\n this.valueEmitter = createValueEmitter<TValue>(this, emitterProps, fallback,\n 'checkbox semantic state')\n // Compatibility alias used by filter controls.\n this.semanticStateEmitter = this.valueEmitter\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n cycleState(direction = 1, event: Event | null = null): void {\n if (this.props.disabled) return\n const currentIndex = this.symbols.findIndex(([, state]) =>\n Object.is(state, this.valueEmitter.get()))\n const baseIndex = currentIndex < 0 ? 0 : currentIndex\n const nextIndex = (baseIndex + direction + this.symbols.length) % this.symbols.length\n const nextValue = this.symbols[nextIndex]![1]\n this.valueEmitter.set(nextValue, 'checkbox state changed')\n invoke(this.props.onChange, nextValue, event)\n }\n\n render(): FrayChild {\n const {\n label = this.props.value ?? 'Option',\n disabled = false,\n required = false,\n name,\n value,\n } = this.props\n const semanticState = this.valueEmitter.get()\n const semanticIndex = this.symbols.findIndex(([, state]) =>\n Object.is(state, semanticState))\n const [symbol] = this.symbols[semanticIndex] ?? ['?', semanticState]\n const stateName = describeState(semanticState)\n const checked = semanticState === FilterMode.Prefer\n || semanticState === FilterMode.Require\n || (this.symbols.length === 2 && semanticIndex === 1)\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-disabled={disabled ? '' : null}\n data-required={required ? '' : null}\n data-state={stateName}\n >\n <button\n type=\"button\"\n role=\"checkbox\"\n disabled={disabled}\n name={name}\n value={value == null ? undefined : String(value)}\n data-part=\"control\"\n aria-checked={checked ? 'true' : 'false'}\n aria-required={required ? 'true' : null}\n aria-label={`${label}: ${stateName}`}\n onClick={(event: MouseEvent) => this.cycleState(1, event)}\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault()\n this.cycleState(1, event)\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault()\n this.cycleState(-1, event)\n }\n }}\n >\n <span data-part=\"symbol\" aria-hidden=\"true\">{symbol}</span>\n <span data-part=\"label\">{label}</span>\n </button>\n </Host>\n }\n\n static override hostName = 'checkbox'\n static override standaloneHostName = 'check-box'\n\n static baseStyles = [\n ['&', ['inputline']],\n ['& > [data-part=\"control\"]', ['input', 'inputline']],\n ['&[data-disabled]', ['disabled']],\n ]\n\n static css = css`\n & > [data-part=\"control\"] {\n display: inline-flex;\n align-items: center;\n gap: 0.35em;\n width: auto;\n font-family: inherit;\n }\n\n & [data-part=\"symbol\"] {\n display: inline-grid;\n width: 1em;\n height: 1em;\n line-height: 1;\n place-items: center;\n color: var(--fray-checkbox-symbol-color, currentColor);\n background: var(--fray-checkbox-box-background, transparent);\n border: var(--fray-checkbox-box-border, var(--cbx-o-border));\n border-radius: var(--cbx-border-radius, var(--fray-radius-sm));\n }\n\n & [data-part=\"control\"][aria-checked=\"true\"] [data-part=\"symbol\"] {\n background: var(\n --fray-checkbox-box-background-checked,\n var(--fray-selection-background)\n );\n }\n `\n}\n\nfunction validateSymbols<TValue extends CheckboxValue>(\n symbols: unknown,\n): asserts symbols is readonly CheckboxSymbol<TValue>[] {\n if (!Array.isArray(symbols) || symbols.length === 0) {\n throw new TypeError('Checkbox symbols must be a non-empty tuple array')\n }\n for (const tuple of symbols) {\n if (!Array.isArray(tuple) || tuple.length < 2) {\n throw new TypeError('Checkbox symbols must be [symbol, state] tuples')\n }\n }\n}\n","import {Emitter, FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css} from '../../component.js'\nimport type {ComponentConstructor, ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport {Checkbox} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {\n CheckboxProps,\n CheckboxSymbol,\n} from '../../lineinputs/checkbox/Checkbox.js'\nimport {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport type FilterValue = string | number\n\nexport interface FilterOption {\n value: FilterValue\n label?: FrayChild\n}\n\nexport type FilterOptionInput = FilterValue | FilterOption\nexport type FilterOptions = readonly FilterOptionInput[]\nexport type FilterOptionsSource = FilterOptions | ReadableEmitter<FilterOptions, unknown>\nexport type FilterSelection = ReadonlyMap<FilterValue, FilterModeValue>\n\nexport interface FilterPanelProps extends ComponentProps {\n options?: FilterOptionsSource\n filters?: FilterSelection | readonly (readonly [FilterValue, FilterModeValue])[]\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n label?: string\n onChange?: (filters: Map<FilterValue, FilterModeValue>, event: Event | null) => void\n}\n\n/** Filter choices whose option data is always supplied by the caller. */\nexport class FilterPanel extends Component<FilterPanelProps> {\n readonly optionsEmitter: ReadableEmitter<FilterOptions, unknown> | null\n private readonly optionStateEmitters = new Map<FilterValue, Emitter<FilterModeValue>>()\n private staleOptionValues = new Set<FilterValue>()\n private placementTimer: ReturnType<typeof setTimeout> | null = null\n\n constructor(props: FilterPanelProps = {}) {\n super(props)\n this.optionsEmitter = isEmitterLike<FilterOptions>(props.options) ? props.options : null\n }\n\n initialize(): void {\n if (this.optionsEmitter) this.watch(this.optionsEmitter)\n }\n\n render(): FrayChild {\n const values = this.optionsEmitter?.get()\n ?? (Array.isArray(this.props.options) ? this.props.options : [])\n if (!Array.isArray(values)) {\n throw new TypeError('FilterPanel options must be an array or emitter of arrays')\n }\n const fetchState = this.optionsEmitter?.getFetchState() ?? FetchState.Ready\n const error = this.optionsEmitter?.getError()\n const filters = normalizeFilters(this.props.filters)\n const filterModes = this.props.filterModes ?? Checkbox.symbols\n const defaultSemanticState = this.props.defaultSemanticState ?? FilterMode.Neutral\n const activeValues = new Set(values.map(optionValue))\n this.staleOptionValues = new Set(\n [...this.optionStateEmitters.keys()].filter((value) => !activeValues.has(value)),\n )\n const Host = this.Host\n\n if (fetchState === FetchState.Error) {\n return <Host\n className={componentClass(this.props) || null}\n role=\"alert\"\n data-state=\"error\"\n >{errorMessage(error, 'Unable to load filter options')}</Host>\n }\n if ((fetchState === FetchState.Initial || fetchState === FetchState.Loading)\n && values.length === 0) {\n return <Host\n className={componentClass(this.props) || null}\n role=\"status\"\n data-state=\"loading\"\n >Loading filter options…</Host>\n }\n\n return <Host\n className={componentClass(this.props) || null}\n role=\"group\"\n aria-label={this.props.label ?? 'Filter options'}\n >\n {values.length === 0\n ? <span>No filter options</span>\n : values.map((option) => {\n const value = optionValue(option)\n const label = optionLabel(option)\n const state = filters.get(value) ?? defaultSemanticState\n const valueEmitter = this.optionEmitter(value, state)\n return <FilterModeCheckbox\n key={optionKey(value)}\n label={label}\n valueEmitter={valueEmitter}\n symbols={filterModes}\n onChange={(nextState, event) => {\n event?.stopPropagation()\n const next = normalizeFilters(this.props.filters)\n if (nextState === FilterMode.Neutral) next.delete(value)\n else next.set(value, nextState)\n this.props.onChange?.(next, event)\n }}\n />\n })}\n </Host>\n }\n\n afterUpdate(dom: ChildNode | null): void {\n for (const value of this.staleOptionValues) {\n this.optionStateEmitters.get(value)?.dispose()\n this.optionStateEmitters.delete(value)\n }\n this.staleOptionValues.clear()\n if (this.placementTimer != null) clearTimeout(this.placementTimer)\n this.placementTimer = setTimeout(() => {\n this.placementTimer = null\n this.placeInsideViewport(dom)\n }, 0)\n }\n\n onDestroy(): void {\n if (this.placementTimer != null) clearTimeout(this.placementTimer)\n this.placementTimer = null\n for (const emitter of this.optionStateEmitters.values()) emitter.dispose()\n this.optionStateEmitters.clear()\n }\n\n private optionEmitter(\n value: FilterValue,\n state: FilterModeValue,\n ): Emitter<FilterModeValue> {\n const existing = this.optionStateEmitters.get(value)\n if (existing != null) {\n if (existing.get() !== state) existing.set(state, 'filter option synchronized')\n return existing\n }\n const emitter = new Emitter(state, {owner: this, purpose: `filter option ${String(value)}`})\n this.optionStateEmitters.set(value, emitter)\n return emitter\n }\n\n private placeInsideViewport(dom: ChildNode | null): void {\n if (!(dom instanceof HTMLElement) || dom.parentElement == null) return\n const viewport = dom.ownerDocument.defaultView\n if (viewport == null || viewport.innerHeight <= 0) return\n const anchor = dom.parentElement.getBoundingClientRect()\n dom.style.removeProperty('max-height')\n const panel = dom.getBoundingClientRect()\n const spaceAbove = anchor.top\n const spaceBelow = Math.max(0, viewport.innerHeight - anchor.bottom)\n const placeAbove = panel.height > spaceBelow && spaceAbove > spaceBelow\n if (placeAbove) {\n dom.dataset.placement = 'above'\n dom.style.insetBlockStart = `${Math.max(8, anchor.top - panel.height)}px`\n } else {\n delete dom.dataset.placement\n dom.style.insetBlockStart = `${anchor.bottom}px`\n }\n dom.style.insetInlineEnd = `${Math.max(8, viewport.innerWidth - anchor.right)}px`\n const available = placeAbove ? spaceAbove : spaceBelow\n dom.style.maxHeight = `${Math.max(48, available - 8)}px`\n }\n\n static dependencies = [Checkbox]\n\n static override hostName = 'filter-panel'\n static override standaloneHostName = 'filter-panel'\n\n static css = css`\n & {\n position: fixed;\n z-index: 1100;\n inset-block-start: 0;\n inset-inline-end: 0;\n display: flex;\n min-width: 12rem;\n padding: var(--ui-padding);\n flex-flow: column nowrap;\n align-items: stretch;\n color: var(--panel-color);\n background: var(--panel-bg);\n border: var(--panel-border);\n border-radius: var(--panel-radius);\n box-shadow: var(--panel-shadow);\n overflow-y: auto;\n }\n\n `\n}\n\n// Passing a generic class as a runtime vnode erases its state parameter. The\n// concrete props below restore the FilterMode relationship checked by tsc.\nconst FilterModeCheckbox = Checkbox as unknown as ComponentConstructor<\n CheckboxProps<FilterModeValue>\n>\n\nfunction normalizeFilters(\n filters: FilterPanelProps['filters'],\n): Map<FilterValue, FilterModeValue> {\n if (filters == null) return new Map<FilterValue, FilterModeValue>()\n if (filters instanceof Map) return new Map(filters)\n if (Array.isArray(filters)) return new Map(filters)\n throw new TypeError('FilterPanel filters must be a Map or tuple array')\n}\n\nfunction optionValue(option: FilterOptionInput): FilterValue {\n if (typeof option === 'string' || typeof option === 'number') return option\n if (option != null && typeof option === 'object') {\n const value = Reflect.get(option, 'value')\n if (typeof value === 'string' || typeof value === 'number') return value\n }\n throw new TypeError('Filter options must be strings, numbers, or value/label objects')\n}\n\nfunction optionLabel(option: FilterOptionInput): FrayChild {\n if (option != null && typeof option === 'object') {\n const label = Reflect.get(option, 'label')\n if (label != null) return isFrayLabel(label) ? label : String(label)\n }\n return String(optionValue(option))\n}\n\nfunction optionKey(value: FilterValue): string {\n return `${typeof value}:${String(value)}`\n}\n\nfunction isFrayLabel(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nfunction isEmitterLike<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {FilterPanel} from './FilterPanel.js'\nimport type {\n FilterOptionsSource,\n FilterSelection,\n FilterValue,\n} from './FilterPanel.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport type TableRow = Record<string, unknown>\n\nexport interface TableColumnBase {\n field: string\n label?: FrayChild\n sortable?: boolean\n filterOptions?: FilterOptionsSource\n}\n\nexport interface TableColumn<TRow extends TableRow = TableRow> extends TableColumnBase {\n field: Extract<keyof TRow, string>\n render?: (row: TRow, index: number) => FrayChild\n}\n\nexport interface TableHeaderCellProps extends ComponentProps, TableColumnBase {\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\nexport class TableHeaderCell extends Component<TableHeaderCellProps> {\n private filterVisible = false\n\n initialize(): void {\n this.watch(this.props.sortEmitter, this.props.filtersEmitter)\n if (this.props.filterOptions != null) {\n this.listen<MouseEvent>(document, 'click', this.onGlobalClick)\n }\n }\n\n toggleSort(): void {\n if (!this.props.sortable) return\n const current = this.props.sortEmitter.get()\n let next: TableSort | null\n if (current?.field !== this.props.field) {\n next = {field: this.props.field, direction: 'asc'}\n } else if (current.direction === 'asc') {\n next = {field: this.props.field, direction: 'desc'}\n } else next = null\n this.props.sortEmitter.set(next, 'table sort changed')\n }\n\n toggleFilterPanel(event: MouseEvent): void {\n event.stopPropagation()\n this.filterVisible = !this.filterVisible\n this.update()\n }\n\n updateFilters(next: FilterSelection, event: Event | null): void {\n const filters: TableFilters = {...this.props.filtersEmitter.get()}\n if (next.size === 0) delete filters[this.props.field]\n else filters[this.props.field] = [...next.entries()]\n this.props.filtersEmitter.set(filters, 'table filters changed')\n this.props.onFilterChange?.(filters, event)\n }\n\n render(): FrayChild {\n const currentSort = this.props.sortEmitter.get()\n const direction = currentSort?.field === this.props.field\n ? currentSort.direction\n : null\n const filters = new Map<FilterValue, FilterModeValue>(\n (this.props.filtersEmitter.get()[this.props.field] ?? [])\n .filter(isFilterSelectionEntry),\n )\n const label = this.props.label ?? String(this.props.field)\n const filterLabel = `Filter ${String(label)}`\n\n let panel: FrayChild = null\n if (this.filterVisible && this.props.filterOptions != null) {\n panel = <FilterPanel\n key=\"filter-panel\"\n label={filterLabel}\n options={this.props.filterOptions}\n filters={filters}\n onChange={(next, event) => this.updateFilters(next, event)}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n />\n }\n\n return <th\n scope=\"col\"\n data-fray-component=\"table-header-cell\"\n aria-sort={direction === 'asc'\n ? 'ascending'\n : direction === 'desc' ? 'descending' : 'none'}\n style={{zIndex: this.filterVisible ? 1200 : null}}\n >\n {this.props.sortable\n ? <button\n type=\"button\"\n data-part=\"sort\"\n onClick={() => this.toggleSort()}\n >\n {label}\n {direction === 'asc' ? ' ▲' : direction === 'desc' ? ' ▼' : ''}\n </button>\n : <span data-part=\"label\">{label}</span>}\n {this.props.filterOptions == null\n ? null\n : <button\n type=\"button\"\n data-part=\"filter-toggle\"\n aria-label={filterLabel}\n aria-expanded={String(this.filterVisible)}\n onClick={(event: MouseEvent) => this.toggleFilterPanel(event)}\n >Filter</button>}\n {panel}\n </th>\n }\n\n private readonly onGlobalClick = (event: MouseEvent): void => {\n if (this.filterVisible\n && this.dom instanceof Node\n && event.target instanceof Node\n && !this.dom.contains(event.target)) {\n this.filterVisible = false\n this.update()\n }\n }\n\n static dependencies = [FilterPanel]\n\n static baseStyles = [\n ['th[data-fray-component=\"table-header-cell\"]', 'noselect'],\n ['th[data-fray-component=\"table-header-cell\"] > [data-part=\"sort\"]', ['uiline', 'button']],\n ['th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n th[data-fray-component=\"table-header-cell\"] {\n position: relative;\n text-align: start;\n color: var(\n --fray-table-header-color,\n var(--fray-section-header-color, var(--fray-header-color))\n );\n background: var(\n --fray-table-header-background,\n var(--fray-section-header-background, var(--fray-header-background))\n );\n border-block-end: var(--fray-section-header-border, var(--fray-header-border));\n box-shadow: var(--fray-section-header-shadow, var(--fray-header-shadow));\n }\n\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"sort\"],\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"] {\n width: auto;\n font-family: inherit;\n color: inherit;\n background: var(\n --fray-table-header-button-background,\n var(--fray-button-background)\n );\n }\n\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"] {\n margin-inline-start: var(--ui-padding-h);\n font-size: 0.75em;\n }\n `\n}\n\nfunction isFilterSelectionEntry(\n entry: readonly [unknown, FilterModeValue],\n): entry is readonly [FilterValue, FilterModeValue] {\n return typeof entry[0] === 'string' || typeof entry[0] === 'number'\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {TableHeaderCell} from './TableHeaderCell.js'\nimport type {\n TableColumn,\n TableRow,\n} from './TableHeaderCell.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport interface TableHeaderProps<TRow extends TableRow = TableRow> extends ComponentProps {\n columns: readonly TableColumn<TRow>[]\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\nexport class TableHeader<TRow extends TableRow = TableRow>\n extends Component<TableHeaderProps<TRow>> {\n render(): FrayChild {\n return <thead data-fray-component=\"table-header\">\n <tr>\n {this.props.columns.map((column) => <TableHeaderCell\n key={String(column.field)}\n field={column.field}\n sortEmitter={this.props.sortEmitter}\n filtersEmitter={this.props.filtersEmitter}\n {...(column.label == null ? {} : {label: column.label})}\n {...(column.sortable == null ? {} : {sortable: column.sortable})}\n {...(column.filterOptions == null\n ? {}\n : {filterOptions: column.filterOptions})}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n {...(this.props.onFilterChange == null\n ? {}\n : {onFilterChange: this.props.onFilterChange})}\n />)}\n </tr>\n </thead>\n }\n\n static dependencies = [TableHeaderCell]\n}\n","import type {UrlLike} from '@sylwellsoftware/glue'\n\nimport {FilterMode, isFilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport interface TableSort {\n field: string\n direction: 'asc' | 'desc'\n}\n\nexport type TableFilterEntry<TValue = unknown> = readonly [\n value: TValue,\n mode: FilterModeValue,\n]\n\nexport type TableFilters = Record<string, readonly TableFilterEntry[]>\n\nexport interface TableQueryState {\n sort?: TableSort | null\n filters?: TableFilters\n}\n\nexport const DefaultTableFilterEncoding: Readonly<Record<FilterModeValue, string>> = {\n [FilterMode.Neutral]: '☐',\n [FilterMode.Prefer]: '',\n [FilterMode.Require]: '_',\n [FilterMode.Deny]: '!',\n}\n\n/**\n * Serialize Fray's compact remote-table wire format.\n *\n * - `sort=field:asc|desc`\n * - repeated `filter=field:token:JSON(value)` entries\n *\n * Semantic modes deliberately remain separate from this compatibility wire\n * encoding. Endpoints with another contract should inject their own serializer.\n */\nexport function serializeTableQuery<TUrl extends UrlLike>(\n url: TUrl,\n {sort = null, filters = {}}: TableQueryState = {},\n): TUrl {\n assertUrlLike(url)\n if (sort != null) {\n assertSort(sort)\n url.searchParams.set('sort', `${sort.field}:${sort.direction}`)\n }\n for (const [field, entries] of Object.entries(filters)) {\n for (const [value, mode] of entries) {\n if (!isFilterMode(mode)) {\n throw new TypeError(`Unknown filter mode for ${field}: ${String(mode)}`)\n }\n url.searchParams.append(\n 'filter',\n `${field}:${DefaultTableFilterEncoding[mode]}:${JSON.stringify(value)}`,\n )\n }\n }\n return url\n}\n\nexport function applyLocalTableState<TRow>(\n rows: readonly TRow[],\n sort: TableSort | null,\n filters: TableFilters,\n): TRow[] {\n if (!Array.isArray(rows)) throw new TypeError('Local table data must be an array')\n const filtered = rows.filter((row) => matchesFilters(row, filters))\n if (sort == null) return filtered\n assertSort(sort)\n const direction = sort.direction === 'asc' ? 1 : -1\n return [...filtered].sort((left, right) =>\n compareValues(readField(left, sort.field), readField(right, sort.field)) * direction)\n}\n\nfunction matchesFilters<TRow>(row: TRow, filters: TableFilters): boolean {\n for (const [field, entries] of Object.entries(filters)) {\n const value = readField(row, field)\n const denied = entries.filter(([, mode]) => mode === FilterMode.Deny)\n if (denied.some(([candidate]) => Object.is(candidate, value))) return false\n\n const required = entries.filter(([, mode]) => mode === FilterMode.Require)\n if (required.length > 0\n && !required.some(([candidate]) => Object.is(candidate, value))) return false\n\n const preferred = entries.filter(([, mode]) => mode === FilterMode.Prefer)\n if (preferred.length > 0\n && !preferred.some(([candidate]) => Object.is(candidate, value))) return false\n }\n return true\n}\n\nexport function assertSort(sort: unknown): asserts sort is TableSort {\n if (sort == null\n || typeof sort !== 'object'\n || typeof Reflect.get(sort, 'field') !== 'string'\n || !isSortDirection(Reflect.get(sort, 'direction'))) {\n throw new TypeError('Table sort must contain a field and asc/desc direction')\n }\n}\n\nfunction isSortDirection(value: unknown): value is TableSort['direction'] {\n return value === 'asc' || value === 'desc'\n}\n\nfunction compareValues(left: unknown, right: unknown): number {\n if (Object.is(left, right)) return 0\n if (left == null) return -1\n if (right == null) return 1\n if (typeof left === 'number' && typeof right === 'number') return left - right\n return String(left).localeCompare(String(right))\n}\n\nfunction readField(value: unknown, field: string): unknown {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {\n return undefined\n }\n return Reflect.get(value, field)\n}\n\nfunction assertUrlLike(value: unknown): asserts value is UrlLike {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'toString') !== 'function') {\n throw new TypeError('Table serializer requires a URL')\n }\n const searchParams = Reflect.get(value, 'searchParams')\n if (searchParams == null\n || typeof Reflect.get(searchParams, 'set') !== 'function'\n || typeof Reflect.get(searchParams, 'append') !== 'function') {\n throw new TypeError('Table serializer requires URL search parameters')\n }\n}\n","import {\n DerivedEmitter,\n Emitter,\n LiveQuery,\n QueryArg,\n RestQueryHandler,\n} from '@sylwellsoftware/glue'\nimport type {\n FetchLike,\n QueryHandlerLike,\n QuerySerializer,\n ReadableEmitter,\n} from '@sylwellsoftware/glue'\n\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {TableRow} from './TableHeaderCell.js'\nimport {applyLocalTableState, serializeTableQuery} from './tableQuery.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport type TableQueryArguments = {\n sort: TableSort | null\n filters: TableFilters\n}\n\nexport type TableQueryInput<TRow extends TableRow = TableRow> = ReadableEmitter<\n readonly TRow[] | undefined,\n unknown\n> & {\n retry?: (cause?: unknown) => unknown\n dispose?: () => void\n}\n\nexport interface TableDataSource<TRow extends TableRow = TableRow> {\n readonly query: TableQueryInput<TRow>\n readonly sortEmitter: ValueEmitter<TableSort | null>\n readonly filtersEmitter: ValueEmitter<TableFilters>\n readonly retry?: (cause?: unknown) => unknown\n dispose(): void\n}\n\ninterface TableStateOptions {\n sortEmitter?: ValueEmitter<TableSort | null>\n filtersEmitter?: ValueEmitter<TableFilters>\n owner?: unknown\n}\n\nexport interface LocalTableDataSourceOptions<TRow extends TableRow>\nextends TableStateOptions {\n data: readonly TRow[] | ReadableEmitter<readonly TRow[], unknown>\n}\n\nexport interface QueryTableDataSourceOptions<TRow extends TableRow>\nextends TableStateOptions {\n query: TableQueryInput<TRow>\n}\n\nexport interface HandlerTableDataSourceOptions<TRow extends TableRow>\nextends TableStateOptions {\n handler: QueryHandlerLike<TableQueryArguments, readonly TRow[]>\n}\n\nexport interface RestTableDataSourceOptions<TRow extends TableRow>\nextends TableStateOptions {\n url: string\n baseUrl?: string\n fetch?: FetchLike<readonly TRow[]>\n serializeQuery?: QuerySerializer<TableQueryArguments>\n}\n\n/** Create a source that applies table state to local data. The caller owns it. */\nexport function createLocalTableDataSource<TRow extends TableRow>(\n options: LocalTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n const state = createState(options)\n const ownedData = isReadableEmitter<readonly TRow[]>(options.data)\n ? null\n : new Emitter<readonly TRow[]>(options.data, {\n owner: options.owner,\n purpose: 'local table data',\n })\n const data = ownedData ?? options.data as ReadableEmitter<readonly TRow[], unknown>\n const query = new DerivedEmitter(\n [data, state.sortEmitter, state.filtersEmitter] as const,\n ([rows, sort, filters]) => applyLocalTableState(rows, sort, filters),\n {owner: options.owner, purpose: 'local table view'},\n )\n return new ManagedTableDataSource(query, state, () => {\n query.dispose()\n ownedData?.dispose()\n })\n}\n\n/** Package a caller-owned query with the sort/filter emitters that drive it. */\nexport function createQueryTableDataSource<TRow extends TableRow>(\n options: QueryTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n assertTableQuery<TRow>(options.query)\n const state = createState(options)\n return new ManagedTableDataSource(options.query, state)\n}\n\n/** Create a LiveQuery-backed source from an application-supplied handler. */\nexport function createHandlerTableDataSource<TRow extends TableRow>(\n options: HandlerTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n if (options.handler == null || typeof options.handler.fetch !== 'function') {\n throw new TypeError('Table data-source handler must implement fetch')\n }\n const state = createState(options)\n const sort = new QueryArg<TableSort | null>('sort', state.sortEmitter, {\n owner: options.owner,\n purpose: 'table sort argument',\n })\n const filters = new QueryArg<TableFilters>('filters', state.filtersEmitter, {\n owner: options.owner,\n purpose: 'table filters argument',\n })\n const query = new LiveQuery<readonly TRow[], {sort: typeof sort; filters: typeof filters}>({\n handler: options.handler,\n args: {sort, filters},\n owner: options.owner,\n purpose: 'table query',\n keepPreviousValue: true,\n })\n return new ManagedTableDataSource(query, state, () => {\n query.dispose()\n sort.dispose()\n filters.dispose()\n })\n}\n\n/** Create the convenient REST-backed source. The caller owns the result. */\nexport function createRestTableDataSource<TRow extends TableRow>(\n options: RestTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n if (typeof options.url !== 'string' || options.url.length === 0) {\n throw new TypeError('REST table data source requires a URL')\n }\n const handlerOptions: {\n url: string\n baseUrl?: string\n fetch?: FetchLike<readonly TRow[]>\n serialize: QuerySerializer<TableQueryArguments>\n } = {\n url: options.url,\n serialize: options.serializeQuery ?? serializeTableQuery,\n }\n if (options.baseUrl != null) handlerOptions.baseUrl = options.baseUrl\n if (options.fetch != null) handlerOptions.fetch = options.fetch\n return createHandlerTableDataSource({\n handler: new RestQueryHandler<TableQueryArguments, readonly TRow[]>(handlerOptions),\n ...(options.sortEmitter == null ? {} : {sortEmitter: options.sortEmitter}),\n ...(options.filtersEmitter == null ? {} : {filtersEmitter: options.filtersEmitter}),\n ...(options.owner === undefined ? {} : {owner: options.owner}),\n })\n}\n\ninterface ManagedState {\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n ownedSortEmitter: Emitter<TableSort | null> | null\n ownedFiltersEmitter: Emitter<TableFilters> | null\n}\n\nclass ManagedTableDataSource<TRow extends TableRow> implements TableDataSource<TRow> {\n readonly sortEmitter: ValueEmitter<TableSort | null>\n readonly filtersEmitter: ValueEmitter<TableFilters>\n readonly retry?: (cause?: unknown) => unknown\n private disposed = false\n\n constructor(\n readonly query: TableQueryInput<TRow>,\n private readonly state: ManagedState,\n private readonly disposeQuery: (() => void) | null = null,\n ) {\n this.sortEmitter = state.sortEmitter\n this.filtersEmitter = state.filtersEmitter\n if (query.retry != null) this.retry = (cause?: unknown) => query.retry?.(cause)\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.disposeQuery?.()\n this.state.ownedSortEmitter?.dispose()\n this.state.ownedFiltersEmitter?.dispose()\n }\n}\n\nfunction createState(options: TableStateOptions): ManagedState {\n const ownedSortEmitter = options.sortEmitter == null\n ? new Emitter<TableSort | null>(null, {\n owner: options.owner,\n purpose: 'table sort',\n })\n : null\n const ownedFiltersEmitter = options.filtersEmitter == null\n ? new Emitter<TableFilters>({}, {\n owner: options.owner,\n purpose: 'table filters',\n })\n : null\n return {\n sortEmitter: options.sortEmitter ?? ownedSortEmitter!,\n filtersEmitter: options.filtersEmitter ?? ownedFiltersEmitter!,\n ownedSortEmitter,\n ownedFiltersEmitter,\n }\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === 'function'\n}\n\nfunction assertTableQuery<TRow extends TableRow>(\n value: unknown,\n): asserts value is TableQueryInput<TRow> {\n if (!isReadableEmitter<readonly TRow[] | undefined>(value)) {\n throw new TypeError('Table query must be an emitter')\n }\n}\n","import {Emitter, FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {\n createSelectionHandler,\n defaultItemKey,\n SingleSelectionHandler,\n} from '../selectionhandler.js'\nimport type {\n BaseSelectionHandler,\n ItemKeyGetter,\n} from '../selectionhandler.js'\nimport {TableHeader} from './TableHeader.js'\nimport type {TableColumn, TableRow} from './TableHeaderCell.js'\nimport {\n createLocalTableDataSource,\n createRestTableDataSource,\n} from './tableDataSource.js'\nimport type {\n RestTableDataSourceOptions,\n TableDataSource,\n TableQueryInput,\n} from './tableDataSource.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\ninterface DataTableCommonProps<TRow extends TableRow> extends ComponentProps {\n columns: readonly TableColumn<TRow>[]\n rowKey?: Extract<keyof TRow, string> | ItemKeyGetter<TRow>\n caption?: FrayChild\n emptyMessage?: FrayChild\n placeholderCount?: number\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\ntype DataTableInputProps<TRow extends TableRow> =\n | {\n data?: readonly TRow[] | ReadableEmitter<readonly TRow[], unknown>\n dataSource?: never\n rest?: never\n }\n | {\n data?: never\n dataSource: TableDataSource<TRow>\n rest?: never\n }\n | {\n data?: never\n dataSource?: never\n rest: Omit<RestTableDataSourceOptions<TRow>, 'owner' | 'sortEmitter' | 'filtersEmitter'>\n }\n\ntype DataTableSelectionProps<TRow extends TableRow> =\n | {\n multiSelect?: false\n selectedItemEmitter?: ValueEmitter<TRow | null>\n selectedItemsEmitter?: never\n }\n | {\n multiSelect: true\n selectedItemsEmitter?: ValueEmitter<TRow[]>\n selectedItemEmitter?: never\n }\n\nexport type DataTableProps<TRow extends TableRow = TableRow> =\n DataTableCommonProps<TRow> & DataTableInputProps<TRow> & DataTableSelectionProps<TRow>\n\n/** Accessible table over an explicit local, caller-query, or REST data source. */\nexport class DataTable<TRow extends TableRow = TableRow>\n extends Component<DataTableProps<TRow>> {\n readonly columns: readonly TableColumn<TRow>[]\n readonly rowKey: ItemKeyGetter<TRow>\n readonly sortEmitter: ValueEmitter<TableSort | null>\n readonly filtersEmitter: ValueEmitter<TableFilters>\n readonly selectedItemsEmitter: ValueEmitter<TRow[]>\n readonly selectedItemEmitter: ValueEmitter<TRow | null> | null\n readonly selectionHandler: BaseSelectionHandler<TRow>\n query: TableQueryInput<TRow> | null = null\n private dataSource: TableDataSource<TRow> | null = null\n private readonly suppliedDataSource: TableDataSource<TRow> | null\n private readonly ownedSortEmitter: Emitter<TableSort | null> | null\n private readonly ownedFiltersEmitter: Emitter<TableFilters> | null\n private ownedDataSource: TableDataSource<TRow> | null = null\n\n constructor(props: DataTableProps<TRow>) {\n super(props)\n assertDataTableInput(props)\n this.columns = normalizeColumns(props.columns)\n this.rowKey = normalizeRowKey(props.rowKey)\n this.suppliedDataSource = props.dataSource ?? null\n this.ownedSortEmitter = this.suppliedDataSource == null\n ? new Emitter<TableSort | null>(null, {owner: this, purpose: 'table sort'})\n : null\n this.ownedFiltersEmitter = this.suppliedDataSource == null\n ? new Emitter<TableFilters>({}, {owner: this, purpose: 'table filters'})\n : null\n this.sortEmitter = this.suppliedDataSource?.sortEmitter ?? this.ownedSortEmitter!\n this.filtersEmitter = this.suppliedDataSource?.filtersEmitter ?? this.ownedFiltersEmitter!\n this.selectionHandler = props.multiSelect === true\n ? createSelectionHandler({\n owner: this,\n multiSelect: true,\n ...(props.selectedItemsEmitter == null\n ? {}\n : {selectedItemsEmitter: props.selectedItemsEmitter}),\n getItems: () => this.query?.get() ?? [],\n getKey: this.rowKey,\n })\n : createSelectionHandler({\n owner: this,\n ...(props.selectedItemEmitter == null\n ? {}\n : {selectedItemEmitter: props.selectedItemEmitter}),\n getItems: () => this.query?.get() ?? [],\n getKey: this.rowKey,\n })\n this.selectedItemsEmitter = this.selectionHandler.selectedItemsEmitter\n this.selectedItemEmitter = this.selectionHandler instanceof SingleSelectionHandler\n ? this.selectionHandler.selectedItemEmitter\n : null\n }\n\n initialize(): void {\n if (this.suppliedDataSource != null) {\n this.dataSource = this.suppliedDataSource\n } else if (this.props.rest != null) {\n this.ownedDataSource = createRestTableDataSource({\n ...this.props.rest,\n sortEmitter: this.sortEmitter,\n filtersEmitter: this.filtersEmitter,\n owner: this,\n })\n this.dataSource = this.ownedDataSource\n } else {\n this.ownedDataSource = createLocalTableDataSource({\n data: this.props.data ?? [],\n sortEmitter: this.sortEmitter,\n filtersEmitter: this.filtersEmitter,\n owner: this,\n })\n this.dataSource = this.ownedDataSource\n }\n this.query = this.dataSource.query\n this.watch(this.query, this.selectedItemsEmitter)\n }\n\n render(): FrayChild {\n const rows = this.query?.get() ?? []\n if (!Array.isArray(rows)) throw new TypeError('DataTable query value must be an array')\n const status = this.query?.getFetchState() ?? FetchState.Initial\n const error = this.query?.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const selectedKeys = new Set(\n this.selectedItemsEmitter.get().map((item, index) => this.rowKey(item, index)),\n )\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-loading={isLoading ? '' : null}\n data-error={status === FetchState.Error ? '' : null}\n >\n {isLoading ? <p role=\"status\" data-part=\"status\">Loading rows…</p> : null}\n {status === FetchState.Error ? <div data-part=\"error\" role=\"alert\">\n <span>{errorMessage(error, 'Unable to load rows')}</span>\n {typeof this.dataSource?.retry === 'function'\n ? <button\n type=\"button\"\n onClick={() => this.dataSource?.retry?.('table retry')}\n >Retry</button>\n : null}\n </div> : null}\n <table data-part=\"table\" aria-busy={isLoading ? 'true' : null}>\n {this.props.caption == null ? null : <caption>{this.props.caption}</caption>}\n <TableHeader\n key=\"header\"\n columns={this.columns}\n sortEmitter={this.sortEmitter}\n filtersEmitter={this.filtersEmitter}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n {...(this.props.onFilterChange == null\n ? {}\n : {onFilterChange: this.props.onFilterChange})}\n />\n <tbody>\n {rows.length > 0\n ? rows.map((row, index) =>\n this.renderRow(row, index, selectedKeys))\n : isLoading\n ? this.renderPlaceholders()\n : status === FetchState.Error\n ? null\n : <tr key=\"empty\">\n <td colSpan={this.columns.length}>\n {this.props.emptyMessage ?? 'No rows'}\n </td>\n </tr>}\n </tbody>\n </table>\n </Host>\n }\n\n private renderRow(\n row: TRow,\n index: number,\n selectedKeys: ReadonlySet<unknown>,\n ): FrayChild {\n const key = this.rowKey(row, index)\n const selected = selectedKeys.has(key)\n return <tr\n key={String(key)}\n data-fray-selectable-row=\"\"\n data-index={index}\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >\n {this.columns.map((column) => <td key={String(column.field)}>\n {column.render\n ? column.render(row, index)\n : renderCellValue(row[column.field])}\n </td>)}\n </tr>\n }\n\n private renderPlaceholders(): FrayChild[] {\n const count = this.props.placeholderCount ?? 5\n return Array.from({length: count}, (_, rowIndex) =>\n <tr key={`placeholder-${rowIndex}`}>\n {this.columns.map((column, columnIndex) =>\n <td key={String(column.field)}>\n <Placeholder\n width={45 + ((rowIndex + columnIndex) % 6) * 8}\n />\n </td>)}\n </tr>)\n }\n\n afterUpdate(dom: ChildNode | null): void {\n const rows = dom instanceof Element\n ? dom.querySelectorAll<HTMLElement>('tbody [data-fray-selectable-row]')\n : []\n this.selectionHandler.rowsUpdated(rows)\n }\n\n getSelectedRows(): TRow[] {\n return this.selectionHandler.getSelectedItems()\n }\n\n getSelectedRowsEmitter(): ValueEmitter<TRow[]> {\n return this.selectedItemsEmitter\n }\n\n getSelectedRow(): TRow | null {\n return this.selectedItemEmitter?.get() ?? null\n }\n\n getSelectedRowEmitter(): ValueEmitter<TRow | null> | null {\n return this.selectedItemEmitter\n }\n\n onDestroy(): void {\n this.selectionHandler.destroy()\n this.ownedDataSource?.dispose()\n this.ownedSortEmitter?.dispose()\n this.ownedFiltersEmitter?.dispose()\n }\n\n static dependencies = [Placeholder, TableHeader]\n\n static override hostName = 'data-table'\n static override standaloneHostName = 'data-table'\n\n static css = css`\n & {\n overflow: auto;\n color: var(--ui-text-color);\n }\n\n & > table {\n width: 100%;\n border-collapse: collapse;\n }\n\n & thead:has([data-fray-component=\"filter-panel\"]) {\n position: relative;\n z-index: 1100;\n }\n\n & th,\n & td {\n padding: var(--ui-padding-v) var(--ui-padding-h);\n text-align: start;\n }\n\n & tbody tr[data-fray-selectable-row] {\n cursor: default;\n user-select: none;\n }\n\n & tbody tr:nth-child(odd) {\n background: var(--fray-table-row-background, transparent);\n }\n\n & tbody tr:nth-child(even) {\n background: var(--fray-table-row-alt-background, transparent);\n }\n\n & tbody tr[data-fray-selectable-row]:hover {\n background: var(--fray-row-hover-background, var(--button-background-hover));\n }\n\n & tbody tr[data-fray-selectable-row]:focus-visible {\n outline: 2px solid var(--fray-color-focus, var(--ui-accent-color));\n outline-offset: -2px;\n }\n\n & tbody tr[data-fray-selectable-row][aria-selected=\"true\"] {\n color: var(--fray-selection-color, var(--toggle-selected-text));\n background: var(--fray-selection-background, var(--toggle-selected-bg));\n }\n\n & > [data-part=\"error\"] {\n color: var(--error-color);\n }\n `\n}\n\nfunction normalizeColumns<TRow extends TableRow>(\n columns: unknown,\n): readonly TableColumn<TRow>[] {\n if (!Array.isArray(columns) || columns.length === 0) {\n throw new TypeError('DataTable columns must be a non-empty array')\n }\n const fields = new Set<string>()\n return columns.map((column: unknown) => {\n if (column == null || typeof column !== 'object') {\n throw new TypeError('Every DataTable column requires a field')\n }\n const field = Reflect.get(column, 'field')\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError('Every DataTable column requires a field')\n }\n if (fields.has(field)) throw new Error(`Duplicate DataTable column: ${field}`)\n fields.add(field)\n const render = Reflect.get(column, 'render')\n if (render != null && typeof render !== 'function') {\n throw new TypeError(`DataTable column ${field} render must be a function`)\n }\n // Runtime validation above proves the structural column boundary; the\n // row-specific callback relationship is checked at the public API.\n return column as TableColumn<TRow>\n })\n}\n\nfunction assertDataTableInput<TRow extends TableRow>(props: DataTableProps<TRow>): void {\n const legacyNames = ['mode', 'query', 'queryHandler', 'queryUrl', 'baseUrl', 'fetch',\n 'serializeQuery']\n const legacy = legacyNames.find((name) => Object.hasOwn(props, name))\n if (legacy != null) {\n throw new TypeError(\n `DataTable ${legacy} moved to dataSource/rest; see the 0.3 migration guide`,\n )\n }\n const hasData = props.data !== undefined\n const hasDataSource = props.dataSource !== undefined\n const hasRest = props.rest !== undefined\n if (Number(hasData) + Number(hasDataSource) + Number(hasRest) > 1) {\n throw new TypeError('DataTable accepts exactly one of data, dataSource, or rest')\n }\n if (hasDataSource) {\n const source = props.dataSource\n if (source == null\n || typeof source !== 'object'\n || source.query == null\n || typeof source.sortEmitter?.set !== 'function'\n || typeof source.filtersEmitter?.set !== 'function'\n || typeof source.dispose !== 'function') {\n throw new TypeError('DataTable dataSource must implement the table data-source contract')\n }\n }\n}\n\nfunction normalizeRowKey<TRow extends TableRow>(\n rowKey: DataTableProps<TRow>['rowKey'],\n): ItemKeyGetter<TRow> {\n if (rowKey == null) return defaultItemKey\n if (typeof rowKey === 'function') return rowKey\n if (typeof rowKey === 'string' && rowKey.length > 0) {\n return (row, index) => {\n const key = row[rowKey]\n if (key == null) {\n throw new TypeError(`DataTable row at index ${index} lacks ${rowKey}`)\n }\n return key\n }\n }\n throw new TypeError('DataTable rowKey must be a function or property name')\n}\n\nfunction renderCellValue(value: unknown): FrayChild {\n if (value == null || typeof value === 'string' || typeof value === 'number') return value\n return String(value)\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\n\nexport interface TreeNode<TValue = unknown> {\n id: Key\n label: FrayChild\n textValue?: string\n value?: TValue\n children?: readonly TreeNode<TValue>[]\n}\n\nexport interface TreeItemProps<TValue = unknown> extends ComponentProps {\n id: Key\n label: FrayChild\n textValue?: string\n value?: TValue\n}\n\n/** Declarative tree-node marker consumed by TreeView. */\nexport class TreeItem<TValue = unknown> extends Component<TreeItemProps<TValue>> {\n render(): FrayChild {\n return this.props.children ?? []\n }\n}\n","import {DerivedEmitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport type {Key} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {TreeNode} from './treeitem.js'\n\n/** Validate a tree snapshot and reject keys that are not globally unique. */\nexport function assertTreeNodes<TValue>(\n value: unknown,\n): asserts value is readonly TreeNode<TValue>[] {\n if (!Array.isArray(value)) throw new TypeError('Tree nodes must be an array')\n const keys = new Set<Key>()\n const visit = (nodes: readonly TreeNode<TValue>[]): void => {\n for (const node of nodes) {\n if (node == null || typeof node !== 'object' || node.id == null) {\n throw new TypeError('Each tree node requires an id')\n }\n if (keys.has(node.id)) throw new Error(`Duplicate tree item id: ${String(node.id)}`)\n keys.add(node.id)\n if (!Array.isArray(node.children ?? [])) {\n throw new TypeError(`Tree node ${String(node.id)} children must be an array`)\n }\n visit(node.children ?? [])\n }\n }\n visit(value as readonly TreeNode<TValue>[])\n}\n\nexport function findTreeNode<TValue>(\n nodes: readonly TreeNode<TValue>[],\n key: Key,\n): TreeNode<TValue> | null {\n assertTreeNodes(nodes)\n return findValidatedTreeNode(nodes, key)\n}\n\n/**\n * Project the current node for a key from complete root snapshots.\n *\n * The projection is read-only: application commands update the authoritative\n * source, which causes the full tree and then this projection to recompute.\n */\nexport function deriveTreeNode<TValue>(\n nodes: ReadableEmitter<readonly TreeNode<TValue>[], unknown>,\n key: ReadableEmitter<Key | null, unknown>,\n owner: unknown = null,\n): DerivedEmitter<\n TreeNode<TValue> | null,\n readonly [\n ReadableEmitter<readonly TreeNode<TValue>[], unknown>,\n ReadableEmitter<Key | null, unknown>,\n ]\n> {\n return new DerivedEmitter(\n [nodes, key] as const,\n ([currentNodes, currentKey]) => {\n assertTreeNodes(currentNodes)\n return currentKey == null ? null : findValidatedTreeNode(currentNodes, currentKey)\n },\n {owner, purpose: 'tree node projection'},\n )\n}\n\n/** Return a path-copied root snapshot, or the original array when no key exists. */\nexport function updateTreeNode<TValue>(\n nodes: readonly TreeNode<TValue>[],\n key: Key,\n update: (node: TreeNode<TValue>) => TreeNode<TValue>,\n): readonly TreeNode<TValue>[] {\n assertTreeNodes(nodes)\n if (typeof update !== 'function') throw new TypeError('Tree node update must be a function')\n\n const visit = (items: readonly TreeNode<TValue>[]): readonly TreeNode<TValue>[] => {\n for (let index = 0; index < items.length; index += 1) {\n const node = items[index]!\n if (Object.is(node.id, key)) {\n const updated = update(node)\n if (updated == null || typeof updated !== 'object') {\n throw new TypeError('Tree node update must return a tree node')\n }\n if (!Object.is(updated.id, node.id)) {\n throw new Error('Tree node update cannot change the stable id')\n }\n if (Object.is(updated, node)) return items\n const result = [...items]\n result[index] = updated\n return result\n }\n const children = node.children ?? []\n const updatedChildren = visit(children)\n if (!Object.is(updatedChildren, children)) {\n const result = [...items]\n result[index] = {...node, children: updatedChildren}\n return result\n }\n }\n return items\n }\n\n const result = visit(nodes)\n if (!Object.is(result, nodes)) assertTreeNodes(result)\n return result\n}\n\n/** Apply a path-copy update to an authoritative writable root emitter. */\nexport function updateWritableTreeNode<TValue>(\n nodes: ValueEmitter<readonly TreeNode<TValue>[]>,\n key: Key,\n update: (node: TreeNode<TValue>) => TreeNode<TValue>,\n cause: unknown = 'tree node updated',\n): boolean {\n const current = nodes.get()\n const next = updateTreeNode(current, key, update)\n return Object.is(next, current) ? false : nodes.set(next, cause)\n}\n\nfunction findValidatedTreeNode<TValue>(\n nodes: readonly TreeNode<TValue>[],\n key: Key,\n): TreeNode<TValue> | null {\n for (const node of nodes) {\n if (Object.is(node.id, key)) return node\n const found = findValidatedTreeNode(node.children ?? [], key)\n if (found != null) return found\n }\n return null\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css, isVNode} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport {componentClass, invoke} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {TreeItem} from './treeitem.js'\nimport type {TreeItemProps, TreeNode} from './treeitem.js'\nimport {assertTreeNodes} from './treeModel.js'\n\nexport interface TreeViewProps<TValue = unknown> extends ComponentProps {\n nodes?: readonly TreeNode<TValue>[] | ReadableEmitter<readonly TreeNode<TValue>[], unknown>\n label: string\n selectedKeyEmitter?: ValueEmitter<Key | null>\n expandedKeysEmitter?: ValueEmitter<Key[]>\n renderItem?: (node: TreeNode<TValue>, depth: number) => FrayChild\n onSelect?: (node: TreeNode<TValue>, event: Event) => void\n}\n\ninterface VisibleNode<TValue> {\n node: TreeNode<TValue>\n depth: number\n parentId: Key | null\n position: number\n setSize: number\n}\n\n/** Single-select ARIA tree with controlled expansion and selection. */\nexport class TreeView<TValue = unknown> extends Component<TreeViewProps<TValue>> {\n readonly nodesEmitter: ReadableEmitter<readonly TreeNode<TValue>[], unknown>\n readonly selectedKeyEmitter: ValueEmitter<Key | null>\n readonly expandedKeysEmitter: ValueEmitter<Key[]>\n private readonly ownedNodesEmitter: Emitter<readonly TreeNode<TValue>[]> | null\n private readonly ownedSelectedEmitter: Emitter<Key | null> | null\n private readonly ownedExpandedEmitter: Emitter<Key[]> | null\n private focusedKey: Key | null = null\n private typeahead = ''\n private typeaheadTimer: ReturnType<typeof setTimeout> | null = null\n\n constructor(props: TreeViewProps<TValue>) {\n super(props)\n if (isReadableEmitter<readonly TreeNode<TValue>[]>(props.nodes)) {\n this.nodesEmitter = props.nodes\n this.ownedNodesEmitter = null\n } else {\n const nodes = props.nodes ?? extractDeclarativeNodes<TValue>(props.children)\n this.ownedNodesEmitter = new Emitter(nodes, {\n owner: this,\n purpose: 'tree nodes',\n })\n this.nodesEmitter = this.ownedNodesEmitter\n }\n this.ownedSelectedEmitter = props.selectedKeyEmitter == null\n ? new Emitter<Key | null>(null, {owner: this, purpose: 'selected tree key'})\n : null\n this.selectedKeyEmitter = props.selectedKeyEmitter ?? this.ownedSelectedEmitter!\n this.ownedExpandedEmitter = props.expandedKeysEmitter == null\n ? new Emitter<Key[]>([], {owner: this, purpose: 'expanded tree keys'})\n : null\n this.expandedKeysEmitter = props.expandedKeysEmitter ?? this.ownedExpandedEmitter!\n }\n\n initialize(): void {\n this.reconcile(this.nodesEmitter.get())\n this.watch(this.nodesEmitter, this.selectedKeyEmitter, this.expandedKeysEmitter)\n this.onCleanup(this.nodesEmitter.subscribe(({value}) => this.reconcile(value), {\n emitCurrent: false,\n }))\n }\n\n render(): FrayChild {\n const nodes = this.nodesEmitter.get()\n assertTreeNodes(nodes)\n const expanded = new Set(this.expandedKeysEmitter.get())\n const visible = flattenVisible(nodes, expanded)\n const selected = this.selectedKeyEmitter.get()\n const active = visible.find(({node}) => Object.is(node.id, this.focusedKey))\n ?? visible.find(({node}) => Object.is(node.id, selected))\n ?? visible[0]\n ?? null\n this.focusedKey = active?.node.id ?? null\n\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n {visible.length === 0\n ? <p role=\"status\" data-part=\"empty\">No tree items</p>\n : <div role=\"tree\" aria-label={this.props.label} data-part=\"tree\">\n {visible.map((item, index) => {\n const {node, depth, position, setSize} = item\n const hasChildren = (node.children?.length ?? 0) > 0\n const isExpanded = hasChildren && expanded.has(node.id)\n const isSelected = Object.is(node.id, selected)\n const label = this.props.renderItem?.(node, depth) ?? node.label\n return <div\n key={node.id}\n role=\"treeitem\"\n data-part=\"item\"\n data-index={index}\n data-depth={depth}\n aria-level={depth + 1}\n aria-posinset={position}\n aria-setsize={setSize}\n aria-expanded={hasChildren ? String(isExpanded) : null}\n aria-selected={String(isSelected)}\n tabIndex={Object.is(node.id, active?.node.id) ? 0 : -1}\n style={{'--tree-depth': depth}}\n onClick={(event: MouseEvent) => {\n this.focusedKey = node.id\n if (isExpanderTarget(event.target) && hasChildren) {\n this.toggleExpanded(node.id)\n this.focusRow(node.id)\n return\n }\n this.selectNode(node, event)\n }}\n onFocus={() => this.focusedKey = node.id}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleKeyDown(event, index, visible)}\n >\n <span\n data-part=\"expander\"\n data-expandable={hasChildren ? '' : null}\n aria-hidden=\"true\"\n >{hasChildren ? (isExpanded ? '▾' : '▸') : '•'}</span>\n <span data-part=\"label\">{label}</span>\n </div>\n })}\n </div>}\n </Host>\n }\n\n onDestroy(): void {\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.ownedNodesEmitter?.dispose()\n this.ownedSelectedEmitter?.dispose()\n this.ownedExpandedEmitter?.dispose()\n }\n\n static dependencies = [TreeItem]\n\n static override hostName = 'tree-view'\n static override standaloneHostName = 'tree-view'\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n & > [data-part=\"tree\"] {\n display: grid;\n align-content: start;\n }\n\n & [data-part=\"item\"] {\n display: flex;\n align-items: flex-start;\n gap: 0.35rem;\n min-width: 0;\n padding: 0.38rem 0.5rem;\n padding-inline-start: calc(0.5rem + var(--tree-depth) * 1.1rem);\n cursor: default;\n user-select: none;\n }\n\n & [data-part=\"item\"]:hover {\n background: var(--button-background-hover);\n }\n\n & [data-part=\"item\"]:focus-visible {\n outline: 2px solid var(--ui-accent-color);\n outline-offset: -2px;\n }\n\n & [data-part=\"item\"][aria-selected=\"true\"] {\n color: var(--toggle-selected-text);\n background: var(--toggle-selected-bg);\n }\n\n & [data-part=\"expander\"] {\n flex: 0 0 1rem;\n text-align: center;\n }\n\n & [data-part=\"expander\"][data-expandable] {\n cursor: pointer;\n }\n\n & [data-part=\"label\"] {\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n & > [data-part=\"empty\"] {\n margin: 0;\n padding: var(--ui-padding, 0.75rem);\n }\n\n @media (forced-colors: active) {\n & [data-part=\"item\"][aria-selected=\"true\"] {\n outline: 2px solid Highlight;\n forced-color-adjust: auto;\n }\n }\n `\n\n private reconcile(nodes: readonly TreeNode<TValue>[]): void {\n assertTreeNodes(nodes)\n const allKeys = new Set(flattenAll(nodes).map(({node}) => node.id))\n const selected = this.selectedKeyEmitter.get()\n if (this.ownedSelectedEmitter != null && selected != null && !allKeys.has(selected)) {\n this.selectedKeyEmitter.set(null, 'selected tree item removed')\n }\n const expanded = this.expandedKeysEmitter.get()\n const retained = expanded.filter((key) => allKeys.has(key))\n if (this.ownedExpandedEmitter != null && !sameKeys(expanded, retained)) {\n this.expandedKeysEmitter.set(retained, 'removed tree expansions reconciled')\n }\n if (this.focusedKey != null && !allKeys.has(this.focusedKey)) this.focusedKey = null\n }\n\n private selectNode(node: TreeNode<TValue>, event: Event): void {\n this.selectedKeyEmitter.set(node.id, 'tree item selected')\n invoke(this.props.onSelect, node, event)\n this.focusRow(node.id)\n }\n\n private toggleExpanded(key: Key): void {\n const expanded = this.expandedKeysEmitter.get()\n const contains = expanded.some((candidate) => Object.is(candidate, key))\n this.expandedKeysEmitter.set(\n contains\n ? expanded.filter((candidate) => !Object.is(candidate, key))\n : [...expanded, key],\n contains ? 'tree item collapsed' : 'tree item expanded',\n )\n }\n\n private handleKeyDown(\n event: KeyboardEvent,\n index: number,\n visible: readonly VisibleNode<TValue>[],\n ): void {\n const current = visible[index]\n if (current == null) return\n if (event.key === 'ArrowDown') return this.move(event, visible[index + 1]?.node.id)\n if (event.key === 'ArrowUp') return this.move(event, visible[index - 1]?.node.id)\n if (event.key === 'Home') return this.move(event, visible[0]?.node.id)\n if (event.key === 'End') return this.move(event, visible.at(-1)?.node.id)\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n const children = current.node.children ?? []\n if (children.length === 0) return\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (!expanded) this.toggleExpanded(current.node.id)\n else this.focusRow(children[0]!.id)\n return\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (expanded) this.toggleExpanded(current.node.id)\n else if (current.parentId != null) this.focusRow(current.parentId)\n return\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.selectNode(current.node, event)\n return\n }\n if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n this.handleTypeahead(event, visible, index)\n }\n }\n\n private move(event: KeyboardEvent, key: Key | undefined): void {\n if (key === undefined) return\n event.preventDefault()\n this.focusRow(key)\n }\n\n private focusRow(key: Key): void {\n this.focusedKey = key\n const rows = this.dom instanceof Element\n ? [...this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')]\n : []\n for (const row of rows) {\n const index = Number(row.dataset.index)\n const visible = flattenVisible(\n this.nodesEmitter.get(),\n new Set(this.expandedKeysEmitter.get()),\n )\n const matches = Object.is(visible[index]?.node.id, key)\n row.tabIndex = matches ? 0 : -1\n if (matches) row.focus()\n }\n }\n\n private handleTypeahead(\n event: KeyboardEvent,\n visible: readonly VisibleNode<TValue>[],\n index: number,\n ): void {\n event.preventDefault()\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.typeahead += event.key.toLocaleLowerCase()\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = ''\n this.typeaheadTimer = null\n }, 650)\n const candidates = [...visible.slice(index + 1), ...visible.slice(0, index + 1)]\n const match = candidates.find(({node}) => textValue(node)\n .toLocaleLowerCase()\n .startsWith(this.typeahead))\n if (match != null) this.focusRow(match.node.id)\n }\n}\n\nfunction extractDeclarativeNodes<TValue>(children: ComponentProps['children']): TreeNode<TValue>[] {\n const values = Array.isArray(children) ? children : children == null ? [] : [children]\n return values.filter((child) => isVNode(child) && child.type === TreeItem).map((child) => {\n if (!isVNode(child)) throw new TypeError('TreeView children must be TreeItem nodes')\n const props = child.props as unknown as TreeItemProps<TValue>\n return {\n id: props.id,\n label: props.label,\n ...(props.textValue == null ? {} : {textValue: props.textValue}),\n ...(props.value === undefined ? {} : {value: props.value}),\n children: extractDeclarativeNodes<TValue>(props.children),\n }\n })\n}\n\nfunction flattenVisible<TValue>(\n nodes: readonly TreeNode<TValue>[],\n expanded: ReadonlySet<Key>,\n): VisibleNode<TValue>[] {\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n if ((node.children?.length ?? 0) > 0 && expanded.has(node.id)) {\n visit(node.children ?? [], depth + 1, node.id)\n }\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction flattenAll<TValue>(nodes: readonly TreeNode<TValue>[]): VisibleNode<TValue>[] {\n const allKeys = new Set<Key>()\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n if (allKeys.has(node.id)) throw new Error(`Duplicate tree item id: ${String(node.id)}`)\n allKeys.add(node.id)\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n visit(node.children ?? [], depth + 1, node.id)\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction textValue<TValue>(node: TreeNode<TValue>): string {\n if (node.textValue != null) return node.textValue\n if (typeof node.label === 'string' || typeof node.label === 'number') return String(node.label)\n return String(node.id)\n}\n\nfunction sameKeys(left: readonly Key[], right: readonly Key[]): boolean {\n return left.length === right.length\n && left.every((value, index) => Object.is(value, right[index]))\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction isExpanderTarget(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest('[data-part=\"expander\"]') != null\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, invoke} from '../controlUtils.js'\n\nexport interface ButtonProps extends ComponentProps {\n label?: FrayChild\n type?: 'button' | 'reset' | 'submit'\n disabled?: boolean\n pressed?: boolean\n busy?: boolean\n busyLabel?: FrayChild\n id?: string\n name?: string\n value?: string | number\n title?: string\n ariaLabel?: string\n onClick?: (event: MouseEvent) => void\n}\n\n/** Native actionable button primitive. */\nexport class Button extends Component<ButtonProps> {\n constructor(props: ButtonProps = {}) {\n super(props)\n if (props.onClick != null && typeof props.onClick !== 'function') {\n throw new TypeError('Button onClick must be a function')\n }\n }\n\n render(): FrayChild {\n const {\n children = [],\n label,\n type = 'button',\n disabled = false,\n pressed,\n busy = false,\n busyLabel,\n id,\n name,\n value,\n title,\n ariaLabel,\n onClick,\n } = this.props\n const hasChildren = Array.isArray(children)\n ? children.length > 0\n : children != null && typeof children !== 'boolean'\n const normalContent = hasChildren ? children : (label ?? '')\n const content = busy ? (busyLabel ?? normalContent) : normalContent\n const unavailable = disabled || busy\n\n return <button\n id={id}\n name={name}\n value={value == null ? undefined : String(value)}\n title={title}\n type={type}\n disabled={unavailable}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"button\"\n aria-label={ariaLabel}\n aria-pressed={pressed == null ? null : String(Boolean(pressed))}\n aria-busy={busy ? 'true' : null}\n onClick={(event: MouseEvent) => {\n if (!unavailable) invoke(onClick, event)\n }}\n >{content}</button>\n }\n\n static baseStyles = [\n ['button[data-fray-component=\"button\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n button[data-fray-component=\"button\"] {\n font-family: inherit;\n }\n `\n}\n","import {Button} from '../menu/button.js'\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, Ref} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport interface DialogProps extends ValueControlProps<boolean> {\n id?: string | number | null\n title: FrayChild\n description?: FrayChild\n actions?: FrayChild\n closeLabel?: string\n showCloseButton?: boolean\n initialFocusRef?: Ref<HTMLElement>\n onClose?: () => void\n}\n\n/** Controlled modal built on the native dialog element. */\nexport class Dialog extends Component<DialogProps> {\n readonly openEmitter: ValueEmitter<boolean>\n readonly dialogId: string\n readonly titleId: string\n readonly descriptionId: string\n private dialogElement: HTMLDialogElement | null = null\n private restoreFocusTo: HTMLElement | null = null\n private synchronizedOpen = false\n\n constructor(props: DialogProps) {\n super(props)\n this.openEmitter = createValueEmitter(this, props, false, 'dialog open state')\n this.dialogId = controlId('dialog', props.id)\n this.titleId = `${this.dialogId}-title`\n this.descriptionId = `${this.dialogId}-description`\n }\n\n initialize(): void {\n this.watch(this.openEmitter)\n }\n\n render(): FrayChild {\n const {\n title,\n description,\n actions,\n closeLabel = 'Close',\n showCloseButton = true,\n children = [],\n } = this.props\n return <dialog\n id={this.dialogId}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"dialog\"\n aria-labelledby={this.titleId}\n aria-describedby={description == null ? null : this.descriptionId}\n aria-modal=\"true\"\n ref={(element: HTMLDialogElement | null) => this.dialogElement = element}\n >\n <header data-part=\"header\">\n <h2 id={this.titleId}>{title}</h2>\n </header>\n {description == null ? null : <p id={this.descriptionId} data-part=\"description\">\n {description}\n </p>}\n <div data-part=\"content\">{children}</div>\n {actions == null && !showCloseButton ? null : <footer data-part=\"actions\">\n {actions}\n {showCloseButton ? <Button\n label={closeLabel}\n onClick={() => this.requestClose()}\n /> : null}\n </footer>}\n </dialog>\n }\n\n afterMount(): void {\n const dialog = this.dialogElement\n if (dialog == null) return\n this.listen(dialog, 'cancel', (event: Event) => {\n event.preventDefault()\n this.requestClose()\n })\n this.listen(dialog, 'close', () => {\n if (this.openEmitter.get()) this.openEmitter.set(false, 'native dialog closed')\n this.finishClose()\n })\n this.syncOpenState()\n }\n\n afterUpdate(): void {\n this.syncOpenState()\n }\n\n close(): void {\n this.requestClose()\n }\n\n onDestroy(): void {\n const dialog = this.dialogElement\n if (dialog?.open === true && typeof dialog.close === 'function') dialog.close()\n this.finishClose()\n this.dialogElement = null\n }\n\n static dependencies = [Button]\n\n static css = css`\n dialog[data-fray-component=\"dialog\"] {\n width: min(38rem, calc(100vw - 2rem));\n max-height: min(42rem, calc(100dvh - 2rem));\n padding: 0;\n color: var(--fray-panel-color, var(--ui-text-color));\n background: var(--fray-panel-background, var(--panel-bg));\n border: var(--fray-panel-border, var(--panel-border));\n border-radius: var(--fray-panel-radius, var(--panel-radius));\n box-shadow: var(--fray-dialog-shadow, var(--fray-panel-shadow));\n }\n\n dialog[data-fray-component=\"dialog\"]::backdrop {\n background: var(--fray-dialog-backdrop-background);\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part] {\n padding: var(--panel-padding, 0.75rem);\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"header\"] {\n color: var(\n --fray-dialog-header-color,\n var(--fray-section-header-color, var(--fray-header-color))\n );\n background: var(\n --fray-dialog-header-background,\n var(--fray-section-header-background, var(--fray-header-background))\n );\n border-block-end: var(\n --fray-section-header-border,\n var(--fray-header-border)\n );\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"header\"] h2,\n dialog[data-fray-component=\"dialog\"] > [data-part=\"description\"] {\n margin: 0;\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"content\"] {\n overflow: auto;\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"actions\"] {\n display: flex;\n justify-content: flex-end;\n gap: var(--spacing-small, 0.5rem);\n border-block-start: 1px solid var(--ui-border-color);\n }\n\n @media (prefers-reduced-motion: no-preference) {\n dialog[data-fray-component=\"dialog\"][open] {\n animation: fray-dialog-enter 120ms ease-out;\n }\n }\n\n @keyframes fray-dialog-enter {\n from {\n transform: translateY(0.4rem);\n }\n }\n\n @media (forced-colors: active) {\n dialog[data-fray-component=\"dialog\"] {\n border: 2px solid CanvasText;\n }\n }\n `\n\n private requestClose(): void {\n if (!this.openEmitter.get()) return\n this.openEmitter.set(false, 'dialog close requested')\n }\n\n private syncOpenState(): void {\n const dialog = this.dialogElement\n if (dialog == null) return\n const shouldOpen = this.openEmitter.get()\n if (shouldOpen && !this.synchronizedOpen) {\n const active = document.activeElement\n this.restoreFocusTo = active instanceof HTMLElement ? active : null\n showModal(dialog)\n this.synchronizedOpen = true\n focusInitial(dialog, this.props.initialFocusRef)\n return\n }\n if (!shouldOpen && this.synchronizedOpen) {\n if (dialog.open && typeof dialog.close === 'function') dialog.close()\n else dialog.removeAttribute('open')\n this.finishClose()\n }\n }\n\n private finishClose(): void {\n if (!this.synchronizedOpen && this.restoreFocusTo == null) return\n this.synchronizedOpen = false\n const restore = this.restoreFocusTo\n this.restoreFocusTo = null\n if (restore?.isConnected === true) restore.focus()\n invoke(this.props.onClose)\n }\n}\n\nfunction showModal(dialog: HTMLDialogElement): void {\n if (dialog.open) return\n if (typeof dialog.showModal === 'function') {\n dialog.showModal()\n return\n }\n dialog.setAttribute('open', '')\n}\n\nfunction focusInitial(dialog: HTMLDialogElement, ref: Ref<HTMLElement> | undefined): void {\n const referenced = ref == null\n ? null\n : typeof ref === 'function' ? null : ref.current\n const target = referenced ?? dialog.querySelector<HTMLElement>(\n '[autofocus], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n target?.focus()\n}\n","import {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {Checkbox} from './Checkbox.js'\nimport type {CheckboxProps, CheckboxSymbol} from './Checkbox.js'\n\nexport type QuadCheckboxProps = Omit<CheckboxProps<FilterModeValue>, 'symbols'>\n\n// QuadCheckbox: (Deny ✖) → (Neutral ☐) → (Prefer ✓) → (Require +)\n// Must have all [+]\n// Must not have any [✖]\n// Should have at least one [✓] (if any are marked [✓])\nexport class QuadCheckbox extends Checkbox<FilterModeValue> {\n static override hostName = 'quad-checkbox'\n static override standaloneHostName = 'quad-checkbox'\n\n static symbols = [\n ['✖', FilterMode.Deny],\n ['☐', FilterMode.Neutral],\n ['✓', FilterMode.Prefer],\n ['+', FilterMode.Require],\n ] as const satisfies readonly CheckboxSymbol<FilterModeValue>[]\n\n static defaultSemanticState = FilterMode.Neutral\n\n constructor(props: QuadCheckboxProps = {}) {\n super({...props, symbols: QuadCheckbox.symbols})\n }\n}\n","import {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {Checkbox} from './Checkbox.js'\nimport type {CheckboxProps, CheckboxSymbol} from './Checkbox.js'\n\nexport type TriCheckboxProps = Omit<CheckboxProps<FilterModeValue>, 'symbols'>\n\nexport class TriCheckbox extends Checkbox<FilterModeValue> {\n static override hostName = 'tri-checkbox'\n static override standaloneHostName = 'tri-checkbox'\n\n static symbols = [\n ['✖', FilterMode.Deny],\n ['☐', FilterMode.Neutral],\n ['✓', FilterMode.Prefer],\n ] as const satisfies readonly CheckboxSymbol<FilterModeValue>[]\n\n static defaultSemanticState = FilterMode.Neutral\n\n constructor(props: TriCheckboxProps = {}) {\n super({...props, symbols: TriCheckbox.symbols})\n }\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\nimport {Component, css} from '../component.js'\nimport type {FrayChild} from '../component.js'\nimport {\n assertOptions,\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport type DropdownValue = string | number\n\nexport interface DropdownOption<TValue extends DropdownValue = string> {\n value: TValue\n label?: FrayChild\n disabled?: boolean\n}\n\nexport interface DropdownProps<TValue extends DropdownValue = string>\n extends ValueControlProps<TValue> {\n id?: string | number | null\n options?: readonly DropdownOption<TValue>[]\n | ReadableEmitter<readonly DropdownOption<TValue>[], unknown>\n label?: FrayChild\n name?: string\n disabled?: boolean\n required?: boolean\n error?: unknown\n placeholder?: FrayChild\n ariaLabel?: string\n onChange?: (value: TValue, event: Event) => void\n}\n\nexport class Dropdown<TValue extends DropdownValue = string>\n extends Component<DropdownProps<TValue>> {\n readonly inputId: string\n readonly errorId: string\n readonly optionsEmitter: ReadableEmitter<readonly DropdownOption<TValue>[], unknown>\n readonly valueEmitter: ValueEmitter<TValue>\n private readonly ownsOptionsEmitter: boolean\n\n constructor(props: DropdownProps<TValue> = {}) {\n super(props)\n this.inputId = controlId('dropdown', props.id)\n this.errorId = `${this.inputId}-error`\n const suppliedOptions = props.options ?? []\n if (isReadableEmitter<readonly DropdownOption<TValue>[]>(suppliedOptions)) {\n this.optionsEmitter = suppliedOptions\n this.ownsOptionsEmitter = false\n } else {\n assertOptions<DropdownOption<TValue>>(suppliedOptions)\n this.optionsEmitter = new Emitter<readonly DropdownOption<TValue>[]>(suppliedOptions, {\n owner: this,\n purpose: 'dropdown options',\n })\n this.ownsOptionsEmitter = true\n }\n // The empty string is the DOM select's no-option sentinel. It is only\n // observed when no controlled/default value and no option are present.\n const firstValue = this.optionsEmitter.get()[0]?.value ?? '' as TValue\n this.valueEmitter = createValueEmitter<TValue>(this, props, firstValue, 'dropdown value')\n }\n\n initialize(): void {\n this.watch(this.valueEmitter, this.optionsEmitter)\n }\n\n render(): FrayChild {\n const {\n label,\n name,\n disabled = false,\n required = false,\n error = null,\n placeholder = 'Select…',\n ariaLabel,\n onChange,\n } = this.props\n const options = this.optionsEmitter.get() ?? []\n assertOptions<DropdownOption<TValue>>(options)\n const currentValue = this.valueEmitter.get()\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-disabled={disabled ? '' : null}\n data-required={required ? '' : null}\n data-error={error == null ? null : ''}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <select\n id={this.inputId}\n name={name}\n value={currentValue == null ? '' : String(currentValue)}\n disabled={disabled}\n required={required}\n aria-label={label == null ? ariaLabel : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onChange={(event: Event) => {\n const raw = eventValue(event, 'dropdown change')\n const option = options.find(({value}) => String(value) === raw)\n // A declared option restores TValue; raw is the fallback for\n // JavaScript callers that mutate the select outside that list.\n const nextValue = option?.value ?? raw as TValue\n this.valueEmitter.set(nextValue, 'dropdown selection')\n invoke(onChange, nextValue, event)\n }}\n >\n {currentValue == null || currentValue === ''\n ? <option value=\"\" disabled={required} selected={true}>{placeholder}</option>\n : null}\n {options.map((option) => {\n if (option == null || !Object.hasOwn(option, 'value')) {\n throw new TypeError('Dropdown options require value and label fields')\n }\n return <option\n key={String(option.value)}\n value={String(option.value)}\n disabled={Boolean(option.disabled)}\n selected={Object.is(currentValue, option.value)}\n >{option.label ?? String(option.value)}</option>\n })}\n </select>\n {error == null ? null : <p\n id={this.errorId}\n data-part=\"error\"\n role=\"alert\"\n >{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'dropdown'\n static override standaloneHostName = 'drop-down'\n\n static baseStyles = [\n ['&', ['labeledinput', 'inputline']],\n ['& > label', ['label']],\n ['& > select', ['input', 'inputline']],\n ['&[data-disabled]', ['disabled']],\n ['&[data-error]', ['error']],\n ]\n\n static css = css`\n & {\n position: relative;\n }\n `\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction eventValue(event: Event, purpose: string): string {\n const target = event.currentTarget\n if (target == null || typeof Reflect.get(target, 'value') !== 'string') {\n throw new TypeError(`${purpose} requires a value-bearing event target`)\n }\n return Reflect.get(target, 'value') as string\n}\n","import {Component, css} from '../component.js'\nimport type {FrayChild, Ref} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport interface TextboxProps extends ValueControlProps<string> {\n id?: string | number | null\n label?: FrayChild\n placeholder?: string\n type?: string\n name?: string\n disabled?: boolean\n required?: boolean\n readOnly?: boolean\n error?: unknown\n autoComplete?: string\n inputMode?: string\n minLength?: number\n maxLength?: number\n pattern?: string\n ariaLabel?: string\n inputRef?: Ref<HTMLInputElement>\n onInput?: (value: string, event: Event) => void\n onChange?: (value: string, event: Event) => void\n}\n\nexport class Textbox extends Component<TextboxProps> {\n readonly inputId: string\n readonly errorId: string\n readonly valueEmitter: ValueEmitter<string>\n\n constructor(props: TextboxProps = {}) {\n super(props)\n this.inputId = controlId('textbox', props.id)\n this.errorId = `${this.inputId}-error`\n this.valueEmitter = createValueEmitter(this, props, '', 'textbox value')\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n render(): FrayChild {\n const {\n label,\n placeholder,\n type = 'text',\n name,\n disabled = false,\n required = false,\n readOnly = false,\n error = null,\n autoComplete,\n inputMode,\n minLength,\n maxLength,\n pattern,\n ariaLabel,\n inputRef,\n onInput,\n onChange,\n } = this.props\n const value = this.valueEmitter.get() ?? ''\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-disabled={disabled ? '' : null}\n data-required={required ? '' : null}\n data-error={error == null ? null : ''}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <input\n id={this.inputId}\n name={name}\n type={type}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n readOnly={readOnly}\n autoComplete={autoComplete}\n inputMode={inputMode}\n minLength={minLength}\n maxLength={maxLength}\n pattern={pattern}\n ref={inputRef}\n aria-label={label == null ? ariaLabel : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onInput={(event: Event) => {\n const nextValue = eventValue(event, 'textbox input')\n this.valueEmitter.set(nextValue, 'textbox input')\n invoke(onInput, nextValue, event)\n }}\n onChange={(event: Event) => invoke(\n onChange,\n eventValue(event, 'textbox change'),\n event,\n )}\n />\n {error == null ? null : <p\n id={this.errorId}\n data-part=\"error\"\n role=\"alert\"\n >{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'textbox'\n static override standaloneHostName = 'text-box'\n\n static baseStyles = [\n ['&', ['labeledinput', 'inputline']],\n ['& > label', ['label']],\n ['& > input', ['input', 'inputline']],\n ['&[data-disabled]', ['disabled']],\n ['&[data-error]', ['error']],\n ]\n\n static css = css`\n & input {\n cursor: text;\n }\n\n & > [data-part=\"error\"] {\n margin: 0;\n color: var(--fray-color-error, var(--error-color));\n }\n `\n}\n\nfunction eventValue(event: Event, purpose: string): string {\n const target = event.currentTarget\n if (target == null || typeof Reflect.get(target, 'value') !== 'string') {\n throw new TypeError(`${purpose} requires a value-bearing event target`)\n }\n return Reflect.get(target, 'value') as string\n}\n","import {Component, css} from '../component.js'\nimport type {FrayChild, Key} from '../component.js'\nimport {\n assertOptions,\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport type ToggleOption<TValue extends Key = string> = readonly [\n value: TValue,\n label: FrayChild,\n]\n\nexport interface ToggleProps<TValue extends Key = string>\n extends ValueControlProps<TValue> {\n id?: string | number | null\n options?: readonly ToggleOption<TValue>[]\n label?: FrayChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n onChange?: (value: TValue, event: Event | null) => void\n}\n\n/** Mutually exclusive button group with radio-group semantics. */\nexport class Toggle<TValue extends Key = string> extends Component<ToggleProps<TValue>> {\n readonly valueEmitter: ValueEmitter<TValue>\n readonly groupId: string\n readonly legendId: string\n\n constructor(props: ToggleProps<TValue> = {}) {\n super(props)\n const options = props.options ?? []\n validateToggleOptions(options)\n const firstValue = options[0]?.[0] ?? null\n // Null is the runtime no-option sentinel and is used only when no\n // controlled/default value exists for an empty option set.\n this.valueEmitter = createValueEmitter<TValue>(\n this,\n props,\n firstValue ?? null as unknown as TValue,\n 'toggle value',\n )\n this.groupId = controlId('toggle', props.id)\n this.legendId = `${this.groupId}-label`\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n selectOption(value: TValue, event: Event | null = null): void {\n if (this.props.disabled) return\n this.valueEmitter.set(value, 'toggle option selected')\n invoke(this.props.onChange, value, event)\n }\n\n render(): FrayChild {\n const {\n options = [],\n label,\n disabled = false,\n required = false,\n } = this.props\n validateToggleOptions(options)\n const selectedValue = this.valueEmitter.get()\n const selectedIndex = Math.max(0,\n options.findIndex(([value]) => Object.is(value, selectedValue)))\n\n return <fieldset\n id={this.groupId}\n disabled={disabled}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"toggle\"\n data-disabled={disabled ? '' : null}\n aria-required={required ? 'true' : null}\n >\n {label == null ? null : <legend id={this.legendId}>{label}</legend>}\n <div\n data-part=\"options\"\n role=\"radiogroup\"\n aria-label={label == null ? this.props.ariaLabel : null}\n aria-labelledby={label == null ? null : this.legendId}\n >\n {options.map(([value, optionLabel], index) => <button\n key={String(value)}\n type=\"button\"\n role=\"radio\"\n disabled={disabled}\n data-part=\"option\"\n aria-checked={Object.is(selectedValue, value) ? 'true' : 'false'}\n data-value={String(value)}\n tabIndex={index === selectedIndex ? 0 : -1}\n onClick={(event: MouseEvent) => this.selectOption(value, event)}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleKeyDown(event, index, options)}\n >{optionLabel}</button>)}\n </div>\n </fieldset>\n }\n\n handleKeyDown(\n event: KeyboardEvent,\n index: number,\n options: readonly ToggleOption<TValue>[],\n ): void {\n const {key} = event\n let nextIndex\n if (key === 'ArrowRight' || key === 'ArrowDown') nextIndex = (index + 1) % options.length\n else if (key === 'ArrowLeft' || key === 'ArrowUp') {\n nextIndex = (index - 1 + options.length) % options.length\n } else if (key === 'Home') nextIndex = 0\n else if (key === 'End') nextIndex = options.length - 1\n else return\n\n event.preventDefault()\n const option = options[nextIndex]\n if (option == null) return\n this.selectOption(option[0], event)\n if (this.dom instanceof Element) {\n const radio = this.dom.querySelectorAll<HTMLElement>('[role=\"radio\"]')[nextIndex]\n radio?.focus()\n }\n }\n\n static baseStyles = [\n ['fieldset[data-fray-component=\"toggle\"] > [data-part=\"options\"]', ['uiline']],\n ['fieldset[data-fray-component=\"toggle\"] [data-part=\"option\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n fieldset[data-fray-component=\"toggle\"] {\n margin: 0;\n padding: 0;\n border: 0;\n }\n\n fieldset[data-fray-component=\"toggle\"] > [data-part=\"options\"] {\n display: flex;\n padding: 0;\n }\n\n fieldset[data-fray-component=\"toggle\"] [data-part=\"option\"] {\n background: var(--fray-toggle-button-background, var(--fray-button-background));\n border-radius: 0;\n }\n\n fieldset[data-fray-component=\"toggle\"] [data-part=\"option\"]:first-child {\n border-radius: var(--ui-border-radius) 0 0 var(--ui-border-radius);\n }\n\n fieldset[data-fray-component=\"toggle\"] [data-part=\"option\"]:last-child {\n border-radius: 0 var(--ui-border-radius) var(--ui-border-radius) 0;\n }\n\n fieldset[data-fray-component=\"toggle\"] [data-part=\"option\"][aria-checked=\"true\"] {\n background: var(\n --fray-toggle-button-background-checked,\n var(--fray-selection-background, var(--toggle-selected-bg))\n );\n color: var(--fray-selection-color, var(--toggle-selected-text));\n }\n `\n}\n\nfunction validateToggleOptions<TValue extends Key>(\n options: unknown,\n): asserts options is readonly ToggleOption<TValue>[] {\n assertOptions<unknown>(options)\n for (const option of options) {\n if (!Array.isArray(option) || option.length < 2) {\n throw new TypeError('Toggle options must be [value, label] tuples')\n }\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\nexport interface ToolbarProps extends ComponentProps {\n id?: string\n label?: string\n orientation?: 'horizontal' | 'vertical'\n}\n\nexport class Toolbar extends Component<ToolbarProps> {\n render(): FrayChild {\n const {\n children = [],\n id,\n label = 'Actions',\n orientation = 'horizontal',\n } = this.props\n if (!['horizontal', 'vertical'].includes(orientation)) {\n throw new TypeError('Toolbar orientation must be horizontal or vertical')\n }\n\n const Host = this.Host\n return <Host\n id={id}\n role=\"toolbar\"\n className={componentClass(this.props) || null}\n data-orientation={orientation}\n aria-label={label}\n aria-orientation={orientation}\n >{children}</Host>\n }\n\n static override hostName = 'toolbar'\n static override standaloneHostName = 'tool-bar'\n\n static baseStyles = [\n ['&', ['toolbar']],\n ]\n\n static css = css`\n & {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-small, 0.5rem);\n padding: var(--ui-padding);\n }\n\n &[data-orientation=\"vertical\"] {\n flex-direction: column;\n align-items: stretch;\n }\n `\n}\n","import type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nexport interface ProgressBarProps extends ComponentProps {\n id?: string | number | null\n label: FrayChild\n value?: number | null\n valueEmitter?: ReadableEmitter<number | null, unknown>\n max?: number\n valueText?: string\n}\n\n/** Labelled native progress indicator with determinate and indeterminate modes. */\nexport class ProgressBar extends Component<ProgressBarProps> {\n readonly progressId: string\n\n constructor(props: ProgressBarProps) {\n super(props)\n this.progressId = controlId('progress', props.id)\n if (props.valueEmitter != null && !isReadableEmitter(props.valueEmitter)) {\n throw new TypeError('ProgressBar valueEmitter must be a readable emitter')\n }\n }\n\n render(): FrayChild {\n const max = this.props.max ?? 100\n if (!Number.isFinite(max) || max <= 0) {\n throw new RangeError('ProgressBar max must be a positive finite number')\n }\n const sourceValue = this.props.valueEmitter == null\n ? (this.props.value ?? null)\n : this.read(this.props.valueEmitter)\n if (sourceValue != null && (!Number.isFinite(sourceValue) || sourceValue < 0)) {\n throw new RangeError('ProgressBar value must be null or a non-negative finite number')\n }\n const value = sourceValue == null ? null : Math.min(sourceValue, max)\n const valueText = this.props.valueText ?? (value == null\n ? 'In progress'\n : `${Math.round(value / max * 100)}%`)\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <div data-part=\"label-line\">\n <label htmlFor={this.progressId}>{this.props.label}</label>\n <span data-part=\"value\">{valueText}</span>\n </div>\n <progress\n id={this.progressId}\n value={value == null ? undefined : value}\n max={max}\n aria-valuetext={valueText}\n >{valueText}</progress>\n </Host>\n }\n\n static override hostName = 'progress-bar'\n static override standaloneHostName = 'progress-bar'\n\n static css = css`\n & {\n display: grid;\n gap: var(--spacing-small, 0.5rem);\n }\n\n & > [data-part=\"label-line\"] {\n display: flex;\n justify-content: space-between;\n gap: var(--spacing-medium, 1rem);\n }\n\n & > [data-part=\"label-line\"] > label {\n font-weight: 600;\n }\n\n & > progress {\n width: 100%;\n min-height: 0.8rem;\n color: var(--fray-progress-value-background, var(--ui-accent-color));\n background: var(--fray-progress-track-background, transparent);\n accent-color: var(--fray-color-primary, var(--ui-accent-color));\n }\n\n @media (forced-colors: active) {\n & > progress {\n forced-color-adjust: auto;\n }\n }\n `\n}\n\nfunction isReadableEmitter(value: unknown): value is ReadableEmitter<number | null, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n","export type FrayStylesheetKind = 'theme' | 'colors'\n\nexport interface FrayStylesheetOption {\n value: string\n label: string\n href: string\n}\n\nexport type FrayThemeVariableLayer = 'color' | 'theme'\nexport type FrayThemeVariableValue =\n | 'background'\n | 'border'\n | 'color'\n | 'dimension'\n | 'duration'\n | 'font'\n | 'radius'\n | 'shadow'\n\nexport interface FrayThemeVariableDefinition {\n name: `--fray-${string}`\n layer: FrayThemeVariableLayer\n family: string\n value: FrayThemeVariableValue\n description: string\n fallback?: `--fray-${string}`\n}\n\n/**\n * Public, machine-readable theming contract. Component-specific variables fall\n * back through a family rather than forcing every theme to target every host.\n */\nexport const frayThemeVariableCatalog = Object.freeze([\n variable('--fray-color-canvas', 'color', 'palette', 'color', 'Application canvas'),\n variable('--fray-color-surface', 'color', 'palette', 'color', 'Primary surface'),\n variable('--fray-color-surface-muted', 'color', 'palette', 'color', 'Subdued surface'),\n variable('--fray-color-surface-raised', 'color', 'palette', 'color', 'Raised surface'),\n variable('--fray-color-surface-inset', 'color', 'palette', 'color', 'Inset surface'),\n variable('--fray-color-text', 'color', 'palette', 'color', 'Primary text'),\n variable('--fray-color-text-muted', 'color', 'palette', 'color', 'Secondary text'),\n variable('--fray-color-border', 'color', 'palette', 'color', 'Ordinary border'),\n variable('--fray-color-border-strong', 'color', 'palette', 'color', 'Emphasized border'),\n variable('--fray-color-primary', 'color', 'palette', 'color', 'Primary accent'),\n variable('--fray-color-primary-hover', 'color', 'palette', 'color', 'Hovered accent'),\n variable('--fray-color-primary-active', 'color', 'palette', 'color', 'Active accent'),\n variable('--fray-color-primary-soft', 'color', 'palette', 'color', 'Subtle accent surface'),\n variable('--fray-color-on-primary', 'color', 'palette', 'color', 'Content on primary accent'),\n variable('--fray-color-focus', 'color', 'palette', 'color', 'Keyboard focus indication'),\n variable('--fray-color-selection', 'color', 'palette', 'color', 'Selected item surface'),\n variable('--fray-color-on-selection', 'color', 'palette', 'color', 'Content on selection'),\n variable('--fray-color-disabled', 'color', 'palette', 'color', 'Disabled surface'),\n variable('--fray-color-on-disabled', 'color', 'palette', 'color', 'Disabled content'),\n variable('--fray-color-error', 'color', 'status', 'color', 'Error state'),\n variable('--fray-color-on-error', 'color', 'status', 'color', 'Content on error'),\n variable('--fray-color-success', 'color', 'status', 'color', 'Success state'),\n variable('--fray-color-on-success', 'color', 'status', 'color', 'Content on success'),\n variable('--fray-color-highlight', 'color', 'palette', 'color', 'Light reflection/highlight'),\n variable('--fray-color-shadow', 'color', 'palette', 'color', 'Shadow tint'),\n\n variable('--fray-font-family', 'theme', 'typography', 'font', 'UI font stack'),\n variable('--fray-font-size', 'theme', 'typography', 'dimension', 'Base UI font size'),\n variable('--fray-line-height', 'theme', 'typography', 'dimension', 'Base UI line height'),\n variable('--fray-control-min-height', 'theme', 'control', 'dimension', 'Minimum control height'),\n variable('--fray-space-xs', 'theme', 'spacing', 'dimension', 'Extra-small spacing'),\n variable('--fray-space-sm', 'theme', 'spacing', 'dimension', 'Small spacing'),\n variable('--fray-space-md', 'theme', 'spacing', 'dimension', 'Medium spacing'),\n variable('--fray-space-lg', 'theme', 'spacing', 'dimension', 'Large spacing'),\n variable('--fray-radius-sm', 'theme', 'shape', 'radius', 'Small corner radius'),\n variable('--fray-radius-md', 'theme', 'shape', 'radius', 'Ordinary corner radius'),\n variable('--fray-radius-lg', 'theme', 'shape', 'radius', 'Large corner radius'),\n variable('--fray-motion-fast', 'theme', 'motion', 'duration', 'Fast interaction transition'),\n\n variable('--fray-ui-background', 'theme', 'surface', 'background', 'Default UI background'),\n variable('--fray-ui-color', 'theme', 'surface', 'color', 'Default UI text'),\n variable('--fray-ui-border', 'theme', 'surface', 'border', 'Default UI border'),\n variable('--fray-ui-shadow', 'theme', 'surface', 'shadow', 'Default raised shadow'),\n variable('--fray-focus-ring', 'theme', 'focus', 'shadow', 'Keyboard focus ring'),\n\n variable('--fray-panel-background', 'theme', 'panel', 'background', 'Panel surface', '--fray-ui-background'),\n variable('--fray-panel-color', 'theme', 'panel', 'color', 'Panel content', '--fray-ui-color'),\n variable('--fray-panel-border', 'theme', 'panel', 'border', 'Panel border', '--fray-ui-border'),\n variable('--fray-panel-shadow', 'theme', 'panel', 'shadow', 'Panel shadow', '--fray-ui-shadow'),\n variable('--fray-panel-radius', 'theme', 'panel', 'radius', 'Panel radius', '--fray-radius-md'),\n variable('--fray-dialog-shadow', 'theme', 'dialog', 'shadow', 'Modal dialog shadow', '--fray-panel-shadow'),\n variable('--fray-dialog-backdrop-background', 'theme', 'dialog', 'background', 'Modal backdrop'),\n\n variable('--fray-header-background', 'theme', 'header', 'background', 'Generic header surface'),\n variable('--fray-header-color', 'theme', 'header', 'color', 'Generic header content'),\n variable('--fray-header-border', 'theme', 'header', 'border', 'Generic header border'),\n variable('--fray-header-shadow', 'theme', 'header', 'shadow', 'Generic header shadow'),\n variable('--fray-section-header-background', 'theme', 'header', 'background', 'Section header surface', '--fray-header-background'),\n variable('--fray-section-header-color', 'theme', 'header', 'color', 'Section header content', '--fray-header-color'),\n variable('--fray-section-header-border', 'theme', 'header', 'border', 'Section header border', '--fray-header-border'),\n variable('--fray-section-header-shadow', 'theme', 'header', 'shadow', 'Section header shadow', '--fray-header-shadow'),\n variable('--fray-panel-header-background', 'theme', 'header', 'background', 'Panel header surface', '--fray-section-header-background'),\n variable('--fray-panel-header-color', 'theme', 'header', 'color', 'Panel header content', '--fray-section-header-color'),\n variable('--fray-table-header-background', 'theme', 'header', 'background', 'Table header surface', '--fray-section-header-background'),\n variable('--fray-table-header-color', 'theme', 'header', 'color', 'Table header content', '--fray-section-header-color'),\n variable('--fray-dialog-header-background', 'theme', 'header', 'background', 'Dialog header surface', '--fray-section-header-background'),\n variable('--fray-dialog-header-color', 'theme', 'header', 'color', 'Dialog header content', '--fray-section-header-color'),\n\n variable('--fray-button-background', 'theme', 'button', 'background', 'Generic button surface'),\n variable('--fray-button-background-hover', 'theme', 'button', 'background', 'Hovered button surface'),\n variable('--fray-button-background-active', 'theme', 'button', 'background', 'Pressed button surface'),\n variable('--fray-button-background-disabled', 'theme', 'button', 'background', 'Disabled button surface'),\n variable('--fray-button-color', 'theme', 'button', 'color', 'Generic button content'),\n variable('--fray-button-border', 'theme', 'button', 'border', 'Generic button border'),\n variable('--fray-button-shadow', 'theme', 'button', 'shadow', 'Generic button shadow'),\n variable('--fray-button-shadow-active', 'theme', 'button', 'shadow', 'Pressed button shadow'),\n variable('--fray-toggle-button-background', 'theme', 'button', 'background', 'Toggle option surface', '--fray-button-background'),\n variable('--fray-toggle-button-background-checked', 'theme', 'button', 'background', 'Selected toggle option', '--fray-selection-background'),\n variable('--fray-tab-button-background', 'theme', 'button', 'background', 'Tab surface', '--fray-button-background'),\n variable('--fray-tab-button-background-active', 'theme', 'button', 'background', 'Active tab surface', '--fray-tab-active-background'),\n variable('--fray-menu-button-background', 'theme', 'button', 'background', 'Menu action surface', '--fray-button-background'),\n variable('--fray-dropdown-trigger-background', 'theme', 'button', 'background', 'Dropdown arrow/trigger surface', '--fray-button-background'),\n variable('--fray-table-header-button-background', 'theme', 'button', 'background', 'Table-header action surface', '--fray-button-background'),\n\n variable('--fray-input-background', 'theme', 'input', 'background', 'Input surface'),\n variable('--fray-input-color', 'theme', 'input', 'color', 'Input content'),\n variable('--fray-input-border', 'theme', 'input', 'border', 'Input border'),\n variable('--fray-input-shadow', 'theme', 'input', 'shadow', 'Input shadow'),\n variable('--fray-input-background-disabled', 'theme', 'input', 'background', 'Disabled input surface'),\n variable('--fray-input-color-disabled', 'theme', 'input', 'color', 'Disabled input content'),\n\n variable('--fray-selection-background', 'theme', 'selection', 'background', 'Selected item surface'),\n variable('--fray-selection-color', 'theme', 'selection', 'color', 'Selected item content'),\n variable('--fray-row-hover-background', 'theme', 'row', 'background', 'Hovered list/table/tree row'),\n variable('--fray-table-row-background', 'theme', 'table', 'background', 'Odd table row surface'),\n variable('--fray-table-row-alt-background', 'theme', 'table', 'background', 'Even table row surface'),\n\n variable('--fray-checkbox-box-background', 'theme', 'checkbox', 'background', 'Unchecked checkbox box', '--fray-input-background'),\n variable('--fray-checkbox-box-background-checked', 'theme', 'checkbox', 'background', 'Checked checkbox box', '--fray-selection-background'),\n variable('--fray-checkbox-box-border', 'theme', 'checkbox', 'border', 'Checkbox box border', '--fray-input-border'),\n variable('--fray-checkbox-symbol-color', 'theme', 'checkbox', 'color', 'Checkbox symbol', '--fray-selection-color'),\n variable('--fray-radio-background', 'theme', 'radio', 'background', 'Radio/toggle option surface', '--fray-toggle-button-background'),\n variable('--fray-radio-background-checked', 'theme', 'radio', 'background', 'Selected radio/toggle option', '--fray-selection-background'),\n\n variable('--fray-toolbar-background', 'theme', 'toolbar', 'background', 'Toolbar surface', '--fray-panel-background'),\n variable('--fray-toolbar-color', 'theme', 'toolbar', 'color', 'Toolbar content', '--fray-panel-color'),\n variable('--fray-toolbar-border', 'theme', 'toolbar', 'border', 'Toolbar border', '--fray-panel-border'),\n variable('--fray-toolbar-shadow', 'theme', 'toolbar', 'shadow', 'Toolbar shadow', '--fray-panel-shadow'),\n variable('--fray-tabline-background', 'theme', 'tabs', 'background', 'Tab strip surface', '--fray-panel-background'),\n variable('--fray-tab-active-background', 'theme', 'tabs', 'background', 'Active tab surface', '--fray-panel-background'),\n variable('--fray-progress-track-background', 'theme', 'progress', 'background', 'Progress track'),\n variable('--fray-progress-value-background', 'theme', 'progress', 'background', 'Progress value'),\n variable('--fray-working-background-image', 'theme', 'status', 'background', 'Indeterminate/loading texture'),\n] satisfies readonly FrayThemeVariableDefinition[])\n\nexport const frayThemeOptions = Object.freeze([\n option('shiny', 'Shiny', distributedAssetUrl('themes/shiny/theme.css')),\n option('java', 'Java', distributedAssetUrl('themes/java/theme.css')),\n option('minimal', 'Minimal', distributedAssetUrl('themes/minimal/theme.css')),\n])\n\nexport const frayColorOptions = Object.freeze([\n option('iceblue', 'Ice blue', distributedAssetUrl('colors/iceblue/colors.css')),\n option('ocean', 'Ocean', distributedAssetUrl('colors/ocean/colors.css')),\n option('green', 'Green', distributedAssetUrl('colors/green/colors.css')),\n option('gray', 'Gray', distributedAssetUrl('colors/gray/colors.css')),\n option('orange', 'Orange', distributedAssetUrl('colors/orange/colors.css')),\n option('purple', 'Purple', distributedAssetUrl('colors/purple/colors.css')),\n option('red', 'Red', distributedAssetUrl('colors/red/colors.css')),\n option('yellow', 'Yellow', distributedAssetUrl('colors/yellow/colors.css')),\n])\n\n/** Replace one of the two independently loaded Fray presentation stylesheets. */\nexport function replaceFrayStylesheet(\n kind: FrayStylesheetKind,\n selection: FrayStylesheetOption,\n targetDocument: Document = globalThis.document,\n): HTMLLinkElement {\n assertOption(selection)\n if (targetDocument?.head == null || targetDocument.documentElement == null) {\n throw new TypeError('replaceFrayStylesheet requires a document with a head and root')\n }\n\n const selector = `link[data-fray-stylesheet=\"${kind}\"]`\n let link = targetDocument.head.querySelector<HTMLLinkElement>(selector)\n if (link == null) {\n link = targetDocument.createElement('link')\n link.rel = 'stylesheet'\n link.dataset.frayStylesheet = kind\n targetDocument.head.append(link)\n }\n link.dataset.fraySelection = selection.value\n if (link.getAttribute('href') !== selection.href) link.setAttribute('href', selection.href)\n\n if (kind === 'theme') targetDocument.documentElement.dataset.frayTheme = selection.value\n else targetDocument.documentElement.dataset.frayColor = selection.value\n return link\n}\n\nexport function findFrayStylesheetOption(\n options: readonly FrayStylesheetOption[],\n value: string,\n): FrayStylesheetOption {\n const selection = options.find((option) => option.value === value)\n if (selection == null) throw new RangeError(`Unknown Fray stylesheet selection: ${value}`)\n return selection\n}\n\nfunction variable(\n name: FrayThemeVariableDefinition['name'],\n layer: FrayThemeVariableLayer,\n family: string,\n value: FrayThemeVariableValue,\n description: string,\n fallback?: FrayThemeVariableDefinition['fallback'],\n): FrayThemeVariableDefinition {\n return fallback == null\n ? Object.freeze({name, layer, family, value, description})\n : Object.freeze({name, layer, family, value, description, fallback})\n}\n\nfunction option(value: string, label: string, href: string): FrayStylesheetOption {\n return Object.freeze({value, label, href})\n}\n\n/**\n * Resolve assets from the published package layout (`dist/index.js` is a\n * sibling of `themes/` and `colors/`). The indirection is deliberate: Vite\n * library mode otherwise turns static CSS URLs into data URLs, which would\n * defeat the separately replaceable stylesheet contract.\n */\nfunction distributedAssetUrl(path: string): string {\n const packageRelativePath = import.meta.url.includes('/src/styling/')\n ? `../../${path}`\n : `../${path}`\n return new URL(packageRelativePath, import.meta.url).href\n}\n\nfunction assertOption(option: unknown): asserts option is FrayStylesheetOption {\n if (option == null || typeof option !== 'object') {\n throw new TypeError('Fray stylesheet selection must be an option')\n }\n for (const field of ['value', 'label', 'href'] as const) {\n if (typeof Reflect.get(option, field) !== 'string'\n || String(Reflect.get(option, field)).length === 0) {\n throw new TypeError(`Fray stylesheet option ${field} must be a non-empty string`)\n }\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\nimport {\n findFrayStylesheetOption,\n frayColorOptions,\n frayThemeOptions,\n replaceFrayStylesheet,\n} from '../../styling/theme.js'\nimport type {\n FrayStylesheetKind,\n FrayStylesheetOption,\n} from '../../styling/theme.js'\n\nexport interface StylesheetPickerProps extends ValueControlProps<string> {\n id?: string | number | null\n label?: FrayChild\n ariaLabel?: string\n disabled?: boolean\n options?: readonly FrayStylesheetOption[]\n targetDocument?: Document\n onChange?: (value: string, option: FrayStylesheetOption, event: Event) => void\n}\n\nabstract class StylesheetPicker extends Component<StylesheetPickerProps> {\n readonly valueEmitter: ValueEmitter<string>\n readonly inputId: string\n private readonly kind: FrayStylesheetKind\n private readonly defaults: readonly FrayStylesheetOption[]\n\n constructor(\n props: StylesheetPickerProps,\n kind: FrayStylesheetKind,\n defaults: readonly FrayStylesheetOption[],\n ) {\n super(props)\n const options = props.options ?? defaults\n validateOptions(options)\n const fallback = options[0]?.value\n if (fallback == null) throw new TypeError(`${kind} picker requires at least one option`)\n this.kind = kind\n this.defaults = defaults\n this.inputId = controlId(`${kind}-picker`, props.id)\n this.valueEmitter = createValueEmitter(this, props, fallback, `${kind} selection`)\n findFrayStylesheetOption(options, this.valueEmitter.get())\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n render(): FrayChild {\n const options = this.options\n const selected = findFrayStylesheetOption(options, this.valueEmitter.get())\n const {label, ariaLabel, disabled = false, onChange} = this.props\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-kind={this.kind}\n data-disabled={disabled ? '' : null}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <select\n id={this.inputId}\n data-part=\"control\"\n value={selected.value}\n disabled={disabled}\n aria-label={label == null ? ariaLabel : null}\n onChange={(event: Event) => {\n const value = selectedValue(event)\n const option = findFrayStylesheetOption(options, value)\n this.valueEmitter.set(value, `${this.kind} selected`)\n invoke(onChange, value, option, event)\n }}\n >\n {options.map((option) => <option\n key={option.value}\n value={option.value}\n selected={option.value === selected.value}\n >{option.label}</option>)}\n </select>\n </Host>\n }\n\n afterMount(): void {\n this.applySelection()\n }\n\n afterUpdate(): void {\n this.applySelection()\n }\n\n protected get options(): readonly FrayStylesheetOption[] {\n const options = this.props.options ?? this.defaults\n validateOptions(options)\n return options\n }\n\n private applySelection(): void {\n const targetDocument = this.props.targetDocument\n ?? (typeof document === 'undefined' ? null : document)\n if (targetDocument == null) return\n replaceFrayStylesheet(\n this.kind,\n findFrayStylesheetOption(this.options, this.valueEmitter.get()),\n targetDocument,\n )\n }\n\n static baseStyles = [\n ['&', ['labeledinput', 'inputline']],\n ['& > label', ['label']],\n ['& > select', ['input', 'inputline']],\n ['&[data-disabled]', ['disabled']],\n ]\n\n static css = css`\n & {\n position: relative;\n }\n\n & > select {\n min-width: 8rem;\n }\n `\n}\n\nexport class ThemePicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'theme', frayThemeOptions)\n }\n\n static override hostName = 'theme-picker'\n static override standaloneHostName = 'theme-picker'\n}\n\nexport class ColorPicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'colors', frayColorOptions)\n }\n\n static override hostName = 'color-picker'\n static override standaloneHostName = 'color-picker'\n}\n\nfunction validateOptions(\n options: readonly FrayStylesheetOption[],\n): asserts options is readonly FrayStylesheetOption[] {\n if (!Array.isArray(options) || options.length === 0) {\n throw new TypeError('Stylesheet picker options must be a non-empty array')\n }\n const values = new Set<string>()\n for (const option of options) {\n if (option == null || typeof option !== 'object') {\n throw new TypeError('Stylesheet picker options must be objects')\n }\n for (const field of ['value', 'label', 'href'] as const) {\n if (typeof option[field] !== 'string' || option[field].length === 0) {\n throw new TypeError(`Stylesheet picker option ${field} must be a string`)\n }\n }\n if (values.has(option.value)) {\n throw new Error(`Duplicate stylesheet picker value: ${option.value}`)\n }\n values.add(option.value)\n }\n}\n\nfunction selectedValue(event: Event): string {\n const value = event.currentTarget == null\n ? null\n : Reflect.get(event.currentTarget, 'value')\n if (typeof value !== 'string') {\n throw new TypeError('Stylesheet picker change requires a select element')\n }\n return value\n}\n"],"names":["Tab","Component","FilterMode","isFilterMode","value","mode","nextControlId","controlId","prefix","provided","createValueEmitter","component","props","fallback","purpose","assertEmitter","initialValue","options","Emitter","name","componentClass","invoke","callback","args","assertOptions","describeState","TabLine","__publicField","tabs","validateTabs","emitterProps","_a","tab","event","label","baseId","activeTabId","Host","jsx","index","tabButtonId","tabPanelId","enabled","tabIndex","current","next","css","id","safeId","ids","TabPanel","extractTabs","nextProps","selected","jsxs","disabled","direct","declarative","child","isVNode","tabProps","Panel","header","toolbar","children","orientation","title","Sidebar","ariaLabel","SplitView","primary","secondary","direction","primarySize","primaryLabel","secondaryLabel","DescriptionItem","term","DescriptionList","Placeholder","width","normalizeWidth","numeric","matchesFilterState","item","state","dimensions","assertDefinitions","dimension","optionState","active","option","preferred","filterByState","items","deriveFilterPredicate","owner","DerivedEmitter","deriveFilteredItems","currentItems","currentState","serializeFilterState","assertFilterState","dimensionKey","optionKey","parseFilterState","isRecord","rawOptions","assertKey","dimensionKeys","optionKeys","BaseSelectionHandler","getItems","getKey","defaultItemKey","selectedItemsEmitter","rows","row","clampIndex","onClick","onKeyDown","onMouseDown","onMouseEnter","ownerDocument","onMouseUp","lastIndex","nextIndex","_startIndex","_endIndex","_event","_index","cause","selectedKeys","cleanup","suppressClick","SingleSelectionHandler","config","owned","selectedItemEmitter","SingleSelectionArrayView","MultiSelectionHandler","first","last","range","isCommandPressed","mergeByKey","key","candidate","candidateIndex","startIndex","endIndex","createSelectionHandler","source","eventOrCause","listener","notification","length","left","right","result","keys","ListView","isReadableEmitter","normalizeKeyGetter","status","error","isLoading","FetchState","errorMessage","_","content","defaultItemLabel","dom","itemKey","isRenderablePrimitive","Checkbox","componentType","validateSymbols","currentIndex","nextValue","required","semanticState","semanticIndex","symbol","stateName","checked","symbols","tuple","FilterPanel","isEmitterLike","values","fetchState","_b","_c","filters","normalizeFilters","filterModes","defaultSemanticState","activeValues","optionValue","optionLabel","valueEmitter","FilterModeCheckbox","nextState","emitter","existing","viewport","anchor","panel","spaceAbove","spaceBelow","placeAbove","available","isFrayLabel","TableHeaderCell","currentSort","isFilterSelectionEntry","filterLabel","entry","TableHeader","column","DefaultTableFilterEncoding","serializeTableQuery","url","sort","assertUrlLike","assertSort","field","entries","applyLocalTableState","filtered","matchesFilters","compareValues","readField","isSortDirection","searchParams","createLocalTableDataSource","createState","ownedData","data","query","ManagedTableDataSource","createQueryTableDataSource","assertTableQuery","createHandlerTableDataSource","QueryArg","LiveQuery","createRestTableDataSource","handlerOptions","RestQueryHandler","disposeQuery","ownedSortEmitter","ownedFiltersEmitter","DataTable","assertDataTableInput","normalizeColumns","normalizeRowKey","_d","renderCellValue","count","rowIndex","columnIndex","columns","fields","render","legacy","hasData","hasDataSource","hasRest","rowKey","TreeItem","assertTreeNodes","visit","nodes","node","findTreeNode","findValidatedTreeNode","deriveTreeNode","currentNodes","currentKey","updateTreeNode","update","updated","updatedChildren","updateWritableTreeNode","found","TreeView","extractDeclarativeNodes","expanded","visible","flattenVisible","depth","position","setSize","hasChildren","isExpanded","isSelected","isExpanderTarget","allKeys","flattenAll","retained","sameKeys","contains","matches","match","textValue","parentId","target","Button","type","pressed","busy","busyLabel","normalContent","unavailable","Dialog","description","actions","closeLabel","showCloseButton","element","dialog","shouldOpen","showModal","focusInitial","restore","ref","_QuadCheckbox","QuadCheckbox","_TriCheckbox","TriCheckbox","Dropdown","suppliedOptions","firstValue","placeholder","onChange","currentValue","raw","eventValue","Textbox","readOnly","autoComplete","inputMode","minLength","maxLength","pattern","inputRef","onInput","Toggle","validateToggleOptions","selectedValue","selectedIndex","radio","Toolbar","ProgressBar","max","sourceValue","valueText","frayThemeVariableCatalog","variable","frayThemeOptions","distributedAssetUrl","frayColorOptions","replaceFrayStylesheet","kind","selection","targetDocument","assertOption","selector","link","findFrayStylesheetOption","layer","family","href","path","packageRelativePath","StylesheetPicker","defaults","validateOptions","ThemePicker","ColorPicker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/Components/layout/tabpanel/tab.ts","../src/util/filterMode.ts","../src/Components/controlUtils.ts","../src/Components/layout/tabpanel/tabline.tsx","../src/Components/layout/tabpanel/tabpanel.tsx","../src/Components/layout/panel.tsx","../src/Components/layout/sidebar.tsx","../src/Components/layout/splitView.tsx","../src/Components/data/descriptionList.tsx","../src/Components/Placeholder.tsx","../src/Components/data/filterState.ts","../src/Components/data/selectionhandler.ts","../src/Components/data/listview/listview.tsx","../src/Components/lineinputs/checkbox/Checkbox.tsx","../src/Components/data/table/FilterPanel.tsx","../src/Components/data/table/TableHeaderCell.tsx","../src/Components/data/table/TableHeader.tsx","../src/Components/data/table/tableQuery.ts","../src/Components/data/table/tableDataSource.ts","../src/Components/data/table/DataTable.tsx","../src/Components/data/treeview/treeitem.tsx","../src/Components/data/treeview/treeModel.ts","../src/Components/data/treeview/treeview.tsx","../src/Components/menu/button.tsx","../src/Components/dialog/dialog.tsx","../src/Components/lineinputs/checkbox/QuadCheckbox.ts","../src/Components/lineinputs/checkbox/TriCheckbox.ts","../src/Components/lineinputs/dropdown.tsx","../src/Components/lineinputs/textbox.tsx","../src/Components/lineinputs/toggle.tsx","../src/Components/menu/toolbar.tsx","../src/Components/status/progressBar.tsx","../src/styling/theme.ts","../src/Components/theme/stylesheetPicker.tsx"],"sourcesContent":["import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\n\nexport interface TabProps extends ComponentProps {\n id?: Key\n label?: FrayChild\n disabled?: boolean\n}\n\n/** Declarative content marker consumed by TabPanel. */\nexport class Tab extends Component<TabProps> {\n render(): FrayChild {\n return this.props.children ?? []\n }\n}\n","/** Represents the filter mode for a query. */\nexport const FilterMode = {\n /** Deny mode: Excludes items that match the filter. */\n Deny: 'deny',\n /** Require mode: Includes only items that match the filter. */\n Require: 'require',\n /** Prefer mode: If there are any filter options that are set to Prefer, at least one of the preferred filter options must match. Otherwise, it is treated as Neutral. */\n Prefer: 'prefer',\n /** Neutral mode: Does not affect the inclusion or exclusion of items. */\n Neutral: 'neutral',\n} as const\n\nexport type FilterModeValue = typeof FilterMode[keyof typeof FilterMode]\n\n/** Return whether a value is one of Fray's semantic filter modes. */\nexport function isFilterMode(value: unknown): value is FilterModeValue {\n return Object.values(FilterMode).some((mode) => mode === value)\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {EmitterOptions, ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport type {Component, ComponentProps} from './component.js'\nimport {isFilterMode} from '../util/filterMode.js'\n\nexport interface ValueEmitter<TValue> extends ReadableEmitter<TValue, unknown> {\n set(value: TValue, eventOrCause?: unknown): boolean\n}\n\nexport interface ValueControlProps<TValue> extends ComponentProps {\n valueEmitter?: ValueEmitter<TValue>\n value?: TValue\n defaultValue?: TValue\n initialValue?: TValue\n}\n\nlet nextControlId = 1\n\nexport function controlId(prefix: string, provided?: string | number | null): string {\n if (provided != null && String(provided).length > 0) return String(provided)\n return `fray-${prefix}-${nextControlId++}`\n}\n\nexport function createValueEmitter<TValue>(\n component: Component,\n props: ValueControlProps<TValue>,\n fallback: TValue,\n purpose: string,\n): ValueEmitter<TValue> {\n if (props.valueEmitter != null) {\n assertEmitter<TValue>(props.valueEmitter, 'valueEmitter')\n return props.valueEmitter\n }\n const initialValue = props.defaultValue\n ?? props.value\n ?? props.initialValue\n ?? fallback\n const options: EmitterOptions<TValue> = {owner: component, purpose}\n return new Emitter(initialValue, options)\n}\n\nexport function assertEmitter<TValue = unknown>(\n value: unknown,\n name = 'emitter',\n): asserts value is ValueEmitter<TValue> {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'get') !== 'function'\n || typeof Reflect.get(value, 'set') !== 'function'\n || typeof Reflect.get(value, 'subscribe') !== 'function') {\n throw new TypeError(`${name} must be an emitter`)\n }\n}\n\nexport function classNames(...values: unknown[]): string {\n return values\n .flatMap((value) => typeof value === 'string' ? value.split(/\\s+/) : [])\n .filter(Boolean)\n .join(' ')\n}\n\nexport function componentClass(props: Pick<ComponentProps, 'class' | 'className'>): string {\n return props.className ?? props.class ?? ''\n}\n\nexport function invoke<TArguments extends unknown[]>(\n callback: ((...args: TArguments) => void) | null | undefined,\n ...args: TArguments\n): void {\n if (callback == null) return\n if (typeof callback !== 'function') throw new TypeError('Control callback must be a function')\n callback(...args)\n}\n\nexport function assertOptions<TOption>(\n options: unknown,\n name = 'options',\n): asserts options is TOption[] {\n if (!Array.isArray(options)) throw new TypeError(`${name} must be an array`)\n}\n\nexport function describeState(value: unknown): string {\n if (isFilterMode(value)) return value\n return String(value)\n}\n","import {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport {\n componentClass,\n createValueEmitter,\n invoke,\n} from '../../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../../controlUtils.js'\n\nexport interface TabLineTab {\n id: Key\n label?: FrayChild\n disabled?: boolean\n}\n\nexport interface TabLineProps extends ValueControlProps<Key | null> {\n tabs?: readonly TabLineTab[]\n activeTabEmitter?: ValueEmitter<Key | null>\n initialActiveTabId?: Key | null\n label?: string\n baseId?: string\n onChange?: (value: Key, event: Event | null) => void\n}\n\nexport class TabLine extends Component<TabLineProps> {\n readonly valueEmitter: ValueEmitter<Key | null>\n readonly activeTabEmitter: ValueEmitter<Key | null>\n\n constructor(props: TabLineProps = {}) {\n super(props)\n const tabs = props.tabs ?? []\n validateTabs(tabs)\n const emitterProps: TabLineProps = {...props}\n if (emitterProps.valueEmitter == null && props.activeTabEmitter != null) {\n emitterProps.valueEmitter = props.activeTabEmitter\n }\n if (emitterProps.defaultValue == null && props.initialActiveTabId != null) {\n emitterProps.defaultValue = props.initialActiveTabId\n }\n this.valueEmitter = createValueEmitter<Key | null>(\n this,\n emitterProps,\n tabs.find((tab) => !tab.disabled)?.id ?? null,\n 'active tab',\n )\n this.activeTabEmitter = this.valueEmitter\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n selectTab(tab: TabLineTab | undefined, event: Event | null = null): void {\n if (tab == null || tab.disabled) return\n this.valueEmitter.set(tab.id, 'tab selected')\n invoke(this.props.onChange, tab.id, event)\n }\n\n render(): FrayChild {\n const {tabs = [], label = 'Sections', baseId = 'fray-tabs'} = this.props\n validateTabs(tabs)\n const activeTabId = this.valueEmitter.get()\n\n const Host = this.Host\n return <Host\n role=\"tablist\"\n className={componentClass(this.props) || null}\n aria-label={label}\n >\n {tabs.map((tab, index) => <button\n key={String(tab.id)}\n id={tabButtonId(baseId, tab.id)}\n type=\"button\"\n role=\"tab\"\n disabled={Boolean(tab.disabled)}\n aria-selected={Object.is(activeTabId, tab.id) ? 'true' : 'false'}\n aria-controls={tabPanelId(baseId, tab.id)}\n tabIndex={Object.is(activeTabId, tab.id) ? 0 : -1}\n onClick={(event: MouseEvent) => this.selectTab(tab, event)}\n onKeyDown={(event: KeyboardEvent) => this.handleKeyDown(event, index, tabs)}\n >{tab.label ?? String(tab.id)}</button>)}\n </Host>\n }\n\n handleKeyDown(event: KeyboardEvent, index: number, tabs: readonly TabLineTab[]): void {\n const enabled = tabs\n .map((tab, tabIndex) => ({tab, tabIndex}))\n .filter(({tab}) => !tab.disabled)\n if (enabled.length === 0) return\n const current = Math.max(0,\n enabled.findIndex(({tabIndex}) => tabIndex === index))\n let next: {tab: TabLineTab; tabIndex: number} | undefined\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n next = enabled[(current + 1) % enabled.length]\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n next = enabled[(current - 1 + enabled.length) % enabled.length]\n } else if (event.key === 'Home') next = enabled[0]\n else if (event.key === 'End') next = enabled.at(-1)\n else return\n\n if (next == null) return\n event.preventDefault()\n this.selectTab(next.tab, event)\n if (this.dom instanceof Element) {\n const tab = this.dom.querySelectorAll<HTMLElement>('[role=\"tab\"]')[next.tabIndex]\n tab?.focus()\n }\n }\n\n static override hostName = 'tab-line'\n static override standaloneHostName = 'tab-line'\n\n static baseStyles = [\n ['& > button[role=\"tab\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n & {\n display: flex;\n flex-flow: row wrap;\n padding-top: 3px;\n }\n `\n}\n\nexport function tabButtonId(baseId: string, id: Key): string {\n return `${baseId}-tab-${safeId(id)}`\n}\n\nexport function tabPanelId(baseId: string, id: Key): string {\n return `${baseId}-panel-${safeId(id)}`\n}\n\nfunction safeId(value: Key): string {\n return encodeURIComponent(String(value)).replaceAll('%', '-')\n}\n\nfunction validateTabs(tabs: unknown): asserts tabs is readonly TabLineTab[] {\n if (!Array.isArray(tabs)) throw new TypeError('TabLine tabs must be an array')\n const ids = new Set<Key>()\n for (const tab of tabs) {\n if (tab == null || tab.id == null) throw new TypeError('Each tab requires an id')\n if (ids.has(tab.id)) throw new Error(`Duplicate tab id: ${String(tab.id)}`)\n ids.add(tab.id)\n }\n}\n","import {Component, css, isVNode} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport {\n classNames,\n componentClass,\n controlId,\n createValueEmitter,\n} from '../../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../../controlUtils.js'\nimport {Tab} from './tab.js'\nimport type {TabProps} from './tab.js'\nimport {TabLine, tabButtonId, tabPanelId} from './tabline.js'\n\nexport interface TabDefinition {\n id: Key\n label?: FrayChild\n disabled?: boolean\n content?: FrayChild\n component?: FrayChild\n}\n\nexport interface TabPanelProps extends ValueControlProps<Key | null> {\n id?: string | number | null\n tabs?: readonly TabDefinition[]\n activeTabEmitter?: ValueEmitter<Key | null>\n initialActiveTabId?: Key | null\n label?: string\n onChange?: (value: Key, event: Event | null) => void\n}\n\ninterface NormalizedTab {\n id: Key\n label: FrayChild\n disabled: boolean\n content: FrayChild\n}\n\nexport class TabPanel extends Component<TabPanelProps> {\n readonly valueEmitter: ValueEmitter<Key | null>\n readonly activeTabEmitter: ValueEmitter<Key | null>\n readonly baseId: string\n\n constructor(props: TabPanelProps = {}) {\n super(props)\n const tabs = extractTabs(props)\n const emitterProps: TabPanelProps = {...props}\n if (emitterProps.valueEmitter == null && props.activeTabEmitter != null) {\n emitterProps.valueEmitter = props.activeTabEmitter\n }\n if (emitterProps.defaultValue == null && props.initialActiveTabId != null) {\n emitterProps.defaultValue = props.initialActiveTabId\n }\n this.valueEmitter = createValueEmitter<Key | null>(\n this,\n emitterProps,\n tabs.find((tab) => !tab.disabled)?.id ?? null,\n 'active tab',\n )\n this.activeTabEmitter = this.valueEmitter\n this.baseId = controlId('tabs', props.id)\n }\n\n initialize(): void {\n const tabs = extractTabs(this.props)\n if (!tabs.some(({id}) => Object.is(id, this.valueEmitter.get()))) {\n this.valueEmitter.set(tabs.find((tab) => !tab.disabled)?.id ?? null)\n }\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: TabPanelProps): this {\n super.setProps(nextProps)\n const tabs = extractTabs(nextProps)\n if (!tabs.some(({id}) => Object.is(id, this.valueEmitter.get()))) {\n this.valueEmitter.set(tabs.find((tab) => !tab.disabled)?.id ?? null)\n }\n return this\n }\n\n render(): FrayChild {\n const tabs = extractTabs(this.props)\n const selected = tabs.find(({id}) => Object.is(id, this.valueEmitter.get()))\n ?? tabs.find((tab) => !tab.disabled)\n ?? null\n const Host = this.Host\n return <Host\n id={this.baseId}\n className={classNames('panellike', componentClass(this.props))}\n >\n <TabLine\n key=\"tab-list\"\n tabs={tabs.map(({id, label, disabled}) => ({id, label, disabled}))}\n valueEmitter={this.valueEmitter}\n baseId={this.baseId}\n {...(this.props.label == null ? {} : {label: this.props.label})}\n {...(this.props.onChange == null ? {} : {onChange: this.props.onChange})}\n />\n {selected == null ? null : <div\n key={String(selected.id)}\n id={tabPanelId(this.baseId, selected.id)}\n role=\"tabpanel\"\n data-part=\"content\"\n aria-labelledby={tabButtonId(this.baseId, selected.id)}\n tabIndex={0}\n >{selected.content}</div>}\n </Host>\n }\n\n static dependencies = [TabLine, Tab]\n\n static override hostName = 'tab-panel'\n static override standaloneHostName = 'tab-panel'\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 0;\n overflow: hidden;\n }\n\n & > [data-part=\"content\"] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: auto;\n }\n `\n}\n\nfunction extractTabs(props: TabPanelProps): NormalizedTab[] {\n const direct = props.tabs ?? []\n if (!Array.isArray(direct)) throw new TypeError('TabPanel tabs must be an array')\n const children = Array.isArray(props.children)\n ? props.children\n : props.children == null ? [] : [props.children]\n const declarative: NormalizedTab[] = children\n .filter((child) => isVNode(child) && child.type === Tab)\n .map((child, index) => {\n if (!isVNode(child)) throw new TypeError('TabPanel children must be Tab nodes')\n // The preceding vnode type check identifies the declarative Tab;\n // its public constructor contract supplies the corresponding props.\n const tabProps = child.props as TabProps\n return {\n id: tabProps.id ?? `tab-${index + 1}`,\n label: tabProps.label ?? `Tab ${index + 1}`,\n disabled: Boolean(tabProps.disabled),\n content: tabProps.children ?? [],\n }\n })\n const tabs: NormalizedTab[] = direct.length > 0\n ? direct.map((tab: TabDefinition) => ({\n ...tab,\n label: tab.label ?? String(tab.id),\n disabled: Boolean(tab.disabled),\n content: tab.content ?? tab.component ?? [],\n }))\n : declarative\n const ids = new Set<Key>()\n for (const tab of tabs) {\n if (tab?.id == null) throw new TypeError('Each tab requires an id')\n if (ids.has(tab.id)) throw new Error(`Duplicate tab id: ${String(tab.id)}`)\n ids.add(tab.id)\n }\n return tabs\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {classNames, componentClass, controlId} from '../controlUtils.js'\n\nexport interface PanelProps extends ComponentProps {\n id?: string | number | null\n header?: FrayChild\n toolbar?: FrayChild\n orientation?: 'horizontal' | 'vertical'\n disabled?: boolean\n}\n\nexport class Panel extends Component<PanelProps> {\n readonly panelId: string\n readonly headerId: string\n\n constructor(props: PanelProps = {}) {\n super(props)\n this.panelId = controlId('panel', props.id)\n this.headerId = `${this.panelId}-title`\n }\n\n render() {\n const {\n header = null,\n toolbar = null,\n children = [],\n orientation = 'vertical',\n disabled = false,\n } = this.props\n if (!['horizontal', 'vertical'].includes(orientation)) {\n throw new TypeError('Panel orientation must be horizontal or vertical')\n }\n\n const Host = this.Host\n const title = header == null\n ? null\n : <header>\n {typeof header === 'string' || typeof header === 'number'\n ? <h2 id={this.headerId}>{header}</h2>\n : <div id={this.headerId}>{header}</div>}\n </header>\n\n return <Host\n id={this.panelId}\n role={header == null ? null : 'region'}\n className={classNames('panellike', componentClass(this.props))}\n data-orientation={orientation}\n data-disabled={disabled ? '' : null}\n aria-disabled={disabled ? 'true' : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {toolbar}\n <div data-part=\"content\" data-orientation={orientation}>{children}</div>\n </Host>\n }\n\n static override hostName = 'panel'\n static override standaloneHostName = 'layout-panel'\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n overflow: auto;\n flex: 0 0 auto;\n }\n\n & > header h2 {\n margin: 0;\n font: inherit;\n }\n\n & > [data-part=\"content\"] {\n display: flex;\n flex: 1;\n overflow: auto;\n padding: var(--panel-padding, 0.75rem);\n gap: var(--spacing-medium, 1rem);\n }\n\n & > [data-part=\"content\"][data-orientation=\"horizontal\"] {\n flex-direction: row;\n }\n\n & > [data-part=\"content\"][data-orientation=\"vertical\"] {\n flex-direction: column;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nexport interface SidebarProps extends ComponentProps {\n id?: string | number | null\n header?: FrayChild\n toolbar?: FrayChild\n ariaLabel?: string\n}\n\n/** Labelled side region whose content owns vertical scrolling. */\nexport class Sidebar extends Component<SidebarProps> {\n readonly sidebarId: string\n readonly headerId: string\n\n constructor(props: SidebarProps = {}) {\n super(props)\n this.sidebarId = controlId('sidebar', props.id)\n this.headerId = `${this.sidebarId}-title`\n }\n\n render(): FrayChild {\n const {\n header = null,\n toolbar = null,\n ariaLabel,\n children = [],\n } = this.props\n const title = header == null\n ? null\n : <header>\n {typeof header === 'string' || typeof header === 'number'\n ? <h2 id={this.headerId}>{header}</h2>\n : <div id={this.headerId}>{header}</div>}\n </header>\n\n return <aside\n id={this.sidebarId}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"sidebar\"\n aria-label={header == null ? ariaLabel : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {toolbar == null ? null : <div data-part=\"toolbar\">{toolbar}</div>}\n <div data-part=\"content\" tabIndex={0}>{children}</div>\n </aside>\n }\n\n static css = css`\n aside {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n aside > header,\n aside > [data-part=\"toolbar\"] {\n flex: 0 0 auto;\n }\n\n aside > header h2 {\n margin: 0;\n font: inherit;\n }\n\n aside > [data-part=\"content\"] {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\nexport interface SplitViewProps extends ComponentProps {\n primary?: FrayChild\n secondary?: FrayChild\n direction?: 'horizontal' | 'vertical'\n primarySize?: string\n primaryLabel?: string\n secondaryLabel?: string\n}\n\n/** Two-pane layout with explicit overflow ownership and no resizing behavior. */\nexport class SplitView extends Component<SplitViewProps> {\n render(): FrayChild {\n const {\n primary = null,\n secondary = null,\n direction = 'horizontal',\n primarySize,\n primaryLabel,\n secondaryLabel,\n } = this.props\n if (direction !== 'horizontal' && direction !== 'vertical') {\n throw new TypeError('SplitView direction must be horizontal or vertical')\n }\n if (primarySize != null && (typeof primarySize !== 'string' || primarySize.length === 0)) {\n throw new TypeError('SplitView primarySize must be a non-empty CSS size')\n }\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-direction={direction}\n style={primarySize == null ? undefined : {'--split-primary-size': primarySize}}\n >\n <div\n data-part=\"primary\"\n role={primaryLabel == null ? null : 'region'}\n aria-label={primaryLabel}\n >{primary}</div>\n <div\n data-part=\"secondary\"\n role={secondaryLabel == null ? null : 'region'}\n aria-label={secondaryLabel}\n >{secondary ?? this.props.children ?? []}</div>\n </Host>\n }\n\n static override hostName = 'split-view'\n static override standaloneHostName = 'split-view'\n\n static css = css`\n & {\n display: grid;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n &[data-direction=\"horizontal\"] {\n grid-template-columns:\n var(--split-primary-size, minmax(16rem, 0.8fr))\n minmax(0, 1.2fr);\n }\n\n &[data-direction=\"vertical\"] {\n grid-template-rows:\n var(--split-primary-size, minmax(12rem, 0.8fr))\n minmax(0, 1.2fr);\n }\n\n & > [data-part] {\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n &[data-direction=\"horizontal\"] > [data-part=\"primary\"] {\n border-inline-end: 1px solid var(--ui-border-color);\n }\n\n &[data-direction=\"vertical\"] > [data-part=\"primary\"] {\n border-block-end: 1px solid var(--ui-border-color);\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {classNames, componentClass} from '../controlUtils.js'\n\nexport interface DescriptionItemProps extends ComponentProps {\n term: FrayChild\n value?: FrayChild\n}\n\n/** A term/value group with standards-valid `dl` children. */\nexport class DescriptionItem extends Component<DescriptionItemProps> {\n render(): FrayChild {\n const {term, value, children = []} = this.props\n return <div\n className={componentClass(this.props) || undefined}\n data-fray-component=\"description-item\"\n >\n <dt>{term}</dt>\n <dd>{value ?? children}</dd>\n </div>\n }\n\n static css = css`\n div:has(> dt + dd) {\n display: grid;\n grid-template-columns: minmax(7rem, 0.7fr) minmax(0, 1.3fr);\n gap: var(--spacing-small, 0.5rem);\n padding-block: var(--spacing-small, 0.5rem);\n }\n\n div:has(> dt + dd) > dd {\n min-width: 0;\n margin: 0;\n overflow-wrap: anywhere;\n }\n\n @media (max-width: 36rem) {\n div:has(> dt + dd) {\n grid-template-columns: minmax(0, 1fr);\n gap: 0.15rem;\n }\n }\n `\n}\n\nexport interface DescriptionListProps extends ComponentProps {\n label?: string\n}\n\n/** Semantic description-list container for compact record summaries. */\nexport class DescriptionList extends Component<DescriptionListProps> {\n render(): FrayChild {\n return <dl\n className={classNames('datacomponentlike', componentClass(this.props))}\n data-fray-component=\"description-list\"\n aria-label={this.props.label}\n >{this.props.children ?? []}</dl>\n }\n\n static dependencies = [DescriptionItem]\n\n static css = css`\n dl:has(> div > dt + dd) {\n display: grid;\n margin: 0;\n }\n `\n}\n","import {Component, css} from './component.js'\nimport type {ComponentProps} from './component.js'\n\nexport interface PlaceholderProps extends ComponentProps {\n width?: number | string\n}\n\n/** Deterministic loading placeholder for data components. */\nexport class Placeholder extends Component<PlaceholderProps> {\n render() {\n const width = normalizeWidth(this.props.width ?? 65)\n const Host = this.Host\n return <Host style={{width: `${width}%`}} aria-hidden=\"true\" />\n }\n\n static override hostName = 'placeholder'\n static override standaloneHostName = 'loading-placeholder'\n\n static baseStyles = [\n ['&::after', ['after', 'working']],\n ]\n\n static css = css`\n & {\n display: block;\n min-width: 3rem;\n height: 1em;\n overflow: hidden;\n background: currentColor;\n border-radius: var(--ui-border-radius);\n opacity: 0.18;\n position: relative;\n }\n\n @keyframes fray-placeholder-progress {\n from { background-position: 0 0; }\n to { background-position: 2rem 0; }\n }\n `\n}\n\nfunction normalizeWidth(width: number | string): number {\n const numeric = Number(width)\n if (!Number.isFinite(numeric)) throw new TypeError('Placeholder width must be numeric')\n return Math.min(100, Math.max(10, numeric))\n}\n","import {DerivedEmitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {FilterMode, isFilterMode} from '../../util/filterMode.js'\nimport type {FilterModeValue} from '../../util/filterMode.js'\n\nexport type FilterOptionState = Readonly<Record<string, FilterModeValue>>\nexport type FilterState = Readonly<Record<string, FilterOptionState>>\n\nexport interface SerializedFilterState {\n readonly version: 1\n readonly dimensions: Record<string, Record<string, FilterModeValue>>\n}\n\nexport interface FilterOptionDefinition<TItem> {\n /** Stable persisted identity within its dimension. */\n key: string\n matches: (item: TItem) => boolean\n}\n\nexport interface FilterDimensionDefinition<TItem> {\n /** Stable persisted identity for the dimension. */\n key: string\n options: readonly FilterOptionDefinition<TItem>[]\n}\n\n/**\n * Test an item against semantic filter state.\n *\n * Dimensions combine with AND. Within one dimension, deny wins, every required\n * option must match, and at least one preferred option must match when any are\n * active. Unknown persisted dimensions and options are retained by\n * serialization but do not constrain matching.\n */\nexport function matchesFilterState<TItem>(\n item: TItem,\n state: FilterState,\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n): boolean {\n assertDefinitions(dimensions)\n for (const dimension of dimensions) {\n const optionState = state[dimension.key]\n if (optionState == null) continue\n const active = dimension.options.flatMap((option) => {\n const mode = optionState[option.key]\n return mode == null || mode === FilterMode.Neutral ? [] : [{option, mode}]\n })\n if (active.some(({option, mode}) => mode === FilterMode.Deny && option.matches(item))) {\n return false\n }\n const required = active.filter(({mode}) => mode === FilterMode.Require)\n if (required.some(({option}) => !option.matches(item))) {\n return false\n }\n const preferred = active.filter(({mode}) => mode === FilterMode.Prefer)\n if (preferred.length > 0 && !preferred.some(({option}) => option.matches(item))) {\n return false\n }\n }\n return true\n}\n\nexport function filterByState<TItem>(\n items: readonly TItem[],\n state: FilterState,\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n): TItem[] {\n if (!Array.isArray(items)) throw new TypeError('Filtered items must be an array')\n return items.filter((item) => matchesFilterState(item, state, dimensions))\n}\n\n/** Derive a reusable predicate without giving Fray ownership of persistence. */\nexport function deriveFilterPredicate<TItem>(\n state: ReadableEmitter<FilterState, unknown>,\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n owner: unknown = null,\n): DerivedEmitter<(item: TItem) => boolean, readonly [ReadableEmitter<FilterState, unknown>]> {\n assertDefinitions(dimensions)\n return new DerivedEmitter(\n [state] as const,\n ([current]) => (item: TItem) => matchesFilterState(item, current, dimensions),\n {owner, purpose: 'filter predicate'},\n )\n}\n\n/** Derive a filtered collection from application-owned items and filter state. */\nexport function deriveFilteredItems<TItem>(\n items: ReadableEmitter<readonly TItem[], unknown>,\n state: ReadableEmitter<FilterState, unknown>,\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n owner: unknown = null,\n): DerivedEmitter<\n TItem[],\n readonly [ReadableEmitter<readonly TItem[], unknown>, ReadableEmitter<FilterState, unknown>]\n> {\n assertDefinitions(dimensions)\n return new DerivedEmitter(\n [items, state] as const,\n ([currentItems, currentState]) => filterByState(currentItems, currentState, dimensions),\n {owner, purpose: 'filtered items'},\n )\n}\n\n/** Convert state to deterministic, versioned, plain JSON-compatible data. */\nexport function serializeFilterState(state: FilterState): SerializedFilterState {\n assertFilterState(state)\n const dimensions: Record<string, Record<string, FilterModeValue>> = {}\n for (const dimensionKey of Object.keys(state).sort()) {\n const options: Record<string, FilterModeValue> = {}\n const dimension = state[dimensionKey]!\n for (const optionKey of Object.keys(dimension).sort()) {\n options[optionKey] = dimension[optionKey]!\n }\n dimensions[dimensionKey] = options\n }\n return {version: 1, dimensions}\n}\n\n/** Validate and restore versioned filter data. Unknown keys are preserved. */\nexport function parseFilterState(value: unknown): FilterState {\n if (!isRecord(value) || value.version !== 1 || !isRecord(value.dimensions)) {\n throw new TypeError('Filter state must use version 1 with a dimensions object')\n }\n const state: Record<string, Record<string, FilterModeValue>> = {}\n for (const [dimensionKey, rawOptions] of Object.entries(value.dimensions)) {\n assertKey(dimensionKey, 'Filter dimension')\n if (!isRecord(rawOptions)) {\n throw new TypeError(`Filter dimension ${dimensionKey} must be an object`)\n }\n const options: Record<string, FilterModeValue> = {}\n for (const [optionKey, mode] of Object.entries(rawOptions)) {\n assertKey(optionKey, `Filter option in ${dimensionKey}`)\n if (!isFilterMode(mode)) {\n throw new TypeError(\n `Unknown filter mode for ${dimensionKey}.${optionKey}: ${String(mode)}`,\n )\n }\n options[optionKey] = mode\n }\n state[dimensionKey] = options\n }\n return state\n}\n\nfunction assertFilterState(value: unknown): asserts value is FilterState {\n if (!isRecord(value)) throw new TypeError('Filter state must be an object')\n for (const [dimensionKey, options] of Object.entries(value)) {\n assertKey(dimensionKey, 'Filter dimension')\n if (!isRecord(options)) {\n throw new TypeError(`Filter dimension ${dimensionKey} must be an object`)\n }\n for (const [optionKey, mode] of Object.entries(options)) {\n assertKey(optionKey, `Filter option in ${dimensionKey}`)\n if (!isFilterMode(mode)) {\n throw new TypeError(\n `Unknown filter mode for ${dimensionKey}.${optionKey}: ${String(mode)}`,\n )\n }\n }\n }\n}\n\nfunction assertDefinitions<TItem>(\n dimensions: readonly FilterDimensionDefinition<TItem>[],\n): void {\n if (!Array.isArray(dimensions)) throw new TypeError('Filter dimensions must be an array')\n const dimensionKeys = new Set<string>()\n for (const dimension of dimensions) {\n assertKey(dimension.key, 'Filter dimension')\n if (dimensionKeys.has(dimension.key)) {\n throw new Error(`Duplicate filter dimension: ${dimension.key}`)\n }\n dimensionKeys.add(dimension.key)\n if (!Array.isArray(dimension.options)) {\n throw new TypeError(`Filter dimension ${dimension.key} options must be an array`)\n }\n const optionKeys = new Set<string>()\n for (const option of dimension.options) {\n assertKey(option.key, `Filter option in ${dimension.key}`)\n if (optionKeys.has(option.key)) {\n throw new Error(`Duplicate filter option: ${dimension.key}.${option.key}`)\n }\n optionKeys.add(option.key)\n if (typeof option.matches !== 'function') {\n throw new TypeError(`Filter matcher ${dimension.key}.${option.key} must be a function`)\n }\n }\n }\n}\n\nfunction assertKey(value: string, name: string): void {\n if (value.length === 0 || value === '__proto__' || value === 'prototype'\n || value === 'constructor') {\n throw new TypeError(`${name} key is not safe for persisted state`)\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {\n EmitterNotification,\n SubscribeOptions,\n} from '@sylwellsoftware/glue'\n\nimport type {ValueEmitter} from '../controlUtils.js'\n\nexport type ItemKeyGetter<TItem> = (item: TItem, index: number) => unknown\n\ninterface SelectionHandlerCommonConfig<TItem> {\n getItems: () => readonly TItem[]\n getKey?: ItemKeyGetter<TItem>\n owner?: unknown\n}\n\nexport interface SingleSelectionHandlerConfig<TItem>\nextends SelectionHandlerCommonConfig<TItem> {\n multiSelect?: false\n selectedItemEmitter?: ValueEmitter<TItem | null>\n selectedItemsEmitter?: never\n}\n\nexport interface MultiSelectionHandlerConfig<TItem>\nextends SelectionHandlerCommonConfig<TItem> {\n multiSelect: true\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n selectedItemEmitter?: never\n}\n\nexport type SelectionHandlerConfig<TItem> =\n | SingleSelectionHandlerConfig<TItem>\n | MultiSelectionHandlerConfig<TItem>\n\ninterface BaseSelectionHandlerConfig<TItem> extends SelectionHandlerCommonConfig<TItem> {\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n}\n\ntype SelectionEvent = MouseEvent | KeyboardEvent\n\n/**\n * DOM selection behavior backed by an explicit row-data provider.\n *\n * Construction is side-effect free. Row listeners are installed by\n * `rowsUpdated()` and are always released before the next row set is wired.\n */\nexport class BaseSelectionHandler<TItem = unknown> {\n readonly getItems: () => readonly TItem[]\n readonly getKey: ItemKeyGetter<TItem>\n readonly selectedItemsEmitter: ValueEmitter<TItem[]>\n readonly selectedItems$: ValueEmitter<TItem[]>\n readonly ownsSelectedItemsEmitter: boolean\n protected rows: HTMLElement[] = []\n private readonly rowCleanups: Array<() => void> = []\n protected activeIndex = 0\n protected anchorIndex: number | null = null\n private dragStartIndex: number | null = null\n private dragOriginEvent: MouseEvent | null = null\n private dragMoved = false\n private dragCleanup: (() => void) | null = null\n private suppressNextClick = false\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null\n private destroyed = false\n private readonly ownedSelectedItemsEmitter: Emitter<TItem[]> | null\n\n constructor({\n getItems,\n getKey = defaultItemKey,\n selectedItemsEmitter,\n owner = null,\n }: BaseSelectionHandlerConfig<TItem>) {\n if (typeof getItems !== 'function') {\n throw new TypeError('Selection handler getItems must be a function')\n }\n if (typeof getKey !== 'function') {\n throw new TypeError('Selection handler getKey must be a function')\n }\n this.getItems = getItems\n this.getKey = getKey\n this.ownedSelectedItemsEmitter = selectedItemsEmitter == null\n ? new Emitter<TItem[]>([], {owner, purpose: 'selected items'})\n : null\n this.selectedItemsEmitter = selectedItemsEmitter\n ?? this.ownedSelectedItemsEmitter!\n this.selectedItems$ = this.selectedItemsEmitter\n this.ownsSelectedItemsEmitter = this.ownedSelectedItemsEmitter != null\n }\n\n rowsUpdated(rows: Iterable<HTMLElement> | ArrayLike<HTMLElement> | null): void {\n if (this.destroyed) return\n this.releaseRows()\n this.rows = Array.from(rows ?? [])\n this.rows.forEach((row, index) => this.wireRow(row, index))\n this.activeIndex = clampIndex(this.activeIndex, this.rows.length)\n this.reconcileSelectedItems()\n this.syncRows()\n }\n\n private wireRow(row: HTMLElement, index: number): void {\n const onClick = (event: MouseEvent): void => this.handleClick(index, event)\n const onKeyDown = (event: KeyboardEvent): void => this.handleKeyDown(index, event)\n const onMouseDown = (event: MouseEvent): void => this.handleMouseDown(index, event, row)\n const onMouseEnter = (event: MouseEvent): void => this.handleMouseEnter(index, event)\n row.addEventListener('click', onClick)\n row.addEventListener('keydown', onKeyDown)\n row.addEventListener('mousedown', onMouseDown)\n row.addEventListener('mouseenter', onMouseEnter)\n this.rowCleanups.push(() => {\n row.removeEventListener('click', onClick)\n row.removeEventListener('keydown', onKeyDown)\n row.removeEventListener('mousedown', onMouseDown)\n row.removeEventListener('mouseenter', onMouseEnter)\n })\n }\n\n private handleClick(index: number, event: MouseEvent): void {\n event.preventDefault()\n if (this.suppressNextClick) {\n this.clearClickSuppression()\n return\n }\n this.activeIndex = index\n this.selectIndex(index, event)\n this.rows[index]?.focus()\n }\n\n private handleMouseDown(index: number, event: MouseEvent, row: HTMLElement): void {\n if (event.button !== 0 || !this.supportsDragSelection()) return\n this.finishDrag(false)\n this.clearClickSuppression()\n this.dragStartIndex = index\n this.dragOriginEvent = event\n this.dragMoved = false\n const ownerDocument = row.ownerDocument\n const onMouseUp = (): void => this.finishDrag(this.dragMoved)\n ownerDocument.addEventListener('mouseup', onMouseUp)\n this.dragCleanup = () => ownerDocument.removeEventListener('mouseup', onMouseUp)\n }\n\n private handleMouseEnter(index: number, event: MouseEvent): void {\n if (this.dragStartIndex == null) return\n if (index === this.dragStartIndex && !this.dragMoved) return\n if (index === this.activeIndex && this.dragMoved) return\n event.preventDefault()\n this.dragMoved = true\n this.activeIndex = index\n this.selectDragRange(this.dragStartIndex, index, this.dragOriginEvent ?? event)\n this.rows[index]?.focus()\n }\n\n private handleKeyDown(index: number, event: KeyboardEvent): void {\n const lastIndex = this.rows.length - 1\n let nextIndex: number\n if (event.key === 'ArrowDown') nextIndex = Math.min(index + 1, lastIndex)\n else if (event.key === 'ArrowUp') nextIndex = Math.max(index - 1, 0)\n else if (event.key === 'Home') nextIndex = 0\n else if (event.key === 'End') nextIndex = lastIndex\n else if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n this.activeIndex = index\n this.selectIndex(index, event)\n return\n } else return\n\n event.preventDefault()\n this.activeIndex = nextIndex\n this.onKeyboardMove(nextIndex, event)\n this.syncRows()\n this.rows[nextIndex]?.focus()\n }\n\n protected onKeyboardMove(index: number, event: KeyboardEvent): void {\n this.selectIndex(index, event)\n }\n\n protected supportsDragSelection(): boolean {\n return false\n }\n\n protected selectDragRange(\n _startIndex: number,\n _endIndex: number,\n _event: MouseEvent,\n ): void {}\n\n protected selectIndex(_index: number, _event: SelectionEvent): void {}\n\n protected setSelectedItems(items: TItem[], cause = 'selection changed'): void {\n this.selectedItemsEmitter.set(items, cause)\n this.syncRows()\n }\n\n getSelectedItems(): TItem[] {\n return this.selectedItemsEmitter.get() ?? []\n }\n\n getSelectedItemsEmitter(): ValueEmitter<TItem[]> {\n return this.selectedItemsEmitter\n }\n\n private reconcileSelectedItems(): void {\n const selected = this.getSelectedItems()\n if (selected.length === 0) return\n const selectedKeys = new Set(selected.map((item, index) => this.getKey(item, index)))\n const current = this.getItems().filter((item, index) =>\n selectedKeys.has(this.getKey(item, index)))\n if (current.length !== selected.length\n || current.some((item, index) => !Object.is(item, selected[index]))) {\n this.selectedItemsEmitter.set([...current], 'selection reconciled with rows')\n }\n }\n\n private syncRows(): void {\n const selectedKeys = new Set(this.getSelectedItems().map((item, index) =>\n this.getKey(item, index)))\n const items = this.getItems()\n this.rows.forEach((row, index) => {\n const item = items[index]\n const selected = item !== undefined\n && selectedKeys.has(this.getKey(item, index))\n row.classList.toggle('selected', selected)\n row.setAttribute('aria-selected', String(selected))\n row.tabIndex = index === this.activeIndex ? 0 : -1\n })\n }\n\n private releaseRows(): void {\n for (const cleanup of this.rowCleanups.splice(0)) cleanup()\n this.rows = []\n }\n\n private finishDrag(suppressClick: boolean): void {\n this.dragCleanup?.()\n this.dragCleanup = null\n this.dragStartIndex = null\n this.dragOriginEvent = null\n this.dragMoved = false\n if (!suppressClick) return\n this.suppressNextClick = true\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = setTimeout(() => this.clearClickSuppression(), 0)\n }\n\n private clearClickSuppression(): void {\n this.suppressNextClick = false\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = null\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.finishDrag(false)\n this.clearClickSuppression()\n this.releaseRows()\n this.ownedSelectedItemsEmitter?.dispose()\n }\n}\n\nexport class SingleSelectionHandler<TItem = unknown> extends BaseSelectionHandler<TItem> {\n readonly selectedItemEmitter: ValueEmitter<TItem | null>\n readonly selectedItem$: ValueEmitter<TItem | null>\n private readonly ownedSelectedItemEmitter: Emitter<TItem | null> | null\n\n constructor(config: SingleSelectionHandlerConfig<TItem>) {\n const owned = config.selectedItemEmitter == null\n ? new Emitter<TItem | null>(null, {\n owner: config.owner,\n purpose: 'selected item',\n })\n : null\n const selectedItemEmitter = config.selectedItemEmitter ?? owned!\n super({\n getItems: config.getItems,\n ...(config.getKey == null ? {} : {getKey: config.getKey}),\n ...(config.owner === undefined ? {} : {owner: config.owner}),\n selectedItemsEmitter: new SingleSelectionArrayView(selectedItemEmitter),\n })\n this.ownedSelectedItemEmitter = owned\n this.selectedItemEmitter = selectedItemEmitter\n this.selectedItem$ = selectedItemEmitter\n }\n\n protected selectIndex(index: number): void {\n const item = this.getItems()[index]\n if (item === undefined) return\n this.anchorIndex = index\n this.setSelectedItems([item], 'single selection changed')\n }\n\n getSelectedItem(): TItem | null {\n return this.selectedItemEmitter.get()\n }\n\n override destroy(): void {\n super.destroy()\n this.ownedSelectedItemEmitter?.dispose()\n }\n}\n\nexport class MultiSelectionHandler<TItem = unknown> extends BaseSelectionHandler<TItem> {\n protected selectIndex(index: number, event: SelectionEvent): void {\n const items = this.getItems()\n const item = items[index]\n if (item === undefined) return\n\n if (event.shiftKey && this.anchorIndex != null) {\n const first = Math.min(this.anchorIndex, index)\n const last = Math.max(this.anchorIndex, index)\n const range = items.slice(first, last + 1)\n const next = isCommandPressed(event)\n ? mergeByKey(this.getSelectedItems(), range, this.getKey)\n : [...range]\n this.setSelectedItems(next, 'range selection changed')\n return\n }\n\n if (isCommandPressed(event) || ('key' in event && event.key === ' ')) {\n const selected = this.getSelectedItems()\n const key = this.getKey(item, index)\n const exists = selected.some((candidate, candidateIndex) =>\n Object.is(this.getKey(candidate, candidateIndex), key))\n const next = exists\n ? selected.filter((candidate, candidateIndex) =>\n !Object.is(this.getKey(candidate, candidateIndex), key))\n : [...selected, item]\n this.anchorIndex = index\n this.setSelectedItems(next, 'multi selection toggled')\n return\n }\n\n this.anchorIndex = index\n this.setSelectedItems([item], 'multi selection changed')\n }\n\n protected onKeyboardMove(index: number, event: KeyboardEvent): void {\n if (event.shiftKey) this.selectIndex(index, event)\n }\n\n protected supportsDragSelection(): boolean {\n return true\n }\n\n protected selectDragRange(\n startIndex: number,\n endIndex: number,\n event: MouseEvent,\n ): void {\n const items = this.getItems()\n const first = Math.min(startIndex, endIndex)\n const last = Math.max(startIndex, endIndex)\n const range = items.slice(first, last + 1)\n const next = isCommandPressed(event)\n ? mergeByKey(this.getSelectedItems(), range, this.getKey)\n : [...range]\n this.anchorIndex = startIndex\n this.setSelectedItems(next, 'drag selection changed')\n }\n}\n\nexport function createSelectionHandler<TItem>(\n config: MultiSelectionHandlerConfig<TItem>,\n): MultiSelectionHandler<TItem>\nexport function createSelectionHandler<TItem>(\n config: SingleSelectionHandlerConfig<TItem>,\n): SingleSelectionHandler<TItem>\nexport function createSelectionHandler<TItem>(\n config: SelectionHandlerConfig<TItem>,\n): BaseSelectionHandler<TItem> {\n return config.multiSelect\n ? new MultiSelectionHandler(config)\n : new SingleSelectionHandler(config)\n}\n\nclass SingleSelectionArrayView<TItem> implements ValueEmitter<TItem[]> {\n constructor(private readonly source: ValueEmitter<TItem | null>) {}\n\n get(): TItem[] {\n const value = this.source.get()\n return value == null ? [] : [value]\n }\n\n getError(): unknown {\n return this.source.getError()\n }\n\n getFetchState(): ReturnType<ValueEmitter<TItem | null>['getFetchState']> {\n return this.source.getFetchState()\n }\n\n set(value: TItem[], eventOrCause?: unknown): boolean {\n return this.source.set(value[0] ?? null, eventOrCause)\n }\n\n subscribe(\n listener: (notification: EmitterNotification<TItem[], unknown>) => void,\n options?: SubscribeOptions,\n ): () => void {\n return this.source.subscribe((notification) => listener({\n ...notification,\n value: notification.value == null ? [] : [notification.value],\n }), options)\n }\n}\n\nexport function defaultItemKey<TItem>(item: TItem, index: number): unknown {\n if (item != null && typeof item === 'object') {\n const id = Reflect.get(item, 'id')\n if (id != null) return id\n }\n if (typeof item === 'string' || typeof item === 'number') return item\n throw new TypeError(\n `Selection item at index ${index} needs an id or an explicit itemKey/rowKey`,\n )\n}\n\nfunction isCommandPressed(event: MouseEvent | KeyboardEvent): boolean {\n return Boolean(event.ctrlKey || event.metaKey)\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) return 0\n return Math.min(Math.max(index, 0), length - 1)\n}\n\nfunction mergeByKey<TItem>(\n left: readonly TItem[],\n right: readonly TItem[],\n getKey: ItemKeyGetter<TItem>,\n): TItem[] {\n const result = [...left]\n const keys = new Set(left.map((item, index) => getKey(item, index)))\n for (const item of right) {\n const key = getKey(item, result.length)\n if (!keys.has(key)) {\n keys.add(key)\n result.push(item)\n }\n }\n return result\n}\n","import {Emitter, FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {classNames, componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {\n createSelectionHandler,\n defaultItemKey,\n SingleSelectionHandler,\n} from '../selectionhandler.js'\nimport type {\n BaseSelectionHandler,\n ItemKeyGetter,\n} from '../selectionhandler.js'\n\ninterface ListViewCommonProps<TItem> extends ComponentProps {\n items?: readonly TItem[] | ReadableEmitter<readonly TItem[], unknown>\n itemKey?: string | ItemKeyGetter<TItem>\n label?: string\n placeholderCount?: number\n renderItem?: (item: TItem, index: number) => FrayChild\n}\n\nexport type ListViewProps<TItem = unknown> = ListViewCommonProps<TItem> & (\n | {\n multiSelect?: false\n selectedItemEmitter?: ValueEmitter<TItem | null>\n selectedItemsEmitter?: never\n }\n | {\n multiSelect: true\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n selectedItemEmitter?: never\n }\n)\n\n/** Accessible listbox with stable-key selection. */\nexport class ListView<TItem = unknown> extends Component<ListViewProps<TItem>> {\n readonly itemsEmitter: ReadableEmitter<readonly TItem[], unknown>\n readonly items$: ReadableEmitter<readonly TItem[], unknown>\n readonly selectedItemsEmitter: ValueEmitter<TItem[]>\n readonly selectedItems$: ValueEmitter<TItem[]>\n readonly selectedItemEmitter: ValueEmitter<TItem | null> | null\n readonly selectedItem$: ValueEmitter<TItem | null> | null\n readonly getItemKey: ItemKeyGetter<TItem>\n readonly selectionHandler: BaseSelectionHandler<TItem>\n private readonly ownedItemsEmitter: Emitter<readonly TItem[]> | null\n\n constructor(props: ListViewProps<TItem> = {}) {\n super(props)\n if (isReadableEmitter<readonly TItem[]>(props.items)) {\n this.itemsEmitter = props.items\n this.ownedItemsEmitter = null\n } else {\n this.ownedItemsEmitter = new Emitter<readonly TItem[]>(props.items ?? [], {\n owner: this,\n purpose: 'list items',\n })\n this.itemsEmitter = this.ownedItemsEmitter\n }\n this.items$ = this.itemsEmitter\n this.getItemKey = normalizeKeyGetter(props.itemKey)\n this.selectionHandler = props.multiSelect === true\n ? createSelectionHandler({\n owner: this,\n multiSelect: true,\n ...(props.selectedItemsEmitter == null\n ? {}\n : {selectedItemsEmitter: props.selectedItemsEmitter}),\n getItems: () => this.itemsEmitter.get(),\n getKey: this.getItemKey,\n })\n : createSelectionHandler({\n owner: this,\n ...(props.selectedItemEmitter == null\n ? {}\n : {selectedItemEmitter: props.selectedItemEmitter}),\n getItems: () => this.itemsEmitter.get(),\n getKey: this.getItemKey,\n })\n this.selectedItemsEmitter = this.selectionHandler.selectedItemsEmitter\n this.selectedItems$ = this.selectedItemsEmitter\n this.selectedItemEmitter = this.selectionHandler instanceof SingleSelectionHandler\n ? this.selectionHandler.selectedItemEmitter\n : null\n this.selectedItem$ = this.selectedItemEmitter\n }\n\n initialize(): void {\n this.watch(this.itemsEmitter, this.selectedItemsEmitter)\n }\n\n render(): FrayChild {\n const rows = this.itemsEmitter.get()\n if (!Array.isArray(rows)) throw new TypeError('ListView items must be an array')\n const status = this.itemsEmitter.getFetchState()\n const error = this.itemsEmitter.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const selectedKeys = new Set(this.selectedItemsEmitter.get()\n .map((item, index) => this.getItemKey(item, index)))\n\n const Host = this.Host\n return <Host\n className={classNames('datacomponentlike', componentClass(this.props))}\n >\n {status === FetchState.Error\n ? <p role=\"alert\">\n {errorMessage(error, 'Unable to load items')}\n </p>\n : null}\n {isLoading && rows.length === 0\n ? <div role=\"status\" data-part=\"loading\">\n <span>Loading items…</span>\n {Array.from({length: this.props.placeholderCount ?? 5}, (_, index) =>\n <div key={`placeholder-${index}`} data-part=\"placeholder-row\">\n <Placeholder width={45 + index * 7} />\n </div>)}\n </div>\n : null}\n {status === FetchState.Ready && rows.length === 0\n ? <p role=\"status\">No items</p>\n : null}\n {rows.length > 0\n ? <div\n role=\"listbox\"\n aria-label={this.props.label ?? 'Items'}\n aria-busy={isLoading ? 'true' : null}\n aria-multiselectable={this.props.multiSelect ? 'true' : null}\n >{rows.map((item, index) => {\n const key = this.getItemKey(item, index)\n const selected = selectedKeys.has(key)\n const content = this.props.renderItem\n ? this.props.renderItem(item, index)\n : defaultItemLabel(item)\n return <div\n key={String(key)}\n role=\"option\"\n data-fray-selectable-row=\"\"\n data-index={index}\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >{content}</div>\n })}</div>\n : null}\n </Host>\n }\n\n afterUpdate(dom: ChildNode | null): void {\n const rows = dom instanceof Element\n ? dom.querySelectorAll<HTMLElement>('[data-fray-selectable-row]')\n : []\n this.selectionHandler.rowsUpdated(rows)\n }\n\n getSelectedItems(): TItem[] {\n return this.selectionHandler.getSelectedItems()\n }\n\n getSelectedItemsEmitter(): ValueEmitter<TItem[]> {\n return this.selectedItemsEmitter\n }\n\n getSelectedItem(): TItem | null {\n return this.selectedItemEmitter?.get() ?? null\n }\n\n getSelectedItemEmitter(): ValueEmitter<TItem | null> | null {\n return this.selectedItemEmitter\n }\n\n onDestroy(): void {\n this.selectionHandler.destroy()\n this.ownedItemsEmitter?.dispose()\n }\n\n static dependencies = [Placeholder]\n\n static override hostName = 'list-view'\n static override standaloneHostName = 'list-view'\n\n static baseStyles = [\n ['&', 'inputlike'],\n ['& > [role=\"listbox\"] > [role=\"option\"]', 'inputline'],\n ]\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n min-height: 0;\n }\n\n & > [role=\"listbox\"],\n & > [data-part=\"loading\"] {\n display: flex;\n flex-direction: column;\n }\n\n & > [role=\"listbox\"] > [role=\"option\"] {\n cursor: default;\n user-select: none;\n }\n\n & > [role=\"status\"],\n & > [role=\"alert\"] {\n margin: 0;\n padding: var(--ui-padding);\n }\n `\n}\n\nfunction normalizeKeyGetter<TItem>(\n itemKey: ListViewProps<TItem>['itemKey'],\n): ItemKeyGetter<TItem> {\n if (itemKey == null) return defaultItemKey\n if (typeof itemKey === 'function') return itemKey\n if (typeof itemKey === 'string' && itemKey.length > 0) {\n return (item, index) => {\n if (item == null || (typeof item !== 'object' && typeof item !== 'function')) {\n throw new TypeError(`ListView item at index ${index} lacks ${itemKey}`)\n }\n const key = Reflect.get(item, itemKey)\n if (key == null) {\n throw new TypeError(`ListView item at index ${index} lacks ${itemKey}`)\n }\n return key\n }\n }\n throw new TypeError('ListView itemKey must be a function or property name')\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction defaultItemLabel(item: unknown): FrayChild {\n if (item != null && (typeof item === 'object' || typeof item === 'function')) {\n const label = Reflect.get(item, 'label')\n if (isRenderablePrimitive(label)) return label\n }\n return String(item)\n}\n\nfunction isRenderablePrimitive(value: unknown): value is string | number | null | undefined {\n return value == null || typeof value === 'string' || typeof value === 'number'\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {\n componentClass,\n createValueEmitter,\n describeState,\n invoke,\n} from '../../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../../controlUtils.js'\nimport {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport type CheckboxValue = string | number\nexport type CheckboxSymbol<TValue extends CheckboxValue = FilterModeValue> = readonly [\n symbol: FrayChild,\n value: TValue,\n]\n\nexport interface CheckboxProps<TValue extends CheckboxValue = FilterModeValue>\n extends ValueControlProps<TValue> {\n symbols?: readonly CheckboxSymbol<TValue>[]\n initialSemanticState?: TValue\n label?: FrayChild\n disabled?: boolean\n required?: boolean\n name?: string\n onChange?: (value: TValue, event: Event | null) => void\n}\n\n/** Keyboard-operable semantic state cycler. */\nexport class Checkbox<TValue extends CheckboxValue = FilterModeValue>\n extends Component<CheckboxProps<TValue>> {\n static symbols: readonly CheckboxSymbol<FilterModeValue>[] = [\n ['☐', FilterMode.Neutral],\n ['✓', FilterMode.Prefer],\n ]\n static defaultSemanticState = FilterMode.Neutral\n\n readonly symbols: readonly CheckboxSymbol<TValue>[]\n readonly valueEmitter: ValueEmitter<TValue>\n readonly semanticStateEmitter: ValueEmitter<TValue>\n\n constructor(props: CheckboxProps<TValue> = {}) {\n super(props)\n const componentType = this.constructor as typeof Checkbox\n // Static members cannot carry the instance's generic state parameter;\n // subclasses validate the tuple values before this boundary is used.\n this.symbols = props.symbols\n ?? componentType.symbols as unknown as readonly CheckboxSymbol<TValue>[]\n validateSymbols(this.symbols)\n const fallback = props.initialSemanticState\n ?? componentType.defaultSemanticState as TValue\n ?? this.symbols[0]![1]\n const emitterProps: CheckboxProps<TValue> = {...props}\n if (emitterProps.defaultValue == null && props.initialSemanticState != null) {\n emitterProps.defaultValue = props.initialSemanticState\n }\n this.valueEmitter = createValueEmitter<TValue>(this, emitterProps, fallback,\n 'checkbox semantic state')\n // Compatibility alias used by filter controls.\n this.semanticStateEmitter = this.valueEmitter\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n cycleState(direction = 1, event: Event | null = null): void {\n if (this.props.disabled) return\n const currentIndex = this.symbols.findIndex(([, state]) =>\n Object.is(state, this.valueEmitter.get()))\n const baseIndex = currentIndex < 0 ? 0 : currentIndex\n const nextIndex = (baseIndex + direction + this.symbols.length) % this.symbols.length\n const nextValue = this.symbols[nextIndex]![1]\n this.valueEmitter.set(nextValue, 'checkbox state changed')\n invoke(this.props.onChange, nextValue, event)\n }\n\n render(): FrayChild {\n const {\n label = this.props.value ?? 'Option',\n disabled = false,\n required = false,\n name,\n value,\n } = this.props\n const semanticState = this.valueEmitter.get()\n const semanticIndex = this.symbols.findIndex(([, state]) =>\n Object.is(state, semanticState))\n const [symbol] = this.symbols[semanticIndex] ?? ['?', semanticState]\n const stateName = describeState(semanticState)\n const checked = semanticState === FilterMode.Prefer\n || semanticState === FilterMode.Require\n || (this.symbols.length === 2 && semanticIndex === 1)\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-disabled={disabled ? '' : null}\n data-required={required ? '' : null}\n data-state={stateName}\n >\n <button\n type=\"button\"\n role=\"checkbox\"\n disabled={disabled}\n name={name}\n value={value == null ? undefined : String(value)}\n aria-checked={checked ? 'true' : 'false'}\n aria-required={required ? 'true' : null}\n aria-label={`${label}: ${stateName}`}\n onClick={(event: MouseEvent) => this.cycleState(1, event)}\n onKeyDown={(event: KeyboardEvent) => {\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault()\n this.cycleState(1, event)\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault()\n this.cycleState(-1, event)\n }\n }}\n >\n <span className=\"inputshell\" aria-hidden=\"true\">{symbol}</span>\n <span>{label}</span>\n </button>\n </Host>\n }\n\n static override hostName = 'checkbox'\n static override standaloneHostName = 'check-box'\n\n static baseStyles = [\n ['&', ['inputline']],\n ['& > [role=\"checkbox\"]', ['input', 'inputline']],\n ]\n\n static css = css`\n & > [role=\"checkbox\"] {\n display: inline-flex;\n align-items: center;\n gap: 0.35em;\n width: auto;\n font-family: inherit;\n }\n\n & .inputshell {\n display: inline-grid;\n width: 1em;\n height: 1em;\n line-height: 1;\n place-items: center;\n }\n `\n}\n\nfunction validateSymbols<TValue extends CheckboxValue>(\n symbols: unknown,\n): asserts symbols is readonly CheckboxSymbol<TValue>[] {\n if (!Array.isArray(symbols) || symbols.length === 0) {\n throw new TypeError('Checkbox symbols must be a non-empty tuple array')\n }\n for (const tuple of symbols) {\n if (!Array.isArray(tuple) || tuple.length < 2) {\n throw new TypeError('Checkbox symbols must be [symbol, state] tuples')\n }\n }\n}\n","import {Emitter, FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css} from '../../component.js'\nimport type {ComponentConstructor, ComponentProps, FrayChild} from '../../component.js'\nimport {classNames, componentClass} from '../../controlUtils.js'\nimport {Checkbox} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {\n CheckboxProps,\n CheckboxSymbol,\n} from '../../lineinputs/checkbox/Checkbox.js'\nimport {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport type FilterValue = string | number\n\nexport interface FilterOption {\n value: FilterValue\n label?: FrayChild\n}\n\nexport type FilterOptionInput = FilterValue | FilterOption\nexport type FilterOptions = readonly FilterOptionInput[]\nexport type FilterOptionsSource = FilterOptions | ReadableEmitter<FilterOptions, unknown>\nexport type FilterSelection = ReadonlyMap<FilterValue, FilterModeValue>\n\nexport interface FilterPanelProps extends ComponentProps {\n options?: FilterOptionsSource\n filters?: FilterSelection | readonly (readonly [FilterValue, FilterModeValue])[]\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n label?: string\n onChange?: (filters: Map<FilterValue, FilterModeValue>, event: Event | null) => void\n}\n\n/** Filter choices whose option data is always supplied by the caller. */\nexport class FilterPanel extends Component<FilterPanelProps> {\n readonly optionsEmitter: ReadableEmitter<FilterOptions, unknown> | null\n private readonly optionStateEmitters = new Map<FilterValue, Emitter<FilterModeValue>>()\n private staleOptionValues = new Set<FilterValue>()\n private placementTimer: ReturnType<typeof setTimeout> | null = null\n\n constructor(props: FilterPanelProps = {}) {\n super(props)\n this.optionsEmitter = isEmitterLike<FilterOptions>(props.options) ? props.options : null\n }\n\n initialize(): void {\n if (this.optionsEmitter) this.watch(this.optionsEmitter)\n }\n\n render(): FrayChild {\n const values = this.optionsEmitter?.get()\n ?? (Array.isArray(this.props.options) ? this.props.options : [])\n if (!Array.isArray(values)) {\n throw new TypeError('FilterPanel options must be an array or emitter of arrays')\n }\n const fetchState = this.optionsEmitter?.getFetchState() ?? FetchState.Ready\n const error = this.optionsEmitter?.getError()\n const filters = normalizeFilters(this.props.filters)\n const filterModes = this.props.filterModes ?? Checkbox.symbols\n const defaultSemanticState = this.props.defaultSemanticState ?? FilterMode.Neutral\n const activeValues = new Set(values.map(optionValue))\n this.staleOptionValues = new Set(\n [...this.optionStateEmitters.keys()].filter((value) => !activeValues.has(value)),\n )\n const Host = this.Host\n\n if (fetchState === FetchState.Error) {\n return <Host\n className={classNames('panellike', componentClass(this.props))}\n role=\"alert\"\n data-state=\"error\"\n >{errorMessage(error, 'Unable to load filter options')}</Host>\n }\n if ((fetchState === FetchState.Initial || fetchState === FetchState.Loading)\n && values.length === 0) {\n return <Host\n className={classNames('panellike', componentClass(this.props))}\n role=\"status\"\n data-state=\"loading\"\n >Loading filter options…</Host>\n }\n\n return <Host\n className={classNames('panellike', componentClass(this.props))}\n role=\"group\"\n aria-label={this.props.label ?? 'Filter options'}\n >\n {values.length === 0\n ? <span>No filter options</span>\n : values.map((option) => {\n const value = optionValue(option)\n const label = optionLabel(option)\n const state = filters.get(value) ?? defaultSemanticState\n const valueEmitter = this.optionEmitter(value, state)\n return <FilterModeCheckbox\n key={optionKey(value)}\n label={label}\n valueEmitter={valueEmitter}\n symbols={filterModes}\n onChange={(nextState, event) => {\n event?.stopPropagation()\n const next = normalizeFilters(this.props.filters)\n if (nextState === FilterMode.Neutral) next.delete(value)\n else next.set(value, nextState)\n this.props.onChange?.(next, event)\n }}\n />\n })}\n </Host>\n }\n\n afterUpdate(dom: ChildNode | null): void {\n for (const value of this.staleOptionValues) {\n this.optionStateEmitters.get(value)?.dispose()\n this.optionStateEmitters.delete(value)\n }\n this.staleOptionValues.clear()\n if (this.placementTimer != null) clearTimeout(this.placementTimer)\n this.placementTimer = setTimeout(() => {\n this.placementTimer = null\n this.placeInsideViewport(dom)\n }, 0)\n }\n\n onDestroy(): void {\n if (this.placementTimer != null) clearTimeout(this.placementTimer)\n this.placementTimer = null\n for (const emitter of this.optionStateEmitters.values()) emitter.dispose()\n this.optionStateEmitters.clear()\n }\n\n private optionEmitter(\n value: FilterValue,\n state: FilterModeValue,\n ): Emitter<FilterModeValue> {\n const existing = this.optionStateEmitters.get(value)\n if (existing != null) {\n if (existing.get() !== state) existing.set(state, 'filter option synchronized')\n return existing\n }\n const emitter = new Emitter(state, {owner: this, purpose: `filter option ${String(value)}`})\n this.optionStateEmitters.set(value, emitter)\n return emitter\n }\n\n private placeInsideViewport(dom: ChildNode | null): void {\n if (!(dom instanceof HTMLElement) || dom.parentElement == null) return\n const viewport = dom.ownerDocument.defaultView\n if (viewport == null || viewport.innerHeight <= 0) return\n const anchor = dom.parentElement.getBoundingClientRect()\n dom.style.removeProperty('max-height')\n const panel = dom.getBoundingClientRect()\n const spaceAbove = anchor.top\n const spaceBelow = Math.max(0, viewport.innerHeight - anchor.bottom)\n const placeAbove = panel.height > spaceBelow && spaceAbove > spaceBelow\n if (placeAbove) {\n dom.dataset.placement = 'above'\n dom.style.insetBlockStart = `${Math.max(8, anchor.top - panel.height)}px`\n } else {\n delete dom.dataset.placement\n dom.style.insetBlockStart = `${anchor.bottom}px`\n }\n dom.style.insetInlineEnd = `${Math.max(8, viewport.innerWidth - anchor.right)}px`\n const available = placeAbove ? spaceAbove : spaceBelow\n dom.style.maxHeight = `${Math.max(48, available - 8)}px`\n }\n\n static dependencies = [Checkbox]\n\n static override hostName = 'filter-panel'\n static override standaloneHostName = 'filter-panel'\n\n static css = css`\n & {\n position: fixed;\n z-index: 1100;\n inset-block-start: 0;\n inset-inline-end: 0;\n display: flex;\n min-width: 12rem;\n padding: var(--ui-padding);\n flex-flow: column nowrap;\n align-items: stretch;\n overflow-y: auto;\n }\n\n `\n}\n\n// Passing a generic class as a runtime vnode erases its state parameter. The\n// concrete props below restore the FilterMode relationship checked by tsc.\nconst FilterModeCheckbox = Checkbox as unknown as ComponentConstructor<\n CheckboxProps<FilterModeValue>\n>\n\nfunction normalizeFilters(\n filters: FilterPanelProps['filters'],\n): Map<FilterValue, FilterModeValue> {\n if (filters == null) return new Map<FilterValue, FilterModeValue>()\n if (filters instanceof Map) return new Map(filters)\n if (Array.isArray(filters)) return new Map(filters)\n throw new TypeError('FilterPanel filters must be a Map or tuple array')\n}\n\nfunction optionValue(option: FilterOptionInput): FilterValue {\n if (typeof option === 'string' || typeof option === 'number') return option\n if (option != null && typeof option === 'object') {\n const value = Reflect.get(option, 'value')\n if (typeof value === 'string' || typeof value === 'number') return value\n }\n throw new TypeError('Filter options must be strings, numbers, or value/label objects')\n}\n\nfunction optionLabel(option: FilterOptionInput): FrayChild {\n if (option != null && typeof option === 'object') {\n const label = Reflect.get(option, 'label')\n if (label != null) return isFrayLabel(label) ? label : String(label)\n }\n return String(optionValue(option))\n}\n\nfunction optionKey(value: FilterValue): string {\n return `${typeof value}:${String(value)}`\n}\n\nfunction isFrayLabel(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nfunction isEmitterLike<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {FilterPanel} from './FilterPanel.js'\nimport type {\n FilterOptionsSource,\n FilterSelection,\n FilterValue,\n} from './FilterPanel.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport type TableRow = Record<string, unknown>\n\nexport interface TableColumnBase {\n field: string\n label?: FrayChild\n sortable?: boolean\n filterOptions?: FilterOptionsSource\n}\n\nexport interface TableColumn<TRow extends TableRow = TableRow> extends TableColumnBase {\n field: Extract<keyof TRow, string>\n render?: (row: TRow, index: number) => FrayChild\n}\n\nexport interface TableHeaderCellProps extends ComponentProps, TableColumnBase {\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\nexport class TableHeaderCell extends Component<TableHeaderCellProps> {\n private filterVisible = false\n\n initialize(): void {\n this.watch(this.props.sortEmitter, this.props.filtersEmitter)\n if (this.props.filterOptions != null) {\n this.listen<MouseEvent>(document, 'click', this.onGlobalClick)\n }\n }\n\n toggleSort(): void {\n if (!this.props.sortable) return\n const current = this.props.sortEmitter.get()\n let next: TableSort | null\n if (current?.field !== this.props.field) {\n next = {field: this.props.field, direction: 'asc'}\n } else if (current.direction === 'asc') {\n next = {field: this.props.field, direction: 'desc'}\n } else next = null\n this.props.sortEmitter.set(next, 'table sort changed')\n }\n\n toggleFilterPanel(event: MouseEvent): void {\n event.stopPropagation()\n this.filterVisible = !this.filterVisible\n this.update()\n }\n\n updateFilters(next: FilterSelection, event: Event | null): void {\n const filters: TableFilters = {...this.props.filtersEmitter.get()}\n if (next.size === 0) delete filters[this.props.field]\n else filters[this.props.field] = [...next.entries()]\n this.props.filtersEmitter.set(filters, 'table filters changed')\n this.props.onFilterChange?.(filters, event)\n }\n\n render(): FrayChild {\n const currentSort = this.props.sortEmitter.get()\n const direction = currentSort?.field === this.props.field\n ? currentSort.direction\n : null\n const filters = new Map<FilterValue, FilterModeValue>(\n (this.props.filtersEmitter.get()[this.props.field] ?? [])\n .filter(isFilterSelectionEntry),\n )\n const label = this.props.label ?? String(this.props.field)\n const filterLabel = `Filter ${String(label)}`\n\n let panel: FrayChild = null\n if (this.filterVisible && this.props.filterOptions != null) {\n panel = <FilterPanel\n key=\"filter-panel\"\n label={filterLabel}\n options={this.props.filterOptions}\n filters={filters}\n onChange={(next, event) => this.updateFilters(next, event)}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n />\n }\n\n return <th\n scope=\"col\"\n data-fray-component=\"table-header-cell\"\n aria-sort={direction === 'asc'\n ? 'ascending'\n : direction === 'desc' ? 'descending' : 'none'}\n style={{zIndex: this.filterVisible ? 1200 : null}}\n >\n {this.props.sortable\n ? <button\n type=\"button\"\n data-part=\"sort\"\n onClick={() => this.toggleSort()}\n >\n {label}\n {direction === 'asc' ? ' ▲' : direction === 'desc' ? ' ▼' : ''}\n </button>\n : <span>{label}</span>}\n {this.props.filterOptions == null\n ? null\n : <button\n type=\"button\"\n data-part=\"filter-toggle\"\n aria-label={filterLabel}\n aria-expanded={String(this.filterVisible)}\n onClick={(event: MouseEvent) => this.toggleFilterPanel(event)}\n >Filter</button>}\n {panel}\n </th>\n }\n\n private readonly onGlobalClick = (event: MouseEvent): void => {\n if (this.filterVisible\n && this.dom instanceof Node\n && event.target instanceof Node\n && !this.dom.contains(event.target)) {\n this.filterVisible = false\n this.update()\n }\n }\n\n static dependencies = [FilterPanel]\n\n static baseStyles = [\n ['th[aria-sort]', 'noselect'],\n ['th[aria-sort] > [data-part=\"sort\"]', ['uiline', 'button']],\n ['th[aria-sort] > [data-part=\"filter-toggle\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n th[aria-sort] {\n position: relative;\n text-align: start;\n }\n\n th[aria-sort] > [data-part=\"sort\"],\n th[aria-sort] > [data-part=\"filter-toggle\"] {\n width: auto;\n font-family: inherit;\n }\n\n th[aria-sort] > [data-part=\"filter-toggle\"] {\n margin-inline-start: var(--ui-padding-h);\n font-size: 0.75em;\n }\n `\n}\n\nfunction isFilterSelectionEntry(\n entry: readonly [unknown, FilterModeValue],\n): entry is readonly [FilterValue, FilterModeValue] {\n return typeof entry[0] === 'string' || typeof entry[0] === 'number'\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {TableHeaderCell} from './TableHeaderCell.js'\nimport type {\n TableColumn,\n TableRow,\n} from './TableHeaderCell.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport interface TableHeaderProps<TRow extends TableRow = TableRow> extends ComponentProps {\n columns: readonly TableColumn<TRow>[]\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\nexport class TableHeader<TRow extends TableRow = TableRow>\n extends Component<TableHeaderProps<TRow>> {\n render(): FrayChild {\n return <thead data-fray-component=\"table-header\">\n <tr>\n {this.props.columns.map((column) => <TableHeaderCell\n key={String(column.field)}\n field={column.field}\n sortEmitter={this.props.sortEmitter}\n filtersEmitter={this.props.filtersEmitter}\n {...(column.label == null ? {} : {label: column.label})}\n {...(column.sortable == null ? {} : {sortable: column.sortable})}\n {...(column.filterOptions == null\n ? {}\n : {filterOptions: column.filterOptions})}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n {...(this.props.onFilterChange == null\n ? {}\n : {onFilterChange: this.props.onFilterChange})}\n />)}\n </tr>\n </thead>\n }\n\n static dependencies = [TableHeaderCell]\n}\n","import type {UrlLike} from '@sylwellsoftware/glue'\n\nimport {FilterMode, isFilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport interface TableSort {\n field: string\n direction: 'asc' | 'desc'\n}\n\nexport type TableFilterEntry<TValue = unknown> = readonly [\n value: TValue,\n mode: FilterModeValue,\n]\n\nexport type TableFilters = Record<string, readonly TableFilterEntry[]>\n\nexport interface TableQueryState {\n sort?: TableSort | null\n filters?: TableFilters\n}\n\nexport const DefaultTableFilterEncoding: Readonly<Record<FilterModeValue, string>> = {\n [FilterMode.Neutral]: '☐',\n [FilterMode.Prefer]: '',\n [FilterMode.Require]: '_',\n [FilterMode.Deny]: '!',\n}\n\n/**\n * Serialize Fray's compact remote-table wire format.\n *\n * - `sort=field:asc|desc`\n * - repeated `filter=field:token:JSON(value)` entries\n *\n * Semantic modes deliberately remain separate from this compatibility wire\n * encoding. Endpoints with another contract should inject their own serializer.\n */\nexport function serializeTableQuery<TUrl extends UrlLike>(\n url: TUrl,\n {sort = null, filters = {}}: TableQueryState = {},\n): TUrl {\n assertUrlLike(url)\n if (sort != null) {\n assertSort(sort)\n url.searchParams.set('sort', `${sort.field}:${sort.direction}`)\n }\n for (const [field, entries] of Object.entries(filters)) {\n for (const [value, mode] of entries) {\n if (!isFilterMode(mode)) {\n throw new TypeError(`Unknown filter mode for ${field}: ${String(mode)}`)\n }\n url.searchParams.append(\n 'filter',\n `${field}:${DefaultTableFilterEncoding[mode]}:${JSON.stringify(value)}`,\n )\n }\n }\n return url\n}\n\nexport function applyLocalTableState<TRow>(\n rows: readonly TRow[],\n sort: TableSort | null,\n filters: TableFilters,\n): TRow[] {\n if (!Array.isArray(rows)) throw new TypeError('Local table data must be an array')\n const filtered = rows.filter((row) => matchesFilters(row, filters))\n if (sort == null) return filtered\n assertSort(sort)\n const direction = sort.direction === 'asc' ? 1 : -1\n return [...filtered].sort((left, right) =>\n compareValues(readField(left, sort.field), readField(right, sort.field)) * direction)\n}\n\nfunction matchesFilters<TRow>(row: TRow, filters: TableFilters): boolean {\n for (const [field, entries] of Object.entries(filters)) {\n const value = readField(row, field)\n const denied = entries.filter(([, mode]) => mode === FilterMode.Deny)\n if (denied.some(([candidate]) => Object.is(candidate, value))) return false\n\n const required = entries.filter(([, mode]) => mode === FilterMode.Require)\n if (required.length > 0\n && !required.some(([candidate]) => Object.is(candidate, value))) return false\n\n const preferred = entries.filter(([, mode]) => mode === FilterMode.Prefer)\n if (preferred.length > 0\n && !preferred.some(([candidate]) => Object.is(candidate, value))) return false\n }\n return true\n}\n\nexport function assertSort(sort: unknown): asserts sort is TableSort {\n if (sort == null\n || typeof sort !== 'object'\n || typeof Reflect.get(sort, 'field') !== 'string'\n || !isSortDirection(Reflect.get(sort, 'direction'))) {\n throw new TypeError('Table sort must contain a field and asc/desc direction')\n }\n}\n\nfunction isSortDirection(value: unknown): value is TableSort['direction'] {\n return value === 'asc' || value === 'desc'\n}\n\nfunction compareValues(left: unknown, right: unknown): number {\n if (Object.is(left, right)) return 0\n if (left == null) return -1\n if (right == null) return 1\n if (typeof left === 'number' && typeof right === 'number') return left - right\n return String(left).localeCompare(String(right))\n}\n\nfunction readField(value: unknown, field: string): unknown {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {\n return undefined\n }\n return Reflect.get(value, field)\n}\n\nfunction assertUrlLike(value: unknown): asserts value is UrlLike {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'toString') !== 'function') {\n throw new TypeError('Table serializer requires a URL')\n }\n const searchParams = Reflect.get(value, 'searchParams')\n if (searchParams == null\n || typeof Reflect.get(searchParams, 'set') !== 'function'\n || typeof Reflect.get(searchParams, 'append') !== 'function') {\n throw new TypeError('Table serializer requires URL search parameters')\n }\n}\n","import {\n DerivedEmitter,\n Emitter,\n LiveQuery,\n QueryArg,\n RestQueryHandler,\n} from '@sylwellsoftware/glue'\nimport type {\n FetchLike,\n QueryHandlerLike,\n QuerySerializer,\n ReadableEmitter,\n} from '@sylwellsoftware/glue'\n\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {TableRow} from './TableHeaderCell.js'\nimport {applyLocalTableState, serializeTableQuery} from './tableQuery.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport type TableQueryArguments = {\n sort: TableSort | null\n filters: TableFilters\n}\n\nexport type TableQueryInput<TRow extends TableRow = TableRow> = ReadableEmitter<\n readonly TRow[] | undefined,\n unknown\n> & {\n retry?: (cause?: unknown) => unknown\n dispose?: () => void\n}\n\nexport interface TableDataSource<TRow extends TableRow = TableRow> {\n readonly query: TableQueryInput<TRow>\n readonly sortEmitter: ValueEmitter<TableSort | null>\n readonly filtersEmitter: ValueEmitter<TableFilters>\n readonly retry?: (cause?: unknown) => unknown\n dispose(): void\n}\n\ninterface TableStateOptions {\n sortEmitter?: ValueEmitter<TableSort | null>\n filtersEmitter?: ValueEmitter<TableFilters>\n owner?: unknown\n}\n\nexport interface LocalTableDataSourceOptions<TRow extends TableRow>\nextends TableStateOptions {\n data: readonly TRow[] | ReadableEmitter<readonly TRow[], unknown>\n}\n\nexport interface QueryTableDataSourceOptions<TRow extends TableRow>\nextends TableStateOptions {\n query: TableQueryInput<TRow>\n}\n\nexport interface HandlerTableDataSourceOptions<TRow extends TableRow>\nextends TableStateOptions {\n handler: QueryHandlerLike<TableQueryArguments, readonly TRow[]>\n}\n\nexport interface RestTableDataSourceOptions<TRow extends TableRow>\nextends TableStateOptions {\n url: string\n baseUrl?: string\n fetch?: FetchLike<readonly TRow[]>\n serializeQuery?: QuerySerializer<TableQueryArguments>\n}\n\n/** Create a source that applies table state to local data. The caller owns it. */\nexport function createLocalTableDataSource<TRow extends TableRow>(\n options: LocalTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n const state = createState(options)\n const ownedData = isReadableEmitter<readonly TRow[]>(options.data)\n ? null\n : new Emitter<readonly TRow[]>(options.data, {\n owner: options.owner,\n purpose: 'local table data',\n })\n const data = ownedData ?? options.data as ReadableEmitter<readonly TRow[], unknown>\n const query = new DerivedEmitter(\n [data, state.sortEmitter, state.filtersEmitter] as const,\n ([rows, sort, filters]) => applyLocalTableState(rows, sort, filters),\n {owner: options.owner, purpose: 'local table view'},\n )\n return new ManagedTableDataSource(query, state, () => {\n query.dispose()\n ownedData?.dispose()\n })\n}\n\n/** Package a caller-owned query with the sort/filter emitters that drive it. */\nexport function createQueryTableDataSource<TRow extends TableRow>(\n options: QueryTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n assertTableQuery<TRow>(options.query)\n const state = createState(options)\n return new ManagedTableDataSource(options.query, state)\n}\n\n/** Create a LiveQuery-backed source from an application-supplied handler. */\nexport function createHandlerTableDataSource<TRow extends TableRow>(\n options: HandlerTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n if (options.handler == null || typeof options.handler.fetch !== 'function') {\n throw new TypeError('Table data-source handler must implement fetch')\n }\n const state = createState(options)\n const sort = new QueryArg<TableSort | null>('sort', state.sortEmitter, {\n owner: options.owner,\n purpose: 'table sort argument',\n })\n const filters = new QueryArg<TableFilters>('filters', state.filtersEmitter, {\n owner: options.owner,\n purpose: 'table filters argument',\n })\n const query = new LiveQuery<readonly TRow[], {sort: typeof sort; filters: typeof filters}>({\n handler: options.handler,\n args: {sort, filters},\n owner: options.owner,\n purpose: 'table query',\n keepPreviousValue: true,\n })\n return new ManagedTableDataSource(query, state, () => {\n query.dispose()\n sort.dispose()\n filters.dispose()\n })\n}\n\n/** Create the convenient REST-backed source. The caller owns the result. */\nexport function createRestTableDataSource<TRow extends TableRow>(\n options: RestTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n if (typeof options.url !== 'string' || options.url.length === 0) {\n throw new TypeError('REST table data source requires a URL')\n }\n const handlerOptions: {\n url: string\n baseUrl?: string\n fetch?: FetchLike<readonly TRow[]>\n serialize: QuerySerializer<TableQueryArguments>\n } = {\n url: options.url,\n serialize: options.serializeQuery ?? serializeTableQuery,\n }\n if (options.baseUrl != null) handlerOptions.baseUrl = options.baseUrl\n if (options.fetch != null) handlerOptions.fetch = options.fetch\n return createHandlerTableDataSource({\n handler: new RestQueryHandler<TableQueryArguments, readonly TRow[]>(handlerOptions),\n ...(options.sortEmitter == null ? {} : {sortEmitter: options.sortEmitter}),\n ...(options.filtersEmitter == null ? {} : {filtersEmitter: options.filtersEmitter}),\n ...(options.owner === undefined ? {} : {owner: options.owner}),\n })\n}\n\ninterface ManagedState {\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n ownedSortEmitter: Emitter<TableSort | null> | null\n ownedFiltersEmitter: Emitter<TableFilters> | null\n}\n\nclass ManagedTableDataSource<TRow extends TableRow> implements TableDataSource<TRow> {\n readonly sortEmitter: ValueEmitter<TableSort | null>\n readonly filtersEmitter: ValueEmitter<TableFilters>\n readonly retry?: (cause?: unknown) => unknown\n private disposed = false\n\n constructor(\n readonly query: TableQueryInput<TRow>,\n private readonly state: ManagedState,\n private readonly disposeQuery: (() => void) | null = null,\n ) {\n this.sortEmitter = state.sortEmitter\n this.filtersEmitter = state.filtersEmitter\n if (query.retry != null) this.retry = (cause?: unknown) => query.retry?.(cause)\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.disposeQuery?.()\n this.state.ownedSortEmitter?.dispose()\n this.state.ownedFiltersEmitter?.dispose()\n }\n}\n\nfunction createState(options: TableStateOptions): ManagedState {\n const ownedSortEmitter = options.sortEmitter == null\n ? new Emitter<TableSort | null>(null, {\n owner: options.owner,\n purpose: 'table sort',\n })\n : null\n const ownedFiltersEmitter = options.filtersEmitter == null\n ? new Emitter<TableFilters>({}, {\n owner: options.owner,\n purpose: 'table filters',\n })\n : null\n return {\n sortEmitter: options.sortEmitter ?? ownedSortEmitter!,\n filtersEmitter: options.filtersEmitter ?? ownedFiltersEmitter!,\n ownedSortEmitter,\n ownedFiltersEmitter,\n }\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === 'function'\n}\n\nfunction assertTableQuery<TRow extends TableRow>(\n value: unknown,\n): asserts value is TableQueryInput<TRow> {\n if (!isReadableEmitter<readonly TRow[] | undefined>(value)) {\n throw new TypeError('Table query must be an emitter')\n }\n}\n","import {Emitter, FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {classNames, componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {\n createSelectionHandler,\n defaultItemKey,\n SingleSelectionHandler,\n} from '../selectionhandler.js'\nimport type {\n BaseSelectionHandler,\n ItemKeyGetter,\n} from '../selectionhandler.js'\nimport {TableHeader} from './TableHeader.js'\nimport type {TableColumn, TableRow} from './TableHeaderCell.js'\nimport {\n createLocalTableDataSource,\n createRestTableDataSource,\n} from './tableDataSource.js'\nimport type {\n RestTableDataSourceOptions,\n TableDataSource,\n TableQueryInput,\n} from './tableDataSource.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\ninterface DataTableCommonProps<TRow extends TableRow> extends ComponentProps {\n columns: readonly TableColumn<TRow>[]\n rowKey?: Extract<keyof TRow, string> | ItemKeyGetter<TRow>\n caption?: FrayChild\n emptyMessage?: FrayChild\n placeholderCount?: number\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\ntype DataTableInputProps<TRow extends TableRow> =\n | {\n data?: readonly TRow[] | ReadableEmitter<readonly TRow[], unknown>\n dataSource?: never\n rest?: never\n }\n | {\n data?: never\n dataSource: TableDataSource<TRow>\n rest?: never\n }\n | {\n data?: never\n dataSource?: never\n rest: Omit<RestTableDataSourceOptions<TRow>, 'owner' | 'sortEmitter' | 'filtersEmitter'>\n }\n\ntype DataTableSelectionProps<TRow extends TableRow> =\n | {\n multiSelect?: false\n selectedItemEmitter?: ValueEmitter<TRow | null>\n selectedItemsEmitter?: never\n }\n | {\n multiSelect: true\n selectedItemsEmitter?: ValueEmitter<TRow[]>\n selectedItemEmitter?: never\n }\n\nexport type DataTableProps<TRow extends TableRow = TableRow> =\n DataTableCommonProps<TRow> & DataTableInputProps<TRow> & DataTableSelectionProps<TRow>\n\n/** Accessible table over an explicit local, caller-query, or REST data source. */\nexport class DataTable<TRow extends TableRow = TableRow>\n extends Component<DataTableProps<TRow>> {\n readonly columns: readonly TableColumn<TRow>[]\n readonly rowKey: ItemKeyGetter<TRow>\n readonly sortEmitter: ValueEmitter<TableSort | null>\n readonly filtersEmitter: ValueEmitter<TableFilters>\n readonly selectedItemsEmitter: ValueEmitter<TRow[]>\n readonly selectedItemEmitter: ValueEmitter<TRow | null> | null\n readonly selectionHandler: BaseSelectionHandler<TRow>\n query: TableQueryInput<TRow> | null = null\n private dataSource: TableDataSource<TRow> | null = null\n private readonly suppliedDataSource: TableDataSource<TRow> | null\n private readonly ownedSortEmitter: Emitter<TableSort | null> | null\n private readonly ownedFiltersEmitter: Emitter<TableFilters> | null\n private ownedDataSource: TableDataSource<TRow> | null = null\n\n constructor(props: DataTableProps<TRow>) {\n super(props)\n assertDataTableInput(props)\n this.columns = normalizeColumns(props.columns)\n this.rowKey = normalizeRowKey(props.rowKey)\n this.suppliedDataSource = props.dataSource ?? null\n this.ownedSortEmitter = this.suppliedDataSource == null\n ? new Emitter<TableSort | null>(null, {owner: this, purpose: 'table sort'})\n : null\n this.ownedFiltersEmitter = this.suppliedDataSource == null\n ? new Emitter<TableFilters>({}, {owner: this, purpose: 'table filters'})\n : null\n this.sortEmitter = this.suppliedDataSource?.sortEmitter ?? this.ownedSortEmitter!\n this.filtersEmitter = this.suppliedDataSource?.filtersEmitter ?? this.ownedFiltersEmitter!\n this.selectionHandler = props.multiSelect === true\n ? createSelectionHandler({\n owner: this,\n multiSelect: true,\n ...(props.selectedItemsEmitter == null\n ? {}\n : {selectedItemsEmitter: props.selectedItemsEmitter}),\n getItems: () => this.query?.get() ?? [],\n getKey: this.rowKey,\n })\n : createSelectionHandler({\n owner: this,\n ...(props.selectedItemEmitter == null\n ? {}\n : {selectedItemEmitter: props.selectedItemEmitter}),\n getItems: () => this.query?.get() ?? [],\n getKey: this.rowKey,\n })\n this.selectedItemsEmitter = this.selectionHandler.selectedItemsEmitter\n this.selectedItemEmitter = this.selectionHandler instanceof SingleSelectionHandler\n ? this.selectionHandler.selectedItemEmitter\n : null\n }\n\n initialize(): void {\n if (this.suppliedDataSource != null) {\n this.dataSource = this.suppliedDataSource\n } else if (this.props.rest != null) {\n this.ownedDataSource = createRestTableDataSource({\n ...this.props.rest,\n sortEmitter: this.sortEmitter,\n filtersEmitter: this.filtersEmitter,\n owner: this,\n })\n this.dataSource = this.ownedDataSource\n } else {\n this.ownedDataSource = createLocalTableDataSource({\n data: this.props.data ?? [],\n sortEmitter: this.sortEmitter,\n filtersEmitter: this.filtersEmitter,\n owner: this,\n })\n this.dataSource = this.ownedDataSource\n }\n this.query = this.dataSource.query\n this.watch(this.query, this.selectedItemsEmitter)\n }\n\n render(): FrayChild {\n const rows = this.query?.get() ?? []\n if (!Array.isArray(rows)) throw new TypeError('DataTable query value must be an array')\n const status = this.query?.getFetchState() ?? FetchState.Initial\n const error = this.query?.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const selectedKeys = new Set(\n this.selectedItemsEmitter.get().map((item, index) => this.rowKey(item, index)),\n )\n const Host = this.Host\n return <Host\n className={classNames('datacomponentlike', componentClass(this.props))}\n data-loading={isLoading ? '' : null}\n data-error={status === FetchState.Error ? '' : null}\n >\n {isLoading ? <p role=\"status\">Loading rows…</p> : null}\n {status === FetchState.Error ? <div role=\"alert\">\n <span>{errorMessage(error, 'Unable to load rows')}</span>\n {typeof this.dataSource?.retry === 'function'\n ? <button\n type=\"button\"\n onClick={() => this.dataSource?.retry?.('table retry')}\n >Retry</button>\n : null}\n </div> : null}\n <table aria-busy={isLoading ? 'true' : null}>\n {this.props.caption == null ? null : <caption>{this.props.caption}</caption>}\n <TableHeader\n key=\"header\"\n columns={this.columns}\n sortEmitter={this.sortEmitter}\n filtersEmitter={this.filtersEmitter}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n {...(this.props.onFilterChange == null\n ? {}\n : {onFilterChange: this.props.onFilterChange})}\n />\n <tbody>\n {rows.length > 0\n ? rows.map((row, index) =>\n this.renderRow(row, index, selectedKeys))\n : isLoading\n ? this.renderPlaceholders()\n : status === FetchState.Error\n ? null\n : <tr key=\"empty\">\n <td colSpan={this.columns.length}>\n {this.props.emptyMessage ?? 'No rows'}\n </td>\n </tr>}\n </tbody>\n </table>\n </Host>\n }\n\n private renderRow(\n row: TRow,\n index: number,\n selectedKeys: ReadonlySet<unknown>,\n ): FrayChild {\n const key = this.rowKey(row, index)\n const selected = selectedKeys.has(key)\n return <tr\n key={String(key)}\n data-fray-selectable-row=\"\"\n data-index={index}\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >\n {this.columns.map((column) => <td key={String(column.field)}>\n {column.render\n ? column.render(row, index)\n : renderCellValue(row[column.field])}\n </td>)}\n </tr>\n }\n\n private renderPlaceholders(): FrayChild[] {\n const count = this.props.placeholderCount ?? 5\n return Array.from({length: count}, (_, rowIndex) =>\n <tr key={`placeholder-${rowIndex}`}>\n {this.columns.map((column, columnIndex) =>\n <td key={String(column.field)}>\n <Placeholder\n width={45 + ((rowIndex + columnIndex) % 6) * 8}\n />\n </td>)}\n </tr>)\n }\n\n afterUpdate(dom: ChildNode | null): void {\n const rows = dom instanceof Element\n ? dom.querySelectorAll<HTMLElement>('tbody [data-fray-selectable-row]')\n : []\n this.selectionHandler.rowsUpdated(rows)\n }\n\n getSelectedRows(): TRow[] {\n return this.selectionHandler.getSelectedItems()\n }\n\n getSelectedRowsEmitter(): ValueEmitter<TRow[]> {\n return this.selectedItemsEmitter\n }\n\n getSelectedRow(): TRow | null {\n return this.selectedItemEmitter?.get() ?? null\n }\n\n getSelectedRowEmitter(): ValueEmitter<TRow | null> | null {\n return this.selectedItemEmitter\n }\n\n onDestroy(): void {\n this.selectionHandler.destroy()\n this.ownedDataSource?.dispose()\n this.ownedSortEmitter?.dispose()\n this.ownedFiltersEmitter?.dispose()\n }\n\n static dependencies = [Placeholder, TableHeader]\n\n static override hostName = 'data-table'\n static override standaloneHostName = 'data-table'\n\n static css = css`\n & {\n overflow: auto;\n }\n\n & > table {\n width: 100%;\n border-collapse: collapse;\n }\n\n & thead:has([aria-expanded=\"true\"]) {\n position: relative;\n z-index: 1100;\n }\n\n & th,\n & td {\n padding: var(--ui-padding-v) var(--ui-padding-h);\n text-align: start;\n }\n\n & tbody tr[data-fray-selectable-row] {\n cursor: default;\n user-select: none;\n }\n\n `\n}\n\nfunction normalizeColumns<TRow extends TableRow>(\n columns: unknown,\n): readonly TableColumn<TRow>[] {\n if (!Array.isArray(columns) || columns.length === 0) {\n throw new TypeError('DataTable columns must be a non-empty array')\n }\n const fields = new Set<string>()\n return columns.map((column: unknown) => {\n if (column == null || typeof column !== 'object') {\n throw new TypeError('Every DataTable column requires a field')\n }\n const field = Reflect.get(column, 'field')\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError('Every DataTable column requires a field')\n }\n if (fields.has(field)) throw new Error(`Duplicate DataTable column: ${field}`)\n fields.add(field)\n const render = Reflect.get(column, 'render')\n if (render != null && typeof render !== 'function') {\n throw new TypeError(`DataTable column ${field} render must be a function`)\n }\n // Runtime validation above proves the structural column boundary; the\n // row-specific callback relationship is checked at the public API.\n return column as TableColumn<TRow>\n })\n}\n\nfunction assertDataTableInput<TRow extends TableRow>(props: DataTableProps<TRow>): void {\n const legacyNames = ['mode', 'query', 'queryHandler', 'queryUrl', 'baseUrl', 'fetch',\n 'serializeQuery']\n const legacy = legacyNames.find((name) => Object.hasOwn(props, name))\n if (legacy != null) {\n throw new TypeError(\n `DataTable ${legacy} moved to dataSource/rest; see the 0.3 migration guide`,\n )\n }\n const hasData = props.data !== undefined\n const hasDataSource = props.dataSource !== undefined\n const hasRest = props.rest !== undefined\n if (Number(hasData) + Number(hasDataSource) + Number(hasRest) > 1) {\n throw new TypeError('DataTable accepts exactly one of data, dataSource, or rest')\n }\n if (hasDataSource) {\n const source = props.dataSource\n if (source == null\n || typeof source !== 'object'\n || source.query == null\n || typeof source.sortEmitter?.set !== 'function'\n || typeof source.filtersEmitter?.set !== 'function'\n || typeof source.dispose !== 'function') {\n throw new TypeError('DataTable dataSource must implement the table data-source contract')\n }\n }\n}\n\nfunction normalizeRowKey<TRow extends TableRow>(\n rowKey: DataTableProps<TRow>['rowKey'],\n): ItemKeyGetter<TRow> {\n if (rowKey == null) return defaultItemKey\n if (typeof rowKey === 'function') return rowKey\n if (typeof rowKey === 'string' && rowKey.length > 0) {\n return (row, index) => {\n const key = row[rowKey]\n if (key == null) {\n throw new TypeError(`DataTable row at index ${index} lacks ${rowKey}`)\n }\n return key\n }\n }\n throw new TypeError('DataTable rowKey must be a function or property name')\n}\n\nfunction renderCellValue(value: unknown): FrayChild {\n if (value == null || typeof value === 'string' || typeof value === 'number') return value\n return String(value)\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\n\nexport interface TreeNode<TValue = unknown> {\n id: Key\n label: FrayChild\n textValue?: string\n value?: TValue\n children?: readonly TreeNode<TValue>[]\n}\n\nexport interface TreeItemProps<TValue = unknown> extends ComponentProps {\n id: Key\n label: FrayChild\n textValue?: string\n value?: TValue\n}\n\n/** Declarative tree-node marker consumed by TreeView. */\nexport class TreeItem<TValue = unknown> extends Component<TreeItemProps<TValue>> {\n render(): FrayChild {\n return this.props.children ?? []\n }\n}\n","import {DerivedEmitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport type {Key} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {TreeNode} from './treeitem.js'\n\n/** Validate a tree snapshot and reject keys that are not globally unique. */\nexport function assertTreeNodes<TValue>(\n value: unknown,\n): asserts value is readonly TreeNode<TValue>[] {\n if (!Array.isArray(value)) throw new TypeError('Tree nodes must be an array')\n const keys = new Set<Key>()\n const visit = (nodes: readonly TreeNode<TValue>[]): void => {\n for (const node of nodes) {\n if (node == null || typeof node !== 'object' || node.id == null) {\n throw new TypeError('Each tree node requires an id')\n }\n if (keys.has(node.id)) throw new Error(`Duplicate tree item id: ${String(node.id)}`)\n keys.add(node.id)\n if (!Array.isArray(node.children ?? [])) {\n throw new TypeError(`Tree node ${String(node.id)} children must be an array`)\n }\n visit(node.children ?? [])\n }\n }\n visit(value as readonly TreeNode<TValue>[])\n}\n\nexport function findTreeNode<TValue>(\n nodes: readonly TreeNode<TValue>[],\n key: Key,\n): TreeNode<TValue> | null {\n assertTreeNodes(nodes)\n return findValidatedTreeNode(nodes, key)\n}\n\n/**\n * Project the current node for a key from complete root snapshots.\n *\n * The projection is read-only: application commands update the authoritative\n * source, which causes the full tree and then this projection to recompute.\n */\nexport function deriveTreeNode<TValue>(\n nodes: ReadableEmitter<readonly TreeNode<TValue>[], unknown>,\n key: ReadableEmitter<Key | null, unknown>,\n owner: unknown = null,\n): DerivedEmitter<\n TreeNode<TValue> | null,\n readonly [\n ReadableEmitter<readonly TreeNode<TValue>[], unknown>,\n ReadableEmitter<Key | null, unknown>,\n ]\n> {\n return new DerivedEmitter(\n [nodes, key] as const,\n ([currentNodes, currentKey]) => {\n assertTreeNodes(currentNodes)\n return currentKey == null ? null : findValidatedTreeNode(currentNodes, currentKey)\n },\n {owner, purpose: 'tree node projection'},\n )\n}\n\n/** Return a path-copied root snapshot, or the original array when no key exists. */\nexport function updateTreeNode<TValue>(\n nodes: readonly TreeNode<TValue>[],\n key: Key,\n update: (node: TreeNode<TValue>) => TreeNode<TValue>,\n): readonly TreeNode<TValue>[] {\n assertTreeNodes(nodes)\n if (typeof update !== 'function') throw new TypeError('Tree node update must be a function')\n\n const visit = (items: readonly TreeNode<TValue>[]): readonly TreeNode<TValue>[] => {\n for (let index = 0; index < items.length; index += 1) {\n const node = items[index]!\n if (Object.is(node.id, key)) {\n const updated = update(node)\n if (updated == null || typeof updated !== 'object') {\n throw new TypeError('Tree node update must return a tree node')\n }\n if (!Object.is(updated.id, node.id)) {\n throw new Error('Tree node update cannot change the stable id')\n }\n if (Object.is(updated, node)) return items\n const result = [...items]\n result[index] = updated\n return result\n }\n const children = node.children ?? []\n const updatedChildren = visit(children)\n if (!Object.is(updatedChildren, children)) {\n const result = [...items]\n result[index] = {...node, children: updatedChildren}\n return result\n }\n }\n return items\n }\n\n const result = visit(nodes)\n if (!Object.is(result, nodes)) assertTreeNodes(result)\n return result\n}\n\n/** Apply a path-copy update to an authoritative writable root emitter. */\nexport function updateWritableTreeNode<TValue>(\n nodes: ValueEmitter<readonly TreeNode<TValue>[]>,\n key: Key,\n update: (node: TreeNode<TValue>) => TreeNode<TValue>,\n cause: unknown = 'tree node updated',\n): boolean {\n const current = nodes.get()\n const next = updateTreeNode(current, key, update)\n return Object.is(next, current) ? false : nodes.set(next, cause)\n}\n\nfunction findValidatedTreeNode<TValue>(\n nodes: readonly TreeNode<TValue>[],\n key: Key,\n): TreeNode<TValue> | null {\n for (const node of nodes) {\n if (Object.is(node.id, key)) return node\n const found = findValidatedTreeNode(node.children ?? [], key)\n if (found != null) return found\n }\n return null\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css, isVNode} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport {classNames, componentClass, invoke} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {TreeItem} from './treeitem.js'\nimport type {TreeItemProps, TreeNode} from './treeitem.js'\nimport {assertTreeNodes} from './treeModel.js'\n\nexport interface TreeViewProps<TValue = unknown> extends ComponentProps {\n nodes?: readonly TreeNode<TValue>[] | ReadableEmitter<readonly TreeNode<TValue>[], unknown>\n label: string\n selectedKeyEmitter?: ValueEmitter<Key | null>\n expandedKeysEmitter?: ValueEmitter<Key[]>\n renderItem?: (node: TreeNode<TValue>, depth: number) => FrayChild\n onSelect?: (node: TreeNode<TValue>, event: Event) => void\n}\n\ninterface VisibleNode<TValue> {\n node: TreeNode<TValue>\n depth: number\n parentId: Key | null\n position: number\n setSize: number\n}\n\n/** Single-select ARIA tree with controlled expansion and selection. */\nexport class TreeView<TValue = unknown> extends Component<TreeViewProps<TValue>> {\n readonly nodesEmitter: ReadableEmitter<readonly TreeNode<TValue>[], unknown>\n readonly selectedKeyEmitter: ValueEmitter<Key | null>\n readonly expandedKeysEmitter: ValueEmitter<Key[]>\n private readonly ownedNodesEmitter: Emitter<readonly TreeNode<TValue>[]> | null\n private readonly ownedSelectedEmitter: Emitter<Key | null> | null\n private readonly ownedExpandedEmitter: Emitter<Key[]> | null\n private focusedKey: Key | null = null\n private typeahead = ''\n private typeaheadTimer: ReturnType<typeof setTimeout> | null = null\n\n constructor(props: TreeViewProps<TValue>) {\n super(props)\n if (isReadableEmitter<readonly TreeNode<TValue>[]>(props.nodes)) {\n this.nodesEmitter = props.nodes\n this.ownedNodesEmitter = null\n } else {\n const nodes = props.nodes ?? extractDeclarativeNodes<TValue>(props.children)\n this.ownedNodesEmitter = new Emitter(nodes, {\n owner: this,\n purpose: 'tree nodes',\n })\n this.nodesEmitter = this.ownedNodesEmitter\n }\n this.ownedSelectedEmitter = props.selectedKeyEmitter == null\n ? new Emitter<Key | null>(null, {owner: this, purpose: 'selected tree key'})\n : null\n this.selectedKeyEmitter = props.selectedKeyEmitter ?? this.ownedSelectedEmitter!\n this.ownedExpandedEmitter = props.expandedKeysEmitter == null\n ? new Emitter<Key[]>([], {owner: this, purpose: 'expanded tree keys'})\n : null\n this.expandedKeysEmitter = props.expandedKeysEmitter ?? this.ownedExpandedEmitter!\n }\n\n initialize(): void {\n this.reconcile(this.nodesEmitter.get())\n this.watch(this.nodesEmitter, this.selectedKeyEmitter, this.expandedKeysEmitter)\n this.onCleanup(this.nodesEmitter.subscribe(({value}) => this.reconcile(value), {\n emitCurrent: false,\n }))\n }\n\n render(): FrayChild {\n const nodes = this.nodesEmitter.get()\n assertTreeNodes(nodes)\n const expanded = new Set(this.expandedKeysEmitter.get())\n const visible = flattenVisible(nodes, expanded)\n const selected = this.selectedKeyEmitter.get()\n const active = visible.find(({node}) => Object.is(node.id, this.focusedKey))\n ?? visible.find(({node}) => Object.is(node.id, selected))\n ?? visible[0]\n ?? null\n this.focusedKey = active?.node.id ?? null\n\n const Host = this.Host\n return <Host className={classNames('datacomponentlike', componentClass(this.props))}>\n {visible.length === 0\n ? <p role=\"status\">No tree items</p>\n : <div role=\"tree\" aria-label={this.props.label}>\n {visible.map((item, index) => {\n const {node, depth, position, setSize} = item\n const hasChildren = (node.children?.length ?? 0) > 0\n const isExpanded = hasChildren && expanded.has(node.id)\n const isSelected = Object.is(node.id, selected)\n const label = this.props.renderItem?.(node, depth) ?? node.label\n return <div\n key={node.id}\n role=\"treeitem\"\n data-index={index}\n data-depth={depth}\n aria-level={depth + 1}\n aria-posinset={position}\n aria-setsize={setSize}\n aria-expanded={hasChildren ? String(isExpanded) : null}\n aria-selected={String(isSelected)}\n tabIndex={Object.is(node.id, active?.node.id) ? 0 : -1}\n style={{'--tree-depth': depth}}\n onClick={(event: MouseEvent) => {\n this.focusedKey = node.id\n if (isExpanderTarget(event.target) && hasChildren) {\n this.toggleExpanded(node.id)\n this.focusRow(node.id)\n return\n }\n this.selectNode(node, event)\n }}\n onFocus={() => this.focusedKey = node.id}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleKeyDown(event, index, visible)}\n >\n <span\n data-part=\"expander\"\n data-expandable={hasChildren ? '' : null}\n aria-hidden=\"true\"\n >{hasChildren ? (isExpanded ? '▾' : '▸') : '•'}</span>\n <span data-part=\"label\">{label}</span>\n </div>\n })}\n </div>}\n </Host>\n }\n\n onDestroy(): void {\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.ownedNodesEmitter?.dispose()\n this.ownedSelectedEmitter?.dispose()\n this.ownedExpandedEmitter?.dispose()\n }\n\n static dependencies = [TreeItem]\n\n static override hostName = 'tree-view'\n static override standaloneHostName = 'tree-view'\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n & > [role=\"tree\"] {\n display: grid;\n align-content: start;\n }\n\n & [role=\"treeitem\"] {\n display: flex;\n align-items: flex-start;\n gap: 0.35rem;\n min-width: 0;\n padding: 0.38rem 0.5rem;\n padding-inline-start: calc(0.5rem + var(--tree-depth) * 1.1rem);\n cursor: default;\n user-select: none;\n }\n\n & [data-part=\"expander\"] {\n flex: 0 0 1rem;\n text-align: center;\n }\n\n & [data-part=\"expander\"][data-expandable] {\n cursor: pointer;\n }\n\n & [data-part=\"label\"] {\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n & > [role=\"status\"] {\n margin: 0;\n padding: var(--ui-padding, 0.75rem);\n }\n\n @media (forced-colors: active) {\n & [role=\"treeitem\"][aria-selected=\"true\"] {\n outline: 2px solid Highlight;\n forced-color-adjust: auto;\n }\n }\n `\n\n private reconcile(nodes: readonly TreeNode<TValue>[]): void {\n assertTreeNodes(nodes)\n const allKeys = new Set(flattenAll(nodes).map(({node}) => node.id))\n const selected = this.selectedKeyEmitter.get()\n if (this.ownedSelectedEmitter != null && selected != null && !allKeys.has(selected)) {\n this.selectedKeyEmitter.set(null, 'selected tree item removed')\n }\n const expanded = this.expandedKeysEmitter.get()\n const retained = expanded.filter((key) => allKeys.has(key))\n if (this.ownedExpandedEmitter != null && !sameKeys(expanded, retained)) {\n this.expandedKeysEmitter.set(retained, 'removed tree expansions reconciled')\n }\n if (this.focusedKey != null && !allKeys.has(this.focusedKey)) this.focusedKey = null\n }\n\n private selectNode(node: TreeNode<TValue>, event: Event): void {\n this.selectedKeyEmitter.set(node.id, 'tree item selected')\n invoke(this.props.onSelect, node, event)\n this.focusRow(node.id)\n }\n\n private toggleExpanded(key: Key): void {\n const expanded = this.expandedKeysEmitter.get()\n const contains = expanded.some((candidate) => Object.is(candidate, key))\n this.expandedKeysEmitter.set(\n contains\n ? expanded.filter((candidate) => !Object.is(candidate, key))\n : [...expanded, key],\n contains ? 'tree item collapsed' : 'tree item expanded',\n )\n }\n\n private handleKeyDown(\n event: KeyboardEvent,\n index: number,\n visible: readonly VisibleNode<TValue>[],\n ): void {\n const current = visible[index]\n if (current == null) return\n if (event.key === 'ArrowDown') return this.move(event, visible[index + 1]?.node.id)\n if (event.key === 'ArrowUp') return this.move(event, visible[index - 1]?.node.id)\n if (event.key === 'Home') return this.move(event, visible[0]?.node.id)\n if (event.key === 'End') return this.move(event, visible.at(-1)?.node.id)\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n const children = current.node.children ?? []\n if (children.length === 0) return\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (!expanded) this.toggleExpanded(current.node.id)\n else this.focusRow(children[0]!.id)\n return\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (expanded) this.toggleExpanded(current.node.id)\n else if (current.parentId != null) this.focusRow(current.parentId)\n return\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.selectNode(current.node, event)\n return\n }\n if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n this.handleTypeahead(event, visible, index)\n }\n }\n\n private move(event: KeyboardEvent, key: Key | undefined): void {\n if (key === undefined) return\n event.preventDefault()\n this.focusRow(key)\n }\n\n private focusRow(key: Key): void {\n this.focusedKey = key\n const rows = this.dom instanceof Element\n ? [...this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')]\n : []\n for (const row of rows) {\n const index = Number(row.dataset.index)\n const visible = flattenVisible(\n this.nodesEmitter.get(),\n new Set(this.expandedKeysEmitter.get()),\n )\n const matches = Object.is(visible[index]?.node.id, key)\n row.tabIndex = matches ? 0 : -1\n if (matches) row.focus()\n }\n }\n\n private handleTypeahead(\n event: KeyboardEvent,\n visible: readonly VisibleNode<TValue>[],\n index: number,\n ): void {\n event.preventDefault()\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.typeahead += event.key.toLocaleLowerCase()\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = ''\n this.typeaheadTimer = null\n }, 650)\n const candidates = [...visible.slice(index + 1), ...visible.slice(0, index + 1)]\n const match = candidates.find(({node}) => textValue(node)\n .toLocaleLowerCase()\n .startsWith(this.typeahead))\n if (match != null) this.focusRow(match.node.id)\n }\n}\n\nfunction extractDeclarativeNodes<TValue>(children: ComponentProps['children']): TreeNode<TValue>[] {\n const values = Array.isArray(children) ? children : children == null ? [] : [children]\n return values.filter((child) => isVNode(child) && child.type === TreeItem).map((child) => {\n if (!isVNode(child)) throw new TypeError('TreeView children must be TreeItem nodes')\n const props = child.props as unknown as TreeItemProps<TValue>\n return {\n id: props.id,\n label: props.label,\n ...(props.textValue == null ? {} : {textValue: props.textValue}),\n ...(props.value === undefined ? {} : {value: props.value}),\n children: extractDeclarativeNodes<TValue>(props.children),\n }\n })\n}\n\nfunction flattenVisible<TValue>(\n nodes: readonly TreeNode<TValue>[],\n expanded: ReadonlySet<Key>,\n): VisibleNode<TValue>[] {\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n if ((node.children?.length ?? 0) > 0 && expanded.has(node.id)) {\n visit(node.children ?? [], depth + 1, node.id)\n }\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction flattenAll<TValue>(nodes: readonly TreeNode<TValue>[]): VisibleNode<TValue>[] {\n const allKeys = new Set<Key>()\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n if (allKeys.has(node.id)) throw new Error(`Duplicate tree item id: ${String(node.id)}`)\n allKeys.add(node.id)\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n visit(node.children ?? [], depth + 1, node.id)\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction textValue<TValue>(node: TreeNode<TValue>): string {\n if (node.textValue != null) return node.textValue\n if (typeof node.label === 'string' || typeof node.label === 'number') return String(node.label)\n return String(node.id)\n}\n\nfunction sameKeys(left: readonly Key[], right: readonly Key[]): boolean {\n return left.length === right.length\n && left.every((value, index) => Object.is(value, right[index]))\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction isExpanderTarget(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest('[data-part=\"expander\"]') != null\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, invoke} from '../controlUtils.js'\n\nexport interface ButtonProps extends ComponentProps {\n label?: FrayChild\n type?: 'button' | 'reset' | 'submit'\n disabled?: boolean\n pressed?: boolean\n busy?: boolean\n busyLabel?: FrayChild\n id?: string\n name?: string\n value?: string | number\n title?: string\n ariaLabel?: string\n onClick?: (event: MouseEvent) => void\n}\n\n/** Native actionable button primitive. */\nexport class Button extends Component<ButtonProps> {\n constructor(props: ButtonProps = {}) {\n super(props)\n if (props.onClick != null && typeof props.onClick !== 'function') {\n throw new TypeError('Button onClick must be a function')\n }\n }\n\n render(): FrayChild {\n const {\n children = [],\n label,\n type = 'button',\n disabled = false,\n pressed,\n busy = false,\n busyLabel,\n id,\n name,\n value,\n title,\n ariaLabel,\n onClick,\n } = this.props\n const hasChildren = Array.isArray(children)\n ? children.length > 0\n : children != null && typeof children !== 'boolean'\n const normalContent = hasChildren ? children : (label ?? '')\n const content = busy ? (busyLabel ?? normalContent) : normalContent\n const unavailable = disabled || busy\n\n return <button\n id={id}\n name={name}\n value={value == null ? undefined : String(value)}\n title={title}\n type={type}\n disabled={unavailable}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"button\"\n aria-label={ariaLabel}\n aria-pressed={pressed == null ? null : String(Boolean(pressed))}\n aria-busy={busy ? 'true' : null}\n onClick={(event: MouseEvent) => {\n if (!unavailable) invoke(onClick, event)\n }}\n >{content}</button>\n }\n\n static baseStyles = [\n ['button', ['uiline', 'button']],\n ]\n\n static css = css`\n button {\n font-family: inherit;\n }\n `\n}\n","import {Button} from '../menu/button.js'\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, Ref} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport interface DialogProps extends ValueControlProps<boolean> {\n id?: string | number | null\n title: FrayChild\n description?: FrayChild\n actions?: FrayChild\n closeLabel?: string\n showCloseButton?: boolean\n initialFocusRef?: Ref<HTMLElement>\n onClose?: () => void\n}\n\n/** Controlled modal built on the native dialog element. */\nexport class Dialog extends Component<DialogProps> {\n readonly openEmitter: ValueEmitter<boolean>\n readonly dialogId: string\n readonly titleId: string\n readonly descriptionId: string\n private dialogElement: HTMLDialogElement | null = null\n private restoreFocusTo: HTMLElement | null = null\n private synchronizedOpen = false\n\n constructor(props: DialogProps) {\n super(props)\n this.openEmitter = createValueEmitter(this, props, false, 'dialog open state')\n this.dialogId = controlId('dialog', props.id)\n this.titleId = `${this.dialogId}-title`\n this.descriptionId = `${this.dialogId}-description`\n }\n\n initialize(): void {\n this.watch(this.openEmitter)\n }\n\n render(): FrayChild {\n const {\n title,\n description,\n actions,\n closeLabel = 'Close',\n showCloseButton = true,\n children = [],\n } = this.props\n return <dialog\n id={this.dialogId}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"dialog\"\n aria-labelledby={this.titleId}\n aria-describedby={description == null ? null : this.descriptionId}\n aria-modal=\"true\"\n ref={(element: HTMLDialogElement | null) => this.dialogElement = element}\n >\n <header>\n <h2 id={this.titleId}>{title}</h2>\n </header>\n {description == null ? null : <p id={this.descriptionId}>\n {description}\n </p>}\n <div data-part=\"content\">{children}</div>\n {actions == null && !showCloseButton ? null : <footer>\n {actions}\n {showCloseButton ? <Button\n label={closeLabel}\n onClick={() => this.requestClose()}\n /> : null}\n </footer>}\n </dialog>\n }\n\n afterMount(): void {\n const dialog = this.dialogElement\n if (dialog == null) return\n this.listen(dialog, 'cancel', (event: Event) => {\n event.preventDefault()\n this.requestClose()\n })\n this.listen(dialog, 'close', () => {\n if (this.openEmitter.get()) this.openEmitter.set(false, 'native dialog closed')\n this.finishClose()\n })\n this.syncOpenState()\n }\n\n afterUpdate(): void {\n this.syncOpenState()\n }\n\n close(): void {\n this.requestClose()\n }\n\n onDestroy(): void {\n const dialog = this.dialogElement\n if (dialog?.open === true && typeof dialog.close === 'function') dialog.close()\n this.finishClose()\n this.dialogElement = null\n }\n\n static dependencies = [Button]\n\n static css = css`\n dialog {\n width: min(38rem, calc(100vw - 2rem));\n max-height: min(42rem, calc(100dvh - 2rem));\n padding: 0;\n }\n\n dialog > header,\n dialog > p,\n dialog > [data-part=\"content\"],\n dialog > footer {\n padding: var(--panel-padding, 0.75rem);\n }\n\n dialog > header h2,\n dialog > p {\n margin: 0;\n }\n\n dialog > [data-part=\"content\"] {\n overflow: auto;\n }\n\n dialog > footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--spacing-small, 0.5rem);\n }\n\n @media (forced-colors: active) {\n dialog {\n border: 2px solid CanvasText;\n }\n }\n `\n\n private requestClose(): void {\n if (!this.openEmitter.get()) return\n this.openEmitter.set(false, 'dialog close requested')\n }\n\n private syncOpenState(): void {\n const dialog = this.dialogElement\n if (dialog == null) return\n const shouldOpen = this.openEmitter.get()\n if (shouldOpen && !this.synchronizedOpen) {\n const active = document.activeElement\n this.restoreFocusTo = active instanceof HTMLElement ? active : null\n showModal(dialog)\n this.synchronizedOpen = true\n focusInitial(dialog, this.props.initialFocusRef)\n return\n }\n if (!shouldOpen && this.synchronizedOpen) {\n if (dialog.open && typeof dialog.close === 'function') dialog.close()\n else dialog.removeAttribute('open')\n this.finishClose()\n }\n }\n\n private finishClose(): void {\n if (!this.synchronizedOpen && this.restoreFocusTo == null) return\n this.synchronizedOpen = false\n const restore = this.restoreFocusTo\n this.restoreFocusTo = null\n if (restore?.isConnected === true) restore.focus()\n invoke(this.props.onClose)\n }\n}\n\nfunction showModal(dialog: HTMLDialogElement): void {\n if (dialog.open) return\n if (typeof dialog.showModal === 'function') {\n dialog.showModal()\n return\n }\n dialog.setAttribute('open', '')\n}\n\nfunction focusInitial(dialog: HTMLDialogElement, ref: Ref<HTMLElement> | undefined): void {\n const referenced = ref == null\n ? null\n : typeof ref === 'function' ? null : ref.current\n const target = referenced ?? dialog.querySelector<HTMLElement>(\n '[autofocus], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n target?.focus()\n}\n","import {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {Checkbox} from './Checkbox.js'\nimport type {CheckboxProps, CheckboxSymbol} from './Checkbox.js'\n\nexport type QuadCheckboxProps = Omit<CheckboxProps<FilterModeValue>, 'symbols'>\n\n// QuadCheckbox: (Deny ✖) → (Neutral ☐) → (Prefer ✓) → (Require +)\n// Must have all [+]\n// Must not have any [✖]\n// Should have at least one [✓] (if any are marked [✓])\nexport class QuadCheckbox extends Checkbox<FilterModeValue> {\n static override hostName = 'quad-checkbox'\n static override standaloneHostName = 'quad-checkbox'\n\n static symbols = [\n ['✖', FilterMode.Deny],\n ['☐', FilterMode.Neutral],\n ['✓', FilterMode.Prefer],\n ['+', FilterMode.Require],\n ] as const satisfies readonly CheckboxSymbol<FilterModeValue>[]\n\n static defaultSemanticState = FilterMode.Neutral\n\n constructor(props: QuadCheckboxProps = {}) {\n super({...props, symbols: QuadCheckbox.symbols})\n }\n}\n","import {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {Checkbox} from './Checkbox.js'\nimport type {CheckboxProps, CheckboxSymbol} from './Checkbox.js'\n\nexport type TriCheckboxProps = Omit<CheckboxProps<FilterModeValue>, 'symbols'>\n\nexport class TriCheckbox extends Checkbox<FilterModeValue> {\n static override hostName = 'tri-checkbox'\n static override standaloneHostName = 'tri-checkbox'\n\n static symbols = [\n ['✖', FilterMode.Deny],\n ['☐', FilterMode.Neutral],\n ['✓', FilterMode.Prefer],\n ] as const satisfies readonly CheckboxSymbol<FilterModeValue>[]\n\n static defaultSemanticState = FilterMode.Neutral\n\n constructor(props: TriCheckboxProps = {}) {\n super({...props, symbols: TriCheckbox.symbols})\n }\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\nimport {Component, css} from '../component.js'\nimport type {FrayChild} from '../component.js'\nimport {\n assertOptions,\n classNames,\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport type DropdownValue = string | number\n\nexport interface DropdownOption<TValue extends DropdownValue = string> {\n value: TValue\n label?: FrayChild\n disabled?: boolean\n}\n\nexport interface DropdownProps<TValue extends DropdownValue = string>\n extends ValueControlProps<TValue> {\n id?: string | number | null\n options?: readonly DropdownOption<TValue>[]\n | ReadableEmitter<readonly DropdownOption<TValue>[], unknown>\n label?: FrayChild\n name?: string\n disabled?: boolean\n required?: boolean\n error?: unknown\n placeholder?: FrayChild\n ariaLabel?: string\n onChange?: (value: TValue, event: Event) => void\n}\n\nexport class Dropdown<TValue extends DropdownValue = string>\n extends Component<DropdownProps<TValue>> {\n readonly inputId: string\n readonly errorId: string\n readonly optionsEmitter: ReadableEmitter<readonly DropdownOption<TValue>[], unknown>\n readonly valueEmitter: ValueEmitter<TValue>\n private readonly ownsOptionsEmitter: boolean\n\n constructor(props: DropdownProps<TValue> = {}) {\n super(props)\n this.inputId = controlId('dropdown', props.id)\n this.errorId = `${this.inputId}-error`\n const suppliedOptions = props.options ?? []\n if (isReadableEmitter<readonly DropdownOption<TValue>[]>(suppliedOptions)) {\n this.optionsEmitter = suppliedOptions\n this.ownsOptionsEmitter = false\n } else {\n assertOptions<DropdownOption<TValue>>(suppliedOptions)\n this.optionsEmitter = new Emitter<readonly DropdownOption<TValue>[]>(suppliedOptions, {\n owner: this,\n purpose: 'dropdown options',\n })\n this.ownsOptionsEmitter = true\n }\n // The empty string is the DOM select's no-option sentinel. It is only\n // observed when no controlled/default value and no option are present.\n const firstValue = this.optionsEmitter.get()[0]?.value ?? '' as TValue\n this.valueEmitter = createValueEmitter<TValue>(this, props, firstValue, 'dropdown value')\n }\n\n initialize(): void {\n this.watch(this.valueEmitter, this.optionsEmitter)\n }\n\n render(): FrayChild {\n const {\n label,\n name,\n disabled = false,\n required = false,\n error = null,\n placeholder = 'Select…',\n ariaLabel,\n onChange,\n } = this.props\n const options = this.optionsEmitter.get() ?? []\n assertOptions<DropdownOption<TValue>>(options)\n const currentValue = this.valueEmitter.get()\n\n const Host = this.Host\n return <Host\n className={classNames('selectshell', componentClass(this.props))}\n data-disabled={disabled ? '' : null}\n data-required={required ? '' : null}\n data-error={error == null ? null : ''}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <select\n id={this.inputId}\n name={name}\n value={currentValue == null ? '' : String(currentValue)}\n disabled={disabled}\n required={required}\n aria-label={label == null ? ariaLabel : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onChange={(event: Event) => {\n const raw = eventValue(event, 'dropdown change')\n const option = options.find(({value}) => String(value) === raw)\n // A declared option restores TValue; raw is the fallback for\n // JavaScript callers that mutate the select outside that list.\n const nextValue = option?.value ?? raw as TValue\n this.valueEmitter.set(nextValue, 'dropdown selection')\n invoke(onChange, nextValue, event)\n }}\n >\n {currentValue == null || currentValue === ''\n ? <option value=\"\" disabled={required} selected={true}>{placeholder}</option>\n : null}\n {options.map((option) => {\n if (option == null || !Object.hasOwn(option, 'value')) {\n throw new TypeError('Dropdown options require value and label fields')\n }\n return <option\n key={String(option.value)}\n value={String(option.value)}\n disabled={Boolean(option.disabled)}\n selected={Object.is(currentValue, option.value)}\n >{option.label ?? String(option.value)}</option>\n })}\n </select>\n {error == null ? null : <p\n id={this.errorId}\n role=\"alert\"\n >{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'dropdown'\n static override standaloneHostName = 'drop-down'\n\n static baseStyles = [\n ['&', ['labeledinput', 'inputline']],\n ['& > select', ['input', 'inputline']],\n ]\n\n static css = css`\n & {\n position: relative;\n }\n `\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction eventValue(event: Event, purpose: string): string {\n const target = event.currentTarget\n if (target == null || typeof Reflect.get(target, 'value') !== 'string') {\n throw new TypeError(`${purpose} requires a value-bearing event target`)\n }\n return Reflect.get(target, 'value') as string\n}\n","import {Component, css} from '../component.js'\nimport type {FrayChild, Ref} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport interface TextboxProps extends ValueControlProps<string> {\n id?: string | number | null\n label?: FrayChild\n placeholder?: string\n type?: string\n name?: string\n disabled?: boolean\n required?: boolean\n readOnly?: boolean\n error?: unknown\n autoComplete?: string\n inputMode?: string\n minLength?: number\n maxLength?: number\n pattern?: string\n ariaLabel?: string\n inputRef?: Ref<HTMLInputElement>\n onInput?: (value: string, event: Event) => void\n onChange?: (value: string, event: Event) => void\n}\n\nexport class Textbox extends Component<TextboxProps> {\n readonly inputId: string\n readonly errorId: string\n readonly valueEmitter: ValueEmitter<string>\n\n constructor(props: TextboxProps = {}) {\n super(props)\n this.inputId = controlId('textbox', props.id)\n this.errorId = `${this.inputId}-error`\n this.valueEmitter = createValueEmitter(this, props, '', 'textbox value')\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n render(): FrayChild {\n const {\n label,\n placeholder,\n type = 'text',\n name,\n disabled = false,\n required = false,\n readOnly = false,\n error = null,\n autoComplete,\n inputMode,\n minLength,\n maxLength,\n pattern,\n ariaLabel,\n inputRef,\n onInput,\n onChange,\n } = this.props\n const value = this.valueEmitter.get() ?? ''\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-disabled={disabled ? '' : null}\n data-required={required ? '' : null}\n data-error={error == null ? null : ''}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <input\n id={this.inputId}\n name={name}\n type={type}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n readOnly={readOnly}\n autoComplete={autoComplete}\n inputMode={inputMode}\n minLength={minLength}\n maxLength={maxLength}\n pattern={pattern}\n ref={inputRef}\n aria-label={label == null ? ariaLabel : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onInput={(event: Event) => {\n const nextValue = eventValue(event, 'textbox input')\n this.valueEmitter.set(nextValue, 'textbox input')\n invoke(onInput, nextValue, event)\n }}\n onChange={(event: Event) => invoke(\n onChange,\n eventValue(event, 'textbox change'),\n event,\n )}\n />\n {error == null ? null : <p\n id={this.errorId}\n role=\"alert\"\n >{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'textbox'\n static override standaloneHostName = 'text-box'\n\n static baseStyles = [\n ['&', ['labeledinput', 'inputline']],\n ['& > input', ['input', 'inputline']],\n ]\n\n static css = css`\n & input {\n cursor: text;\n }\n\n & > [role=\"alert\"] {\n margin: 0;\n }\n `\n}\n\nfunction eventValue(event: Event, purpose: string): string {\n const target = event.currentTarget\n if (target == null || typeof Reflect.get(target, 'value') !== 'string') {\n throw new TypeError(`${purpose} requires a value-bearing event target`)\n }\n return Reflect.get(target, 'value') as string\n}\n","import {Component, css} from '../component.js'\nimport type {FrayChild, Key} from '../component.js'\nimport {\n assertOptions,\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport type ToggleOption<TValue extends Key = string> = readonly [\n value: TValue,\n label: FrayChild,\n]\n\nexport interface ToggleProps<TValue extends Key = string>\n extends ValueControlProps<TValue> {\n id?: string | number | null\n options?: readonly ToggleOption<TValue>[]\n label?: FrayChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n onChange?: (value: TValue, event: Event | null) => void\n}\n\n/** Mutually exclusive button group with radio-group semantics. */\nexport class Toggle<TValue extends Key = string> extends Component<ToggleProps<TValue>> {\n readonly valueEmitter: ValueEmitter<TValue>\n readonly groupId: string\n readonly legendId: string\n\n constructor(props: ToggleProps<TValue> = {}) {\n super(props)\n const options = props.options ?? []\n validateToggleOptions(options)\n const firstValue = options[0]?.[0] ?? null\n // Null is the runtime no-option sentinel and is used only when no\n // controlled/default value exists for an empty option set.\n this.valueEmitter = createValueEmitter<TValue>(\n this,\n props,\n firstValue ?? null as unknown as TValue,\n 'toggle value',\n )\n this.groupId = controlId('toggle', props.id)\n this.legendId = `${this.groupId}-label`\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n selectOption(value: TValue, event: Event | null = null): void {\n if (this.props.disabled) return\n this.valueEmitter.set(value, 'toggle option selected')\n invoke(this.props.onChange, value, event)\n }\n\n render(): FrayChild {\n const {\n options = [],\n label,\n disabled = false,\n required = false,\n } = this.props\n validateToggleOptions(options)\n const selectedValue = this.valueEmitter.get()\n const selectedIndex = Math.max(0,\n options.findIndex(([value]) => Object.is(value, selectedValue)))\n\n return <fieldset\n id={this.groupId}\n disabled={disabled}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"toggle\"\n data-disabled={disabled ? '' : null}\n aria-required={required ? 'true' : null}\n >\n {label == null ? null : <legend id={this.legendId}>{label}</legend>}\n <div\n data-part=\"options\"\n role=\"radiogroup\"\n aria-label={label == null ? this.props.ariaLabel : null}\n aria-labelledby={label == null ? null : this.legendId}\n >\n {options.map(([value, optionLabel], index) => <button\n key={String(value)}\n type=\"button\"\n role=\"radio\"\n disabled={disabled}\n aria-checked={Object.is(selectedValue, value) ? 'true' : 'false'}\n data-value={String(value)}\n tabIndex={index === selectedIndex ? 0 : -1}\n onClick={(event: MouseEvent) => this.selectOption(value, event)}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleKeyDown(event, index, options)}\n >{optionLabel}</button>)}\n </div>\n </fieldset>\n }\n\n handleKeyDown(\n event: KeyboardEvent,\n index: number,\n options: readonly ToggleOption<TValue>[],\n ): void {\n const {key} = event\n let nextIndex\n if (key === 'ArrowRight' || key === 'ArrowDown') nextIndex = (index + 1) % options.length\n else if (key === 'ArrowLeft' || key === 'ArrowUp') {\n nextIndex = (index - 1 + options.length) % options.length\n } else if (key === 'Home') nextIndex = 0\n else if (key === 'End') nextIndex = options.length - 1\n else return\n\n event.preventDefault()\n const option = options[nextIndex]\n if (option == null) return\n this.selectOption(option[0], event)\n if (this.dom instanceof Element) {\n const radio = this.dom.querySelectorAll<HTMLElement>('[role=\"radio\"]')[nextIndex]\n radio?.focus()\n }\n }\n\n static baseStyles = [\n ['fieldset:has(> [data-part=\"options\"]) > [data-part=\"options\"]', ['uiline']],\n ['fieldset:has(> [data-part=\"options\"]) [role=\"radio\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n fieldset:has(> [data-part=\"options\"]) {\n margin: 0;\n padding: 0;\n border: 0;\n }\n\n fieldset:has(> [data-part=\"options\"]) > [data-part=\"options\"] {\n display: flex;\n padding: 0;\n }\n\n `\n}\n\nfunction validateToggleOptions<TValue extends Key>(\n options: unknown,\n): asserts options is readonly ToggleOption<TValue>[] {\n assertOptions<unknown>(options)\n for (const option of options) {\n if (!Array.isArray(option) || option.length < 2) {\n throw new TypeError('Toggle options must be [value, label] tuples')\n }\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {classNames, componentClass} from '../controlUtils.js'\n\nexport interface ToolbarProps extends ComponentProps {\n id?: string\n label?: string\n orientation?: 'horizontal' | 'vertical'\n}\n\nexport class Toolbar extends Component<ToolbarProps> {\n render(): FrayChild {\n const {\n children = [],\n id,\n label = 'Actions',\n orientation = 'horizontal',\n } = this.props\n if (!['horizontal', 'vertical'].includes(orientation)) {\n throw new TypeError('Toolbar orientation must be horizontal or vertical')\n }\n\n const Host = this.Host\n return <Host\n id={id}\n role=\"toolbar\"\n className={classNames('toolbarlike', componentClass(this.props))}\n data-orientation={orientation}\n aria-label={label}\n aria-orientation={orientation}\n >{children}</Host>\n }\n\n static override hostName = 'toolbar'\n static override standaloneHostName = 'tool-bar'\n\n static css = css`\n & {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--spacing-small, 0.5rem);\n padding: var(--ui-padding);\n }\n\n &[data-orientation=\"vertical\"] {\n flex-direction: column;\n align-items: stretch;\n }\n `\n}\n","import type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nexport interface ProgressBarProps extends ComponentProps {\n id?: string | number | null\n label: FrayChild\n value?: number | null\n valueEmitter?: ReadableEmitter<number | null, unknown>\n max?: number\n valueText?: string\n}\n\n/** Labelled native progress indicator with determinate and indeterminate modes. */\nexport class ProgressBar extends Component<ProgressBarProps> {\n readonly progressId: string\n\n constructor(props: ProgressBarProps) {\n super(props)\n this.progressId = controlId('progress', props.id)\n if (props.valueEmitter != null && !isReadableEmitter(props.valueEmitter)) {\n throw new TypeError('ProgressBar valueEmitter must be a readable emitter')\n }\n }\n\n render(): FrayChild {\n const max = this.props.max ?? 100\n if (!Number.isFinite(max) || max <= 0) {\n throw new RangeError('ProgressBar max must be a positive finite number')\n }\n const sourceValue = this.props.valueEmitter == null\n ? (this.props.value ?? null)\n : this.read(this.props.valueEmitter)\n if (sourceValue != null && (!Number.isFinite(sourceValue) || sourceValue < 0)) {\n throw new RangeError('ProgressBar value must be null or a non-negative finite number')\n }\n const value = sourceValue == null ? null : Math.min(sourceValue, max)\n const valueText = this.props.valueText ?? (value == null\n ? 'In progress'\n : `${Math.round(value / max * 100)}%`)\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <div data-part=\"label-line\">\n <label htmlFor={this.progressId}>{this.props.label}</label>\n <output>{valueText}</output>\n </div>\n <progress\n id={this.progressId}\n value={value == null ? undefined : value}\n max={max}\n aria-valuetext={valueText}\n >{valueText}</progress>\n </Host>\n }\n\n static override hostName = 'progress-bar'\n static override standaloneHostName = 'progress-bar'\n\n static css = css`\n & {\n display: grid;\n gap: var(--spacing-small, 0.5rem);\n }\n\n & > [data-part=\"label-line\"] {\n display: flex;\n justify-content: space-between;\n gap: var(--spacing-medium, 1rem);\n }\n\n & > progress {\n width: 100%;\n min-height: 0.8rem;\n }\n\n @media (forced-colors: active) {\n & > progress {\n forced-color-adjust: auto;\n }\n }\n `\n}\n\nfunction isReadableEmitter(value: unknown): value is ReadableEmitter<number | null, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n","export type FrayStylesheetKind = 'theme' | 'colors'\n\nexport interface FrayStylesheetOption {\n value: string\n label: string\n href: string\n}\n\nexport type FrayThemeVariableLayer = 'palette' | 'theme'\nexport type FrayThemeVariableValue =\n | 'background'\n | 'border'\n | 'color'\n | 'dimension'\n | 'duration'\n | 'font'\n | 'radius'\n | 'shadow'\n\nexport interface FrayThemeVariableDefinition {\n name: `--${string}`\n layer: FrayThemeVariableLayer\n family: string\n value: FrayThemeVariableValue\n description: string\n fallback?: `--${string}`\n}\n\n/**\n * Public, machine-readable theming contract. Component-specific variables fall\n * back through a family rather than forcing every theme to target every host.\n */\nexport const frayThemeVariableCatalog = Object.freeze([\n ...paletteRamp('primary'),\n ...paletteRamp('secondary'),\n ...paletteRamp('neutral'),\n variable('--palette-primary', 'palette', 'primary', 'color', 'Primary anchor color', '--palette-primary-500'),\n variable('--palette-primary-light', 'palette', 'primary', 'color', 'Light primary color', '--palette-primary-200'),\n variable('--palette-primary-dark', 'palette', 'primary', 'color', 'Dark primary color', '--palette-primary-800'),\n variable('--palette-secondary', 'palette', 'secondary', 'color', 'Secondary anchor color', '--palette-secondary-500'),\n variable('--palette-secondary-light', 'palette', 'secondary', 'color', 'Light secondary color', '--palette-secondary-200'),\n variable('--palette-secondary-dark', 'palette', 'secondary', 'color', 'Dark secondary color', '--palette-secondary-800'),\n variable('--palette-neutral', 'palette', 'neutral', 'color', 'Neutral anchor color', '--palette-neutral-500'),\n variable('--palette-neutral-light', 'palette', 'neutral', 'color', 'Light neutral color', '--palette-neutral-200'),\n variable('--palette-neutral-dark', 'palette', 'neutral', 'color', 'Dark neutral color', '--palette-neutral-800'),\n variable('--palette-light', 'palette', 'contrast', 'color', 'Light endpoint'),\n variable('--palette-dark', 'palette', 'contrast', 'color', 'Dark endpoint'),\n variable('--palette-contrast-light', 'palette', 'contrast', 'color', 'Light contrasting foreground', '--palette-light'),\n variable('--palette-contrast-dark', 'palette', 'contrast', 'color', 'Dark contrasting foreground', '--palette-dark'),\n variable('--palette-red', 'palette', 'hue', 'color', 'Red palette color'),\n variable('--palette-green', 'palette', 'hue', 'color', 'Green palette color'),\n\n variable('--font-family', 'theme', 'typography', 'font', 'UI font stack'),\n variable('--font-size', 'theme', 'typography', 'dimension', 'Base UI font size'),\n variable('--line-height', 'theme', 'typography', 'dimension', 'Base UI line height'),\n variable('--control-min-height', 'theme', 'control', 'dimension', 'Minimum control height'),\n variable('--space-xs', 'theme', 'spacing', 'dimension', 'Extra-small spacing'),\n variable('--space-sm', 'theme', 'spacing', 'dimension', 'Small spacing'),\n variable('--space-md', 'theme', 'spacing', 'dimension', 'Medium spacing'),\n variable('--space-lg', 'theme', 'spacing', 'dimension', 'Large spacing'),\n variable('--radius-sm', 'theme', 'shape', 'radius', 'Small corner radius'),\n variable('--radius-md', 'theme', 'shape', 'radius', 'Ordinary corner radius'),\n variable('--radius-lg', 'theme', 'shape', 'radius', 'Large corner radius'),\n variable('--motion-fast', 'theme', 'motion', 'duration', 'Fast interaction transition'),\n\n variable('--ui-background', 'theme', 'surface', 'background', 'Default UI background'),\n variable('--ui-color', 'theme', 'surface', 'color', 'Default UI text'),\n variable('--ui-border', 'theme', 'surface', 'border', 'Default UI border'),\n variable('--ui-shadow', 'theme', 'surface', 'shadow', 'Default raised shadow'),\n variable('--focus-ring', 'theme', 'focus', 'shadow', 'Keyboard focus ring'),\n variable('--focus-color', 'theme', 'focus', 'color', 'Keyboard focus color'),\n variable('--error-color', 'theme', 'status', 'color', 'Error state color'),\n variable('--error-contrast', 'theme', 'status', 'color', 'Content on an error surface'),\n variable('--success-color', 'theme', 'status', 'color', 'Success state color'),\n\n variable('--panel-background', 'theme', 'panel', 'background', 'Panel surface', '--ui-background'),\n variable('--panel-color', 'theme', 'panel', 'color', 'Panel content', '--ui-color'),\n variable('--panel-border', 'theme', 'panel', 'border', 'Panel border', '--ui-border'),\n variable('--panel-shadow', 'theme', 'panel', 'shadow', 'Panel shadow', '--ui-shadow'),\n variable('--panel-radius', 'theme', 'panel', 'radius', 'Panel radius', '--radius-md'),\n variable('--dialog-shadow', 'theme', 'dialog', 'shadow', 'Modal dialog shadow', '--panel-shadow'),\n variable('--dialog-backdrop-background', 'theme', 'dialog', 'background', 'Modal backdrop'),\n\n variable('--header-background', 'theme', 'header', 'background', 'Generic header surface'),\n variable('--header-color', 'theme', 'header', 'color', 'Generic header content'),\n variable('--header-border', 'theme', 'header', 'border', 'Generic header border'),\n variable('--header-shadow', 'theme', 'header', 'shadow', 'Generic header shadow'),\n variable('--section-header-background', 'theme', 'header', 'background', 'Section header surface', '--header-background'),\n variable('--section-header-color', 'theme', 'header', 'color', 'Section header content', '--header-color'),\n variable('--section-header-border', 'theme', 'header', 'border', 'Section header border', '--header-border'),\n variable('--section-header-shadow', 'theme', 'header', 'shadow', 'Section header shadow', '--header-shadow'),\n variable('--panel-header-background', 'theme', 'header', 'background', 'Panel header surface', '--section-header-background'),\n variable('--panel-header-color', 'theme', 'header', 'color', 'Panel header content', '--section-header-color'),\n variable('--table-header-background', 'theme', 'header', 'background', 'Table header surface', '--section-header-background'),\n variable('--table-header-color', 'theme', 'header', 'color', 'Table header content', '--section-header-color'),\n variable('--dialog-header-background', 'theme', 'header', 'background', 'Dialog header surface', '--section-header-background'),\n variable('--dialog-header-color', 'theme', 'header', 'color', 'Dialog header content', '--section-header-color'),\n\n variable('--button-background', 'theme', 'button', 'background', 'Generic button surface'),\n variable('--button-background-hover', 'theme', 'button', 'background', 'Hovered button surface'),\n variable('--button-background-active', 'theme', 'button', 'background', 'Pressed button surface'),\n variable('--button-background-disabled', 'theme', 'button', 'background', 'Disabled button surface'),\n variable('--button-color', 'theme', 'button', 'color', 'Generic button content'),\n variable('--button-border', 'theme', 'button', 'border', 'Generic button border'),\n variable('--button-shadow', 'theme', 'button', 'shadow', 'Generic button shadow'),\n variable('--button-shadow-active', 'theme', 'button', 'shadow', 'Pressed button shadow'),\n variable('--toggle-button-background', 'theme', 'button', 'background', 'Toggle option surface', '--button-background'),\n variable('--toggle-button-background-checked', 'theme', 'button', 'background', 'Selected toggle option', '--selection-background'),\n variable('--tab-button-background', 'theme', 'button', 'background', 'Tab surface', '--button-background'),\n variable('--tab-button-background-active', 'theme', 'button', 'background', 'Active tab surface', '--tab-active-background'),\n variable('--menu-button-background', 'theme', 'button', 'background', 'Menu action surface', '--button-background'),\n variable('--dropdown-trigger-background', 'theme', 'button', 'background', 'Dropdown arrow/trigger surface', '--button-background'),\n variable('--table-header-button-background', 'theme', 'button', 'background', 'Table-header action surface', '--button-background'),\n\n variable('--input-background', 'theme', 'input', 'background', 'Input surface'),\n variable('--input-color', 'theme', 'input', 'color', 'Input content'),\n variable('--input-border', 'theme', 'input', 'border', 'Input border'),\n variable('--input-shadow', 'theme', 'input', 'shadow', 'Input shadow'),\n variable('--input-background-disabled', 'theme', 'input', 'background', 'Disabled input surface'),\n variable('--input-color-disabled', 'theme', 'input', 'color', 'Disabled input content'),\n\n variable('--selection-background', 'theme', 'selection', 'background', 'Selected item surface'),\n variable('--selection-color', 'theme', 'selection', 'color', 'Selected item content'),\n variable('--row-hover-background', 'theme', 'row', 'background', 'Hovered list/table/tree row'),\n variable('--table-row-background', 'theme', 'table', 'background', 'Odd table row surface'),\n variable('--table-row-alt-background', 'theme', 'table', 'background', 'Even table row surface'),\n\n variable('--checkbox-box-background', 'theme', 'checkbox', 'background', 'Unchecked checkbox box', '--input-background'),\n variable('--checkbox-box-background-checked', 'theme', 'checkbox', 'background', 'Checked checkbox box', '--selection-background'),\n variable('--checkbox-box-border', 'theme', 'checkbox', 'border', 'Checkbox box border', '--input-border'),\n variable('--checkbox-symbol-color', 'theme', 'checkbox', 'color', 'Checkbox symbol', '--selection-color'),\n variable('--radio-background', 'theme', 'radio', 'background', 'Radio/toggle option surface', '--toggle-button-background'),\n variable('--radio-background-checked', 'theme', 'radio', 'background', 'Selected radio/toggle option', '--selection-background'),\n\n variable('--toolbar-background', 'theme', 'toolbar', 'background', 'Toolbar surface', '--panel-background'),\n variable('--toolbar-color', 'theme', 'toolbar', 'color', 'Toolbar content', '--panel-color'),\n variable('--toolbar-border', 'theme', 'toolbar', 'border', 'Toolbar border', '--panel-border'),\n variable('--toolbar-shadow', 'theme', 'toolbar', 'shadow', 'Toolbar shadow', '--panel-shadow'),\n variable('--tabline-background', 'theme', 'tabs', 'background', 'Tab strip surface', '--panel-background'),\n variable('--tab-active-background', 'theme', 'tabs', 'background', 'Active tab surface', '--panel-background'),\n variable('--progress-track-background', 'theme', 'progress', 'background', 'Progress track'),\n variable('--progress-value-background', 'theme', 'progress', 'background', 'Progress value'),\n variable('--working-background-image', 'theme', 'status', 'background', 'Indeterminate/loading texture'),\n variable('--colored-base', 'theme', 'colored', 'color', 'Colored-trait base color', '--palette-primary'),\n variable('--colored-light', 'theme', 'colored', 'color', 'Colored-trait light color', '--palette-primary-light'),\n variable('--colored-dark', 'theme', 'colored', 'color', 'Colored-trait dark color', '--palette-primary-dark'),\n variable('--colored-contrast', 'theme', 'colored', 'color', 'Colored-trait foreground', '--palette-contrast-light'),\n] satisfies readonly FrayThemeVariableDefinition[])\n\nexport const frayThemeOptions = Object.freeze([\n option('shiny', 'Shiny', distributedAssetUrl('themes/shiny/theme.css')),\n option('java', 'Java', distributedAssetUrl('themes/java/theme.css')),\n option('minimal', 'Minimal', distributedAssetUrl('themes/minimal/theme.css')),\n])\n\nexport const frayColorOptions = Object.freeze([\n option('iceblue', 'Ice blue', distributedAssetUrl('colors/iceblue/colors.css')),\n option('ocean', 'Ocean', distributedAssetUrl('colors/ocean/colors.css')),\n option('green', 'Green', distributedAssetUrl('colors/green/colors.css')),\n option('gray', 'Gray', distributedAssetUrl('colors/gray/colors.css')),\n option('orange', 'Orange', distributedAssetUrl('colors/orange/colors.css')),\n option('purple', 'Purple', distributedAssetUrl('colors/purple/colors.css')),\n option('red', 'Red', distributedAssetUrl('colors/red/colors.css')),\n option('yellow', 'Yellow', distributedAssetUrl('colors/yellow/colors.css')),\n])\n\n/** Replace one of the two independently loaded Fray presentation stylesheets. */\nexport function replaceFrayStylesheet(\n kind: FrayStylesheetKind,\n selection: FrayStylesheetOption,\n targetDocument: Document = globalThis.document,\n): HTMLLinkElement {\n assertOption(selection)\n if (targetDocument?.head == null || targetDocument.documentElement == null) {\n throw new TypeError('replaceFrayStylesheet requires a document with a head and root')\n }\n\n const selector = `link[data-fray-stylesheet=\"${kind}\"]`\n let link = targetDocument.head.querySelector<HTMLLinkElement>(selector)\n if (link == null) {\n link = targetDocument.createElement('link')\n link.rel = 'stylesheet'\n link.dataset.frayStylesheet = kind\n targetDocument.head.append(link)\n }\n link.dataset.fraySelection = selection.value\n if (link.getAttribute('href') !== selection.href) link.setAttribute('href', selection.href)\n\n if (kind === 'theme') targetDocument.documentElement.dataset.theme = selection.value\n else targetDocument.documentElement.dataset.color = selection.value\n return link\n}\n\nexport function findFrayStylesheetOption(\n options: readonly FrayStylesheetOption[],\n value: string,\n): FrayStylesheetOption {\n const selection = options.find((option) => option.value === value)\n if (selection == null) throw new RangeError(`Unknown Fray stylesheet selection: ${value}`)\n return selection\n}\n\nfunction variable(\n name: FrayThemeVariableDefinition['name'],\n layer: FrayThemeVariableLayer,\n family: string,\n value: FrayThemeVariableValue,\n description: string,\n fallback?: FrayThemeVariableDefinition['fallback'],\n): FrayThemeVariableDefinition {\n return fallback == null\n ? Object.freeze({name, layer, family, value, description})\n : Object.freeze({name, layer, family, value, description, fallback})\n}\n\nfunction paletteRamp(family: 'primary' | 'secondary' | 'neutral') {\n return [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950].map((stop) =>\n variable(\n `--palette-${family}-${stop}`,\n 'palette',\n family,\n 'color',\n `${family[0]?.toUpperCase()}${family.slice(1)} palette stop ${stop}`,\n ))\n}\n\nfunction option(value: string, label: string, href: string): FrayStylesheetOption {\n return Object.freeze({value, label, href})\n}\n\n/**\n * Resolve assets from the published package layout (`dist/index.js` is a\n * sibling of `themes/` and `colors/`). The indirection is deliberate: Vite\n * library mode otherwise turns static CSS URLs into data URLs, which would\n * defeat the separately replaceable stylesheet contract.\n */\nfunction distributedAssetUrl(path: string): string {\n const packageRelativePath = import.meta.url.includes('/src/styling/')\n ? `../../${path}`\n : `../${path}`\n return new URL(packageRelativePath, import.meta.url).href\n}\n\nfunction assertOption(option: unknown): asserts option is FrayStylesheetOption {\n if (option == null || typeof option !== 'object') {\n throw new TypeError('Fray stylesheet selection must be an option')\n }\n for (const field of ['value', 'label', 'href'] as const) {\n if (typeof Reflect.get(option, field) !== 'string'\n || String(Reflect.get(option, field)).length === 0) {\n throw new TypeError(`Fray stylesheet option ${field} must be a non-empty string`)\n }\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {\n classNames,\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\nimport {\n findFrayStylesheetOption,\n frayColorOptions,\n frayThemeOptions,\n replaceFrayStylesheet,\n} from '../../styling/theme.js'\nimport type {\n FrayStylesheetKind,\n FrayStylesheetOption,\n} from '../../styling/theme.js'\n\nexport interface StylesheetPickerProps extends ValueControlProps<string> {\n id?: string | number | null\n label?: FrayChild\n ariaLabel?: string\n disabled?: boolean\n options?: readonly FrayStylesheetOption[]\n targetDocument?: Document\n onChange?: (value: string, option: FrayStylesheetOption, event: Event) => void\n}\n\nabstract class StylesheetPicker extends Component<StylesheetPickerProps> {\n readonly valueEmitter: ValueEmitter<string>\n readonly inputId: string\n private readonly kind: FrayStylesheetKind\n private readonly defaults: readonly FrayStylesheetOption[]\n\n constructor(\n props: StylesheetPickerProps,\n kind: FrayStylesheetKind,\n defaults: readonly FrayStylesheetOption[],\n ) {\n super(props)\n const options = props.options ?? defaults\n validateOptions(options)\n const fallback = options[0]?.value\n if (fallback == null) throw new TypeError(`${kind} picker requires at least one option`)\n this.kind = kind\n this.defaults = defaults\n this.inputId = controlId(`${kind}-picker`, props.id)\n this.valueEmitter = createValueEmitter(this, props, fallback, `${kind} selection`)\n findFrayStylesheetOption(options, this.valueEmitter.get())\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n render(): FrayChild {\n const options = this.options\n const selected = findFrayStylesheetOption(options, this.valueEmitter.get())\n const {label, ariaLabel, disabled = false, onChange} = this.props\n const Host = this.Host\n return <Host\n className={classNames('selectshell', componentClass(this.props))}\n data-kind={this.kind}\n data-disabled={disabled ? '' : null}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <select\n id={this.inputId}\n value={selected.value}\n disabled={disabled}\n aria-label={label == null ? ariaLabel : null}\n onChange={(event: Event) => {\n const value = selectedValue(event)\n const option = findFrayStylesheetOption(options, value)\n this.valueEmitter.set(value, `${this.kind} selected`)\n invoke(onChange, value, option, event)\n }}\n >\n {options.map((option) => <option\n key={option.value}\n value={option.value}\n selected={option.value === selected.value}\n >{option.label}</option>)}\n </select>\n </Host>\n }\n\n afterMount(): void {\n this.applySelection()\n }\n\n afterUpdate(): void {\n this.applySelection()\n }\n\n protected get options(): readonly FrayStylesheetOption[] {\n const options = this.props.options ?? this.defaults\n validateOptions(options)\n return options\n }\n\n private applySelection(): void {\n const targetDocument = this.props.targetDocument\n ?? (typeof document === 'undefined' ? null : document)\n if (targetDocument == null) return\n replaceFrayStylesheet(\n this.kind,\n findFrayStylesheetOption(this.options, this.valueEmitter.get()),\n targetDocument,\n )\n }\n\n static baseStyles = [\n ['&', ['labeledinput', 'inputline']],\n ['& > select', ['input', 'inputline']],\n ]\n\n static css = css`\n & {\n position: relative;\n }\n\n & > select {\n min-width: 8rem;\n }\n `\n}\n\nexport class ThemePicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'theme', frayThemeOptions)\n }\n\n static override hostName = 'theme-picker'\n static override standaloneHostName = 'theme-picker'\n}\n\nexport class ColorPicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'colors', frayColorOptions)\n }\n\n static override hostName = 'color-picker'\n static override standaloneHostName = 'color-picker'\n}\n\nfunction validateOptions(\n options: readonly FrayStylesheetOption[],\n): asserts options is readonly FrayStylesheetOption[] {\n if (!Array.isArray(options) || options.length === 0) {\n throw new TypeError('Stylesheet picker options must be a non-empty array')\n }\n const values = new Set<string>()\n for (const option of options) {\n if (option == null || typeof option !== 'object') {\n throw new TypeError('Stylesheet picker options must be objects')\n }\n for (const field of ['value', 'label', 'href'] as const) {\n if (typeof option[field] !== 'string' || option[field].length === 0) {\n throw new TypeError(`Stylesheet picker option ${field} must be a string`)\n }\n }\n if (values.has(option.value)) {\n throw new Error(`Duplicate stylesheet picker value: ${option.value}`)\n }\n values.add(option.value)\n }\n}\n\nfunction selectedValue(event: Event): string {\n const value = event.currentTarget == null\n ? null\n : Reflect.get(event.currentTarget, 'value')\n if (typeof value !== 'string') {\n throw new TypeError('Stylesheet picker change requires a select element')\n }\n return value\n}\n"],"names":["Tab","Component","FilterMode","isFilterMode","value","mode","nextControlId","controlId","prefix","provided","createValueEmitter","component","props","fallback","purpose","assertEmitter","initialValue","options","Emitter","name","classNames","values","componentClass","invoke","callback","args","assertOptions","describeState","TabLine","__publicField","tabs","validateTabs","emitterProps","_a","tab","event","label","baseId","activeTabId","Host","jsx","index","tabButtonId","tabPanelId","enabled","tabIndex","current","next","css","id","safeId","ids","TabPanel","extractTabs","nextProps","selected","jsxs","disabled","direct","declarative","child","isVNode","tabProps","Panel","header","toolbar","children","orientation","title","Sidebar","ariaLabel","SplitView","primary","secondary","direction","primarySize","primaryLabel","secondaryLabel","DescriptionItem","term","DescriptionList","Placeholder","width","normalizeWidth","numeric","matchesFilterState","item","state","dimensions","assertDefinitions","dimension","optionState","active","option","preferred","filterByState","items","deriveFilterPredicate","owner","DerivedEmitter","deriveFilteredItems","currentItems","currentState","serializeFilterState","assertFilterState","dimensionKey","optionKey","parseFilterState","isRecord","rawOptions","assertKey","dimensionKeys","optionKeys","BaseSelectionHandler","getItems","getKey","defaultItemKey","selectedItemsEmitter","rows","row","clampIndex","onClick","onKeyDown","onMouseDown","onMouseEnter","ownerDocument","onMouseUp","lastIndex","nextIndex","_startIndex","_endIndex","_event","_index","cause","selectedKeys","cleanup","suppressClick","SingleSelectionHandler","config","owned","selectedItemEmitter","SingleSelectionArrayView","MultiSelectionHandler","first","last","range","isCommandPressed","mergeByKey","key","candidate","candidateIndex","startIndex","endIndex","createSelectionHandler","source","eventOrCause","listener","notification","length","left","right","result","keys","ListView","isReadableEmitter","normalizeKeyGetter","status","error","isLoading","FetchState","errorMessage","_","content","defaultItemLabel","dom","itemKey","isRenderablePrimitive","Checkbox","componentType","validateSymbols","currentIndex","nextValue","required","semanticState","semanticIndex","symbol","stateName","checked","symbols","tuple","FilterPanel","isEmitterLike","fetchState","_b","_c","filters","normalizeFilters","filterModes","defaultSemanticState","activeValues","optionValue","optionLabel","valueEmitter","FilterModeCheckbox","nextState","emitter","existing","viewport","anchor","panel","spaceAbove","spaceBelow","placeAbove","available","isFrayLabel","TableHeaderCell","currentSort","isFilterSelectionEntry","filterLabel","entry","TableHeader","column","DefaultTableFilterEncoding","serializeTableQuery","url","sort","assertUrlLike","assertSort","field","entries","applyLocalTableState","filtered","matchesFilters","compareValues","readField","isSortDirection","searchParams","createLocalTableDataSource","createState","ownedData","data","query","ManagedTableDataSource","createQueryTableDataSource","assertTableQuery","createHandlerTableDataSource","QueryArg","LiveQuery","createRestTableDataSource","handlerOptions","RestQueryHandler","disposeQuery","ownedSortEmitter","ownedFiltersEmitter","DataTable","assertDataTableInput","normalizeColumns","normalizeRowKey","_d","renderCellValue","count","rowIndex","columnIndex","columns","fields","render","legacy","hasData","hasDataSource","hasRest","rowKey","TreeItem","assertTreeNodes","visit","nodes","node","findTreeNode","findValidatedTreeNode","deriveTreeNode","currentNodes","currentKey","updateTreeNode","update","updated","updatedChildren","updateWritableTreeNode","found","TreeView","extractDeclarativeNodes","expanded","visible","flattenVisible","depth","position","setSize","hasChildren","isExpanded","isSelected","isExpanderTarget","allKeys","flattenAll","retained","sameKeys","contains","matches","match","textValue","parentId","target","Button","type","pressed","busy","busyLabel","normalContent","unavailable","Dialog","description","actions","closeLabel","showCloseButton","element","dialog","shouldOpen","showModal","focusInitial","restore","ref","_QuadCheckbox","QuadCheckbox","_TriCheckbox","TriCheckbox","Dropdown","suppliedOptions","firstValue","placeholder","onChange","currentValue","raw","eventValue","Textbox","readOnly","autoComplete","inputMode","minLength","maxLength","pattern","inputRef","onInput","Toggle","validateToggleOptions","selectedValue","selectedIndex","radio","Toolbar","ProgressBar","max","sourceValue","valueText","frayThemeVariableCatalog","paletteRamp","variable","frayThemeOptions","distributedAssetUrl","frayColorOptions","replaceFrayStylesheet","kind","selection","targetDocument","assertOption","selector","link","findFrayStylesheetOption","layer","family","stop","href","path","packageRelativePath","StylesheetPicker","defaults","validateOptions","ThemePicker","ColorPicker"],"mappings":";;;;;;AAUO,MAAMA,WAAYC,EAAoB;AAAA,EACzC,SAAoB;AAChB,WAAO,KAAK,MAAM,YAAY,CAAA;AAAA,EAClC;AACJ;ACbO,MAAMC,IAAa;AAAA;AAAA,EAEtB,MAAM;AAAA;AAAA,EAEN,SAAS;AAAA;AAAA,EAET,QAAQ;AAAA;AAAA,EAER,SAAS;AACb;AAKO,SAASC,GAAaC,GAA0C;AACnE,SAAO,OAAO,OAAOF,CAAU,EAAE,KAAK,CAACG,MAASA,MAASD,CAAK;AAClE;ACAA,IAAIE,KAAgB;AAEb,SAASC,EAAUC,GAAgBC,GAA2C;AACjF,SAAIA,KAAY,QAAQ,OAAOA,CAAQ,EAAE,SAAS,IAAU,OAAOA,CAAQ,IACpE,QAAQD,CAAM,IAAIF,IAAe;AAC5C;AAEO,SAASI,EACZC,GACAC,GACAC,GACAC,GACoB;AACpB,MAAIF,EAAM,gBAAgB;AACtB,WAAAG,GAAsBH,EAAM,cAAc,cAAc,GACjDA,EAAM;AAEjB,QAAMI,IAAeJ,EAAM,gBACpBA,EAAM,SACNA,EAAM,gBACNC,GACDI,IAAkC,EAAC,OAAON,GAAW,SAAAG,EAAA;AAC3D,SAAO,IAAII,EAAQF,GAAcC,CAAO;AAC5C;AAEO,SAASF,GACZX,GACAe,IAAO,WAC8B;AACrC,MAAIf,KAAS,QACL,OAAOA,KAAU,YAAY,OAAOA,KAAU,cAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AAC9C,UAAM,IAAI,UAAU,GAAGe,CAAI,qBAAqB;AAExD;AAEO,SAASC,KAAcC,GAA2B;AACrD,SAAOA,EACF,QAAQ,CAACjB,MAAU,OAAOA,KAAU,WAAWA,EAAM,MAAM,KAAK,IAAI,CAAA,CAAE,EACtE,OAAO,OAAO,EACd,KAAK,GAAG;AACjB;AAEO,SAASkB,EAAeV,GAA4D;AACvF,SAAOA,EAAM,aAAaA,EAAM,SAAS;AAC7C;AAEO,SAASW,EACZC,MACGC,GACC;AACJ,MAAID,KAAY,MAChB;AAAA,QAAI,OAAOA,KAAa,WAAY,OAAM,IAAI,UAAU,qCAAqC;AAC7F,IAAAA,EAAS,GAAGC,CAAI;AAAA;AACpB;AAEO,SAASC,GACZT,GACAE,IAAO,WACqB;AAC5B,MAAI,CAAC,MAAM,QAAQF,CAAO,SAAS,IAAI,UAAU,GAAGE,CAAI,mBAAmB;AAC/E;AAEO,SAASQ,GAAcvB,GAAwB;AAClD,SAAID,GAAaC,CAAK,IAAUA,IACzB,OAAOA,CAAK;AACvB;AC7DO,MAAMwB,UAAgB3B,EAAwB;AAAA,EAIjD,YAAYW,IAAsB,IAAI;;AAClC,UAAMA,CAAK;AAJN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AAIL,UAAMC,IAAOlB,EAAM,QAAQ,CAAA;AAC3B,IAAAmB,GAAaD,CAAI;AACjB,UAAME,IAA6B,EAAC,GAAGpB,EAAA;AACvC,IAAIoB,EAAa,gBAAgB,QAAQpB,EAAM,oBAAoB,SAC/DoB,EAAa,eAAepB,EAAM,mBAElCoB,EAAa,gBAAgB,QAAQpB,EAAM,sBAAsB,SACjEoB,EAAa,eAAepB,EAAM,qBAEtC,KAAK,eAAeF;AAAA,MAChB;AAAA,MACAsB;AAAA,QACAC,IAAAH,EAAK,KAAK,CAACI,MAAQ,CAACA,EAAI,QAAQ,MAAhC,gBAAAD,EAAmC,OAAM;AAAA,MACzC;AAAA,IAAA,GAEJ,KAAK,mBAAmB,KAAK;AAAA,EACjC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,UAAUC,GAA6BC,IAAsB,MAAY;AACrE,IAAID,KAAO,QAAQA,EAAI,aACvB,KAAK,aAAa,IAAIA,EAAI,IAAI,cAAc,GAC5CX,EAAO,KAAK,MAAM,UAAUW,EAAI,IAAIC,CAAK;AAAA,EAC7C;AAAA,EAEA,SAAoB;AAChB,UAAM,EAAC,MAAAL,IAAO,CAAA,GAAI,OAAAM,IAAQ,YAAY,QAAAC,IAAS,gBAAe,KAAK;AACnE,IAAAN,GAAaD,CAAI;AACjB,UAAMQ,IAAc,KAAK,aAAa,IAAA,GAEhCC,IAAO,KAAK;AAClB,WAAO,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,MAAK;AAAA,QACL,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,cAAYc;AAAA,QAEX,UAAAN,EAAK,IAAI,CAACI,GAAKO,MAAU,gBAAAD;AAAA,UAAC;AAAA,UAAA;AAAA,YAEvB,IAAIE,GAAYL,GAAQH,EAAI,EAAE;AAAA,YAC9B,MAAK;AAAA,YACL,MAAK;AAAA,YACL,UAAU,EAAQA,EAAI;AAAA,YACtB,iBAAe,OAAO,GAAGI,GAAaJ,EAAI,EAAE,IAAI,SAAS;AAAA,YACzD,iBAAeS,GAAWN,GAAQH,EAAI,EAAE;AAAA,YACxC,UAAU,OAAO,GAAGI,GAAaJ,EAAI,EAAE,IAAI,IAAI;AAAA,YAC/C,SAAS,CAACC,MAAsB,KAAK,UAAUD,GAAKC,CAAK;AAAA,YACzD,WAAW,CAACA,MAAyB,KAAK,cAAcA,GAAOM,GAAOX,CAAI;AAAA,YAC5E,UAAAI,EAAI,SAAS,OAAOA,EAAI,EAAE;AAAA,UAAA;AAAA,UAVnB,OAAOA,EAAI,EAAE;AAAA,QAAA,CAUiB;AAAA,MAAA;AAAA,IAAA;AAAA,EAE/C;AAAA,EAEA,cAAcC,GAAsBM,GAAeX,GAAmC;AAClF,UAAMc,IAAUd,EACX,IAAI,CAACI,GAAKW,OAAc,EAAC,KAAAX,GAAK,UAAAW,EAAA,EAAU,EACxC,OAAO,CAAC,EAAC,KAAAX,QAAS,CAACA,EAAI,QAAQ;AACpC,QAAIU,EAAQ,WAAW,EAAG;AAC1B,UAAME,IAAU,KAAK;AAAA,MAAI;AAAA,MACrBF,EAAQ,UAAU,CAAC,EAAC,UAAAC,EAAA,MAAcA,MAAaJ,CAAK;AAAA,IAAA;AACxD,QAAIM;AACJ,QAAIZ,EAAM,QAAQ,gBAAgBA,EAAM,QAAQ;AAC5C,MAAAY,IAAOH,GAASE,IAAU,KAAKF,EAAQ,MAAM;AAAA,aACtCT,EAAM,QAAQ,eAAeA,EAAM,QAAQ;AAClD,MAAAY,IAAOH,GAASE,IAAU,IAAIF,EAAQ,UAAUA,EAAQ,MAAM;AAAA,aACvDT,EAAM,QAAQ,OAAQ,CAAAY,IAAOH,EAAQ,CAAC;AAAA,aACxCT,EAAM,QAAQ,MAAO,CAAAY,IAAOH,EAAQ,GAAG,EAAE;AAAA,QAC7C;AAEL,QAAIG,KAAQ,SACZZ,EAAM,eAAA,GACN,KAAK,UAAUY,EAAK,KAAKZ,CAAK,GAC1B,KAAK,eAAe,UAAS;AAC7B,YAAMD,IAAM,KAAK,IAAI,iBAA8B,cAAc,EAAEa,EAAK,QAAQ;AAChF,MAAAb,KAAA,QAAAA,EAAK;AAAA,IACT;AAAA,EACJ;AAgBJ;AAdIL,EArFSD,GAqFO,YAAW,aAC3BC,EAtFSD,GAsFO,sBAAqB,aAErCC,EAxFSD,GAwFF,cAAa;AAAA,EAChB,CAAC,0BAA0B,CAAC,UAAU,QAAQ,CAAC;AAAA,IAGnDC,EA5FSD,GA4FF,OAAMoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV,SAASN,GAAYL,GAAgBY,GAAiB;AACzD,SAAO,GAAGZ,CAAM,QAAQa,GAAOD,CAAE,CAAC;AACtC;AAEO,SAASN,GAAWN,GAAgBY,GAAiB;AACxD,SAAO,GAAGZ,CAAM,UAAUa,GAAOD,CAAE,CAAC;AACxC;AAEA,SAASC,GAAO9C,GAAoB;AAChC,SAAO,mBAAmB,OAAOA,CAAK,CAAC,EAAE,WAAW,KAAK,GAAG;AAChE;AAEA,SAAS2B,GAAaD,GAAsD;AACxE,MAAI,CAAC,MAAM,QAAQA,CAAI,EAAG,OAAM,IAAI,UAAU,+BAA+B;AAC7E,QAAMqB,wBAAU,IAAA;AAChB,aAAWjB,KAAOJ,GAAM;AACpB,QAAII,KAAO,QAAQA,EAAI,MAAM,KAAM,OAAM,IAAI,UAAU,yBAAyB;AAChF,QAAIiB,EAAI,IAAIjB,EAAI,EAAE,EAAG,OAAM,IAAI,MAAM,qBAAqB,OAAOA,EAAI,EAAE,CAAC,EAAE;AAC1E,IAAAiB,EAAI,IAAIjB,EAAI,EAAE;AAAA,EAClB;AACJ;AC5GO,MAAMkB,UAAiBnD,EAAyB;AAAA,EAKnD,YAAYW,IAAuB,IAAI;;AACnC,UAAMA,CAAK;AALN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIL,UAAMC,IAAOuB,EAAYzC,CAAK,GACxBoB,IAA8B,EAAC,GAAGpB,EAAA;AACxC,IAAIoB,EAAa,gBAAgB,QAAQpB,EAAM,oBAAoB,SAC/DoB,EAAa,eAAepB,EAAM,mBAElCoB,EAAa,gBAAgB,QAAQpB,EAAM,sBAAsB,SACjEoB,EAAa,eAAepB,EAAM,qBAEtC,KAAK,eAAeF;AAAA,MAChB;AAAA,MACAsB;AAAA,QACAC,IAAAH,EAAK,KAAK,CAACI,MAAQ,CAACA,EAAI,QAAQ,MAAhC,gBAAAD,EAAmC,OAAM;AAAA,MACzC;AAAA,IAAA,GAEJ,KAAK,mBAAmB,KAAK,cAC7B,KAAK,SAAS1B,EAAU,QAAQK,EAAM,EAAE;AAAA,EAC5C;AAAA,EAEA,aAAmB;;AACf,UAAMkB,IAAOuB,EAAY,KAAK,KAAK;AACnC,IAAKvB,EAAK,KAAK,CAAC,EAAC,IAAAmB,EAAA,MAAQ,OAAO,GAAGA,GAAI,KAAK,aAAa,IAAA,CAAK,CAAC,KAC3D,KAAK,aAAa,MAAIhB,IAAAH,EAAK,KAAK,CAACI,MAAQ,CAACA,EAAI,QAAQ,MAAhC,gBAAAD,EAAmC,OAAM,IAAI,GAEvE,KAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,SAASqB,GAAgC;;AACrC,UAAM,SAASA,CAAS;AACxB,UAAMxB,IAAOuB,EAAYC,CAAS;AAClC,WAAKxB,EAAK,KAAK,CAAC,EAAC,IAAAmB,EAAA,MAAQ,OAAO,GAAGA,GAAI,KAAK,aAAa,IAAA,CAAK,CAAC,KAC3D,KAAK,aAAa,MAAIhB,IAAAH,EAAK,KAAK,CAACI,MAAQ,CAACA,EAAI,QAAQ,MAAhC,gBAAAD,EAAmC,OAAM,IAAI,GAEhE;AAAA,EACX;AAAA,EAEA,SAAoB;AAChB,UAAMH,IAAOuB,EAAY,KAAK,KAAK,GAC7BE,IAAWzB,EAAK,KAAK,CAAC,EAAC,IAAAmB,EAAA,MAAQ,OAAO,GAAGA,GAAI,KAAK,aAAa,IAAA,CAAK,CAAC,KACpEnB,EAAK,KAAK,CAACI,MAAQ,CAACA,EAAI,QAAQ,KAChC,MACDK,IAAO,KAAK;AAClB,WAAO,gBAAAiB;AAAA,MAACjB;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,WAAWnB,EAAW,aAAaE,EAAe,KAAK,KAAK,CAAC;AAAA,QAE7D,UAAA;AAAA,UAAA,gBAAAkB;AAAA,YAACZ;AAAA,YAAA;AAAA,cAEG,MAAME,EAAK,IAAI,CAAC,EAAC,IAAAmB,GAAI,OAAAb,GAAO,UAAAqB,EAAA,OAAe,EAAC,IAAAR,GAAI,OAAAb,GAAO,UAAAqB,IAAU;AAAA,cACjE,cAAc,KAAK;AAAA,cACnB,QAAQ,KAAK;AAAA,cACZ,GAAI,KAAK,MAAM,SAAS,OAAO,KAAK,EAAC,OAAO,KAAK,MAAM,MAAA;AAAA,cACvD,GAAI,KAAK,MAAM,YAAY,OAAO,CAAA,IAAK,EAAC,UAAU,KAAK,MAAM,SAAA;AAAA,YAAQ;AAAA,YALlE;AAAA,UAAA;AAAA,UAOPF,KAAY,OAAO,OAAO,gBAAAf;AAAA,YAAC;AAAA,YAAA;AAAA,cAExB,IAAIG,GAAW,KAAK,QAAQY,EAAS,EAAE;AAAA,cACvC,MAAK;AAAA,cACL,aAAU;AAAA,cACV,mBAAiBb,GAAY,KAAK,QAAQa,EAAS,EAAE;AAAA,cACrD,UAAU;AAAA,cACZ,UAAAA,EAAS;AAAA,YAAA;AAAA,YANF,OAAOA,EAAS,EAAE;AAAA,UAAA;AAAA,QAMR;AAAA,MAAA;AAAA,IAAA;AAAA,EAE3B;AAuBJ;AArBI1B,EAvESuB,GAuEF,gBAAe,CAACxB,GAAS5B,EAAG,IAEnC6B,EAzESuB,GAyEO,YAAW,cAC3BvB,EA1ESuB,GA0EO,sBAAqB,cAErCvB,EA5ESuB,GA4EF,OAAMJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBjB,SAASK,EAAYzC,GAAuC;AACxD,QAAM8C,IAAS9C,EAAM,QAAQ,CAAA;AAC7B,MAAI,CAAC,MAAM,QAAQ8C,CAAM,EAAG,OAAM,IAAI,UAAU,gCAAgC;AAIhF,QAAMC,KAHW,MAAM,QAAQ/C,EAAM,QAAQ,IACvCA,EAAM,WACNA,EAAM,YAAY,OAAO,CAAA,IAAK,CAACA,EAAM,QAAQ,GAE9C,OAAO,CAACgD,MAAUC,GAAQD,CAAK,KAAKA,EAAM,SAAS5D,EAAG,EACtD,IAAI,CAAC4D,GAAOnB,MAAU;AACnB,QAAI,CAACoB,GAAQD,CAAK,EAAG,OAAM,IAAI,UAAU,qCAAqC;AAG9E,UAAME,IAAWF,EAAM;AACvB,WAAO;AAAA,MACH,IAAIE,EAAS,MAAM,OAAOrB,IAAQ,CAAC;AAAA,MACnC,OAAOqB,EAAS,SAAS,OAAOrB,IAAQ,CAAC;AAAA,MACzC,UAAU,EAAQqB,EAAS;AAAA,MAC3B,SAASA,EAAS,YAAY,CAAA;AAAA,IAAC;AAAA,EAEvC,CAAC,GACChC,IAAwB4B,EAAO,SAAS,IACxCA,EAAO,IAAI,CAACxB,OAAwB;AAAA,IAClC,GAAGA;AAAA,IACH,OAAOA,EAAI,SAAS,OAAOA,EAAI,EAAE;AAAA,IACjC,UAAU,EAAQA,EAAI;AAAA,IACtB,SAASA,EAAI,WAAWA,EAAI,aAAa,CAAA;AAAA,EAAC,EAC5C,IACAyB,GACAR,wBAAU,IAAA;AAChB,aAAWjB,KAAOJ,GAAM;AACpB,SAAII,KAAA,gBAAAA,EAAK,OAAM,KAAM,OAAM,IAAI,UAAU,yBAAyB;AAClE,QAAIiB,EAAI,IAAIjB,EAAI,EAAE,EAAG,OAAM,IAAI,MAAM,qBAAqB,OAAOA,EAAI,EAAE,CAAC,EAAE;AAC1E,IAAAiB,EAAI,IAAIjB,EAAI,EAAE;AAAA,EAClB;AACA,SAAOJ;AACX;AC1JO,MAAMiC,WAAc9D,EAAsB;AAAA,EAI7C,YAAYW,IAAoB,IAAI;AAChC,UAAMA,CAAK;AAJN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUtB,EAAU,SAASK,EAAM,EAAE,GAC1C,KAAK,WAAW,GAAG,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,SAAS;AACL,UAAM;AAAA,MACF,QAAAoD,IAAS;AAAA,MACT,SAAAC,IAAU;AAAA,MACV,UAAAC,IAAW,CAAA;AAAA,MACX,aAAAC,IAAc;AAAA,MACd,UAAAV,IAAW;AAAA,IAAA,IACX,KAAK;AACT,QAAI,CAAC,CAAC,cAAc,UAAU,EAAE,SAASU,CAAW;AAChD,YAAM,IAAI,UAAU,kDAAkD;AAG1E,UAAM5B,IAAO,KAAK,MACZ6B,IAAQJ,KAAU,OAClB,OACA,gBAAAxB,EAAC,YACE,UAAA,OAAOwB,KAAW,YAAY,OAAOA,KAAW,6BAC1C,MAAA,EAAG,IAAI,KAAK,UAAW,UAAAA,EAAA,CAAO,IAC/B,gBAAAxB,EAAC,OAAA,EAAI,IAAI,KAAK,UAAW,UAAAwB,EAAA,CAAO,EAAA,CAC1C;AAEJ,WAAO,gBAAAR;AAAA,MAACjB;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,MAAMyB,KAAU,OAAO,OAAO;AAAA,QAC9B,WAAW5C,EAAW,aAAaE,EAAe,KAAK,KAAK,CAAC;AAAA,QAC7D,oBAAkB6C;AAAA,QAClB,iBAAeV,IAAW,KAAK;AAAA,QAC/B,iBAAeA,IAAW,SAAS;AAAA,QACnC,mBAAiBO,KAAU,OAAO,OAAO,KAAK;AAAA,QAE7C,UAAA;AAAA,UAAAI;AAAA,UACAH;AAAA,4BACA,OAAA,EAAI,aAAU,WAAU,oBAAkBE,GAAc,UAAAD,EAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAE1E;AAkCJ;AAhCIrC,EA9CSkC,IA8CO,YAAW,UAC3BlC,EA/CSkC,IA+CO,sBAAqB,iBAErClC,EAjDSkC,IAiDF,OAAMf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACjDV,MAAMqB,WAAgBpE,EAAwB;AAAA,EAIjD,YAAYW,IAAsB,IAAI;AAClC,UAAMA,CAAK;AAJN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,YAAYtB,EAAU,WAAWK,EAAM,EAAE,GAC9C,KAAK,WAAW,GAAG,KAAK,SAAS;AAAA,EACrC;AAAA,EAEA,SAAoB;AAChB,UAAM;AAAA,MACF,QAAAoD,IAAS;AAAA,MACT,SAAAC,IAAU;AAAA,MACV,WAAAK;AAAA,MACA,UAAAJ,IAAW,CAAA;AAAA,IAAC,IACZ,KAAK,OACHE,IAAQJ,KAAU,OAClB,OACA,gBAAAxB,EAAC,YACE,UAAA,OAAOwB,KAAW,YAAY,OAAOA,KAAW,6BAC1C,MAAA,EAAG,IAAI,KAAK,UAAW,UAAAA,EAAA,CAAO,IAC/B,gBAAAxB,EAAC,OAAA,EAAI,IAAI,KAAK,UAAW,UAAAwB,EAAA,CAAO,EAAA,CAC1C;AAEJ,WAAO,gBAAAR;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,WAAWlC,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,uBAAoB;AAAA,QACpB,cAAY0C,KAAU,OAAOM,IAAY;AAAA,QACzC,mBAAiBN,KAAU,OAAO,OAAO,KAAK;AAAA,QAE7C,UAAA;AAAA,UAAAI;AAAA,UACAH,KAAW,OAAO,yBAAQ,OAAA,EAAI,aAAU,WAAW,UAAAA,GAAQ;AAAA,4BAC3D,OAAA,EAAI,aAAU,WAAU,UAAU,GAAI,UAAAC,EAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAExD;AA6BJ;AA3BIrC,EAtCSwC,IAsCF,OAAMrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACpCV,MAAMuB,WAAkBtE,EAA0B;AAAA,EACrD,SAAoB;AAChB,UAAM;AAAA,MACF,SAAAuE,IAAU;AAAA,MACV,WAAAC,IAAY;AAAA,MACZ,WAAAC,IAAY;AAAA,MACZ,aAAAC;AAAA,MACA,cAAAC;AAAA,MACA,gBAAAC;AAAA,IAAA,IACA,KAAK;AACT,QAAIH,MAAc,gBAAgBA,MAAc;AAC5C,YAAM,IAAI,UAAU,oDAAoD;AAE5E,QAAIC,KAAe,SAAS,OAAOA,KAAgB,YAAYA,EAAY,WAAW;AAClF,YAAM,IAAI,UAAU,oDAAoD;AAE5E,UAAMpC,IAAO,KAAK;AAClB,WAAO,gBAAAiB;AAAA,MAACjB;AAAA,MAAA;AAAA,QACJ,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,kBAAgBoD;AAAA,QAChB,OAAOC,KAAe,OAAO,SAAY,EAAC,wBAAwBA,EAAA;AAAA,QAElE,UAAA;AAAA,UAAA,gBAAAnC;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,aAAU;AAAA,cACV,MAAMoC,KAAgB,OAAO,OAAO;AAAA,cACpC,cAAYA;AAAA,cACd,UAAAJ;AAAA,YAAA;AAAA,UAAA;AAAA,UACF,gBAAAhC;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,aAAU;AAAA,cACV,MAAMqC,KAAkB,OAAO,OAAO;AAAA,cACtC,cAAYA;AAAA,cACd,UAAAJ,KAAa,KAAK,MAAM,YAAY,CAAA;AAAA,YAAC;AAAA,UAAA;AAAA,QAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAEjD;AAwCJ;AAtCI5C,EAnCS0C,IAmCO,YAAW,eAC3B1C,EApCS0C,IAoCO,sBAAqB,eAErC1C,EAtCS0C,IAsCF,OAAMvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC1CV,MAAM8B,WAAwB7E,EAAgC;AAAA,EACjE,SAAoB;AAChB,UAAM,EAAC,MAAA8E,GAAM,OAAA3E,GAAO,UAAA8D,IAAW,CAAA,EAAC,IAAK,KAAK;AAC1C,WAAO,gBAAAV;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,WAAWlC,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,uBAAoB;AAAA,QAEpB,UAAA;AAAA,UAAA,gBAAAkB,EAAC,QAAI,UAAAuC,EAAA,CAAK;AAAA,UACV,gBAAAvC,EAAC,MAAA,EAAI,UAAApC,KAAS8D,EAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAE/B;AAuBJ;AArBIrC,EAZSiD,IAYF,OAAM9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BV,MAAMgC,WAAwB/E,EAAgC;AAAA,EACjE,SAAoB;AAChB,WAAO,gBAAAuC;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,WAAWpB,EAAW,qBAAqBE,EAAe,KAAK,KAAK,CAAC;AAAA,QACrE,uBAAoB;AAAA,QACpB,cAAY,KAAK,MAAM;AAAA,QACzB,UAAA,KAAK,MAAM,YAAY,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,EAC9B;AAUJ;AARIO,EATSmD,IASF,gBAAe,CAACF,EAAe,IAEtCjD,EAXSmD,IAWF,OAAMhC;AAAA;AAAA;AAAA;AAAA;AAAA;ACrDV,MAAMiC,UAAoBhF,EAA4B;AAAA,EACzD,SAAS;AACL,UAAMiF,IAAQC,GAAe,KAAK,MAAM,SAAS,EAAE,GAC7C5C,IAAO,KAAK;AAClB,WAAO,gBAAAC,EAACD,GAAA,EAAK,OAAO,EAAC,OAAO,GAAG2C,CAAK,IAAA,GAAM,eAAY,OAAA,CAAO;AAAA,EACjE;AA0BJ;AAxBIrD,EAPSoD,GAOO,YAAW,gBAC3BpD,EARSoD,GAQO,sBAAqB,wBAErCpD,EAVSoD,GAUF,cAAa;AAAA,EAChB,CAAC,YAAY,CAAC,SAAS,SAAS,CAAC;AAAA,IAGrCpD,EAdSoD,GAcF,OAAMjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBjB,SAASmC,GAAeD,GAAgC;AACpD,QAAME,IAAU,OAAOF,CAAK;AAC5B,MAAI,CAAC,OAAO,SAASE,CAAO,EAAG,OAAM,IAAI,UAAU,mCAAmC;AACtF,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,IAAIA,CAAO,CAAC;AAC9C;ACXO,SAASC,GACZC,GACAC,GACAC,GACO;AACP,EAAAC,GAAkBD,CAAU;AAC5B,aAAWE,KAAaF,GAAY;AAChC,UAAMG,IAAcJ,EAAMG,EAAU,GAAG;AACvC,QAAIC,KAAe,KAAM;AACzB,UAAMC,IAASF,EAAU,QAAQ,QAAQ,CAACG,MAAW;AACjD,YAAMxF,IAAOsF,EAAYE,EAAO,GAAG;AACnC,aAAOxF,KAAQ,QAAQA,MAASH,EAAW,UAAU,CAAA,IAAK,CAAC,EAAC,QAAA2F,GAAQ,MAAAxF,GAAK;AAAA,IAC7E,CAAC;AAKD,QAJIuF,EAAO,KAAK,CAAC,EAAC,QAAAC,GAAQ,MAAAxF,EAAA,MAAUA,MAASH,EAAW,QAAQ2F,EAAO,QAAQP,CAAI,CAAC,KAGnEM,EAAO,OAAO,CAAC,EAAC,MAAAvF,QAAUA,MAASH,EAAW,OAAO,EACzD,KAAK,CAAC,EAAC,QAAA2F,EAAA,MAAY,CAACA,EAAO,QAAQP,CAAI,CAAC;AACjD,aAAO;AAEX,UAAMQ,IAAYF,EAAO,OAAO,CAAC,EAAC,MAAAvF,QAAUA,MAASH,EAAW,MAAM;AACtE,QAAI4F,EAAU,SAAS,KAAK,CAACA,EAAU,KAAK,CAAC,EAAC,QAAAD,EAAA,MAAYA,EAAO,QAAQP,CAAI,CAAC;AAC1E,aAAO;AAAA,EAEf;AACA,SAAO;AACX;AAEO,SAASS,GACZC,GACAT,GACAC,GACO;AACP,MAAI,CAAC,MAAM,QAAQQ,CAAK,EAAG,OAAM,IAAI,UAAU,iCAAiC;AAChF,SAAOA,EAAM,OAAO,CAACV,MAASD,GAAmBC,GAAMC,GAAOC,CAAU,CAAC;AAC7E;AAGO,SAASS,GACZV,GACAC,GACAU,IAAiB,MACyE;AAC1F,SAAAT,GAAkBD,CAAU,GACrB,IAAIW;AAAA,IACP,CAACZ,CAAK;AAAA,IACN,CAAC,CAACzC,CAAO,MAAM,CAACwC,MAAgBD,GAAmBC,GAAMxC,GAAS0C,CAAU;AAAA,IAC5E,EAAC,OAAAU,GAAO,SAAS,mBAAA;AAAA,EAAkB;AAE3C;AAGO,SAASE,GACZJ,GACAT,GACAC,GACAU,IAAiB,MAInB;AACE,SAAAT,GAAkBD,CAAU,GACrB,IAAIW;AAAA,IACP,CAACH,GAAOT,CAAK;AAAA,IACb,CAAC,CAACc,GAAcC,CAAY,MAAMP,GAAcM,GAAcC,GAAcd,CAAU;AAAA,IACtF,EAAC,OAAAU,GAAO,SAAS,iBAAA;AAAA,EAAgB;AAEzC;AAGO,SAASK,GAAqBhB,GAA2C;AAC5E,EAAAiB,GAAkBjB,CAAK;AACvB,QAAMC,IAA8D,CAAA;AACpE,aAAWiB,KAAgB,OAAO,KAAKlB,CAAK,EAAE,QAAQ;AAClD,UAAMtE,IAA2C,CAAA,GAC3CyE,IAAYH,EAAMkB,CAAY;AACpC,eAAWC,KAAa,OAAO,KAAKhB,CAAS,EAAE;AAC3C,MAAAzE,EAAQyF,CAAS,IAAIhB,EAAUgB,CAAS;AAE5C,IAAAlB,EAAWiB,CAAY,IAAIxF;AAAA,EAC/B;AACA,SAAO,EAAC,SAAS,GAAG,YAAAuE,EAAA;AACxB;AAGO,SAASmB,GAAiBvG,GAA6B;AAC1D,MAAI,CAACwG,EAASxG,CAAK,KAAKA,EAAM,YAAY,KAAK,CAACwG,EAASxG,EAAM,UAAU;AACrE,UAAM,IAAI,UAAU,0DAA0D;AAElF,QAAMmF,IAAyD,CAAA;AAC/D,aAAW,CAACkB,GAAcI,CAAU,KAAK,OAAO,QAAQzG,EAAM,UAAU,GAAG;AAEvE,QADA0G,EAAUL,GAAc,kBAAkB,GACtC,CAACG,EAASC,CAAU;AACpB,YAAM,IAAI,UAAU,oBAAoBJ,CAAY,oBAAoB;AAE5E,UAAMxF,IAA2C,CAAA;AACjD,eAAW,CAACyF,GAAWrG,CAAI,KAAK,OAAO,QAAQwG,CAAU,GAAG;AAExD,UADAC,EAAUJ,GAAW,oBAAoBD,CAAY,EAAE,GACnD,CAACtG,GAAaE,CAAI;AAClB,cAAM,IAAI;AAAA,UACN,2BAA2BoG,CAAY,IAAIC,CAAS,KAAK,OAAOrG,CAAI,CAAC;AAAA,QAAA;AAG7E,MAAAY,EAAQyF,CAAS,IAAIrG;AAAA,IACzB;AACA,IAAAkF,EAAMkB,CAAY,IAAIxF;AAAA,EAC1B;AACA,SAAOsE;AACX;AAEA,SAASiB,GAAkBpG,GAA8C;AACrE,MAAI,CAACwG,EAASxG,CAAK,EAAG,OAAM,IAAI,UAAU,gCAAgC;AAC1E,aAAW,CAACqG,GAAcxF,CAAO,KAAK,OAAO,QAAQb,CAAK,GAAG;AAEzD,QADA0G,EAAUL,GAAc,kBAAkB,GACtC,CAACG,EAAS3F,CAAO;AACjB,YAAM,IAAI,UAAU,oBAAoBwF,CAAY,oBAAoB;AAE5E,eAAW,CAACC,GAAWrG,CAAI,KAAK,OAAO,QAAQY,CAAO;AAElD,UADA6F,EAAUJ,GAAW,oBAAoBD,CAAY,EAAE,GACnD,CAACtG,GAAaE,CAAI;AAClB,cAAM,IAAI;AAAA,UACN,2BAA2BoG,CAAY,IAAIC,CAAS,KAAK,OAAOrG,CAAI,CAAC;AAAA,QAAA;AAAA,EAIrF;AACJ;AAEA,SAASoF,GACLD,GACI;AACJ,MAAI,CAAC,MAAM,QAAQA,CAAU,EAAG,OAAM,IAAI,UAAU,oCAAoC;AACxF,QAAMuB,wBAAoB,IAAA;AAC1B,aAAWrB,KAAaF,GAAY;AAEhC,QADAsB,EAAUpB,EAAU,KAAK,kBAAkB,GACvCqB,EAAc,IAAIrB,EAAU,GAAG;AAC/B,YAAM,IAAI,MAAM,+BAA+BA,EAAU,GAAG,EAAE;AAGlE,QADAqB,EAAc,IAAIrB,EAAU,GAAG,GAC3B,CAAC,MAAM,QAAQA,EAAU,OAAO;AAChC,YAAM,IAAI,UAAU,oBAAoBA,EAAU,GAAG,2BAA2B;AAEpF,UAAMsB,wBAAiB,IAAA;AACvB,eAAWnB,KAAUH,EAAU,SAAS;AAEpC,UADAoB,EAAUjB,EAAO,KAAK,oBAAoBH,EAAU,GAAG,EAAE,GACrDsB,EAAW,IAAInB,EAAO,GAAG;AACzB,cAAM,IAAI,MAAM,4BAA4BH,EAAU,GAAG,IAAIG,EAAO,GAAG,EAAE;AAG7E,UADAmB,EAAW,IAAInB,EAAO,GAAG,GACrB,OAAOA,EAAO,WAAY;AAC1B,cAAM,IAAI,UAAU,kBAAkBH,EAAU,GAAG,IAAIG,EAAO,GAAG,qBAAqB;AAAA,IAE9F;AAAA,EACJ;AACJ;AAEA,SAASiB,EAAU1G,GAAee,GAAoB;AAClD,MAAIf,EAAM,WAAW,KAAKA,MAAU,eAAeA,MAAU,eACtDA,MAAU;AACb,UAAM,IAAI,UAAU,GAAGe,CAAI,sCAAsC;AAEzE;AAEA,SAASyF,EAASxG,GAAkD;AAChE,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK;AAC7E;ACzJO,MAAM6G,GAAsC;AAAA,EAmB/C,YAAY;AAAA,IACR,UAAAC;AAAA,IACA,QAAAC,IAASC;AAAA,IACT,sBAAAC;AAAA,IACA,OAAAnB,IAAQ;AAAA,EAAA,GAC0B;AAvB7B,IAAArE,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACC,IAAAA,EAAA,cAAsB,CAAA;AACf,IAAAA,EAAA,qBAAiC,CAAA;AACxC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAA6B;AAC/B,IAAAA,EAAA,wBAAgC;AAChC,IAAAA,EAAA,yBAAqC;AACrC,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,qBAAmC;AACnC,IAAAA,EAAA,2BAAoB;AACpB,IAAAA,EAAA,4BAA2D;AAC3D,IAAAA,EAAA,mBAAY;AACH,IAAAA,EAAA;AAQb,QAAI,OAAOqF,KAAa;AACpB,YAAM,IAAI,UAAU,+CAA+C;AAEvE,QAAI,OAAOC,KAAW;AAClB,YAAM,IAAI,UAAU,6CAA6C;AAErE,SAAK,WAAWD,GAChB,KAAK,SAASC,GACd,KAAK,4BAA4BE,KAAwB,OACnD,IAAInG,EAAiB,IAAI,EAAC,OAAAgF,GAAO,SAAS,iBAAA,CAAiB,IAC3D,MACN,KAAK,uBAAuBmB,KACrB,KAAK,2BACZ,KAAK,iBAAiB,KAAK,sBAC3B,KAAK,2BAA2B,KAAK,6BAA6B;AAAA,EACtE;AAAA,EAEA,YAAYC,GAAmE;AAC3E,IAAI,KAAK,cACT,KAAK,YAAA,GACL,KAAK,OAAO,MAAM,KAAKA,KAAQ,CAAA,CAAE,GACjC,KAAK,KAAK,QAAQ,CAACC,GAAK9E,MAAU,KAAK,QAAQ8E,GAAK9E,CAAK,CAAC,GAC1D,KAAK,cAAc+E,GAAW,KAAK,aAAa,KAAK,KAAK,MAAM,GAChE,KAAK,uBAAA,GACL,KAAK,SAAA;AAAA,EACT;AAAA,EAEQ,QAAQD,GAAkB9E,GAAqB;AACnD,UAAMgF,IAAU,CAACtF,MAA4B,KAAK,YAAYM,GAAON,CAAK,GACpEuF,IAAY,CAACvF,MAA+B,KAAK,cAAcM,GAAON,CAAK,GAC3EwF,IAAc,CAACxF,MAA4B,KAAK,gBAAgBM,GAAON,GAAOoF,CAAG,GACjFK,IAAe,CAACzF,MAA4B,KAAK,iBAAiBM,GAAON,CAAK;AACpF,IAAAoF,EAAI,iBAAiB,SAASE,CAAO,GACrCF,EAAI,iBAAiB,WAAWG,CAAS,GACzCH,EAAI,iBAAiB,aAAaI,CAAW,GAC7CJ,EAAI,iBAAiB,cAAcK,CAAY,GAC/C,KAAK,YAAY,KAAK,MAAM;AACxB,MAAAL,EAAI,oBAAoB,SAASE,CAAO,GACxCF,EAAI,oBAAoB,WAAWG,CAAS,GAC5CH,EAAI,oBAAoB,aAAaI,CAAW,GAChDJ,EAAI,oBAAoB,cAAcK,CAAY;AAAA,IACtD,CAAC;AAAA,EACL;AAAA,EAEQ,YAAYnF,GAAeN,GAAyB;;AAExD,QADAA,EAAM,eAAA,GACF,KAAK,mBAAmB;AACxB,WAAK,sBAAA;AACL;AAAA,IACJ;AACA,SAAK,cAAcM,GACnB,KAAK,YAAYA,GAAON,CAAK,IAC7BF,IAAA,KAAK,KAAKQ,CAAK,MAAf,QAAAR,EAAkB;AAAA,EACtB;AAAA,EAEQ,gBAAgBQ,GAAeN,GAAmBoF,GAAwB;AAC9E,QAAIpF,EAAM,WAAW,KAAK,CAAC,KAAK,wBAAyB;AACzD,SAAK,WAAW,EAAK,GACrB,KAAK,sBAAA,GACL,KAAK,iBAAiBM,GACtB,KAAK,kBAAkBN,GACvB,KAAK,YAAY;AACjB,UAAM0F,IAAgBN,EAAI,eACpBO,IAAY,MAAY,KAAK,WAAW,KAAK,SAAS;AAC5D,IAAAD,EAAc,iBAAiB,WAAWC,CAAS,GACnD,KAAK,cAAc,MAAMD,EAAc,oBAAoB,WAAWC,CAAS;AAAA,EACnF;AAAA,EAEQ,iBAAiBrF,GAAeN,GAAyB;;AAC7D,IAAI,KAAK,kBAAkB,SACvBM,MAAU,KAAK,kBAAkB,CAAC,KAAK,aACvCA,MAAU,KAAK,eAAe,KAAK,cACvCN,EAAM,eAAA,GACN,KAAK,YAAY,IACjB,KAAK,cAAcM,GACnB,KAAK,gBAAgB,KAAK,gBAAgBA,GAAO,KAAK,mBAAmBN,CAAK,IAC9EF,IAAA,KAAK,KAAKQ,CAAK,MAAf,QAAAR,EAAkB;AAAA,EACtB;AAAA,EAEQ,cAAcQ,GAAeN,GAA4B;;AAC7D,UAAM4F,IAAY,KAAK,KAAK,SAAS;AACrC,QAAIC;AACJ,QAAI7F,EAAM,QAAQ,YAAa,CAAA6F,IAAY,KAAK,IAAIvF,IAAQ,GAAGsF,CAAS;AAAA,aAC/D5F,EAAM,QAAQ,UAAW,CAAA6F,IAAY,KAAK,IAAIvF,IAAQ,GAAG,CAAC;AAAA,aAC1DN,EAAM,QAAQ,OAAQ,CAAA6F,IAAY;AAAA,aAClC7F,EAAM,QAAQ,MAAO,CAAA6F,IAAYD;AAAA,aACjC5F,EAAM,QAAQ,OAAOA,EAAM,QAAQ,SAAS;AACjD,MAAAA,EAAM,eAAA,GACN,KAAK,cAAcM,GACnB,KAAK,YAAYA,GAAON,CAAK;AAC7B;AAAA,IACJ,MAAO;AAEP,IAAAA,EAAM,eAAA,GACN,KAAK,cAAc6F,GACnB,KAAK,eAAeA,GAAW7F,CAAK,GACpC,KAAK,SAAA,IACLF,IAAA,KAAK,KAAK+F,CAAS,MAAnB,QAAA/F,EAAsB;AAAA,EAC1B;AAAA,EAEU,eAAeQ,GAAeN,GAA4B;AAChE,SAAK,YAAYM,GAAON,CAAK;AAAA,EACjC;AAAA,EAEU,wBAAiC;AACvC,WAAO;AAAA,EACX;AAAA,EAEU,gBACN8F,GACAC,GACAC,GACI;AAAA,EAAC;AAAA,EAEC,YAAYC,GAAgBD,GAA8B;AAAA,EAAC;AAAA,EAE3D,iBAAiBnC,GAAgBqC,IAAQ,qBAA2B;AAC1E,SAAK,qBAAqB,IAAIrC,GAAOqC,CAAK,GAC1C,KAAK,SAAA;AAAA,EACT;AAAA,EAEA,mBAA4B;AACxB,WAAO,KAAK,qBAAqB,IAAA,KAAS,CAAA;AAAA,EAC9C;AAAA,EAEA,0BAAiD;AAC7C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,yBAA+B;AACnC,UAAM9E,IAAW,KAAK,iBAAA;AACtB,QAAIA,EAAS,WAAW,EAAG;AAC3B,UAAM+E,IAAe,IAAI,IAAI/E,EAAS,IAAI,CAAC+B,GAAM7C,MAAU,KAAK,OAAO6C,GAAM7C,CAAK,CAAC,CAAC,GAC9EK,IAAU,KAAK,SAAA,EAAW,OAAO,CAACwC,GAAM7C,MAC1C6F,EAAa,IAAI,KAAK,OAAOhD,GAAM7C,CAAK,CAAC,CAAC;AAC9C,KAAIK,EAAQ,WAAWS,EAAS,UACzBT,EAAQ,KAAK,CAACwC,GAAM7C,MAAU,CAAC,OAAO,GAAG6C,GAAM/B,EAASd,CAAK,CAAC,CAAC,MAClE,KAAK,qBAAqB,IAAI,CAAC,GAAGK,CAAO,GAAG,gCAAgC;AAAA,EAEpF;AAAA,EAEQ,WAAiB;AACrB,UAAMwF,IAAe,IAAI,IAAI,KAAK,mBAAmB,IAAI,CAAChD,GAAM7C,MAC5D,KAAK,OAAO6C,GAAM7C,CAAK,CAAC,CAAC,GACvBuD,IAAQ,KAAK,SAAA;AACnB,SAAK,KAAK,QAAQ,CAACuB,GAAK9E,MAAU;AAC9B,YAAM6C,IAAOU,EAAMvD,CAAK,GAClBc,IAAW+B,MAAS,UACnBgD,EAAa,IAAI,KAAK,OAAOhD,GAAM7C,CAAK,CAAC;AAChD,MAAA8E,EAAI,UAAU,OAAO,YAAYhE,CAAQ,GACzCgE,EAAI,aAAa,iBAAiB,OAAOhE,CAAQ,CAAC,GAClDgE,EAAI,WAAW9E,MAAU,KAAK,cAAc,IAAI;AAAA,IACpD,CAAC;AAAA,EACL;AAAA,EAEQ,cAAoB;AACxB,eAAW8F,KAAW,KAAK,YAAY,OAAO,CAAC,EAAG,CAAAA,EAAA;AAClD,SAAK,OAAO,CAAA;AAAA,EAChB;AAAA,EAEQ,WAAWC,GAA8B;;AAM7C,KALAvG,IAAA,KAAK,gBAAL,QAAAA,EAAA,YACA,KAAK,cAAc,MACnB,KAAK,iBAAiB,MACtB,KAAK,kBAAkB,MACvB,KAAK,YAAY,IACZuG,MACL,KAAK,oBAAoB,IACrB,KAAK,sBAAsB,QAAM,aAAa,KAAK,kBAAkB,GACzE,KAAK,qBAAqB,WAAW,MAAM,KAAK,sBAAA,GAAyB,CAAC;AAAA,EAC9E;AAAA,EAEQ,wBAA8B;AAClC,SAAK,oBAAoB,IACrB,KAAK,sBAAsB,QAAM,aAAa,KAAK,kBAAkB,GACzE,KAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,UAAgB;;AACZ,IAAI,KAAK,cACT,KAAK,YAAY,IACjB,KAAK,WAAW,EAAK,GACrB,KAAK,sBAAA,GACL,KAAK,YAAA,IACLvG,IAAA,KAAK,8BAAL,QAAAA,EAAgC;AAAA,EACpC;AACJ;AAEO,MAAMwG,WAAgDxB,GAA4B;AAAA,EAKrF,YAAYyB,GAA6C;AACrD,UAAMC,IAAQD,EAAO,uBAAuB,OACtC,IAAIxH,EAAsB,MAAM;AAAA,MAC9B,OAAOwH,EAAO;AAAA,MACd,SAAS;AAAA,IAAA,CACZ,IACC,MACAE,IAAsBF,EAAO,uBAAuBC;AAC1D,UAAM;AAAA,MACF,UAAUD,EAAO;AAAA,MACjB,GAAIA,EAAO,UAAU,OAAO,CAAA,IAAK,EAAC,QAAQA,EAAO,OAAA;AAAA,MACjD,GAAIA,EAAO,UAAU,SAAY,CAAA,IAAK,EAAC,OAAOA,EAAO,MAAA;AAAA,MACrD,sBAAsB,IAAIG,GAAyBD,CAAmB;AAAA,IAAA,CACzE;AAjBI,IAAA/G,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AAgBb,SAAK,2BAA2B8G,GAChC,KAAK,sBAAsBC,GAC3B,KAAK,gBAAgBA;AAAA,EACzB;AAAA,EAEU,YAAYnG,GAAqB;AACvC,UAAM6C,IAAO,KAAK,SAAA,EAAW7C,CAAK;AAClC,IAAI6C,MAAS,WACb,KAAK,cAAc7C,GACnB,KAAK,iBAAiB,CAAC6C,CAAI,GAAG,0BAA0B;AAAA,EAC5D;AAAA,EAEA,kBAAgC;AAC5B,WAAO,KAAK,oBAAoB,IAAA;AAAA,EACpC;AAAA,EAES,UAAgB;;AACrB,UAAM,QAAA,IACNrD,IAAA,KAAK,6BAAL,QAAAA,EAA+B;AAAA,EACnC;AACJ;AAEO,MAAM6G,WAA+C7B,GAA4B;AAAA,EAC1E,YAAYxE,GAAeN,GAA6B;AAC9D,UAAM6D,IAAQ,KAAK,SAAA,GACbV,IAAOU,EAAMvD,CAAK;AACxB,QAAI6C,MAAS,QAEb;AAAA,UAAInD,EAAM,YAAY,KAAK,eAAe,MAAM;AAC5C,cAAM4G,IAAQ,KAAK,IAAI,KAAK,aAAatG,CAAK,GACxCuG,IAAO,KAAK,IAAI,KAAK,aAAavG,CAAK,GACvCwG,IAAQjD,EAAM,MAAM+C,GAAOC,IAAO,CAAC,GACnCjG,IAAOmG,GAAiB/G,CAAK,IAC7BgH,GAAW,KAAK,iBAAA,GAAoBF,GAAO,KAAK,MAAM,IACtD,CAAC,GAAGA,CAAK;AACf,aAAK,iBAAiBlG,GAAM,yBAAyB;AACrD;AAAA,MACJ;AAEA,UAAImG,GAAiB/G,CAAK,KAAM,SAASA,KAASA,EAAM,QAAQ,KAAM;AAClE,cAAMoB,IAAW,KAAK,iBAAA,GAChB6F,IAAM,KAAK,OAAO9D,GAAM7C,CAAK,GAG7BM,IAFSQ,EAAS,KAAK,CAAC8F,GAAWC,MACrC,OAAO,GAAG,KAAK,OAAOD,GAAWC,CAAc,GAAGF,CAAG,CAAC,IAEpD7F,EAAS,OAAO,CAAC8F,GAAWC,MAC1B,CAAC,OAAO,GAAG,KAAK,OAAOD,GAAWC,CAAc,GAAGF,CAAG,CAAC,IACzD,CAAC,GAAG7F,GAAU+B,CAAI;AACxB,aAAK,cAAc7C,GACnB,KAAK,iBAAiBM,GAAM,yBAAyB;AACrD;AAAA,MACJ;AAEA,WAAK,cAAcN,GACnB,KAAK,iBAAiB,CAAC6C,CAAI,GAAG,yBAAyB;AAAA;AAAA,EAC3D;AAAA,EAEU,eAAe7C,GAAeN,GAA4B;AAChE,IAAIA,EAAM,YAAU,KAAK,YAAYM,GAAON,CAAK;AAAA,EACrD;AAAA,EAEU,wBAAiC;AACvC,WAAO;AAAA,EACX;AAAA,EAEU,gBACNoH,GACAC,GACArH,GACI;AACJ,UAAM6D,IAAQ,KAAK,SAAA,GACb+C,IAAQ,KAAK,IAAIQ,GAAYC,CAAQ,GACrCR,IAAO,KAAK,IAAIO,GAAYC,CAAQ,GACpCP,IAAQjD,EAAM,MAAM+C,GAAOC,IAAO,CAAC,GACnCjG,IAAOmG,GAAiB/G,CAAK,IAC7BgH,GAAW,KAAK,iBAAA,GAAoBF,GAAO,KAAK,MAAM,IACtD,CAAC,GAAGA,CAAK;AACf,SAAK,cAAcM,GACnB,KAAK,iBAAiBxG,GAAM,wBAAwB;AAAA,EACxD;AACJ;AAQO,SAAS0G,GACZf,GAC2B;AAC3B,SAAOA,EAAO,cACR,IAAII,GAAsBJ,CAAM,IAChC,IAAID,GAAuBC,CAAM;AAC3C;AAEA,MAAMG,GAAiE;AAAA,EACnE,YAA6Ba,GAAoC;AAApC,SAAA,SAAAA;AAAA,EAAqC;AAAA,EAElE,MAAe;AACX,UAAMtJ,IAAQ,KAAK,OAAO,IAAA;AAC1B,WAAOA,KAAS,OAAO,CAAA,IAAK,CAACA,CAAK;AAAA,EACtC;AAAA,EAEA,WAAoB;AAChB,WAAO,KAAK,OAAO,SAAA;AAAA,EACvB;AAAA,EAEA,gBAAyE;AACrE,WAAO,KAAK,OAAO,cAAA;AAAA,EACvB;AAAA,EAEA,IAAIA,GAAgBuJ,GAAiC;AACjD,WAAO,KAAK,OAAO,IAAIvJ,EAAM,CAAC,KAAK,MAAMuJ,CAAY;AAAA,EACzD;AAAA,EAEA,UACIC,GACA3I,GACU;AACV,WAAO,KAAK,OAAO,UAAU,CAAC4I,MAAiBD,EAAS;AAAA,MACpD,GAAGC;AAAA,MACH,OAAOA,EAAa,SAAS,OAAO,CAAA,IAAK,CAACA,EAAa,KAAK;AAAA,IAAA,CAC/D,GAAG5I,CAAO;AAAA,EACf;AACJ;AAEO,SAASmG,GAAsB9B,GAAa7C,GAAwB;AACvE,MAAI6C,KAAQ,QAAQ,OAAOA,KAAS,UAAU;AAC1C,UAAMrC,IAAK,QAAQ,IAAIqC,GAAM,IAAI;AACjC,QAAIrC,KAAM,KAAM,QAAOA;AAAA,EAC3B;AACA,MAAI,OAAOqC,KAAS,YAAY,OAAOA,KAAS,SAAU,QAAOA;AACjE,QAAM,IAAI;AAAA,IACN,2BAA2B7C,CAAK;AAAA,EAAA;AAExC;AAEA,SAASyG,GAAiB/G,GAA4C;AAClE,SAAO,GAAQA,EAAM,WAAWA,EAAM;AAC1C;AAEA,SAASqF,GAAW/E,GAAeqH,GAAwB;AACvD,SAAIA,KAAU,IAAU,IACjB,KAAK,IAAI,KAAK,IAAIrH,GAAO,CAAC,GAAGqH,IAAS,CAAC;AAClD;AAEA,SAASX,GACLY,GACAC,GACA7C,GACO;AACP,QAAM8C,IAAS,CAAC,GAAGF,CAAI,GACjBG,IAAO,IAAI,IAAIH,EAAK,IAAI,CAACzE,GAAM7C,MAAU0E,EAAO7B,GAAM7C,CAAK,CAAC,CAAC;AACnE,aAAW6C,KAAQ0E,GAAO;AACtB,UAAMZ,IAAMjC,EAAO7B,GAAM2E,EAAO,MAAM;AACtC,IAAKC,EAAK,IAAId,CAAG,MACbc,EAAK,IAAId,CAAG,GACZa,EAAO,KAAK3E,CAAI;AAAA,EAExB;AACA,SAAO2E;AACX;AChZO,MAAME,UAAkClK,EAAgC;AAAA,EAW3E,YAAYW,IAA8B,IAAI;AAC1C,UAAMA,CAAK;AAXN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AAIb,IAAIuI,GAAoCxJ,EAAM,KAAK,KAC/C,KAAK,eAAeA,EAAM,OAC1B,KAAK,oBAAoB,SAEzB,KAAK,oBAAoB,IAAIM,EAA0BN,EAAM,SAAS,CAAA,GAAI;AAAA,MACtE,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,eAAe,KAAK,oBAE7B,KAAK,SAAS,KAAK,cACnB,KAAK,aAAayJ,GAAmBzJ,EAAM,OAAO,GAClD,KAAK,mBAAmBA,EAAM,gBAAgB,KACxC6I,GAAuB;AAAA,MACrB,OAAO;AAAA,MACP,aAAa;AAAA,MACb,GAAI7I,EAAM,wBAAwB,OAC5B,CAAA,IACA,EAAC,sBAAsBA,EAAM,qBAAA;AAAA,MACnC,UAAU,MAAM,KAAK,aAAa,IAAA;AAAA,MAClC,QAAQ,KAAK;AAAA,IAAA,CAChB,IACC6I,GAAuB;AAAA,MACrB,OAAO;AAAA,MACP,GAAI7I,EAAM,uBAAuB,OAC3B,CAAA,IACA,EAAC,qBAAqBA,EAAM,oBAAA;AAAA,MAClC,UAAU,MAAM,KAAK,aAAa,IAAA;AAAA,MAClC,QAAQ,KAAK;AAAA,IAAA,CAChB,GACL,KAAK,uBAAuB,KAAK,iBAAiB,sBAClD,KAAK,iBAAiB,KAAK,sBAC3B,KAAK,sBAAsB,KAAK,4BAA4B6H,KACtD,KAAK,iBAAiB,sBACtB,MACN,KAAK,gBAAgB,KAAK;AAAA,EAC9B;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,cAAc,KAAK,oBAAoB;AAAA,EAC3D;AAAA,EAEA,SAAoB;AAChB,UAAMnB,IAAO,KAAK,aAAa,IAAA;AAC/B,QAAI,CAAC,MAAM,QAAQA,CAAI,EAAG,OAAM,IAAI,UAAU,iCAAiC;AAC/E,UAAMgD,IAAS,KAAK,aAAa,cAAA,GAC3BC,IAAQ,KAAK,aAAa,SAAA,GAC1BC,IAAYF,MAAWG,EAAW,WAAWH,MAAWG,EAAW,SACnEnC,IAAe,IAAI,IAAI,KAAK,qBAAqB,MAClD,IAAI,CAAChD,GAAM7C,MAAU,KAAK,WAAW6C,GAAM7C,CAAK,CAAC,CAAC,GAEjDF,IAAO,KAAK;AAClB,WAAO,gBAAAiB;AAAA,MAACjB;AAAA,MAAA;AAAA,QACJ,WAAWnB,EAAW,qBAAqBE,EAAe,KAAK,KAAK,CAAC;AAAA,QAEpE,UAAA;AAAA,UAAAgJ,MAAWG,EAAW,QACjB,gBAAAjI,EAAC,KAAA,EAAE,MAAK,SACL,UAAAkI,GAAaH,GAAO,sBAAsB,EAAA,CAC/C,IACE;AAAA,UACLC,KAAalD,EAAK,WAAW,sBACvB,OAAA,EAAI,MAAK,UAAS,aAAU,WAC3B,UAAA;AAAA,YAAA,gBAAA9E,EAAC,UAAK,UAAA,iBAAA,CAAc;AAAA,YACnB,MAAM,KAAK,EAAC,QAAQ,KAAK,MAAM,oBAAoB,EAAA,GAAI,CAACmI,GAAGlI,MACxD,gBAAAD,EAAC,SAAiC,aAAU,mBACxC,UAAA,gBAAAA,EAACyC,GAAA,EAAY,OAAO,KAAKxC,IAAQ,EAAA,CAAG,EAAA,GAD9B,eAAeA,CAAK,EAE9B,CAAM;AAAA,UAAA,EAAA,CACd,IACE;AAAA,UACL6H,MAAWG,EAAW,SAASnD,EAAK,WAAW,IAC1C,gBAAA9E,EAAC,KAAA,EAAE,MAAK,UAAS,UAAA,WAAA,CAAQ,IACzB;AAAA,UACL8E,EAAK,SAAS,IACT,gBAAA9E;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAY,KAAK,MAAM,SAAS;AAAA,cAChC,aAAWgI,IAAY,SAAS;AAAA,cAChC,wBAAsB,KAAK,MAAM,cAAc,SAAS;AAAA,cAC1D,UAAAlD,EAAK,IAAI,CAAChC,GAAM7C,MAAU;AACxB,sBAAM2G,IAAM,KAAK,WAAW9D,GAAM7C,CAAK,GACjCc,IAAW+E,EAAa,IAAIc,CAAG,GAC/BwB,IAAU,KAAK,MAAM,aACrB,KAAK,MAAM,WAAWtF,GAAM7C,CAAK,IACjCoI,GAAiBvF,CAAI;AAC3B,uBAAO,gBAAA9C;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEJ,MAAK;AAAA,oBACL,4BAAyB;AAAA,oBACzB,cAAYC;AAAA,oBACZ,iBAAe,OAAOc,CAAQ;AAAA,oBAC9B,UAAUd,MAAU,IAAI,IAAI;AAAA,oBAC9B,UAAAmI;AAAA,kBAAA;AAAA,kBANO,OAAOxB,CAAG;AAAA,gBAAA;AAAA,cAOvB,CAAC;AAAA,YAAA;AAAA,UAAA,IACC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEd;AAAA,EAEA,YAAY0B,GAA6B;AACrC,UAAMxD,IAAOwD,aAAe,UACtBA,EAAI,iBAA8B,4BAA4B,IAC9D,CAAA;AACN,SAAK,iBAAiB,YAAYxD,CAAI;AAAA,EAC1C;AAAA,EAEA,mBAA4B;AACxB,WAAO,KAAK,iBAAiB,iBAAA;AAAA,EACjC;AAAA,EAEA,0BAAiD;AAC7C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,kBAAgC;;AAC5B,aAAOrF,IAAA,KAAK,wBAAL,gBAAAA,EAA0B,UAAS;AAAA,EAC9C;AAAA,EAEA,yBAA4D;AACxD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,YAAkB;;AACd,SAAK,iBAAiB,QAAA,IACtBA,IAAA,KAAK,sBAAL,QAAAA,EAAwB;AAAA,EAC5B;AAqCJ;AAnCIJ,EA1ISsI,GA0IF,gBAAe,CAAClF,CAAW,IAElCpD,EA5ISsI,GA4IO,YAAW,cAC3BtI,EA7ISsI,GA6IO,sBAAqB,cAErCtI,EA/ISsI,GA+IF,cAAa;AAAA,EAChB,CAAC,KAAK,WAAW;AAAA,EACjB,CAAC,0CAA0C,WAAW;AAAA,IAG1DtI,EApJSsI,GAoJF,OAAMnH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BjB,SAASqH,GACLU,GACoB;AACpB,MAAIA,KAAW,KAAM,QAAO3D;AAC5B,MAAI,OAAO2D,KAAY,WAAY,QAAOA;AAC1C,MAAI,OAAOA,KAAY,YAAYA,EAAQ,SAAS;AAChD,WAAO,CAACzF,GAAM7C,MAAU;AACpB,UAAI6C,KAAQ,QAAS,OAAOA,KAAS,YAAY,OAAOA,KAAS;AAC7D,cAAM,IAAI,UAAU,0BAA0B7C,CAAK,UAAUsI,CAAO,EAAE;AAE1E,YAAM3B,IAAM,QAAQ,IAAI9D,GAAMyF,CAAO;AACrC,UAAI3B,KAAO;AACP,cAAM,IAAI,UAAU,0BAA0B3G,CAAK,UAAUsI,CAAO,EAAE;AAE1E,aAAO3B;AAAA,IACX;AAEJ,QAAM,IAAI,UAAU,sDAAsD;AAC9E;AAEA,SAASgB,GAA0BhK,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAASyK,GAAiBvF,GAA0B;AAChD,MAAIA,KAAQ,SAAS,OAAOA,KAAS,YAAY,OAAOA,KAAS,aAAa;AAC1E,UAAMlD,IAAQ,QAAQ,IAAIkD,GAAM,OAAO;AACvC,QAAI0F,GAAsB5I,CAAK,EAAG,QAAOA;AAAA,EAC7C;AACA,SAAO,OAAOkD,CAAI;AACtB;AAEA,SAAS0F,GAAsB5K,GAA6D;AACxF,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,OAAOA,KAAU;AAC1E;AAEA,SAASsK,GAAaH,GAAgB1J,GAA0B;AAC5D,SAAI0J,aAAiB,QAAcA,EAAM,UAClCA,KAAS,OAAO1J,IAAW,OAAO0J,CAAK;AAClD;ACnOO,MAAMU,UACDhL,EAAiC;AAAA,EAWzC,YAAYW,IAA+B,IAAI;AAC3C,UAAMA,CAAK;AALN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIL,UAAMqJ,IAAgB,KAAK;AAG3B,SAAK,UAAUtK,EAAM,WACdsK,EAAc,SACrBC,GAAgB,KAAK,OAAO;AAC5B,UAAMtK,IAAWD,EAAM,wBAChBsK,EAAc,wBACd,KAAK,QAAQ,CAAC,EAAG,CAAC,GACnBlJ,IAAsC,EAAC,GAAGpB,EAAA;AAChD,IAAIoB,EAAa,gBAAgB,QAAQpB,EAAM,wBAAwB,SACnEoB,EAAa,eAAepB,EAAM,uBAEtC,KAAK,eAAeF;AAAA,MAA2B;AAAA,MAAMsB;AAAA,MAAcnB;AAAA,MAC/D;AAAA,IAAA,GAEJ,KAAK,uBAAuB,KAAK;AAAA,EACrC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,WAAW6D,IAAY,GAAGvC,IAAsB,MAAY;AACxD,QAAI,KAAK,MAAM,SAAU;AACzB,UAAMiJ,IAAe,KAAK,QAAQ,UAAU,CAAC,CAAA,EAAG7F,CAAK,MACjD,OAAO,GAAGA,GAAO,KAAK,aAAa,IAAA,CAAK,CAAC,GAEvCyC,MADYoD,IAAe,IAAI,IAAIA,KACV1G,IAAY,KAAK,QAAQ,UAAU,KAAK,QAAQ,QACzE2G,IAAY,KAAK,QAAQrD,CAAS,EAAG,CAAC;AAC5C,SAAK,aAAa,IAAIqD,GAAW,wBAAwB,GACzD9J,EAAO,KAAK,MAAM,UAAU8J,GAAWlJ,CAAK;AAAA,EAChD;AAAA,EAEA,SAAoB;AAChB,UAAM;AAAA,MACF,OAAAC,IAAQ,KAAK,MAAM,SAAS;AAAA,MAC5B,UAAAqB,IAAW;AAAA,MACX,UAAA6H,IAAW;AAAA,MACX,MAAAnK;AAAA,MACA,OAAAf;AAAA,IAAA,IACA,KAAK,OACHmL,IAAgB,KAAK,aAAa,IAAA,GAClCC,IAAgB,KAAK,QAAQ,UAAU,CAAC,CAAA,EAAGjG,CAAK,MAClD,OAAO,GAAGA,GAAOgG,CAAa,CAAC,GAC7B,CAACE,CAAM,IAAI,KAAK,QAAQD,CAAa,KAAK,CAAC,KAAKD,CAAa,GAC7DG,IAAY/J,GAAc4J,CAAa,GACvCI,IAAUJ,MAAkBrL,EAAW,UACtCqL,MAAkBrL,EAAW,WAC5B,KAAK,QAAQ,WAAW,KAAKsL,MAAkB,GAEjDjJ,IAAO,KAAK;AAClB,WAAO,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,iBAAemC,IAAW,KAAK;AAAA,QAC/B,iBAAe6H,IAAW,KAAK;AAAA,QAC/B,cAAYI;AAAA,QAEZ,UAAA,gBAAAlI;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,MAAK;AAAA,YACL,MAAK;AAAA,YACL,UAAAC;AAAA,YACA,MAAAtC;AAAA,YACA,OAAOf,KAAS,OAAO,SAAY,OAAOA,CAAK;AAAA,YAC/C,gBAAcuL,IAAU,SAAS;AAAA,YACjC,iBAAeL,IAAW,SAAS;AAAA,YACnC,cAAY,GAAGlJ,CAAK,KAAKsJ,CAAS;AAAA,YAClC,SAAS,CAACvJ,MAAsB,KAAK,WAAW,GAAGA,CAAK;AAAA,YACxD,WAAW,CAACA,MAAyB;AACjC,cAAIA,EAAM,QAAQ,gBAAgBA,EAAM,QAAQ,eAC5CA,EAAM,eAAA,GACN,KAAK,WAAW,GAAGA,CAAK,MACjBA,EAAM,QAAQ,eAAeA,EAAM,QAAQ,eAClDA,EAAM,eAAA,GACN,KAAK,WAAW,IAAIA,CAAK;AAAA,YAEjC;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAAK,EAAC,QAAA,EAAK,WAAU,cAAa,eAAY,QAAQ,UAAAiJ,GAAO;AAAA,cACxD,gBAAAjJ,EAAC,UAAM,UAAAJ,EAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACjB;AAAA,IAAA;AAAA,EAER;AA2BJ;AAzHIP,EAFSoJ,GAEF,WAAsD;AAAA,EACzD,CAAC,KAAK/K,EAAW,OAAO;AAAA,EACxB,CAAC,KAAKA,EAAW,MAAM;AAAA,IAE3B2B,EANSoJ,GAMF,wBAAuB/K,EAAW,UA4FzC2B,EAlGSoJ,GAkGO,YAAW,aAC3BpJ,EAnGSoJ,GAmGO,sBAAqB,cAErCpJ,EArGSoJ,GAqGF,cAAa;AAAA,EAChB,CAAC,KAAK,CAAC,WAAW,CAAC;AAAA,EACnB,CAAC,yBAAyB,CAAC,SAAS,WAAW,CAAC;AAAA,IAGpDpJ,EA1GSoJ,GA0GF,OAAMjI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBjB,SAASmI,GACLS,GACoD;AACpD,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,UAAM,IAAI,UAAU,kDAAkD;AAE1E,aAAWC,KAASD;AAChB,QAAI,CAAC,MAAM,QAAQC,CAAK,KAAKA,EAAM,SAAS;AACxC,YAAM,IAAI,UAAU,iDAAiD;AAGjF;AClIO,MAAMC,UAAoB7L,EAA4B;AAAA,EAMzD,YAAYW,IAA0B,IAAI;AACtC,UAAMA,CAAK;AANN,IAAAiB,EAAA;AACQ,IAAAA,EAAA,iDAA0B,IAAA;AACnC,IAAAA,EAAA,+CAAwB,IAAA;AACxB,IAAAA,EAAA,wBAAuD;AAI3D,SAAK,iBAAiBkK,GAA6BnL,EAAM,OAAO,IAAIA,EAAM,UAAU;AAAA,EACxF;AAAA,EAEA,aAAmB;AACf,IAAI,KAAK,kBAAgB,KAAK,MAAM,KAAK,cAAc;AAAA,EAC3D;AAAA,EAEA,SAAoB;;AAChB,UAAMS,MAASY,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,WAC5B,MAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,KAAK,MAAM,UAAU,CAAA;AACjE,QAAI,CAAC,MAAM,QAAQZ,CAAM;AACrB,YAAM,IAAI,UAAU,2DAA2D;AAEnF,UAAM2K,MAAaC,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,oBAAmBxB,EAAW,OAChEF,KAAQ2B,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,YAC7BC,IAAUC,GAAiB,KAAK,MAAM,OAAO,GAC7CC,IAAc,KAAK,MAAM,eAAepB,EAAS,SACjDqB,IAAuB,KAAK,MAAM,wBAAwBpM,EAAW,SACrEqM,IAAe,IAAI,IAAIlL,EAAO,IAAImL,EAAW,CAAC;AACpD,SAAK,oBAAoB,IAAI;AAAA,MACzB,CAAC,GAAG,KAAK,oBAAoB,MAAM,EAAE,OAAO,CAACpM,MAAU,CAACmM,EAAa,IAAInM,CAAK,CAAC;AAAA,IAAA;AAEnF,UAAMmC,IAAO,KAAK;AAElB,WAAIyJ,MAAevB,EAAW,QACnB,gBAAAjI;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,WAAWnB,EAAW,aAAaE,EAAe,KAAK,KAAK,CAAC;AAAA,QAC7D,MAAK;AAAA,QACL,cAAW;AAAA,QACb,UAAAoJ,GAAaH,GAAO,+BAA+B;AAAA,MAAA;AAAA,IAAA,KAEpDyB,MAAevB,EAAW,WAAWuB,MAAevB,EAAW,YAC7DpJ,EAAO,WAAW,IACd,gBAAAmB;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,WAAWnB,EAAW,aAAaE,EAAe,KAAK,KAAK,CAAC;AAAA,QAC7D,MAAK;AAAA,QACL,cAAW;AAAA,QACd,UAAA;AAAA,MAAA;AAAA,IAAA,IAGE,gBAAAkB;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,WAAWnB,EAAW,aAAaE,EAAe,KAAK,KAAK,CAAC;AAAA,QAC7D,MAAK;AAAA,QACL,cAAY,KAAK,MAAM,SAAS;AAAA,QAE/B,UAAAD,EAAO,WAAW,IACb,gBAAAmB,EAAC,QAAA,EAAK,+BAAiB,IACvBnB,EAAO,IAAI,CAACwE,MAAW;AACrB,gBAAMzF,IAAQoM,GAAY3G,CAAM,GAC1BzD,IAAQqK,GAAY5G,CAAM,GAC1BN,IAAQ4G,EAAQ,IAAI/L,CAAK,KAAKkM,GAC9BI,IAAe,KAAK,cAActM,GAAOmF,CAAK;AACpD,iBAAO,gBAAA/C;AAAA,YAACmK;AAAA,YAAA;AAAA,cAEJ,OAAAvK;AAAA,cACA,cAAAsK;AAAA,cACA,SAASL;AAAA,cACT,UAAU,CAACO,GAAWzK,MAAU;;AAC5B,gBAAAA,KAAA,QAAAA,EAAO;AACP,sBAAMY,IAAOqJ,GAAiB,KAAK,MAAM,OAAO;AAChD,gBAAIQ,MAAc1M,EAAW,UAAS6C,EAAK,OAAO3C,CAAK,IAClD2C,EAAK,IAAI3C,GAAOwM,CAAS,IAC9BX,KAAAhK,IAAA,KAAK,OAAM,aAAX,QAAAgK,EAAA,KAAAhK,GAAsBc,GAAMZ;AAAA,cAChC;AAAA,YAAA;AAAA,YAVKuE,GAAUtG,CAAK;AAAA,UAAA;AAAA,QAY5B,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,YAAY0K,GAA6B;;AACrC,eAAW1K,KAAS,KAAK;AACrB,OAAA6B,IAAA,KAAK,oBAAoB,IAAI7B,CAAK,MAAlC,QAAA6B,EAAqC,WACrC,KAAK,oBAAoB,OAAO7B,CAAK;AAEzC,SAAK,kBAAkB,MAAA,GACnB,KAAK,kBAAkB,QAAM,aAAa,KAAK,cAAc,GACjE,KAAK,iBAAiB,WAAW,MAAM;AACnC,WAAK,iBAAiB,MACtB,KAAK,oBAAoB0K,CAAG;AAAA,IAChC,GAAG,CAAC;AAAA,EACR;AAAA,EAEA,YAAkB;AACd,IAAI,KAAK,kBAAkB,QAAM,aAAa,KAAK,cAAc,GACjE,KAAK,iBAAiB;AACtB,eAAW+B,KAAW,KAAK,oBAAoB,OAAA,KAAkB,QAAA;AACjE,SAAK,oBAAoB,MAAA;AAAA,EAC7B;AAAA,EAEQ,cACJzM,GACAmF,GACwB;AACxB,UAAMuH,IAAW,KAAK,oBAAoB,IAAI1M,CAAK;AACnD,QAAI0M,KAAY;AACZ,aAAIA,EAAS,UAAUvH,KAAOuH,EAAS,IAAIvH,GAAO,4BAA4B,GACvEuH;AAEX,UAAMD,IAAU,IAAI3L,EAAQqE,GAAO,EAAC,OAAO,MAAM,SAAS,iBAAiB,OAAOnF,CAAK,CAAC,IAAG;AAC3F,gBAAK,oBAAoB,IAAIA,GAAOyM,CAAO,GACpCA;AAAA,EACX;AAAA,EAEQ,oBAAoB/B,GAA6B;AACrD,QAAI,EAAEA,aAAe,gBAAgBA,EAAI,iBAAiB,KAAM;AAChE,UAAMiC,IAAWjC,EAAI,cAAc;AACnC,QAAIiC,KAAY,QAAQA,EAAS,eAAe,EAAG;AACnD,UAAMC,IAASlC,EAAI,cAAc,sBAAA;AACjC,IAAAA,EAAI,MAAM,eAAe,YAAY;AACrC,UAAMmC,IAAQnC,EAAI,sBAAA,GACZoC,IAAaF,EAAO,KACpBG,IAAa,KAAK,IAAI,GAAGJ,EAAS,cAAcC,EAAO,MAAM,GAC7DI,IAAaH,EAAM,SAASE,KAAcD,IAAaC;AAC7D,IAAIC,KACAtC,EAAI,QAAQ,YAAY,SACxBA,EAAI,MAAM,kBAAkB,GAAG,KAAK,IAAI,GAAGkC,EAAO,MAAMC,EAAM,MAAM,CAAC,SAErE,OAAOnC,EAAI,QAAQ,WACnBA,EAAI,MAAM,kBAAkB,GAAGkC,EAAO,MAAM,OAEhDlC,EAAI,MAAM,iBAAiB,GAAG,KAAK,IAAI,GAAGiC,EAAS,aAAaC,EAAO,KAAK,CAAC;AAC7E,UAAMK,IAAYD,IAAaF,IAAaC;AAC5C,IAAArC,EAAI,MAAM,YAAY,GAAG,KAAK,IAAI,IAAIuC,IAAY,CAAC,CAAC;AAAA,EACxD;AAsBJ;AApBIxL,EArISiK,GAqIF,gBAAe,CAACb,CAAQ,IAE/BpJ,EAvISiK,GAuIO,YAAW,iBAC3BjK,EAxISiK,GAwIO,sBAAqB,iBAErCjK,EA1ISiK,GA0IF,OAAM9I;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBjB,MAAM2J,KAAqB1B;AAI3B,SAASmB,GACLD,GACiC;AACjC,MAAIA,KAAW,KAAM,QAAO,oBAAI,IAAA;AAChC,MAAIA,aAAmB,IAAK,QAAO,IAAI,IAAIA,CAAO;AAClD,MAAI,MAAM,QAAQA,CAAO,EAAG,QAAO,IAAI,IAAIA,CAAO;AAClD,QAAM,IAAI,UAAU,kDAAkD;AAC1E;AAEA,SAASK,GAAY3G,GAAwC;AACzD,MAAI,OAAOA,KAAW,YAAY,OAAOA,KAAW,SAAU,QAAOA;AACrE,MAAIA,KAAU,QAAQ,OAAOA,KAAW,UAAU;AAC9C,UAAMzF,IAAQ,QAAQ,IAAIyF,GAAQ,OAAO;AACzC,QAAI,OAAOzF,KAAU,YAAY,OAAOA,KAAU,SAAU,QAAOA;AAAA,EACvE;AACA,QAAM,IAAI,UAAU,iEAAiE;AACzF;AAEA,SAASqM,GAAY5G,GAAsC;AACvD,MAAIA,KAAU,QAAQ,OAAOA,KAAW,UAAU;AAC9C,UAAMzD,IAAQ,QAAQ,IAAIyD,GAAQ,OAAO;AACzC,QAAIzD,KAAS,KAAM,QAAOkL,GAAYlL,CAAK,IAAIA,IAAQ,OAAOA,CAAK;AAAA,EACvE;AACA,SAAO,OAAOoK,GAAY3G,CAAM,CAAC;AACrC;AAEA,SAASa,GAAUtG,GAA4B;AAC3C,SAAO,GAAG,OAAOA,CAAK,IAAI,OAAOA,CAAK,CAAC;AAC3C;AAEA,SAASkN,GAAYlN,GAA0C;AAC3D,SAAO,OAAOA,KAAU,YAAY,OAAOA,KAAU;AACzD;AAEA,SAAS2L,GAAsB3L,GAA2D;AACtF,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAASsK,GAAaH,GAAgB1J,GAA0B;AAC5D,SAAI0J,aAAiB,QAAcA,EAAM,UAClCA,KAAS,OAAO1J,IAAW,OAAO0J,CAAK;AAClD;AC9MO,MAAMgD,UAAwBtN,EAAgC;AAAA,EAA9D;AAAA;AACK,IAAA4B,EAAA,uBAAgB;AA+FP,IAAAA,EAAA,uBAAgB,CAACM,MAA4B;AAC1D,MAAI,KAAK,iBACF,KAAK,eAAe,QACpBA,EAAM,kBAAkB,QACxB,CAAC,KAAK,IAAI,SAASA,EAAM,MAAM,MAClC,KAAK,gBAAgB,IACrB,KAAK,OAAA;AAAA,IAEb;AAAA;AAAA,EArGA,aAAmB;AACf,SAAK,MAAM,KAAK,MAAM,aAAa,KAAK,MAAM,cAAc,GACxD,KAAK,MAAM,iBAAiB,QAC5B,KAAK,OAAmB,UAAU,SAAS,KAAK,aAAa;AAAA,EAErE;AAAA,EAEA,aAAmB;AACf,QAAI,CAAC,KAAK,MAAM,SAAU;AAC1B,UAAMW,IAAU,KAAK,MAAM,YAAY,IAAA;AACvC,QAAIC;AACJ,KAAID,KAAA,gBAAAA,EAAS,WAAU,KAAK,MAAM,QAC9BC,IAAO,EAAC,OAAO,KAAK,MAAM,OAAO,WAAW,MAAA,IACrCD,EAAQ,cAAc,QAC7BC,IAAO,EAAC,OAAO,KAAK,MAAM,OAAO,WAAW,OAAA,IACzCA,IAAO,MACd,KAAK,MAAM,YAAY,IAAIA,GAAM,oBAAoB;AAAA,EACzD;AAAA,EAEA,kBAAkBZ,GAAyB;AACvC,IAAAA,EAAM,gBAAA,GACN,KAAK,gBAAgB,CAAC,KAAK,eAC3B,KAAK,OAAA;AAAA,EACT;AAAA,EAEA,cAAcY,GAAuBZ,GAA2B;;AAC5D,UAAMgK,IAAwB,EAAC,GAAG,KAAK,MAAM,eAAe,MAAI;AAChE,IAAIpJ,EAAK,SAAS,WAAUoJ,EAAQ,KAAK,MAAM,KAAK,IAC/CA,EAAQ,KAAK,MAAM,KAAK,IAAI,CAAC,GAAGpJ,EAAK,SAAS,GACnD,KAAK,MAAM,eAAe,IAAIoJ,GAAS,uBAAuB,IAC9DF,KAAAhK,IAAA,KAAK,OAAM,mBAAX,QAAAgK,EAAA,KAAAhK,GAA4BkK,GAAShK;AAAA,EACzC;AAAA,EAEA,SAAoB;AAChB,UAAMqL,IAAc,KAAK,MAAM,YAAY,IAAA,GACrC9I,KAAY8I,KAAA,gBAAAA,EAAa,WAAU,KAAK,MAAM,QAC9CA,EAAY,YACZ,MACArB,IAAU,IAAI;AAAA,OACf,KAAK,MAAM,eAAe,IAAA,EAAM,KAAK,MAAM,KAAK,KAAK,CAAA,GACjD,OAAOsB,EAAsB;AAAA,IAAA,GAEhCrL,IAAQ,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,KAAK,GACnDsL,IAAc,UAAU,OAAOtL,CAAK,CAAC;AAE3C,QAAI6K,IAAmB;AACvB,WAAI,KAAK,iBAAiB,KAAK,MAAM,iBAAiB,SAClDA,IAAQ,gBAAAzK;AAAA,MAACsJ;AAAA,MAAA;AAAA,QAEL,OAAO4B;AAAA,QACP,SAAS,KAAK,MAAM;AAAA,QACpB,SAAAvB;AAAA,QACA,UAAU,CAACpJ,GAAMZ,MAAU,KAAK,cAAcY,GAAMZ,CAAK;AAAA,QACxD,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,QAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,CAAA,IACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,MAAoB;AAAA,MAVxD;AAAA,IAAA,IAcL,gBAAAqB;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,OAAM;AAAA,QACN,uBAAoB;AAAA,QACpB,aAAWkB,MAAc,QACnB,cACAA,MAAc,SAAS,eAAe;AAAA,QAC5C,OAAO,EAAC,QAAQ,KAAK,gBAAgB,OAAO,KAAA;AAAA,QAE3C,UAAA;AAAA,UAAA,KAAK,MAAM,WACN,gBAAAlB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAU;AAAA,cACV,SAAS,MAAM,KAAK,WAAA;AAAA,cAEnB,UAAA;AAAA,gBAAApB;AAAA,gBACAsC,MAAc,QAAQ,OAAOA,MAAc,SAAS,OAAO;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAE9D,gBAAAlC,EAAC,QAAA,EAAM,UAAAJ,EAAA,CAAM;AAAA,UAClB,KAAK,MAAM,iBAAiB,OACvB,OACA,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,aAAU;AAAA,cACV,cAAYkL;AAAA,cACZ,iBAAe,OAAO,KAAK,aAAa;AAAA,cACxC,SAAS,CAACvL,MAAsB,KAAK,kBAAkBA,CAAK;AAAA,cAC/D,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UACJ8K;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAET;AAqCJ;AAzBIpL,EA1GS0L,GA0GF,gBAAe,CAACzB,CAAW,IAElCjK,EA5GS0L,GA4GF,cAAa;AAAA,EAChB,CAAC,iBAAiB,UAAU;AAAA,EAC5B,CAAC,sCAAsC,CAAC,UAAU,QAAQ,CAAC;AAAA,EAC3D,CAAC,+CAA+C,CAAC,UAAU,QAAQ,CAAC;AAAA,IAGxE1L,EAlHS0L,GAkHF,OAAMvK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBjB,SAASyK,GACLE,GACgD;AAChD,SAAO,OAAOA,EAAM,CAAC,KAAM,YAAY,OAAOA,EAAM,CAAC,KAAM;AAC/D;ACvJO,MAAMC,WACD3N,EAAkC;AAAA,EAC1C,SAAoB;AAChB,WAAO,gBAAAuC,EAAC,SAAA,EAAM,uBAAoB,gBAC9B,UAAA,gBAAAA,EAAC,MAAA,EACI,UAAA,KAAK,MAAM,QAAQ,IAAI,CAACqL,MAAW,gBAAArL;AAAA,MAAC+K;AAAA,MAAA;AAAA,QAEjC,OAAOM,EAAO;AAAA,QACd,aAAa,KAAK,MAAM;AAAA,QACxB,gBAAgB,KAAK,MAAM;AAAA,QAC1B,GAAIA,EAAO,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAO,MAAA;AAAA,QAC/C,GAAIA,EAAO,YAAY,OAAO,CAAA,IAAK,EAAC,UAAUA,EAAO,SAAA;AAAA,QACrD,GAAIA,EAAO,iBAAiB,OACvB,CAAA,IACA,EAAC,eAAeA,EAAO,cAAA;AAAA,QAC5B,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,QAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,KACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,QACvC,GAAI,KAAK,MAAM,kBAAkB,OAC5B,CAAA,IACA,EAAC,gBAAgB,KAAK,MAAM,eAAA;AAAA,MAAc;AAAA,MAjB3C,OAAOA,EAAO,KAAK;AAAA,IAAA,CAkB1B,GACN,EAAA,CACJ;AAAA,EACJ;AAGJ;AADIhM,EA7BS+L,IA6BF,gBAAe,CAACL,CAAe;AC5BnC,MAAMO,KAAwE;AAAA,EACjF,CAAC5N,EAAW,OAAO,GAAG;AAAA,EACtB,CAACA,EAAW,MAAM,GAAG;AAAA,EACrB,CAACA,EAAW,OAAO,GAAG;AAAA,EACtB,CAACA,EAAW,IAAI,GAAG;AACvB;AAWO,SAAS6N,GACZC,GACA,EAAC,MAAAC,IAAO,MAAM,SAAA9B,IAAU,CAAA,EAAC,IAAsB,IAC3C;AACJ,EAAA+B,GAAcF,CAAG,GACbC,KAAQ,SACRE,GAAWF,CAAI,GACfD,EAAI,aAAa,IAAI,QAAQ,GAAGC,EAAK,KAAK,IAAIA,EAAK,SAAS,EAAE;AAElE,aAAW,CAACG,GAAOC,CAAO,KAAK,OAAO,QAAQlC,CAAO;AACjD,eAAW,CAAC/L,GAAOC,CAAI,KAAKgO,GAAS;AACjC,UAAI,CAAClO,GAAaE,CAAI;AAClB,cAAM,IAAI,UAAU,2BAA2B+N,CAAK,KAAK,OAAO/N,CAAI,CAAC,EAAE;AAE3E,MAAA2N,EAAI,aAAa;AAAA,QACb;AAAA,QACA,GAAGI,CAAK,IAAIN,GAA2BzN,CAAI,CAAC,IAAI,KAAK,UAAUD,CAAK,CAAC;AAAA,MAAA;AAAA,IAE7E;AAEJ,SAAO4N;AACX;AAEO,SAASM,GACZhH,GACA2G,GACA9B,GACM;AACN,MAAI,CAAC,MAAM,QAAQ7E,CAAI,EAAG,OAAM,IAAI,UAAU,mCAAmC;AACjF,QAAMiH,IAAWjH,EAAK,OAAO,CAACC,MAAQiH,GAAejH,GAAK4E,CAAO,CAAC;AAClE,MAAI8B,KAAQ,KAAM,QAAOM;AACzB,EAAAJ,GAAWF,CAAI;AACf,QAAMvJ,IAAYuJ,EAAK,cAAc,QAAQ,IAAI;AACjD,SAAO,CAAC,GAAGM,CAAQ,EAAE,KAAK,CAACxE,GAAMC,MAC7ByE,GAAcC,GAAU3E,GAAMkE,EAAK,KAAK,GAAGS,GAAU1E,GAAOiE,EAAK,KAAK,CAAC,IAAIvJ,CAAS;AAC5F;AAEA,SAAS8J,GAAqBjH,GAAW4E,GAAgC;AACrE,aAAW,CAACiC,GAAOC,CAAO,KAAK,OAAO,QAAQlC,CAAO,GAAG;AACpD,UAAM/L,IAAQsO,GAAUnH,GAAK6G,CAAK;AAElC,QADeC,EAAQ,OAAO,CAAC,CAAA,EAAGhO,CAAI,MAAMA,MAASH,EAAW,IAAI,EACzD,KAAK,CAAC,CAACmJ,CAAS,MAAM,OAAO,GAAGA,GAAWjJ,CAAK,CAAC,EAAG,QAAO;AAEtE,UAAMkL,IAAW+C,EAAQ,OAAO,CAAC,CAAA,EAAGhO,CAAI,MAAMA,MAASH,EAAW,OAAO;AACzE,QAAIoL,EAAS,SAAS,KACf,CAACA,EAAS,KAAK,CAAC,CAACjC,CAAS,MAAM,OAAO,GAAGA,GAAWjJ,CAAK,CAAC,EAAG,QAAO;AAE5E,UAAM0F,IAAYuI,EAAQ,OAAO,CAAC,CAAA,EAAGhO,CAAI,MAAMA,MAASH,EAAW,MAAM;AACzE,QAAI4F,EAAU,SAAS,KAChB,CAACA,EAAU,KAAK,CAAC,CAACuD,CAAS,MAAM,OAAO,GAAGA,GAAWjJ,CAAK,CAAC,EAAG,QAAO;AAAA,EACjF;AACA,SAAO;AACX;AAEO,SAAS+N,GAAWF,GAA0C;AACjE,MAAIA,KAAQ,QACL,OAAOA,KAAS,YAChB,OAAO,QAAQ,IAAIA,GAAM,OAAO,KAAM,YACtC,CAACU,GAAgB,QAAQ,IAAIV,GAAM,WAAW,CAAC;AAClD,UAAM,IAAI,UAAU,wDAAwD;AAEpF;AAEA,SAASU,GAAgBvO,GAAiD;AACtE,SAAOA,MAAU,SAASA,MAAU;AACxC;AAEA,SAASqO,GAAc1E,GAAeC,GAAwB;AAC1D,SAAI,OAAO,GAAGD,GAAMC,CAAK,IAAU,IAC/BD,KAAQ,OAAa,KACrBC,KAAS,OAAa,IACtB,OAAOD,KAAS,YAAY,OAAOC,KAAU,WAAiBD,IAAOC,IAClE,OAAOD,CAAI,EAAE,cAAc,OAAOC,CAAK,CAAC;AACnD;AAEA,SAAS0E,GAAUtO,GAAgBgO,GAAwB;AACvD,MAAI,EAAAhO,KAAS,QAAS,OAAOA,KAAU,YAAY,OAAOA,KAAU;AAGpE,WAAO,QAAQ,IAAIA,GAAOgO,CAAK;AACnC;AAEA,SAASF,GAAc9N,GAA0C;AAC7D,MAAIA,KAAS,QACL,OAAOA,KAAU,YAAY,OAAOA,KAAU,cAC/C,OAAO,QAAQ,IAAIA,GAAO,UAAU,KAAM;AAC7C,UAAM,IAAI,UAAU,iCAAiC;AAEzD,QAAMwO,IAAe,QAAQ,IAAIxO,GAAO,cAAc;AACtD,MAAIwO,KAAgB,QACb,OAAO,QAAQ,IAAIA,GAAc,KAAK,KAAM,cAC5C,OAAO,QAAQ,IAAIA,GAAc,QAAQ,KAAM;AAClD,UAAM,IAAI,UAAU,iDAAiD;AAE7E;AC9DO,SAASC,GACZ5N,GACqB;AACrB,QAAMsE,IAAQuJ,GAAY7N,CAAO,GAC3B8N,IAAY3E,GAAmCnJ,EAAQ,IAAI,IAC3D,OACA,IAAIC,EAAyBD,EAAQ,MAAM;AAAA,IACzC,OAAOA,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,GACC+N,IAAOD,KAAa9N,EAAQ,MAC5BgO,IAAQ,IAAI9I;AAAA,IACd,CAAC6I,GAAMzJ,EAAM,aAAaA,EAAM,cAAc;AAAA,IAC9C,CAAC,CAAC+B,GAAM2G,GAAM9B,CAAO,MAAMmC,GAAqBhH,GAAM2G,GAAM9B,CAAO;AAAA,IACnE,EAAC,OAAOlL,EAAQ,OAAO,SAAS,mBAAA;AAAA,EAAkB;AAEtD,SAAO,IAAIiO,GAAuBD,GAAO1J,GAAO,MAAM;AAClD,IAAA0J,EAAM,QAAA,GACNF,KAAA,QAAAA,EAAW;AAAA,EACf,CAAC;AACL;AAGO,SAASI,GACZlO,GACqB;AACrB,EAAAmO,GAAuBnO,EAAQ,KAAK;AACpC,QAAMsE,IAAQuJ,GAAY7N,CAAO;AACjC,SAAO,IAAIiO,GAAuBjO,EAAQ,OAAOsE,CAAK;AAC1D;AAGO,SAAS8J,GACZpO,GACqB;AACrB,MAAIA,EAAQ,WAAW,QAAQ,OAAOA,EAAQ,QAAQ,SAAU;AAC5D,UAAM,IAAI,UAAU,gDAAgD;AAExE,QAAMsE,IAAQuJ,GAAY7N,CAAO,GAC3BgN,IAAO,IAAIqB,GAA2B,QAAQ/J,EAAM,aAAa;AAAA,IACnE,OAAOtE,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,GACKkL,IAAU,IAAImD,GAAuB,WAAW/J,EAAM,gBAAgB;AAAA,IACxE,OAAOtE,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,GACKgO,IAAQ,IAAIM,GAAyE;AAAA,IACvF,SAAStO,EAAQ;AAAA,IACjB,MAAM,EAAC,MAAAgN,GAAM,SAAA9B,EAAA;AAAA,IACb,OAAOlL,EAAQ;AAAA,IACf,SAAS;AAAA,IACT,mBAAmB;AAAA,EAAA,CACtB;AACD,SAAO,IAAIiO,GAAuBD,GAAO1J,GAAO,MAAM;AAClD,IAAA0J,EAAM,QAAA,GACNhB,EAAK,QAAA,GACL9B,EAAQ,QAAA;AAAA,EACZ,CAAC;AACL;AAGO,SAASqD,GACZvO,GACqB;AACrB,MAAI,OAAOA,EAAQ,OAAQ,YAAYA,EAAQ,IAAI,WAAW;AAC1D,UAAM,IAAI,UAAU,uCAAuC;AAE/D,QAAMwO,IAKF;AAAA,IACA,KAAKxO,EAAQ;AAAA,IACb,WAAWA,EAAQ,kBAAkB8M;AAAA,EAAA;AAEzC,SAAI9M,EAAQ,WAAW,SAAMwO,EAAe,UAAUxO,EAAQ,UAC1DA,EAAQ,SAAS,SAAMwO,EAAe,QAAQxO,EAAQ,QACnDoO,GAA6B;AAAA,IAChC,SAAS,IAAIK,GAAuDD,CAAc;AAAA,IAClF,GAAIxO,EAAQ,eAAe,OAAO,CAAA,IAAK,EAAC,aAAaA,EAAQ,YAAA;AAAA,IAC7D,GAAIA,EAAQ,kBAAkB,OAAO,CAAA,IAAK,EAAC,gBAAgBA,EAAQ,eAAA;AAAA,IACnE,GAAIA,EAAQ,UAAU,SAAY,CAAA,IAAK,EAAC,OAAOA,EAAQ,MAAA;AAAA,EAAK,CAC/D;AACL;AASA,MAAMiO,GAA+E;AAAA,EAMjF,YACaD,GACQ1J,GACAoK,IAAoC,MACvD;AATO,IAAA9N,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACD,IAAAA,EAAA,kBAAW;AAGN,SAAA,QAAAoN,GACQ,KAAA,QAAA1J,GACA,KAAA,eAAAoK,GAEjB,KAAK,cAAcpK,EAAM,aACzB,KAAK,iBAAiBA,EAAM,gBACxB0J,EAAM,SAAS,SAAM,KAAK,QAAQ,CAAC5G,MAAA;;AAAoB,cAAApG,IAAAgN,EAAM,UAAN,gBAAAhN,EAAA,KAAAgN,GAAc5G;AAAA;AAAA,EAC7E;AAAA,EAEA,UAAgB;;AACZ,IAAI,KAAK,aACT,KAAK,WAAW,KAChBpG,IAAA,KAAK,iBAAL,QAAAA,EAAA,aACAgK,IAAA,KAAK,MAAM,qBAAX,QAAAA,EAA6B,YAC7BC,IAAA,KAAK,MAAM,wBAAX,QAAAA,EAAgC;AAAA,EACpC;AACJ;AAEA,SAAS4C,GAAY7N,GAA0C;AAC3D,QAAM2O,IAAmB3O,EAAQ,eAAe,OAC1C,IAAIC,EAA0B,MAAM;AAAA,IAClC,OAAOD,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,IACC,MACA4O,IAAsB5O,EAAQ,kBAAkB,OAChD,IAAIC,EAAsB,IAAI;AAAA,IAC5B,OAAOD,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,IACC;AACN,SAAO;AAAA,IACH,aAAaA,EAAQ,eAAe2O;AAAA,IACpC,gBAAgB3O,EAAQ,kBAAkB4O;AAAA,IAC1C,kBAAAD;AAAA,IACA,qBAAAC;AAAA,EAAA;AAER;AAEA,SAASzF,GAA0BhK,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM,cAC3C,OAAO,QAAQ,IAAIA,GAAO,eAAe,KAAM,cAC/C,OAAO,QAAQ,IAAIA,GAAO,UAAU,KAAM;AACrD;AAEA,SAASgP,GACLhP,GACsC;AACtC,MAAI,CAACgK,GAA+ChK,CAAK;AACrD,UAAM,IAAI,UAAU,gCAAgC;AAE5D;ACrJO,MAAM0P,UACD7P,EAAgC;AAAA,EAexC,YAAYW,GAA6B;;AACrC,UAAMA,CAAK;AAfN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA,eAAsC;AAC9B,IAAAA,EAAA,oBAA2C;AAClC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA,yBAAgD;AAIpD,IAAAkO,GAAqBnP,CAAK,GAC1B,KAAK,UAAUoP,GAAiBpP,EAAM,OAAO,GAC7C,KAAK,SAASqP,GAAgBrP,EAAM,MAAM,GAC1C,KAAK,qBAAqBA,EAAM,cAAc,MAC9C,KAAK,mBAAmB,KAAK,sBAAsB,OAC7C,IAAIM,EAA0B,MAAM,EAAC,OAAO,MAAM,SAAS,aAAA,CAAa,IACxE,MACN,KAAK,sBAAsB,KAAK,sBAAsB,OAChD,IAAIA,EAAsB,IAAI,EAAC,OAAO,MAAM,SAAS,gBAAA,CAAgB,IACrE,MACN,KAAK,gBAAce,IAAA,KAAK,uBAAL,gBAAAA,EAAyB,gBAAe,KAAK,kBAChE,KAAK,mBAAiBgK,IAAA,KAAK,uBAAL,gBAAAA,EAAyB,mBAAkB,KAAK,qBACtE,KAAK,mBAAmBrL,EAAM,gBAAgB,KACxC6I,GAAuB;AAAA,MACrB,OAAO;AAAA,MACP,aAAa;AAAA,MACb,GAAI7I,EAAM,wBAAwB,OAC5B,CAAA,IACA,EAAC,sBAAsBA,EAAM,qBAAA;AAAA,MACnC,UAAU,MAAA;;AAAM,iBAAAqB,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAS,CAAA;AAAA;AAAA,MACrC,QAAQ,KAAK;AAAA,IAAA,CAChB,IACCwH,GAAuB;AAAA,MACrB,OAAO;AAAA,MACP,GAAI7I,EAAM,uBAAuB,OAC3B,CAAA,IACA,EAAC,qBAAqBA,EAAM,oBAAA;AAAA,MAClC,UAAU,MAAA;;AAAM,iBAAAqB,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAS,CAAA;AAAA;AAAA,MACrC,QAAQ,KAAK;AAAA,IAAA,CAChB,GACL,KAAK,uBAAuB,KAAK,iBAAiB,sBAClD,KAAK,sBAAsB,KAAK,4BAA4BwG,KACtD,KAAK,iBAAiB,sBACtB;AAAA,EACV;AAAA,EAEA,aAAmB;AACf,IAAI,KAAK,sBAAsB,OAC3B,KAAK,aAAa,KAAK,qBAChB,KAAK,MAAM,QAAQ,QAC1B,KAAK,kBAAkB+G,GAA0B;AAAA,MAC7C,GAAG,KAAK,MAAM;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,gBAAgB,KAAK;AAAA,MACrB,OAAO;AAAA,IAAA,CACV,GACD,KAAK,aAAa,KAAK,oBAEvB,KAAK,kBAAkBX,GAA2B;AAAA,MAC9C,MAAM,KAAK,MAAM,QAAQ,CAAA;AAAA,MACzB,aAAa,KAAK;AAAA,MAClB,gBAAgB,KAAK;AAAA,MACrB,OAAO;AAAA,IAAA,CACV,GACD,KAAK,aAAa,KAAK,kBAE3B,KAAK,QAAQ,KAAK,WAAW,OAC7B,KAAK,MAAM,KAAK,OAAO,KAAK,oBAAoB;AAAA,EACpD;AAAA,EAEA,SAAoB;;AAChB,UAAMvH,MAAOrF,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAS,CAAA;AAClC,QAAI,CAAC,MAAM,QAAQqF,CAAI,EAAG,OAAM,IAAI,UAAU,wCAAwC;AACtF,UAAMgD,MAAS2B,IAAA,KAAK,UAAL,gBAAAA,EAAY,oBAAmBxB,EAAW,SACnDF,KAAQ2B,IAAA,KAAK,UAAL,gBAAAA,EAAY,YACpB1B,IAAYF,MAAWG,EAAW,WAAWH,MAAWG,EAAW,SACnEnC,IAAe,IAAI;AAAA,MACrB,KAAK,qBAAqB,IAAA,EAAM,IAAI,CAAChD,GAAM7C,MAAU,KAAK,OAAO6C,GAAM7C,CAAK,CAAC;AAAA,IAAA,GAE3EF,IAAO,KAAK;AAClB,WAAO,gBAAAiB;AAAA,MAACjB;AAAA,MAAA;AAAA,QACJ,WAAWnB,EAAW,qBAAqBE,EAAe,KAAK,KAAK,CAAC;AAAA,QACrE,gBAAckJ,IAAY,KAAK;AAAA,QAC/B,cAAYF,MAAWG,EAAW,QAAQ,KAAK;AAAA,QAE9C,UAAA;AAAA,UAAAD,IAAY,gBAAAhI,EAAC,KAAA,EAAE,MAAK,UAAS,2BAAa,IAAO;AAAA,UACjD8H,MAAWG,EAAW,QAAQ,gBAAAjH,EAAC,OAAA,EAAI,MAAK,SACrC,UAAA;AAAA,YAAA,gBAAAhB,EAAC,QAAA,EAAM,UAAAkI,GAAaH,GAAO,qBAAqB,GAAE;AAAA,YACjD,SAAO2F,IAAA,KAAK,eAAL,gBAAAA,EAAiB,UAAU,aAC7B,gBAAA1N;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAA;;AAAM,0BAAAyJ,KAAAhK,IAAA,KAAK,eAAL,gBAAAA,EAAiB,UAAjB,gBAAAgK,EAAA,KAAAhK,GAAyB;AAAA;AAAA,gBAC3C,UAAA;AAAA,cAAA;AAAA,YAAA,IACC;AAAA,UAAA,EAAA,CACV,IAAS;AAAA,UACT,gBAAAuB,EAAC,SAAA,EAAM,aAAWgH,IAAY,SAAS,MAClC,UAAA;AAAA,YAAA,KAAK,MAAM,WAAW,OAAO,yBAAQ,WAAA,EAAS,UAAA,KAAK,MAAM,QAAA,CAAQ;AAAA,YAClE,gBAAAhI;AAAA,cAACoL;AAAA,cAAA;AAAA,gBAEG,SAAS,KAAK;AAAA,gBACd,aAAa,KAAK;AAAA,gBAClB,gBAAgB,KAAK;AAAA,gBACpB,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,gBAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,KACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,gBACvC,GAAI,KAAK,MAAM,kBAAkB,OAC5B,CAAA,IACA,EAAC,gBAAgB,KAAK,MAAM,eAAA;AAAA,cAAc;AAAA,cAZ5C;AAAA,YAAA;AAAA,8BAcP,SAAA,EACI,UAAAtG,EAAK,SAAS,IACTA,EAAK,IAAI,CAACC,GAAK9E,MACb,KAAK,UAAU8E,GAAK9E,GAAO6F,CAAY,CAAC,IAC1CkC,IACI,KAAK,uBACLF,MAAWG,EAAW,QAClB,OACA,gBAAAjI,EAAC,MAAA,EACC,4BAAC,MAAA,EAAG,SAAS,KAAK,QAAQ,QACrB,UAAA,KAAK,MAAM,gBAAgB,UAAA,CAChC,KAHM,OAIV,EAAA,CAChB;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAER;AAAA,EAEQ,UACJ+E,GACA9E,GACA6F,GACS;AACT,UAAMc,IAAM,KAAK,OAAO7B,GAAK9E,CAAK,GAC5Bc,IAAW+E,EAAa,IAAIc,CAAG;AACrC,WAAO,gBAAA5G;AAAA,MAAC;AAAA,MAAA;AAAA,QAEJ,4BAAyB;AAAA,QACzB,cAAYC;AAAA,QACZ,iBAAe,OAAOc,CAAQ;AAAA,QAC9B,UAAUd,MAAU,IAAI,IAAI;AAAA,QAE3B,UAAA,KAAK,QAAQ,IAAI,CAACoL,wBAAY,MAAA,EAC1B,UAAAA,EAAO,SACFA,EAAO,OAAOtG,GAAK9E,CAAK,IACxB0N,GAAgB5I,EAAIsG,EAAO,KAAK,CAAC,KAHJ,OAAOA,EAAO,KAAK,CAI1D,CAAK;AAAA,MAAA;AAAA,MAVA,OAAOzE,CAAG;AAAA,IAAA;AAAA,EAYvB;AAAA,EAEQ,qBAAkC;AACtC,UAAMgH,IAAQ,KAAK,MAAM,oBAAoB;AAC7C,WAAO,MAAM,KAAK,EAAC,QAAQA,EAAA,GAAQ,CAACzF,GAAG0F,MACnC,gBAAA7N,EAAC,MAAA,EACI,eAAK,QAAQ,IAAI,CAACqL,GAAQyC,wBACtB,MAAA,EACG,UAAA,gBAAA9N;AAAA,MAACyC;AAAA,MAAA;AAAA,QACG,OAAO,MAAOoL,IAAWC,KAAe,IAAK;AAAA,MAAA;AAAA,IAAA,KAF5C,OAAOzC,EAAO,KAAK,CAI5B,CAAK,EAAA,GANJ,eAAewC,CAAQ,EAOhC,CAAK;AAAA,EACb;AAAA,EAEA,YAAYvF,GAA6B;AACrC,UAAMxD,IAAOwD,aAAe,UACtBA,EAAI,iBAA8B,kCAAkC,IACpE,CAAA;AACN,SAAK,iBAAiB,YAAYxD,CAAI;AAAA,EAC1C;AAAA,EAEA,kBAA0B;AACtB,WAAO,KAAK,iBAAiB,iBAAA;AAAA,EACjC;AAAA,EAEA,yBAA+C;AAC3C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,iBAA8B;;AAC1B,aAAOrF,IAAA,KAAK,wBAAL,gBAAAA,EAA0B,UAAS;AAAA,EAC9C;AAAA,EAEA,wBAA0D;AACtD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,YAAkB;;AACd,SAAK,iBAAiB,QAAA,IACtBA,IAAA,KAAK,oBAAL,QAAAA,EAAsB,YACtBgK,IAAA,KAAK,qBAAL,QAAAA,EAAuB,YACvBC,IAAA,KAAK,wBAAL,QAAAA,EAA0B;AAAA,EAC9B;AAkCJ;AAhCIrK,EA3MSiO,GA2MF,gBAAe,CAAC7K,GAAa2I,EAAW,IAE/C/L,EA7MSiO,GA6MO,YAAW,eAC3BjO,EA9MSiO,GA8MO,sBAAqB,eAErCjO,EAhNSiO,GAgNF,OAAM9M;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BjB,SAASgN,GACLO,GAC4B;AAC5B,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,UAAM,IAAI,UAAU,6CAA6C;AAErE,QAAMC,wBAAa,IAAA;AACnB,SAAOD,EAAQ,IAAI,CAAC1C,MAAoB;AACpC,QAAIA,KAAU,QAAQ,OAAOA,KAAW;AACpC,YAAM,IAAI,UAAU,yCAAyC;AAEjE,UAAMO,IAAQ,QAAQ,IAAIP,GAAQ,OAAO;AACzC,QAAI,OAAOO,KAAU,YAAYA,EAAM,WAAW;AAC9C,YAAM,IAAI,UAAU,yCAAyC;AAEjE,QAAIoC,EAAO,IAAIpC,CAAK,SAAS,IAAI,MAAM,+BAA+BA,CAAK,EAAE;AAC7E,IAAAoC,EAAO,IAAIpC,CAAK;AAChB,UAAMqC,IAAS,QAAQ,IAAI5C,GAAQ,QAAQ;AAC3C,QAAI4C,KAAU,QAAQ,OAAOA,KAAW;AACpC,YAAM,IAAI,UAAU,oBAAoBrC,CAAK,4BAA4B;AAI7E,WAAOP;AAAA,EACX,CAAC;AACL;AAEA,SAASkC,GAA4CnP,GAAmC;;AAGpF,QAAM8P,IAFc;AAAA,IAAC;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAW;AAAA,IACzE;AAAA,EAAA,EACuB,KAAK,CAACvP,MAAS,OAAO,OAAOP,GAAOO,CAAI,CAAC;AACpE,MAAIuP,KAAU;AACV,UAAM,IAAI;AAAA,MACN,aAAaA,CAAM;AAAA,IAAA;AAG3B,QAAMC,IAAU/P,EAAM,SAAS,QACzBgQ,IAAgBhQ,EAAM,eAAe,QACrCiQ,IAAUjQ,EAAM,SAAS;AAC/B,MAAI,OAAO+P,CAAO,IAAI,OAAOC,CAAa,IAAI,OAAOC,CAAO,IAAI;AAC5D,UAAM,IAAI,UAAU,4DAA4D;AAEpF,MAAID,GAAe;AACf,UAAMlH,IAAS9I,EAAM;AACrB,QAAI8I,KAAU,QACP,OAAOA,KAAW,YAClBA,EAAO,SAAS,QAChB,SAAOzH,IAAAyH,EAAO,gBAAP,gBAAAzH,EAAoB,QAAQ,cACnC,SAAOgK,IAAAvC,EAAO,mBAAP,gBAAAuC,EAAuB,QAAQ,cACtC,OAAOvC,EAAO,WAAY;AAC7B,YAAM,IAAI,UAAU,oEAAoE;AAAA,EAEhG;AACJ;AAEA,SAASuG,GACLa,GACmB;AACnB,MAAIA,KAAU,KAAM,QAAO1J;AAC3B,MAAI,OAAO0J,KAAW,WAAY,QAAOA;AACzC,MAAI,OAAOA,KAAW,YAAYA,EAAO,SAAS;AAC9C,WAAO,CAACvJ,GAAK9E,MAAU;AACnB,YAAM2G,IAAM7B,EAAIuJ,CAAM;AACtB,UAAI1H,KAAO;AACP,cAAM,IAAI,UAAU,0BAA0B3G,CAAK,UAAUqO,CAAM,EAAE;AAEzE,aAAO1H;AAAA,IACX;AAEJ,QAAM,IAAI,UAAU,sDAAsD;AAC9E;AAEA,SAAS+G,GAAgB/P,GAA2B;AAChD,SAAIA,KAAS,QAAQ,OAAOA,KAAU,YAAY,OAAOA,KAAU,WAAiBA,IAC7E,OAAOA,CAAK;AACvB;AAEA,SAASsK,GAAaH,GAAgB1J,GAA0B;AAC5D,SAAI0J,aAAiB,QAAcA,EAAM,UAClCA,KAAS,OAAO1J,IAAW,OAAO0J,CAAK;AAClD;ACtXO,MAAMwG,WAAmC9Q,EAAiC;AAAA,EAC7E,SAAoB;AAChB,WAAO,KAAK,MAAM,YAAY,CAAA;AAAA,EAClC;AACJ;ACfO,SAAS+Q,EACZ5Q,GAC4C;AAC5C,MAAI,CAAC,MAAM,QAAQA,CAAK,EAAG,OAAM,IAAI,UAAU,6BAA6B;AAC5E,QAAM8J,wBAAW,IAAA,GACX+G,IAAQ,CAACC,MAA6C;AACxD,eAAWC,KAAQD,GAAO;AACtB,UAAIC,KAAQ,QAAQ,OAAOA,KAAS,YAAYA,EAAK,MAAM;AACvD,cAAM,IAAI,UAAU,+BAA+B;AAEvD,UAAIjH,EAAK,IAAIiH,EAAK,EAAE,EAAG,OAAM,IAAI,MAAM,2BAA2B,OAAOA,EAAK,EAAE,CAAC,EAAE;AAEnF,UADAjH,EAAK,IAAIiH,EAAK,EAAE,GACZ,CAAC,MAAM,QAAQA,EAAK,YAAY,CAAA,CAAE;AAClC,cAAM,IAAI,UAAU,aAAa,OAAOA,EAAK,EAAE,CAAC,4BAA4B;AAEhF,MAAAF,EAAME,EAAK,YAAY,EAAE;AAAA,IAC7B;AAAA,EACJ;AACA,EAAAF,EAAM7Q,CAAoC;AAC9C;AAEO,SAASgR,GACZF,GACA9H,GACuB;AACvB,SAAA4H,EAAgBE,CAAK,GACdG,GAAsBH,GAAO9H,CAAG;AAC3C;AAQO,SAASkI,GACZJ,GACA9H,GACAlD,IAAiB,MAOnB;AACE,SAAO,IAAIC;AAAA,IACP,CAAC+K,GAAO9H,CAAG;AAAA,IACX,CAAC,CAACmI,GAAcC,CAAU,OACtBR,EAAgBO,CAAY,GACrBC,KAAc,OAAO,OAAOH,GAAsBE,GAAcC,CAAU;AAAA,IAErF,EAAC,OAAAtL,GAAO,SAAS,uBAAA;AAAA,EAAsB;AAE/C;AAGO,SAASuL,GACZP,GACA9H,GACAsI,GAC2B;AAE3B,MADAV,EAAgBE,CAAK,GACjB,OAAOQ,KAAW,WAAY,OAAM,IAAI,UAAU,qCAAqC;AAE3F,QAAMT,IAAQ,CAACjL,MAAoE;AAC/E,aAASvD,IAAQ,GAAGA,IAAQuD,EAAM,QAAQvD,KAAS,GAAG;AAClD,YAAM0O,IAAOnL,EAAMvD,CAAK;AACxB,UAAI,OAAO,GAAG0O,EAAK,IAAI/H,CAAG,GAAG;AACzB,cAAMuI,IAAUD,EAAOP,CAAI;AAC3B,YAAIQ,KAAW,QAAQ,OAAOA,KAAY;AACtC,gBAAM,IAAI,UAAU,0CAA0C;AAElE,YAAI,CAAC,OAAO,GAAGA,EAAQ,IAAIR,EAAK,EAAE;AAC9B,gBAAM,IAAI,MAAM,8CAA8C;AAElE,YAAI,OAAO,GAAGQ,GAASR,CAAI,EAAG,QAAOnL;AACrC,cAAMiE,IAAS,CAAC,GAAGjE,CAAK;AACxBiE,eAAAA,EAAOxH,CAAK,IAAIkP,GACT1H;AAAAA,MACX;AACA,YAAM/F,IAAWiN,EAAK,YAAY,CAAA,GAC5BS,IAAkBX,EAAM/M,CAAQ;AACtC,UAAI,CAAC,OAAO,GAAG0N,GAAiB1N,CAAQ,GAAG;AACvC,cAAM+F,IAAS,CAAC,GAAGjE,CAAK;AACxBiE,eAAAA,EAAOxH,CAAK,IAAI,EAAC,GAAG0O,GAAM,UAAUS,EAAA,GAC7B3H;AAAAA,MACX;AAAA,IACJ;AACA,WAAOjE;AAAA,EACX,GAEMiE,IAASgH,EAAMC,CAAK;AAC1B,SAAK,OAAO,GAAGjH,GAAQiH,CAAK,OAAmBjH,CAAM,GAC9CA;AACX;AAGO,SAAS4H,GACZX,GACA9H,GACAsI,GACArJ,IAAiB,qBACV;AACP,QAAMvF,IAAUoO,EAAM,IAAA,GAChBnO,IAAO0O,GAAe3O,GAASsG,GAAKsI,CAAM;AAChD,SAAO,OAAO,GAAG3O,GAAMD,CAAO,IAAI,KAAQoO,EAAM,IAAInO,GAAMsF,CAAK;AACnE;AAEA,SAASgJ,GACLH,GACA9H,GACuB;AACvB,aAAW+H,KAAQD,GAAO;AACtB,QAAI,OAAO,GAAGC,EAAK,IAAI/H,CAAG,EAAG,QAAO+H;AACpC,UAAMW,IAAQT,GAAsBF,EAAK,YAAY,CAAA,GAAI/H,CAAG;AAC5D,QAAI0I,KAAS,KAAM,QAAOA;AAAA,EAC9B;AACA,SAAO;AACX;AClGO,MAAMC,UAAmC9R,EAAiC;AAAA,EAW7E,YAAYW,GAA8B;AACtC,UAAMA,CAAK;AAXN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA,oBAAyB;AACzB,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,wBAAuD;AAIvDuI,QAAAA,GAA+CxJ,EAAM,KAAK;AAC1D,WAAK,eAAeA,EAAM,OAC1B,KAAK,oBAAoB;AAAA,SACtB;AACH,YAAMsQ,IAAQtQ,EAAM,SAASoR,GAAgCpR,EAAM,QAAQ;AAC3E,WAAK,oBAAoB,IAAIM,EAAQgQ,GAAO;AAAA,QACxC,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,CACZ,GACD,KAAK,eAAe,KAAK;AAAA,IAC7B;AACA,SAAK,uBAAuBtQ,EAAM,sBAAsB,OAClD,IAAIM,EAAoB,MAAM,EAAC,OAAO,MAAM,SAAS,oBAAA,CAAoB,IACzE,MACN,KAAK,qBAAqBN,EAAM,sBAAsB,KAAK,sBAC3D,KAAK,uBAAuBA,EAAM,uBAAuB,OACnD,IAAIM,EAAe,IAAI,EAAC,OAAO,MAAM,SAAS,qBAAA,CAAqB,IACnE,MACN,KAAK,sBAAsBN,EAAM,uBAAuB,KAAK;AAAA,EACjE;AAAA,EAEA,aAAmB;AACf,SAAK,UAAU,KAAK,aAAa,IAAA,CAAK,GACtC,KAAK,MAAM,KAAK,cAAc,KAAK,oBAAoB,KAAK,mBAAmB,GAC/E,KAAK,UAAU,KAAK,aAAa,UAAU,CAAC,EAAC,OAAAR,QAAW,KAAK,UAAUA,CAAK,GAAG;AAAA,MAC3E,aAAa;AAAA,IAAA,CAChB,CAAC;AAAA,EACN;AAAA,EAEA,SAAoB;AAChB,UAAM8Q,IAAQ,KAAK,aAAa,IAAA;AAChC,IAAAF,EAAgBE,CAAK;AACrB,UAAMe,IAAW,IAAI,IAAI,KAAK,oBAAoB,KAAK,GACjDC,IAAUC,GAAejB,GAAOe,CAAQ,GACxC1O,IAAW,KAAK,mBAAmB,IAAA,GACnCqC,IAASsM,EAAQ,KAAK,CAAC,EAAC,MAAAf,EAAA,MAAU,OAAO,GAAGA,EAAK,IAAI,KAAK,UAAU,CAAC,KACpEe,EAAQ,KAAK,CAAC,EAAC,MAAAf,QAAU,OAAO,GAAGA,EAAK,IAAI5N,CAAQ,CAAC,KACrD2O,EAAQ,CAAC,KACT;AACP,SAAK,cAAatM,KAAA,gBAAAA,EAAQ,KAAK,OAAM;AAErC,UAAMrD,IAAO,KAAK;AAClB,WAAO,gBAAAC,EAACD,GAAA,EAAK,WAAWnB,EAAW,qBAAqBE,EAAe,KAAK,KAAK,CAAC,GAC7E,UAAA4Q,EAAQ,WAAW,IACd,gBAAA1P,EAAC,KAAA,EAAE,MAAK,UAAS,UAAA,gBAAA,CAAa,IAC9B,gBAAAA,EAAC,OAAA,EAAI,MAAK,QAAO,cAAY,KAAK,MAAM,OACrC,UAAA0P,EAAQ,IAAI,CAAC5M,GAAM7C,MAAU;;AAC1B,YAAM,EAAC,MAAA0O,GAAM,OAAAiB,GAAO,UAAAC,GAAU,SAAAC,MAAWhN,GACnCiN,OAAetQ,IAAAkP,EAAK,aAAL,gBAAAlP,EAAe,WAAU,KAAK,GAC7CuQ,IAAaD,KAAeN,EAAS,IAAId,EAAK,EAAE,GAChDsB,IAAa,OAAO,GAAGtB,EAAK,IAAI5N,CAAQ,GACxCnB,MAAQ8J,KAAAD,IAAA,KAAK,OAAM,eAAX,gBAAAC,EAAA,KAAAD,GAAwBkF,GAAMiB,OAAUjB,EAAK;AAC3D,aAAO,gBAAA3N;AAAA,QAAC;AAAA,QAAA;AAAA,UAEJ,MAAK;AAAA,UACL,cAAYf;AAAA,UACZ,cAAY2P;AAAA,UACZ,cAAYA,IAAQ;AAAA,UACpB,iBAAeC;AAAA,UACf,gBAAcC;AAAA,UACd,iBAAeC,IAAc,OAAOC,CAAU,IAAI;AAAA,UAClD,iBAAe,OAAOC,CAAU;AAAA,UAChC,UAAU,OAAO,GAAGtB,EAAK,IAAIvL,KAAA,gBAAAA,EAAQ,KAAK,EAAE,IAAI,IAAI;AAAA,UACpD,OAAO,EAAC,gBAAgBwM,EAAA;AAAA,UACxB,SAAS,CAACjQ,MAAsB;AAE5B,gBADA,KAAK,aAAagP,EAAK,IACnBuB,GAAiBvQ,EAAM,MAAM,KAAKoQ,GAAa;AAC/C,mBAAK,eAAepB,EAAK,EAAE,GAC3B,KAAK,SAASA,EAAK,EAAE;AACrB;AAAA,YACJ;AACA,iBAAK,WAAWA,GAAMhP,CAAK;AAAA,UAC/B;AAAA,UACA,SAAS,MAAM,KAAK,aAAagP,EAAK;AAAA,UACtC,WAAW,CAAChP,MACR,KAAK,cAAcA,GAAOM,GAAOyP,CAAO;AAAA,UAE5C,UAAA;AAAA,YAAA,gBAAA1P;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,aAAU;AAAA,gBACV,mBAAiB+P,IAAc,KAAK;AAAA,gBACpC,eAAY;AAAA,gBACd,UAAAA,IAAeC,IAAa,MAAM,MAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAC3C,gBAAAhQ,EAAC,QAAA,EAAK,aAAU,SAAS,UAAAJ,EAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QA7B1B+O,EAAK;AAAA,MAAA;AAAA,IA+BlB,CAAC,GACL,GACR;AAAA,EACJ;AAAA,EAEA,YAAkB;;AACd,IAAI,KAAK,kBAAkB,QAAM,aAAa,KAAK,cAAc,IACjElP,IAAA,KAAK,sBAAL,QAAAA,EAAwB,YACxBgK,IAAA,KAAK,yBAAL,QAAAA,EAA2B,YAC3BC,IAAA,KAAK,yBAAL,QAAAA,EAA2B;AAAA,EAC/B;AAAA,EA2DQ,UAAUgF,GAA0C;AACxD,IAAAF,EAAgBE,CAAK;AACrB,UAAMyB,IAAU,IAAI,IAAIC,GAAW1B,CAAK,EAAE,IAAI,CAAC,EAAC,MAAAC,EAAA,MAAUA,EAAK,EAAE,CAAC,GAC5D5N,IAAW,KAAK,mBAAmB,IAAA;AACzC,IAAI,KAAK,wBAAwB,QAAQA,KAAY,QAAQ,CAACoP,EAAQ,IAAIpP,CAAQ,KAC9E,KAAK,mBAAmB,IAAI,MAAM,4BAA4B;AAElE,UAAM0O,IAAW,KAAK,oBAAoB,IAAA,GACpCY,IAAWZ,EAAS,OAAO,CAAC7I,MAAQuJ,EAAQ,IAAIvJ,CAAG,CAAC;AAC1D,IAAI,KAAK,wBAAwB,QAAQ,CAAC0J,GAASb,GAAUY,CAAQ,KACjE,KAAK,oBAAoB,IAAIA,GAAU,oCAAoC,GAE3E,KAAK,cAAc,QAAQ,CAACF,EAAQ,IAAI,KAAK,UAAU,MAAG,KAAK,aAAa;AAAA,EACpF;AAAA,EAEQ,WAAWxB,GAAwBhP,GAAoB;AAC3D,SAAK,mBAAmB,IAAIgP,EAAK,IAAI,oBAAoB,GACzD5P,EAAO,KAAK,MAAM,UAAU4P,GAAMhP,CAAK,GACvC,KAAK,SAASgP,EAAK,EAAE;AAAA,EACzB;AAAA,EAEQ,eAAe/H,GAAgB;AACnC,UAAM6I,IAAW,KAAK,oBAAoB,IAAA,GACpCc,IAAWd,EAAS,KAAK,CAAC5I,MAAc,OAAO,GAAGA,GAAWD,CAAG,CAAC;AACvE,SAAK,oBAAoB;AAAA,MACrB2J,IACMd,EAAS,OAAO,CAAC5I,MAAc,CAAC,OAAO,GAAGA,GAAWD,CAAG,CAAC,IACzD,CAAC,GAAG6I,GAAU7I,CAAG;AAAA,MACvB2J,IAAW,wBAAwB;AAAA,IAAA;AAAA,EAE3C;AAAA,EAEQ,cACJ5Q,GACAM,GACAyP,GACI;;AACJ,UAAMpP,IAAUoP,EAAQzP,CAAK;AAC7B,QAAIK,KAAW,MACf;AAAA,UAAIX,EAAM,QAAQ,YAAa,QAAO,KAAK,KAAKA,IAAOF,IAAAiQ,EAAQzP,IAAQ,CAAC,MAAjB,gBAAAR,EAAoB,KAAK,EAAE;AAClF,UAAIE,EAAM,QAAQ,UAAW,QAAO,KAAK,KAAKA,IAAO8J,IAAAiG,EAAQzP,IAAQ,CAAC,MAAjB,gBAAAwJ,EAAoB,KAAK,EAAE;AAChF,UAAI9J,EAAM,QAAQ,OAAQ,QAAO,KAAK,KAAKA,IAAO+J,IAAAgG,EAAQ,CAAC,MAAT,gBAAAhG,EAAY,KAAK,EAAE;AACrE,UAAI/J,EAAM,QAAQ,MAAO,QAAO,KAAK,KAAKA,IAAO+N,IAAAgC,EAAQ,GAAG,EAAE,MAAb,gBAAAhC,EAAgB,KAAK,EAAE;AACxE,UAAI/N,EAAM,QAAQ,cAAc;AAC5B,QAAAA,EAAM,eAAA;AACN,cAAM+B,IAAWpB,EAAQ,KAAK,YAAY,CAAA;AAC1C,YAAIoB,EAAS,WAAW,EAAG;AAG3B,QAFiB,KAAK,oBAAoB,IAAA,EAAM,KAAK,CAACkF,MAClD,OAAO,GAAGA,GAAKtG,EAAQ,KAAK,EAAE,CAAC,IAE9B,KAAK,SAASoB,EAAS,CAAC,EAAG,EAAE,IADnB,KAAK,eAAepB,EAAQ,KAAK,EAAE;AAElD;AAAA,MACJ;AACA,UAAIX,EAAM,QAAQ,aAAa;AAC3B,QAAAA,EAAM,eAAA,GACW,KAAK,oBAAoB,IAAA,EAAM,KAAK,CAACiH,MAClD,OAAO,GAAGA,GAAKtG,EAAQ,KAAK,EAAE,CAAC,IACrB,KAAK,eAAeA,EAAQ,KAAK,EAAE,IACxCA,EAAQ,YAAY,QAAM,KAAK,SAASA,EAAQ,QAAQ;AACjE;AAAA,MACJ;AACA,UAAIX,EAAM,QAAQ,WAAWA,EAAM,QAAQ,KAAK;AAC5C,QAAAA,EAAM,eAAA,GACN,KAAK,WAAWW,EAAQ,MAAMX,CAAK;AACnC;AAAA,MACJ;AACA,MAAIA,EAAM,IAAI,WAAW,KAAK,CAACA,EAAM,UAAU,CAACA,EAAM,WAAW,CAACA,EAAM,WACpE,KAAK,gBAAgBA,GAAO+P,GAASzP,CAAK;AAAA;AAAA,EAElD;AAAA,EAEQ,KAAKN,GAAsBiH,GAA4B;AAC3D,IAAIA,MAAQ,WACZjH,EAAM,eAAA,GACN,KAAK,SAASiH,CAAG;AAAA,EACrB;AAAA,EAEQ,SAASA,GAAgB;;AAC7B,SAAK,aAAaA;AAClB,UAAM9B,IAAO,KAAK,eAAe,UAC3B,CAAC,GAAG,KAAK,IAAI,iBAA8B,mBAAmB,CAAC,IAC/D,CAAA;AACN,eAAWC,KAAOD,GAAM;AACpB,YAAM7E,IAAQ,OAAO8E,EAAI,QAAQ,KAAK,GAChC2K,IAAUC;AAAA,QACZ,KAAK,aAAa,IAAA;AAAA,QAClB,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAAA,MAAA,GAEpCa,IAAU,OAAO,IAAG/Q,IAAAiQ,EAAQzP,CAAK,MAAb,gBAAAR,EAAgB,KAAK,IAAImH,CAAG;AACtD,MAAA7B,EAAI,WAAWyL,IAAU,IAAI,IACzBA,OAAa,MAAA;AAAA,IACrB;AAAA,EACJ;AAAA,EAEQ,gBACJ7Q,GACA+P,GACAzP,GACI;AACJ,IAAAN,EAAM,eAAA,GACF,KAAK,kBAAkB,QAAM,aAAa,KAAK,cAAc,GACjE,KAAK,aAAaA,EAAM,IAAI,kBAAA,GAC5B,KAAK,iBAAiB,WAAW,MAAM;AACnC,WAAK,YAAY,IACjB,KAAK,iBAAiB;AAAA,IAC1B,GAAG,GAAG;AAEN,UAAM8Q,IADa,CAAC,GAAGf,EAAQ,MAAMzP,IAAQ,CAAC,GAAG,GAAGyP,EAAQ,MAAM,GAAGzP,IAAQ,CAAC,CAAC,EACtD,KAAK,CAAC,EAAC,MAAA0O,EAAA,MAAU+B,GAAU/B,CAAI,EACnD,kBAAA,EACA,WAAW,KAAK,SAAS,CAAC;AAC/B,IAAI8B,KAAS,QAAM,KAAK,SAASA,EAAM,KAAK,EAAE;AAAA,EAClD;AACJ;AAzKIpR,EA7GSkQ,GA6GF,gBAAe,CAAChB,EAAQ,IAE/BlP,EA/GSkQ,GA+GO,YAAW,cAC3BlQ,EAhHSkQ,GAgHO,sBAAqB,cAErClQ,EAlHSkQ,GAkHF,OAAM/O;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsKjB,SAASgP,GAAgC9N,GAA0D;AAE/F,UADe,MAAM,QAAQA,CAAQ,IAAIA,IAAWA,KAAY,OAAO,KAAK,CAACA,CAAQ,GACvE,OAAO,CAACN,MAAUC,GAAQD,CAAK,KAAKA,EAAM,SAASmN,EAAQ,EAAE,IAAI,CAACnN,MAAU;AACtF,QAAI,CAACC,GAAQD,CAAK,EAAG,OAAM,IAAI,UAAU,0CAA0C;AACnF,UAAMhD,IAAQgD,EAAM;AACpB,WAAO;AAAA,MACH,IAAIhD,EAAM;AAAA,MACV,OAAOA,EAAM;AAAA,MACb,GAAIA,EAAM,aAAa,OAAO,CAAA,IAAK,EAAC,WAAWA,EAAM,UAAA;AAAA,MACrD,GAAIA,EAAM,UAAU,SAAY,CAAA,IAAK,EAAC,OAAOA,EAAM,MAAA;AAAA,MACnD,UAAUoR,GAAgCpR,EAAM,QAAQ;AAAA,IAAA;AAAA,EAEhE,CAAC;AACL;AAEA,SAASuR,GACLjB,GACAe,GACqB;AACrB,QAAMhI,IAAgC,CAAA,GAChCgH,IAAQ,CAACjL,GAAoCoM,GAAee,MAAyB;AACvF,IAAAnN,EAAM,QAAQ,CAACmL,GAAM1O,MAAU;;AAC3B,MAAAwH,EAAO,KAAK,EAAC,MAAAkH,GAAM,OAAAiB,GAAO,UAAAe,GAAU,UAAU1Q,IAAQ,GAAG,SAASuD,EAAM,OAAA,CAAO,MAC1E/D,IAAAkP,EAAK,aAAL,gBAAAlP,EAAe,WAAU,KAAK,KAAKgQ,EAAS,IAAId,EAAK,EAAE,KACxDF,EAAME,EAAK,YAAY,CAAA,GAAIiB,IAAQ,GAAGjB,EAAK,EAAE;AAAA,IAErD,CAAC;AAAA,EACL;AACA,SAAAF,EAAMC,GAAO,GAAG,IAAI,GACbjH;AACX;AAEA,SAAS2I,GAAmB1B,GAA2D;AACnF,QAAMyB,wBAAc,IAAA,GACd1I,IAAgC,CAAA,GAChCgH,IAAQ,CAACjL,GAAoCoM,GAAee,MAAyB;AACvF,IAAAnN,EAAM,QAAQ,CAACmL,GAAM1O,MAAU;AAC3B,UAAIkQ,EAAQ,IAAIxB,EAAK,EAAE,EAAG,OAAM,IAAI,MAAM,2BAA2B,OAAOA,EAAK,EAAE,CAAC,EAAE;AACtF,MAAAwB,EAAQ,IAAIxB,EAAK,EAAE,GACnBlH,EAAO,KAAK,EAAC,MAAAkH,GAAM,OAAAiB,GAAO,UAAAe,GAAU,UAAU1Q,IAAQ,GAAG,SAASuD,EAAM,OAAA,CAAO,GAC/EiL,EAAME,EAAK,YAAY,CAAA,GAAIiB,IAAQ,GAAGjB,EAAK,EAAE;AAAA,IACjD,CAAC;AAAA,EACL;AACA,SAAAF,EAAMC,GAAO,GAAG,IAAI,GACbjH;AACX;AAEA,SAASiJ,GAAkB/B,GAAgC;AACvD,SAAIA,EAAK,aAAa,OAAaA,EAAK,YACpC,OAAOA,EAAK,SAAU,YAAY,OAAOA,EAAK,SAAU,WAAiB,OAAOA,EAAK,KAAK,IACvF,OAAOA,EAAK,EAAE;AACzB;AAEA,SAAS2B,GAAS/I,GAAsBC,GAAgC;AACpE,SAAOD,EAAK,WAAWC,EAAM,UACtBD,EAAK,MAAM,CAAC3J,GAAOqC,MAAU,OAAO,GAAGrC,GAAO4J,EAAMvH,CAAK,CAAC,CAAC;AACtE;AAEA,SAAS2H,GAA0BhK,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAASsS,GAAiBU,GAAqC;AAC3D,SAAOA,aAAkB,WAAWA,EAAO,QAAQ,wBAAwB,KAAK;AACpF;ACpWO,MAAMC,WAAepT,EAAuB;AAAA,EAC/C,YAAYW,IAAqB,IAAI;AAEjC,QADA,MAAMA,CAAK,GACPA,EAAM,WAAW,QAAQ,OAAOA,EAAM,WAAY;AAClD,YAAM,IAAI,UAAU,mCAAmC;AAAA,EAE/D;AAAA,EAEA,SAAoB;AAChB,UAAM;AAAA,MACF,UAAAsD,IAAW,CAAA;AAAA,MACX,OAAA9B;AAAA,MACA,MAAAkR,IAAO;AAAA,MACP,UAAA7P,IAAW;AAAA,MACX,SAAA8P;AAAA,MACA,MAAAC,IAAO;AAAA,MACP,WAAAC;AAAA,MACA,IAAAxQ;AAAA,MACA,MAAA9B;AAAA,MACA,OAAAf;AAAA,MACA,OAAAgE;AAAA,MACA,WAAAE;AAAA,MACA,SAAAmD;AAAA,IAAA,IACA,KAAK,OAIHiM,KAHc,MAAM,QAAQxP,CAAQ,IACpCA,EAAS,SAAS,IAClBA,KAAY,QAAQ,OAAOA,KAAa,aACVA,IAAY9B,KAAS,IACnDwI,IAAU4I,IAAQC,KAAaC,IAAiBA,GAChDC,IAAclQ,KAAY+P;AAEhC,WAAO,gBAAAhR;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,IAAAS;AAAA,QACA,MAAA9B;AAAA,QACA,OAAOf,KAAS,OAAO,SAAY,OAAOA,CAAK;AAAA,QAC/C,OAAAgE;AAAA,QACA,MAAAkP;AAAA,QACA,UAAUK;AAAA,QACV,WAAWrS,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,uBAAoB;AAAA,QACpB,cAAYgD;AAAA,QACZ,gBAAciP,KAAW,OAAO,OAAO,OAAO,EAAQA,CAAQ;AAAA,QAC9D,aAAWC,IAAO,SAAS;AAAA,QAC3B,SAAS,CAACrR,MAAsB;AAC5B,UAAKwR,KAAapS,EAAOkG,GAAStF,CAAK;AAAA,QAC3C;AAAA,QACF,UAAAyI;AAAA,MAAA;AAAA,IAAA;AAAA,EACN;AAWJ;AATI/I,EAjDSwR,IAiDF,cAAa;AAAA,EAChB,CAAC,UAAU,CAAC,UAAU,QAAQ,CAAC;AAAA,IAGnCxR,EArDSwR,IAqDF,OAAMrQ;AAAA;AAAA;AAAA;AAAA;AClDV,MAAM4Q,WAAe3T,EAAuB;AAAA,EAS/C,YAAYW,GAAoB;AAC5B,UAAMA,CAAK;AATN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACD,IAAAA,EAAA,uBAA0C;AAC1C,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,0BAAmB;AAIvB,SAAK,cAAcnB,EAAmB,MAAME,GAAO,IAAO,mBAAmB,GAC7E,KAAK,WAAWL,EAAU,UAAUK,EAAM,EAAE,GAC5C,KAAK,UAAU,GAAG,KAAK,QAAQ,UAC/B,KAAK,gBAAgB,GAAG,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,WAAW;AAAA,EAC/B;AAAA,EAEA,SAAoB;AAChB,UAAM;AAAA,MACF,OAAAwD;AAAA,MACA,aAAAyP;AAAA,MACA,SAAAC;AAAA,MACA,YAAAC,IAAa;AAAA,MACb,iBAAAC,IAAkB;AAAA,MAClB,UAAA9P,IAAW,CAAA;AAAA,IAAC,IACZ,KAAK;AACT,WAAO,gBAAAV;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,WAAWlC,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,uBAAoB;AAAA,QACpB,mBAAiB,KAAK;AAAA,QACtB,oBAAkBuS,KAAe,OAAO,OAAO,KAAK;AAAA,QACpD,cAAW;AAAA,QACX,KAAK,CAACI,MAAsC,KAAK,gBAAgBA;AAAA,QAEjE,UAAA;AAAA,UAAA,gBAAAzR,EAAC,YACG,UAAA,gBAAAA,EAAC,MAAA,EAAG,IAAI,KAAK,SAAU,aAAM,EAAA,CACjC;AAAA,UACCqR,KAAe,OAAO,OAAO,gBAAArR,EAAC,OAAE,IAAI,KAAK,eACrC,UAAAqR,EAAA,CACL;AAAA,UACA,gBAAArR,EAAC,OAAA,EAAI,aAAU,WAAW,UAAA0B,EAAA,CAAS;AAAA,UAClC4P,KAAW,QAAQ,CAACE,IAAkB,yBAAQ,UAAA,EAC1C,UAAA;AAAA,YAAAF;AAAA,YACAE,IAAkB,gBAAAxR;AAAA,cAAC6Q;AAAA,cAAA;AAAA,gBAChB,OAAOU;AAAA,gBACP,SAAS,MAAM,KAAK,aAAA;AAAA,cAAa;AAAA,YAAA,IAChC;AAAA,UAAA,EAAA,CACT;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,aAAmB;AACf,UAAMG,IAAS,KAAK;AACpB,IAAIA,KAAU,SACd,KAAK,OAAOA,GAAQ,UAAU,CAAC/R,MAAiB;AAC5C,MAAAA,EAAM,eAAA,GACN,KAAK,aAAA;AAAA,IACT,CAAC,GACD,KAAK,OAAO+R,GAAQ,SAAS,MAAM;AAC/B,MAAI,KAAK,YAAY,IAAA,UAAY,YAAY,IAAI,IAAO,sBAAsB,GAC9E,KAAK,YAAA;AAAA,IACT,CAAC,GACD,KAAK,cAAA;AAAA,EACT;AAAA,EAEA,cAAoB;AAChB,SAAK,cAAA;AAAA,EACT;AAAA,EAEA,QAAc;AACV,SAAK,aAAA;AAAA,EACT;AAAA,EAEA,YAAkB;AACd,UAAMA,IAAS,KAAK;AACpB,KAAIA,KAAA,gBAAAA,EAAQ,UAAS,MAAQ,OAAOA,EAAO,SAAU,gBAAmB,MAAA,GACxE,KAAK,YAAA,GACL,KAAK,gBAAgB;AAAA,EACzB;AAAA,EAwCQ,eAAqB;AACzB,IAAK,KAAK,YAAY,SACtB,KAAK,YAAY,IAAI,IAAO,wBAAwB;AAAA,EACxD;AAAA,EAEQ,gBAAsB;AAC1B,UAAMA,IAAS,KAAK;AACpB,QAAIA,KAAU,KAAM;AACpB,UAAMC,IAAa,KAAK,YAAY,IAAA;AACpC,QAAIA,KAAc,CAAC,KAAK,kBAAkB;AACtC,YAAMvO,IAAS,SAAS;AACxB,WAAK,iBAAiBA,aAAkB,cAAcA,IAAS,MAC/DwO,GAAUF,CAAM,GAChB,KAAK,mBAAmB,IACxBG,GAAaH,GAAQ,KAAK,MAAM,eAAe;AAC/C;AAAA,IACJ;AACA,IAAI,CAACC,KAAc,KAAK,qBAChBD,EAAO,QAAQ,OAAOA,EAAO,SAAU,eAAmB,MAAA,IACzDA,EAAO,gBAAgB,MAAM,GAClC,KAAK,YAAA;AAAA,EAEb;AAAA,EAEQ,cAAoB;AACxB,QAAI,CAAC,KAAK,oBAAoB,KAAK,kBAAkB,KAAM;AAC3D,SAAK,mBAAmB;AACxB,UAAMI,IAAU,KAAK;AACrB,SAAK,iBAAiB,OAClBA,KAAA,gBAAAA,EAAS,iBAAgB,MAAMA,EAAQ,MAAA,GAC3C/S,EAAO,KAAK,MAAM,OAAO;AAAA,EAC7B;AACJ;AAtEIM,EArFS+R,IAqFF,gBAAe,CAACP,EAAM,IAE7BxR,EAvFS+R,IAuFF,OAAM5Q;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEjB,SAASoR,GAAUF,GAAiC;AAChD,MAAI,CAAAA,EAAO,MACX;AAAA,QAAI,OAAOA,EAAO,aAAc,YAAY;AACxC,MAAAA,EAAO,UAAA;AACP;AAAA,IACJ;AACA,IAAAA,EAAO,aAAa,QAAQ,EAAE;AAAA;AAClC;AAEA,SAASG,GAAaH,GAA2BK,GAAyC;AAItF,QAAMnB,KAHamB,KAAO,QAEpB,OAAOA,KAAQ,aADf,OACmCA,EAAI,YAChBL,EAAO;AAAA,IAChC;AAAA,EAAA;AAEJ,EAAAd,KAAA,QAAAA,EAAQ;AACZ;AC1LO,MAAMoB,IAAN,MAAMA,UAAqBvJ,EAA0B;AAAA,EAaxD,YAAYrK,IAA2B,IAAI;AACvC,UAAM,EAAC,GAAGA,GAAO,SAAS4T,EAAa,SAAQ;AAAA,EACnD;AACJ;AAfI3S,EADS2S,GACO,YAAW,kBAC3B3S,EAFS2S,GAEO,sBAAqB,kBAErC3S,EAJS2S,GAIF,WAAU;AAAA,EACb,CAAC,KAAKtU,EAAW,IAAI;AAAA,EACrB,CAAC,KAAKA,EAAW,OAAO;AAAA,EACxB,CAAC,KAAKA,EAAW,MAAM;AAAA,EACvB,CAAC,KAAKA,EAAW,OAAO;AAAA,IAG5B2B,EAXS2S,GAWF,wBAAuBtU,EAAW;AAXtC,IAAMuU,KAAND;ACJA,MAAME,IAAN,MAAMA,UAAoBzJ,EAA0B;AAAA,EAYvD,YAAYrK,IAA0B,IAAI;AACtC,UAAM,EAAC,GAAGA,GAAO,SAAS8T,EAAY,SAAQ;AAAA,EAClD;AACJ;AAdI7S,EADS6S,GACO,YAAW,iBAC3B7S,EAFS6S,GAEO,sBAAqB,iBAErC7S,EAJS6S,GAIF,WAAU;AAAA,EACb,CAAC,KAAKxU,EAAW,IAAI;AAAA,EACrB,CAAC,KAAKA,EAAW,OAAO;AAAA,EACxB,CAAC,KAAKA,EAAW,MAAM;AAAA,IAG3B2B,EAVS6S,GAUF,wBAAuBxU,EAAW;AAVtC,IAAMyU,KAAND;AC8BA,MAAME,WACD3U,EAAiC;AAAA,EAOzC,YAAYW,IAA+B,IAAI;;AAC3C,UAAMA,CAAK;AAPN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AAIb,SAAK,UAAUtB,EAAU,YAAYK,EAAM,EAAE,GAC7C,KAAK,UAAU,GAAG,KAAK,OAAO;AAC9B,UAAMiU,IAAkBjU,EAAM,WAAW,CAAA;AACzC,IAAIwJ,GAAqDyK,CAAe,KACpE,KAAK,iBAAiBA,GACtB,KAAK,qBAAqB,OAE1BnT,GAAsCmT,CAAe,GACrD,KAAK,iBAAiB,IAAI3T,EAA2C2T,GAAiB;AAAA,MAClF,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,qBAAqB;AAI9B,UAAMC,MAAa7S,IAAA,KAAK,eAAe,MAAM,CAAC,MAA3B,gBAAAA,EAA8B,UAAS;AAC1D,SAAK,eAAevB,EAA2B,MAAME,GAAOkU,GAAY,gBAAgB;AAAA,EAC5F;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,cAAc,KAAK,cAAc;AAAA,EACrD;AAAA,EAEA,SAAoB;AAChB,UAAM;AAAA,MACF,OAAA1S;AAAA,MACA,MAAAjB;AAAA,MACA,UAAAsC,IAAW;AAAA,MACX,UAAA6H,IAAW;AAAA,MACX,OAAAf,IAAQ;AAAA,MACR,aAAAwK,IAAc;AAAA,MACd,WAAAzQ;AAAA,MACA,UAAA0Q;AAAA,IAAA,IACA,KAAK,OACH/T,IAAU,KAAK,eAAe,IAAA,KAAS,CAAA;AAC7C,IAAAS,GAAsCT,CAAO;AAC7C,UAAMgU,IAAe,KAAK,aAAa,IAAA,GAEjC1S,IAAO,KAAK;AAClB,WAAO,gBAAAiB;AAAA,MAACjB;AAAA,MAAA;AAAA,QACJ,WAAWnB,EAAW,eAAeE,EAAe,KAAK,KAAK,CAAC;AAAA,QAC/D,iBAAemC,IAAW,KAAK;AAAA,QAC/B,iBAAe6H,IAAW,KAAK;AAAA,QAC/B,cAAYf,KAAS,OAAO,OAAO;AAAA,QAElC,UAAA;AAAA,UAAAnI,KAAS,OAAO,OAAO,gBAAAI,EAAC,WAAM,SAAS,KAAK,SAAU,UAAAJ,EAAA,CAAM;AAAA,UAC7D,gBAAAoB;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,KAAK;AAAA,cACT,MAAArC;AAAA,cACA,OAAO8T,KAAgB,OAAO,KAAK,OAAOA,CAAY;AAAA,cACtD,UAAAxR;AAAA,cACA,UAAA6H;AAAA,cACA,cAAYlJ,KAAS,OAAOkC,IAAY;AAAA,cACxC,gBAAciG,KAAS,OAAO,OAAO;AAAA,cACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,cAC9C,UAAU,CAACpI,MAAiB;AACxB,sBAAM+S,IAAMC,GAAWhT,GAAO,iBAAiB,GACzC0D,IAAS5E,EAAQ,KAAK,CAAC,EAAC,OAAAb,QAAW,OAAOA,CAAK,MAAM8U,CAAG,GAGxD7J,KAAYxF,KAAA,gBAAAA,EAAQ,UAASqP;AACnC,qBAAK,aAAa,IAAI7J,GAAW,oBAAoB,GACrD9J,EAAOyT,GAAU3J,GAAWlJ,CAAK;AAAA,cACrC;AAAA,cAEC,UAAA;AAAA,gBAAA8S,KAAgB,QAAQA,MAAiB,KACpC,gBAAAzS,EAAC,UAAA,EAAO,OAAM,IAAG,UAAU8I,GAAU,UAAU,IAAO,UAAAyJ,EAAA,CAAY,IAClE;AAAA,gBACL9T,EAAQ,IAAI,CAAC4E,MAAW;AACrB,sBAAIA,KAAU,QAAQ,CAAC,OAAO,OAAOA,GAAQ,OAAO;AAChD,0BAAM,IAAI,UAAU,iDAAiD;AAEzE,yBAAO,gBAAArD;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBAEJ,OAAO,OAAOqD,EAAO,KAAK;AAAA,sBAC1B,UAAU,EAAQA,EAAO;AAAA,sBACzB,UAAU,OAAO,GAAGoP,GAAcpP,EAAO,KAAK;AAAA,sBAChD,UAAAA,EAAO,SAAS,OAAOA,EAAO,KAAK;AAAA,oBAAA;AAAA,oBAJ5B,OAAOA,EAAO,KAAK;AAAA,kBAAA;AAAA,gBAKhC,CAAC;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEJ0E,KAAS,OAAO,OAAO,gBAAA/H;AAAA,YAAC;AAAA,YAAA;AAAA,cACrB,IAAI,KAAK;AAAA,cACT,MAAK;AAAA,cACP,iBAAO+H,CAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAExB;AAeJ;AAbI1I,EAlGS+S,IAkGO,YAAW,aAC3B/S,EAnGS+S,IAmGO,sBAAqB,cAErC/S,EArGS+S,IAqGF,cAAa;AAAA,EAChB,CAAC,KAAK,CAAC,gBAAgB,WAAW,CAAC;AAAA,EACnC,CAAC,cAAc,CAAC,SAAS,WAAW,CAAC;AAAA,IAGzC/S,EA1GS+S,IA0GF,OAAM5R;AAAA;AAAA;AAAA;AAAA;AAOjB,SAASoH,GAA0BhK,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAAS+U,GAAWhT,GAAcrB,GAAyB;AACvD,QAAMsS,IAASjR,EAAM;AACrB,MAAIiR,KAAU,QAAQ,OAAO,QAAQ,IAAIA,GAAQ,OAAO,KAAM;AAC1D,UAAM,IAAI,UAAU,GAAGtS,CAAO,wCAAwC;AAE1E,SAAO,QAAQ,IAAIsS,GAAQ,OAAO;AACtC;ACpIO,MAAMgC,WAAgBnV,EAAwB;AAAA,EAKjD,YAAYW,IAAsB,IAAI;AAClC,UAAMA,CAAK;AALN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUtB,EAAU,WAAWK,EAAM,EAAE,GAC5C,KAAK,UAAU,GAAG,KAAK,OAAO,UAC9B,KAAK,eAAeF,EAAmB,MAAME,GAAO,IAAI,eAAe;AAAA,EAC3E;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,SAAoB;AAChB,UAAM;AAAA,MACF,OAAAwB;AAAA,MACA,aAAA2S;AAAA,MACA,MAAAzB,IAAO;AAAA,MACP,MAAAnS;AAAA,MACA,UAAAsC,IAAW;AAAA,MACX,UAAA6H,IAAW;AAAA,MACX,UAAA+J,IAAW;AAAA,MACX,OAAA9K,IAAQ;AAAA,MACR,cAAA+K;AAAA,MACA,WAAAC;AAAA,MACA,WAAAC;AAAA,MACA,WAAAC;AAAA,MACA,SAAAC;AAAA,MACA,WAAApR;AAAA,MACA,UAAAqR;AAAA,MACA,SAAAC;AAAA,MACA,UAAAZ;AAAA,IAAA,IACA,KAAK,OACH5U,IAAQ,KAAK,aAAa,IAAA,KAAS,IAEnCmC,IAAO,KAAK;AAClB,WAAO,gBAAAiB;AAAA,MAACjB;AAAA,MAAA;AAAA,QACJ,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,iBAAemC,IAAW,KAAK;AAAA,QAC/B,iBAAe6H,IAAW,KAAK;AAAA,QAC/B,cAAYf,KAAS,OAAO,OAAO;AAAA,QAElC,UAAA;AAAA,UAAAnI,KAAS,OAAO,OAAO,gBAAAI,EAAC,WAAM,SAAS,KAAK,SAAU,UAAAJ,EAAA,CAAM;AAAA,UAC7D,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,KAAK;AAAA,cACT,MAAArB;AAAA,cACA,MAAAmS;AAAA,cACA,OAAAlT;AAAA,cACA,aAAA2U;AAAA,cACA,UAAAtR;AAAA,cACA,UAAA6H;AAAA,cACA,UAAA+J;AAAA,cACA,cAAAC;AAAA,cACA,WAAAC;AAAA,cACA,WAAAC;AAAA,cACA,WAAAC;AAAA,cACA,SAAAC;AAAA,cACA,KAAKC;AAAA,cACL,cAAYvT,KAAS,OAAOkC,IAAY;AAAA,cACxC,gBAAciG,KAAS,OAAO,OAAO;AAAA,cACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,cAC9C,SAAS,CAACpI,MAAiB;AACvB,sBAAMkJ,IAAY8J,GAAWhT,GAAO,eAAe;AACnD,qBAAK,aAAa,IAAIkJ,GAAW,eAAe,GAChD9J,EAAOqU,GAASvK,GAAWlJ,CAAK;AAAA,cACpC;AAAA,cACA,UAAU,CAACA,MAAiBZ;AAAA,gBACxByT;AAAA,gBACAG,GAAWhT,GAAO,gBAAgB;AAAA,gBAClCA;AAAA,cAAA;AAAA,YACJ;AAAA,UAAA;AAAA,UAEHoI,KAAS,OAAO,OAAO,gBAAA/H;AAAA,YAAC;AAAA,YAAA;AAAA,cACrB,IAAI,KAAK;AAAA,cACT,MAAK;AAAA,cACP,iBAAO+H,CAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAExB;AAmBJ;AAjBI1I,EAlFSuT,IAkFO,YAAW,YAC3BvT,EAnFSuT,IAmFO,sBAAqB,aAErCvT,EArFSuT,IAqFF,cAAa;AAAA,EAChB,CAAC,KAAK,CAAC,gBAAgB,WAAW,CAAC;AAAA,EACnC,CAAC,aAAa,CAAC,SAAS,WAAW,CAAC;AAAA,IAGxCvT,EA1FSuT,IA0FF,OAAMpS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWjB,SAASmS,GAAWhT,GAAcrB,GAAyB;AACvD,QAAMsS,IAASjR,EAAM;AACrB,MAAIiR,KAAU,QAAQ,OAAO,QAAQ,IAAIA,GAAQ,OAAO,KAAM;AAC1D,UAAM,IAAI,UAAU,GAAGtS,CAAO,wCAAwC;AAE1E,SAAO,QAAQ,IAAIsS,GAAQ,OAAO;AACtC;AC9GO,MAAMyC,WAA4C5V,EAA+B;AAAA,EAKpF,YAAYW,IAA6B,IAAI;;AACzC,UAAMA,CAAK;AALN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIL,UAAMZ,IAAUL,EAAM,WAAW,CAAA;AACjC,IAAAkV,GAAsB7U,CAAO;AAC7B,UAAM6T,MAAa7S,IAAAhB,EAAQ,CAAC,MAAT,gBAAAgB,EAAa,OAAM;AAGtC,SAAK,eAAevB;AAAA,MAChB;AAAA,MACAE;AAAA,MACAkU,KAAc;AAAA,MACd;AAAA,IAAA,GAEJ,KAAK,UAAUvU,EAAU,UAAUK,EAAM,EAAE,GAC3C,KAAK,WAAW,GAAG,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,aAAaR,GAAe+B,IAAsB,MAAY;AAC1D,IAAI,KAAK,MAAM,aACf,KAAK,aAAa,IAAI/B,GAAO,wBAAwB,GACrDmB,EAAO,KAAK,MAAM,UAAUnB,GAAO+B,CAAK;AAAA,EAC5C;AAAA,EAEA,SAAoB;AAChB,UAAM;AAAA,MACF,SAAAlB,IAAU,CAAA;AAAA,MACV,OAAAmB;AAAA,MACA,UAAAqB,IAAW;AAAA,MACX,UAAA6H,IAAW;AAAA,IAAA,IACX,KAAK;AACT,IAAAwK,GAAsB7U,CAAO;AAC7B,UAAM8U,IAAgB,KAAK,aAAa,IAAA,GAClCC,IAAgB,KAAK;AAAA,MAAI;AAAA,MAC3B/U,EAAQ,UAAU,CAAC,CAACb,CAAK,MAAM,OAAO,GAAGA,GAAO2V,CAAa,CAAC;AAAA,IAAA;AAElE,WAAO,gBAAAvS;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,UAAAC;AAAA,QACA,WAAWnC,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,uBAAoB;AAAA,QACpB,iBAAemC,IAAW,KAAK;AAAA,QAC/B,iBAAe6H,IAAW,SAAS;AAAA,QAElC,UAAA;AAAA,UAAAlJ,KAAS,OAAO,OAAO,gBAAAI,EAAC,YAAO,IAAI,KAAK,UAAW,UAAAJ,EAAA,CAAM;AAAA,UAC1D,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,aAAU;AAAA,cACV,MAAK;AAAA,cACL,cAAYJ,KAAS,OAAO,KAAK,MAAM,YAAY;AAAA,cACnD,mBAAiBA,KAAS,OAAO,OAAO,KAAK;AAAA,cAE5C,YAAQ,IAAI,CAAC,CAAChC,GAAOqM,CAAW,GAAGhK,MAAU,gBAAAD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAE3C,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,UAAAiB;AAAA,kBACA,gBAAc,OAAO,GAAGsS,GAAe3V,CAAK,IAAI,SAAS;AAAA,kBACzD,cAAY,OAAOA,CAAK;AAAA,kBACxB,UAAUqC,MAAUuT,IAAgB,IAAI;AAAA,kBACxC,SAAS,CAAC7T,MAAsB,KAAK,aAAa/B,GAAO+B,CAAK;AAAA,kBAC9D,WAAW,CAACA,MACR,KAAK,cAAcA,GAAOM,GAAOxB,CAAO;AAAA,kBAC9C,UAAAwL;AAAA,gBAAA;AAAA,gBAVO,OAAOrM,CAAK;AAAA,cAAA,CAUE;AAAA,YAAA;AAAA,UAAA;AAAA,QAC3B;AAAA,MAAA;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,cACI+B,GACAM,GACAxB,GACI;AACJ,UAAM,EAAC,KAAAmI,MAAOjH;AACd,QAAI6F;AACJ,QAAIoB,MAAQ,gBAAgBA,MAAQ,YAAa,CAAApB,KAAavF,IAAQ,KAAKxB,EAAQ;AAAA,aAC1EmI,MAAQ,eAAeA,MAAQ;AACpC,MAAApB,KAAavF,IAAQ,IAAIxB,EAAQ,UAAUA,EAAQ;AAAA,aAC5CmI,MAAQ,OAAQ,CAAApB,IAAY;AAAA,aAC9BoB,MAAQ,MAAO,CAAApB,IAAY/G,EAAQ,SAAS;AAAA,QAChD;AAEL,IAAAkB,EAAM,eAAA;AACN,UAAM0D,IAAS5E,EAAQ+G,CAAS;AAChC,QAAInC,KAAU,SACd,KAAK,aAAaA,EAAO,CAAC,GAAG1D,CAAK,GAC9B,KAAK,eAAe,UAAS;AAC7B,YAAM8T,IAAQ,KAAK,IAAI,iBAA8B,gBAAgB,EAAEjO,CAAS;AAChF,MAAAiO,KAAA,QAAAA,EAAO;AAAA,IACX;AAAA,EACJ;AAoBJ;AAlBIpU,EAnGSgU,IAmGF,cAAa;AAAA,EAChB,CAAC,iEAAiE,CAAC,QAAQ,CAAC;AAAA,EAC5E,CAAC,wDAAwD,CAAC,UAAU,QAAQ,CAAC;AAAA,IAGjFhU,EAxGSgU,IAwGF,OAAM7S;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAejB,SAAS8S,GACL7U,GACkD;AAClD,EAAAS,GAAuBT,CAAO;AAC9B,aAAW4E,KAAU5E;AACjB,QAAI,CAAC,MAAM,QAAQ4E,CAAM,KAAKA,EAAO,SAAS;AAC1C,YAAM,IAAI,UAAU,8CAA8C;AAG9E;AClJO,MAAMqQ,WAAgBjW,EAAwB;AAAA,EACjD,SAAoB;AAChB,UAAM;AAAA,MACF,UAAAiE,IAAW,CAAA;AAAA,MACX,IAAAjB;AAAA,MACA,OAAAb,IAAQ;AAAA,MACR,aAAA+B,IAAc;AAAA,IAAA,IACd,KAAK;AACT,QAAI,CAAC,CAAC,cAAc,UAAU,EAAE,SAASA,CAAW;AAChD,YAAM,IAAI,UAAU,oDAAoD;AAG5E,UAAM5B,IAAO,KAAK;AAClB,WAAO,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,IAAAU;AAAA,QACA,MAAK;AAAA,QACL,WAAW7B,EAAW,eAAeE,EAAe,KAAK,KAAK,CAAC;AAAA,QAC/D,oBAAkB6C;AAAA,QAClB,cAAY/B;AAAA,QACZ,oBAAkB+B;AAAA,QACpB,UAAAD;AAAA,MAAA;AAAA,IAAA;AAAA,EACN;AAmBJ;AAjBIrC,EAvBSqU,IAuBO,YAAW,YAC3BrU,EAxBSqU,IAwBO,sBAAqB,aAErCrU,EA1BSqU,IA0BF,OAAMlT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACpBV,MAAMmT,WAAoBlW,EAA4B;AAAA,EAGzD,YAAYW,GAAyB;AACjC,UAAMA,CAAK;AAHN,IAAAiB,EAAA;AAIL,aAAK,aAAatB,EAAU,YAAYK,EAAM,EAAE,GAC5CA,EAAM,gBAAgB,QAAQ,CAACwJ,GAAkBxJ,EAAM,YAAY;AACnE,YAAM,IAAI,UAAU,qDAAqD;AAAA,EAEjF;AAAA,EAEA,SAAoB;AAChB,UAAMwV,IAAM,KAAK,MAAM,OAAO;AAC9B,QAAI,CAAC,OAAO,SAASA,CAAG,KAAKA,KAAO;AAChC,YAAM,IAAI,WAAW,kDAAkD;AAE3E,UAAMC,IAAc,KAAK,MAAM,gBAAgB,OACxC,KAAK,MAAM,SAAS,OACrB,KAAK,KAAK,KAAK,MAAM,YAAY;AACvC,QAAIA,KAAe,SAAS,CAAC,OAAO,SAASA,CAAW,KAAKA,IAAc;AACvE,YAAM,IAAI,WAAW,gEAAgE;AAEzF,UAAMjW,IAAQiW,KAAe,OAAO,OAAO,KAAK,IAAIA,GAAaD,CAAG,GAC9DE,IAAY,KAAK,MAAM,cAAclW,KAAS,OAC9C,gBACA,GAAG,KAAK,MAAMA,IAAQgW,IAAM,GAAG,CAAC,MAChC7T,IAAO,KAAK;AAClB,6BAAQA,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAClD,UAAA;AAAA,MAAA,gBAAAkC,EAAC,OAAA,EAAI,aAAU,cACX,UAAA;AAAA,QAAA,gBAAAhB,EAAC,WAAM,SAAS,KAAK,YAAa,UAAA,KAAK,MAAM,OAAM;AAAA,QACnD,gBAAAA,EAAC,YAAQ,UAAA8T,EAAA,CAAU;AAAA,MAAA,GACvB;AAAA,MACA,gBAAA9T;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAI,KAAK;AAAA,UACT,OAAOpC,KAAgB;AAAA,UACvB,KAAAgW;AAAA,UACA,kBAAgBE;AAAA,UAClB,UAAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAAU,GAChB;AAAA,EACJ;AA4BJ;AA1BIzU,EAzCSsU,IAyCO,YAAW,iBAC3BtU,EA1CSsU,IA0CO,sBAAqB,iBAErCtU,EA5CSsU,IA4CF,OAAMnT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBjB,SAASoH,GAAkBhK,GAAkE;AACzF,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AC1DO,MAAMmW,KAA2B,OAAO,OAAO;AAAA,EAClD,GAAGC,GAAY,SAAS;AAAA,EACxB,GAAGA,GAAY,WAAW;AAAA,EAC1B,GAAGA,GAAY,SAAS;AAAA,EACxBC,EAAS,qBAAqB,WAAW,WAAW,SAAS,wBAAwB,uBAAuB;AAAA,EAC5GA,EAAS,2BAA2B,WAAW,WAAW,SAAS,uBAAuB,uBAAuB;AAAA,EACjHA,EAAS,0BAA0B,WAAW,WAAW,SAAS,sBAAsB,uBAAuB;AAAA,EAC/GA,EAAS,uBAAuB,WAAW,aAAa,SAAS,0BAA0B,yBAAyB;AAAA,EACpHA,EAAS,6BAA6B,WAAW,aAAa,SAAS,yBAAyB,yBAAyB;AAAA,EACzHA,EAAS,4BAA4B,WAAW,aAAa,SAAS,wBAAwB,yBAAyB;AAAA,EACvHA,EAAS,qBAAqB,WAAW,WAAW,SAAS,wBAAwB,uBAAuB;AAAA,EAC5GA,EAAS,2BAA2B,WAAW,WAAW,SAAS,uBAAuB,uBAAuB;AAAA,EACjHA,EAAS,0BAA0B,WAAW,WAAW,SAAS,sBAAsB,uBAAuB;AAAA,EAC/GA,EAAS,mBAAmB,WAAW,YAAY,SAAS,gBAAgB;AAAA,EAC5EA,EAAS,kBAAkB,WAAW,YAAY,SAAS,eAAe;AAAA,EAC1EA,EAAS,4BAA4B,WAAW,YAAY,SAAS,gCAAgC,iBAAiB;AAAA,EACtHA,EAAS,2BAA2B,WAAW,YAAY,SAAS,+BAA+B,gBAAgB;AAAA,EACnHA,EAAS,iBAAiB,WAAW,OAAO,SAAS,mBAAmB;AAAA,EACxEA,EAAS,mBAAmB,WAAW,OAAO,SAAS,qBAAqB;AAAA,EAE5EA,EAAS,iBAAiB,SAAS,cAAc,QAAQ,eAAe;AAAA,EACxEA,EAAS,eAAe,SAAS,cAAc,aAAa,mBAAmB;AAAA,EAC/EA,EAAS,iBAAiB,SAAS,cAAc,aAAa,qBAAqB;AAAA,EACnFA,EAAS,wBAAwB,SAAS,WAAW,aAAa,wBAAwB;AAAA,EAC1FA,EAAS,cAAc,SAAS,WAAW,aAAa,qBAAqB;AAAA,EAC7EA,EAAS,cAAc,SAAS,WAAW,aAAa,eAAe;AAAA,EACvEA,EAAS,cAAc,SAAS,WAAW,aAAa,gBAAgB;AAAA,EACxEA,EAAS,cAAc,SAAS,WAAW,aAAa,eAAe;AAAA,EACvEA,EAAS,eAAe,SAAS,SAAS,UAAU,qBAAqB;AAAA,EACzEA,EAAS,eAAe,SAAS,SAAS,UAAU,wBAAwB;AAAA,EAC5EA,EAAS,eAAe,SAAS,SAAS,UAAU,qBAAqB;AAAA,EACzEA,EAAS,iBAAiB,SAAS,UAAU,YAAY,6BAA6B;AAAA,EAEtFA,EAAS,mBAAmB,SAAS,WAAW,cAAc,uBAAuB;AAAA,EACrFA,EAAS,cAAc,SAAS,WAAW,SAAS,iBAAiB;AAAA,EACrEA,EAAS,eAAe,SAAS,WAAW,UAAU,mBAAmB;AAAA,EACzEA,EAAS,eAAe,SAAS,WAAW,UAAU,uBAAuB;AAAA,EAC7EA,EAAS,gBAAgB,SAAS,SAAS,UAAU,qBAAqB;AAAA,EAC1EA,EAAS,iBAAiB,SAAS,SAAS,SAAS,sBAAsB;AAAA,EAC3EA,EAAS,iBAAiB,SAAS,UAAU,SAAS,mBAAmB;AAAA,EACzEA,EAAS,oBAAoB,SAAS,UAAU,SAAS,6BAA6B;AAAA,EACtFA,EAAS,mBAAmB,SAAS,UAAU,SAAS,qBAAqB;AAAA,EAE7EA,EAAS,sBAAsB,SAAS,SAAS,cAAc,iBAAiB,iBAAiB;AAAA,EACjGA,EAAS,iBAAiB,SAAS,SAAS,SAAS,iBAAiB,YAAY;AAAA,EAClFA,EAAS,kBAAkB,SAAS,SAAS,UAAU,gBAAgB,aAAa;AAAA,EACpFA,EAAS,kBAAkB,SAAS,SAAS,UAAU,gBAAgB,aAAa;AAAA,EACpFA,EAAS,kBAAkB,SAAS,SAAS,UAAU,gBAAgB,aAAa;AAAA,EACpFA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB,gBAAgB;AAAA,EAChGA,EAAS,gCAAgC,SAAS,UAAU,cAAc,gBAAgB;AAAA,EAE1FA,EAAS,uBAAuB,SAAS,UAAU,cAAc,wBAAwB;AAAA,EACzFA,EAAS,kBAAkB,SAAS,UAAU,SAAS,wBAAwB;AAAA,EAC/EA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB;AAAA,EAChFA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB;AAAA,EAChFA,EAAS,+BAA+B,SAAS,UAAU,cAAc,0BAA0B,qBAAqB;AAAA,EACxHA,EAAS,0BAA0B,SAAS,UAAU,SAAS,0BAA0B,gBAAgB;AAAA,EACzGA,EAAS,2BAA2B,SAAS,UAAU,UAAU,yBAAyB,iBAAiB;AAAA,EAC3GA,EAAS,2BAA2B,SAAS,UAAU,UAAU,yBAAyB,iBAAiB;AAAA,EAC3GA,EAAS,6BAA6B,SAAS,UAAU,cAAc,wBAAwB,6BAA6B;AAAA,EAC5HA,EAAS,wBAAwB,SAAS,UAAU,SAAS,wBAAwB,wBAAwB;AAAA,EAC7GA,EAAS,6BAA6B,SAAS,UAAU,cAAc,wBAAwB,6BAA6B;AAAA,EAC5HA,EAAS,wBAAwB,SAAS,UAAU,SAAS,wBAAwB,wBAAwB;AAAA,EAC7GA,EAAS,8BAA8B,SAAS,UAAU,cAAc,yBAAyB,6BAA6B;AAAA,EAC9HA,EAAS,yBAAyB,SAAS,UAAU,SAAS,yBAAyB,wBAAwB;AAAA,EAE/GA,EAAS,uBAAuB,SAAS,UAAU,cAAc,wBAAwB;AAAA,EACzFA,EAAS,6BAA6B,SAAS,UAAU,cAAc,wBAAwB;AAAA,EAC/FA,EAAS,8BAA8B,SAAS,UAAU,cAAc,wBAAwB;AAAA,EAChGA,EAAS,gCAAgC,SAAS,UAAU,cAAc,yBAAyB;AAAA,EACnGA,EAAS,kBAAkB,SAAS,UAAU,SAAS,wBAAwB;AAAA,EAC/EA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB;AAAA,EAChFA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB;AAAA,EAChFA,EAAS,0BAA0B,SAAS,UAAU,UAAU,uBAAuB;AAAA,EACvFA,EAAS,8BAA8B,SAAS,UAAU,cAAc,yBAAyB,qBAAqB;AAAA,EACtHA,EAAS,sCAAsC,SAAS,UAAU,cAAc,0BAA0B,wBAAwB;AAAA,EAClIA,EAAS,2BAA2B,SAAS,UAAU,cAAc,eAAe,qBAAqB;AAAA,EACzGA,EAAS,kCAAkC,SAAS,UAAU,cAAc,sBAAsB,yBAAyB;AAAA,EAC3HA,EAAS,4BAA4B,SAAS,UAAU,cAAc,uBAAuB,qBAAqB;AAAA,EAClHA,EAAS,iCAAiC,SAAS,UAAU,cAAc,kCAAkC,qBAAqB;AAAA,EAClIA,EAAS,oCAAoC,SAAS,UAAU,cAAc,+BAA+B,qBAAqB;AAAA,EAElIA,EAAS,sBAAsB,SAAS,SAAS,cAAc,eAAe;AAAA,EAC9EA,EAAS,iBAAiB,SAAS,SAAS,SAAS,eAAe;AAAA,EACpEA,EAAS,kBAAkB,SAAS,SAAS,UAAU,cAAc;AAAA,EACrEA,EAAS,kBAAkB,SAAS,SAAS,UAAU,cAAc;AAAA,EACrEA,EAAS,+BAA+B,SAAS,SAAS,cAAc,wBAAwB;AAAA,EAChGA,EAAS,0BAA0B,SAAS,SAAS,SAAS,wBAAwB;AAAA,EAEtFA,EAAS,0BAA0B,SAAS,aAAa,cAAc,uBAAuB;AAAA,EAC9FA,EAAS,qBAAqB,SAAS,aAAa,SAAS,uBAAuB;AAAA,EACpFA,EAAS,0BAA0B,SAAS,OAAO,cAAc,6BAA6B;AAAA,EAC9FA,EAAS,0BAA0B,SAAS,SAAS,cAAc,uBAAuB;AAAA,EAC1FA,EAAS,8BAA8B,SAAS,SAAS,cAAc,wBAAwB;AAAA,EAE/FA,EAAS,6BAA6B,SAAS,YAAY,cAAc,0BAA0B,oBAAoB;AAAA,EACvHA,EAAS,qCAAqC,SAAS,YAAY,cAAc,wBAAwB,wBAAwB;AAAA,EACjIA,EAAS,yBAAyB,SAAS,YAAY,UAAU,uBAAuB,gBAAgB;AAAA,EACxGA,EAAS,2BAA2B,SAAS,YAAY,SAAS,mBAAmB,mBAAmB;AAAA,EACxGA,EAAS,sBAAsB,SAAS,SAAS,cAAc,+BAA+B,4BAA4B;AAAA,EAC1HA,EAAS,8BAA8B,SAAS,SAAS,cAAc,gCAAgC,wBAAwB;AAAA,EAE/HA,EAAS,wBAAwB,SAAS,WAAW,cAAc,mBAAmB,oBAAoB;AAAA,EAC1GA,EAAS,mBAAmB,SAAS,WAAW,SAAS,mBAAmB,eAAe;AAAA,EAC3FA,EAAS,oBAAoB,SAAS,WAAW,UAAU,kBAAkB,gBAAgB;AAAA,EAC7FA,EAAS,oBAAoB,SAAS,WAAW,UAAU,kBAAkB,gBAAgB;AAAA,EAC7FA,EAAS,wBAAwB,SAAS,QAAQ,cAAc,qBAAqB,oBAAoB;AAAA,EACzGA,EAAS,2BAA2B,SAAS,QAAQ,cAAc,sBAAsB,oBAAoB;AAAA,EAC7GA,EAAS,+BAA+B,SAAS,YAAY,cAAc,gBAAgB;AAAA,EAC3FA,EAAS,+BAA+B,SAAS,YAAY,cAAc,gBAAgB;AAAA,EAC3FA,EAAS,8BAA8B,SAAS,UAAU,cAAc,+BAA+B;AAAA,EACvGA,EAAS,kBAAkB,SAAS,WAAW,SAAS,4BAA4B,mBAAmB;AAAA,EACvGA,EAAS,mBAAmB,SAAS,WAAW,SAAS,6BAA6B,yBAAyB;AAAA,EAC/GA,EAAS,kBAAkB,SAAS,WAAW,SAAS,4BAA4B,wBAAwB;AAAA,EAC5GA,EAAS,sBAAsB,SAAS,WAAW,SAAS,4BAA4B,0BAA0B;AACtH,CAAkD,GAErCC,KAAmB,OAAO,OAAO;AAAA,EAC1C7Q,EAAO,SAAS,SAAS8Q,EAAoB,wBAAwB,CAAC;AAAA,EACtE9Q,EAAO,QAAQ,QAAQ8Q,EAAoB,uBAAuB,CAAC;AAAA,EACnE9Q,EAAO,WAAW,WAAW8Q,EAAoB,0BAA0B,CAAC;AAChF,CAAC,GAEYC,KAAmB,OAAO,OAAO;AAAA,EAC1C/Q,EAAO,WAAW,YAAY8Q,EAAoB,2BAA2B,CAAC;AAAA,EAC9E9Q,EAAO,SAAS,SAAS8Q,EAAoB,yBAAyB,CAAC;AAAA,EACvE9Q,EAAO,SAAS,SAAS8Q,EAAoB,yBAAyB,CAAC;AAAA,EACvE9Q,EAAO,QAAQ,QAAQ8Q,EAAoB,wBAAwB,CAAC;AAAA,EACpE9Q,EAAO,UAAU,UAAU8Q,EAAoB,0BAA0B,CAAC;AAAA,EAC1E9Q,EAAO,UAAU,UAAU8Q,EAAoB,0BAA0B,CAAC;AAAA,EAC1E9Q,EAAO,OAAO,OAAO8Q,EAAoB,uBAAuB,CAAC;AAAA,EACjE9Q,EAAO,UAAU,UAAU8Q,EAAoB,0BAA0B,CAAC;AAC9E,CAAC;AAGM,SAASE,GACZC,GACAC,GACAC,IAA2B,WAAW,UACvB;AAEf,MADAC,GAAaF,CAAS,IAClBC,KAAA,gBAAAA,EAAgB,SAAQ,QAAQA,EAAe,mBAAmB;AAClE,UAAM,IAAI,UAAU,gEAAgE;AAGxF,QAAME,IAAW,8BAA8BJ,CAAI;AACnD,MAAIK,IAAOH,EAAe,KAAK,cAA+BE,CAAQ;AACtE,SAAIC,KAAQ,SACRA,IAAOH,EAAe,cAAc,MAAM,GAC1CG,EAAK,MAAM,cACXA,EAAK,QAAQ,iBAAiBL,GAC9BE,EAAe,KAAK,OAAOG,CAAI,IAEnCA,EAAK,QAAQ,gBAAgBJ,EAAU,OACnCI,EAAK,aAAa,MAAM,MAAMJ,EAAU,QAAMI,EAAK,aAAa,QAAQJ,EAAU,IAAI,GAEtFD,MAAS,UAASE,EAAe,gBAAgB,QAAQ,QAAQD,EAAU,QAC1EC,EAAe,gBAAgB,QAAQ,QAAQD,EAAU,OACvDI;AACX;AAEO,SAASC,GACZnW,GACAb,GACoB;AACpB,QAAM2W,IAAY9V,EAAQ,KAAK,CAAC4E,MAAWA,EAAO,UAAUzF,CAAK;AACjE,MAAI2W,KAAa,KAAM,OAAM,IAAI,WAAW,sCAAsC3W,CAAK,EAAE;AACzF,SAAO2W;AACX;AAEA,SAASN,EACLtV,GACAkW,GACAC,GACAlX,GACAyT,GACAhT,GAC2B;AAC3B,SAAOA,KAAY,OACb,OAAO,OAAO,EAAC,MAAAM,GAAM,OAAAkW,GAAO,QAAAC,GAAQ,OAAAlX,GAAO,aAAAyT,EAAA,CAAY,IACvD,OAAO,OAAO,EAAC,MAAA1S,GAAM,OAAAkW,GAAO,QAAAC,GAAQ,OAAAlX,GAAO,aAAAyT,GAAa,UAAAhT,GAAS;AAC3E;AAEA,SAAS2V,GAAYc,GAA6C;AAC9D,SAAO,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,IAAI,CAACC;;AAC/D,WAAAd;AAAA,MACI,aAAaa,CAAM,IAAIC,CAAI;AAAA,MAC3B;AAAA,MACAD;AAAA,MACA;AAAA,MACA,IAAGrV,IAAAqV,EAAO,CAAC,MAAR,gBAAArV,EAAW,aAAa,GAAGqV,EAAO,MAAM,CAAC,CAAC,iBAAiBC,CAAI;AAAA,IAAA;AAAA,GACrE;AACT;AAEA,SAAS1R,EAAOzF,GAAegC,GAAeoV,GAAoC;AAC9E,SAAO,OAAO,OAAO,EAAC,OAAApX,GAAO,OAAAgC,GAAO,MAAAoV,GAAK;AAC7C;AAQA,SAASb,EAAoBc,GAAsB;AAC/C,QAAMC,IAAsB,YAAY,IAAI,SAAS,eAAe,IAC9D,SAASD,CAAI,KACb,MAAMA,CAAI;AAChB,SAAO,IAAI,IAAIC,GAAqB,YAAY,GAAG,EAAE;AACzD;AAEA,SAAST,GAAapR,GAAyD;AAC3E,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACpC,UAAM,IAAI,UAAU,6CAA6C;AAErE,aAAWuI,KAAS,CAAC,SAAS,SAAS,MAAM;AACzC,QAAI,OAAO,QAAQ,IAAIvI,GAAQuI,CAAK,KAAM,YACnC,OAAO,QAAQ,IAAIvI,GAAQuI,CAAK,CAAC,EAAE,WAAW;AACjD,YAAM,IAAI,UAAU,0BAA0BA,CAAK,6BAA6B;AAG5F;AC9NA,MAAeuJ,WAAyB1X,EAAiC;AAAA,EAMrE,YACIW,GACAkW,GACAc,GACF;;AACE,UAAMhX,CAAK;AAVN,IAAAiB,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AAQb,UAAMZ,IAAUL,EAAM,WAAWgX;AACjC,IAAAC,GAAgB5W,CAAO;AACvB,UAAMJ,KAAWoB,IAAAhB,EAAQ,CAAC,MAAT,gBAAAgB,EAAY;AAC7B,QAAIpB,KAAY,KAAM,OAAM,IAAI,UAAU,GAAGiW,CAAI,sCAAsC;AACvF,SAAK,OAAOA,GACZ,KAAK,WAAWc,GAChB,KAAK,UAAUrX,EAAU,GAAGuW,CAAI,WAAWlW,EAAM,EAAE,GACnD,KAAK,eAAeF,EAAmB,MAAME,GAAOC,GAAU,GAAGiW,CAAI,YAAY,GACjFM,GAAyBnW,GAAS,KAAK,aAAa,IAAA,CAAK;AAAA,EAC7D;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,SAAoB;AAChB,UAAMA,IAAU,KAAK,SACfsC,IAAW6T,GAAyBnW,GAAS,KAAK,aAAa,KAAK,GACpE,EAAC,OAAAmB,GAAO,WAAAkC,GAAW,UAAAb,IAAW,IAAO,UAAAuR,EAAA,IAAY,KAAK,OACtDzS,IAAO,KAAK;AAClB,WAAO,gBAAAiB;AAAA,MAACjB;AAAA,MAAA;AAAA,QACJ,WAAWnB,EAAW,eAAeE,EAAe,KAAK,KAAK,CAAC;AAAA,QAC/D,aAAW,KAAK;AAAA,QAChB,iBAAemC,IAAW,KAAK;AAAA,QAE9B,UAAA;AAAA,UAAArB,KAAS,OAAO,OAAO,gBAAAI,EAAC,WAAM,SAAS,KAAK,SAAU,UAAAJ,EAAA,CAAM;AAAA,UAC7D,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,KAAK;AAAA,cACT,OAAOe,EAAS;AAAA,cAChB,UAAAE;AAAA,cACA,cAAYrB,KAAS,OAAOkC,IAAY;AAAA,cACxC,UAAU,CAACnC,MAAiB;AACxB,sBAAM/B,IAAQ2V,GAAc5T,CAAK,GAC3B0D,IAASuR,GAAyBnW,GAASb,CAAK;AACtD,qBAAK,aAAa,IAAIA,GAAO,GAAG,KAAK,IAAI,WAAW,GACpDmB,EAAOyT,GAAU5U,GAAOyF,GAAQ1D,CAAK;AAAA,cACzC;AAAA,cAEC,UAAAlB,EAAQ,IAAI,CAAC4E,MAAW,gBAAArD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEtB,OAAOqD,EAAO;AAAA,kBACd,UAAUA,EAAO,UAAUtC,EAAS;AAAA,kBACtC,UAAAsC,EAAO;AAAA,gBAAA;AAAA,gBAHAA,EAAO;AAAA,cAAA,CAGQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAC5B;AAAA,MAAA;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,aAAmB;AACf,SAAK,eAAA;AAAA,EACT;AAAA,EAEA,cAAoB;AAChB,SAAK,eAAA;AAAA,EACT;AAAA,EAEA,IAAc,UAA2C;AACrD,UAAM5E,IAAU,KAAK,MAAM,WAAW,KAAK;AAC3C,WAAA4W,GAAgB5W,CAAO,GAChBA;AAAA,EACX;AAAA,EAEQ,iBAAuB;AAC3B,UAAM+V,IAAiB,KAAK,MAAM,mBAC1B,OAAO,WAAa,MAAc,OAAO;AACjD,IAAIA,KAAkB,QACtBH;AAAA,MACI,KAAK;AAAA,MACLO,GAAyB,KAAK,SAAS,KAAK,aAAa,KAAK;AAAA,MAC9DJ;AAAA,IAAA;AAAA,EAER;AAgBJ;AAdInV,EApFW8V,IAoFJ,cAAa;AAAA,EAChB,CAAC,KAAK,CAAC,gBAAgB,WAAW,CAAC;AAAA,EACnC,CAAC,cAAc,CAAC,SAAS,WAAW,CAAC;AAAA,IAGzC9V,EAzFW8V,IAyFJ,OAAM3U;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWV,MAAM8U,WAAoBH,GAAiB;AAAA,EAC9C,YAAY/W,IAA+B,IAAI;AAC3C,UAAMA,GAAO,SAAS8V,EAAgB;AAAA,EAC1C;AAIJ;AAFI7U,EALSiW,IAKO,YAAW,iBAC3BjW,EANSiW,IAMO,sBAAqB;AAGlC,MAAMC,WAAoBJ,GAAiB;AAAA,EAC9C,YAAY/W,IAA+B,IAAI;AAC3C,UAAMA,GAAO,UAAUgW,EAAgB;AAAA,EAC3C;AAIJ;AAFI/U,EALSkW,IAKO,YAAW,iBAC3BlW,EANSkW,IAMO,sBAAqB;AAGzC,SAASF,GACL5W,GACkD;AAClD,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,UAAM,IAAI,UAAU,qDAAqD;AAE7E,QAAMI,wBAAa,IAAA;AACnB,aAAWwE,KAAU5E,GAAS;AAC1B,QAAI4E,KAAU,QAAQ,OAAOA,KAAW;AACpC,YAAM,IAAI,UAAU,2CAA2C;AAEnE,eAAWuI,KAAS,CAAC,SAAS,SAAS,MAAM;AACzC,UAAI,OAAOvI,EAAOuI,CAAK,KAAM,YAAYvI,EAAOuI,CAAK,EAAE,WAAW;AAC9D,cAAM,IAAI,UAAU,4BAA4BA,CAAK,mBAAmB;AAGhF,QAAI/M,EAAO,IAAIwE,EAAO,KAAK;AACvB,YAAM,IAAI,MAAM,sCAAsCA,EAAO,KAAK,EAAE;AAExE,IAAAxE,EAAO,IAAIwE,EAAO,KAAK;AAAA,EAC3B;AACJ;AAEA,SAASkQ,GAAc5T,GAAsB;AACzC,QAAM/B,IAAQ+B,EAAM,iBAAiB,OAC/B,OACA,QAAQ,IAAIA,EAAM,eAAe,OAAO;AAC9C,MAAI,OAAO/B,KAAU;AACjB,UAAM,IAAI,UAAU,oDAAoD;AAE5E,SAAOA;AACX;"}
|