@sylwellsoftware/fray 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/routing/RouteScope.tsx","../src/Components/layout/routedSelection.ts","../src/Components/layout/tabpanel/tabpanel.tsx","../src/routing/route.ts","../src/routing/RouteLink.tsx","../src/Components/navigation/navigationBar.tsx","../src/Components/app/app.tsx","../src/Components/layout/header.tsx","../src/Components/layout/groupPanel.tsx","../src/Components/layout/optionGroup.tsx","../src/Components/layout/optionsPanel.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/CheckableControl.ts","../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/LabeledInputControl.ts","../src/Components/lineinputs/SelectControl.ts","../src/Components/lineinputs/dropdown.tsx","../src/Components/lineinputs/label.tsx","../src/Components/lineinputs/radio.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","../src/routing/navigationAdapter.ts","../src/routing/router.ts","../src/routing/RouteOutlet.tsx","../src/routing/RouteQuery.tsx","../src/routing/RouteValue.tsx"],"sourcesContent":["import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport type {LiteralRouteDescriptor} from '../../../routing/route.js'\n\nexport interface TabProps extends ComponentProps {\n id?: Key\n label?: FrayChild\n disabled?: boolean\n route?: LiteralRouteDescriptor\n}\n\n/** Declarative content marker consumed by TabPanel. */\nexport class Tab extends Component<TabProps> {\n static override liveProps: readonly string[] = []\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 /** @internal Lets TabPanel route activation before changing the value. */\n onSelectTab?: (tab: TabLineTab, event: Event | null) => void\n}\n\nexport class TabLine extends Component<TabLineProps> {\n static override liveProps: readonly string[] = []\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 if (this.props.onSelectTab == null) {\n this.valueEmitter.set(tab.id, 'tab selected')\n } else {\n this.props.onSelectTab(tab, event)\n }\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\n static override css = css`\n & {\n display: flex;\n background: var(--tabline-background);\n flex-flow: row wrap;\n overflow: hidden;\n padding-top: 3px;\n padding-inline-start: var(--tabline-padding-inline-start);\n flex: 0 0 auto;\n z-index: 0;\n }\n\n & > button[role=\"tab\"] {\n position: relative;\n min-height: calc(var(--control-min-height, 2rem) - 5px);\n padding-block: 0;\n padding-inline: var(--space-sm);\n color: var(--button-color);\n background: var(--tab-button-background);\n border: none;\n border-radius: var(--radius-md) var(--radius-md) 0 0;\n box-shadow: var(--tab-button-shadow);\n box-sizing: border-box;\n align-self: flex-end;\n cursor: default;\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n margin-block-start: 3px;\n user-select: none;\n white-space: nowrap;\n }\n\n & > button[role=\"tab\"]:hover:not(:disabled)[aria-selected=\"false\"] {\n background: var(--button-background-hover);\n }\n\n & > button[role=\"tab\"]:not(:disabled)[aria-selected=\"true\"] {\n min-height: var(--control-min-height, 2rem);\n padding-block-start: 3px;\n background: var(--tab-button-background-active);\n box-shadow: var(--tab-button-shadow-active);\n margin-block-start: 0;\n z-index: 1;\n }\n\n & > button[role=\"tab\"]:not(:disabled)[aria-selected=\"false\"]::after {\n content: '';\n position: absolute;\n inset-inline: 0;\n block-size: 1px;\n inset-block-end: -1px;\n box-shadow: var(--tab-button-inactive-bottom-shadow);\n z-index: 1;\n }\n\n & > button[role=\"tab\"]:disabled {\n color: var(--input-color-disabled);\n background: var(--button-background-disabled);\n border: var(--button-border-disabled);\n cursor: not-allowed;\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, Fragment, h} from '../Components/component.js'\nimport type {ComponentProps, FrayChild} from '../Components/component.js'\nimport type {ResolvedRoute} from './router.js'\n\nexport interface RouteScopeProps extends ComponentProps {\n /** Resolved contextual route inherited by every nested component. */\n context: ResolvedRoute\n}\n\n/** Context carrier used by route-aware controls and advanced compositions. */\nexport class RouteScope extends Component<RouteScopeProps> {\n static override liveProps: readonly string[] = []\n private closeScope: (() => void) | null = null\n\n initialize(): void {\n const router = this._runtime.router\n if (router == null) throw new Error('RouteScope requires a router in FrayRuntime')\n this.closeScope = router.openScope(this.props.context, this)\n }\n\n render(): FrayChild {\n return h(Fragment, null, this.props.children ?? [])\n }\n\n override afterMount(): void {\n this._runtime.router?.completeScope(this.props.context, this)\n }\n\n override _routeContextForChildren(): ResolvedRoute {\n return this.props.context\n }\n\n override onDestroy(): void {\n this.closeScope?.()\n this.closeScope = null\n }\n}\n","import type {FrayChild, Key} from '../component.js'\nimport {Component, h} from '../component.js'\nimport type {ValueEmitter} from '../controlUtils.js'\nimport {RouteScope} from '../../routing/RouteScope.js'\nimport type {LiteralRouteDescriptor} from '../../routing/route.js'\nimport type {BrowserRouter, ResolvedRoute} from '../../routing/router.js'\n\nexport type ContentMountPolicy = 'eager' | 'lazy' | 'active-only'\n\nexport interface RoutedSelectionItem {\n id: Key\n disabled: boolean\n route?: LiteralRouteDescriptor\n}\n\ninterface RoutedSelectionOptions {\n subject: string\n restoredCause: string\n pendingCause: string\n selectedCause: string\n}\n\n/** @internal Shared literal-route and mounted-content lifecycle for selection owners. */\nexport class RoutedSelectionController<TItem extends RoutedSelectionItem> {\n private routeContexts = new Map<LiteralRouteDescriptor, ResolvedRoute>()\n private readonly mountedIds = new Set<Key>()\n private registeredRouter: BrowserRouter | null = null\n private registeredParent: ResolvedRoute | null = null\n\n constructor(\n private readonly owner: Component,\n readonly valueEmitter: ValueEmitter<Key | null>,\n private readonly options: RoutedSelectionOptions,\n ) {}\n\n prepare(items: readonly TItem[]): void {\n this.registerRoutes(items)\n const requested = this.pendingItem(items)\n if (requested != null) {\n this.valueEmitter.set(requested.id, this.options.pendingCause)\n } else if (!items.some(({id}) => Object.is(id, this.valueEmitter.get()))) {\n this.valueEmitter.set(items.find((item) => !item.disabled)?.id ?? null)\n }\n }\n\n selected(items: readonly TItem[]): TItem | null {\n return items.find(({id}) => Object.is(id, this.valueEmitter.get()))\n ?? items.find((item) => !item.disabled)\n ?? null\n }\n\n updateMounted(items: readonly TItem[], policy: ContentMountPolicy): ReadonlySet<Key> {\n const availableIds = new Set(items.map(({id}) => id))\n for (const id of this.mountedIds) {\n if (!availableIds.has(id)) this.mountedIds.delete(id)\n }\n\n const selectedId = this.selected(items)?.id\n if (policy === 'eager') {\n for (const {id} of items) this.mountedIds.add(id)\n } else {\n if (policy === 'active-only') this.mountedIds.clear()\n if (selectedId !== undefined) this.mountedIds.add(selectedId)\n }\n return this.mountedIds\n }\n\n select(item: TItem): void {\n const context = item.route == null ? null : this.routeContexts.get(item.route)\n if (context == null) {\n this.valueEmitter.set(item.id, this.options.selectedCause)\n } else {\n void this.registeredRouter?.navigate(context)\n }\n }\n\n scopedContent(item: TItem, content: FrayChild): FrayChild {\n const context = item.route == null ? null : this.routeContexts.get(item.route)\n return context == null\n ? content\n : h(RouteScope, {key: context.pathname, context}, content)\n }\n\n dispose(): void {\n if (this.registeredRouter != null && this.registeredParent != null) {\n this.registeredRouter.unregisterRoutes(this.registeredParent, this.owner)\n }\n this.registeredRouter = null\n this.registeredParent = null\n this.routeContexts.clear()\n this.mountedIds.clear()\n }\n\n private registerRoutes(items: readonly TItem[]): void {\n const router = this.owner._runtime.router\n const parent = this.owner._routeContext\n if (this.registeredRouter != null && this.registeredParent != null) {\n this.registeredRouter.unregisterRoutes(this.registeredParent, this.owner)\n }\n this.registeredRouter = null\n this.registeredParent = null\n this.routeContexts.clear()\n\n const routed = items.filter((item): item is TItem & {\n route: LiteralRouteDescriptor\n } => item.route != null)\n if (routed.length === 0) return\n if (router == null || parent == null) {\n throw new Error(`Routed ${this.options.subject} require a router and contextual route scope`)\n }\n\n this.registeredRouter = router\n this.registeredParent = parent\n this.routeContexts = new Map(router.registerSelectionRoutes(\n parent,\n this.owner,\n routed.map((item) => ({\n route: item.route,\n disabled: item.disabled,\n active: () => Object.is(this.valueEmitter.get(), item.id),\n activate: () => {\n this.valueEmitter.set(item.id, this.options.restoredCause)\n },\n })),\n (listener) => this.valueEmitter.subscribe(listener, {emitCurrent: false}),\n ))\n }\n\n private pendingItem(items: readonly TItem[]): TItem | undefined {\n const transition = this.registeredRouter?.transition.get()\n if (transition?.state !== 'pending') return undefined\n const requestedPathname = transition.requestedLocation.split('?', 1)[0] || '/'\n return items.find((item) => {\n if (item.disabled || item.route == null) return false\n const context = this.routeContexts.get(item.route)\n return context != null && (\n requestedPathname === context.pathname\n || requestedPathname.startsWith(`${context.pathname}/`)\n )\n })\n }\n}\n\nexport function readContentMountPolicy(\n value: unknown,\n componentName: string,\n): ContentMountPolicy {\n const policy = value ?? 'eager'\n if (policy !== 'eager' && policy !== 'lazy' && policy !== 'active-only') {\n throw new TypeError(`${componentName} mountPolicy must be eager, lazy, or active-only`)\n }\n return policy\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 {\n RoutedSelectionController,\n readContentMountPolicy,\n} from '../routedSelection.js'\nimport type {\n ContentMountPolicy,\n RoutedSelectionItem,\n} from '../routedSelection.js'\nimport {Tab} from './tab.js'\nimport type {TabProps} from './tab.js'\nimport {TabLine, tabButtonId, tabPanelId} from './tabline.js'\nimport type {TabLineTab} from './tabline.js'\nimport {RouteScope} from '../../../routing/RouteScope.js'\nimport type {LiteralRouteDescriptor} from '../../../routing/route.js'\n\nexport interface TabDefinition {\n id: Key\n label?: FrayChild\n disabled?: boolean\n content?: FrayChild\n component?: FrayChild\n route?: LiteralRouteDescriptor\n}\n\nexport type TabPanelMountPolicy = ContentMountPolicy\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 /** Controls when tab content is mounted and whether inactive content is retained. */\n mountPolicy?: TabPanelMountPolicy\n label?: string\n onChange?: (value: Key, event: Event | null) => void\n}\n\ninterface NormalizedTab extends RoutedSelectionItem {\n id: Key\n label: FrayChild\n disabled: boolean\n content: FrayChild\n route?: LiteralRouteDescriptor\n}\n\nexport class TabPanel extends Component<TabPanelProps> {\n static override liveProps: readonly string[] = []\n readonly valueEmitter: ValueEmitter<Key | null>\n readonly activeTabEmitter: ValueEmitter<Key | null>\n readonly baseId: string\n private readonly selection: RoutedSelectionController<NormalizedTab>\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 this.selection = new RoutedSelectionController(this, this.valueEmitter, {\n subject: 'tabs',\n restoredCause: 'route tab restored',\n pendingCause: 'pending route tab selected',\n selectedCause: 'tab selected',\n })\n }\n\n initialize(): void {\n const tabs = extractTabs(this.props)\n readContentMountPolicy(this.props.mountPolicy, 'TabPanel')\n this.selection.prepare(tabs)\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: TabPanelProps): this {\n readContentMountPolicy(nextProps.mountPolicy, 'TabPanel')\n super.setProps(nextProps)\n this.selection.prepare(extractTabs(nextProps))\n this.update()\n return this\n }\n\n render(): FrayChild {\n const tabs = extractTabs(this.props)\n const mountPolicy = readContentMountPolicy(this.props.mountPolicy, 'TabPanel')\n const selectedId = this.selection.selected(tabs)?.id\n const mountedTabIds = this.selection.updateMounted(tabs, mountPolicy)\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 onSelectTab={(tab, event) => this.selectTab(tab, event)}\n />\n {tabs.map((tab) => {\n const selected = Object.is(selectedId, tab.id)\n return <section\n key={String(tab.id)}\n id={tabPanelId(this.baseId, tab.id)}\n role=\"tabpanel\"\n aria-labelledby={tabButtonId(this.baseId, tab.id)}\n tabIndex={selected ? 0 : -1}\n hidden={!selected}\n >{mountedTabIds.has(tab.id)\n ? this.selection.scopedContent(tab, tab.content)\n : null}</section>\n })}\n </Host>\n }\n\n override onDestroy(): void {\n this.selection.dispose()\n }\n\n private selectTab(tab: TabLineTab, _event: Event | null): void {\n const selected = extractTabs(this.props).find(({id}) => Object.is(id, tab.id))\n if (selected != null) this.selection.select(selected)\n }\n\n static dependencies = [RouteScope, TabLine, Tab]\n\n static override hostName = 'tab-panel'\n\n static css = css`\n & {\n background: var(--panel-background);\n border-radius: var(--panel-radius);\n box-shadow: var(--panel-shadow);\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n & > section[role=\"tabpanel\"] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: auto;\n padding: 3px;\n z-index: 2;\n }\n\n & > section[role=\"tabpanel\"][hidden] {\n display: none;\n }\n\n & > section[role=\"tabpanel\"] > fray-toolbar[role=\"toolbar\"]:first-child {\n width: calc(100% + 6px);\n margin-block-start: -3px;\n margin-inline-start: -3px;\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 ...(tabProps.route == null ? {} : {route: tabProps.route}),\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 ...(tab.route == null ? {} : {route: tab.route}),\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 type {WritableEmitter} from '../Components/component.js'\n\nconst routeDescriptors = new WeakSet<object>()\nconst routeTargets = new WeakSet<object>()\n\nexport interface RouteCodec<TValue> {\n parse(value: string): TValue\n format(value: TValue): string\n}\n\nexport interface RouteQueryCodec<TValue> {\n parse(values: readonly string[]): TValue\n format(value: TValue): readonly string[]\n}\n\nexport interface LiteralRouteDescriptor {\n readonly id: string\n readonly kind: 'literal'\n readonly path: string\n}\n\nexport interface ParameterRouteDescriptor<TValue> {\n readonly id: string\n readonly kind: 'parameter'\n readonly name: string\n readonly codec: RouteCodec<TValue>\n}\n\nexport type RouteDescriptor<TValue = never> =\n | LiteralRouteDescriptor\n | ParameterRouteDescriptor<TValue>\n\nexport type AnyRouteDescriptor = RouteDescriptor<unknown>\n\nexport interface RouteParameterValue<TValue = unknown> {\n readonly route: ParameterRouteDescriptor<TValue>\n readonly value: TValue\n}\n\nexport interface RouteTarget {\n readonly routes: readonly (LiteralRouteDescriptor | RouteParameterValue)[]\n readonly query?: Readonly<Record<string, string | readonly string[] | null | undefined>>\n}\n\nexport interface RouteValueBinding<TValue> {\n readonly valueEmitter: WritableEmitter<TValue | null>\n readonly resolve?: RouteValueResolver<TValue>\n}\n\nexport interface RouteResolveContext {\n readonly requestedLocation: string\n readonly resolvedValues: ReadonlyMap<AnyRouteDescriptor, unknown>\n}\n\nexport type RouteValueResolver<TValue> = (\n value: TValue,\n context: RouteResolveContext,\n signal: AbortSignal,\n) => TValue | RouteRedirect | Promise<TValue | RouteRedirect>\n\nexport class RouteRedirect {\n constructor(readonly target: RouteTarget) {\n assertRouteTarget(target)\n Object.freeze(this)\n }\n}\n\nexport class RouteUnavailableError extends Error {\n override readonly name = 'RouteUnavailableError'\n\n constructor(message = 'The requested route is unavailable') {\n super(message)\n }\n}\n\nexport const stringRouteCodec: RouteCodec<string> = Object.freeze({\n parse: (value: string) => value,\n format: (value: string) => value,\n})\n\nexport const stringRouteQueryCodec: RouteQueryCodec<string> = Object.freeze({\n parse(values: readonly string[]) {\n if (values.length !== 1) throw new TypeError('Expected one query value')\n return values[0] ?? ''\n },\n format: (value: string) => [value],\n})\n\nexport const booleanRouteQueryCodec: RouteQueryCodec<boolean> = Object.freeze({\n parse(values: readonly string[]) {\n if (values.length !== 1 || (values[0] !== 'true' && values[0] !== 'false')) {\n throw new TypeError('Expected one boolean query value')\n }\n return values[0] === 'true'\n },\n format: (value: boolean) => [String(value)],\n})\n\nexport function defineRoute(id: string, path = id): LiteralRouteDescriptor {\n const normalizedId = routeName(id, 'Route id')\n const normalizedPath = routeSegment(path, 'Route path')\n const descriptor = Object.freeze({\n id: normalizedId,\n kind: 'literal' as const,\n path: normalizedPath,\n })\n routeDescriptors.add(descriptor)\n return descriptor\n}\n\nexport function defineRouteParameter<TValue>(\n id: string,\n codec: RouteCodec<TValue>,\n name = id,\n): ParameterRouteDescriptor<TValue> {\n const normalizedId = routeName(id, 'Route id')\n const normalizedName = routeName(name, 'Route parameter name')\n assertRouteCodec(codec)\n const descriptor = Object.freeze({\n id: normalizedId,\n kind: 'parameter' as const,\n name: normalizedName,\n codec,\n })\n routeDescriptors.add(descriptor)\n return descriptor\n}\n\nexport function routeParameter<TValue>(\n route: ParameterRouteDescriptor<TValue>,\n value: TValue,\n): RouteParameterValue<TValue> {\n assertRouteDescriptor(route)\n if (route.kind !== 'parameter') {\n throw new TypeError('routeParameter requires a parameter route')\n }\n const formatted = route.codec.format(value)\n assertFormattedSegment(formatted, route.name)\n return Object.freeze({route, value})\n}\n\nexport function routeTarget(\n ...routes: readonly (LiteralRouteDescriptor | RouteParameterValue)[]\n): RouteTarget {\n if (routes.length === 0) throw new TypeError('routeTarget requires at least one route')\n for (const part of routes) {\n if (isRouteParameterValue(part)) {\n assertRouteDescriptor(part.route)\n } else {\n assertRouteDescriptor(part)\n if (part.kind !== 'literal') {\n throw new TypeError('Parameter routes require routeParameter(route, value)')\n }\n }\n }\n const target = Object.freeze({routes: Object.freeze([...routes])})\n routeTargets.add(target)\n return target\n}\n\nexport function withRouteQuery(\n target: RouteTarget,\n query: Readonly<Record<string, string | readonly string[] | null | undefined>>,\n): RouteTarget {\n assertRouteTarget(target)\n if (query == null || typeof query !== 'object' || Array.isArray(query)) {\n throw new TypeError('Route target query must be an object')\n }\n const next = Object.freeze({routes: target.routes, query: Object.freeze({...query})})\n routeTargets.add(next)\n return next\n}\n\nexport function redirectTo(target: RouteTarget): RouteRedirect {\n return new RouteRedirect(target)\n}\n\nexport function isRouteDescriptor(value: unknown): value is AnyRouteDescriptor {\n return value != null && typeof value === 'object' && routeDescriptors.has(value)\n}\n\nexport function assertRouteDescriptor(value: unknown): asserts value is AnyRouteDescriptor {\n if (!isRouteDescriptor(value)) {\n throw new TypeError('Expected a route created by defineRoute() or defineRouteParameter()')\n }\n}\n\nexport function isRouteTarget(value: unknown): value is RouteTarget {\n return value != null && typeof value === 'object' && routeTargets.has(value)\n}\n\nexport function assertRouteTarget(value: unknown): asserts value is RouteTarget {\n if (!isRouteTarget(value)) throw new TypeError('Expected a target created by routeTarget()')\n}\n\nexport function assertRouteCodec<TValue>(\n codec: RouteCodec<TValue>,\n): asserts codec is RouteCodec<TValue> {\n if (codec == null\n || typeof codec !== 'object'\n || typeof codec.parse !== 'function'\n || typeof codec.format !== 'function') {\n throw new TypeError('Route codec requires parse and format functions')\n }\n}\n\nexport function assertRouteQueryCodec<TValue>(\n codec: RouteQueryCodec<TValue>,\n): asserts codec is RouteQueryCodec<TValue> {\n if (codec == null\n || typeof codec !== 'object'\n || typeof codec.parse !== 'function'\n || typeof codec.format !== 'function') {\n throw new TypeError('Route query codec requires parse and format functions')\n }\n}\n\nexport function formatRouteTarget(target: RouteTarget): string {\n assertRouteTarget(target)\n const segments = target.routes.map((part) => {\n if (isRouteParameterValue(part)) {\n const formatted = part.route.codec.format(part.value)\n assertFormattedSegment(formatted, part.route.name)\n return encodeURIComponent(formatted)\n }\n return encodeURIComponent(part.path)\n })\n const search = new URLSearchParams()\n for (const [name, raw] of Object.entries(target.query ?? {}).sort(([left], [right]) =>\n left.localeCompare(right))) {\n if (raw == null) continue\n const values = Array.isArray(raw) ? raw : [raw]\n for (const value of values) search.append(name, value)\n }\n const query = search.toString()\n return `/${segments.join('/')}${query === '' ? '' : `?${query}`}`\n}\n\nfunction isRouteParameterValue(value: unknown): value is RouteParameterValue {\n return value != null\n && typeof value === 'object'\n && 'route' in value\n && 'value' in value\n && isRouteDescriptor(value.route)\n && value.route.kind === 'parameter'\n}\n\nfunction routeName(value: unknown, label: string): string {\n if (typeof value !== 'string' || !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(value)) {\n throw new TypeError(`${label} must be a lowercase kebab-case name`)\n }\n return value\n}\n\nfunction routeSegment(value: unknown, label: string): string {\n if (typeof value !== 'string'\n || value === ''\n || value === '.'\n || value === '..'\n || value.includes('/')\n || value.includes('?')\n || value.includes('#')) {\n throw new TypeError(`${label} must be one non-empty path segment`)\n }\n try {\n assertFormattedSegment(decodeURIComponent(value), label)\n } catch {\n throw new TypeError(`${label} must use valid percent encoding`)\n }\n return value\n}\n\nfunction assertFormattedSegment(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || value === '' || value.includes('/')) {\n throw new TypeError(`${label} codec must format one non-empty path segment`)\n }\n}\n","import {Component, h} from '../Components/component.js'\nimport type {ComponentProps, FrayChild} from '../Components/component.js'\nimport {isRouteDescriptor} from './route.js'\nimport type {RouteDescriptor, RouteTarget} from './route.js'\nimport type {ResolvedRoute} from './router.js'\n\nexport interface RouteLinkProps extends ComponentProps {\n to: RouteDescriptor | RouteTarget | ResolvedRoute\n exact?: boolean\n target?: string\n download?: string | boolean\n onClick?: (event: MouseEvent) => void\n}\n\n/** A native anchor that delegates unmodified same-context activation to the router. */\nexport class RouteLink extends Component<RouteLinkProps> {\n static override liveProps: readonly string[] = []\n initialize(): void {\n const router = this._runtime.router\n if (router == null) throw new Error('RouteLink requires a router in FrayRuntime')\n this.watch(router.transition)\n }\n\n render(): FrayChild {\n const router = this._runtime.router\n if (router == null) throw new Error('RouteLink requires a router in FrayRuntime')\n const target = isRouteDescriptor(this.props.to)\n ? router.resolve(this.props.to, this._routeContext ?? router.root)\n : this.props.to\n const {\n to: _to,\n exact = false,\n children = [],\n onClick,\n ...anchorProps\n } = this.props\n return h('a', {\n ...anchorProps,\n href: router.href(target),\n 'aria-current': router.isActive(target, exact) ? 'page' : null,\n onClick: (event: MouseEvent) => {\n onClick?.(event)\n if (!shouldHandleClick(event, anchorProps.target, anchorProps.download)) return\n event.preventDefault()\n void router.navigate(target)\n },\n }, children)\n }\n}\n\nfunction shouldHandleClick(\n event: MouseEvent,\n target: string | undefined,\n download: string | boolean | undefined,\n): boolean {\n if (event.defaultPrevented\n || event.button !== 0\n || event.metaKey\n || event.ctrlKey\n || event.shiftKey\n || event.altKey\n || download != null && download !== false\n || target != null && target !== '' && target !== '_self') return false\n return true\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\nimport {RouteLink} from '../../routing/RouteLink.js'\nimport type {RouteDescriptor, RouteTarget} from '../../routing/route.js'\nimport type {ResolvedRoute} from '../../routing/router.js'\n\nexport interface NavigationBarItem {\n id: Key\n label: FrayChild\n to: RouteDescriptor | RouteTarget | ResolvedRoute\n exact?: boolean\n disabled?: boolean\n target?: string\n download?: string | boolean\n title?: string\n onClick?: (event: MouseEvent) => void\n}\n\nexport interface NavigationBarProps extends ComponentProps {\n items: readonly NavigationBarItem[]\n label: string\n}\n\n/** Native application/document navigation over router-aware links. */\nexport class NavigationBar extends Component<NavigationBarProps> {\n static override liveProps: readonly string[] = []\n\n constructor(props: NavigationBarProps) {\n super(props)\n validateNavigation(props)\n }\n\n render(): FrayChild {\n validateNavigation(this.props)\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <nav aria-label={this.props.label}>\n <ul>{this.props.items.map((item) => <li key={String(item.id)}>\n {item.disabled\n ? <span aria-disabled=\"true\" title={item.title}>{item.label}</span>\n : <RouteLink\n to={item.to}\n {...(item.exact == null ? {} : {exact: item.exact})}\n {...(item.target == null ? {} : {target: item.target})}\n {...(item.download == null ? {} : {download: item.download})}\n {...(item.title == null ? {} : {title: item.title})}\n {...(item.onClick == null ? {} : {onClick: item.onClick})}\n >{item.label}</RouteLink>}\n </li>)}</ul>\n </nav>\n </Host>\n }\n\n static dependencies = [RouteLink]\n static override hostName = 'navigation-bar'\n\n static override css = css`\n & {\n display: block;\n flex: 0 0 auto;\n min-width: 0;\n color: var(--navigation-bar-color);\n background: var(--navigation-bar-background);\n border: var(--navigation-bar-border);\n box-shadow: var(--navigation-bar-shadow);\n }\n\n & > nav,\n & > nav > ul {\n min-width: 0;\n }\n\n & > nav > ul {\n display: flex;\n flex-flow: row wrap;\n gap: var(--navigation-bar-gap);\n\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: var(--navigation-bar-padding);\n list-style: none;\n }\n\n & > nav > ul > li {\n display: flex;\n }\n\n & > nav > ul > li > a,\n & > nav > ul > li > span[aria-disabled=\"true\"] {\n display: inline-flex;\n align-items: center;\n min-height: var(--control-min-height, 2rem);\n padding: var(--navigation-link-padding);\n box-sizing: border-box;\n color: var(--navigation-link-color);\n background: var(--navigation-link-background);\n border: var(--navigation-link-border);\n border-radius: var(--navigation-link-radius);\n box-shadow: var(--navigation-link-shadow);\n font-family: inherit;\n font-size: 1.1rem;\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n text-decoration: none;\n white-space: nowrap;\n }\n\n & > nav > ul > li > a:hover {\n color: var(--navigation-link-color-hover);\n background: var(--navigation-link-background-hover);\n }\n\n & > nav > ul > li > a:active {\n color: var(--navigation-link-color-active);\n background: var(--navigation-link-background-active);\n }\n\n & > nav > ul > li > a[aria-current=\"page\"] {\n color: var(--navigation-link-color-current);\n background: var(--navigation-link-background-current);\n box-shadow: var(--navigation-link-shadow-current);\n font-weight: var(--navigation-link-font-weight-current);\n }\n\n & > nav > ul > li > a:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n & > nav > ul > li > span[aria-disabled=\"true\"] {\n color: var(--navigation-link-color-disabled);\n background: var(--navigation-link-background-disabled);\n border: var(--navigation-link-border);\n cursor: not-allowed;\n }\n `\n}\n\nfunction validateNavigation(props: NavigationBarProps): void {\n if (typeof props.label !== 'string' || props.label.trim() === '') {\n throw new TypeError('NavigationBar label must be a non-empty string')\n }\n if (!Array.isArray(props.items)) throw new TypeError('NavigationBar items must be an array')\n const ids = new Set<Key>()\n for (const item of props.items) {\n if (item == null || item.id == null) throw new TypeError('Each navigation item requires an id')\n if (item.label == null) throw new TypeError('Each navigation item requires a label')\n if (item.to == null) throw new TypeError('Each navigation item requires a route target')\n if (ids.has(item.id)) throw new Error(`Duplicate navigation item id: ${String(item.id)}`)\n if (item.onClick != null && typeof item.onClick !== 'function') {\n throw new TypeError('Navigation item onClick must be a function')\n }\n ids.add(item.id)\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentDependency, ComponentProps, FrayChild} from '../component.js'\nimport {FrayRuntime} from '../../runtime.js'\n\n/** Viewport sizing policy for a Fray application root. */\nexport type FrayAppSizing =\n | 'embedded'\n | 'viewport-width'\n | 'viewport-height'\n | 'viewport'\n\n/** Landmark policy for a Fray application root. */\nexport type FrayAppLandmark = 'main' | 'none'\n\nexport interface FrayAppProps extends ComponentProps {\n /**\n * Select the viewport axes claimed by the application shell. Embedded is\n * sizing-neutral; the other values use Fray's public fill traits.\n */\n sizing?: FrayAppSizing\n /**\n * `main` exposes the app as the document's primary-content landmark.\n * Embedded applications should select `none`.\n */\n landmark?: FrayAppLandmark\n}\n\n/**\n * A fixed application shell with a `fray-app` host and theme typography.\n *\n * Instantiate it with children for a small application, or derive from it and\n * override `renderContent()` for an application composition root.\n */\nexport class FrayApp extends Component<FrayAppProps> {\n override mount(parent: ParentNode | null = null, before: Node | null = null): this {\n if (parent != null) {\n const targetDocument = parentDocument(parent, 'FrayApp.mount')\n const dependency = this.constructor as unknown as ComponentDependency\n this._runtime.registerStyles(dependency).injectStyles(targetDocument)\n }\n return super.mount(parent, before)\n }\n\n protected renderContent(): FrayChild {\n return this.props.children ?? null\n }\n\n render() {\n const {\n children: _children,\n key: _key,\n class: classAlias,\n className,\n island: _island,\n sizing = 'embedded',\n landmark = 'main',\n ...hostProps\n } = this.props\n const Host = this.Host\n const rootClassName = mergeClassNames(classAlias, className, sizingClassName(sizing))\n return <Host\n {...hostProps}\n role={landmarkRole(landmark)}\n {...(rootClassName == null ? {} : {className: rootClassName})}\n >\n {this.renderContent()}\n </Host>\n }\n\n static override hostName = 'app'\n\n static override css = css`\n & {\n box-sizing: border-box;\n display: block;\n background: var(--application-background);\n color: var(--ui-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n line-height: var(--line-height);\n }\n `\n}\n\n/**\n * Register an application root's reachable structural CSS before mounting it.\n * Presentation assets remain explicit application policy.\n */\nexport function mountFrayApp<TArgs extends unknown[], TApp extends FrayApp>(\n runtime: FrayRuntime,\n appType: (new(...args: TArgs) => TApp) & ComponentDependency,\n parent: ParentNode,\n ...args: TArgs\n): TApp {\n if (!(runtime instanceof FrayRuntime)) {\n throw new TypeError('mountFrayApp requires a FrayRuntime')\n }\n const targetDocument = parentDocument(parent, 'mountFrayApp')\n\n runtime.registerStyles(appType).injectStyles(targetDocument)\n return runtime.mount(runtime.create(appType, ...args), parent)\n}\n\nfunction parentDocument(parent: ParentNode, caller: string): Document {\n if (parent == null || typeof parent !== 'object' || !('ownerDocument' in parent)) {\n throw new TypeError(`${caller} requires a DOM parent node`)\n }\n const targetDocument = parent.ownerDocument ?? (parent.nodeType === 9 ? parent as Document : null)\n if (targetDocument?.head == null) {\n throw new TypeError(`${caller} requires a parent associated with a document head`)\n }\n return targetDocument\n}\n\nfunction sizingClassName(sizing: FrayAppSizing): string | undefined {\n switch (sizing) {\n case 'embedded': return undefined\n case 'viewport-width': return 'fray-fill-horizontal'\n case 'viewport-height': return 'fray-fill-vertical'\n case 'viewport': return 'fray-fill-horizontal fray-fill-vertical'\n default: throw new TypeError(\n 'FrayApp sizing must be embedded, viewport-width, viewport-height, or viewport',\n )\n }\n}\n\nfunction landmarkRole(landmark: FrayAppLandmark): 'main' | null {\n if (landmark === 'main') return 'main'\n if (landmark === 'none') return null\n throw new TypeError('FrayApp landmark must be main or none')\n}\n\nfunction mergeClassNames(...values: readonly (string | null | undefined)[]): string | undefined {\n const merged = values.flatMap(value => value?.trim().split(/\\s+/) ?? []).filter(Boolean).join(' ')\n return merged.length === 0 ? undefined : merged\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nexport type HeaderLevel = 1 | 2 | 3 | 4 | 5 | 6\n\nexport interface HeaderProps extends ComponentProps {\n id?: string | number | null\n headingId?: string | number | null\n level?: HeaderLevel\n}\n\n/** Styled heading surface with an explicit native heading level. */\nexport class Header extends Component<HeaderProps> {\n static override liveProps: readonly string[] = []\n readonly headerId: string\n readonly headingId: string\n\n constructor(props: HeaderProps = {}) {\n super(props)\n this.headerId = controlId('header', props.id)\n this.headingId = controlId('header-title', props.headingId ?? `${this.headerId}-title`)\n }\n\n render(): FrayChild {\n const {level = 2, children = []} = this.props\n if (!Number.isInteger(level) || level < 1 || level > 6) {\n throw new TypeError('Header level must be an integer from 1 to 6')\n }\n\n const Host = this.Host\n return <Host\n id={this.headerId}\n className={componentClass(this.props) || null}\n >\n {(() => {\n const Heading = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n return <Heading id={this.headingId}>{children}</Heading>\n })()}\n </Host>\n }\n\n static override hostName = 'header'\n\n static css = css`\n & {\n display: block;\n color: var(--section-header-color);\n border-radius: var(--ui-border-radius) var(--ui-border-radius) 0 0;\n padding: .25em;\n background: var(--section-header-background);\n box-shadow: var(--section-header-shadow);\n z-index: 1;\n }\n\n & > h1,\n & > h2,\n & > h3,\n & > h4,\n & > h5,\n & > h6 {\n margin: 0;\n font: inherit;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentDependency, ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {Header} from './header.js'\n\nexport interface GroupPanelBaseProps extends ComponentProps {\n id?: string | number | null\n}\n\nexport interface GroupPanelProps extends GroupPanelBaseProps {\n header: FrayChild\n}\n\n/** Bordered control group with a full-height vertical section header. */\nexport class GroupPanel<\n TProps extends GroupPanelBaseProps = GroupPanelProps,\n> extends Component<TProps> {\n static override liveProps: readonly string[] = []\n readonly panelId: string\n readonly headerId: string\n\n constructor(props: TProps) {\n super(props)\n this.panelId = controlId('group-panel', props.id)\n this.headerId = `${this.panelId}-title`\n }\n\n render(): FrayChild {\n const {header, children = []} = this.props as TProps & GroupPanelProps\n return this.renderGroupPanel(header, children)\n }\n\n protected renderGroupPanel(header: FrayChild, content: FrayChild): FrayChild {\n const Host = this.Host\n return <Host\n id={this.panelId}\n role=\"group\"\n className={componentClass(this.props) || null}\n aria-labelledby={this.headerId}\n >\n <Header\n id={`${this.panelId}-header`}\n headingId={this.headerId}\n >{header}</Header>\n <fray-content>{content}</fray-content>\n </Host>\n }\n\n static override hostName = 'group-panel'\n static override dependencies: ComponentDependency[] = [Header]\n\n static css = css`\n & {\n display: flex;\n flex-flow: row nowrap;\n align-items: stretch;\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n column-gap: 0.35rem;\n padding-block: 0.125rem;\n padding-inline: 0.125rem 0.35rem;\n border: 1px solid var(--ui-border-color);\n border-radius: var(--ui-border-radius);\n }\n\n & > fray-header {\n display: grid;\n place-items: center;\n box-sizing: border-box;\n width: 1.7em;\n min-width: 0;\n min-height: 0;\n padding: 0.125em;\n border-radius: var(--ui-border-radius);\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n font-weight: normal;\n font-size: var(--ui-font-size);\n }\n\n & > fray-content {\n display: block;\n min-width: 0;\n min-height: 0;\n margin-left: .25em;\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 OptionGroupBaseProps extends ComponentProps {\n id?: string | number | null\n label?: FrayChild\n ariaLabel?: string\n headerEnd?: FrayChild\n disabled?: boolean\n required?: boolean\n error?: unknown\n}\n\n/** Labeled fieldset section for use inside an OptionsPanel or standalone. */\nexport class OptionGroup<TProps extends OptionGroupBaseProps = OptionGroupBaseProps>\n extends Component<TProps> {\n static override liveProps: readonly string[] = []\n readonly groupId: string\n readonly errorId: string\n\n constructor(props: TProps) {\n super(props)\n this.groupId = controlId('option-group', props.id)\n this.errorId = `${this.groupId}-error`\n }\n\n render(): FrayChild {\n return this.renderOptionGroup(this.props.children ?? [])\n }\n\n protected renderOptionGroup(content: FrayChild): FrayChild {\n const Host = this.Host\n const {\n label,\n ariaLabel,\n headerEnd = null,\n disabled = false,\n required = false,\n error = null,\n } = this.props\n return <Host className={componentClass(this.props) || null}>\n <fieldset\n id={this.groupId}\n disabled={disabled}\n aria-label={label == null ? ariaLabel : null}\n aria-required={required ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n >\n {label != null || headerEnd != null ? <legend>\n {label != null ? <span>{label}</span> : null}\n {headerEnd}\n </legend> : null}\n {content}\n </fieldset>\n {error == null ? null : <p\n id={this.errorId}\n role=\"alert\"\n >{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'option-group'\n\n static css = css`\n & {\n display: block;\n min-width: 0;\n }\n\n & > fieldset {\n margin: 0;\n padding: 0;\n min-inline-size: 0;\n border: 0;\n width: 100%;\n }\n\n & > fieldset > legend {\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n gap: 0.5rem;\n width: 100%;\n padding: 0 0 0.25em;\n margin-bottom: 0.5em;\n border-bottom: 1px solid var(--ui-border-color);\n font: inherit;\n }\n\n & > fieldset > legend > span {\n flex: 1;\n min-width: 0;\n }\n\n & > p[role=\"alert\"] {\n margin: 0.25em 0 0;\n }\n `\n}\n","import {css} from '../component.js'\nimport {GroupPanel} from './groupPanel.js'\nimport type {GroupPanelBaseProps} from './groupPanel.js'\nimport type {FrayChild} from '../component.js'\n\nexport interface OptionsPanelProps extends GroupPanelBaseProps {\n header: FrayChild\n}\n\n/** Bordered panel with a vertical section header, designed to contain OptionGroups. */\nexport class OptionsPanel<TProps extends GroupPanelBaseProps = OptionsPanelProps>\n extends GroupPanel<TProps> {\n static override hostName = 'options-panel'\n\n static css = css`\n & > fray-content {\n display: flex;\n flex-direction: column;\n align-self: stretch;\n flex: 1 1 0;\n gap: .5em;\n }\n\n & > fray-content * > fieldset > legend {\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n font-size: var(--ui-font-size);\n color: var(--palette-neutral-950);\n gap: 0.5rem;\n width: 100%;\n padding: 0 0 0.25em;\n margin-bottom: 0.25em;\n border-bottom: 1px solid var(--ui-border-color);\n }\n\n & > fray-content * > fieldset {\n display: flex;\n flex-flow: column;\n justify-content: stretch;\n justify-items: stretch;\n align-items: stretch;\n align-content: stretch;\n box-sizing: border-box;\n width: 100%;\n gap: 0;\n padding: .25em 0 .5em 0;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../component.js'\nimport {Header} from './header.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nconst panelLiveProps = ['disabled'] as const\n\nexport interface PanelProps extends ComponentProps,\n LivePropContract<(typeof panelLiveProps)[number]> {\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 static override liveProps = panelLiveProps\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 id={`${this.panelId}-header`}\n headingId={this.headerId}\n >{header}</Header>\n\n return <Host\n id={this.panelId}\n role={header == null ? null : 'region'}\n className={componentClass(this.props)}\n aria-disabled={disabled ? 'true' : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {toolbar}\n <fray-content className={orientation}>{children}</fray-content>\n </Host>\n }\n\n static override hostName = 'panel'\n static override dependencies = [Header]\n\n static css = css`\n & {\n background: var(--panel-background);\n border: var(--panel-border);\n border-radius: var(--panel-radius);\n box-shadow: var(--panel-shadow);\n color: var(--panel-color);\n display: flex;\n flex-direction: column;\n overflow: auto;\n flex: 0 0 auto;\n }\n\n & > fray-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 & > fray-content.horizontal {\n flex-direction: row;\n }\n\n & > fray-content.vertical {\n flex-direction: column;\n }\n\n &[aria-disabled=\"true\"] {\n opacity: .65;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {Header} from './header.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 static override liveProps: readonly string[] = []\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 Host = this.Host\n const title = header == null\n ? null\n : <Header\n id={`${this.sidebarId}-header`}\n headingId={this.headerId}\n >{header}</Header>\n\n return <Host className={componentClass(this.props) || null}>\n <aside\n id={this.sidebarId}\n aria-label={header == null ? ariaLabel : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {toolbar == null ? null : <fray-toolbarcontent>{toolbar}</fray-toolbarcontent>}\n <fray-content tabIndex={0}>{children}</fray-content>\n </aside>\n </Host>\n }\n\n static override hostName = 'sidebar'\n static override dependencies = [Header]\n\n static css = css`\n & {\n display: flex;\n min-width: 0;\n min-height: 0;\n }\n\n & > aside {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n & > aside > fray-header,\n & > aside > fray-toolbarcontent {\n flex: none;\n }\n\n & > aside > fray-content {\n flex: 1;\n min-height: 0;\n overflow: auto;\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 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 static override liveProps: readonly string[] = []\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={classNames(componentClass(this.props), direction)}\n style={primarySize == null ? undefined : {'--split-primary-size': primarySize}}\n >\n <fray-primary\n role={primaryLabel == null ? null : 'region'}\n aria-label={primaryLabel}\n tabIndex={0}\n >{primary}</fray-primary>\n <fray-secondary\n role={secondaryLabel == null ? null : 'region'}\n aria-label={secondaryLabel}\n tabIndex={0}\n >{secondary ?? this.props.children ?? []}</fray-secondary>\n </Host>\n }\n\n static override hostName = 'split-view'\n\n static css = css`\n & {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n &.horizontal {\n flex-direction: row;\n }\n\n &.vertical {\n flex-direction: column;\n }\n\n & > fray-primary {\n flex: 0 1 var(--split-primary-size, 40%);\n }\n\n & > fray-secondary {\n flex: 1;\n }\n\n & > fray-primary,\n & > fray-secondary {\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n &.horizontal > fray-primary {\n border-inline-end: 1px solid var(--ui-border-color);\n }\n\n &.vertical > fray-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 static override liveProps: readonly string[] = []\n render(): FrayChild {\n const {term, value, children = []} = this.props\n return [\n <dt>{term}</dt>,\n <dd>{value ?? children}</dd>,\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 static override liveProps: readonly string[] = []\n render(): FrayChild {\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <dl aria-label={this.props.label}>{this.props.children ?? []}</dl>\n </Host>\n }\n\n static override hostName = 'descriptionlist'\n\n static dependencies = [DescriptionItem]\n\n static css = css`\n & {\n display: block;\n }\n\n & > dl {\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 static override liveProps: readonly string[] = []\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\n static override css = css`\n & {\n display: block;\n width: 5em;\n height: 1em;\n background: #ccc;\n border-radius: var(--ui-border-radius);\n position: relative;\n }\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n z-index: 1;\n inset: 0;\n margin: auto;\n animation: fray-placeholder-progress 0.55s linear infinite;\n background-repeat: repeat;\n background-size: 2rem 2rem;\n background-image: var(--working-background-image);\n border: 0 solid transparent;\n border-radius: inherit;\n box-sizing: border-box;\n pointer-events: none;\n }\n\n @keyframes fray-placeholder-progress {\n from { background-position: 0rem 0; }\n to { background-position: 2rem 0; }\n }\n\n @media (prefers-reduced-motion: reduce) {\n &::after {\n animation: none;\n }\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 static override liveProps: readonly string[] = []\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\">\n {errorMessage(error, 'Unable to load items')}\n </p>\n : null}\n {isLoading && rows.length === 0\n ? <>\n <p role=\"status\">Loading items…</p>\n <ul aria-hidden=\"true\">\n {Array.from({length: this.props.placeholderCount ?? 5}, (_, index) =>\n <li key={`placeholder-${index}`}>\n <Placeholder width={45 + index * 7} />\n </li>)}\n </ul>\n </>\n : null}\n {status === FetchState.Ready && rows.length === 0\n ? <p role=\"status\">No items</p>\n : null}\n {rows.length > 0\n ? <ul\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 <li\n key={String(key)}\n role=\"option\"\n data-fray-selectable-row=\"\"\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >{content}</li>\n })}</ul>\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 = 'listview'\n\n static override css = css`\n & {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n height: 100%;\n padding: var(--ui-padding-v) var(--ui-padding-h);\n color: var(--ui-text-color);\n background: var(--ui-input-bg);\n border: var(--ui-input-border);\n border-radius: var(--ui-border-radius);\n box-shadow: var(--input-shadow);\n box-sizing: border-box;\n pointer-events: all;\n user-select: none;\n white-space: nowrap;\n }\n\n & > [role=\"listbox\"],\n & > ul[aria-hidden=\"true\"] {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n & > [role=\"listbox\"] > [role=\"option\"] {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n min-height: calc(var(--ui-font-size) + var(--ui-padding-h) + var(--ui-padding-h));\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n font-size: var(--ui-font-size);\n color: var(--ui-text-color);\n border-radius: var(--ui-border-radius);\n box-sizing: border-box;\n user-select: none;\n }\n\n & > [role=\"listbox\"] > [role=\"option\"]:hover {\n background: var(--hover-bg-color, #f5f5f5);\n }\n\n & > [role=\"listbox\"] > [role=\"option\"][aria-selected=\"true\"] {\n background: var(--selected-bg-color, #e0e7ff);\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} from '../component.js'\n\n/** Shared native-label and painted-shell contract for checkable inputs. */\nexport abstract class CheckableControl<\n TProps extends ComponentProps = ComponentProps,\n> extends Component<TProps> {\n static override css = css`\n & {\n display: inline-flex;\n line-height: 1;\n height: 1.4em;\n }\n\n & > label {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n font-size: var(--ui-font-size);\n height: calc(var(--ui-font-size) + var(--ui-padding-h) + var(--ui-padding-h));\n color: var(--ui-text-color);\n border-radius: var(--ui-border-radius);\n box-sizing: border-box;\n align-items: center;\n gap: .3em;\n align-content: center;\n justify-content: center;\n justify-items: center;\n cursor: pointer;\n user-select: none;\n }\n\n & > label:has(> input:disabled) {\n color: var(--checkable-label-color-disabled);\n cursor: not-allowed;\n }\n\n & > label > input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n font: inherit;\n font-size: var(--ui-font-size, inherit);\n }\n\n & > label > input + fray-checkshell {\n position: relative;\n display: grid;\n width: 1em;\n height: 1em;\n flex: 0 0 1em;\n box-sizing: border-box;\n text-align: center;\n line-height: 120%;\n color: var(--input-color, var(--ui-text-color, currentColor));\n background: var(--checkbox-box-background, var(--ui-input-bg, transparent));\n border: var(--checkbox-box-border, var(--cbx-o-border, 1px solid currentColor));\n border-radius: var(--cbx-border-radius, var(--radius-sm, 0.2rem));\n box-shadow: var(--checkbox-box-shadow);\n font-family: inherit;\n font-size: 1em;\n user-select: none;\n place-items: center;\n }\n\n & > label > input:checked + fray-checkshell {\n color: var(--checkbox-symbol-color, var(--selection-color, currentColor));\n background: var(--checkbox-box-background-checked,\n var(--selection-background, var(--ui-accent-color, Highlight)));\n box-shadow: var(--checkbox-box-shadow-checked);\n }\n\n & > label > input:focus-visible + fray-checkshell {\n outline: 2px solid var(--focus-color, var(--ui-accent-color, Highlight));\n outline-offset: 1px;\n }\n\n & > label > input:disabled + fray-checkshell {\n opacity: 0.6;\n filter: saturate(0.6);\n }\n `\n}\n","import {css} from '../../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../../component.js'\nimport {CheckableControl} from '../CheckableControl.js'\nimport {\n componentClass,\n controlId,\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\nconst checkboxLiveProps = ['disabled', 'required', 'error'] as const\n\nexport interface CheckboxProps<TValue extends CheckboxValue = FilterModeValue>\n extends ValueControlProps<TValue>, LivePropContract<(typeof checkboxLiveProps)[number]> {\n id?: string | number | null\n symbols?: readonly CheckboxSymbol<TValue>[]\n initialSemanticState?: TValue\n label?: FrayChild\n disabled?: boolean\n required?: boolean\n error?: unknown\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 CheckableControl<CheckboxProps<TValue>> {\n static override liveProps = checkboxLiveProps\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 readonly inputId: string\n readonly errorId: string\n\n constructor(props: CheckboxProps<TValue> = {}) {\n super(props)\n this.inputId = controlId('checkbox', props.id)\n this.errorId = `${this.inputId}-error`\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 error = null,\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 // Bank2 uses the conventional neutral marker only to select the empty\n // checkbox surface; it is not visible glyph content.\n const shellSymbol = symbol === '☐' ? null : symbol\n const stateName = describeState(semanticState)\n const checked = isCheckedSemanticState(this.symbols, semanticState)\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-state={stateName}\n >\n <label>\n <input\n id={this.inputId}\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n required={required}\n name={this.props.name}\n value={String(semanticState)}\n aria-label={`${label}: ${stateName}`}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onChange={(event: Event) => {\n this.cycleState(1, event)\n // A native checkbox toggles its binary checked property before\n // it emits change. Deny and Neutral both map to unchecked, so\n // a VDOM patch can otherwise see the same checked prop as its\n // previous render and leave that native toggle behind.\n ;(event.currentTarget as HTMLInputElement).checked = isCheckedSemanticState(\n this.symbols,\n this.valueEmitter.get(),\n )\n }}\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 <fray-checkshell aria-hidden=\"true\">{shellSymbol}</fray-checkshell>\n {label}\n </label>\n {error == null ? null : <p id={this.errorId} role=\"alert\">{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'check-box'\n\n static override css = css`\n & > label > input[value=\"require\"] + fray-checkshell {\n color: var(--palette-contrast-light);\n background: var(--palette-green);\n box-shadow: var(--checkbox-box-shadow-checked);\n }\n\n & > label > input[value=\"deny\"] + fray-checkshell {\n color: var(--palette-contrast-light);\n background: var(--palette-red);\n box-shadow: var(--checkbox-box-shadow-checked);\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\nfunction isCheckedSemanticState<TValue extends CheckboxValue>(\n symbols: readonly CheckboxSymbol<TValue>[],\n semanticState: TValue,\n): boolean {\n const semanticIndex = symbols.findIndex(([, state]) => Object.is(state, semanticState))\n return semanticState === FilterMode.Prefer\n || semanticState === FilterMode.Require\n || (symbols.length === 2 && semanticIndex === 1)\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 static override liveProps: readonly string[] = []\n readonly optionsEmitter: ReadableEmitter<FilterOptions, unknown> | null\n private readonly optionStateEmitters = new Map<FilterValue, Emitter<FilterModeValue>>()\n private staleOptionValues = new Set<FilterValue>()\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 const isLoading = fetchState === FetchState.Initial || fetchState === FetchState.Loading\n const hostClass = componentClass(this.props) || null\n if (fetchState === FetchState.Error && values.length === 0) {\n return <Host className={hostClass}>\n <p role=\"alert\">{errorMessage(error, 'Unable to load filter options')}</p>\n </Host>\n }\n if (isLoading && values.length === 0) {\n return <Host className={hostClass}>\n <p role=\"status\">Loading filter options…</p>\n </Host>\n }\n\n return <Host\n className={hostClass}\n role=\"group\"\n aria-label={this.props.label ?? 'Filter options'}\n aria-busy={isLoading ? 'true' : null}\n >\n {fetchState === FetchState.Error\n ? <p role=\"alert\">{errorMessage(error, 'Unable to load filter options')}</p>\n : null}\n {isLoading ? <p role=\"status\">Loading filter options…</p> : null}\n {values.length === 0\n ? <p>No filter options</p>\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 }\n\n onDestroy(): void {\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 static dependencies = [Checkbox]\n\n static override hostName = 'filter-panel'\n\n static css = css`\n & {\n position: absolute;\n background: white;\n border: 1px solid #ccc;\n padding: 8px;\n min-width: 180px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-flow: column nowrap;\n align-items: flex-start;\n left: 100%;\n top: 0;\n }\n\n & > p {\n margin: 0;\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 static override liveProps: readonly string[] = []\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 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 class=\"sort\"\n aria-label={`Sort ${String(label)}`}\n onClick={() => this.toggleSort()}\n >\n {label}\n <span class=\"sortindicator\" aria-hidden=\"true\">\n {direction === 'asc' ? '▲' : direction === 'desc' ? '▼' : ''}\n </span>\n </button>\n : <span>{label}</span>}\n {this.props.filterOptions == null\n ? null\n : <button\n type=\"button\"\n class=\"filter\"\n aria-label={filterLabel}\n aria-expanded={String(this.filterVisible)}\n onClick={(event: MouseEvent) => this.toggleFilterPanel(event)}\n >⛃</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 override css = css`\n fray-datatable > table > thead > tr > th[aria-sort] {\n position: relative;\n padding-right: 24px;\n user-select: var(--noselect-user-select);\n cursor: var(--noselect-cursor);\n }\n\n fray-datatable > table > thead > tr > th[aria-sort] > button.sort {\n appearance: none;\n display: block;\n width: 100%;\n padding: 0;\n color: inherit;\n background: transparent;\n border: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n text-align: inherit;\n cursor: pointer;\n }\n\n fray-datatable > table > thead > tr > th[aria-sort] > button.sort > span.sortindicator {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n width: 1em;\n text-align: center;\n }\n\n fray-datatable > table > thead > tr > th[aria-sort] > button.filter {\n appearance: none;\n position: absolute;\n right: 2px;\n top: 50%;\n transform: translateY(-50%);\n width: 1em;\n padding: 0;\n color: inherit;\n background: transparent;\n border: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n text-align: center;\n cursor: pointer;\n opacity: 0.5;\n }\n\n fray-datatable > table > thead > tr > th[aria-sort] > button.filter:hover {\n opacity: 1;\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, 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 {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 static override liveProps: readonly string[] = []\n render(): FrayChild {\n return <thead>\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 static css = css`\n fray-datatable > table > thead {\n color: var(--table-header-color);\n background: var(--ui-gradient);\n }\n\n fray-datatable > table > thead > tr > th {\n border: 2px groove #fff7;\n border-left: none;\n }\n\n fray-datatable > table > thead > tr > th:last-child {\n border-right: none;\n }\n `\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 static override liveProps: readonly string[] = []\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 >\n {isLoading ? <p role=\"status\">Loading rows…</p> : null}\n {status === FetchState.Error\n ? <p role=\"alert\">{errorMessage(error, 'Unable to load rows')}</p>\n : null}\n {status === FetchState.Error && typeof this.dataSource?.retry === 'function'\n ? <button\n type=\"button\"\n onClick={() => this.dataSource?.retry?.('table retry')}\n >Retry</button>\n : 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 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\n static css = css`\n & {\n display: block;\n overflow: auto;\n }\n\n & > p {\n margin: 0;\n }\n\n & > table {\n border-collapse: collapse;\n width: 100%;\n }\n\n & thead:has([aria-expanded=\"true\"]) {\n position: relative;\n z-index: 1100;\n }\n\n & th,\n & td {\n text-align: left;\n padding: 0 var(--ui-padding);\n font-weight: normal;\n }\n\n &,\n & table,\n & tbody tr,\n & tbody tr td {\n user-select: none;\n pointer-events: all;\n }\n\n & tr td {\n background: var(--ui-table-bg-color);\n line-height: calc(var(--ui-font-size) + var(--ui-padding));\n font-size: var(--ui-font-size);\n height: calc(var(--ui-font-size) + var(--ui-padding-h));\n }\n\n & > table > tbody > tr:nth-child(even) > td {\n background: var(--ui-table-bg-color2);\n }\n\n & > table > tbody > tr[aria-selected=\"true\"] > td {\n color: var(--ui-select-text-color);\n background: var(--ui-select-bg);\n }\n\n & > table > tbody > tr:nth-child(even)[aria-selected=\"true\"] > td {\n background: var(--ui-select-bg-dark);\n }\n\n & tr td fray-placeholder {\n font-size: var(--ui-font-size);\n height: var(--ui-font-size);\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 static override liveProps: readonly string[] = []\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, FetchState} 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 itemLabelClassName?: (node: TreeNode<TValue>, depth: number) => string | null | undefined\n itemLabelStyle?: (node: TreeNode<TValue>, depth: number) => TreeItemStyle | null | undefined\n onSelect?: (node: TreeNode<TValue>, event: Event) => void\n}\n\nexport type TreeItemStyle = Readonly<Record<\nstring,\nstring | number | null | undefined\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 static override liveProps: readonly string[] = []\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 override setProps(nextProps: TreeViewProps<TValue>): this {\n if (this.ownedNodesEmitter != null) {\n if (isReadableEmitter(nextProps.nodes)) {\n throw new TypeError(\n 'TreeView cannot replace static or declarative nodes with an emitter',\n )\n }\n this.ownedNodesEmitter.set(\n nextProps.nodes ?? extractDeclarativeNodes<TValue>(nextProps.children),\n 'tree structure changed',\n )\n }\n return super.setProps(nextProps)\n }\n\n render(): FrayChild {\n const nodes = this.nodesEmitter.get()\n assertTreeNodes(nodes)\n const fetchState = this.nodesEmitter.getFetchState()\n const sourceError = this.nodesEmitter.getError()\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 {fetchState === FetchState.Error\n ? <p role=\"alert\">{errorMessage(sourceError, 'Unable to load tree items')}</p>\n : null}\n {fetchState !== FetchState.Error && visible.length === 0\n ? <p role=\"status\">No tree items</p>\n : <ul 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 const labelClassName = this.props.itemLabelClassName?.(node, depth)\n const labelStyle = this.props.itemLabelStyle?.(node, depth)\n return <li\n key={node.id}\n role=\"treeitem\"\n data-index={index}\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 <fray-expander aria-hidden=\"true\">\n {hasChildren ? (isExpanded ? '▾' : '▸') : '•'}\n </fray-expander>\n <fray-label\n {...(labelClassName == null ? {} : {className: labelClassName})}\n {...(labelStyle == null ? {} : {style: labelStyle})}\n >{label}</fray-label>\n </li>\n })}\n </ul>}\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\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 margin: 0;\n padding: 0;\n list-style: none;\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 & [role=\"treeitem\"]:hover {\n background: var(--button-background-hover);\n }\n\n & [role=\"treeitem\"]:focus-visible {\n outline: 2px solid transparent;\n outline-offset: -2px;\n box-shadow: var(--focus-ring);\n }\n\n & [role=\"treeitem\"][aria-selected=\"true\"] {\n color: var(--ui-select-text-color);\n background: var(--ui-select-bg);\n }\n\n & fray-expander {\n flex: 0 0 1rem;\n text-align: center;\n }\n\n & [role=\"treeitem\"][aria-expanded] > fray-expander {\n cursor: pointer;\n }\n\n & fray-label {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n & > [role=\"status\"],\n & > [role=\"alert\"] {\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 errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\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('fray-expander') != null\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../component.js'\nimport {componentClass, invoke} from '../controlUtils.js'\n\nconst buttonLiveProps = ['disabled', 'pressed', 'busy'] as const\n\nexport interface ButtonProps extends ComponentProps,\n LivePropContract<(typeof buttonLiveProps)[number]> {\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 static override liveProps = buttonLiveProps\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 const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <button\n id={id}\n name={name}\n value={value == null ? undefined : String(value)}\n title={title}\n type={type}\n disabled={unavailable}\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 </Host>\n }\n\n static override hostName = 'button'\n\n static override css = css`\n & > button {\n min-height: var(--control-min-height, 2rem);\n padding: var(--space-xs) var(--space-sm);\n color: var(--button-color);\n background: var(--button-background);\n border: var(--button-border);\n border-radius: var(--radius-md);\n box-shadow: var(--button-shadow);\n box-sizing: border-box;\n cursor: default;\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n user-select: none;\n white-space: nowrap;\n }\n\n & > button:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background: var(--button-background-hover);\n }\n\n & > button:active:not(:disabled, [aria-disabled=\"true\"]) {\n background: var(--button-background-active);\n border-style: var(--button-border-style-active);\n box-shadow: var(--button-shadow-active);\n }\n\n & > button:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n & > button:disabled,\n & > button[aria-disabled=\"true\"] {\n color: var(--input-color-disabled);\n background: var(--button-background-disabled);\n border: var(--button-border-disabled);\n cursor: not-allowed;\n pointer-events: none;\n }\n `\n}\n","import {Button} from '../menu/button.js'\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract, 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\nconst dialogLiveProps = ['showCloseButton'] as const\n\nexport interface DialogProps extends ValueControlProps<boolean>,\n LivePropContract<(typeof dialogLiveProps)[number]> {\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 static override liveProps = dialogLiveProps\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 const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <dialog\n id={this.dialogId}\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 <fray-content>{children}</fray-content>\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 </Host>\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 override hostName = 'dialog'\n static override dependencies = [Button]\n\n static override css = css`\n & > dialog {\n z-index: 2;\n width: min(38rem, calc(100vw - 2rem));\n max-height: min(42rem, calc(100dvh - 2rem));\n padding: 0;\n color: var(--panel-color);\n background: var(--panel-background);\n border: var(--panel-border);\n border-radius: var(--panel-radius);\n box-shadow: var(--dialog-shadow);\n overflow: hidden;\n isolation: isolate;\n }\n\n & > dialog[open] {\n display: flex;\n flex-direction: column;\n }\n\n & > dialog::backdrop {\n background: var(--dialog-backdrop-background);\n }\n\n & > dialog > header,\n & > dialog > p,\n & > dialog > fray-content,\n & > dialog > footer {\n padding: var(--panel-padding, 0.75rem);\n }\n\n & > dialog > header {\n position: relative;\n z-index: 1;\n color: var(--dialog-header-color);\n background: var(--dialog-header-background);\n box-shadow: var(--section-header-shadow);\n }\n\n & > dialog > header h2,\n & > dialog > p {\n margin: 0;\n }\n\n & > dialog > header h2 {\n font-size: 1.1em;\n font-weight: 700;\n }\n\n & > dialog > fray-content {\n position: relative;\n z-index: 0;\n display: block;\n flex: 1 1 auto;\n min-height: 0;\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 & > dialog::backdrop {\n background: Canvas;\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 && !dialog.open) {\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 && dialog.open) {\n if (dialog.open && typeof dialog.close === 'function') dialog.close()\n else dialog.removeAttribute('open')\n this.finishClose()\n return\n }\n if (!shouldOpen && this.synchronizedOpen) this.finishClose()\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 = 'quadcheckbox'\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 = 'tricheckbox'\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 {Component, css} from '../component.js'\nimport type {ComponentProps} from '../component.js'\n\n/** Shared DOM and presentation contract for controls with a native label. */\nexport abstract class LabeledInputControl<\n TProps extends ComponentProps = ComponentProps,\n> extends Component<TProps> {\n static override css = css`\n & {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n align-items: center;\n gap: .5em;\n min-height: var(--control-min-height, 2rem);\n color: var(--ui-text-color);\n font-size: var(--ui-font-size);\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n box-sizing: border-box;\n user-select: none;\n }\n\n & > label {\n user-select: none;\n white-space: nowrap;\n }\n\n `\n}\n","import {css} from '../component.js'\nimport type {ComponentProps} from '../component.js'\nimport {LabeledInputControl} from './LabeledInputControl.js'\n\n/** Shared select-shell contract for labeled controls that render a native select. */\nexport abstract class SelectControl<\n TProps extends ComponentProps = ComponentProps,\n> extends LabeledInputControl<TProps> {\n static override css = css`\n & > fray-selectshell {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n isolation: isolate;\n min-height: var(--control-min-height, 2rem);\n box-sizing: border-box;\n }\n\n & > fray-selectshell > select {\n position: relative;\n z-index: 1;\n min-height: var(--control-min-height, 2rem);\n width: var(--input-width, 15rem);\n padding: var(--space-xs) var(--space-sm);\n padding-inline-end: var(--dropdown-padding-inline-end);\n color: var(--input-color);\n background: var(--dropdown-select-background);\n border: var(--dropdown-select-border);\n border-radius: var(--radius-md);\n box-shadow: var(--dropdown-select-shadow);\n box-sizing: border-box;\n font: inherit;\n appearance: var(--dropdown-appearance);\n pointer-events: all;\n white-space: nowrap;\n }\n\n & > fray-selectshell::after {\n content: var(--dropdown-underlay-content);\n position: absolute;\n z-index: 0;\n inset: 0;\n background: var(--dropdown-underlay-background);\n border: var(--dropdown-underlay-border);\n border-radius: 0;\n border-start-start-radius: var(--dropdown-underlay-start-radius);\n border-end-start-radius: var(--dropdown-underlay-start-radius);\n box-shadow: var(--dropdown-underlay-shadow);\n box-sizing: border-box;\n pointer-events: none;\n }\n\n & > fray-selectshell::before {\n content: var(--dropdown-trigger-content);\n position: absolute;\n z-index: 2;\n inset-block: 0;\n inset-inline-end: 0;\n display: grid;\n inline-size: var(--dropdown-trigger-width);\n place-items: center;\n color: var(--dropdown-trigger-color);\n background: var(--dropdown-trigger-background);\n border: var(--dropdown-trigger-border);\n border-radius: 0;\n border-start-end-radius: var(--dropdown-trigger-end-radius);\n border-end-end-radius: var(--dropdown-trigger-end-radius);\n box-shadow: var(--dropdown-trigger-shadow);\n box-sizing: border-box;\n pointer-events: none;\n }\n\n & > fray-selectshell:has(> select:hover:not(:disabled))::before {\n background: var(--dropdown-trigger-background-hover);\n box-shadow: var(--dropdown-trigger-shadow-hover);\n }\n\n & > fray-selectshell:has(> select:disabled)::before {\n color: var(--input-color-disabled);\n background: var(--dropdown-trigger-background-disabled);\n border: var(--dropdown-trigger-border-disabled);\n }\n\n & > fray-selectshell:has(> select:disabled)::after {\n background: var(--dropdown-underlay-background-disabled);\n border: var(--dropdown-underlay-border-disabled);\n }\n\n & > fray-selectshell > select:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n @media (forced-colors: active) {\n & > fray-selectshell::before,\n & > fray-selectshell::after {\n display: none;\n }\n\n & > fray-selectshell > select {\n appearance: auto;\n padding-inline-end: var(--space-sm);\n }\n }\n `\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\nimport type {FrayChild, LivePropContract} 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'\nimport {SelectControl} from './SelectControl.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\nconst dropdownLiveProps = ['disabled', 'required', 'error'] as const\n\nexport interface DropdownProps<TValue extends DropdownValue = string>\n extends ValueControlProps<TValue>, LivePropContract<(typeof dropdownLiveProps)[number]> {\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 SelectControl<DropdownProps<TValue>> {\n static override liveProps = dropdownLiveProps\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)}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <fray-selectshell>\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 </fray-selectshell>\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\n static override css = ''\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} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\nconst labelLiveProps = ['text'] as const\n\nexport interface LabelProps extends ComponentProps,\n LivePropContract<(typeof labelLiveProps)[number]> {\n id?: string | number | null\n text?: FrayChild\n htmlFor?: string\n}\n\nexport class Label extends Component<LabelProps> {\n static override liveProps = labelLiveProps\n\n render(): FrayChild {\n const {text, htmlFor, children} = this.props\n return <label\n className={componentClass(this.props) || undefined}\n htmlFor={htmlFor}\n data-fray-component=\"label\"\n >\n {text ?? children}\n </label>\n }\n}\n","import {Component, css} from '../component.js'\nimport type {\n ComponentProps,\n FrayChild,\n Key,\n LivePropContract,\n} 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'\nimport {CheckableControl} from './CheckableControl.js'\n\nexport type RadioOption<TValue extends Key = string> = readonly [\n value: TValue,\n label: FrayChild,\n]\n\nconst radioButtonLiveProps = ['checked', 'disabled', 'required', 'error'] as const\nconst radioGroupLiveProps = ['disabled', 'required', 'error'] as const\n\nexport interface RadioButtonProps extends ComponentProps,\n LivePropContract<(typeof radioButtonLiveProps)[number]> {\n id?: string | number | null\n label?: FrayChild\n name?: string\n value?: Key\n checked?: boolean\n disabled?: boolean\n required?: boolean\n error?: unknown\n onChange?: (checked: boolean, event: Event) => void\n}\n\n/** A native radio input with its associated label and visual control shell. */\nexport class RadioButton extends CheckableControl<RadioButtonProps> {\n static override liveProps = radioButtonLiveProps\n readonly inputId: string\n readonly errorId: string\n\n constructor(props: RadioButtonProps = {}) {\n super(props)\n this.inputId = controlId('radio', props.id)\n this.errorId = `${this.inputId}-error`\n }\n\n render(): FrayChild {\n const {\n label = this.props.value ?? 'Option',\n checked = false,\n disabled = false,\n required = false,\n error = null,\n } = this.props\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <label htmlFor={this.inputId}>\n <input\n id={this.inputId}\n type=\"radio\"\n name={this.props.name}\n value={this.props.value == null ? undefined : String(this.props.value)}\n checked={checked}\n disabled={disabled}\n required={required}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onChange={(event: Event) => invoke(this.props.onChange,\n (event.currentTarget as HTMLInputElement).checked, event)}\n />\n <fray-checkshell aria-hidden=\"true\" />\n {label}\n </label>\n {error == null ? null : <p id={this.errorId} role=\"alert\">{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'radio-button'\n\n static override css = css`\n & > label > input[type=\"radio\"] + fray-checkshell {\n border-radius: 50%;\n }\n\n & > label > input[type=\"radio\"]:checked + fray-checkshell::after {\n width: .4em;\n height: .4em;\n content: \"\";\n border-radius: 50%;\n background: var(--checkbox-symbol-color);\n }\n `\n}\n\nexport interface RadioGroupProps<TValue extends Key = string>\n extends ValueControlProps<TValue>,\n LivePropContract<(typeof radioGroupLiveProps)[number]> {\n id?: string | number | null\n /** Ordinary option data; an owning render must resolve any reactive source. */\n options?: readonly RadioOption<TValue>[]\n label?: FrayChild\n ariaLabel?: string\n name?: string\n /** Accepts a boolean or `live(booleanEmitter)` in JSX/`h()` templates. */\n disabled?: boolean\n /** Accepts a boolean or `live(booleanEmitter)` in JSX/`h()` templates. */\n required?: boolean\n /** Validation error; accepts an ordinary value or `live(errorEmitter)`. */\n error?: unknown\n onChange?: (value: TValue, event: Event | null) => void\n}\n\n/** A native-radio group that owns one selected option value. */\nexport class RadioGroup<TValue extends Key = string>\n extends Component<RadioGroupProps<TValue>> {\n static dependencies = [RadioButton]\n static override liveProps = radioGroupLiveProps\n\n readonly valueEmitter: ValueEmitter<TValue>\n readonly groupId: string\n readonly errorId: string\n\n constructor(props: RadioGroupProps<TValue> = {}) {\n super(props)\n const options = props.options ?? []\n validateRadioOptions(options)\n const firstValue = options[0]?.[0] ?? null as unknown as TValue\n this.valueEmitter = createValueEmitter(this, props, firstValue, 'radio group value')\n this.groupId = controlId('radio-group', props.id)\n this.errorId = `${this.groupId}-error`\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: RadioGroupProps<TValue>): this {\n const options = nextProps.options ?? []\n validateRadioOptions(options)\n super.setProps(nextProps)\n this.selectFirstAvailableOption(options)\n return this\n }\n\n selectOption(value: TValue, event: Event | null = null): void {\n if (this.props.disabled) return\n this.valueEmitter.set(value, 'radio option selected')\n invoke(this.props.onChange, value, event)\n }\n\n render(): FrayChild {\n const {options = [], label, disabled = false, required = false, error = null} = this.props\n validateRadioOptions(options)\n const selectedValue = this.valueEmitter.get()\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n >\n <fieldset\n id={this.groupId}\n disabled={disabled}\n aria-label={label == null ? this.props.ariaLabel : null}\n aria-required={required ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n >\n {label == null ? null : <legend>{label}</legend>}\n {options.map(([value, optionLabel], index) => <RadioButton\n key={String(value)}\n id={`${this.groupId}-${index}`}\n name={this.props.name ?? this.groupId}\n value={value}\n label={optionLabel}\n checked={Object.is(selectedValue, value)}\n disabled={disabled}\n required={required}\n onChange={(checked, event) => {\n if (checked) this.selectOption(value, event)\n }}\n />)}\n </fieldset>\n {error == null ? null : <p id={this.errorId} role=\"alert\">{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'radio-group'\n\n static override css = css`\n & > fieldset {\n display: flex;\n flex-flow: column wrap;\n gap: 0;\n margin: 0;\n padding: 0;\n min-inline-size: 0;\n border: 0;\n user-select: none;\n }\n\n & > fieldset > legend {\n flex: 0 0 100%;\n padding: 0;\n margin-bottom: .5em;\n border-bottom: 1px solid #aaa;\n }\n `\n\n private selectFirstAvailableOption(options: readonly RadioOption<TValue>[]): void {\n if (!options.some(([value]) => Object.is(value, this.valueEmitter.get()))) {\n this.valueEmitter.set(options[0]?.[0] ?? null as unknown as TValue,\n 'radio group options changed')\n }\n }\n}\n\nfunction validateRadioOptions<TValue extends Key>(\n options: unknown,\n): asserts options is readonly RadioOption<TValue>[] {\n assertOptions<unknown>(options, 'Radio group options')\n for (const option of options) {\n if (!Array.isArray(option) || option.length < 2) {\n throw new TypeError('Radio group options must be [value, label] tuples')\n }\n }\n}\n","import {css} from '../component.js'\nimport type {FrayChild, LivePropContract, Ref} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\nimport {LabeledInputControl} from './LabeledInputControl.js'\n\nconst textboxLiveProps = ['disabled', 'required', 'readOnly', 'error'] as const\n\nexport interface TextboxProps extends ValueControlProps<string>,\n LivePropContract<(typeof textboxLiveProps)[number]> {\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 LabeledInputControl<TextboxProps> {\n static override liveProps = textboxLiveProps\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 className={componentClass(this.props) || null}>\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\n static override css = css`\n & > input {\n min-height: var(--control-min-height, 2rem);\n width: var(--input-width, 15rem);\n padding: var(--space-xs) var(--space-sm);\n color: var(--input-color);\n background: var(--input-background);\n border: var(--input-border);\n border-radius: var(--radius-md);\n box-shadow: var(--input-shadow);\n box-sizing: border-box;\n font: inherit;\n pointer-events: all;\n user-select: text;\n white-space: nowrap;\n cursor: text;\n }\n\n & > input:disabled {\n color: var(--input-color-disabled);\n background: var(--input-background-disabled);\n border-color: var(--ui-input-border-disabled);\n cursor: not-allowed;\n }\n\n & > input:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\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, LivePropContract} 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\nconst toggleLiveProps = ['disabled', 'required', 'error'] as const\n\nexport interface ToggleProps<TValue extends Key = string>\n extends ValueControlProps<TValue>, LivePropContract<(typeof toggleLiveProps)[number]> {\n id?: string | number | null\n options?: readonly ToggleOption<TValue>[]\n label?: FrayChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n error?: unknown\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 static override liveProps = toggleLiveProps\n readonly valueEmitter: ValueEmitter<TValue>\n readonly groupId: string\n readonly legendId: string\n readonly errorId: 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 this.errorId = `${this.groupId}-error`\n }\n\n initialize(): void {\n this.selectFirstAvailableOption(this.props.options ?? [])\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: ToggleProps<TValue>): this {\n const options = nextProps.options ?? []\n validateToggleOptions(options)\n super.setProps(nextProps)\n this.selectFirstAvailableOption(options)\n return this\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 error = null,\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 const Host = this.Host\n return <Host id={this.groupId} className={componentClass(this.props) || null}>\n {label == null ? null : <fray-label id={this.legendId}>{label}</fray-label>}\n <fray-options\n role=\"radiogroup\"\n aria-label={label == null ? this.props.ariaLabel : null}\n aria-labelledby={label == null ? null : this.legendId}\n aria-required={required ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\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 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>)}</fray-options>\n {error == null ? null : <fray-error\n id={this.errorId}\n role=\"alert\"\n >{String(error)}</fray-error>}\n </Host>\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 private selectFirstAvailableOption(options: readonly ToggleOption<TValue>[]): void {\n if (!options.some(([value]) => Object.is(value, this.valueEmitter.get()))) {\n this.valueEmitter.set(options[0]?.[0] ?? null as unknown as TValue,\n 'toggle options changed')\n }\n }\n\n static override hostName = 'toggle'\n\n static override css = css`\n & {\n display: inline-block;\n inline-size: fit-content;\n max-inline-size: 100%;\n }\n\n & > fray-label,\n & > fray-error {\n display: block;\n }\n\n & > fray-options {\n display: flex;\n min-height: var(--control-min-height, 2rem);\n border-radius: var(--radius-md);\n box-shadow: var(--toggle-group-shadow);\n box-sizing: border-box;\n cursor: pointer;\n user-select: none;\n }\n\n & > fray-options > button[role=\"radio\"] {\n position: relative;\n min-height: var(--control-min-height, 2rem);\n padding: var(--space-xs) var(--space-sm);\n color: var(--button-color);\n background: var(--toggle-button-background);\n border: var(--button-border);\n border-radius: 0;\n border-left: none;\n border-right: none;\n box-shadow: var(--toggle-button-shadow);\n box-sizing: border-box;\n cursor: default;\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n user-select: none;\n white-space: nowrap;\n }\n\n & > fray-options > button[role=\"radio\"]:hover:not(:disabled)[aria-checked=\"false\"] {\n background: var(--button-background-hover);\n }\n\n & > fray-options > button[role=\"radio\"]:first-of-type {\n border-radius: var(--radius-md) 0 0 var(--radius-md);\n border: var(--button-border);\n border-right: none;\n }\n\n & > fray-options > button[role=\"radio\"]:last-of-type {\n border-radius: 0 var(--radius-md) var(--radius-md) 0;\n border: var(--button-border);\n border-left: none;\n }\n\n & > fray-options > button[role=\"radio\"][aria-checked=\"false\"]\n + [role=\"radio\"][aria-checked=\"false\"] {\n border-inline-start: var(--button-border);\n border-inline-start-color: var(--toggle-inactive-shared-border-color);\n }\n\n & > fray-options > button[role=\"radio\"][aria-checked=\"true\"] {\n color: var(--selection-color);\n background: var(--toggle-button-background-checked);\n border: var(--toggle-button-border-checked);\n box-shadow: var(--toggle-button-shadow-checked);\n margin-inline: var(--toggle-button-selected-inline-overlap);\n z-index: var(--toggle-button-selected-z-index);\n }\n\n & > fray-options > button[role=\"radio\"]:disabled {\n color: var(--input-color-disabled);\n background: var(--button-background-disabled);\n border: var(--button-border-disabled);\n cursor: not-allowed;\n }\n\n & > fray-options > button[role=\"radio\"]:active:not(:disabled) {\n border-style: var(--button-border-style-active);\n }\n\n & > fray-options > button[role=\"radio\"][aria-checked=\"false\"]\n + [role=\"radio\"][aria-checked=\"false\"]::after {\n content: '';\n position: absolute;\n inset-block: var(--toggle-inactive-separator-block-inset);\n inline-size: 1px;\n inset-inline-start: -1px;\n background: var(--toggle-inactive-separator-background);\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 static override liveProps: readonly string[] = []\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 aria-label={label}\n aria-orientation={orientation}\n >{children}</Host>\n }\n\n static override hostName = 'toolbar'\n\n static css = css`\n & {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n color: var(--toolbar-color);\n background: var(--toolbar-background);\n border: var(--toolbar-border);\n box-shadow: var(--toolbar-shadow);\n gap: var(--spacing-small, 0.5rem);\n padding: var(--ui-padding);\n }\n\n & > * {\n margin: 0;\n }\n\n &[aria-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 static override liveProps: readonly string[] = []\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 percentage = value == null ? null : value / max * 100\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 <label htmlFor={this.progressId}>{this.props.label}</label>\n <progress\n id={this.progressId}\n value={value == null ? undefined : value}\n max={max}\n aria-valuetext={valueText}\n >{valueText}</progress>\n <fray-content aria-hidden=\"true\">\n <fray-progress\n style={percentage == null ? undefined : {\n '--progress-width': `${percentage}%`,\n '--progress-inverse-width': `${10000 / Math.max(percentage, 1)}%`,\n }}\n ><fray-inverse>{this.props.label}</fray-inverse></fray-progress>\n <fray-label>{this.props.label}</fray-label>\n </fray-content>\n </Host>\n }\n\n static override hostName = 'progress-bar'\n\n static css = css`\n & {\n display: block;\n }\n\n & > label,\n & > progress {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n }\n\n & > fray-content {\n position: relative;\n display: block;\n width: 100%;\n min-height: var(--control-min-height);\n border-radius: var(--ui-border-radius);\n overflow: hidden;\n background: var(--progress-track-background);\n box-shadow: var(--progress-track-shadow);\n color: var(--progress-track-color);\n text-align: center;\n line-height: var(--control-min-height);\n box-sizing: border-box;\n }\n\n & > fray-content > fray-progress {\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n display: block;\n width: var(--progress-width, 0%);\n height: 100%;\n border-radius: inherit;\n overflow: hidden;\n background: var(--progress-value-background);\n box-shadow: var(--progress-value-shadow);\n }\n\n & > fray-content > fray-progress > fray-inverse {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n width: var(--progress-inverse-width, 10000%);\n height: 100%;\n color: var(--progress-value-color);\n text-align: center;\n white-space: nowrap;\n }\n\n & > fray-content > fray-label {\n position: relative;\n z-index: 0;\n display: block;\n height: 100%;\n white-space: nowrap;\n }\n\n &:has(> progress:indeterminate) > fray-content > fray-progress {\n display: none;\n }\n\n &:has(> progress:indeterminate) > fray-content > fray-label {\n z-index: 2;\n }\n\n &:has(> progress:indeterminate) > fray-content::after {\n position: absolute;\n z-index: 1;\n inset: 1px;\n content: \"\";\n border-radius: inherit;\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n animation: fray-progressbar-indeterminate 0.55s linear infinite;\n opacity: .5;\n }\n\n @keyframes fray-progressbar-indeterminate {\n from { background-position: 0 0; }\n to { background-position: 2rem 0; }\n }\n\n @media (forced-colors: active) {\n & > fray-content {\n border: 1px solid CanvasText;\n background: Canvas;\n box-shadow: none;\n color: CanvasText;\n }\n\n & > fray-content > fray-progress {\n background: Highlight;\n box-shadow: none;\n }\n\n & > fray-content > fray-progress > fray-inverse {\n color: HighlightText;\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'\nexport type FrayAppearance = 'light' | 'dark' | 'system'\nexport type FrayThemeAppearanceCapability = 'light' | 'dark' | 'adaptive'\n\nexport interface FrayStylesheetOption {\n value: string\n label: string\n href: string\n}\n\nexport interface FrayThemeOption extends FrayStylesheetOption {\n /** Appearance modes the selected theme deliberately supports. */\n appearance: FrayThemeAppearanceCapability\n}\n\nexport type FrayThemeVariableLayer = 'palette' | 'theme'\nexport type FrayThemeVariableValue =\n | 'background'\n | 'border'\n | 'color'\n | 'dimension'\n | 'duration'\n | 'font'\n | 'opacity'\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-light-clear', 'palette', 'contrast', 'color', 'Transparent light endpoint'),\n variable('--palette-light-faint', 'palette', 'contrast', 'color', 'Faint translucent light endpoint'),\n variable('--palette-primary-light-mix', 'palette', 'primary', 'color', 'Light-side primary ramp mix endpoint', '--palette-light'),\n variable('--palette-primary-dark-mix', 'palette', 'primary', 'color', 'Dark-side primary ramp mix endpoint', '--palette-dark'),\n variable('--palette-secondary-light-mix', 'palette', 'secondary', 'color', 'Light-side secondary ramp mix endpoint', '--palette-light'),\n variable('--palette-secondary-dark-mix', 'palette', 'secondary', 'color', 'Dark-side secondary ramp mix endpoint', '--palette-dark'),\n variable('--palette-neutral-light-mix', 'palette', 'neutral', 'color', 'Light-side neutral ramp mix endpoint', '--palette-light'),\n variable('--palette-neutral-dark-mix', 'palette', 'neutral', 'color', 'Dark-side neutral ramp mix endpoint', '--palette-dark'),\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('--application-background', 'theme', 'surface', 'background', 'Application canvas'),\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('--island-margin', 'theme', 'island', 'dimension', 'Outer spacing around an explicit island'),\n variable('--island-padding', 'theme', 'island', 'dimension', 'Inner spacing within an explicit island'),\n variable('--island-background', 'theme', 'island', 'background', 'Explicit island surface', '--panel-background'),\n variable('--island-border', 'theme', 'island', 'border', 'Explicit island edge', '--panel-border'),\n variable('--island-radius', 'theme', 'island', 'radius', 'Explicit island radius', '--panel-radius'),\n variable('--island-shadow', 'theme', 'island', 'shadow', 'Explicit island elevation', '--panel-shadow'),\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('--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('--button-border-style-active', 'theme', 'button', 'border', 'Pressed button border style'),\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\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('--navigation-bar-background', 'theme', 'navigation', 'background', 'Navigation bar surface'),\n variable('--navigation-bar-color', 'theme', 'navigation', 'color', 'Navigation bar content'),\n variable('--navigation-bar-border', 'theme', 'navigation', 'border', 'Navigation bar border'),\n variable('--navigation-bar-shadow', 'theme', 'navigation', 'shadow', 'Navigation bar elevation'),\n variable('--navigation-bar-padding', 'theme', 'navigation', 'dimension', 'Navigation bar inner spacing'),\n variable('--navigation-bar-gap', 'theme', 'navigation', 'dimension', 'Navigation item gap'),\n variable('--navigation-link-color', 'theme', 'navigation', 'color', 'Navigation link content'),\n variable('--navigation-link-color-hover', 'theme', 'navigation', 'color', 'Hovered navigation link content'),\n variable('--navigation-link-color-active', 'theme', 'navigation', 'color', 'Pressed navigation link content'),\n variable('--navigation-link-color-current', 'theme', 'navigation', 'color', 'Current navigation link content'),\n variable('--navigation-link-color-disabled', 'theme', 'navigation', 'color', 'Disabled navigation link content'),\n variable('--navigation-link-background', 'theme', 'navigation', 'background', 'Navigation link surface'),\n variable('--navigation-link-background-hover', 'theme', 'navigation', 'background', 'Hovered navigation link surface'),\n variable('--navigation-link-background-active', 'theme', 'navigation', 'background', 'Pressed navigation link surface'),\n variable('--navigation-link-background-current', 'theme', 'navigation', 'background', 'Current navigation link surface'),\n variable('--navigation-link-background-disabled', 'theme', 'navigation', 'background', 'Disabled navigation link surface'),\n variable('--navigation-link-border', 'theme', 'navigation', 'border', 'Navigation link border'),\n variable('--navigation-link-border-current', 'theme', 'navigation', 'border', 'Current navigation link border'),\n variable('--navigation-link-shadow', 'theme', 'navigation', 'shadow', 'Navigation link elevation'),\n variable('--navigation-link-shadow-current', 'theme', 'navigation', 'shadow', 'Current navigation link elevation'),\n variable('--navigation-link-padding', 'theme', 'navigation', 'dimension', 'Navigation link inner spacing'),\n variable('--navigation-link-radius', 'theme', 'navigation', 'radius', 'Navigation link corner radius'),\n variable('--navigation-link-font-weight-current', 'theme', 'navigation', 'font', 'Current navigation link emphasis'),\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-track-color', 'theme', 'progress', 'color', 'Progress track label'),\n variable('--progress-track-shadow', 'theme', 'progress', 'shadow', 'Progress track depth'),\n variable('--progress-value-background', 'theme', 'progress', 'background', 'Progress value'),\n variable('--progress-value-color', 'theme', 'progress', 'color', 'Completed progress label'),\n variable('--progress-value-shadow', 'theme', 'progress', 'shadow', 'Completed progress depth'),\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 variable('--colored-shadow', 'theme', 'colored', 'shadow', 'Colored-trait depth'),\n variable('--block-graph-block-border', 'theme', 'block graph', 'border', 'Block graph category border', '--ui-border'),\n variable('--block-graph-block-radius', 'theme', 'block graph', 'radius', 'Block graph category radius', '--radius-sm'),\n variable('--block-graph-block-shadow', 'theme', 'block graph', 'shadow', 'Block graph category depth'),\n] satisfies readonly FrayThemeVariableDefinition[])\n\nexport const frayThemeOptions = Object.freeze([\n themeOption('shiny', 'Shiny', distributedAssetUrl('themes/shiny/theme.css'), 'light'),\n themeOption('java', 'Java', distributedAssetUrl('themes/java/theme.css'), 'light'),\n themeOption('minimal', 'Minimal', distributedAssetUrl('themes/minimal/theme.css'), 'adaptive'),\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\n/**\n * Select how an adaptive Fray theme resolves its light and dark mappings.\n * `system` removes the root attribute so the browser preference applies.\n */\nexport function setFrayAppearance(\n appearance: FrayAppearance,\n targetDocument: Document = globalThis.document,\n): void {\n if (targetDocument?.documentElement == null) {\n throw new TypeError('setFrayAppearance requires a document with a root')\n }\n if (appearance !== 'light' && appearance !== 'dark' && appearance !== 'system') {\n throw new TypeError('Fray appearance must be light, dark, or system')\n }\n if (appearance === 'system') targetDocument.documentElement.removeAttribute('data-appearance')\n else targetDocument.documentElement.dataset.appearance = appearance\n}\n\nexport function getFrayAppearance(\n targetDocument: Document = globalThis.document,\n): FrayAppearance {\n if (targetDocument?.documentElement == null) {\n throw new TypeError('getFrayAppearance requires a document with a root')\n }\n const appearance = targetDocument.documentElement.dataset.appearance\n return appearance === 'light' || appearance === 'dark' ? appearance : 'system'\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\nfunction themeOption(\n value: string,\n label: string,\n href: string,\n appearance: FrayThemeAppearanceCapability,\n): FrayThemeOption {\n return Object.freeze({value, label, href, appearance})\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 {css} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\nimport {SelectControl} from '../lineinputs/SelectControl.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\nconst stylesheetPickerLiveProps = ['disabled'] as const\n\nexport interface StylesheetPickerProps extends ValueControlProps<string>,\n LivePropContract<(typeof stylesheetPickerLiveProps)[number]> {\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 SelectControl<StylesheetPickerProps> {\n static override liveProps = stylesheetPickerLiveProps\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)}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <fray-selectshell>\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 </fray-selectshell>\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 override css = css`\n & > fray-selectshell > 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}\n\nexport class ColorPicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'colors', frayColorOptions)\n }\n\n static override hostName = '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","export interface NavigationAdapter {\n read(): string\n href(location: string): string\n push(location: string): void\n replace(location: string): void\n subscribe(listener: () => void): () => void\n}\n\nexport interface HistoryNavigationOptions {\n basePath?: string\n}\n\nexport interface BrowserNavigationTarget extends EventTarget {\n readonly location: Location\n readonly history: History\n}\n\nexport class MemoryNavigationAdapter implements NavigationAdapter {\n private readonly listeners = new Set<() => void>()\n private entries: string[]\n private index = 0\n\n constructor(initialLocation = '/') {\n this.entries = [normalizeRouteLocation(initialLocation)]\n }\n\n read(): string {\n return this.entries[this.index] ?? '/'\n }\n\n href(location: string): string {\n return normalizeRouteLocation(location)\n }\n\n push(location: string): void {\n this.entries = this.entries.slice(0, this.index + 1)\n this.entries.push(normalizeRouteLocation(location))\n this.index += 1\n }\n\n replace(location: string): void {\n this.entries[this.index] = normalizeRouteLocation(location)\n }\n\n subscribe(listener: () => void): () => void {\n if (typeof listener !== 'function') {\n throw new TypeError('Navigation adapter subscriber must be a function')\n }\n this.listeners.add(listener)\n let active = true\n return () => {\n if (!active) return\n active = false\n this.listeners.delete(listener)\n }\n }\n\n back(): void {\n if (this.index === 0) return\n this.index -= 1\n this.notify()\n }\n\n forward(): void {\n if (this.index >= this.entries.length - 1) return\n this.index += 1\n this.notify()\n }\n\n get length(): number {\n return this.entries.length\n }\n\n private notify(): void {\n for (const listener of [...this.listeners]) listener()\n }\n}\n\nexport function createHistoryNavigation(\n target: BrowserNavigationTarget = globalThis.window,\n options: HistoryNavigationOptions = {},\n): NavigationAdapter {\n assertBrowserTarget(target)\n const basePath = normalizeBasePath(options.basePath ?? '/')\n return {\n read() {\n const pathname = target.location.pathname\n const relative = pathname === basePath.slice(0, -1)\n ? '/'\n : pathname.startsWith(basePath)\n ? `/${pathname.slice(basePath.length)}`\n : pathname\n return normalizeRouteLocation(`${relative}${target.location.search}`)\n },\n href(location) {\n const normalized = normalizeRouteLocation(location)\n return `${basePath}${normalized.slice(1)}`\n },\n push(location) {\n target.history.pushState(null, '', this.href(location))\n },\n replace(location) {\n target.history.replaceState(null, '', this.href(location))\n },\n subscribe(listener) {\n target.addEventListener('popstate', listener)\n return () => target.removeEventListener('popstate', listener)\n },\n }\n}\n\nexport function createHashNavigation(\n target: BrowserNavigationTarget = globalThis.window,\n): NavigationAdapter {\n assertBrowserTarget(target)\n return {\n read() {\n return normalizeRouteLocation(target.location.hash.slice(1) || '/')\n },\n href(location) {\n return `#${normalizeRouteLocation(location)}`\n },\n push(location) {\n target.history.pushState(null, '', this.href(location))\n },\n replace(location) {\n target.history.replaceState(null, '', this.href(location))\n },\n subscribe(listener) {\n let last = this.read()\n const notify = () => {\n const next = this.read()\n if (next === last) return\n last = next\n listener()\n }\n target.addEventListener('popstate', notify)\n target.addEventListener('hashchange', notify)\n return () => {\n target.removeEventListener('popstate', notify)\n target.removeEventListener('hashchange', notify)\n }\n },\n }\n}\n\nexport function normalizeRouteLocation(location: string): string {\n if (typeof location !== 'string') throw new TypeError('Route location must be a string')\n const hashIndex = location.indexOf('#')\n const withoutHash = hashIndex < 0 ? location : location.slice(0, hashIndex)\n const queryIndex = withoutHash.indexOf('?')\n const rawPath = queryIndex < 0 ? withoutHash : withoutHash.slice(0, queryIndex)\n const search = queryIndex < 0 ? '' : withoutHash.slice(queryIndex)\n const rooted = rawPath.startsWith('/') ? rawPath : `/${rawPath}`\n const pathname = rooted.replace(/\\/{2,}/g, '/').replace(/\\/$/, '') || '/'\n return `${pathname}${search}`\n}\n\nfunction normalizeBasePath(value: string): string {\n const normalized = normalizeRouteLocation(value).split('?')[0] ?? '/'\n return normalized === '/' ? '/' : `${normalized}/`\n}\n\nfunction assertBrowserTarget(value: unknown): asserts value is BrowserNavigationTarget {\n if (value == null\n || typeof value !== 'object'\n || !('location' in value)\n || !('history' in value)\n || !('addEventListener' in value)) {\n throw new TypeError('Browser navigation requires a window-like target')\n }\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport type {WritableEmitter} from '../Components/component.js'\nimport type {NavigationAdapter} from './navigationAdapter.js'\nimport {normalizeRouteLocation} from './navigationAdapter.js'\nimport {\n RouteRedirect,\n RouteUnavailableError,\n assertRouteDescriptor,\n assertRouteQueryCodec,\n assertRouteTarget,\n formatRouteTarget,\n} from './route.js'\nimport type {\n AnyRouteDescriptor,\n LiteralRouteDescriptor,\n ParameterRouteDescriptor,\n RouteDescriptor,\n RouteQueryCodec,\n RouteResolveContext,\n RouteTarget,\n RouteValueResolver,\n} from './route.js'\n\nexport type NavigationHistoryMode = 'push' | 'replace'\n\nexport interface BrowserRouterOptions {\n adapter: NavigationAdapter\n}\n\nexport interface NavigationTransition {\n readonly state: 'pending' | 'idle'\n readonly requestedLocation: string\n readonly settledLocation: string\n}\n\nexport interface NavigationIssue {\n readonly requestedLocation: string\n readonly failedRouteId: string | null\n readonly reason: string\n readonly fallbackLocation: string\n}\n\nexport interface ResolvedRoute {\n readonly route: AnyRouteDescriptor | null\n readonly parent: ResolvedRoute | null\n readonly segment: string | null\n readonly value: unknown\n readonly pathname: string\n}\n\nexport interface SelectionRouteBinding {\n readonly route: LiteralRouteDescriptor\n readonly active: () => boolean\n readonly activate: (signal: AbortSignal) => void | Promise<void>\n readonly disabled?: boolean\n}\n\nexport interface ValueRouteBinding<TValue> {\n readonly route: ParameterRouteDescriptor<TValue>\n readonly valueEmitter: WritableEmitter<TValue | null>\n readonly resolve?: RouteValueResolver<TValue>\n}\n\nexport interface RouteQueryBinding<TValue> {\n readonly name: string\n readonly valueEmitter: WritableEmitter<TValue>\n readonly codec: RouteQueryCodec<TValue>\n readonly defaultValue: TValue\n readonly equals?: (left: TValue, right: TValue) => boolean\n}\n\nexport interface RouteRegistration {\n readonly context: ResolvedRoute\n dispose(): void\n}\n\ninterface ScopeOwner {\n complete: boolean\n}\n\ninterface ScopeRecord {\n readonly owners: Map<object, ScopeOwner>\n readonly entries: Map<AnyRouteDescriptor, RouteEntry>\n readonly queries: Map<string, QueryEntry<unknown>>\n}\n\ninterface RouteEntry {\n readonly owner: object\n readonly descriptor: AnyRouteDescriptor\n readonly parent: ResolvedRoute\n readonly match: (segment: string) => MatchResult | null\n readonly currentValue: () => unknown | null\n readonly activate: (\n match: MatchResult,\n context: RouteResolveContext,\n signal: AbortSignal,\n ) => MatchResult | RouteRedirect | Promise<MatchResult | RouteRedirect>\n readonly context: (value: unknown) => ResolvedRoute\n readonly disposeSubscription: () => void\n}\n\ninterface QueryEntry<TValue> {\n readonly owner: object\n readonly context: ResolvedRoute\n readonly name: string\n readonly emitter: WritableEmitter<TValue>\n readonly codec: RouteQueryCodec<TValue>\n readonly defaultValue: TValue\n readonly equals: (left: TValue, right: TValue) => boolean\n readonly disposeSubscription: () => void\n}\n\ninterface MatchResult {\n readonly value: unknown\n}\n\ninterface ParsedLocation {\n readonly location: string\n readonly pathname: string\n readonly segments: readonly string[]\n readonly search: URLSearchParams\n}\n\nconst MAX_REDIRECTS = 16\n\nexport class BrowserRouter {\n readonly root: ResolvedRoute\n readonly transition: ReadableEmitter<NavigationTransition>\n readonly issue: ReadableEmitter<NavigationIssue | null>\n\n private readonly transitionEmitter: Emitter<NavigationTransition>\n private readonly issueEmitter: Emitter<NavigationIssue | null>\n private readonly scopes = new Map<ResolvedRoute, ScopeRecord>()\n private readonly contextCache = new Map<string, ResolvedRoute>()\n private readonly knownQueryNames = new Set<string>()\n private readonly registryWaiters = new Set<() => void>()\n private readonly adapterUnsubscribe: () => void\n private controller: AbortController | null = null\n private activeContext: ResolvedRoute\n private requested: ParsedLocation\n private applying = 0\n private syncQueued = false\n private disposed = false\n\n constructor(readonly adapter: NavigationAdapter) {\n assertNavigationAdapter(adapter)\n this.root = Object.freeze({\n route: null,\n parent: null,\n segment: null,\n value: null,\n pathname: '/',\n })\n resolvedRouteOwners.set(this.root, this)\n this.activeContext = this.root\n this.requested = parseLocation(adapter.read())\n const initialTransition = Object.freeze({\n state: 'pending' as const,\n requestedLocation: this.requested.location,\n settledLocation: '/',\n })\n this.transitionEmitter = new Emitter<NavigationTransition>(initialTransition, {\n owner: this,\n purpose: 'browser route transition',\n })\n this.issueEmitter = new Emitter<NavigationIssue | null>(null, {\n owner: this,\n purpose: 'browser route issue',\n })\n this.transition = this.transitionEmitter\n this.issue = this.issueEmitter\n this.adapterUnsubscribe = adapter.subscribe(() => {\n this.startTransition(adapter.read(), 0, false)\n })\n this.startTransition(this.requested.location, 0, false)\n }\n\n openScope(context: ResolvedRoute, owner: object): () => void {\n this.assertActive()\n assertResolvedRoute(context, this)\n assertOwner(owner)\n const scope = this.scope(context)\n if (scope.owners.has(owner)) throw new Error('Route scope owner is already registered')\n scope.owners.set(owner, {complete: false})\n this.wakeRegistry()\n let active = true\n return () => {\n if (!active) return\n active = false\n scope.owners.delete(owner)\n this.removeOwnerEntries(scope, owner)\n this.removeOwnerQueries(scope, owner)\n if (scope.owners.size === 0\n && scope.entries.size === 0\n && scope.queries.size === 0) {\n this.scopes.delete(context)\n }\n this.wakeRegistry()\n }\n }\n\n completeScope(context: ResolvedRoute, owner: object): void {\n this.assertActive()\n assertResolvedRoute(context, this)\n const scopeOwner = this.scope(context).owners.get(owner)\n if (scopeOwner == null) throw new Error('Cannot complete an unopened route scope')\n validateScope(this.scope(context))\n scopeOwner.complete = true\n this.wakeRegistry()\n }\n\n registerSelectionRoutes(\n parent: ResolvedRoute,\n owner: object,\n bindings: readonly SelectionRouteBinding[],\n subscribe: (listener: () => void) => () => void,\n ): ReadonlyMap<LiteralRouteDescriptor, ResolvedRoute> {\n this.assertActive()\n assertResolvedRoute(parent, this)\n assertOwner(owner)\n if (!Array.isArray(bindings)) throw new TypeError('Route bindings must be an array')\n if (typeof subscribe !== 'function') {\n throw new TypeError('Selection route registration requires a subscriber')\n }\n const scope = this.scope(parent)\n const contexts = new Map<LiteralRouteDescriptor, ResolvedRoute>()\n const descriptors = new Set<LiteralRouteDescriptor>()\n for (const binding of bindings) {\n assertRouteDescriptor(binding.route)\n if (binding.route.kind !== 'literal') {\n throw new TypeError('Tab routes must use literal route descriptors')\n }\n if (descriptors.has(binding.route) || scope.entries.has(binding.route)) {\n throw new Error(`Duplicate route in one scope: ${binding.route.id}`)\n }\n descriptors.add(binding.route)\n const context = this.literalContext(parent, binding.route)\n const entry: RouteEntry = {\n owner,\n descriptor: binding.route,\n parent,\n match: (segment) => decodeSegment(segment) === binding.route.path\n ? {value: null}\n : null,\n currentValue: () => binding.active() ? null : undefined,\n activate: async (match, _context, signal) => {\n if (binding.disabled) {\n throw new RouteUnavailableError(\n `Route \"${binding.route.id}\" is currently disabled`,\n )\n }\n if (signal.aborted) throw signal.reason\n await binding.activate(signal)\n return match\n },\n context: () => context,\n disposeSubscription: () => {},\n }\n scope.entries.set(binding.route, entry)\n contexts.set(binding.route, context)\n }\n const unsubscribe = subscribe(() => this.scheduleStateSync())\n for (const descriptor of descriptors) {\n const entry = scope.entries.get(descriptor)\n if (entry != null) {\n ;(entry as {disposeSubscription: () => void}).disposeSubscription = unsubscribe\n }\n }\n this.wakeRegistry()\n return contexts\n }\n\n unregisterRoutes(parent: ResolvedRoute, owner: object): void {\n const scope = this.scopes.get(parent)\n if (scope == null) return\n this.removeOwnerEntries(scope, owner)\n this.wakeRegistry()\n }\n\n registerValueRoute<TValue>(\n parent: ResolvedRoute,\n owner: object,\n binding: ValueRouteBinding<TValue>,\n ): RouteRegistration & {contextFor(value: TValue): ResolvedRoute} {\n this.assertActive()\n assertResolvedRoute(parent, this)\n assertOwner(owner)\n assertRouteDescriptor(binding.route)\n if (binding.route.kind !== 'parameter') {\n throw new TypeError('Value routes require a parameter route descriptor')\n }\n assertWritableEmitter(binding.valueEmitter, 'Value route emitter')\n if (binding.resolve != null && typeof binding.resolve !== 'function') {\n throw new TypeError('Value route resolver must be a function')\n }\n const scope = this.scope(parent)\n if (scope.entries.has(binding.route)) {\n throw new Error(`Duplicate route in one scope: ${binding.route.id}`)\n }\n const contextFor = (value: TValue) => this.parameterContext(parent, binding.route, value)\n const unsubscribe = binding.valueEmitter.subscribe(() => this.scheduleStateSync(), {\n emitCurrent: false,\n })\n const entry: RouteEntry = {\n owner,\n descriptor: binding.route,\n parent,\n match: (segment) => {\n const decoded = decodeSegment(segment)\n const value = binding.route.codec.parse(decoded)\n const formatted = binding.route.codec.format(value)\n if (formatted !== decoded) {\n throw new TypeError(\n `Route parameter \"${binding.route.name}\" does not round-trip`,\n )\n }\n return {value}\n },\n currentValue: () => binding.valueEmitter.get(),\n activate: async (match, context, signal) => {\n const parsed = match.value as TValue\n const resolved = binding.resolve == null\n ? parsed\n : await binding.resolve(parsed, context, signal)\n if (resolved instanceof RouteRedirect) return resolved\n if (signal.aborted) throw signal.reason\n this.withApplication(() => binding.valueEmitter.set(\n resolved,\n 'route value restored',\n ))\n return {value: resolved}\n },\n context: (value) => contextFor(value as TValue),\n disposeSubscription: unsubscribe,\n }\n scope.entries.set(binding.route, entry)\n this.wakeRegistry()\n let active = true\n return {\n context: contextForCurrent(binding.valueEmitter, contextFor, parent),\n contextFor,\n dispose: () => {\n if (!active) return\n active = false\n const current = scope.entries.get(binding.route)\n if (current === entry) scope.entries.delete(binding.route)\n unsubscribe()\n this.wakeRegistry()\n },\n }\n }\n\n registerQuery<TValue>(\n context: ResolvedRoute,\n owner: object,\n binding: RouteQueryBinding<TValue>,\n ): () => void {\n this.assertActive()\n assertResolvedRoute(context, this)\n assertOwner(owner)\n const name = queryName(binding.name)\n assertWritableEmitter(binding.valueEmitter, 'Route query emitter')\n assertRouteQueryCodec(binding.codec)\n const equals = binding.equals ?? Object.is\n if (typeof equals !== 'function') throw new TypeError('Route query equals must be a function')\n const scope = this.scope(context)\n if (scope.queries.has(name)) throw new Error(`Duplicate route query name: ${name}`)\n this.knownQueryNames.add(name)\n const unsubscribe = binding.valueEmitter.subscribe(() => this.scheduleStateSync(), {\n emitCurrent: false,\n })\n const entry: QueryEntry<TValue> = {\n owner,\n context,\n name,\n emitter: binding.valueEmitter,\n codec: binding.codec,\n defaultValue: binding.defaultValue,\n equals,\n disposeSubscription: unsubscribe,\n }\n scope.queries.set(name, entry as QueryEntry<unknown>)\n this.applyQueryEntry(entry, this.requested)\n this.wakeRegistry()\n let active = true\n return () => {\n if (!active) return\n active = false\n if (scope.queries.get(name) === entry) scope.queries.delete(name)\n unsubscribe()\n this.scheduleStateSync()\n }\n }\n\n navigate(\n target: RouteTarget | ResolvedRoute,\n options: {history?: NavigationHistoryMode} = {},\n ): Promise<void> {\n this.assertActive()\n const location = isResolvedRoute(target)\n ? this.formatContext(target)\n : formatRouteTarget(assertedTarget(target))\n this.issueEmitter.set(null, 'explicit route navigation')\n if ((options.history ?? 'push') === 'replace') this.adapter.replace(location)\n else this.adapter.push(location)\n return this.startTransition(location, 0, true)\n }\n\n redirect(target: RouteTarget | ResolvedRoute): Promise<void> {\n return this.navigate(target, {history: 'replace'})\n }\n\n href(target: RouteTarget | ResolvedRoute): string {\n this.assertActive()\n const location = isResolvedRoute(target)\n ? this.formatContext(target)\n : formatRouteTarget(assertedTarget(target))\n return this.adapter.href(location)\n }\n\n resolve(route: RouteDescriptor, from: ResolvedRoute): ResolvedRoute {\n assertRouteDescriptor(route)\n assertResolvedRoute(from, this)\n let context: ResolvedRoute | null = from\n while (context != null) {\n const entry = this.scopes.get(context)?.entries.get(route)\n if (entry != null) {\n const value = entry.currentValue()\n if (entry.descriptor.kind === 'parameter' && value == null) {\n throw new Error(\n `Dynamic route \"${route.id}\" requires an explicit parameter value`,\n )\n }\n return entry.context(value)\n }\n context = context.parent\n }\n throw new Error(`Route \"${route.id}\" is not registered in the current route lineage`)\n }\n\n formatActiveLocation(): string {\n return this.formatStateLocation()\n }\n\n isActive(target: RouteTarget | ResolvedRoute, exact = false): boolean {\n const context = isResolvedRoute(target)\n ? target\n : this.resolveTargetContext(assertedTarget(target))\n return exact ? context === this.activeContext : isAncestor(context, this.activeContext)\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.controller?.abort(new DOMException('Router disposed', 'AbortError'))\n this.controller = null\n this.adapterUnsubscribe()\n for (const scope of this.scopes.values()) {\n const subscriptions = new Set<() => void>()\n for (const entry of scope.entries.values()) subscriptions.add(entry.disposeSubscription)\n for (const entry of scope.queries.values()) subscriptions.add(entry.disposeSubscription)\n for (const unsubscribe of subscriptions) unsubscribe()\n }\n this.scopes.clear()\n this.knownQueryNames.clear()\n this.wakeRegistry()\n this.transitionEmitter.dispose()\n this.issueEmitter.dispose()\n }\n\n private startTransition(\n location: string,\n redirectDepth: number,\n clearIssue: boolean,\n ): Promise<void> {\n this.assertActive()\n this.controller?.abort(new DOMException('Navigation superseded', 'AbortError'))\n const controller = new AbortController()\n this.controller = controller\n this.requested = parseLocation(location)\n if (clearIssue) this.issueEmitter.set(null, 'route transition started')\n this.transitionEmitter.set(Object.freeze({\n state: 'pending',\n requestedLocation: this.requested.location,\n settledLocation: this.formatContext(this.activeContext),\n }), 'route transition started')\n return this.runTransition(this.requested, controller, redirectDepth).catch((error) => {\n if (!controller.signal.aborted) throw error\n })\n }\n\n private async runTransition(\n requested: ParsedLocation,\n controller: AbortController,\n redirectDepth: number,\n ): Promise<void> {\n const signal = controller.signal\n let context = this.root\n const values = new Map<AnyRouteDescriptor, unknown>()\n\n for (const segment of requested.segments) {\n const scope = await this.waitForCompleteScope(context, signal)\n let match: {entry: RouteEntry; match: MatchResult} | null\n try {\n match = matchEntry(scope, segment)\n } catch (error) {\n this.fallback(requested, context, null, routeErrorMessage(error))\n return\n }\n if (match == null) {\n this.fallback(requested, context, null, `Unknown route segment \"${decodeSegment(segment)}\"`)\n return\n }\n const resolveContext: RouteResolveContext = Object.freeze({\n requestedLocation: requested.location,\n resolvedValues: values,\n })\n try {\n const result = await match.entry.activate(match.match, resolveContext, signal)\n if (result instanceof RouteRedirect) {\n if (redirectDepth >= MAX_REDIRECTS) {\n this.fallback(requested, context, match.entry.descriptor, 'Too many route redirects')\n return\n }\n const target = formatRouteTarget(result.target)\n this.adapter.replace(target)\n await this.startTransition(target, redirectDepth + 1, false)\n return\n }\n match = {entry: match.entry, match: result}\n } catch (error) {\n if (signal.aborted) return\n this.fallback(\n requested,\n context,\n match.entry.descriptor,\n routeErrorMessage(error),\n )\n return\n }\n values.set(match.entry.descriptor, match.match.value)\n context = match.entry.context(match.match.value)\n }\n\n if (signal.aborted) return\n if (context === this.root) {\n await this.waitForCompleteScope(this.root, signal)\n context = this.findActiveContext()\n }\n if (signal.aborted) return\n this.activeContext = context\n this.applyQueriesInLineage(context, requested)\n const settled = this.formatContext(context)\n if (settled !== requested.location) this.adapter.replace(settled)\n this.transitionEmitter.set(Object.freeze({\n state: 'idle',\n requestedLocation: requested.location,\n settledLocation: settled,\n }), 'route transition settled')\n this.scheduleStateSync()\n }\n\n private async waitForCompleteScope(\n context: ResolvedRoute,\n signal: AbortSignal,\n ): Promise<ScopeRecord> {\n while (true) {\n if (signal.aborted) throw signal.reason\n const scope = this.scopes.get(context)\n if (scope != null && isScopeComplete(scope)) return scope\n await this.waitForRegistryChange(signal)\n }\n }\n\n private waitForRegistryChange(signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const wake = () => {\n signal.removeEventListener('abort', abort)\n this.registryWaiters.delete(wake)\n resolve()\n }\n const abort = () => {\n this.registryWaiters.delete(wake)\n reject(signal.reason)\n }\n this.registryWaiters.add(wake)\n signal.addEventListener('abort', abort, {once: true})\n })\n }\n\n private wakeRegistry(): void {\n const waiters = [...this.registryWaiters]\n this.registryWaiters.clear()\n for (const wake of waiters) wake()\n }\n\n private fallback(\n requested: ParsedLocation,\n context: ResolvedRoute,\n failedRoute: AnyRouteDescriptor | null,\n reason: string,\n ): void {\n this.activeContext = context\n const fallbackLocation = context === this.root\n ? this.formatStateLocation()\n : this.formatContext(context)\n this.adapter.replace(fallbackLocation)\n this.issueEmitter.set(Object.freeze({\n requestedLocation: requested.location,\n failedRouteId: failedRoute?.id ?? null,\n reason,\n fallbackLocation,\n }), 'route fallback selected')\n this.transitionEmitter.set(Object.freeze({\n state: 'idle',\n requestedLocation: requested.location,\n settledLocation: fallbackLocation,\n }), 'route transition fell back')\n }\n\n private literalContext(\n parent: ResolvedRoute,\n route: LiteralRouteDescriptor,\n ): ResolvedRoute {\n return this.cachedContext(parent, route, route.path, null)\n }\n\n private resolveTargetContext(target: RouteTarget): ResolvedRoute {\n let context = this.root\n for (const part of target.routes) {\n if ('route' in part) {\n context = this.parameterContext(context, part.route, part.value)\n } else {\n context = this.literalContext(context, part)\n }\n }\n return context\n }\n\n private parameterContext<TValue>(\n parent: ResolvedRoute,\n route: ParameterRouteDescriptor<TValue>,\n value: TValue,\n ): ResolvedRoute {\n const formatted = route.codec.format(value)\n if (typeof formatted !== 'string' || formatted === '' || formatted.includes('/')) {\n throw new TypeError(`Route parameter \"${route.name}\" must format one path segment`)\n }\n return this.cachedContext(parent, route, formatted, value)\n }\n\n private cachedContext(\n parent: ResolvedRoute,\n route: AnyRouteDescriptor,\n segment: string,\n value: unknown,\n ): ResolvedRoute {\n const pathname = joinPath(parent.pathname, segment)\n const key = `${contextKey(parent)}\\u0000${route.id}\\u0000${segment}`\n const existing = this.contextCache.get(key)\n if (existing != null) return existing\n const context: ResolvedRoute = Object.freeze({route, parent, segment, value, pathname})\n resolvedRouteOwners.set(context, this)\n this.contextCache.set(key, context)\n return context\n }\n\n private scope(context: ResolvedRoute): ScopeRecord {\n let scope = this.scopes.get(context)\n if (scope == null) {\n scope = {owners: new Map(), entries: new Map(), queries: new Map()}\n this.scopes.set(context, scope)\n }\n return scope\n }\n\n private removeOwnerEntries(scope: ScopeRecord, owner: object): void {\n const subscriptions = new Set<() => void>()\n for (const [route, entry] of scope.entries) {\n if (entry.owner !== owner) continue\n subscriptions.add(entry.disposeSubscription)\n scope.entries.delete(route)\n }\n for (const unsubscribe of subscriptions) unsubscribe()\n }\n\n private removeOwnerQueries(scope: ScopeRecord, owner: object): void {\n for (const [name, entry] of scope.queries) {\n if (entry.owner !== owner) continue\n entry.disposeSubscription()\n scope.queries.delete(name)\n }\n }\n\n private scheduleStateSync(): void {\n if (this.applying > 0 || this.disposed || this.syncQueued) return\n this.syncQueued = true\n queueMicrotask(() => {\n this.syncQueued = false\n if (this.applying > 0 || this.disposed) return\n if (this.transitionEmitter.get().state === 'pending') return\n const location = this.formatStateLocation()\n if (location !== this.adapter.read()) this.adapter.replace(location)\n this.requested = parseLocation(location)\n this.activeContext = this.findActiveContext()\n this.transitionEmitter.set(Object.freeze({\n ...this.transitionEmitter.get(),\n state: 'idle',\n settledLocation: location,\n }), 'route state synchronized')\n })\n }\n\n private formatStateLocation(): string {\n return this.formatContext(this.findActiveContext())\n }\n\n private findActiveContext(): ResolvedRoute {\n let context = this.root\n const visited = new Set<ResolvedRoute>()\n while (!visited.has(context)) {\n visited.add(context)\n const scope = this.scopes.get(context)\n if (scope == null) break\n const active = [...scope.entries.values()].filter((entry) =>\n entry.currentValue() !== undefined && entry.currentValue() !== null)\n const nullableLiteral = [...scope.entries.values()].find((entry) =>\n entry.descriptor.kind === 'literal' && entry.currentValue() === null)\n const entry = active[0] ?? nullableLiteral\n if (entry == null) break\n const value = entry.currentValue()\n context = entry.context(value)\n }\n return context\n }\n\n private formatContext(context: ResolvedRoute): string {\n const search = new URLSearchParams(this.requested.search)\n for (const name of this.knownQueryNames) search.delete(name)\n for (const lineageContext of routeLineage(context)) {\n const scope = this.scopes.get(lineageContext)\n if (scope == null) continue\n for (const entry of [...scope.queries.values()].sort((left, right) =>\n left.name.localeCompare(right.name))) {\n if (entry.equals(entry.emitter.get(), entry.defaultValue)) continue\n const values = entry.codec.format(entry.emitter.get())\n if (!Array.isArray(values)) {\n throw new TypeError(`Route query \"${entry.name}\" codec must format an array`)\n }\n for (const value of values) search.append(entry.name, value)\n }\n }\n search.sort()\n const query = search.toString()\n return `${context.pathname}${query === '' ? '' : `?${query}`}`\n }\n\n private applyQueriesInLineage(context: ResolvedRoute, requested: ParsedLocation): void {\n for (const lineageContext of routeLineage(context)) {\n const scope = this.scopes.get(lineageContext)\n if (scope == null) continue\n for (const entry of scope.queries.values()) this.applyQueryEntry(entry, requested)\n }\n }\n\n private applyQueryEntry<TValue>(entry: QueryEntry<TValue>, requested: ParsedLocation): void {\n if (!isAncestor(entry.context, this.activeContext)\n && !isPathPrefix(entry.context.pathname, requested.pathname)) return\n const raw = requested.search.getAll(entry.name)\n try {\n const value = raw.length === 0 ? entry.defaultValue : entry.codec.parse(raw)\n if (!entry.equals(entry.emitter.get(), value)) {\n this.withApplication(() => entry.emitter.set(value, 'route query restored'))\n }\n } catch (error) {\n if (!entry.equals(entry.emitter.get(), entry.defaultValue)) {\n this.withApplication(() => entry.emitter.set(\n entry.defaultValue,\n 'invalid route query defaulted',\n ))\n }\n const search = new URLSearchParams(requested.search)\n search.delete(entry.name)\n search.sort()\n const fallbackLocation = `${requested.pathname}${search.size === 0\n ? ''\n : `?${search.toString()}`}`\n this.adapter.replace(fallbackLocation)\n this.issueEmitter.set(Object.freeze({\n requestedLocation: requested.location,\n failedRouteId: entry.context.route?.id ?? null,\n reason: routeErrorMessage(error),\n fallbackLocation,\n }), 'invalid route query')\n }\n }\n\n private withApplication(action: () => void): void {\n this.applying += 1\n try {\n action()\n } finally {\n this.applying -= 1\n }\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('BrowserRouter has been disposed')\n }\n}\n\nconst resolvedRouteOwners = new WeakMap<object, BrowserRouter>()\n\nexport function createBrowserRouter(options: BrowserRouterOptions): BrowserRouter {\n if (options == null || typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('Browser router options must be an object')\n }\n return new BrowserRouter(options.adapter)\n}\n\nexport function waitForRouteValue<TValue, TError>(\n emitter: ReadableEmitter<TValue, TError>,\n accept: (value: TValue) => boolean,\n signal: AbortSignal,\n): Promise<TValue> {\n if (emitter == null || typeof emitter.subscribe !== 'function') {\n throw new TypeError('waitForRouteValue requires a readable emitter')\n }\n if (typeof accept !== 'function') {\n throw new TypeError('waitForRouteValue requires an acceptance predicate')\n }\n return new Promise((resolve, reject) => {\n let settled = false\n let unsubscribe = () => {}\n const finish = (action: () => void) => {\n if (settled) return\n settled = true\n unsubscribe()\n signal.removeEventListener('abort', abort)\n action()\n }\n const abort = () => {\n finish(() => reject(signal.reason))\n }\n const inspect = (value: TValue, fetchState: string, error: TError | null) => {\n if (fetchState === 'error') {\n finish(() => reject(\n error ?? new RouteUnavailableError('Route prerequisite failed'),\n ))\n } else if (accept(value)) {\n finish(() => resolve(value))\n }\n }\n if (signal.aborted) {\n abort()\n return\n }\n inspect(emitter.get(), emitter.getFetchState(), emitter.getError())\n if (settled) return\n unsubscribe = emitter.subscribe(({value, fetchState, error}) => {\n inspect(value, fetchState, error)\n }, {emitCurrent: false})\n if (settled) unsubscribe()\n else signal.addEventListener('abort', abort, {once: true})\n })\n}\n\nfunction parseLocation(location: string): ParsedLocation {\n const normalized = normalizeRouteLocation(location)\n const queryIndex = normalized.indexOf('?')\n const pathname = queryIndex < 0 ? normalized : normalized.slice(0, queryIndex)\n const query = queryIndex < 0 ? '' : normalized.slice(queryIndex + 1)\n const rawSegments = pathname.split('/').filter(Boolean)\n return Object.freeze({\n location: normalized,\n pathname,\n segments: Object.freeze(rawSegments),\n search: new URLSearchParams(query),\n })\n}\n\nfunction validateScope(scope: ScopeRecord): void {\n const ids = new Set<string>()\n const literalPaths = new Set<string>()\n let parameter: AnyRouteDescriptor | null = null\n for (const entry of scope.entries.values()) {\n if (ids.has(entry.descriptor.id)) {\n throw new Error(`Duplicate route id in one scope: ${entry.descriptor.id}`)\n }\n ids.add(entry.descriptor.id)\n if (entry.descriptor.kind === 'literal') {\n if (literalPaths.has(entry.descriptor.path)) {\n throw new Error(`Duplicate route path in one scope: ${entry.descriptor.path}`)\n }\n literalPaths.add(entry.descriptor.path)\n } else if (parameter != null) {\n throw new Error(\n `Ambiguous parameter routes in one scope: ${parameter.id}, ${entry.descriptor.id}`,\n )\n } else {\n parameter = entry.descriptor\n }\n }\n}\n\nfunction matchEntry(\n scope: ScopeRecord,\n segment: string,\n): {entry: RouteEntry; match: MatchResult} | null {\n const entries = [...scope.entries.values()].sort((left, right) =>\n left.descriptor.kind === right.descriptor.kind\n ? 0\n : left.descriptor.kind === 'literal' ? -1 : 1)\n for (const entry of entries) {\n const match = entry.match(segment)\n if (match != null) return {entry, match}\n }\n return null\n}\n\nfunction isScopeComplete(scope: ScopeRecord): boolean {\n return scope.owners.size > 0\n && [...scope.owners.values()].every(({complete}) => complete)\n}\n\nfunction routeLineage(context: ResolvedRoute): ResolvedRoute[] {\n const result: ResolvedRoute[] = []\n let current: ResolvedRoute | null = context\n while (current != null) {\n result.unshift(current)\n current = current.parent\n }\n return result\n}\n\nfunction isAncestor(ancestor: ResolvedRoute, context: ResolvedRoute): boolean {\n let current: ResolvedRoute | null = context\n while (current != null) {\n if (current === ancestor) return true\n current = current.parent\n }\n return false\n}\n\nfunction isPathPrefix(parent: string, path: string): boolean {\n return parent === '/' || path === parent || path.startsWith(`${parent}/`)\n}\n\nfunction joinPath(parent: string, segment: string): string {\n return `${parent === '/' ? '' : parent}/${encodeURIComponent(segment)}`\n}\n\nfunction contextKey(context: ResolvedRoute): string {\n return context.pathname\n}\n\nfunction decodeSegment(segment: string): string {\n try {\n return decodeURIComponent(segment)\n } catch {\n throw new RouteUnavailableError('Route contains malformed percent encoding')\n }\n}\n\nfunction queryName(value: unknown): string {\n if (typeof value !== 'string' || !/^[A-Za-z][A-Za-z0-9_.-]*$/.test(value)) {\n throw new TypeError('Route query name must start with a letter and use URL-safe characters')\n }\n return value\n}\n\nfunction routeErrorMessage(error: unknown): string {\n return error instanceof Error && error.message !== ''\n ? error.message\n : 'The requested route could not be resolved'\n}\n\nfunction contextForCurrent<TValue>(\n emitter: WritableEmitter<TValue | null>,\n contextFor: (value: TValue) => ResolvedRoute,\n parent: ResolvedRoute,\n): ResolvedRoute {\n const current = emitter.get()\n return current == null ? parent : contextFor(current)\n}\n\nfunction assertedTarget(target: RouteTarget): RouteTarget {\n assertRouteTarget(target)\n return target\n}\n\nfunction isResolvedRoute(value: unknown): value is ResolvedRoute {\n return value != null && typeof value === 'object' && resolvedRouteOwners.has(value)\n}\n\nfunction assertResolvedRoute(\n value: unknown,\n router: BrowserRouter,\n): asserts value is ResolvedRoute {\n if (value === router.root) return\n if (!isResolvedRoute(value) || resolvedRouteOwners.get(value) !== router) {\n throw new TypeError('Resolved route does not belong to this router')\n }\n}\n\nfunction assertNavigationAdapter(value: unknown): asserts value is NavigationAdapter {\n if (value == null\n || typeof value !== 'object'\n || typeof Reflect.get(value, 'read') !== 'function'\n || typeof Reflect.get(value, 'href') !== 'function'\n || typeof Reflect.get(value, 'push') !== 'function'\n || typeof Reflect.get(value, 'replace') !== 'function'\n || typeof Reflect.get(value, 'subscribe') !== 'function') {\n throw new TypeError('BrowserRouter requires a navigation adapter')\n }\n}\n\nfunction assertOwner(value: unknown): asserts value is object {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {\n throw new TypeError('Route registration owner must be an object')\n }\n}\n\nfunction assertWritableEmitter(value: unknown, label: string): void {\n if (value == null\n || typeof value !== 'object'\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(`${label} must be a writable emitter`)\n }\n}\n","import {Component, css} from '../Components/component.js'\nimport type {FrayChild, Key} from '../Components/component.js'\nimport {componentClass, controlId, createValueEmitter} from '../Components/controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../Components/controlUtils.js'\nimport {\n RoutedSelectionController,\n readContentMountPolicy,\n} from '../Components/layout/routedSelection.js'\nimport type {\n ContentMountPolicy,\n RoutedSelectionItem,\n} from '../Components/layout/routedSelection.js'\nimport {RouteScope} from './RouteScope.js'\nimport type {LiteralRouteDescriptor} from './route.js'\n\nexport interface RouteOutletDefinition {\n id: Key\n route: LiteralRouteDescriptor\n disabled?: boolean\n content?: FrayChild\n component?: FrayChild\n}\n\nexport interface RouteOutletProps extends ValueControlProps<Key | null> {\n id?: string | number | null\n views: readonly RouteOutletDefinition[]\n activeViewEmitter?: ValueEmitter<Key | null>\n initialActiveViewId?: Key | null\n /** Controls when routed content is mounted and whether inactive content is retained. */\n mountPolicy?: ContentMountPolicy\n}\n\ninterface NormalizedRouteView extends RoutedSelectionItem {\n route: LiteralRouteDescriptor\n content: FrayChild\n}\n\n/** Demand-driven non-tab routed content with application-owned selection state. */\nexport class RouteOutlet extends Component<RouteOutletProps> {\n static override liveProps: readonly string[] = []\n readonly valueEmitter: ValueEmitter<Key | null>\n readonly activeViewEmitter: ValueEmitter<Key | null>\n readonly outletId: string\n private readonly selection: RoutedSelectionController<NormalizedRouteView>\n\n constructor(props: RouteOutletProps) {\n super(props)\n const views = normalizeViews(props.views)\n const emitterProps: RouteOutletProps = {...props}\n if (emitterProps.valueEmitter == null && props.activeViewEmitter != null) {\n emitterProps.valueEmitter = props.activeViewEmitter\n }\n if (emitterProps.defaultValue == null && props.initialActiveViewId != null) {\n emitterProps.defaultValue = props.initialActiveViewId\n }\n this.valueEmitter = createValueEmitter<Key | null>(\n this,\n emitterProps,\n views.find((view) => !view.disabled)?.id ?? null,\n 'active route view',\n )\n this.activeViewEmitter = this.valueEmitter\n this.outletId = controlId('route-outlet', props.id)\n this.selection = new RoutedSelectionController(this, this.valueEmitter, {\n subject: 'outlet views',\n restoredCause: 'route view restored',\n pendingCause: 'pending route view selected',\n selectedCause: 'route view selected',\n })\n }\n\n initialize(): void {\n const views = normalizeViews(this.props.views)\n readContentMountPolicy(this.props.mountPolicy, 'RouteOutlet')\n this.selection.prepare(views)\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: RouteOutletProps): this {\n readContentMountPolicy(nextProps.mountPolicy, 'RouteOutlet')\n super.setProps(nextProps)\n this.selection.prepare(normalizeViews(nextProps.views))\n this.update()\n return this\n }\n\n render(): FrayChild {\n const views = normalizeViews(this.props.views)\n const policy = readContentMountPolicy(this.props.mountPolicy, 'RouteOutlet')\n const selected = this.selection.selected(views)\n const mountedIds = this.selection.updateMounted(views, policy)\n const Host = this.Host\n return <Host\n id={this.outletId}\n className={componentClass(this.props) || null}\n >{views.map((view) => {\n const active = selected != null && Object.is(selected.id, view.id)\n return <div\n key={String(view.id)}\n hidden={!active}\n >{mountedIds.has(view.id)\n ? this.selection.scopedContent(view, view.content)\n : null}</div>\n })}</Host>\n }\n\n override onDestroy(): void {\n this.selection.dispose()\n }\n\n static dependencies = [RouteScope]\n static override hostName = 'route-outlet'\n\n static override css = css`\n & {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n & > div {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n & > div[hidden] {\n display: none;\n }\n `\n}\n\nfunction normalizeViews(views: unknown): NormalizedRouteView[] {\n if (!Array.isArray(views)) throw new TypeError('RouteOutlet views must be an array')\n const ids = new Set<Key>()\n const routes = new Set<LiteralRouteDescriptor>()\n return views.map((view: RouteOutletDefinition) => {\n if (view == null || view.id == null) throw new TypeError('Each route view requires an id')\n if (view.route == null || view.route.kind !== 'literal') {\n throw new TypeError('Each route view requires a literal route descriptor')\n }\n if (ids.has(view.id)) throw new Error(`Duplicate route view id: ${String(view.id)}`)\n if (routes.has(view.route)) throw new Error(`Duplicate outlet route: ${view.route.id}`)\n ids.add(view.id)\n routes.add(view.route)\n return {\n id: view.id,\n route: view.route,\n disabled: Boolean(view.disabled),\n content: view.content ?? view.component ?? [],\n }\n })\n}\n","import {Component, Fragment, h} from '../Components/component.js'\nimport type {ComponentProps, FrayChild, WritableEmitter} from '../Components/component.js'\nimport type {RouteQueryCodec} from './route.js'\n\nexport interface RouteQueryProps<TValue> extends ComponentProps {\n name: string\n valueEmitter: WritableEmitter<TValue>\n codec: RouteQueryCodec<TValue>\n defaultValue: TValue\n equals?: (left: TValue, right: TValue) => boolean\n}\n\n/** Synchronize one explicitly declared application value with a URL query key. */\nexport class RouteQuery<TValue> extends Component<RouteQueryProps<TValue>> {\n static override liveProps: readonly string[] = []\n private unregister: (() => void) | null = null\n\n initialize(): void {\n const router = this._runtime.router\n if (router == null || this._routeContext == null) {\n throw new Error('RouteQuery requires a router and contextual route scope')\n }\n this.unregister = router.registerQuery(this._routeContext, this, {\n name: this.props.name,\n valueEmitter: this.props.valueEmitter,\n codec: this.props.codec,\n defaultValue: this.props.defaultValue,\n ...(this.props.equals == null ? {} : {equals: this.props.equals}),\n })\n }\n\n render(): FrayChild {\n return h(Fragment, null, this.props.children ?? [])\n }\n\n override onDestroy(): void {\n this.unregister?.()\n this.unregister = null\n }\n}\n","import {Component, Fragment, h} from '../Components/component.js'\nimport type {\n ComponentProps,\n FrayChild,\n WritableEmitter,\n} from '../Components/component.js'\nimport {RouteScope} from './RouteScope.js'\nimport type {\n ParameterRouteDescriptor,\n RouteValueResolver,\n} from './route.js'\nimport type {ResolvedRoute, RouteRegistration} from './router.js'\n\nexport interface RouteValueProps<TValue> extends ComponentProps {\n route: ParameterRouteDescriptor<TValue>\n valueEmitter: WritableEmitter<TValue | null>\n resolve?: RouteValueResolver<TValue>\n /** Make the active dynamic value the parent context for nested routes. */\n scopeChildren?: boolean\n}\n\n/** Bind one dynamic child path segment to an application-owned value. */\nexport class RouteValue<TValue> extends Component<RouteValueProps<TValue>> {\n static override liveProps: readonly string[] = []\n private registration: (RouteRegistration & {\n contextFor(value: TValue): ResolvedRoute\n }) | null = null\n\n initialize(): void {\n const router = this._runtime.router\n if (router == null || this._routeContext == null) {\n throw new Error('RouteValue requires a router and contextual route scope')\n }\n this.registration = router.registerValueRoute(this._routeContext, this, {\n route: this.props.route,\n valueEmitter: this.props.valueEmitter,\n ...(this.props.resolve == null ? {} : {resolve: this.props.resolve}),\n })\n this.watch(this.props.valueEmitter)\n }\n\n render(): FrayChild {\n const value = this.props.valueEmitter.get()\n const children = this.props.children ?? []\n if (!this.props.scopeChildren || value == null || this.registration == null) {\n return h(Fragment, null, children)\n }\n return h(RouteScope, {\n key: this.registration.contextFor(value).pathname,\n context: this.registration.contextFor(value),\n children,\n })\n }\n\n override onDestroy(): void {\n this.registration?.dispose()\n this.registration = null\n }\n}\n"],"names":["Tab","Component","__publicField","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","tabs","validateTabs","emitterProps","_a","tab","event","label","baseId","activeTabId","Host","jsx","index","tabButtonId","tabPanelId","enabled","tabIndex","current","next","css","id","safeId","ids","RouteScope","router","h","Fragment","RoutedSelectionController","owner","valueEmitter","items","requested","item","policy","availableIds","selectedId","context","content","parent","routed","listener","transition","requestedPathname","readContentMountPolicy","componentName","TabPanel","extractTabs","nextProps","mountPolicy","mountedTabIds","jsxs","disabled","selected","_event","direct","declarative","child","isVNode","tabProps","routeDescriptors","routeTargets","RouteRedirect","target","assertRouteTarget","RouteUnavailableError","message","stringRouteCodec","stringRouteQueryCodec","booleanRouteQueryCodec","defineRoute","path","normalizedId","routeName","normalizedPath","routeSegment","descriptor","defineRouteParameter","codec","normalizedName","assertRouteCodec","routeParameter","route","assertRouteDescriptor","formatted","assertFormattedSegment","routeTarget","routes","part","isRouteParameterValue","withRouteQuery","query","redirectTo","isRouteDescriptor","isRouteTarget","assertRouteQueryCodec","formatRouteTarget","segments","search","raw","left","right","RouteLink","_to","exact","children","onClick","anchorProps","shouldHandleClick","download","NavigationBar","validateNavigation","FrayApp","before","targetDocument","parentDocument","dependency","_children","_key","classAlias","className","_island","sizing","landmark","hostProps","rootClassName","mergeClassNames","sizingClassName","landmarkRole","mountFrayApp","runtime","appType","FrayRuntime","caller","merged","Header","level","Heading","GroupPanel","header","OptionGroup","ariaLabel","headerEnd","required","error","OptionsPanel","panelLiveProps","Panel","toolbar","orientation","title","Sidebar","SplitView","primary","secondary","direction","primarySize","primaryLabel","secondaryLabel","DescriptionItem","term","DescriptionList","Placeholder","width","normalizeWidth","numeric","matchesFilterState","state","dimensions","assertDefinitions","dimension","optionState","active","option","preferred","filterByState","deriveFilterPredicate","DerivedEmitter","deriveFilteredItems","currentItems","currentState","serializeFilterState","assertFilterState","dimensionKey","optionKey","parseFilterState","isRecord","rawOptions","assertKey","dimensionKeys","optionKeys","BaseSelectionHandler","getItems","getKey","defaultItemKey","selectedItemsEmitter","rows","row","clampIndex","onKeyDown","onMouseDown","onMouseEnter","ownerDocument","onMouseUp","lastIndex","nextIndex","_startIndex","_endIndex","_index","cause","selectedKeys","cleanup","suppressClick","SingleSelectionHandler","config","owned","selectedItemEmitter","SingleSelectionArrayView","MultiSelectionHandler","first","last","range","isCommandPressed","mergeByKey","key","candidate","candidateIndex","startIndex","endIndex","createSelectionHandler","source","eventOrCause","notification","length","result","keys","ListView","isReadableEmitter","normalizeKeyGetter","status","isLoading","FetchState","errorMessage","_","defaultItemLabel","dom","itemKey","isRenderablePrimitive","CheckableControl","checkboxLiveProps","Checkbox","componentType","validateSymbols","currentIndex","nextValue","semanticState","semanticIndex","symbol","shellSymbol","stateName","checked","isCheckedSemanticState","symbols","tuple","FilterPanel","isEmitterLike","fetchState","_b","_c","filters","normalizeFilters","filterModes","defaultSemanticState","activeValues","optionValue","hostClass","optionLabel","FilterModeCheckbox","nextState","_dom","emitter","existing","isFrayLabel","TableHeaderCell","currentSort","isFilterSelectionEntry","filterLabel","panel","entry","TableHeader","column","DefaultTableFilterEncoding","serializeTableQuery","url","sort","assertUrlLike","assertSort","field","entries","applyLocalTableState","filtered","matchesFilters","compareValues","readField","isSortDirection","searchParams","createLocalTableDataSource","createState","ownedData","data","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","sourceError","expanded","visible","flattenVisible","depth","position","setSize","hasChildren","isExpanded","isSelected","labelClassName","_e","labelStyle","_g","_f","isExpanderTarget","allKeys","flattenAll","retained","sameKeys","contains","matches","match","textValue","parentId","buttonLiveProps","Button","type","pressed","busy","busyLabel","normalContent","unavailable","dialogLiveProps","Dialog","description","actions","closeLabel","showCloseButton","element","dialog","shouldOpen","showModal","focusInitial","restore","ref","_QuadCheckbox","QuadCheckbox","_TriCheckbox","TriCheckbox","LabeledInputControl","SelectControl","dropdownLiveProps","Dropdown","suppliedOptions","firstValue","placeholder","onChange","currentValue","eventValue","labelLiveProps","Label","text","htmlFor","radioButtonLiveProps","radioGroupLiveProps","RadioButton","RadioGroup","validateRadioOptions","selectedValue","textboxLiveProps","Textbox","readOnly","autoComplete","inputMode","minLength","maxLength","pattern","inputRef","onInput","toggleLiveProps","Toggle","validateToggleOptions","selectedIndex","radio","Toolbar","ProgressBar","max","sourceValue","percentage","valueText","frayThemeVariableCatalog","paletteRamp","variable","frayThemeOptions","themeOption","distributedAssetUrl","frayColorOptions","replaceFrayStylesheet","kind","selection","assertOption","selector","link","setFrayAppearance","appearance","getFrayAppearance","findFrayStylesheetOption","layer","family","stop","href","packageRelativePath","stylesheetPickerLiveProps","StylesheetPicker","defaults","validateOptions","ThemePicker","ColorPicker","MemoryNavigationAdapter","initialLocation","normalizeRouteLocation","location","createHistoryNavigation","assertBrowserTarget","basePath","normalizeBasePath","pathname","relative","normalized","createHashNavigation","notify","hashIndex","withoutHash","queryIndex","rawPath","MAX_REDIRECTS","BrowserRouter","adapter","assertNavigationAdapter","resolvedRouteOwners","parseLocation","initialTransition","assertResolvedRoute","assertOwner","scope","scopeOwner","validateScope","bindings","subscribe","contexts","descriptors","binding","segment","decodeSegment","_context","signal","unsubscribe","assertWritableEmitter","contextFor","decoded","parsed","resolved","contextForCurrent","queryName","equals","isResolvedRoute","assertedTarget","from","isAncestor","subscriptions","redirectDepth","clearIssue","controller","matchEntry","routeErrorMessage","resolveContext","settled","isScopeComplete","resolve","reject","wake","abort","waiters","failedRoute","reason","fallbackLocation","joinPath","contextKey","visited","nullableLiteral","lineageContext","routeLineage","isPathPrefix","action","createBrowserRouter","waitForRouteValue","accept","finish","inspect","rawSegments","literalPaths","parameter","complete","ancestor","RouteOutlet","views","normalizeViews","view","mountedIds","RouteQuery","RouteValue"],"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/routing/RouteScope.tsx","../src/Components/layout/routedSelection.ts","../src/Components/layout/tabpanel/tabpanel.tsx","../src/routing/route.ts","../src/routing/RouteLink.tsx","../src/Components/navigation/navigationBar.tsx","../src/Components/app/app.tsx","../src/Components/layout/header.tsx","../src/Components/layout/groupPanel.tsx","../src/Components/layout/optionGroup.tsx","../src/Components/layout/optionsPanel.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/CheckableControl.ts","../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/LabeledInputControl.ts","../src/Components/lineinputs/SelectControl.ts","../src/Components/lineinputs/dropdown.tsx","../src/Components/lineinputs/label.tsx","../src/Components/lineinputs/radio.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","../src/routing/navigationAdapter.ts","../src/routing/router.ts","../src/routing/RouteOutlet.tsx","../src/routing/RouteQuery.tsx","../src/routing/RouteValue.tsx"],"sourcesContent":["import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport type {LiteralRouteDescriptor} from '../../../routing/route.js'\n\nexport interface TabProps extends ComponentProps {\n id?: Key\n label?: FrayChild\n disabled?: boolean\n route?: LiteralRouteDescriptor\n}\n\n/** Declarative content marker consumed by TabPanel. */\nexport class Tab extends Component<TabProps> {\n static override liveProps: readonly string[] = []\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 /** @internal Lets TabPanel route activation before changing the value. */\n onSelectTab?: (tab: TabLineTab, event: Event | null) => void\n}\n\nexport class TabLine extends Component<TabLineProps> {\n static override liveProps: readonly string[] = []\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 if (this.props.onSelectTab == null) {\n this.valueEmitter.set(tab.id, 'tab selected')\n } else {\n this.props.onSelectTab(tab, event)\n }\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\n static override css = css`\n & {\n display: flex;\n background: var(--tabline-background);\n flex-flow: row wrap;\n overflow: hidden;\n padding-top: 3px;\n padding-inline-start: var(--tabline-padding-inline-start);\n flex: 0 0 auto;\n z-index: 0;\n }\n\n & > button[role=\"tab\"] {\n position: relative;\n min-height: calc(var(--control-min-height, 2rem) - 5px);\n padding-block: 0;\n padding-inline: var(--space-sm);\n color: var(--button-color);\n background: var(--tab-button-background);\n border: none;\n border-radius: var(--radius-md) var(--radius-md) 0 0;\n box-shadow: var(--tab-button-shadow);\n box-sizing: border-box;\n align-self: flex-end;\n cursor: default;\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n margin-block-start: 3px;\n user-select: none;\n white-space: nowrap;\n }\n\n & > button[role=\"tab\"]:hover:not(:disabled)[aria-selected=\"false\"] {\n background: var(--button-background-hover);\n }\n\n & > button[role=\"tab\"]:not(:disabled)[aria-selected=\"true\"] {\n min-height: var(--control-min-height, 2rem);\n padding-block-start: 3px;\n background: var(--tab-button-background-active);\n box-shadow: var(--tab-button-shadow-active);\n margin-block-start: 0;\n z-index: 1;\n }\n\n & > button[role=\"tab\"]:not(:disabled)[aria-selected=\"false\"]::after {\n content: '';\n position: absolute;\n inset-inline: 0;\n block-size: 1px;\n inset-block-end: -1px;\n box-shadow: var(--tab-button-inactive-bottom-shadow);\n z-index: 1;\n }\n\n & > button[role=\"tab\"]:disabled {\n color: var(--input-color-disabled);\n background: var(--button-background-disabled);\n border: var(--button-border-disabled);\n cursor: not-allowed;\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, Fragment, h} from '../Components/component.js'\nimport type {ComponentProps, FrayChild} from '../Components/component.js'\nimport type {ResolvedRoute} from './router.js'\n\nexport interface RouteScopeProps extends ComponentProps {\n /** Resolved contextual route inherited by every nested component. */\n context: ResolvedRoute\n}\n\n/** Context carrier used by route-aware controls and advanced compositions. */\nexport class RouteScope extends Component<RouteScopeProps> {\n static override liveProps: readonly string[] = []\n private closeScope: (() => void) | null = null\n\n initialize(): void {\n const router = this._runtime.router\n if (router == null) throw new Error('RouteScope requires a router in FrayRuntime')\n this.closeScope = router.openScope(this.props.context, this)\n }\n\n render(): FrayChild {\n return h(Fragment, null, this.props.children ?? [])\n }\n\n override afterMount(): void {\n this._runtime.router?.completeScope(this.props.context, this)\n }\n\n override _routeContextForChildren(): ResolvedRoute {\n return this.props.context\n }\n\n override onDestroy(): void {\n this.closeScope?.()\n this.closeScope = null\n }\n}\n","import type {FrayChild, Key} from '../component.js'\nimport {Component, h} from '../component.js'\nimport type {ValueEmitter} from '../controlUtils.js'\nimport {RouteScope} from '../../routing/RouteScope.js'\nimport type {LiteralRouteDescriptor} from '../../routing/route.js'\nimport type {BrowserRouter, ResolvedRoute} from '../../routing/router.js'\n\nexport type ContentMountPolicy = 'eager' | 'lazy' | 'active-only'\n\nexport interface RoutedSelectionItem {\n id: Key\n disabled: boolean\n route?: LiteralRouteDescriptor\n}\n\ninterface RoutedSelectionOptions {\n subject: string\n restoredCause: string\n pendingCause: string\n selectedCause: string\n}\n\n/** @internal Shared literal-route and mounted-content lifecycle for selection owners. */\nexport class RoutedSelectionController<TItem extends RoutedSelectionItem> {\n private routeContexts = new Map<LiteralRouteDescriptor, ResolvedRoute>()\n private readonly mountedIds = new Set<Key>()\n private registeredRouter: BrowserRouter | null = null\n private registeredParent: ResolvedRoute | null = null\n\n constructor(\n private readonly owner: Component,\n readonly valueEmitter: ValueEmitter<Key | null>,\n private readonly options: RoutedSelectionOptions,\n ) {}\n\n prepare(items: readonly TItem[]): void {\n this.registerRoutes(items)\n const requested = this.pendingItem(items)\n if (requested != null) {\n this.valueEmitter.set(requested.id, this.options.pendingCause)\n } else if (!items.some(({id}) => Object.is(id, this.valueEmitter.get()))) {\n this.valueEmitter.set(items.find((item) => !item.disabled)?.id ?? null)\n }\n }\n\n selected(items: readonly TItem[]): TItem | null {\n return items.find(({id}) => Object.is(id, this.valueEmitter.get()))\n ?? items.find((item) => !item.disabled)\n ?? null\n }\n\n updateMounted(items: readonly TItem[], policy: ContentMountPolicy): ReadonlySet<Key> {\n const availableIds = new Set(items.map(({id}) => id))\n for (const id of this.mountedIds) {\n if (!availableIds.has(id)) this.mountedIds.delete(id)\n }\n\n const selectedId = this.selected(items)?.id\n if (policy === 'eager') {\n for (const {id} of items) this.mountedIds.add(id)\n } else {\n if (policy === 'active-only') this.mountedIds.clear()\n if (selectedId !== undefined) this.mountedIds.add(selectedId)\n }\n return this.mountedIds\n }\n\n select(item: TItem): void {\n const context = item.route == null ? null : this.routeContexts.get(item.route)\n if (context == null) {\n this.valueEmitter.set(item.id, this.options.selectedCause)\n } else {\n void this.registeredRouter?.navigate(context)\n }\n }\n\n scopedContent(item: TItem, content: FrayChild): FrayChild {\n const context = item.route == null ? null : this.routeContexts.get(item.route)\n return context == null\n ? content\n : h(RouteScope, {key: context.pathname, context}, content)\n }\n\n dispose(): void {\n if (this.registeredRouter != null && this.registeredParent != null) {\n this.registeredRouter.unregisterRoutes(this.registeredParent, this.owner)\n }\n this.registeredRouter = null\n this.registeredParent = null\n this.routeContexts.clear()\n this.mountedIds.clear()\n }\n\n private registerRoutes(items: readonly TItem[]): void {\n const router = this.owner._runtime.router\n const parent = this.owner._routeContext\n if (this.registeredRouter != null && this.registeredParent != null) {\n this.registeredRouter.unregisterRoutes(this.registeredParent, this.owner)\n }\n this.registeredRouter = null\n this.registeredParent = null\n this.routeContexts.clear()\n\n const routed = items.filter((item): item is TItem & {\n route: LiteralRouteDescriptor\n } => item.route != null)\n if (routed.length === 0) return\n if (router == null || parent == null) {\n throw new Error(`Routed ${this.options.subject} require a router and contextual route scope`)\n }\n\n this.registeredRouter = router\n this.registeredParent = parent\n this.routeContexts = new Map(router.registerSelectionRoutes(\n parent,\n this.owner,\n routed.map((item) => ({\n route: item.route,\n disabled: item.disabled,\n active: () => Object.is(this.valueEmitter.get(), item.id),\n activate: () => {\n this.valueEmitter.set(item.id, this.options.restoredCause)\n },\n })),\n (listener) => this.valueEmitter.subscribe(listener, {emitCurrent: false}),\n ))\n }\n\n private pendingItem(items: readonly TItem[]): TItem | undefined {\n const transition = this.registeredRouter?.transition.get()\n if (transition?.state !== 'pending') return undefined\n const requestedPathname = transition.requestedLocation.split('?', 1)[0] || '/'\n return items.find((item) => {\n if (item.disabled || item.route == null) return false\n const context = this.routeContexts.get(item.route)\n return context != null && (\n requestedPathname === context.pathname\n || requestedPathname.startsWith(`${context.pathname}/`)\n )\n })\n }\n}\n\nexport function readContentMountPolicy(\n value: unknown,\n componentName: string,\n): ContentMountPolicy {\n const policy = value ?? 'eager'\n if (policy !== 'eager' && policy !== 'lazy' && policy !== 'active-only') {\n throw new TypeError(`${componentName} mountPolicy must be eager, lazy, or active-only`)\n }\n return policy\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 {\n RoutedSelectionController,\n readContentMountPolicy,\n} from '../routedSelection.js'\nimport type {\n ContentMountPolicy,\n RoutedSelectionItem,\n} from '../routedSelection.js'\nimport {Tab} from './tab.js'\nimport type {TabProps} from './tab.js'\nimport {TabLine, tabButtonId, tabPanelId} from './tabline.js'\nimport type {TabLineTab} from './tabline.js'\nimport {RouteScope} from '../../../routing/RouteScope.js'\nimport type {LiteralRouteDescriptor} from '../../../routing/route.js'\n\nexport interface TabDefinition {\n id: Key\n label?: FrayChild\n disabled?: boolean\n content?: FrayChild\n component?: FrayChild\n route?: LiteralRouteDescriptor\n}\n\nexport type TabPanelMountPolicy = ContentMountPolicy\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 /** Controls when tab content is mounted and whether inactive content is retained. */\n mountPolicy?: TabPanelMountPolicy\n label?: string\n onChange?: (value: Key, event: Event | null) => void\n}\n\ninterface NormalizedTab extends RoutedSelectionItem {\n id: Key\n label: FrayChild\n disabled: boolean\n content: FrayChild\n route?: LiteralRouteDescriptor\n}\n\nexport class TabPanel extends Component<TabPanelProps> {\n static override liveProps: readonly string[] = []\n readonly valueEmitter: ValueEmitter<Key | null>\n readonly activeTabEmitter: ValueEmitter<Key | null>\n readonly baseId: string\n private readonly selection: RoutedSelectionController<NormalizedTab>\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 this.selection = new RoutedSelectionController(this, this.valueEmitter, {\n subject: 'tabs',\n restoredCause: 'route tab restored',\n pendingCause: 'pending route tab selected',\n selectedCause: 'tab selected',\n })\n }\n\n initialize(): void {\n const tabs = extractTabs(this.props)\n readContentMountPolicy(this.props.mountPolicy, 'TabPanel')\n this.selection.prepare(tabs)\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: TabPanelProps): this {\n readContentMountPolicy(nextProps.mountPolicy, 'TabPanel')\n super.setProps(nextProps)\n this.selection.prepare(extractTabs(nextProps))\n this.update()\n return this\n }\n\n render(): FrayChild {\n const tabs = extractTabs(this.props)\n const mountPolicy = readContentMountPolicy(this.props.mountPolicy, 'TabPanel')\n const selectedId = this.selection.selected(tabs)?.id\n const mountedTabIds = this.selection.updateMounted(tabs, mountPolicy)\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 onSelectTab={(tab, event) => this.selectTab(tab, event)}\n />\n {tabs.map((tab) => {\n const selected = Object.is(selectedId, tab.id)\n return <section\n key={String(tab.id)}\n id={tabPanelId(this.baseId, tab.id)}\n role=\"tabpanel\"\n aria-labelledby={tabButtonId(this.baseId, tab.id)}\n tabIndex={selected ? 0 : -1}\n hidden={!selected}\n >{mountedTabIds.has(tab.id)\n ? this.selection.scopedContent(tab, tab.content)\n : null}</section>\n })}\n </Host>\n }\n\n override onDestroy(): void {\n this.selection.dispose()\n }\n\n private selectTab(tab: TabLineTab, _event: Event | null): void {\n const selected = extractTabs(this.props).find(({id}) => Object.is(id, tab.id))\n if (selected != null) this.selection.select(selected)\n }\n\n static dependencies = [RouteScope, TabLine, Tab]\n\n static override hostName = 'tab-panel'\n\n static css = css`\n & {\n background: var(--panel-background);\n border-radius: var(--panel-radius);\n box-shadow: var(--panel-shadow);\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n & > section[role=\"tabpanel\"] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: auto;\n padding: 3px;\n z-index: 2;\n }\n\n & > section[role=\"tabpanel\"][hidden] {\n display: none;\n }\n\n & > section[role=\"tabpanel\"] > fray-toolbar[role=\"toolbar\"]:first-child {\n width: calc(100% + 6px);\n margin-block-start: -3px;\n margin-inline-start: -3px;\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 ...(tabProps.route == null ? {} : {route: tabProps.route}),\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 ...(tab.route == null ? {} : {route: tab.route}),\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 type {WritableEmitter} from '../Components/component.js'\n\nconst routeDescriptors = new WeakSet<object>()\nconst routeTargets = new WeakSet<object>()\n\nexport interface RouteCodec<TValue> {\n parse(value: string): TValue\n format(value: TValue): string\n}\n\nexport interface RouteQueryCodec<TValue> {\n parse(values: readonly string[]): TValue\n format(value: TValue): readonly string[]\n}\n\nexport interface LiteralRouteDescriptor {\n readonly id: string\n readonly kind: 'literal'\n readonly path: string\n}\n\nexport interface ParameterRouteDescriptor<TValue> {\n readonly id: string\n readonly kind: 'parameter'\n readonly name: string\n readonly codec: RouteCodec<TValue>\n}\n\nexport type RouteDescriptor<TValue = never> =\n | LiteralRouteDescriptor\n | ParameterRouteDescriptor<TValue>\n\nexport type AnyRouteDescriptor = RouteDescriptor<unknown>\n\nexport interface RouteParameterValue<TValue = unknown> {\n readonly route: ParameterRouteDescriptor<TValue>\n readonly value: TValue\n}\n\nexport interface RouteTarget {\n readonly routes: readonly (LiteralRouteDescriptor | RouteParameterValue)[]\n readonly query?: Readonly<Record<string, string | readonly string[] | null | undefined>>\n}\n\nexport interface RouteValueBinding<TValue> {\n readonly valueEmitter: WritableEmitter<TValue | null>\n readonly resolve?: RouteValueResolver<TValue>\n}\n\nexport interface RouteResolveContext {\n readonly requestedLocation: string\n readonly resolvedValues: ReadonlyMap<AnyRouteDescriptor, unknown>\n}\n\nexport type RouteValueResolver<TValue> = (\n value: TValue,\n context: RouteResolveContext,\n signal: AbortSignal,\n) => TValue | RouteRedirect | Promise<TValue | RouteRedirect>\n\nexport class RouteRedirect {\n constructor(readonly target: RouteTarget) {\n assertRouteTarget(target)\n Object.freeze(this)\n }\n}\n\nexport class RouteUnavailableError extends Error {\n override readonly name = 'RouteUnavailableError'\n\n constructor(message = 'The requested route is unavailable') {\n super(message)\n }\n}\n\nexport const stringRouteCodec: RouteCodec<string> = Object.freeze({\n parse: (value: string) => value,\n format: (value: string) => value,\n})\n\nexport const stringRouteQueryCodec: RouteQueryCodec<string> = Object.freeze({\n parse(values: readonly string[]) {\n if (values.length !== 1) throw new TypeError('Expected one query value')\n return values[0] ?? ''\n },\n format: (value: string) => [value],\n})\n\nexport const booleanRouteQueryCodec: RouteQueryCodec<boolean> = Object.freeze({\n parse(values: readonly string[]) {\n if (values.length !== 1 || (values[0] !== 'true' && values[0] !== 'false')) {\n throw new TypeError('Expected one boolean query value')\n }\n return values[0] === 'true'\n },\n format: (value: boolean) => [String(value)],\n})\n\nexport function defineRoute(id: string, path = id): LiteralRouteDescriptor {\n const normalizedId = routeName(id, 'Route id')\n const normalizedPath = routeSegment(path, 'Route path')\n const descriptor = Object.freeze({\n id: normalizedId,\n kind: 'literal' as const,\n path: normalizedPath,\n })\n routeDescriptors.add(descriptor)\n return descriptor\n}\n\nexport function defineRouteParameter<TValue>(\n id: string,\n codec: RouteCodec<TValue>,\n name = id,\n): ParameterRouteDescriptor<TValue> {\n const normalizedId = routeName(id, 'Route id')\n const normalizedName = routeName(name, 'Route parameter name')\n assertRouteCodec(codec)\n const descriptor = Object.freeze({\n id: normalizedId,\n kind: 'parameter' as const,\n name: normalizedName,\n codec,\n })\n routeDescriptors.add(descriptor)\n return descriptor\n}\n\nexport function routeParameter<TValue>(\n route: ParameterRouteDescriptor<TValue>,\n value: TValue,\n): RouteParameterValue<TValue> {\n assertRouteDescriptor(route)\n if (route.kind !== 'parameter') {\n throw new TypeError('routeParameter requires a parameter route')\n }\n const formatted = route.codec.format(value)\n assertFormattedSegment(formatted, route.name)\n return Object.freeze({route, value})\n}\n\nexport function routeTarget(\n ...routes: readonly (LiteralRouteDescriptor | RouteParameterValue)[]\n): RouteTarget {\n if (routes.length === 0) throw new TypeError('routeTarget requires at least one route')\n for (const part of routes) {\n if (isRouteParameterValue(part)) {\n assertRouteDescriptor(part.route)\n } else {\n assertRouteDescriptor(part)\n if (part.kind !== 'literal') {\n throw new TypeError('Parameter routes require routeParameter(route, value)')\n }\n }\n }\n const target = Object.freeze({routes: Object.freeze([...routes])})\n routeTargets.add(target)\n return target\n}\n\nexport function withRouteQuery(\n target: RouteTarget,\n query: Readonly<Record<string, string | readonly string[] | null | undefined>>,\n): RouteTarget {\n assertRouteTarget(target)\n if (query == null || typeof query !== 'object' || Array.isArray(query)) {\n throw new TypeError('Route target query must be an object')\n }\n const next = Object.freeze({routes: target.routes, query: Object.freeze({...query})})\n routeTargets.add(next)\n return next\n}\n\nexport function redirectTo(target: RouteTarget): RouteRedirect {\n return new RouteRedirect(target)\n}\n\nexport function isRouteDescriptor(value: unknown): value is AnyRouteDescriptor {\n return value != null && typeof value === 'object' && routeDescriptors.has(value)\n}\n\nexport function assertRouteDescriptor(value: unknown): asserts value is AnyRouteDescriptor {\n if (!isRouteDescriptor(value)) {\n throw new TypeError('Expected a route created by defineRoute() or defineRouteParameter()')\n }\n}\n\nexport function isRouteTarget(value: unknown): value is RouteTarget {\n return value != null && typeof value === 'object' && routeTargets.has(value)\n}\n\nexport function assertRouteTarget(value: unknown): asserts value is RouteTarget {\n if (!isRouteTarget(value)) throw new TypeError('Expected a target created by routeTarget()')\n}\n\nexport function assertRouteCodec<TValue>(\n codec: RouteCodec<TValue>,\n): asserts codec is RouteCodec<TValue> {\n if (codec == null\n || typeof codec !== 'object'\n || typeof codec.parse !== 'function'\n || typeof codec.format !== 'function') {\n throw new TypeError('Route codec requires parse and format functions')\n }\n}\n\nexport function assertRouteQueryCodec<TValue>(\n codec: RouteQueryCodec<TValue>,\n): asserts codec is RouteQueryCodec<TValue> {\n if (codec == null\n || typeof codec !== 'object'\n || typeof codec.parse !== 'function'\n || typeof codec.format !== 'function') {\n throw new TypeError('Route query codec requires parse and format functions')\n }\n}\n\nexport function formatRouteTarget(target: RouteTarget): string {\n assertRouteTarget(target)\n const segments = target.routes.map((part) => {\n if (isRouteParameterValue(part)) {\n const formatted = part.route.codec.format(part.value)\n assertFormattedSegment(formatted, part.route.name)\n return encodeURIComponent(formatted)\n }\n return encodeURIComponent(part.path)\n })\n const search = new URLSearchParams()\n for (const [name, raw] of Object.entries(target.query ?? {}).sort(([left], [right]) =>\n left.localeCompare(right))) {\n if (raw == null) continue\n const values = Array.isArray(raw) ? raw : [raw]\n for (const value of values) search.append(name, value)\n }\n const query = search.toString()\n return `/${segments.join('/')}${query === '' ? '' : `?${query}`}`\n}\n\nfunction isRouteParameterValue(value: unknown): value is RouteParameterValue {\n return value != null\n && typeof value === 'object'\n && 'route' in value\n && 'value' in value\n && isRouteDescriptor(value.route)\n && value.route.kind === 'parameter'\n}\n\nfunction routeName(value: unknown, label: string): string {\n if (typeof value !== 'string' || !/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(value)) {\n throw new TypeError(`${label} must be a lowercase kebab-case name`)\n }\n return value\n}\n\nfunction routeSegment(value: unknown, label: string): string {\n if (typeof value !== 'string'\n || value === ''\n || value === '.'\n || value === '..'\n || value.includes('/')\n || value.includes('?')\n || value.includes('#')) {\n throw new TypeError(`${label} must be one non-empty path segment`)\n }\n try {\n assertFormattedSegment(decodeURIComponent(value), label)\n } catch {\n throw new TypeError(`${label} must use valid percent encoding`)\n }\n return value\n}\n\nfunction assertFormattedSegment(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || value === '' || value.includes('/')) {\n throw new TypeError(`${label} codec must format one non-empty path segment`)\n }\n}\n","import {Component, h} from '../Components/component.js'\nimport type {ComponentProps, FrayChild} from '../Components/component.js'\nimport {isRouteDescriptor} from './route.js'\nimport type {RouteDescriptor, RouteTarget} from './route.js'\nimport type {ResolvedRoute} from './router.js'\n\nexport interface RouteLinkProps extends ComponentProps {\n to: RouteDescriptor | RouteTarget | ResolvedRoute\n exact?: boolean\n target?: string\n download?: string | boolean\n onClick?: (event: MouseEvent) => void\n}\n\n/** A native anchor that delegates unmodified same-context activation to the router. */\nexport class RouteLink extends Component<RouteLinkProps> {\n static override liveProps: readonly string[] = []\n initialize(): void {\n const router = this._runtime.router\n if (router == null) throw new Error('RouteLink requires a router in FrayRuntime')\n this.watch(router.transition)\n }\n\n render(): FrayChild {\n const router = this._runtime.router\n if (router == null) throw new Error('RouteLink requires a router in FrayRuntime')\n const target = isRouteDescriptor(this.props.to)\n ? router.resolve(this.props.to, this._routeContext ?? router.root)\n : this.props.to\n const {\n to: _to,\n exact = false,\n children = [],\n onClick,\n ...anchorProps\n } = this.props\n return h('a', {\n ...anchorProps,\n href: router.href(target),\n 'aria-current': router.isActive(target, exact) ? 'page' : null,\n onClick: (event: MouseEvent) => {\n onClick?.(event)\n if (!shouldHandleClick(event, anchorProps.target, anchorProps.download)) return\n event.preventDefault()\n void router.navigate(target)\n },\n }, children)\n }\n}\n\nfunction shouldHandleClick(\n event: MouseEvent,\n target: string | undefined,\n download: string | boolean | undefined,\n): boolean {\n if (event.defaultPrevented\n || event.button !== 0\n || event.metaKey\n || event.ctrlKey\n || event.shiftKey\n || event.altKey\n || download != null && download !== false\n || target != null && target !== '' && target !== '_self') return false\n return true\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\nimport {RouteLink} from '../../routing/RouteLink.js'\nimport type {RouteDescriptor, RouteTarget} from '../../routing/route.js'\nimport type {ResolvedRoute} from '../../routing/router.js'\n\nexport interface NavigationBarItem {\n id: Key\n label: FrayChild\n to: RouteDescriptor | RouteTarget | ResolvedRoute\n exact?: boolean\n disabled?: boolean\n target?: string\n download?: string | boolean\n title?: string\n onClick?: (event: MouseEvent) => void\n}\n\nexport interface NavigationBarProps extends ComponentProps {\n items: readonly NavigationBarItem[]\n label: string\n}\n\n/** Native application/document navigation over router-aware links. */\nexport class NavigationBar extends Component<NavigationBarProps> {\n static override liveProps: readonly string[] = []\n\n constructor(props: NavigationBarProps) {\n super(props)\n validateNavigation(props)\n }\n\n render(): FrayChild {\n validateNavigation(this.props)\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <nav aria-label={this.props.label}>\n <ul>{this.props.items.map((item) => <li key={String(item.id)}>\n {item.disabled\n ? <span aria-disabled=\"true\" title={item.title}>{item.label}</span>\n : <RouteLink\n to={item.to}\n {...(item.exact == null ? {} : {exact: item.exact})}\n {...(item.target == null ? {} : {target: item.target})}\n {...(item.download == null ? {} : {download: item.download})}\n {...(item.title == null ? {} : {title: item.title})}\n {...(item.onClick == null ? {} : {onClick: item.onClick})}\n >{item.label}</RouteLink>}\n </li>)}</ul>\n </nav>\n </Host>\n }\n\n static dependencies = [RouteLink]\n static override hostName = 'navigation-bar'\n\n static override css = css`\n & {\n display: block;\n flex: 0 0 auto;\n min-width: 0;\n color: var(--navigation-bar-color);\n background: var(--navigation-bar-background);\n border: var(--navigation-bar-border);\n box-shadow: var(--navigation-bar-shadow);\n }\n\n & > nav,\n & > nav > ul {\n min-width: 0;\n }\n\n & > nav > ul {\n display: flex;\n flex-flow: row wrap;\n gap: var(--navigation-bar-gap);\n\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: var(--navigation-bar-padding);\n list-style: none;\n }\n\n & > nav > ul > li {\n display: flex;\n }\n\n & > nav > ul > li > a,\n & > nav > ul > li > span[aria-disabled=\"true\"] {\n display: inline-flex;\n align-items: center;\n min-height: var(--control-min-height, 2rem);\n padding: var(--navigation-link-padding);\n box-sizing: border-box;\n color: var(--navigation-link-color);\n background: var(--navigation-link-background);\n border: var(--navigation-link-border);\n border-radius: var(--navigation-link-radius);\n box-shadow: var(--navigation-link-shadow);\n font-family: inherit;\n font-size: 1.1rem;\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n text-decoration: none;\n white-space: nowrap;\n }\n\n & > nav > ul > li > a:hover {\n color: var(--navigation-link-color-hover);\n background: var(--navigation-link-background-hover);\n }\n\n & > nav > ul > li > a:active {\n color: var(--navigation-link-color-active);\n background: var(--navigation-link-background-active);\n }\n\n & > nav > ul > li > a[aria-current=\"page\"] {\n color: var(--navigation-link-color-current);\n background: var(--navigation-link-background-current);\n box-shadow: var(--navigation-link-shadow-current);\n font-weight: var(--navigation-link-font-weight-current);\n }\n\n & > nav > ul > li > a:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n & > nav > ul > li > span[aria-disabled=\"true\"] {\n color: var(--navigation-link-color-disabled);\n background: var(--navigation-link-background-disabled);\n border: var(--navigation-link-border);\n cursor: not-allowed;\n }\n `\n}\n\nfunction validateNavigation(props: NavigationBarProps): void {\n if (typeof props.label !== 'string' || props.label.trim() === '') {\n throw new TypeError('NavigationBar label must be a non-empty string')\n }\n if (!Array.isArray(props.items)) throw new TypeError('NavigationBar items must be an array')\n const ids = new Set<Key>()\n for (const item of props.items) {\n if (item == null || item.id == null) throw new TypeError('Each navigation item requires an id')\n if (item.label == null) throw new TypeError('Each navigation item requires a label')\n if (item.to == null) throw new TypeError('Each navigation item requires a route target')\n if (ids.has(item.id)) throw new Error(`Duplicate navigation item id: ${String(item.id)}`)\n if (item.onClick != null && typeof item.onClick !== 'function') {\n throw new TypeError('Navigation item onClick must be a function')\n }\n ids.add(item.id)\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentDependency, ComponentProps, FrayChild} from '../component.js'\nimport {FrayRuntime} from '../../runtime.js'\n\n/** Viewport sizing policy for a Fray application root. */\nexport type FrayAppSizing =\n | 'embedded'\n | 'viewport-width'\n | 'viewport-height'\n | 'viewport'\n\n/** Landmark policy for a Fray application root. */\nexport type FrayAppLandmark = 'main' | 'none'\n\nexport interface FrayAppProps extends ComponentProps {\n /**\n * Select the viewport axes claimed by the application shell. Embedded is\n * sizing-neutral; the other values use Fray's public fill traits.\n */\n sizing?: FrayAppSizing\n /**\n * `main` exposes the app as the document's primary-content landmark.\n * Embedded applications should select `none`.\n */\n landmark?: FrayAppLandmark\n}\n\n/**\n * A fixed application shell with a `fray-app` host and theme typography.\n *\n * Instantiate it with children for a small application, or derive from it and\n * override `renderContent()` for an application composition root.\n */\nexport class FrayApp extends Component<FrayAppProps> {\n override mount(parent: ParentNode | null = null, before: Node | null = null): this {\n if (parent != null) {\n const targetDocument = parentDocument(parent, 'FrayApp.mount')\n const dependency = this.constructor as unknown as ComponentDependency\n this._runtime.registerStyles(dependency).injectStyles(targetDocument)\n }\n return super.mount(parent, before)\n }\n\n protected renderContent(): FrayChild {\n return this.props.children ?? null\n }\n\n render() {\n const {\n children: _children,\n key: _key,\n class: classAlias,\n className,\n island: _island,\n sizing = 'embedded',\n landmark = 'main',\n ...hostProps\n } = this.props\n const Host = this.Host\n const rootClassName = mergeClassNames(classAlias, className, sizingClassName(sizing))\n return <Host\n {...hostProps}\n role={landmarkRole(landmark)}\n {...(rootClassName == null ? {} : {className: rootClassName})}\n >\n {this.renderContent()}\n </Host>\n }\n\n static override hostName = 'app'\n\n static override css = css`\n & {\n box-sizing: border-box;\n display: block;\n background: var(--application-background);\n color: var(--ui-color);\n font-family: var(--font-family);\n font-size: var(--font-size);\n line-height: var(--line-height);\n }\n `\n}\n\n/**\n * Register an application root's reachable structural CSS before mounting it.\n * Presentation assets remain explicit application policy.\n */\nexport function mountFrayApp<TArgs extends unknown[], TApp extends FrayApp>(\n runtime: FrayRuntime,\n appType: (new(...args: TArgs) => TApp) & ComponentDependency,\n parent: ParentNode,\n ...args: TArgs\n): TApp {\n if (!(runtime instanceof FrayRuntime)) {\n throw new TypeError('mountFrayApp requires a FrayRuntime')\n }\n const targetDocument = parentDocument(parent, 'mountFrayApp')\n\n runtime.registerStyles(appType).injectStyles(targetDocument)\n return runtime.mount(runtime.create(appType, ...args), parent)\n}\n\nfunction parentDocument(parent: ParentNode, caller: string): Document {\n if (parent == null || typeof parent !== 'object' || !('ownerDocument' in parent)) {\n throw new TypeError(`${caller} requires a DOM parent node`)\n }\n const targetDocument = parent.ownerDocument ?? (parent.nodeType === 9 ? parent as Document : null)\n if (targetDocument?.head == null) {\n throw new TypeError(`${caller} requires a parent associated with a document head`)\n }\n return targetDocument\n}\n\nfunction sizingClassName(sizing: FrayAppSizing): string | undefined {\n switch (sizing) {\n case 'embedded': return undefined\n case 'viewport-width': return 'fray-fill-horizontal'\n case 'viewport-height': return 'fray-fill-vertical'\n case 'viewport': return 'fray-fill-horizontal fray-fill-vertical'\n default: throw new TypeError(\n 'FrayApp sizing must be embedded, viewport-width, viewport-height, or viewport',\n )\n }\n}\n\nfunction landmarkRole(landmark: FrayAppLandmark): 'main' | null {\n if (landmark === 'main') return 'main'\n if (landmark === 'none') return null\n throw new TypeError('FrayApp landmark must be main or none')\n}\n\nfunction mergeClassNames(...values: readonly (string | null | undefined)[]): string | undefined {\n const merged = values.flatMap(value => value?.trim().split(/\\s+/) ?? []).filter(Boolean).join(' ')\n return merged.length === 0 ? undefined : merged\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nexport type HeaderLevel = 1 | 2 | 3 | 4 | 5 | 6\n\nexport interface HeaderProps extends ComponentProps {\n id?: string | number | null\n headingId?: string | number | null\n level?: HeaderLevel\n}\n\n/** Styled heading surface with an explicit native heading level. */\nexport class Header extends Component<HeaderProps> {\n static override liveProps: readonly string[] = []\n readonly headerId: string\n readonly headingId: string\n\n constructor(props: HeaderProps = {}) {\n super(props)\n this.headerId = controlId('header', props.id)\n this.headingId = controlId('header-title', props.headingId ?? `${this.headerId}-title`)\n }\n\n render(): FrayChild {\n const {level = 2, children = []} = this.props\n if (!Number.isInteger(level) || level < 1 || level > 6) {\n throw new TypeError('Header level must be an integer from 1 to 6')\n }\n\n const Host = this.Host\n return <Host\n id={this.headerId}\n className={componentClass(this.props) || null}\n >\n {(() => {\n const Heading = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n return <Heading id={this.headingId}>{children}</Heading>\n })()}\n </Host>\n }\n\n static override hostName = 'header'\n\n static css = css`\n & {\n display: block;\n color: var(--section-header-color);\n border-radius: var(--ui-border-radius) var(--ui-border-radius) 0 0;\n padding: .25em;\n background: var(--section-header-background);\n box-shadow: var(--section-header-shadow);\n z-index: 1;\n }\n\n & > h1,\n & > h2,\n & > h3,\n & > h4,\n & > h5,\n & > h6 {\n margin: 0;\n font: inherit;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentDependency, ComponentProps, FrayChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {Header} from './header.js'\n\nexport interface GroupPanelBaseProps extends ComponentProps {\n id?: string | number | null\n}\n\nexport interface GroupPanelProps extends GroupPanelBaseProps {\n header: FrayChild\n}\n\n/** Bordered control group with a full-height vertical section header. */\nexport class GroupPanel<\n TProps extends GroupPanelBaseProps = GroupPanelProps,\n> extends Component<TProps> {\n static override liveProps: readonly string[] = []\n readonly panelId: string\n readonly headerId: string\n\n constructor(props: TProps) {\n super(props)\n this.panelId = controlId('group-panel', props.id)\n this.headerId = `${this.panelId}-title`\n }\n\n render(): FrayChild {\n const {header, children = []} = this.props as TProps & GroupPanelProps\n return this.renderGroupPanel(header, children)\n }\n\n protected renderGroupPanel(header: FrayChild, content: FrayChild): FrayChild {\n const Host = this.Host\n return <Host\n id={this.panelId}\n role=\"group\"\n className={componentClass(this.props) || null}\n aria-labelledby={this.headerId}\n >\n <Header\n id={`${this.panelId}-header`}\n headingId={this.headerId}\n >{header}</Header>\n <fray-content>{content}</fray-content>\n </Host>\n }\n\n static override hostName = 'group-panel'\n static override dependencies: ComponentDependency[] = [Header]\n\n static css = css`\n & {\n display: flex;\n flex-flow: row nowrap;\n align-items: stretch;\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n column-gap: 0.35rem;\n padding-block: 0.125rem;\n padding-inline: 0.125rem 0.35rem;\n border: 1px solid var(--ui-border-color);\n border-radius: var(--ui-border-radius);\n }\n\n & > fray-header {\n display: grid;\n place-items: center;\n box-sizing: border-box;\n width: 1.7em;\n min-width: 0;\n min-height: 0;\n padding: 0.125em;\n border-radius: var(--ui-border-radius);\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n font-weight: normal;\n font-size: var(--ui-font-size);\n }\n\n & > fray-content {\n display: block;\n min-width: 0;\n min-height: 0;\n margin-left: .25em;\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 OptionGroupBaseProps extends ComponentProps {\n id?: string | number | null\n label?: FrayChild\n ariaLabel?: string\n headerEnd?: FrayChild\n disabled?: boolean\n required?: boolean\n error?: unknown\n}\n\n/** Labeled fieldset section for use inside an OptionsPanel or standalone. */\nexport class OptionGroup<TProps extends OptionGroupBaseProps = OptionGroupBaseProps>\n extends Component<TProps> {\n static override liveProps: readonly string[] = []\n readonly groupId: string\n readonly errorId: string\n\n constructor(props: TProps) {\n super(props)\n this.groupId = controlId('option-group', props.id)\n this.errorId = `${this.groupId}-error`\n }\n\n render(): FrayChild {\n return this.renderOptionGroup(this.props.children ?? [])\n }\n\n protected renderOptionGroup(content: FrayChild): FrayChild {\n const Host = this.Host\n const {\n label,\n ariaLabel,\n headerEnd = null,\n disabled = false,\n required = false,\n error = null,\n } = this.props\n return <Host className={componentClass(this.props) || null}>\n <fieldset\n id={this.groupId}\n disabled={disabled}\n aria-label={label == null ? ariaLabel : null}\n aria-required={required ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n >\n {label != null || headerEnd != null ? <legend>\n {label != null ? <span>{label}</span> : null}\n {headerEnd}\n </legend> : null}\n {content}\n </fieldset>\n {error == null ? null : <p\n id={this.errorId}\n role=\"alert\"\n >{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'option-group'\n\n static css = css`\n & {\n display: block;\n min-width: 0;\n }\n\n & > fieldset {\n margin: 0;\n padding: 0;\n min-inline-size: 0;\n border: 0;\n width: 100%;\n }\n\n & > fieldset > legend {\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n gap: 0.5rem;\n width: 100%;\n padding: 0 0 0.25em;\n margin-bottom: 0.5em;\n border-bottom: 1px solid var(--ui-border-color);\n font: inherit;\n }\n\n & > fieldset > legend > span {\n flex: 1;\n min-width: 0;\n }\n\n & > p[role=\"alert\"] {\n margin: 0.25em 0 0;\n }\n `\n}\n","import {css} from '../component.js'\nimport {GroupPanel} from './groupPanel.js'\nimport type {GroupPanelBaseProps} from './groupPanel.js'\nimport type {FrayChild} from '../component.js'\n\nexport interface OptionsPanelProps extends GroupPanelBaseProps {\n header: FrayChild\n}\n\n/** Bordered panel with a vertical section header, designed to contain OptionGroups. */\nexport class OptionsPanel<TProps extends GroupPanelBaseProps = OptionsPanelProps>\n extends GroupPanel<TProps> {\n static override hostName = 'options-panel'\n\n static css = css`\n & > fray-content {\n display: flex;\n flex-direction: column;\n align-self: stretch;\n flex: 1 1 0;\n gap: .5em;\n }\n\n & > fray-content * > fieldset > legend {\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n font-size: var(--ui-font-size);\n color: var(--palette-neutral-950);\n gap: 0.5rem;\n width: 100%;\n padding: 0 0 0.25em;\n margin-bottom: 0.25em;\n border-bottom: 1px solid var(--ui-border-color);\n }\n\n & > fray-content * > fieldset {\n display: flex;\n flex-flow: column;\n justify-content: stretch;\n justify-items: stretch;\n align-items: stretch;\n align-content: stretch;\n box-sizing: border-box;\n width: 100%;\n gap: 0;\n padding: .25em 0 .5em 0;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../component.js'\nimport {Header} from './header.js'\nimport {componentClass, controlId} from '../controlUtils.js'\n\nconst panelLiveProps = ['disabled'] as const\n\nexport interface PanelProps extends ComponentProps,\n LivePropContract<(typeof panelLiveProps)[number]> {\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 static override liveProps = panelLiveProps\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 id={`${this.panelId}-header`}\n headingId={this.headerId}\n >{header}</Header>\n\n return <Host\n id={this.panelId}\n role={header == null ? null : 'region'}\n className={componentClass(this.props)}\n aria-disabled={disabled ? 'true' : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {toolbar}\n <fray-content className={orientation}>{children}</fray-content>\n </Host>\n }\n\n static override hostName = 'panel'\n static override dependencies = [Header]\n\n static css = css`\n & {\n background: var(--panel-background);\n border: var(--panel-border);\n border-radius: var(--panel-radius);\n box-shadow: var(--panel-shadow);\n color: var(--panel-color);\n display: flex;\n flex-direction: column;\n overflow: auto;\n flex: 0 0 auto;\n }\n\n & > fray-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 & > fray-content.horizontal {\n flex-direction: row;\n }\n\n & > fray-content.vertical {\n flex-direction: column;\n }\n\n &[aria-disabled=\"true\"] {\n opacity: .65;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild} from '../component.js'\nimport {Header} from './header.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 static override liveProps: readonly string[] = []\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 Host = this.Host\n const title = header == null\n ? null\n : <Header\n id={`${this.sidebarId}-header`}\n headingId={this.headerId}\n >{header}</Header>\n\n return <Host className={componentClass(this.props) || null}>\n <aside\n id={this.sidebarId}\n aria-label={header == null ? ariaLabel : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {toolbar == null ? null : <fray-toolbarcontent>{toolbar}</fray-toolbarcontent>}\n <fray-content tabIndex={0}>{children}</fray-content>\n </aside>\n </Host>\n }\n\n static override hostName = 'sidebar'\n static override dependencies = [Header]\n\n static css = css`\n & {\n display: flex;\n min-width: 0;\n min-height: 0;\n }\n\n & > aside {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n & > aside > fray-header,\n & > aside > fray-toolbarcontent {\n flex: none;\n }\n\n & > aside > fray-content {\n flex: 1;\n min-height: 0;\n overflow: auto;\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 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 static override liveProps: readonly string[] = []\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={classNames(componentClass(this.props), direction)}\n style={primarySize == null ? undefined : {'--split-primary-size': primarySize}}\n >\n <fray-primary\n role={primaryLabel == null ? null : 'region'}\n aria-label={primaryLabel}\n tabIndex={0}\n >{primary}</fray-primary>\n <fray-secondary\n role={secondaryLabel == null ? null : 'region'}\n aria-label={secondaryLabel}\n tabIndex={0}\n >{secondary ?? this.props.children ?? []}</fray-secondary>\n </Host>\n }\n\n static override hostName = 'split-view'\n\n static css = css`\n & {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n &.horizontal {\n flex-direction: row;\n }\n\n &.vertical {\n flex-direction: column;\n }\n\n & > fray-primary {\n flex: 0 1 var(--split-primary-size, 40%);\n }\n\n & > fray-secondary {\n flex: 1;\n }\n\n & > fray-primary,\n & > fray-secondary {\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n &.horizontal > fray-primary {\n border-inline-end: 1px solid var(--ui-border-color);\n }\n\n &.vertical > fray-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 static override liveProps: readonly string[] = []\n render(): FrayChild {\n const {term, value, children = []} = this.props\n return [\n <dt>{term}</dt>,\n <dd>{value ?? children}</dd>,\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 static override liveProps: readonly string[] = []\n render(): FrayChild {\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <dl aria-label={this.props.label}>{this.props.children ?? []}</dl>\n </Host>\n }\n\n static override hostName = 'descriptionlist'\n\n static dependencies = [DescriptionItem]\n\n static css = css`\n & {\n display: block;\n }\n\n & > dl {\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 static override liveProps: readonly string[] = []\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\n static override css = css`\n & {\n display: block;\n width: 5em;\n height: 1em;\n background: #ccc;\n border-radius: var(--ui-border-radius);\n position: relative;\n }\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n z-index: 1;\n inset: 0;\n margin: auto;\n animation: fray-placeholder-progress 0.55s linear infinite;\n background-repeat: repeat;\n background-size: 2rem 2rem;\n background-image: var(--working-background-image);\n border: 0 solid transparent;\n border-radius: inherit;\n box-sizing: border-box;\n pointer-events: none;\n }\n\n @keyframes fray-placeholder-progress {\n from { background-position: 0rem 0; }\n to { background-position: 2rem 0; }\n }\n\n @media (prefers-reduced-motion: reduce) {\n &::after {\n animation: none;\n }\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 static override liveProps: readonly string[] = []\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\">\n {errorMessage(error, 'Unable to load items')}\n </p>\n : null}\n {isLoading && rows.length === 0\n ? <>\n <p role=\"status\">Loading items…</p>\n <ul aria-hidden=\"true\">\n {Array.from({length: this.props.placeholderCount ?? 5}, (_, index) =>\n <li key={`placeholder-${index}`}>\n <Placeholder width={45 + index * 7} />\n </li>)}\n </ul>\n </>\n : null}\n {status === FetchState.Ready && rows.length === 0\n ? <p role=\"status\">No items</p>\n : null}\n {rows.length > 0\n ? <ul\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 <li\n key={String(key)}\n role=\"option\"\n data-fray-selectable-row=\"\"\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >{content}</li>\n })}</ul>\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 = 'listview'\n\n static override css = css`\n & {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n height: 100%;\n padding: var(--ui-padding-v) var(--ui-padding-h);\n color: var(--ui-text-color);\n background: var(--ui-input-bg);\n border: var(--ui-input-border);\n border-radius: var(--ui-border-radius);\n box-shadow: var(--input-shadow);\n box-sizing: border-box;\n pointer-events: all;\n user-select: none;\n white-space: nowrap;\n }\n\n & > [role=\"listbox\"],\n & > ul[aria-hidden=\"true\"] {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n & > [role=\"listbox\"] > [role=\"option\"] {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n min-height: calc(var(--ui-font-size) + var(--ui-padding-h) + var(--ui-padding-h));\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n font-size: var(--ui-font-size);\n color: var(--ui-text-color);\n border-radius: var(--ui-border-radius);\n box-sizing: border-box;\n user-select: none;\n }\n\n & > [role=\"listbox\"] > [role=\"option\"]:hover {\n background: var(--hover-bg-color, #f5f5f5);\n }\n\n & > [role=\"listbox\"] > [role=\"option\"][aria-selected=\"true\"] {\n background: var(--selected-bg-color, #e0e7ff);\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} from '../component.js'\n\n/** Shared native-label and painted-shell contract for checkable inputs. */\nexport abstract class CheckableControl<\n TProps extends ComponentProps = ComponentProps,\n> extends Component<TProps> {\n static override css = css`\n & {\n display: inline-flex;\n line-height: 1;\n }\n\n & > label {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n font-size: var(--ui-font-size);\n height: calc(var(--ui-font-size) + var(--ui-padding-h) + var(--ui-padding-h));\n color: var(--ui-text-color);\n border-radius: var(--ui-border-radius);\n box-sizing: border-box;\n align-items: center;\n gap: .3em;\n align-content: center;\n justify-content: center;\n justify-items: center;\n cursor: pointer;\n user-select: none;\n }\n\n & > label:has(> input:disabled) {\n color: var(--checkable-label-color-disabled);\n cursor: not-allowed;\n }\n\n & > label > input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n font: inherit;\n font-size: var(--ui-font-size, inherit);\n }\n\n & > label > input + fray-checkshell {\n position: relative;\n display: grid;\n width: 1em;\n height: 1em;\n flex: 0 0 1em;\n box-sizing: border-box;\n text-align: center;\n line-height: 120%;\n color: var(--input-color, var(--ui-text-color, currentColor));\n background: var(--checkbox-box-background, var(--ui-input-bg, transparent));\n border: var(--checkbox-box-border, var(--cbx-o-border, 1px solid currentColor));\n border-radius: var(--cbx-border-radius, var(--radius-sm, 0.2rem));\n box-shadow: var(--checkbox-box-shadow);\n font-family: inherit;\n font-size: 1em;\n user-select: none;\n place-items: center;\n }\n\n & > label > input:checked + fray-checkshell {\n color: var(--checkbox-symbol-color, var(--selection-color, currentColor));\n background: var(--checkbox-box-background-checked,\n var(--selection-background, var(--ui-accent-color, Highlight)));\n box-shadow: var(--checkbox-box-shadow-checked);\n }\n\n & > label > input:focus-visible + fray-checkshell {\n outline: 2px solid var(--focus-color, var(--ui-accent-color, Highlight));\n outline-offset: 1px;\n }\n\n & > label > input:disabled + fray-checkshell {\n opacity: 0.6;\n filter: saturate(0.6);\n }\n `\n}\n","import {css} from '../../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../../component.js'\nimport {CheckableControl} from '../CheckableControl.js'\nimport {\n componentClass,\n controlId,\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\nconst checkboxLiveProps = ['disabled', 'required', 'error'] as const\n\nexport interface CheckboxProps<TValue extends CheckboxValue = FilterModeValue>\n extends ValueControlProps<TValue>, LivePropContract<(typeof checkboxLiveProps)[number]> {\n id?: string | number | null\n symbols?: readonly CheckboxSymbol<TValue>[]\n initialSemanticState?: TValue\n label?: FrayChild\n disabled?: boolean\n required?: boolean\n error?: unknown\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 CheckableControl<CheckboxProps<TValue>> {\n static override liveProps = checkboxLiveProps\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 readonly inputId: string\n readonly errorId: string\n\n constructor(props: CheckboxProps<TValue> = {}) {\n super(props)\n this.inputId = controlId('checkbox', props.id)\n this.errorId = `${this.inputId}-error`\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 error = null,\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 // Bank2 uses the conventional neutral marker only to select the empty\n // checkbox surface; it is not visible glyph content.\n const shellSymbol = symbol === '☐' ? null : symbol\n const stateName = describeState(semanticState)\n const checked = isCheckedSemanticState(this.symbols, semanticState)\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-state={stateName}\n >\n <label>\n <input\n id={this.inputId}\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n required={required}\n name={this.props.name}\n value={String(semanticState)}\n aria-label={`${label}: ${stateName}`}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onChange={(event: Event) => {\n this.cycleState(1, event)\n // A native checkbox toggles its binary checked property before\n // it emits change. Deny and Neutral both map to unchecked, so\n // a VDOM patch can otherwise see the same checked prop as its\n // previous render and leave that native toggle behind.\n ;(event.currentTarget as HTMLInputElement).checked = isCheckedSemanticState(\n this.symbols,\n this.valueEmitter.get(),\n )\n }}\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 <fray-checkshell aria-hidden=\"true\">{shellSymbol}</fray-checkshell>\n {label}\n </label>\n {error == null ? null : <p id={this.errorId} role=\"alert\">{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'check-box'\n\n static override css = css`\n & > label > input[value=\"require\"] + fray-checkshell {\n color: var(--palette-contrast-light);\n background: var(--palette-green);\n box-shadow: var(--checkbox-box-shadow-checked);\n }\n\n & > label > input[value=\"deny\"] + fray-checkshell {\n color: var(--palette-contrast-light);\n background: var(--palette-red);\n box-shadow: var(--checkbox-box-shadow-checked);\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\nfunction isCheckedSemanticState<TValue extends CheckboxValue>(\n symbols: readonly CheckboxSymbol<TValue>[],\n semanticState: TValue,\n): boolean {\n const semanticIndex = symbols.findIndex(([, state]) => Object.is(state, semanticState))\n return semanticState === FilterMode.Prefer\n || semanticState === FilterMode.Require\n || (symbols.length === 2 && semanticIndex === 1)\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 static override liveProps: readonly string[] = []\n readonly optionsEmitter: ReadableEmitter<FilterOptions, unknown> | null\n private readonly optionStateEmitters = new Map<FilterValue, Emitter<FilterModeValue>>()\n private staleOptionValues = new Set<FilterValue>()\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 const isLoading = fetchState === FetchState.Initial || fetchState === FetchState.Loading\n const hostClass = componentClass(this.props) || null\n if (fetchState === FetchState.Error && values.length === 0) {\n return <Host className={hostClass}>\n <p role=\"alert\">{errorMessage(error, 'Unable to load filter options')}</p>\n </Host>\n }\n if (isLoading && values.length === 0) {\n return <Host className={hostClass}>\n <p role=\"status\">Loading filter options…</p>\n </Host>\n }\n\n return <Host\n className={hostClass}\n role=\"group\"\n aria-label={this.props.label ?? 'Filter options'}\n aria-busy={isLoading ? 'true' : null}\n >\n {fetchState === FetchState.Error\n ? <p role=\"alert\">{errorMessage(error, 'Unable to load filter options')}</p>\n : null}\n {isLoading ? <p role=\"status\">Loading filter options…</p> : null}\n {values.length === 0\n ? <p>No filter options</p>\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 }\n\n onDestroy(): void {\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 static dependencies = [Checkbox]\n\n static override hostName = 'filter-panel'\n\n static css = css`\n & {\n position: absolute;\n background: white;\n border: 1px solid #ccc;\n padding: 8px;\n min-width: 180px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);\n z-index: 1000;\n display: flex;\n flex-flow: column nowrap;\n align-items: flex-start;\n left: 100%;\n top: 0;\n }\n\n & > p {\n margin: 0;\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 static override liveProps: readonly string[] = []\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 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 class=\"sort\"\n aria-label={`Sort ${String(label)}`}\n onClick={() => this.toggleSort()}\n >\n {label}\n <span class=\"sortindicator\" aria-hidden=\"true\">\n {direction === 'asc' ? '▲' : direction === 'desc' ? '▼' : ''}\n </span>\n </button>\n : <span>{label}</span>}\n {this.props.filterOptions == null\n ? null\n : <button\n type=\"button\"\n class=\"filter\"\n aria-label={filterLabel}\n aria-expanded={String(this.filterVisible)}\n onClick={(event: MouseEvent) => this.toggleFilterPanel(event)}\n >⛃</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 override css = css`\n fray-datatable > table > thead > tr > th[aria-sort] {\n position: relative;\n padding-right: 24px;\n user-select: var(--noselect-user-select);\n cursor: var(--noselect-cursor);\n }\n\n fray-datatable > table > thead > tr > th[aria-sort] > button.sort {\n appearance: none;\n display: block;\n width: 100%;\n padding: 0;\n color: inherit;\n background: transparent;\n border: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n text-align: inherit;\n cursor: pointer;\n }\n\n fray-datatable > table > thead > tr > th[aria-sort] > button.sort > span.sortindicator {\n position: absolute;\n right: 20px;\n top: 50%;\n transform: translateY(-50%);\n width: 1em;\n text-align: center;\n }\n\n fray-datatable > table > thead > tr > th[aria-sort] > button.filter {\n appearance: none;\n position: absolute;\n right: 2px;\n top: 50%;\n transform: translateY(-50%);\n width: 1em;\n padding: 0;\n color: inherit;\n background: transparent;\n border: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n text-align: center;\n cursor: pointer;\n opacity: 0.5;\n }\n\n fray-datatable > table > thead > tr > th[aria-sort] > button.filter:hover {\n opacity: 1;\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, 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 {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 static override liveProps: readonly string[] = []\n render(): FrayChild {\n return <thead>\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 static css = css`\n fray-datatable > table > thead {\n color: var(--table-header-color);\n background: var(--ui-gradient);\n }\n\n fray-datatable > table > thead > tr > th {\n border: 2px groove #fff7;\n border-left: none;\n }\n\n fray-datatable > table > thead > tr > th:last-child {\n border-right: none;\n }\n `\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 static override liveProps: readonly string[] = []\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 >\n {isLoading ? <p role=\"status\">Loading rows…</p> : null}\n {status === FetchState.Error\n ? <p role=\"alert\">{errorMessage(error, 'Unable to load rows')}</p>\n : null}\n {status === FetchState.Error && typeof this.dataSource?.retry === 'function'\n ? <button\n type=\"button\"\n onClick={() => this.dataSource?.retry?.('table retry')}\n >Retry</button>\n : 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 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\n static css = css`\n & {\n display: block;\n overflow: auto;\n }\n\n & > p {\n margin: 0;\n }\n\n & > table {\n border-collapse: collapse;\n width: 100%;\n }\n\n & thead:has([aria-expanded=\"true\"]) {\n position: relative;\n z-index: 1100;\n }\n\n & th,\n & td {\n text-align: left;\n padding: 0 var(--ui-padding);\n font-weight: normal;\n }\n\n &,\n & table,\n & tbody tr,\n & tbody tr td {\n user-select: none;\n pointer-events: all;\n }\n\n & tr td {\n background: var(--ui-table-bg-color);\n line-height: calc(var(--ui-font-size) + var(--ui-padding));\n font-size: var(--ui-font-size);\n height: calc(var(--ui-font-size) + var(--ui-padding-h));\n }\n\n & > table > tbody > tr:nth-child(even) > td {\n background: var(--ui-table-bg-color2);\n }\n\n & > table > tbody > tr[aria-selected=\"true\"] > td {\n color: var(--ui-select-text-color);\n background: var(--ui-select-bg);\n }\n\n & > table > tbody > tr:nth-child(even)[aria-selected=\"true\"] > td {\n background: var(--ui-select-bg-dark);\n }\n\n & tr td fray-placeholder {\n font-size: var(--ui-font-size);\n height: var(--ui-font-size);\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 static override liveProps: readonly string[] = []\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, FetchState} 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 itemLabelClassName?: (node: TreeNode<TValue>, depth: number) => string | null | undefined\n itemLabelStyle?: (node: TreeNode<TValue>, depth: number) => TreeItemStyle | null | undefined\n onSelect?: (node: TreeNode<TValue>, event: Event) => void\n}\n\nexport type TreeItemStyle = Readonly<Record<\nstring,\nstring | number | null | undefined\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 static override liveProps: readonly string[] = []\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 override setProps(nextProps: TreeViewProps<TValue>): this {\n if (this.ownedNodesEmitter != null) {\n if (isReadableEmitter(nextProps.nodes)) {\n throw new TypeError(\n 'TreeView cannot replace static or declarative nodes with an emitter',\n )\n }\n this.ownedNodesEmitter.set(\n nextProps.nodes ?? extractDeclarativeNodes<TValue>(nextProps.children),\n 'tree structure changed',\n )\n }\n return super.setProps(nextProps)\n }\n\n render(): FrayChild {\n const nodes = this.nodesEmitter.get()\n assertTreeNodes(nodes)\n const fetchState = this.nodesEmitter.getFetchState()\n const sourceError = this.nodesEmitter.getError()\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 {fetchState === FetchState.Error\n ? <p role=\"alert\">{errorMessage(sourceError, 'Unable to load tree items')}</p>\n : null}\n {fetchState !== FetchState.Error && visible.length === 0\n ? <p role=\"status\">No tree items</p>\n : <ul 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 const labelClassName = this.props.itemLabelClassName?.(node, depth)\n const labelStyle = this.props.itemLabelStyle?.(node, depth)\n return <li\n key={node.id}\n role=\"treeitem\"\n data-index={index}\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 <fray-expander aria-hidden=\"true\">\n {hasChildren ? (isExpanded ? '▾' : '▸') : '•'}\n </fray-expander>\n <fray-label\n {...(labelClassName == null ? {} : {className: labelClassName})}\n {...(labelStyle == null ? {} : {style: labelStyle})}\n >{label}</fray-label>\n </li>\n })}\n </ul>}\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\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 margin: 0;\n padding: 0;\n list-style: none;\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 & [role=\"treeitem\"]:hover {\n background: var(--button-background-hover);\n }\n\n & [role=\"treeitem\"]:focus-visible {\n outline: 2px solid transparent;\n outline-offset: -2px;\n box-shadow: var(--focus-ring);\n }\n\n & [role=\"treeitem\"][aria-selected=\"true\"] {\n color: var(--ui-select-text-color);\n background: var(--ui-select-bg);\n }\n\n & fray-expander {\n flex: 0 0 1rem;\n text-align: center;\n }\n\n & [role=\"treeitem\"][aria-expanded] > fray-expander {\n cursor: pointer;\n }\n\n & fray-label {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n & > [role=\"status\"],\n & > [role=\"alert\"] {\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 errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\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('fray-expander') != null\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../component.js'\nimport {componentClass, invoke} from '../controlUtils.js'\n\nconst buttonLiveProps = ['disabled', 'pressed', 'busy'] as const\n\nexport interface ButtonProps extends ComponentProps,\n LivePropContract<(typeof buttonLiveProps)[number]> {\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 static override liveProps = buttonLiveProps\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 const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <button\n id={id}\n name={name}\n value={value == null ? undefined : String(value)}\n title={title}\n type={type}\n disabled={unavailable}\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 </Host>\n }\n\n static override hostName = 'button'\n\n static override css = css`\n & > button {\n min-height: var(--control-min-height, 2rem);\n padding: var(--space-xs) var(--space-sm);\n color: var(--button-color);\n background: var(--button-background);\n border: var(--button-border);\n border-radius: var(--radius-md);\n box-shadow: var(--button-shadow);\n box-sizing: border-box;\n cursor: default;\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n user-select: none;\n white-space: nowrap;\n }\n\n & > button:hover:not(:disabled, [aria-disabled=\"true\"]) {\n background: var(--button-background-hover);\n }\n\n & > button:active:not(:disabled, [aria-disabled=\"true\"]) {\n background: var(--button-background-active);\n border-style: var(--button-border-style-active);\n box-shadow: var(--button-shadow-active);\n }\n\n & > button:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n & > button:disabled,\n & > button[aria-disabled=\"true\"] {\n color: var(--input-color-disabled);\n background: var(--button-background-disabled);\n border: var(--button-border-disabled);\n cursor: not-allowed;\n pointer-events: none;\n }\n `\n}\n","import {Button} from '../menu/button.js'\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract, 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\nconst dialogLiveProps = ['showCloseButton'] as const\n\nexport interface DialogProps extends ValueControlProps<boolean>,\n LivePropContract<(typeof dialogLiveProps)[number]> {\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 static override liveProps = dialogLiveProps\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 const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <dialog\n id={this.dialogId}\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 <fray-content>{children}</fray-content>\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 </Host>\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 override hostName = 'dialog'\n static override dependencies = [Button]\n\n static override css = css`\n & > dialog {\n z-index: 2;\n width: min(38rem, calc(100vw - 2rem));\n max-height: min(42rem, calc(100dvh - 2rem));\n padding: 0;\n color: var(--panel-color);\n background: var(--panel-background);\n border: var(--panel-border);\n border-radius: var(--panel-radius);\n box-shadow: var(--dialog-shadow);\n overflow: hidden;\n isolation: isolate;\n }\n\n & > dialog[open] {\n display: flex;\n flex-direction: column;\n }\n\n & > dialog::backdrop {\n background: var(--dialog-backdrop-background);\n }\n\n & > dialog > header,\n & > dialog > p,\n & > dialog > fray-content,\n & > dialog > footer {\n padding: var(--panel-padding, 0.75rem);\n }\n\n & > dialog > header {\n position: relative;\n z-index: 1;\n color: var(--dialog-header-color);\n background: var(--dialog-header-background);\n box-shadow: var(--section-header-shadow);\n }\n\n & > dialog > header h2,\n & > dialog > p {\n margin: 0;\n }\n\n & > dialog > header h2 {\n font-size: 1.1em;\n font-weight: 700;\n }\n\n & > dialog > fray-content {\n position: relative;\n z-index: 0;\n display: block;\n flex: 1 1 auto;\n min-height: 0;\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 & > dialog::backdrop {\n background: Canvas;\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 && !dialog.open) {\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 && dialog.open) {\n if (dialog.open && typeof dialog.close === 'function') dialog.close()\n else dialog.removeAttribute('open')\n this.finishClose()\n return\n }\n if (!shouldOpen && this.synchronizedOpen) this.finishClose()\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 = 'quadcheckbox'\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 = 'tricheckbox'\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 {Component, css} from '../component.js'\nimport type {ComponentProps} from '../component.js'\n\n/** Shared DOM and presentation contract for controls with a native label. */\nexport abstract class LabeledInputControl<\n TProps extends ComponentProps = ComponentProps,\n> extends Component<TProps> {\n static override css = css`\n & {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n align-items: center;\n gap: .5em;\n min-height: var(--control-min-height, 2rem);\n color: var(--ui-text-color);\n font-size: var(--ui-font-size);\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n box-sizing: border-box;\n user-select: none;\n }\n\n & > label {\n user-select: none;\n white-space: nowrap;\n }\n\n `\n}\n","import {css} from '../component.js'\nimport type {ComponentProps} from '../component.js'\nimport {LabeledInputControl} from './LabeledInputControl.js'\n\n/** Shared select-shell contract for labeled controls that render a native select. */\nexport abstract class SelectControl<\n TProps extends ComponentProps = ComponentProps,\n> extends LabeledInputControl<TProps> {\n static override css = css`\n & > fray-selectshell {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n isolation: isolate;\n min-height: var(--control-min-height, 2rem);\n box-sizing: border-box;\n }\n\n & > fray-selectshell > select {\n position: relative;\n z-index: 1;\n min-height: var(--control-min-height, 2rem);\n width: var(--input-width, 15rem);\n padding: var(--space-xs) var(--space-sm);\n padding-inline-end: var(--dropdown-padding-inline-end);\n color: var(--input-color);\n background: var(--dropdown-select-background);\n border: var(--dropdown-select-border);\n border-radius: var(--radius-md);\n box-shadow: var(--dropdown-select-shadow);\n box-sizing: border-box;\n font: inherit;\n appearance: var(--dropdown-appearance);\n pointer-events: all;\n white-space: nowrap;\n }\n\n & > fray-selectshell::after {\n content: var(--dropdown-underlay-content);\n position: absolute;\n z-index: 0;\n inset: 0;\n background: var(--dropdown-underlay-background);\n border: var(--dropdown-underlay-border);\n border-radius: 0;\n border-start-start-radius: var(--dropdown-underlay-start-radius);\n border-end-start-radius: var(--dropdown-underlay-start-radius);\n box-shadow: var(--dropdown-underlay-shadow);\n box-sizing: border-box;\n pointer-events: none;\n }\n\n & > fray-selectshell::before {\n content: var(--dropdown-trigger-content);\n position: absolute;\n z-index: 2;\n inset-block: 0;\n inset-inline-end: 0;\n display: grid;\n inline-size: var(--dropdown-trigger-width);\n place-items: center;\n color: var(--dropdown-trigger-color);\n background: var(--dropdown-trigger-background);\n border: var(--dropdown-trigger-border);\n border-radius: 0;\n border-start-end-radius: var(--dropdown-trigger-end-radius);\n border-end-end-radius: var(--dropdown-trigger-end-radius);\n box-shadow: var(--dropdown-trigger-shadow);\n box-sizing: border-box;\n pointer-events: none;\n }\n\n & > fray-selectshell:has(> select:hover:not(:disabled))::before {\n background: var(--dropdown-trigger-background-hover);\n box-shadow: var(--dropdown-trigger-shadow-hover);\n }\n\n & > fray-selectshell:has(> select:disabled)::before {\n color: var(--input-color-disabled);\n background: var(--dropdown-trigger-background-disabled);\n border: var(--dropdown-trigger-border-disabled);\n }\n\n & > fray-selectshell:has(> select:disabled)::after {\n background: var(--dropdown-underlay-background-disabled);\n border: var(--dropdown-underlay-border-disabled);\n }\n\n & > fray-selectshell > select:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n @media (forced-colors: active) {\n & > fray-selectshell::before,\n & > fray-selectshell::after {\n display: none;\n }\n\n & > fray-selectshell > select {\n appearance: auto;\n padding-inline-end: var(--space-sm);\n }\n }\n `\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\nimport type {FrayChild, LivePropContract} 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'\nimport {SelectControl} from './SelectControl.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\nconst dropdownLiveProps = ['disabled', 'required', 'error'] as const\n\nexport interface DropdownProps<TValue extends DropdownValue = string>\n extends ValueControlProps<TValue>, LivePropContract<(typeof dropdownLiveProps)[number]> {\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 SelectControl<DropdownProps<TValue>> {\n static override liveProps = dropdownLiveProps\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)}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <fray-selectshell>\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 </fray-selectshell>\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\n static override css = ''\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} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\nconst labelLiveProps = ['text'] as const\n\nexport interface LabelProps extends ComponentProps,\n LivePropContract<(typeof labelLiveProps)[number]> {\n id?: string | number | null\n text?: FrayChild\n htmlFor?: string\n}\n\nexport class Label extends Component<LabelProps> {\n static override liveProps = labelLiveProps\n\n render(): FrayChild {\n const {text, htmlFor, children} = this.props\n return <label\n className={componentClass(this.props) || undefined}\n htmlFor={htmlFor}\n data-fray-component=\"label\"\n >\n {text ?? children}\n </label>\n }\n}\n","import {Component, css} from '../component.js'\nimport type {\n ComponentProps,\n FrayChild,\n Key,\n LivePropContract,\n} 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'\nimport {CheckableControl} from './CheckableControl.js'\n\nexport type RadioOption<TValue extends Key = string> = readonly [\n value: TValue,\n label: FrayChild,\n]\n\nconst radioButtonLiveProps = ['checked', 'disabled', 'required', 'error'] as const\nconst radioGroupLiveProps = ['disabled', 'required', 'error'] as const\n\nexport interface RadioButtonProps extends ComponentProps,\n LivePropContract<(typeof radioButtonLiveProps)[number]> {\n id?: string | number | null\n label?: FrayChild\n name?: string\n value?: Key\n checked?: boolean\n disabled?: boolean\n required?: boolean\n error?: unknown\n onChange?: (checked: boolean, event: Event) => void\n}\n\n/** A native radio input with its associated label and visual control shell. */\nexport class RadioButton extends CheckableControl<RadioButtonProps> {\n static override liveProps = radioButtonLiveProps\n readonly inputId: string\n readonly errorId: string\n\n constructor(props: RadioButtonProps = {}) {\n super(props)\n this.inputId = controlId('radio', props.id)\n this.errorId = `${this.inputId}-error`\n }\n\n render(): FrayChild {\n const {\n label = this.props.value ?? 'Option',\n checked = false,\n disabled = false,\n required = false,\n error = null,\n } = this.props\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n <label htmlFor={this.inputId}>\n <input\n id={this.inputId}\n type=\"radio\"\n name={this.props.name}\n value={this.props.value == null ? undefined : String(this.props.value)}\n checked={checked}\n disabled={disabled}\n required={required}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onChange={(event: Event) => invoke(this.props.onChange,\n (event.currentTarget as HTMLInputElement).checked, event)}\n />\n <fray-checkshell aria-hidden=\"true\" />\n {label}\n </label>\n {error == null ? null : <p id={this.errorId} role=\"alert\">{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'radio-button'\n\n static override css = css`\n & > label > input[type=\"radio\"] + fray-checkshell {\n border-radius: 50%;\n }\n\n & > label > input[type=\"radio\"]:checked + fray-checkshell::after {\n width: .4em;\n height: .4em;\n content: \"\";\n border-radius: 50%;\n background: var(--checkbox-symbol-color);\n }\n `\n}\n\nexport interface RadioGroupProps<TValue extends Key = string>\n extends ValueControlProps<TValue>,\n LivePropContract<(typeof radioGroupLiveProps)[number]> {\n id?: string | number | null\n /** Ordinary option data; an owning render must resolve any reactive source. */\n options?: readonly RadioOption<TValue>[]\n label?: FrayChild\n ariaLabel?: string\n name?: string\n /** Accepts a boolean or `live(booleanEmitter)` in JSX/`h()` templates. */\n disabled?: boolean\n /** Accepts a boolean or `live(booleanEmitter)` in JSX/`h()` templates. */\n required?: boolean\n /** Validation error; accepts an ordinary value or `live(errorEmitter)`. */\n error?: unknown\n onChange?: (value: TValue, event: Event | null) => void\n}\n\n/** A native-radio group that owns one selected option value. */\nexport class RadioGroup<TValue extends Key = string>\n extends Component<RadioGroupProps<TValue>> {\n static dependencies = [RadioButton]\n static override liveProps = radioGroupLiveProps\n\n readonly valueEmitter: ValueEmitter<TValue>\n readonly groupId: string\n readonly errorId: string\n\n constructor(props: RadioGroupProps<TValue> = {}) {\n super(props)\n const options = props.options ?? []\n validateRadioOptions(options)\n const firstValue = options[0]?.[0] ?? null as unknown as TValue\n this.valueEmitter = createValueEmitter(this, props, firstValue, 'radio group value')\n this.groupId = controlId('radio-group', props.id)\n this.errorId = `${this.groupId}-error`\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: RadioGroupProps<TValue>): this {\n const options = nextProps.options ?? []\n validateRadioOptions(options)\n super.setProps(nextProps)\n this.selectFirstAvailableOption(options)\n return this\n }\n\n selectOption(value: TValue, event: Event | null = null): void {\n if (this.props.disabled) return\n this.valueEmitter.set(value, 'radio option selected')\n invoke(this.props.onChange, value, event)\n }\n\n render(): FrayChild {\n const {options = [], label, disabled = false, required = false, error = null} = this.props\n validateRadioOptions(options)\n const selectedValue = this.valueEmitter.get()\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n >\n <fieldset\n id={this.groupId}\n disabled={disabled}\n aria-label={label == null ? this.props.ariaLabel : null}\n aria-required={required ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n >\n {label == null ? null : <legend>{label}</legend>}\n {options.map(([value, optionLabel], index) => <RadioButton\n key={String(value)}\n id={`${this.groupId}-${index}`}\n name={this.props.name ?? this.groupId}\n value={value}\n label={optionLabel}\n checked={Object.is(selectedValue, value)}\n disabled={disabled}\n required={required}\n onChange={(checked, event) => {\n if (checked) this.selectOption(value, event)\n }}\n />)}\n </fieldset>\n {error == null ? null : <p id={this.errorId} role=\"alert\">{String(error)}</p>}\n </Host>\n }\n\n static override hostName = 'radio-group'\n\n static override css = css`\n & > fieldset {\n display: flex;\n flex-flow: column wrap;\n gap: 0;\n margin: 0;\n padding: 0;\n min-inline-size: 0;\n border: 0;\n user-select: none;\n }\n\n & > fieldset > legend {\n flex: 0 0 100%;\n padding: 0;\n margin-bottom: .5em;\n border-bottom: 1px solid #aaa;\n }\n `\n\n private selectFirstAvailableOption(options: readonly RadioOption<TValue>[]): void {\n if (!options.some(([value]) => Object.is(value, this.valueEmitter.get()))) {\n this.valueEmitter.set(options[0]?.[0] ?? null as unknown as TValue,\n 'radio group options changed')\n }\n }\n}\n\nfunction validateRadioOptions<TValue extends Key>(\n options: unknown,\n): asserts options is readonly RadioOption<TValue>[] {\n assertOptions<unknown>(options, 'Radio group options')\n for (const option of options) {\n if (!Array.isArray(option) || option.length < 2) {\n throw new TypeError('Radio group options must be [value, label] tuples')\n }\n }\n}\n","import {css} from '../component.js'\nimport type {FrayChild, LivePropContract, Ref} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\nimport {LabeledInputControl} from './LabeledInputControl.js'\n\nconst textboxLiveProps = ['disabled', 'required', 'readOnly', 'error'] as const\n\nexport interface TextboxProps extends ValueControlProps<string>,\n LivePropContract<(typeof textboxLiveProps)[number]> {\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 LabeledInputControl<TextboxProps> {\n static override liveProps = textboxLiveProps\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 className={componentClass(this.props) || null}>\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\n static override css = css`\n & > input {\n min-height: var(--control-min-height, 2rem);\n width: var(--input-width, 15rem);\n padding: var(--space-xs) var(--space-sm);\n color: var(--input-color);\n background: var(--input-background);\n border: var(--input-border);\n border-radius: var(--radius-md);\n box-shadow: var(--input-shadow);\n box-sizing: border-box;\n font: inherit;\n pointer-events: all;\n user-select: text;\n white-space: nowrap;\n cursor: text;\n }\n\n & > input:disabled {\n color: var(--input-color-disabled);\n background: var(--input-background-disabled);\n border-color: var(--ui-input-border-disabled);\n cursor: not-allowed;\n }\n\n & > input:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\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, LivePropContract} 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\nconst toggleLiveProps = ['disabled', 'required', 'error'] as const\n\nexport interface ToggleProps<TValue extends Key = string>\n extends ValueControlProps<TValue>, LivePropContract<(typeof toggleLiveProps)[number]> {\n id?: string | number | null\n options?: readonly ToggleOption<TValue>[]\n label?: FrayChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n error?: unknown\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 static override liveProps = toggleLiveProps\n readonly valueEmitter: ValueEmitter<TValue>\n readonly groupId: string\n readonly legendId: string\n readonly errorId: 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 this.errorId = `${this.groupId}-error`\n }\n\n initialize(): void {\n this.selectFirstAvailableOption(this.props.options ?? [])\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: ToggleProps<TValue>): this {\n const options = nextProps.options ?? []\n validateToggleOptions(options)\n super.setProps(nextProps)\n this.selectFirstAvailableOption(options)\n return this\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 error = null,\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 const Host = this.Host\n return <Host id={this.groupId} className={componentClass(this.props) || null}>\n {label == null ? null : <fray-label id={this.legendId}>{label}</fray-label>}\n <fray-options\n role=\"radiogroup\"\n aria-label={label == null ? this.props.ariaLabel : null}\n aria-labelledby={label == null ? null : this.legendId}\n aria-required={required ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\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 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>)}</fray-options>\n {error == null ? null : <fray-error\n id={this.errorId}\n role=\"alert\"\n >{String(error)}</fray-error>}\n </Host>\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 private selectFirstAvailableOption(options: readonly ToggleOption<TValue>[]): void {\n if (!options.some(([value]) => Object.is(value, this.valueEmitter.get()))) {\n this.valueEmitter.set(options[0]?.[0] ?? null as unknown as TValue,\n 'toggle options changed')\n }\n }\n\n static override hostName = 'toggle'\n\n static override css = css`\n & {\n display: inline-block;\n inline-size: fit-content;\n max-inline-size: 100%;\n }\n\n & > fray-label,\n & > fray-error {\n display: block;\n }\n\n & > fray-options {\n display: flex;\n min-height: var(--control-min-height, 2rem);\n border-radius: var(--radius-md);\n box-shadow: var(--toggle-group-shadow);\n box-sizing: border-box;\n cursor: pointer;\n user-select: none;\n }\n\n & > fray-options > button[role=\"radio\"] {\n position: relative;\n min-height: var(--control-min-height, 2rem);\n padding: var(--space-xs) var(--space-sm);\n color: var(--button-color);\n background: var(--toggle-button-background);\n border: var(--button-border);\n border-radius: 0;\n border-left: none;\n border-right: none;\n box-shadow: var(--toggle-button-shadow);\n box-sizing: border-box;\n cursor: default;\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding));\n user-select: none;\n white-space: nowrap;\n }\n\n & > fray-options > button[role=\"radio\"]:hover:not(:disabled)[aria-checked=\"false\"] {\n background: var(--button-background-hover);\n }\n\n & > fray-options > button[role=\"radio\"]:first-of-type {\n border-radius: var(--radius-md) 0 0 var(--radius-md);\n border: var(--button-border);\n border-right: none;\n }\n\n & > fray-options > button[role=\"radio\"]:last-of-type {\n border-radius: 0 var(--radius-md) var(--radius-md) 0;\n border: var(--button-border);\n border-left: none;\n }\n\n & > fray-options > button[role=\"radio\"][aria-checked=\"false\"]\n + [role=\"radio\"][aria-checked=\"false\"] {\n border-inline-start: var(--button-border);\n border-inline-start-color: var(--toggle-inactive-shared-border-color);\n }\n\n & > fray-options > button[role=\"radio\"][aria-checked=\"true\"] {\n color: var(--selection-color);\n background: var(--toggle-button-background-checked);\n border: var(--toggle-button-border-checked);\n box-shadow: var(--toggle-button-shadow-checked);\n margin-inline: var(--toggle-button-selected-inline-overlap);\n z-index: var(--toggle-button-selected-z-index);\n }\n\n & > fray-options > button[role=\"radio\"]:disabled {\n color: var(--input-color-disabled);\n background: var(--button-background-disabled);\n border: var(--button-border-disabled);\n cursor: not-allowed;\n }\n\n & > fray-options > button[role=\"radio\"]:active:not(:disabled) {\n border-style: var(--button-border-style-active);\n }\n\n & > fray-options > button[role=\"radio\"][aria-checked=\"false\"]\n + [role=\"radio\"][aria-checked=\"false\"]::after {\n content: '';\n position: absolute;\n inset-block: var(--toggle-inactive-separator-block-inset);\n inline-size: 1px;\n inset-inline-start: -1px;\n background: var(--toggle-inactive-separator-background);\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 static override liveProps: readonly string[] = []\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 aria-label={label}\n aria-orientation={orientation}\n >{children}</Host>\n }\n\n static override hostName = 'toolbar'\n\n static css = css`\n & {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n color: var(--toolbar-color);\n background: var(--toolbar-background);\n border: var(--toolbar-border);\n box-shadow: var(--toolbar-shadow);\n gap: var(--spacing-small, 0.5rem);\n padding: var(--ui-padding);\n }\n\n & > * {\n margin: 0;\n }\n\n &[aria-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 static override liveProps: readonly string[] = []\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 percentage = value == null ? null : value / max * 100\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 <label htmlFor={this.progressId}>{this.props.label}</label>\n <progress\n id={this.progressId}\n value={value == null ? undefined : value}\n max={max}\n aria-valuetext={valueText}\n >{valueText}</progress>\n <fray-content aria-hidden=\"true\">\n <fray-progress\n style={percentage == null ? undefined : {\n '--progress-width': `${percentage}%`,\n '--progress-inverse-width': `${10000 / Math.max(percentage, 1)}%`,\n }}\n ><fray-inverse>{this.props.label}</fray-inverse></fray-progress>\n <fray-label>{this.props.label}</fray-label>\n </fray-content>\n </Host>\n }\n\n static override hostName = 'progress-bar'\n\n static css = css`\n & {\n display: block;\n }\n\n & > label,\n & > progress {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n }\n\n & > fray-content {\n position: relative;\n display: block;\n width: 100%;\n min-height: var(--control-min-height);\n border-radius: var(--ui-border-radius);\n overflow: hidden;\n background: var(--progress-track-background);\n box-shadow: var(--progress-track-shadow);\n color: var(--progress-track-color);\n text-align: center;\n line-height: var(--control-min-height);\n box-sizing: border-box;\n }\n\n & > fray-content > fray-progress {\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n display: block;\n width: var(--progress-width, 0%);\n height: 100%;\n border-radius: inherit;\n overflow: hidden;\n background: var(--progress-value-background);\n box-shadow: var(--progress-value-shadow);\n }\n\n & > fray-content > fray-progress > fray-inverse {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n width: var(--progress-inverse-width, 10000%);\n height: 100%;\n color: var(--progress-value-color);\n text-align: center;\n white-space: nowrap;\n }\n\n & > fray-content > fray-label {\n position: relative;\n z-index: 0;\n display: block;\n height: 100%;\n white-space: nowrap;\n }\n\n &:has(> progress:indeterminate) > fray-content > fray-progress {\n display: none;\n }\n\n &:has(> progress:indeterminate) > fray-content > fray-label {\n z-index: 2;\n }\n\n &:has(> progress:indeterminate) > fray-content::after {\n position: absolute;\n z-index: 1;\n inset: 1px;\n content: \"\";\n border-radius: inherit;\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n animation: fray-progressbar-indeterminate 0.55s linear infinite;\n opacity: .5;\n }\n\n @keyframes fray-progressbar-indeterminate {\n from { background-position: 0 0; }\n to { background-position: 2rem 0; }\n }\n\n @media (forced-colors: active) {\n & > fray-content {\n border: 1px solid CanvasText;\n background: Canvas;\n box-shadow: none;\n color: CanvasText;\n }\n\n & > fray-content > fray-progress {\n background: Highlight;\n box-shadow: none;\n }\n\n & > fray-content > fray-progress > fray-inverse {\n color: HighlightText;\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'\nexport type FrayAppearance = 'light' | 'dark' | 'system'\nexport type FrayThemeAppearanceCapability = 'light' | 'dark' | 'adaptive'\n\nexport interface FrayStylesheetOption {\n value: string\n label: string\n href: string\n}\n\nexport interface FrayThemeOption extends FrayStylesheetOption {\n /** Appearance modes the selected theme deliberately supports. */\n appearance: FrayThemeAppearanceCapability\n}\n\nexport type FrayThemeVariableLayer = 'palette' | 'theme'\nexport type FrayThemeVariableValue =\n | 'background'\n | 'border'\n | 'color'\n | 'dimension'\n | 'duration'\n | 'font'\n | 'opacity'\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-light-clear', 'palette', 'contrast', 'color', 'Transparent light endpoint'),\n variable('--palette-light-faint', 'palette', 'contrast', 'color', 'Faint translucent light endpoint'),\n variable('--palette-primary-light-mix', 'palette', 'primary', 'color', 'Light-side primary ramp mix endpoint', '--palette-light'),\n variable('--palette-primary-dark-mix', 'palette', 'primary', 'color', 'Dark-side primary ramp mix endpoint', '--palette-dark'),\n variable('--palette-secondary-light-mix', 'palette', 'secondary', 'color', 'Light-side secondary ramp mix endpoint', '--palette-light'),\n variable('--palette-secondary-dark-mix', 'palette', 'secondary', 'color', 'Dark-side secondary ramp mix endpoint', '--palette-dark'),\n variable('--palette-neutral-light-mix', 'palette', 'neutral', 'color', 'Light-side neutral ramp mix endpoint', '--palette-light'),\n variable('--palette-neutral-dark-mix', 'palette', 'neutral', 'color', 'Dark-side neutral ramp mix endpoint', '--palette-dark'),\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('--application-background', 'theme', 'surface', 'background', 'Application canvas'),\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('--island-margin', 'theme', 'island', 'dimension', 'Outer spacing around an explicit island'),\n variable('--island-padding', 'theme', 'island', 'dimension', 'Inner spacing within an explicit island'),\n variable('--island-background', 'theme', 'island', 'background', 'Explicit island surface', '--panel-background'),\n variable('--island-border', 'theme', 'island', 'border', 'Explicit island edge', '--panel-border'),\n variable('--island-radius', 'theme', 'island', 'radius', 'Explicit island radius', '--panel-radius'),\n variable('--island-shadow', 'theme', 'island', 'shadow', 'Explicit island elevation', '--panel-shadow'),\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('--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('--button-border-style-active', 'theme', 'button', 'border', 'Pressed button border style'),\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\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('--navigation-bar-background', 'theme', 'navigation', 'background', 'Navigation bar surface'),\n variable('--navigation-bar-color', 'theme', 'navigation', 'color', 'Navigation bar content'),\n variable('--navigation-bar-border', 'theme', 'navigation', 'border', 'Navigation bar border'),\n variable('--navigation-bar-shadow', 'theme', 'navigation', 'shadow', 'Navigation bar elevation'),\n variable('--navigation-bar-padding', 'theme', 'navigation', 'dimension', 'Navigation bar inner spacing'),\n variable('--navigation-bar-gap', 'theme', 'navigation', 'dimension', 'Navigation item gap'),\n variable('--navigation-link-color', 'theme', 'navigation', 'color', 'Navigation link content'),\n variable('--navigation-link-color-hover', 'theme', 'navigation', 'color', 'Hovered navigation link content'),\n variable('--navigation-link-color-active', 'theme', 'navigation', 'color', 'Pressed navigation link content'),\n variable('--navigation-link-color-current', 'theme', 'navigation', 'color', 'Current navigation link content'),\n variable('--navigation-link-color-disabled', 'theme', 'navigation', 'color', 'Disabled navigation link content'),\n variable('--navigation-link-background', 'theme', 'navigation', 'background', 'Navigation link surface'),\n variable('--navigation-link-background-hover', 'theme', 'navigation', 'background', 'Hovered navigation link surface'),\n variable('--navigation-link-background-active', 'theme', 'navigation', 'background', 'Pressed navigation link surface'),\n variable('--navigation-link-background-current', 'theme', 'navigation', 'background', 'Current navigation link surface'),\n variable('--navigation-link-background-disabled', 'theme', 'navigation', 'background', 'Disabled navigation link surface'),\n variable('--navigation-link-border', 'theme', 'navigation', 'border', 'Navigation link border'),\n variable('--navigation-link-border-current', 'theme', 'navigation', 'border', 'Current navigation link border'),\n variable('--navigation-link-shadow', 'theme', 'navigation', 'shadow', 'Navigation link elevation'),\n variable('--navigation-link-shadow-current', 'theme', 'navigation', 'shadow', 'Current navigation link elevation'),\n variable('--navigation-link-padding', 'theme', 'navigation', 'dimension', 'Navigation link inner spacing'),\n variable('--navigation-link-radius', 'theme', 'navigation', 'radius', 'Navigation link corner radius'),\n variable('--navigation-link-font-weight-current', 'theme', 'navigation', 'font', 'Current navigation link emphasis'),\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-track-color', 'theme', 'progress', 'color', 'Progress track label'),\n variable('--progress-track-shadow', 'theme', 'progress', 'shadow', 'Progress track depth'),\n variable('--progress-value-background', 'theme', 'progress', 'background', 'Progress value'),\n variable('--progress-value-color', 'theme', 'progress', 'color', 'Completed progress label'),\n variable('--progress-value-shadow', 'theme', 'progress', 'shadow', 'Completed progress depth'),\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 variable('--colored-shadow', 'theme', 'colored', 'shadow', 'Colored-trait depth'),\n variable('--block-graph-block-border', 'theme', 'block graph', 'border', 'Block graph category border', '--ui-border'),\n variable('--block-graph-block-radius', 'theme', 'block graph', 'radius', 'Block graph category radius', '--radius-sm'),\n variable('--block-graph-block-shadow', 'theme', 'block graph', 'shadow', 'Block graph category depth'),\n] satisfies readonly FrayThemeVariableDefinition[])\n\nexport const frayThemeOptions = Object.freeze([\n themeOption('shiny', 'Shiny', distributedAssetUrl('themes/shiny/theme.css'), 'light'),\n themeOption('java', 'Java', distributedAssetUrl('themes/java/theme.css'), 'light'),\n themeOption('minimal', 'Minimal', distributedAssetUrl('themes/minimal/theme.css'), 'adaptive'),\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\n/**\n * Select how an adaptive Fray theme resolves its light and dark mappings.\n * `system` removes the root attribute so the browser preference applies.\n */\nexport function setFrayAppearance(\n appearance: FrayAppearance,\n targetDocument: Document = globalThis.document,\n): void {\n if (targetDocument?.documentElement == null) {\n throw new TypeError('setFrayAppearance requires a document with a root')\n }\n if (appearance !== 'light' && appearance !== 'dark' && appearance !== 'system') {\n throw new TypeError('Fray appearance must be light, dark, or system')\n }\n if (appearance === 'system') targetDocument.documentElement.removeAttribute('data-appearance')\n else targetDocument.documentElement.dataset.appearance = appearance\n}\n\nexport function getFrayAppearance(\n targetDocument: Document = globalThis.document,\n): FrayAppearance {\n if (targetDocument?.documentElement == null) {\n throw new TypeError('getFrayAppearance requires a document with a root')\n }\n const appearance = targetDocument.documentElement.dataset.appearance\n return appearance === 'light' || appearance === 'dark' ? appearance : 'system'\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\nfunction themeOption(\n value: string,\n label: string,\n href: string,\n appearance: FrayThemeAppearanceCapability,\n): FrayThemeOption {\n return Object.freeze({value, label, href, appearance})\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 {css} from '../component.js'\nimport type {ComponentProps, FrayChild, LivePropContract} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\nimport {SelectControl} from '../lineinputs/SelectControl.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\nconst stylesheetPickerLiveProps = ['disabled'] as const\n\nexport interface StylesheetPickerProps extends ValueControlProps<string>,\n LivePropContract<(typeof stylesheetPickerLiveProps)[number]> {\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 SelectControl<StylesheetPickerProps> {\n static override liveProps = stylesheetPickerLiveProps\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)}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <fray-selectshell>\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 </fray-selectshell>\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 override css = css`\n & > fray-selectshell > 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}\n\nexport class ColorPicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'colors', frayColorOptions)\n }\n\n static override hostName = '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","export interface NavigationAdapter {\n read(): string\n href(location: string): string\n push(location: string): void\n replace(location: string): void\n subscribe(listener: () => void): () => void\n}\n\nexport interface HistoryNavigationOptions {\n basePath?: string\n}\n\nexport interface BrowserNavigationTarget extends EventTarget {\n readonly location: Location\n readonly history: History\n}\n\nexport class MemoryNavigationAdapter implements NavigationAdapter {\n private readonly listeners = new Set<() => void>()\n private entries: string[]\n private index = 0\n\n constructor(initialLocation = '/') {\n this.entries = [normalizeRouteLocation(initialLocation)]\n }\n\n read(): string {\n return this.entries[this.index] ?? '/'\n }\n\n href(location: string): string {\n return normalizeRouteLocation(location)\n }\n\n push(location: string): void {\n this.entries = this.entries.slice(0, this.index + 1)\n this.entries.push(normalizeRouteLocation(location))\n this.index += 1\n }\n\n replace(location: string): void {\n this.entries[this.index] = normalizeRouteLocation(location)\n }\n\n subscribe(listener: () => void): () => void {\n if (typeof listener !== 'function') {\n throw new TypeError('Navigation adapter subscriber must be a function')\n }\n this.listeners.add(listener)\n let active = true\n return () => {\n if (!active) return\n active = false\n this.listeners.delete(listener)\n }\n }\n\n back(): void {\n if (this.index === 0) return\n this.index -= 1\n this.notify()\n }\n\n forward(): void {\n if (this.index >= this.entries.length - 1) return\n this.index += 1\n this.notify()\n }\n\n get length(): number {\n return this.entries.length\n }\n\n private notify(): void {\n for (const listener of [...this.listeners]) listener()\n }\n}\n\nexport function createHistoryNavigation(\n target: BrowserNavigationTarget = globalThis.window,\n options: HistoryNavigationOptions = {},\n): NavigationAdapter {\n assertBrowserTarget(target)\n const basePath = normalizeBasePath(options.basePath ?? '/')\n return {\n read() {\n const pathname = target.location.pathname\n const relative = pathname === basePath.slice(0, -1)\n ? '/'\n : pathname.startsWith(basePath)\n ? `/${pathname.slice(basePath.length)}`\n : pathname\n return normalizeRouteLocation(`${relative}${target.location.search}`)\n },\n href(location) {\n const normalized = normalizeRouteLocation(location)\n return `${basePath}${normalized.slice(1)}`\n },\n push(location) {\n target.history.pushState(null, '', this.href(location))\n },\n replace(location) {\n target.history.replaceState(null, '', this.href(location))\n },\n subscribe(listener) {\n target.addEventListener('popstate', listener)\n return () => target.removeEventListener('popstate', listener)\n },\n }\n}\n\nexport function createHashNavigation(\n target: BrowserNavigationTarget = globalThis.window,\n): NavigationAdapter {\n assertBrowserTarget(target)\n return {\n read() {\n return normalizeRouteLocation(target.location.hash.slice(1) || '/')\n },\n href(location) {\n return `#${normalizeRouteLocation(location)}`\n },\n push(location) {\n target.history.pushState(null, '', this.href(location))\n },\n replace(location) {\n target.history.replaceState(null, '', this.href(location))\n },\n subscribe(listener) {\n let last = this.read()\n const notify = () => {\n const next = this.read()\n if (next === last) return\n last = next\n listener()\n }\n target.addEventListener('popstate', notify)\n target.addEventListener('hashchange', notify)\n return () => {\n target.removeEventListener('popstate', notify)\n target.removeEventListener('hashchange', notify)\n }\n },\n }\n}\n\nexport function normalizeRouteLocation(location: string): string {\n if (typeof location !== 'string') throw new TypeError('Route location must be a string')\n const hashIndex = location.indexOf('#')\n const withoutHash = hashIndex < 0 ? location : location.slice(0, hashIndex)\n const queryIndex = withoutHash.indexOf('?')\n const rawPath = queryIndex < 0 ? withoutHash : withoutHash.slice(0, queryIndex)\n const search = queryIndex < 0 ? '' : withoutHash.slice(queryIndex)\n const rooted = rawPath.startsWith('/') ? rawPath : `/${rawPath}`\n const pathname = rooted.replace(/\\/{2,}/g, '/').replace(/\\/$/, '') || '/'\n return `${pathname}${search}`\n}\n\nfunction normalizeBasePath(value: string): string {\n const normalized = normalizeRouteLocation(value).split('?')[0] ?? '/'\n return normalized === '/' ? '/' : `${normalized}/`\n}\n\nfunction assertBrowserTarget(value: unknown): asserts value is BrowserNavigationTarget {\n if (value == null\n || typeof value !== 'object'\n || !('location' in value)\n || !('history' in value)\n || !('addEventListener' in value)) {\n throw new TypeError('Browser navigation requires a window-like target')\n }\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport type {WritableEmitter} from '../Components/component.js'\nimport type {NavigationAdapter} from './navigationAdapter.js'\nimport {normalizeRouteLocation} from './navigationAdapter.js'\nimport {\n RouteRedirect,\n RouteUnavailableError,\n assertRouteDescriptor,\n assertRouteQueryCodec,\n assertRouteTarget,\n formatRouteTarget,\n} from './route.js'\nimport type {\n AnyRouteDescriptor,\n LiteralRouteDescriptor,\n ParameterRouteDescriptor,\n RouteDescriptor,\n RouteQueryCodec,\n RouteResolveContext,\n RouteTarget,\n RouteValueResolver,\n} from './route.js'\n\nexport type NavigationHistoryMode = 'push' | 'replace'\n\nexport interface BrowserRouterOptions {\n adapter: NavigationAdapter\n}\n\nexport interface NavigationTransition {\n readonly state: 'pending' | 'idle'\n readonly requestedLocation: string\n readonly settledLocation: string\n}\n\nexport interface NavigationIssue {\n readonly requestedLocation: string\n readonly failedRouteId: string | null\n readonly reason: string\n readonly fallbackLocation: string\n}\n\nexport interface ResolvedRoute {\n readonly route: AnyRouteDescriptor | null\n readonly parent: ResolvedRoute | null\n readonly segment: string | null\n readonly value: unknown\n readonly pathname: string\n}\n\nexport interface SelectionRouteBinding {\n readonly route: LiteralRouteDescriptor\n readonly active: () => boolean\n readonly activate: (signal: AbortSignal) => void | Promise<void>\n readonly disabled?: boolean\n}\n\nexport interface ValueRouteBinding<TValue> {\n readonly route: ParameterRouteDescriptor<TValue>\n readonly valueEmitter: WritableEmitter<TValue | null>\n readonly resolve?: RouteValueResolver<TValue>\n}\n\nexport interface RouteQueryBinding<TValue> {\n readonly name: string\n readonly valueEmitter: WritableEmitter<TValue>\n readonly codec: RouteQueryCodec<TValue>\n readonly defaultValue: TValue\n readonly equals?: (left: TValue, right: TValue) => boolean\n}\n\nexport interface RouteRegistration {\n readonly context: ResolvedRoute\n dispose(): void\n}\n\ninterface ScopeOwner {\n complete: boolean\n}\n\ninterface ScopeRecord {\n readonly owners: Map<object, ScopeOwner>\n readonly entries: Map<AnyRouteDescriptor, RouteEntry>\n readonly queries: Map<string, QueryEntry<unknown>>\n}\n\ninterface RouteEntry {\n readonly owner: object\n readonly descriptor: AnyRouteDescriptor\n readonly parent: ResolvedRoute\n readonly match: (segment: string) => MatchResult | null\n readonly currentValue: () => unknown | null\n readonly activate: (\n match: MatchResult,\n context: RouteResolveContext,\n signal: AbortSignal,\n ) => MatchResult | RouteRedirect | Promise<MatchResult | RouteRedirect>\n readonly context: (value: unknown) => ResolvedRoute\n readonly disposeSubscription: () => void\n}\n\ninterface QueryEntry<TValue> {\n readonly owner: object\n readonly context: ResolvedRoute\n readonly name: string\n readonly emitter: WritableEmitter<TValue>\n readonly codec: RouteQueryCodec<TValue>\n readonly defaultValue: TValue\n readonly equals: (left: TValue, right: TValue) => boolean\n readonly disposeSubscription: () => void\n}\n\ninterface MatchResult {\n readonly value: unknown\n}\n\ninterface ParsedLocation {\n readonly location: string\n readonly pathname: string\n readonly segments: readonly string[]\n readonly search: URLSearchParams\n}\n\nconst MAX_REDIRECTS = 16\n\nexport class BrowserRouter {\n readonly root: ResolvedRoute\n readonly transition: ReadableEmitter<NavigationTransition>\n readonly issue: ReadableEmitter<NavigationIssue | null>\n\n private readonly transitionEmitter: Emitter<NavigationTransition>\n private readonly issueEmitter: Emitter<NavigationIssue | null>\n private readonly scopes = new Map<ResolvedRoute, ScopeRecord>()\n private readonly contextCache = new Map<string, ResolvedRoute>()\n private readonly knownQueryNames = new Set<string>()\n private readonly registryWaiters = new Set<() => void>()\n private readonly adapterUnsubscribe: () => void\n private controller: AbortController | null = null\n private activeContext: ResolvedRoute\n private requested: ParsedLocation\n private applying = 0\n private syncQueued = false\n private disposed = false\n\n constructor(readonly adapter: NavigationAdapter) {\n assertNavigationAdapter(adapter)\n this.root = Object.freeze({\n route: null,\n parent: null,\n segment: null,\n value: null,\n pathname: '/',\n })\n resolvedRouteOwners.set(this.root, this)\n this.activeContext = this.root\n this.requested = parseLocation(adapter.read())\n const initialTransition = Object.freeze({\n state: 'pending' as const,\n requestedLocation: this.requested.location,\n settledLocation: '/',\n })\n this.transitionEmitter = new Emitter<NavigationTransition>(initialTransition, {\n owner: this,\n purpose: 'browser route transition',\n })\n this.issueEmitter = new Emitter<NavigationIssue | null>(null, {\n owner: this,\n purpose: 'browser route issue',\n })\n this.transition = this.transitionEmitter\n this.issue = this.issueEmitter\n this.adapterUnsubscribe = adapter.subscribe(() => {\n this.startTransition(adapter.read(), 0, false)\n })\n this.startTransition(this.requested.location, 0, false)\n }\n\n openScope(context: ResolvedRoute, owner: object): () => void {\n this.assertActive()\n assertResolvedRoute(context, this)\n assertOwner(owner)\n const scope = this.scope(context)\n if (scope.owners.has(owner)) throw new Error('Route scope owner is already registered')\n scope.owners.set(owner, {complete: false})\n this.wakeRegistry()\n let active = true\n return () => {\n if (!active) return\n active = false\n scope.owners.delete(owner)\n this.removeOwnerEntries(scope, owner)\n this.removeOwnerQueries(scope, owner)\n if (scope.owners.size === 0\n && scope.entries.size === 0\n && scope.queries.size === 0) {\n this.scopes.delete(context)\n }\n this.wakeRegistry()\n }\n }\n\n completeScope(context: ResolvedRoute, owner: object): void {\n this.assertActive()\n assertResolvedRoute(context, this)\n const scopeOwner = this.scope(context).owners.get(owner)\n if (scopeOwner == null) throw new Error('Cannot complete an unopened route scope')\n validateScope(this.scope(context))\n scopeOwner.complete = true\n this.wakeRegistry()\n }\n\n registerSelectionRoutes(\n parent: ResolvedRoute,\n owner: object,\n bindings: readonly SelectionRouteBinding[],\n subscribe: (listener: () => void) => () => void,\n ): ReadonlyMap<LiteralRouteDescriptor, ResolvedRoute> {\n this.assertActive()\n assertResolvedRoute(parent, this)\n assertOwner(owner)\n if (!Array.isArray(bindings)) throw new TypeError('Route bindings must be an array')\n if (typeof subscribe !== 'function') {\n throw new TypeError('Selection route registration requires a subscriber')\n }\n const scope = this.scope(parent)\n const contexts = new Map<LiteralRouteDescriptor, ResolvedRoute>()\n const descriptors = new Set<LiteralRouteDescriptor>()\n for (const binding of bindings) {\n assertRouteDescriptor(binding.route)\n if (binding.route.kind !== 'literal') {\n throw new TypeError('Tab routes must use literal route descriptors')\n }\n if (descriptors.has(binding.route) || scope.entries.has(binding.route)) {\n throw new Error(`Duplicate route in one scope: ${binding.route.id}`)\n }\n descriptors.add(binding.route)\n const context = this.literalContext(parent, binding.route)\n const entry: RouteEntry = {\n owner,\n descriptor: binding.route,\n parent,\n match: (segment) => decodeSegment(segment) === binding.route.path\n ? {value: null}\n : null,\n currentValue: () => binding.active() ? null : undefined,\n activate: async (match, _context, signal) => {\n if (binding.disabled) {\n throw new RouteUnavailableError(\n `Route \"${binding.route.id}\" is currently disabled`,\n )\n }\n if (signal.aborted) throw signal.reason\n await binding.activate(signal)\n return match\n },\n context: () => context,\n disposeSubscription: () => {},\n }\n scope.entries.set(binding.route, entry)\n contexts.set(binding.route, context)\n }\n const unsubscribe = subscribe(() => this.scheduleStateSync())\n for (const descriptor of descriptors) {\n const entry = scope.entries.get(descriptor)\n if (entry != null) {\n ;(entry as {disposeSubscription: () => void}).disposeSubscription = unsubscribe\n }\n }\n this.wakeRegistry()\n return contexts\n }\n\n unregisterRoutes(parent: ResolvedRoute, owner: object): void {\n const scope = this.scopes.get(parent)\n if (scope == null) return\n this.removeOwnerEntries(scope, owner)\n this.wakeRegistry()\n }\n\n registerValueRoute<TValue>(\n parent: ResolvedRoute,\n owner: object,\n binding: ValueRouteBinding<TValue>,\n ): RouteRegistration & {contextFor(value: TValue): ResolvedRoute} {\n this.assertActive()\n assertResolvedRoute(parent, this)\n assertOwner(owner)\n assertRouteDescriptor(binding.route)\n if (binding.route.kind !== 'parameter') {\n throw new TypeError('Value routes require a parameter route descriptor')\n }\n assertWritableEmitter(binding.valueEmitter, 'Value route emitter')\n if (binding.resolve != null && typeof binding.resolve !== 'function') {\n throw new TypeError('Value route resolver must be a function')\n }\n const scope = this.scope(parent)\n if (scope.entries.has(binding.route)) {\n throw new Error(`Duplicate route in one scope: ${binding.route.id}`)\n }\n const contextFor = (value: TValue) => this.parameterContext(parent, binding.route, value)\n const unsubscribe = binding.valueEmitter.subscribe(() => this.scheduleStateSync(), {\n emitCurrent: false,\n })\n const entry: RouteEntry = {\n owner,\n descriptor: binding.route,\n parent,\n match: (segment) => {\n const decoded = decodeSegment(segment)\n const value = binding.route.codec.parse(decoded)\n const formatted = binding.route.codec.format(value)\n if (formatted !== decoded) {\n throw new TypeError(\n `Route parameter \"${binding.route.name}\" does not round-trip`,\n )\n }\n return {value}\n },\n currentValue: () => binding.valueEmitter.get(),\n activate: async (match, context, signal) => {\n const parsed = match.value as TValue\n const resolved = binding.resolve == null\n ? parsed\n : await binding.resolve(parsed, context, signal)\n if (resolved instanceof RouteRedirect) return resolved\n if (signal.aborted) throw signal.reason\n this.withApplication(() => binding.valueEmitter.set(\n resolved,\n 'route value restored',\n ))\n return {value: resolved}\n },\n context: (value) => contextFor(value as TValue),\n disposeSubscription: unsubscribe,\n }\n scope.entries.set(binding.route, entry)\n this.wakeRegistry()\n let active = true\n return {\n context: contextForCurrent(binding.valueEmitter, contextFor, parent),\n contextFor,\n dispose: () => {\n if (!active) return\n active = false\n const current = scope.entries.get(binding.route)\n if (current === entry) scope.entries.delete(binding.route)\n unsubscribe()\n this.wakeRegistry()\n },\n }\n }\n\n registerQuery<TValue>(\n context: ResolvedRoute,\n owner: object,\n binding: RouteQueryBinding<TValue>,\n ): () => void {\n this.assertActive()\n assertResolvedRoute(context, this)\n assertOwner(owner)\n const name = queryName(binding.name)\n assertWritableEmitter(binding.valueEmitter, 'Route query emitter')\n assertRouteQueryCodec(binding.codec)\n const equals = binding.equals ?? Object.is\n if (typeof equals !== 'function') throw new TypeError('Route query equals must be a function')\n const scope = this.scope(context)\n if (scope.queries.has(name)) throw new Error(`Duplicate route query name: ${name}`)\n this.knownQueryNames.add(name)\n const unsubscribe = binding.valueEmitter.subscribe(() => this.scheduleStateSync(), {\n emitCurrent: false,\n })\n const entry: QueryEntry<TValue> = {\n owner,\n context,\n name,\n emitter: binding.valueEmitter,\n codec: binding.codec,\n defaultValue: binding.defaultValue,\n equals,\n disposeSubscription: unsubscribe,\n }\n scope.queries.set(name, entry as QueryEntry<unknown>)\n this.applyQueryEntry(entry, this.requested)\n this.wakeRegistry()\n let active = true\n return () => {\n if (!active) return\n active = false\n if (scope.queries.get(name) === entry) scope.queries.delete(name)\n unsubscribe()\n this.scheduleStateSync()\n }\n }\n\n navigate(\n target: RouteTarget | ResolvedRoute,\n options: {history?: NavigationHistoryMode} = {},\n ): Promise<void> {\n this.assertActive()\n const location = isResolvedRoute(target)\n ? this.formatContext(target)\n : formatRouteTarget(assertedTarget(target))\n this.issueEmitter.set(null, 'explicit route navigation')\n if ((options.history ?? 'push') === 'replace') this.adapter.replace(location)\n else this.adapter.push(location)\n return this.startTransition(location, 0, true)\n }\n\n redirect(target: RouteTarget | ResolvedRoute): Promise<void> {\n return this.navigate(target, {history: 'replace'})\n }\n\n href(target: RouteTarget | ResolvedRoute): string {\n this.assertActive()\n const location = isResolvedRoute(target)\n ? this.formatContext(target)\n : formatRouteTarget(assertedTarget(target))\n return this.adapter.href(location)\n }\n\n resolve(route: RouteDescriptor, from: ResolvedRoute): ResolvedRoute {\n assertRouteDescriptor(route)\n assertResolvedRoute(from, this)\n let context: ResolvedRoute | null = from\n while (context != null) {\n const entry = this.scopes.get(context)?.entries.get(route)\n if (entry != null) {\n const value = entry.currentValue()\n if (entry.descriptor.kind === 'parameter' && value == null) {\n throw new Error(\n `Dynamic route \"${route.id}\" requires an explicit parameter value`,\n )\n }\n return entry.context(value)\n }\n context = context.parent\n }\n throw new Error(`Route \"${route.id}\" is not registered in the current route lineage`)\n }\n\n formatActiveLocation(): string {\n return this.formatStateLocation()\n }\n\n isActive(target: RouteTarget | ResolvedRoute, exact = false): boolean {\n const context = isResolvedRoute(target)\n ? target\n : this.resolveTargetContext(assertedTarget(target))\n return exact ? context === this.activeContext : isAncestor(context, this.activeContext)\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.controller?.abort(new DOMException('Router disposed', 'AbortError'))\n this.controller = null\n this.adapterUnsubscribe()\n for (const scope of this.scopes.values()) {\n const subscriptions = new Set<() => void>()\n for (const entry of scope.entries.values()) subscriptions.add(entry.disposeSubscription)\n for (const entry of scope.queries.values()) subscriptions.add(entry.disposeSubscription)\n for (const unsubscribe of subscriptions) unsubscribe()\n }\n this.scopes.clear()\n this.knownQueryNames.clear()\n this.wakeRegistry()\n this.transitionEmitter.dispose()\n this.issueEmitter.dispose()\n }\n\n private startTransition(\n location: string,\n redirectDepth: number,\n clearIssue: boolean,\n ): Promise<void> {\n this.assertActive()\n this.controller?.abort(new DOMException('Navigation superseded', 'AbortError'))\n const controller = new AbortController()\n this.controller = controller\n this.requested = parseLocation(location)\n if (clearIssue) this.issueEmitter.set(null, 'route transition started')\n this.transitionEmitter.set(Object.freeze({\n state: 'pending',\n requestedLocation: this.requested.location,\n settledLocation: this.formatContext(this.activeContext),\n }), 'route transition started')\n return this.runTransition(this.requested, controller, redirectDepth).catch((error) => {\n if (!controller.signal.aborted) throw error\n })\n }\n\n private async runTransition(\n requested: ParsedLocation,\n controller: AbortController,\n redirectDepth: number,\n ): Promise<void> {\n const signal = controller.signal\n let context = this.root\n const values = new Map<AnyRouteDescriptor, unknown>()\n\n for (const segment of requested.segments) {\n const scope = await this.waitForCompleteScope(context, signal)\n let match: {entry: RouteEntry; match: MatchResult} | null\n try {\n match = matchEntry(scope, segment)\n } catch (error) {\n this.fallback(requested, context, null, routeErrorMessage(error))\n return\n }\n if (match == null) {\n this.fallback(requested, context, null, `Unknown route segment \"${decodeSegment(segment)}\"`)\n return\n }\n const resolveContext: RouteResolveContext = Object.freeze({\n requestedLocation: requested.location,\n resolvedValues: values,\n })\n try {\n const result = await match.entry.activate(match.match, resolveContext, signal)\n if (result instanceof RouteRedirect) {\n if (redirectDepth >= MAX_REDIRECTS) {\n this.fallback(requested, context, match.entry.descriptor, 'Too many route redirects')\n return\n }\n const target = formatRouteTarget(result.target)\n this.adapter.replace(target)\n await this.startTransition(target, redirectDepth + 1, false)\n return\n }\n match = {entry: match.entry, match: result}\n } catch (error) {\n if (signal.aborted) return\n this.fallback(\n requested,\n context,\n match.entry.descriptor,\n routeErrorMessage(error),\n )\n return\n }\n values.set(match.entry.descriptor, match.match.value)\n context = match.entry.context(match.match.value)\n }\n\n if (signal.aborted) return\n if (context === this.root) {\n await this.waitForCompleteScope(this.root, signal)\n context = this.findActiveContext()\n }\n if (signal.aborted) return\n this.activeContext = context\n this.applyQueriesInLineage(context, requested)\n const settled = this.formatContext(context)\n if (settled !== requested.location) this.adapter.replace(settled)\n this.transitionEmitter.set(Object.freeze({\n state: 'idle',\n requestedLocation: requested.location,\n settledLocation: settled,\n }), 'route transition settled')\n this.scheduleStateSync()\n }\n\n private async waitForCompleteScope(\n context: ResolvedRoute,\n signal: AbortSignal,\n ): Promise<ScopeRecord> {\n while (true) {\n if (signal.aborted) throw signal.reason\n const scope = this.scopes.get(context)\n if (scope != null && isScopeComplete(scope)) return scope\n await this.waitForRegistryChange(signal)\n }\n }\n\n private waitForRegistryChange(signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const wake = () => {\n signal.removeEventListener('abort', abort)\n this.registryWaiters.delete(wake)\n resolve()\n }\n const abort = () => {\n this.registryWaiters.delete(wake)\n reject(signal.reason)\n }\n this.registryWaiters.add(wake)\n signal.addEventListener('abort', abort, {once: true})\n })\n }\n\n private wakeRegistry(): void {\n const waiters = [...this.registryWaiters]\n this.registryWaiters.clear()\n for (const wake of waiters) wake()\n }\n\n private fallback(\n requested: ParsedLocation,\n context: ResolvedRoute,\n failedRoute: AnyRouteDescriptor | null,\n reason: string,\n ): void {\n this.activeContext = context\n const fallbackLocation = context === this.root\n ? this.formatStateLocation()\n : this.formatContext(context)\n this.adapter.replace(fallbackLocation)\n this.issueEmitter.set(Object.freeze({\n requestedLocation: requested.location,\n failedRouteId: failedRoute?.id ?? null,\n reason,\n fallbackLocation,\n }), 'route fallback selected')\n this.transitionEmitter.set(Object.freeze({\n state: 'idle',\n requestedLocation: requested.location,\n settledLocation: fallbackLocation,\n }), 'route transition fell back')\n }\n\n private literalContext(\n parent: ResolvedRoute,\n route: LiteralRouteDescriptor,\n ): ResolvedRoute {\n return this.cachedContext(parent, route, route.path, null)\n }\n\n private resolveTargetContext(target: RouteTarget): ResolvedRoute {\n let context = this.root\n for (const part of target.routes) {\n if ('route' in part) {\n context = this.parameterContext(context, part.route, part.value)\n } else {\n context = this.literalContext(context, part)\n }\n }\n return context\n }\n\n private parameterContext<TValue>(\n parent: ResolvedRoute,\n route: ParameterRouteDescriptor<TValue>,\n value: TValue,\n ): ResolvedRoute {\n const formatted = route.codec.format(value)\n if (typeof formatted !== 'string' || formatted === '' || formatted.includes('/')) {\n throw new TypeError(`Route parameter \"${route.name}\" must format one path segment`)\n }\n return this.cachedContext(parent, route, formatted, value)\n }\n\n private cachedContext(\n parent: ResolvedRoute,\n route: AnyRouteDescriptor,\n segment: string,\n value: unknown,\n ): ResolvedRoute {\n const pathname = joinPath(parent.pathname, segment)\n const key = `${contextKey(parent)}\\u0000${route.id}\\u0000${segment}`\n const existing = this.contextCache.get(key)\n if (existing != null) return existing\n const context: ResolvedRoute = Object.freeze({route, parent, segment, value, pathname})\n resolvedRouteOwners.set(context, this)\n this.contextCache.set(key, context)\n return context\n }\n\n private scope(context: ResolvedRoute): ScopeRecord {\n let scope = this.scopes.get(context)\n if (scope == null) {\n scope = {owners: new Map(), entries: new Map(), queries: new Map()}\n this.scopes.set(context, scope)\n }\n return scope\n }\n\n private removeOwnerEntries(scope: ScopeRecord, owner: object): void {\n const subscriptions = new Set<() => void>()\n for (const [route, entry] of scope.entries) {\n if (entry.owner !== owner) continue\n subscriptions.add(entry.disposeSubscription)\n scope.entries.delete(route)\n }\n for (const unsubscribe of subscriptions) unsubscribe()\n }\n\n private removeOwnerQueries(scope: ScopeRecord, owner: object): void {\n for (const [name, entry] of scope.queries) {\n if (entry.owner !== owner) continue\n entry.disposeSubscription()\n scope.queries.delete(name)\n }\n }\n\n private scheduleStateSync(): void {\n if (this.applying > 0 || this.disposed || this.syncQueued) return\n this.syncQueued = true\n queueMicrotask(() => {\n this.syncQueued = false\n if (this.applying > 0 || this.disposed) return\n if (this.transitionEmitter.get().state === 'pending') return\n const location = this.formatStateLocation()\n if (location !== this.adapter.read()) this.adapter.replace(location)\n this.requested = parseLocation(location)\n this.activeContext = this.findActiveContext()\n this.transitionEmitter.set(Object.freeze({\n ...this.transitionEmitter.get(),\n state: 'idle',\n settledLocation: location,\n }), 'route state synchronized')\n })\n }\n\n private formatStateLocation(): string {\n return this.formatContext(this.findActiveContext())\n }\n\n private findActiveContext(): ResolvedRoute {\n let context = this.root\n const visited = new Set<ResolvedRoute>()\n while (!visited.has(context)) {\n visited.add(context)\n const scope = this.scopes.get(context)\n if (scope == null) break\n const active = [...scope.entries.values()].filter((entry) =>\n entry.currentValue() !== undefined && entry.currentValue() !== null)\n const nullableLiteral = [...scope.entries.values()].find((entry) =>\n entry.descriptor.kind === 'literal' && entry.currentValue() === null)\n const entry = active[0] ?? nullableLiteral\n if (entry == null) break\n const value = entry.currentValue()\n context = entry.context(value)\n }\n return context\n }\n\n private formatContext(context: ResolvedRoute): string {\n const search = new URLSearchParams(this.requested.search)\n for (const name of this.knownQueryNames) search.delete(name)\n for (const lineageContext of routeLineage(context)) {\n const scope = this.scopes.get(lineageContext)\n if (scope == null) continue\n for (const entry of [...scope.queries.values()].sort((left, right) =>\n left.name.localeCompare(right.name))) {\n if (entry.equals(entry.emitter.get(), entry.defaultValue)) continue\n const values = entry.codec.format(entry.emitter.get())\n if (!Array.isArray(values)) {\n throw new TypeError(`Route query \"${entry.name}\" codec must format an array`)\n }\n for (const value of values) search.append(entry.name, value)\n }\n }\n search.sort()\n const query = search.toString()\n return `${context.pathname}${query === '' ? '' : `?${query}`}`\n }\n\n private applyQueriesInLineage(context: ResolvedRoute, requested: ParsedLocation): void {\n for (const lineageContext of routeLineage(context)) {\n const scope = this.scopes.get(lineageContext)\n if (scope == null) continue\n for (const entry of scope.queries.values()) this.applyQueryEntry(entry, requested)\n }\n }\n\n private applyQueryEntry<TValue>(entry: QueryEntry<TValue>, requested: ParsedLocation): void {\n if (!isAncestor(entry.context, this.activeContext)\n && !isPathPrefix(entry.context.pathname, requested.pathname)) return\n const raw = requested.search.getAll(entry.name)\n try {\n const value = raw.length === 0 ? entry.defaultValue : entry.codec.parse(raw)\n if (!entry.equals(entry.emitter.get(), value)) {\n this.withApplication(() => entry.emitter.set(value, 'route query restored'))\n }\n } catch (error) {\n if (!entry.equals(entry.emitter.get(), entry.defaultValue)) {\n this.withApplication(() => entry.emitter.set(\n entry.defaultValue,\n 'invalid route query defaulted',\n ))\n }\n const search = new URLSearchParams(requested.search)\n search.delete(entry.name)\n search.sort()\n const fallbackLocation = `${requested.pathname}${search.size === 0\n ? ''\n : `?${search.toString()}`}`\n this.adapter.replace(fallbackLocation)\n this.issueEmitter.set(Object.freeze({\n requestedLocation: requested.location,\n failedRouteId: entry.context.route?.id ?? null,\n reason: routeErrorMessage(error),\n fallbackLocation,\n }), 'invalid route query')\n }\n }\n\n private withApplication(action: () => void): void {\n this.applying += 1\n try {\n action()\n } finally {\n this.applying -= 1\n }\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('BrowserRouter has been disposed')\n }\n}\n\nconst resolvedRouteOwners = new WeakMap<object, BrowserRouter>()\n\nexport function createBrowserRouter(options: BrowserRouterOptions): BrowserRouter {\n if (options == null || typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('Browser router options must be an object')\n }\n return new BrowserRouter(options.adapter)\n}\n\nexport function waitForRouteValue<TValue, TError>(\n emitter: ReadableEmitter<TValue, TError>,\n accept: (value: TValue) => boolean,\n signal: AbortSignal,\n): Promise<TValue> {\n if (emitter == null || typeof emitter.subscribe !== 'function') {\n throw new TypeError('waitForRouteValue requires a readable emitter')\n }\n if (typeof accept !== 'function') {\n throw new TypeError('waitForRouteValue requires an acceptance predicate')\n }\n return new Promise((resolve, reject) => {\n let settled = false\n let unsubscribe = () => {}\n const finish = (action: () => void) => {\n if (settled) return\n settled = true\n unsubscribe()\n signal.removeEventListener('abort', abort)\n action()\n }\n const abort = () => {\n finish(() => reject(signal.reason))\n }\n const inspect = (value: TValue, fetchState: string, error: TError | null) => {\n if (fetchState === 'error') {\n finish(() => reject(\n error ?? new RouteUnavailableError('Route prerequisite failed'),\n ))\n } else if (accept(value)) {\n finish(() => resolve(value))\n }\n }\n if (signal.aborted) {\n abort()\n return\n }\n inspect(emitter.get(), emitter.getFetchState(), emitter.getError())\n if (settled) return\n unsubscribe = emitter.subscribe(({value, fetchState, error}) => {\n inspect(value, fetchState, error)\n }, {emitCurrent: false})\n if (settled) unsubscribe()\n else signal.addEventListener('abort', abort, {once: true})\n })\n}\n\nfunction parseLocation(location: string): ParsedLocation {\n const normalized = normalizeRouteLocation(location)\n const queryIndex = normalized.indexOf('?')\n const pathname = queryIndex < 0 ? normalized : normalized.slice(0, queryIndex)\n const query = queryIndex < 0 ? '' : normalized.slice(queryIndex + 1)\n const rawSegments = pathname.split('/').filter(Boolean)\n return Object.freeze({\n location: normalized,\n pathname,\n segments: Object.freeze(rawSegments),\n search: new URLSearchParams(query),\n })\n}\n\nfunction validateScope(scope: ScopeRecord): void {\n const ids = new Set<string>()\n const literalPaths = new Set<string>()\n let parameter: AnyRouteDescriptor | null = null\n for (const entry of scope.entries.values()) {\n if (ids.has(entry.descriptor.id)) {\n throw new Error(`Duplicate route id in one scope: ${entry.descriptor.id}`)\n }\n ids.add(entry.descriptor.id)\n if (entry.descriptor.kind === 'literal') {\n if (literalPaths.has(entry.descriptor.path)) {\n throw new Error(`Duplicate route path in one scope: ${entry.descriptor.path}`)\n }\n literalPaths.add(entry.descriptor.path)\n } else if (parameter != null) {\n throw new Error(\n `Ambiguous parameter routes in one scope: ${parameter.id}, ${entry.descriptor.id}`,\n )\n } else {\n parameter = entry.descriptor\n }\n }\n}\n\nfunction matchEntry(\n scope: ScopeRecord,\n segment: string,\n): {entry: RouteEntry; match: MatchResult} | null {\n const entries = [...scope.entries.values()].sort((left, right) =>\n left.descriptor.kind === right.descriptor.kind\n ? 0\n : left.descriptor.kind === 'literal' ? -1 : 1)\n for (const entry of entries) {\n const match = entry.match(segment)\n if (match != null) return {entry, match}\n }\n return null\n}\n\nfunction isScopeComplete(scope: ScopeRecord): boolean {\n return scope.owners.size > 0\n && [...scope.owners.values()].every(({complete}) => complete)\n}\n\nfunction routeLineage(context: ResolvedRoute): ResolvedRoute[] {\n const result: ResolvedRoute[] = []\n let current: ResolvedRoute | null = context\n while (current != null) {\n result.unshift(current)\n current = current.parent\n }\n return result\n}\n\nfunction isAncestor(ancestor: ResolvedRoute, context: ResolvedRoute): boolean {\n let current: ResolvedRoute | null = context\n while (current != null) {\n if (current === ancestor) return true\n current = current.parent\n }\n return false\n}\n\nfunction isPathPrefix(parent: string, path: string): boolean {\n return parent === '/' || path === parent || path.startsWith(`${parent}/`)\n}\n\nfunction joinPath(parent: string, segment: string): string {\n return `${parent === '/' ? '' : parent}/${encodeURIComponent(segment)}`\n}\n\nfunction contextKey(context: ResolvedRoute): string {\n return context.pathname\n}\n\nfunction decodeSegment(segment: string): string {\n try {\n return decodeURIComponent(segment)\n } catch {\n throw new RouteUnavailableError('Route contains malformed percent encoding')\n }\n}\n\nfunction queryName(value: unknown): string {\n if (typeof value !== 'string' || !/^[A-Za-z][A-Za-z0-9_.-]*$/.test(value)) {\n throw new TypeError('Route query name must start with a letter and use URL-safe characters')\n }\n return value\n}\n\nfunction routeErrorMessage(error: unknown): string {\n return error instanceof Error && error.message !== ''\n ? error.message\n : 'The requested route could not be resolved'\n}\n\nfunction contextForCurrent<TValue>(\n emitter: WritableEmitter<TValue | null>,\n contextFor: (value: TValue) => ResolvedRoute,\n parent: ResolvedRoute,\n): ResolvedRoute {\n const current = emitter.get()\n return current == null ? parent : contextFor(current)\n}\n\nfunction assertedTarget(target: RouteTarget): RouteTarget {\n assertRouteTarget(target)\n return target\n}\n\nfunction isResolvedRoute(value: unknown): value is ResolvedRoute {\n return value != null && typeof value === 'object' && resolvedRouteOwners.has(value)\n}\n\nfunction assertResolvedRoute(\n value: unknown,\n router: BrowserRouter,\n): asserts value is ResolvedRoute {\n if (value === router.root) return\n if (!isResolvedRoute(value) || resolvedRouteOwners.get(value) !== router) {\n throw new TypeError('Resolved route does not belong to this router')\n }\n}\n\nfunction assertNavigationAdapter(value: unknown): asserts value is NavigationAdapter {\n if (value == null\n || typeof value !== 'object'\n || typeof Reflect.get(value, 'read') !== 'function'\n || typeof Reflect.get(value, 'href') !== 'function'\n || typeof Reflect.get(value, 'push') !== 'function'\n || typeof Reflect.get(value, 'replace') !== 'function'\n || typeof Reflect.get(value, 'subscribe') !== 'function') {\n throw new TypeError('BrowserRouter requires a navigation adapter')\n }\n}\n\nfunction assertOwner(value: unknown): asserts value is object {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {\n throw new TypeError('Route registration owner must be an object')\n }\n}\n\nfunction assertWritableEmitter(value: unknown, label: string): void {\n if (value == null\n || typeof value !== 'object'\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(`${label} must be a writable emitter`)\n }\n}\n","import {Component, css} from '../Components/component.js'\nimport type {FrayChild, Key} from '../Components/component.js'\nimport {componentClass, controlId, createValueEmitter} from '../Components/controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../Components/controlUtils.js'\nimport {\n RoutedSelectionController,\n readContentMountPolicy,\n} from '../Components/layout/routedSelection.js'\nimport type {\n ContentMountPolicy,\n RoutedSelectionItem,\n} from '../Components/layout/routedSelection.js'\nimport {RouteScope} from './RouteScope.js'\nimport type {LiteralRouteDescriptor} from './route.js'\n\nexport interface RouteOutletDefinition {\n id: Key\n route: LiteralRouteDescriptor\n disabled?: boolean\n content?: FrayChild\n component?: FrayChild\n}\n\nexport interface RouteOutletProps extends ValueControlProps<Key | null> {\n id?: string | number | null\n views: readonly RouteOutletDefinition[]\n activeViewEmitter?: ValueEmitter<Key | null>\n initialActiveViewId?: Key | null\n /** Controls when routed content is mounted and whether inactive content is retained. */\n mountPolicy?: ContentMountPolicy\n}\n\ninterface NormalizedRouteView extends RoutedSelectionItem {\n route: LiteralRouteDescriptor\n content: FrayChild\n}\n\n/** Demand-driven non-tab routed content with application-owned selection state. */\nexport class RouteOutlet extends Component<RouteOutletProps> {\n static override liveProps: readonly string[] = []\n readonly valueEmitter: ValueEmitter<Key | null>\n readonly activeViewEmitter: ValueEmitter<Key | null>\n readonly outletId: string\n private readonly selection: RoutedSelectionController<NormalizedRouteView>\n\n constructor(props: RouteOutletProps) {\n super(props)\n const views = normalizeViews(props.views)\n const emitterProps: RouteOutletProps = {...props}\n if (emitterProps.valueEmitter == null && props.activeViewEmitter != null) {\n emitterProps.valueEmitter = props.activeViewEmitter\n }\n if (emitterProps.defaultValue == null && props.initialActiveViewId != null) {\n emitterProps.defaultValue = props.initialActiveViewId\n }\n this.valueEmitter = createValueEmitter<Key | null>(\n this,\n emitterProps,\n views.find((view) => !view.disabled)?.id ?? null,\n 'active route view',\n )\n this.activeViewEmitter = this.valueEmitter\n this.outletId = controlId('route-outlet', props.id)\n this.selection = new RoutedSelectionController(this, this.valueEmitter, {\n subject: 'outlet views',\n restoredCause: 'route view restored',\n pendingCause: 'pending route view selected',\n selectedCause: 'route view selected',\n })\n }\n\n initialize(): void {\n const views = normalizeViews(this.props.views)\n readContentMountPolicy(this.props.mountPolicy, 'RouteOutlet')\n this.selection.prepare(views)\n this.watch(this.valueEmitter)\n }\n\n setProps(nextProps: RouteOutletProps): this {\n readContentMountPolicy(nextProps.mountPolicy, 'RouteOutlet')\n super.setProps(nextProps)\n this.selection.prepare(normalizeViews(nextProps.views))\n this.update()\n return this\n }\n\n render(): FrayChild {\n const views = normalizeViews(this.props.views)\n const policy = readContentMountPolicy(this.props.mountPolicy, 'RouteOutlet')\n const selected = this.selection.selected(views)\n const mountedIds = this.selection.updateMounted(views, policy)\n const Host = this.Host\n return <Host\n id={this.outletId}\n className={componentClass(this.props) || null}\n >{views.map((view) => {\n const active = selected != null && Object.is(selected.id, view.id)\n return <div\n key={String(view.id)}\n hidden={!active}\n >{mountedIds.has(view.id)\n ? this.selection.scopedContent(view, view.content)\n : null}</div>\n })}</Host>\n }\n\n override onDestroy(): void {\n this.selection.dispose()\n }\n\n static dependencies = [RouteScope]\n static override hostName = 'route-outlet'\n\n static override css = css`\n & {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n\n & > div {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n & > div[hidden] {\n display: none;\n }\n `\n}\n\nfunction normalizeViews(views: unknown): NormalizedRouteView[] {\n if (!Array.isArray(views)) throw new TypeError('RouteOutlet views must be an array')\n const ids = new Set<Key>()\n const routes = new Set<LiteralRouteDescriptor>()\n return views.map((view: RouteOutletDefinition) => {\n if (view == null || view.id == null) throw new TypeError('Each route view requires an id')\n if (view.route == null || view.route.kind !== 'literal') {\n throw new TypeError('Each route view requires a literal route descriptor')\n }\n if (ids.has(view.id)) throw new Error(`Duplicate route view id: ${String(view.id)}`)\n if (routes.has(view.route)) throw new Error(`Duplicate outlet route: ${view.route.id}`)\n ids.add(view.id)\n routes.add(view.route)\n return {\n id: view.id,\n route: view.route,\n disabled: Boolean(view.disabled),\n content: view.content ?? view.component ?? [],\n }\n })\n}\n","import {Component, Fragment, h} from '../Components/component.js'\nimport type {ComponentProps, FrayChild, WritableEmitter} from '../Components/component.js'\nimport type {RouteQueryCodec} from './route.js'\n\nexport interface RouteQueryProps<TValue> extends ComponentProps {\n name: string\n valueEmitter: WritableEmitter<TValue>\n codec: RouteQueryCodec<TValue>\n defaultValue: TValue\n equals?: (left: TValue, right: TValue) => boolean\n}\n\n/** Synchronize one explicitly declared application value with a URL query key. */\nexport class RouteQuery<TValue> extends Component<RouteQueryProps<TValue>> {\n static override liveProps: readonly string[] = []\n private unregister: (() => void) | null = null\n\n initialize(): void {\n const router = this._runtime.router\n if (router == null || this._routeContext == null) {\n throw new Error('RouteQuery requires a router and contextual route scope')\n }\n this.unregister = router.registerQuery(this._routeContext, this, {\n name: this.props.name,\n valueEmitter: this.props.valueEmitter,\n codec: this.props.codec,\n defaultValue: this.props.defaultValue,\n ...(this.props.equals == null ? {} : {equals: this.props.equals}),\n })\n }\n\n render(): FrayChild {\n return h(Fragment, null, this.props.children ?? [])\n }\n\n override onDestroy(): void {\n this.unregister?.()\n this.unregister = null\n }\n}\n","import {Component, Fragment, h} from '../Components/component.js'\nimport type {\n ComponentProps,\n FrayChild,\n WritableEmitter,\n} from '../Components/component.js'\nimport {RouteScope} from './RouteScope.js'\nimport type {\n ParameterRouteDescriptor,\n RouteValueResolver,\n} from './route.js'\nimport type {ResolvedRoute, RouteRegistration} from './router.js'\n\nexport interface RouteValueProps<TValue> extends ComponentProps {\n route: ParameterRouteDescriptor<TValue>\n valueEmitter: WritableEmitter<TValue | null>\n resolve?: RouteValueResolver<TValue>\n /** Make the active dynamic value the parent context for nested routes. */\n scopeChildren?: boolean\n}\n\n/** Bind one dynamic child path segment to an application-owned value. */\nexport class RouteValue<TValue> extends Component<RouteValueProps<TValue>> {\n static override liveProps: readonly string[] = []\n private registration: (RouteRegistration & {\n contextFor(value: TValue): ResolvedRoute\n }) | null = null\n\n initialize(): void {\n const router = this._runtime.router\n if (router == null || this._routeContext == null) {\n throw new Error('RouteValue requires a router and contextual route scope')\n }\n this.registration = router.registerValueRoute(this._routeContext, this, {\n route: this.props.route,\n valueEmitter: this.props.valueEmitter,\n ...(this.props.resolve == null ? {} : {resolve: this.props.resolve}),\n })\n this.watch(this.props.valueEmitter)\n }\n\n render(): FrayChild {\n const value = this.props.valueEmitter.get()\n const children = this.props.children ?? []\n if (!this.props.scopeChildren || value == null || this.registration == null) {\n return h(Fragment, null, children)\n }\n return h(RouteScope, {\n key: this.registration.contextFor(value).pathname,\n context: this.registration.contextFor(value),\n children,\n })\n }\n\n override onDestroy(): void {\n this.registration?.dispose()\n this.registration = null\n }\n}\n"],"names":["Tab","Component","__publicField","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","tabs","validateTabs","emitterProps","_a","tab","event","label","baseId","activeTabId","Host","jsx","index","tabButtonId","tabPanelId","enabled","tabIndex","current","next","css","id","safeId","ids","RouteScope","router","h","Fragment","RoutedSelectionController","owner","valueEmitter","items","requested","item","policy","availableIds","selectedId","context","content","parent","routed","listener","transition","requestedPathname","readContentMountPolicy","componentName","TabPanel","extractTabs","nextProps","mountPolicy","mountedTabIds","jsxs","disabled","selected","_event","direct","declarative","child","isVNode","tabProps","routeDescriptors","routeTargets","RouteRedirect","target","assertRouteTarget","RouteUnavailableError","message","stringRouteCodec","stringRouteQueryCodec","booleanRouteQueryCodec","defineRoute","path","normalizedId","routeName","normalizedPath","routeSegment","descriptor","defineRouteParameter","codec","normalizedName","assertRouteCodec","routeParameter","route","assertRouteDescriptor","formatted","assertFormattedSegment","routeTarget","routes","part","isRouteParameterValue","withRouteQuery","query","redirectTo","isRouteDescriptor","isRouteTarget","assertRouteQueryCodec","formatRouteTarget","segments","search","raw","left","right","RouteLink","_to","exact","children","onClick","anchorProps","shouldHandleClick","download","NavigationBar","validateNavigation","FrayApp","before","targetDocument","parentDocument","dependency","_children","_key","classAlias","className","_island","sizing","landmark","hostProps","rootClassName","mergeClassNames","sizingClassName","landmarkRole","mountFrayApp","runtime","appType","FrayRuntime","caller","merged","Header","level","Heading","GroupPanel","header","OptionGroup","ariaLabel","headerEnd","required","error","OptionsPanel","panelLiveProps","Panel","toolbar","orientation","title","Sidebar","SplitView","primary","secondary","direction","primarySize","primaryLabel","secondaryLabel","DescriptionItem","term","DescriptionList","Placeholder","width","normalizeWidth","numeric","matchesFilterState","state","dimensions","assertDefinitions","dimension","optionState","active","option","preferred","filterByState","deriveFilterPredicate","DerivedEmitter","deriveFilteredItems","currentItems","currentState","serializeFilterState","assertFilterState","dimensionKey","optionKey","parseFilterState","isRecord","rawOptions","assertKey","dimensionKeys","optionKeys","BaseSelectionHandler","getItems","getKey","defaultItemKey","selectedItemsEmitter","rows","row","clampIndex","onKeyDown","onMouseDown","onMouseEnter","ownerDocument","onMouseUp","lastIndex","nextIndex","_startIndex","_endIndex","_index","cause","selectedKeys","cleanup","suppressClick","SingleSelectionHandler","config","owned","selectedItemEmitter","SingleSelectionArrayView","MultiSelectionHandler","first","last","range","isCommandPressed","mergeByKey","key","candidate","candidateIndex","startIndex","endIndex","createSelectionHandler","source","eventOrCause","notification","length","result","keys","ListView","isReadableEmitter","normalizeKeyGetter","status","isLoading","FetchState","errorMessage","_","defaultItemLabel","dom","itemKey","isRenderablePrimitive","CheckableControl","checkboxLiveProps","Checkbox","componentType","validateSymbols","currentIndex","nextValue","semanticState","semanticIndex","symbol","shellSymbol","stateName","checked","isCheckedSemanticState","symbols","tuple","FilterPanel","isEmitterLike","fetchState","_b","_c","filters","normalizeFilters","filterModes","defaultSemanticState","activeValues","optionValue","hostClass","optionLabel","FilterModeCheckbox","nextState","_dom","emitter","existing","isFrayLabel","TableHeaderCell","currentSort","isFilterSelectionEntry","filterLabel","panel","entry","TableHeader","column","DefaultTableFilterEncoding","serializeTableQuery","url","sort","assertUrlLike","assertSort","field","entries","applyLocalTableState","filtered","matchesFilters","compareValues","readField","isSortDirection","searchParams","createLocalTableDataSource","createState","ownedData","data","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","sourceError","expanded","visible","flattenVisible","depth","position","setSize","hasChildren","isExpanded","isSelected","labelClassName","_e","labelStyle","_g","_f","isExpanderTarget","allKeys","flattenAll","retained","sameKeys","contains","matches","match","textValue","parentId","buttonLiveProps","Button","type","pressed","busy","busyLabel","normalContent","unavailable","dialogLiveProps","Dialog","description","actions","closeLabel","showCloseButton","element","dialog","shouldOpen","showModal","focusInitial","restore","ref","_QuadCheckbox","QuadCheckbox","_TriCheckbox","TriCheckbox","LabeledInputControl","SelectControl","dropdownLiveProps","Dropdown","suppliedOptions","firstValue","placeholder","onChange","currentValue","eventValue","labelLiveProps","Label","text","htmlFor","radioButtonLiveProps","radioGroupLiveProps","RadioButton","RadioGroup","validateRadioOptions","selectedValue","textboxLiveProps","Textbox","readOnly","autoComplete","inputMode","minLength","maxLength","pattern","inputRef","onInput","toggleLiveProps","Toggle","validateToggleOptions","selectedIndex","radio","Toolbar","ProgressBar","max","sourceValue","percentage","valueText","frayThemeVariableCatalog","paletteRamp","variable","frayThemeOptions","themeOption","distributedAssetUrl","frayColorOptions","replaceFrayStylesheet","kind","selection","assertOption","selector","link","setFrayAppearance","appearance","getFrayAppearance","findFrayStylesheetOption","layer","family","stop","href","packageRelativePath","stylesheetPickerLiveProps","StylesheetPicker","defaults","validateOptions","ThemePicker","ColorPicker","MemoryNavigationAdapter","initialLocation","normalizeRouteLocation","location","createHistoryNavigation","assertBrowserTarget","basePath","normalizeBasePath","pathname","relative","normalized","createHashNavigation","notify","hashIndex","withoutHash","queryIndex","rawPath","MAX_REDIRECTS","BrowserRouter","adapter","assertNavigationAdapter","resolvedRouteOwners","parseLocation","initialTransition","assertResolvedRoute","assertOwner","scope","scopeOwner","validateScope","bindings","subscribe","contexts","descriptors","binding","segment","decodeSegment","_context","signal","unsubscribe","assertWritableEmitter","contextFor","decoded","parsed","resolved","contextForCurrent","queryName","equals","isResolvedRoute","assertedTarget","from","isAncestor","subscriptions","redirectDepth","clearIssue","controller","matchEntry","routeErrorMessage","resolveContext","settled","isScopeComplete","resolve","reject","wake","abort","waiters","failedRoute","reason","fallbackLocation","joinPath","contextKey","visited","nullableLiteral","lineageContext","routeLineage","isPathPrefix","action","createBrowserRouter","waitForRouteValue","accept","finish","inspect","rawSegments","literalPaths","parameter","complete","ancestor","RouteOutlet","views","normalizeViews","view","mountedIds","RouteQuery","RouteValue"],"mappings":"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"}
|