@capillaryjs/capillary-ui 1.0.0-alpha.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/README.md +88 -18
- package/dist/Components/Placeholder.d.ts.map +1 -1
- package/dist/Components/component.d.ts +6 -0
- package/dist/Components/component.d.ts.map +1 -1
- package/dist/Components/data/listview/listview.d.ts +4 -3
- package/dist/Components/data/listview/listview.d.ts.map +1 -1
- package/dist/Components/data/selectionhandler.d.ts +1 -0
- package/dist/Components/data/selectionhandler.d.ts.map +1 -1
- package/dist/Components/data/table/DataTable.d.ts +1 -0
- package/dist/Components/data/table/DataTable.d.ts.map +1 -1
- package/dist/Components/data/table/TableHeader.d.ts.map +1 -1
- package/dist/Components/data/table/TableHeaderCell.d.ts.map +1 -1
- package/dist/Components/data/table/tableDataSource.d.ts +7 -1
- package/dist/Components/data/table/tableDataSource.d.ts.map +1 -1
- package/dist/Components/data/treeview/treeview.d.ts +3 -2
- package/dist/Components/data/treeview/treeview.d.ts.map +1 -1
- package/dist/Components/layout/groupBox.d.ts +4 -0
- package/dist/Components/layout/groupBox.d.ts.map +1 -1
- package/dist/Components/layout/header.d.ts.map +1 -1
- package/dist/Components/layout/panel.d.ts.map +1 -1
- package/dist/Components/layout/sidebar.d.ts +1 -1
- package/dist/Components/layout/sidebar.d.ts.map +1 -1
- package/dist/Components/lineinputs/LabeledInputControl.d.ts.map +1 -1
- package/dist/Components/lineinputs/SelectControl.d.ts.map +1 -1
- package/dist/Components/lineinputs/datetime/DatePicker.d.ts +19 -57
- package/dist/Components/lineinputs/datetime/DatePicker.d.ts.map +1 -1
- package/dist/Components/lineinputs/datetime/DateTimePicker.d.ts +20 -48
- package/dist/Components/lineinputs/datetime/DateTimePicker.d.ts.map +1 -1
- package/dist/Components/lineinputs/datetime/TemporalInput.d.ts +59 -0
- package/dist/Components/lineinputs/datetime/TemporalInput.d.ts.map +1 -0
- package/dist/Components/lineinputs/datetime/TimePicker.d.ts +18 -41
- package/dist/Components/lineinputs/datetime/TimePicker.d.ts.map +1 -1
- package/dist/Components/lineinputs/datetime/localDateTime.d.ts +49 -0
- package/dist/Components/lineinputs/datetime/localDateTime.d.ts.map +1 -0
- package/dist/Components/lineinputs/datetime/timeString.d.ts +5 -1
- package/dist/Components/lineinputs/datetime/timeString.d.ts.map +1 -1
- package/dist/Components/lineinputs/textbox.d.ts.map +1 -1
- package/dist/Components/lineinputs/toggle.d.ts.map +1 -1
- package/dist/Components/menu/button.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2311 -2714
- package/dist/index.js.map +1 -1
- package/dist/{jsx-dev-runtime-BAF7C1E1.js → jsx-dev-runtime-D3UnwrKT.js} +141 -147
- package/dist/jsx-dev-runtime-D3UnwrKT.js.map +1 -0
- package/dist/jsx-dev-runtime.js +1 -1
- package/dist/jsx-runtime.js +1 -1
- package/dist/localization.d.ts +0 -8
- package/dist/localization.d.ts.map +1 -1
- package/docs/application-composition-guide.md +2 -1
- package/package.json +3 -3
- package/styles/structural.css +393 -356
- package/themes/base.css +5 -3
- package/themes/minimal/theme.css +3 -2
- package/themes/shiny/theme.css +14 -18
- package/dist/Components/lineinputs/datetime/Calendar.d.ts +0 -23
- package/dist/Components/lineinputs/datetime/Calendar.d.ts.map +0 -1
- package/dist/jsx-dev-runtime-BAF7C1E1.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/Components/layout/tabpanel/tab.ts","../src/Components/layout/layoutTraits.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/navigation/breadcrumb.tsx","../src/Components/app/app.tsx","../src/Components/layout/header.tsx","../src/Components/layout/groupBox.tsx","../src/Components/status/statusPresentation.tsx","../src/Components/layout/declarativeRegion.ts","../src/Components/layout/optionGroup.tsx","../src/Components/layout/optionsBox.tsx","../src/Components/layout/layout.tsx","../src/Components/layout/panel.tsx","../src/Components/layout/sidebar.tsx","../src/Components/layout/splitView.tsx","../src/Components/data/descriptionList.tsx","../src/Components/data/infoPanel.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/lineinputs/datetime/civilDate.ts","../src/Components/lineinputs/datetime/Calendar.tsx","../src/Components/lineinputs/datetime/DatePicker.tsx","../src/Components/lineinputs/datetime/timeString.ts","../src/Components/lineinputs/datetime/TimePicker.tsx","../src/Components/lineinputs/datetime/DateTimePicker.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, CapillaryUiChild, Key} from '../../component.js'\nimport type {LiteralRouteDescriptor} from '../../../routing/route.js'\n\nexport interface TabProps extends ComponentProps {\n id?: Key\n label?: CapillaryUiChild\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(): CapillaryUiChild {\n return this.props.children ?? []\n }\n}\n","/** Direction in which a supported component arranges application-owned children. */\nexport type CapillaryUiLayoutDirection = 'horizontal' | 'vertical'\n\n/** Main-axis participation of a supported component in its containing layout. */\nexport type CapillaryUiLayoutAllocation = 'natural' | 'flexible'\n\n/** Opt-in contract for components whose host intentionally participates in layout. */\nexport interface CapillaryUiLayoutParticipantProps {\n allocation?: CapillaryUiLayoutAllocation\n}\n\n/** Concise, mutually exclusive direction modifiers for intentional layout components. */\nexport type CapillaryUiLayoutDirectionProps =\n | {horizontal: boolean, vertical?: never}\n | {horizontal?: never, vertical: boolean}\n\n/** Presentation context a container declares for its descendants. */\nexport type CapillaryUiPresentationContext = 'control' | 'form'\n\n/**\n * Opt-in contract for containers that declare a presentation context.\n * The nearest marked ancestor wins: descendants read context through\n * inherited CSS custom properties, so a nested marker overrides an outer one.\n */\nexport interface CapillaryUiPresentationContextProps {\n context?: CapillaryUiPresentationContext\n}\n\n/** Compatibility form for components that retain an established default direction. */\nexport type CapillaryUiOptionalLayoutDirectionProps =\n | CapillaryUiLayoutDirectionProps\n | {horizontal?: never, vertical?: never}\n\n/** Resolve boolean direction modifiers, with an optional compatibility fallback. */\nexport function layoutDirectionFromProps(\n props: {horizontal?: boolean, vertical?: boolean},\n fallback?: CapillaryUiLayoutDirection,\n componentName = 'Layout component',\n): CapillaryUiLayoutDirection {\n const {horizontal = false, vertical = false} = props\n if (horizontal && vertical) {\n throw new TypeError(`${componentName} cannot be both horizontal and vertical`)\n }\n if (horizontal) return 'horizontal'\n if (vertical) return 'vertical'\n if (fallback != null) return fallback\n throw new TypeError(`${componentName} requires either horizontal or vertical`)\n}\n\nexport function layoutDirectionClassName(direction: CapillaryUiLayoutDirection): string {\n if (direction === 'horizontal') return 'cap-layout-horizontal'\n if (direction === 'vertical') return 'cap-layout-vertical'\n throw new TypeError('Layout direction must be horizontal or vertical')\n}\n\nexport function layoutAllocationClassName(\n allocation: CapillaryUiLayoutAllocation | null | undefined,\n): string | undefined {\n if (allocation == null) return undefined\n if (allocation === 'natural') return 'cap-size-natural'\n if (allocation === 'flexible') return 'cap-size-flexible'\n throw new TypeError('Layout allocation must be natural or flexible')\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 Capillary UI'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 '@capillaryjs/capillary'\nimport type {EmitterOptions, ReadableEmitter} from '@capillaryjs/capillary'\n\nimport type {Component, ComponentProps} from './component.js'\nimport {layoutAllocationClassName} from './layout/layoutTraits.js'\nimport type {CapillaryUiLayoutParticipantProps} from './layout/layoutTraits.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 `cap-${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\n/** Build the host class for a component that intentionally exposes allocation. */\nexport function layoutParticipantClass(\n props: Pick<ComponentProps, 'class' | 'className'> & CapillaryUiLayoutParticipantProps,\n): string {\n return classNames(componentClass(props), layoutAllocationClassName(props.allocation))\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, CapillaryUiChild, 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?: CapillaryUiChild\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(): CapillaryUiChild {\n const {\n tabs = [],\n label = this.capillaryUiMessage('tabLineLabel'),\n baseId = 'cap-tabs',\n } = 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, CapillaryUiChild} 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 CapillaryUiRuntime')\n this.closeScope = router.openScope(this.props.context, this)\n }\n\n render(): CapillaryUiChild {\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 {CapillaryUiChild, 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: CapillaryUiChild): CapillaryUiChild {\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, CapillaryUiChild, 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?: CapillaryUiChild\n disabled?: boolean\n content?: CapillaryUiChild\n component?: CapillaryUiChild\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: CapillaryUiChild\n disabled: boolean\n content: CapillaryUiChild\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(): CapillaryUiChild {\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\"] > cap-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, CapillaryUiChild} 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 CapillaryUiRuntime')\n this.watch(router.transition)\n }\n\n render(): CapillaryUiChild {\n const router = this._runtime.router\n if (router == null) throw new Error('RouteLink requires a router in CapillaryUiRuntime')\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, CapillaryUiChild, Key} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from '../layout/layoutTraits.js'\nimport {layoutParticipantClass} 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\n/**\n * A navigation destination outside the current router, rendered as a native\n * anchor. Used for cross-application or cross-origin links where the router\n * must not intercept activation.\n */\nexport interface ExternalDestination {\n readonly kind: 'external'\n readonly href: string\n}\n\nexport function isExternalDestination(value: unknown): value is ExternalDestination {\n return value != null\n && typeof value === 'object'\n && (value as {kind?: unknown}).kind === 'external'\n}\n\ninterface NavigationBarItemBase {\n id: Key\n label: CapillaryUiChild\n disabled?: boolean\n target?: string\n download?: string | boolean\n title?: string\n onClick?: (event: MouseEvent) => void\n}\n\n/** A router-owned destination with optional route-current matching. */\nexport interface NavigationBarRouteItem extends NavigationBarItemBase {\n to: RouteDescriptor | RouteTarget | ResolvedRoute\n exact?: boolean\n}\n\n/** An application-controlled native-link destination outside the current router. */\nexport interface NavigationBarExternalItem extends NavigationBarItemBase {\n to: ExternalDestination\n /** External links have no router-current state, so exact matching is invalid. */\n exact?: never\n}\n\n/** One router-aware or application-controlled destination in a NavigationBar. */\nexport type NavigationBarItem = NavigationBarRouteItem | NavigationBarExternalItem\n\nexport interface NavigationBarProps extends ComponentProps, CapillaryUiLayoutParticipantProps {\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(): CapillaryUiChild {\n validateNavigation(this.props)\n const Host = this.Host\n return <Host className={layoutParticipantClass(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 : isExternalDestination(item.to)\n ? <a\n href={item.to.href}\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}</a>\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 user-select: none;\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 destination')\n if (isExternalDestination(item.to)) {\n if (typeof item.to.href !== 'string' || item.to.href.trim() === '') {\n throw new TypeError('External navigation item requires a non-blank href')\n }\n if (item.exact != null) {\n throw new TypeError('External navigation item cannot use exact route matching')\n }\n }\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 {ComponentProps, CapillaryUiChild, 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 BreadcrumbItem {\n id: Key\n label: CapillaryUiChild\n to?: RouteDescriptor | RouteTarget | ResolvedRoute\n onClick?: (event: MouseEvent) => void\n title?: string\n}\n\nexport interface BreadcrumbProps extends ComponentProps {\n items: readonly BreadcrumbItem[]\n label?: string\n}\n\n/**\n * Ordered path of ancestor links ending in the current location. The final item\n * is rendered as `aria-current=\"page\"` text; earlier items are router-aware\n * links when `to` is set, action anchors when only `onClick` is set, or plain\n * text otherwise.\n */\nexport class Breadcrumb extends Component<BreadcrumbProps> {\n static override liveProps: readonly string[] = []\n\n constructor(props: BreadcrumbProps) {\n super(props)\n validateBreadcrumb(props)\n }\n\n render(): CapillaryUiChild {\n validateBreadcrumb(this.props)\n const Host = this.Host\n const items = this.props.items\n const last = items.length - 1\n return <Host className={componentClass(this.props) || null}>\n <nav aria-label={this.props.label ?? this.capillaryUiMessage('breadcrumbLabel')}>\n <ol>{items.map((item, index) => <li key={String(item.id)}>\n {index === last\n ? <span aria-current=\"page\" {...(item.title == null ? {} : {title: item.title})}>{item.label}</span>\n : item.to != null\n ? <RouteLink\n to={item.to}\n {...(item.title == null ? {} : {title: item.title})}\n {...(item.onClick == null ? {} : {onClick: item.onClick})}\n >{item.label}</RouteLink>\n : item.onClick != null\n ? <a\n href=\"#\"\n {...(item.title == null ? {} : {title: item.title})}\n onClick={(event: MouseEvent) => {\n event.preventDefault()\n item.onClick!(event)\n }}\n >{item.label}</a>\n : <span {...(item.title == null ? {} : {title: item.title})}>{item.label}</span>}\n </li>)}</ol>\n </nav>\n </Host>\n }\n\n static dependencies = [RouteLink]\n static override hostName = 'breadcrumb'\n\n static override css = css`\n & {\n display: block;\n min-width: 0;\n user-select: none;\n }\n\n & > nav > ol {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n gap: var(--breadcrumb-gap, 0.375rem);\n margin: 0;\n padding: 0;\n list-style: none;\n min-width: 0;\n }\n\n & > nav > ol > li {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n }\n\n & > nav > ol > li + li::before {\n content: \"/\";\n margin-inline-end: var(--breadcrumb-gap, 0.375rem);\n color: var(--breadcrumb-separator-color, var(--muted-color, currentColor));\n opacity: 0.6;\n }\n\n & > nav > ol > li > a {\n color: var(--breadcrumb-link-color, inherit);\n text-decoration: none;\n white-space: nowrap;\n }\n\n & > nav > ol > li > a:hover {\n text-decoration: underline;\n }\n\n & > nav > ol > li > [aria-current=\"page\"] {\n font-weight: var(--breadcrumb-current-font-weight, 600);\n }\n `\n}\n\nfunction validateBreadcrumb(props: BreadcrumbProps): void {\n if (!Array.isArray(props.items)) throw new TypeError('Breadcrumb 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 breadcrumb item requires an id')\n if (item.label == null) throw new TypeError('Each breadcrumb item requires a label')\n if (item.onClick != null && typeof item.onClick !== 'function') {\n throw new TypeError('Breadcrumb item onClick must be a function')\n }\n if (ids.has(item.id)) throw new Error(`Duplicate breadcrumb item id: ${String(item.id)}`)\n ids.add(item.id)\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentDependency, ComponentProps, CapillaryUiChild} from '../component.js'\nimport {CapillaryUiRuntime} from '../../runtime.js'\nimport {layoutDirectionClassName} from '../layout/layoutTraits.js'\nimport type {CapillaryUiLayoutDirection} from '../layout/layoutTraits.js'\n\n/** Viewport sizing policy for a Capillary UI application root. */\nexport type CapillaryUiAppSizing =\n | 'embedded'\n | 'viewport-width'\n | 'viewport-height'\n | 'viewport'\n\n/** Landmark policy for a Capillary UI application root. */\nexport type CapillaryUiAppLandmark = 'main' | 'none'\n\nexport interface CapillaryUiAppProps extends ComponentProps {\n /**\n * Select the viewport axes claimed by the application shell. Embedded is\n * sizing-neutral; the other values use Capillary UI's public fill traits.\n */\n sizing?: CapillaryUiAppSizing\n /** Arrange application-owned root children on the bounded host. */\n layout?: CapillaryUiLayoutDirection\n /**\n * `main` exposes the app as the document's primary-content landmark.\n * Embedded applications should select `none`.\n */\n landmark?: CapillaryUiAppLandmark\n}\n\n/**\n * A fixed application shell with a `cap-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 CapillaryUiApp extends Component<CapillaryUiAppProps> {\n override mount(parent: ParentNode | null = null, before: Node | null = null): this {\n if (parent != null) {\n const targetDocument = parentDocument(parent, 'CapillaryUiApp.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(): CapillaryUiChild {\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 layout,\n landmark = 'main',\n ...hostProps\n } = this.props\n const Host = this.Host\n const rootClassName = mergeClassNames(\n classAlias,\n className,\n sizingClassName(sizing),\n layout == null ? undefined : layoutDirectionClassName(layout),\n )\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 mountCapillaryUiApp<TArgs extends unknown[], TApp extends CapillaryUiApp>(\n runtime: CapillaryUiRuntime,\n appType: (new(...args: TArgs) => TApp) & ComponentDependency,\n parent: ParentNode,\n ...args: TArgs\n): TApp {\n if (!(runtime instanceof CapillaryUiRuntime)) {\n throw new TypeError('mountCapillaryUiApp requires a CapillaryUiRuntime')\n }\n const targetDocument = parentDocument(parent, 'mountCapillaryUiApp')\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: CapillaryUiAppSizing): string | undefined {\n switch (sizing) {\n case 'embedded': return undefined\n case 'viewport-width': return 'cap-fill-horizontal'\n case 'viewport-height': return 'cap-fill-vertical'\n case 'viewport': return 'cap-fill-horizontal cap-fill-vertical'\n default: throw new TypeError(\n 'CapillaryUiApp sizing must be embedded, viewport-width, viewport-height, or viewport',\n )\n }\n}\n\nfunction landmarkRole(landmark: CapillaryUiAppLandmark): 'main' | null {\n if (landmark === 'main') return 'main'\n if (landmark === 'none') return null\n throw new TypeError('CapillaryUiApp 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, CapillaryUiChild} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from './layoutTraits.js'\nimport {controlId, layoutParticipantClass} from '../controlUtils.js'\n\nexport type HeaderLevel = 1 | 2 | 3 | 4 | 5 | 6\n\nexport interface HeaderProps extends ComponentProps, CapillaryUiLayoutParticipantProps {\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(): CapillaryUiChild {\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={layoutParticipantClass(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 user-select: none;\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, CapillaryUiChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {Header} from './header.js'\n\nexport interface GroupBoxBaseProps extends ComponentProps {\n id?: string | number | null\n}\n\nexport interface GroupBoxProps extends GroupBoxBaseProps {\n header: CapillaryUiChild\n}\n\n/** Bordered control group with a full-height vertical section header. */\nexport class GroupBox<\n TProps extends GroupBoxBaseProps = GroupBoxProps,\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-box', props.id)\n this.headerId = `${this.panelId}-title`\n }\n\n render(): CapillaryUiChild {\n const {header, children = []} = this.props as TProps & GroupBoxProps\n return this.renderGroupBox(header, children)\n }\n\n protected renderGroupBox(header: CapillaryUiChild, content: CapillaryUiChild): CapillaryUiChild {\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 <cap-content>{content}</cap-content>\n </Host>\n }\n\n static override hostName = 'group-box'\n static override dependencies: ComponentDependency[] = [Header]\n\n static css = css`\n & {\n display: flex;\n flex-flow: var(--cap-groupbox-flow, row nowrap);\n align-items: stretch;\n box-sizing: border-box;\n gap: var(--cap-groupbox-gap, 0 0.35rem);\n padding: var(--cap-groupbox-padding, 0.125rem 0.35rem 0.125rem 0.125rem);\n border: var(--cap-groupbox-border, 1px solid var(--ui-border-color));\n border-radius: var(--ui-border-radius);\n position: relative;\n min-width: 0;\n min-height: 0;\n }\n\n & > cap-header {\n display: grid;\n place-items: var(--cap-groupbox-header-align, center);\n box-sizing: border-box;\n width: var(--cap-groupbox-header-width, 1.7em);\n padding: var(--cap-groupbox-header-padding, 0.125em);\n border-radius: var(--ui-border-radius);\n color: var(--cap-groupbox-header-color, var(--section-header-color));\n background: var(--cap-groupbox-header-background, var(--section-header-background));\n box-shadow: var(--cap-groupbox-header-shadow, var(--section-header-shadow));\n writing-mode: var(--cap-groupbox-header-writing, vertical-rl);\n transform: var(--cap-groupbox-header-transform, rotate(180deg));\n font-weight: normal;\n font-size: var(--ui-font-size);\n min-width: 0;\n min-height: 0;\n }\n\n & > cap-content {\n display: block;\n min-width: 0;\n min-height: 0;\n margin-left: var(--cap-groupbox-content-margin, .25em);\n }\n\n .cap-layout-horizontal & > cap-content > cap-layout,\n .cap-layout-vertical & > cap-content > cap-layout {\n gap: .5rem;\n justify-content: flex-start;\n align-content: flex-start;\n justify-items: flex-start;\n align-items: flex-start;\n }\n\n /* Presentation contexts: each marker sets the complete context-sensitive\n property set, so the nearest marked ancestor wins through ordinary\n custom-property inheritance. Unmarked containers keep the control\n defaults declared as var() fallbacks above. */\n [data-cap-context='control'] {\n --cap-groupbox-flow: row nowrap;\n --cap-groupbox-gap: 0 0.35rem;\n --cap-groupbox-padding: 0.125rem 0.35rem 0.125rem 0.125rem;\n --cap-groupbox-border: 1px solid var(--ui-border-color);\n --cap-groupbox-header-align: center;\n --cap-groupbox-header-width: 1.7em;\n --cap-groupbox-header-padding: 0.125em;\n --cap-groupbox-header-color: var(--section-header-color);\n --cap-groupbox-header-background: var(--section-header-background);\n --cap-groupbox-header-shadow: var(--section-header-shadow);\n --cap-groupbox-header-writing: vertical-rl;\n --cap-groupbox-header-transform: rotate(180deg);\n --cap-groupbox-content-margin: .25em;\n }\n\n [data-cap-context='form'] {\n --cap-groupbox-flow: column nowrap;\n --cap-groupbox-gap: 0.25rem 0;\n --cap-groupbox-padding: 0.5rem;\n --cap-groupbox-border: 1px solid var(--ui-border-color);\n --cap-groupbox-header-align: center start;\n --cap-groupbox-header-width: auto;\n --cap-groupbox-header-padding: 0;\n --cap-groupbox-header-color: var(--text-color);\n --cap-groupbox-header-background: none;\n --cap-groupbox-header-shadow: none;\n --cap-groupbox-header-writing: horizontal-tb;\n --cap-groupbox-header-transform: none;\n --cap-groupbox-content-margin: 0;\n }\n\n [data-cap-context='form'] & {\n flex: 1 1 auto;\n align-self: stretch;\n padding-top: 1em;\n }\n\n .cap-layout-horizontal & {\n max-width: 15rem;\n min-width: 0;\n }\n\n .cap-layout-vertical & {\n max-height: 15rem;\n min-height: 0;\n }\n\n [data-cap-context='form'] cap-groupbox > cap-header {\n position: absolute;\n left: calc(0px - var(--ui-font-size) / 2);\n top: calc(0px - var(--ui-font-size) / 2);\n background: var(--panel-background);\n padding: 2px 5px;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\n/** Shared structural keyframe dependency for loading-capable Capillary UI components. */\nexport class StatusPresentation extends Component {\n static override hostName = null\n\n static override css = css`\n @keyframes cap-working-progress {\n from { background-position: 0 0, 0 0; }\n to { background-position: 2rem 0, 0 0; }\n }\n `\n}\n\nexport interface ErrorMessageProps extends ComponentProps {\n id?: string\n error: unknown\n fallback?: string\n}\n\n/** Accessible error text exposed visually from an overlay icon on hover or focus. */\nexport class ErrorMessage extends Component<ErrorMessageProps> {\n render(): CapillaryUiChild {\n const message = formatErrorMessage(this.props.error, this.props.fallback ?? '')\n const Host = this.Host\n return <Host\n id={this.props.id}\n className={componentClass(this.props) || null}\n role=\"alert\"\n tabIndex={0}\n aria-label={message}\n >\n <cap-erroricon aria-hidden=\"true\" />\n <cap-errortext>{message}</cap-errortext>\n </Host>\n }\n\n static override hostName = 'error'\n static override dependencies = [StatusPresentation]\n\n static override css = css`\n & {\n position: absolute;\n z-index: 1200;\n inset-block-start: -.35em;\n inset-inline-end: -.35em;\n display: block;\n width: 1.25em;\n height: 1.25em;\n margin: 0;\n color: var(--error-color);\n font-size: .875em;\n line-height: 1.35;\n outline: none;\n box-sizing: border-box;\n }\n\n & > cap-erroricon {\n position: absolute;\n inset: 0;\n display: grid;\n width: 1.25em;\n height: 1.25em;\n color: var(--error-contrast);\n background: var(--error-color);\n border: 1px solid var(--error-color);\n border-radius: 50%;\n box-sizing: border-box;\n font-weight: 700;\n line-height: 1;\n place-items: center;\n }\n\n & > cap-erroricon::before {\n content: \"!\";\n }\n\n & > cap-errortext {\n position: absolute;\n z-index: 1;\n inset-block-start: calc(100% + .25em);\n inset-inline-end: 0;\n display: block;\n visibility: hidden;\n width: max-content;\n max-width: min(22rem, 80vw);\n padding: var(--space-xs) var(--space-sm);\n color: var(--ui-color);\n background: var(--error-bg-neutral, var(--application-background));\n border: 1px solid var(--error-color);\n border-radius: var(--radius-md);\n box-shadow: var(--ui-shadow);\n opacity: 0;\n overflow-wrap: anywhere;\n pointer-events: none;\n transform: translateY(-.2em);\n transition: opacity var(--motion-fast), transform var(--motion-fast), visibility 0s linear var(--motion-fast);\n }\n\n & > cap-erroricon:hover + cap-errortext,\n &:focus-visible > cap-errortext {\n visibility: visible;\n opacity: 1;\n transform: translateY(0);\n transition-delay: 0s;\n }\n\n &:focus-visible > cap-erroricon {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n @media (forced-colors: active) {\n & > cap-erroricon,\n & > cap-errortext {\n color: CanvasText;\n background: Canvas;\n border-color: Mark;\n forced-color-adjust: auto;\n }\n }\n `\n}\n\nexport function formatErrorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n if (isMessageError(error)) return error.message\n if (isDerivedErrors(error)) {\n const messages = error\n .map((entry) => formatErrorMessage(entry.error, ''))\n .filter((message) => message.length > 0)\n if (messages.length > 0) return [...new Set(messages)].join('; ')\n }\n return error == null ? fallback : String(error)\n}\n\nfunction isMessageError(error: unknown): error is {message: string} {\n return error != null\n && typeof error === 'object'\n && typeof Reflect.get(error, 'message') === 'string'\n}\n\nfunction isDerivedErrors(error: unknown): error is readonly {error: unknown}[] {\n return Array.isArray(error) && error.every((entry) =>\n entry != null && typeof entry === 'object' && Object.hasOwn(entry, 'error'))\n}\n","import {Component, isVNode} from '../component.js'\nimport type {\n ComponentConstructor,\n ComponentProps,\n CapillaryUiChild,\n} from '../component.js'\n\n/**\n * Base for non-visual, parent-specific content-region markers.\n *\n * A marker must be consumed as a direct child by the component that defines\n * its meaning. The marker itself never contributes a DOM or component host.\n */\nexport abstract class DeclarativeRegion<\n TProps extends ComponentProps = ComponentProps,\n> extends Component<TProps> {\n static override liveProps: readonly string[] = []\n\n render(): never {\n throw new Error(`${this.constructor.name} must be a direct child of its documented parent`)\n }\n}\n\nexport interface ReadDeclarativeRegionsOptions<TName extends string> {\n /** Allow ordinary, unmarked children. Defaults to true. */\n allowContent?: boolean\n /** Region names that must be supplied exactly once. */\n required?: readonly NoInfer<TName>[]\n}\n\nexport interface ReadDeclarativeRegionsResult<TName extends string> {\n /** Ordinary children retained in their authored order. */\n content: readonly CapillaryUiChild[]\n /** Contents of each unique, parent-specific region marker. */\n regions: Readonly<Partial<Record<TName, readonly CapillaryUiChild[]>>>\n}\n\n/**\n * Separate direct declarative-region children from ordinary ordered content\n * and validate one component's documented region contract.\n */\nexport function readDeclarativeRegions<TName extends string>(\n componentName: string,\n children: ComponentProps['children'],\n supportedRegions: Readonly<Record<TName, ComponentConstructor>>,\n options: ReadDeclarativeRegionsOptions<TName> = {},\n): ReadDeclarativeRegionsResult<TName> {\n const entries = Object.entries(supportedRegions) as [TName, ComponentConstructor][]\n const content: CapillaryUiChild[] = []\n const regions: Partial<Record<TName, readonly CapillaryUiChild[]>> = {}\n const values = Array.isArray(children) ? children : children == null ? [] : [children]\n\n for (const child of values) {\n if (!isVNode(child)) {\n content.push(child)\n continue\n }\n const entry = entries.find(([, type]) => child.type === type)\n if (entry == null) {\n if (isDeclarativeRegionType(child.type)) {\n throw new Error(`${componentName} does not support region: ${child.type.name}`)\n }\n content.push(child)\n continue\n }\n\n const [name] = entry\n if (regions[name] != null) throw new Error(`${componentName} received duplicate region: ${name}`)\n regions[name] = child.props.children\n }\n\n if (options.allowContent === false && content.length > 0) {\n throw new Error(`${componentName} accepts only its documented region children`)\n }\n for (const required of options.required ?? []) {\n if (!Object.hasOwn(supportedRegions, required)) {\n throw new Error(`${componentName} requires undeclared region: ${required}`)\n }\n if (regions[required] == null) throw new Error(`${componentName} requires region: ${required}`)\n }\n\n return {content, regions}\n}\n\nfunction isDeclarativeRegionType(type: unknown): type is ComponentConstructor {\n return typeof type === 'function'\n && type.prototype instanceof DeclarativeRegion\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, LivePropContract} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {ErrorMessage} from '../status/statusPresentation.js'\nimport {DeclarativeRegion, readDeclarativeRegions} from './declarativeRegion.js'\n\n/** Trailing content rendered in an OptionGroup legend. */\nexport class OptionGroupHeaderEnd extends DeclarativeRegion {}\n\nconst optionGroupLiveProps = ['disabled', 'required', 'busy', 'error'] as const\n\nexport interface OptionGroupBaseProps extends ComponentProps,\n LivePropContract<(typeof optionGroupLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n ariaLabel?: string\n /** @deprecated Supply `<OptionGroupHeaderEnd>` as a direct child. */\n headerEnd?: never\n disabled?: boolean\n required?: boolean\n busy?: boolean\n error?: unknown\n}\n\n/** Labeled fieldset section for use inside an OptionsBox or standalone. */\nexport class OptionGroup<TProps extends OptionGroupBaseProps = OptionGroupBaseProps>\n extends Component<TProps> {\n static override liveProps = optionGroupLiveProps\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(): CapillaryUiChild {\n if (this.props.headerEnd != null) {\n throw new Error('OptionGroup trailing header content must use a direct OptionGroupHeaderEnd child')\n }\n const {content, regions} = readDeclarativeRegions('OptionGroup', this.props.children, {\n headerEnd: OptionGroupHeaderEnd,\n })\n return this.renderOptionGroup(content, regions.headerEnd ?? null)\n }\n\n protected renderOptionGroup(content: CapillaryUiChild, headerEnd: CapillaryUiChild): CapillaryUiChild {\n const Host = this.Host\n const {\n label,\n ariaLabel,\n disabled = false,\n required = false,\n busy = 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-busy={busy ? '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 {this.renderOptionGroupError(error)}\n </Host>\n }\n\n /** Shared error anatomy for OptionGroup specializations. */\n protected renderOptionGroupError(error: unknown): CapillaryUiChild {\n return error == null ? null : <ErrorMessage id={this.errorId} error={error} />\n }\n\n static override hostName = 'option-group'\n static override dependencies = [OptionGroupHeaderEnd, ErrorMessage]\n\n static css = css`\n & {\n display: block;\n position: relative;\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 box-sizing: border-box;\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 user-select: none;\n }\n\n & > fieldset > legend > span {\n flex: 1;\n min-width: 0;\n }\n\n & > fieldset[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > fieldset[aria-invalid=\"true\"] {\n border: 1px solid var(--error-color);\n border-radius: var(--radius-md);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > fieldset[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > fieldset[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","import {css} from '../component.js'\nimport {GroupBox} from './groupBox.js'\nimport type {GroupBoxBaseProps} from './groupBox.js'\nimport type {CapillaryUiChild} from '../component.js'\n\nexport interface OptionsBoxProps extends GroupBoxBaseProps {\n header: CapillaryUiChild\n}\n\n/** Bordered panel with a vertical section header, designed to contain OptionGroups. */\nexport class OptionsBox<TProps extends GroupBoxBaseProps = OptionsBoxProps>\n extends GroupBox<TProps> {\n static override hostName = 'options-box'\n\n static css = css`\n & > cap-content {\n display: flex;\n flex-direction: column;\n align-self: stretch;\n flex: 1 1 0;\n gap: .5em;\n }\n\n & > cap-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 user-select: none;\n }\n\n & > cap-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} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {classNames, componentClass} from '../controlUtils.js'\nimport {\n layoutAllocationClassName,\n layoutDirectionClassName,\n layoutDirectionFromProps,\n} from './layoutTraits.js'\nimport type {\n CapillaryUiLayoutDirection,\n CapillaryUiLayoutDirectionProps,\n CapillaryUiOptionalLayoutDirectionProps,\n CapillaryUiLayoutParticipantProps,\n CapillaryUiPresentationContextProps,\n} from './layoutTraits.js'\n\nexport type LayoutContainerProps = ComponentProps\n& CapillaryUiOptionalLayoutDirectionProps\n& CapillaryUiLayoutParticipantProps\n& CapillaryUiPresentationContextProps\n& {\n id?: string\n role?: string\n ariaLabel?: string\n tabIndex?: number\n /** Make this bounded Layout host its own overflow owner. */\n scroll?: boolean\n}\n\nexport type LayoutProps = LayoutContainerProps & CapillaryUiLayoutDirectionProps\n\ninterface LayoutHostAccessibilityProps {\n role?: string | null\n 'aria-label'?: string | null\n tabIndex?: number | null\n}\n\n/** Presentation-only horizontal or vertical arrangement for arbitrary children. */\nexport class Layout<TProps extends LayoutContainerProps = LayoutProps> extends Component<TProps> {\n static override liveProps: readonly string[] = []\n\n protected defaultDirection(): CapillaryUiLayoutDirection | undefined {\n return undefined\n }\n\n protected defaultScroll(): boolean {\n return false\n }\n\n protected hostAccessibilityProps(): LayoutHostAccessibilityProps {\n const {role, ariaLabel, tabIndex} = this.props\n return {\n role: role ?? (ariaLabel == null ? null : 'region'),\n 'aria-label': ariaLabel ?? null,\n tabIndex: tabIndex ?? null,\n }\n }\n\n render(): CapillaryUiChild {\n const direction = layoutDirectionFromProps(\n this.props,\n this.defaultDirection(),\n this.constructor.name,\n )\n const scroll = this.props.scroll ?? this.defaultScroll()\n const Host = this.Host\n return <Host\n id={this.props.id}\n data-cap-context={this.props.context ?? null}\n {...this.hostAccessibilityProps()}\n className={classNames(\n componentClass(this.props),\n layoutDirectionClassName(direction),\n layoutAllocationClassName(this.props.allocation),\n scroll ? 'cap-scroll' : undefined,\n ) || null}\n >{this.props.children ?? []}</Host>\n }\n\n static override hostName = 'layout'\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, LivePropContract} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from './layoutTraits.js'\nimport type {CapillaryUiOptionalLayoutDirectionProps, CapillaryUiPresentationContextProps} from './layoutTraits.js'\nimport {layoutDirectionFromProps} from './layoutTraits.js'\nimport {Header} from './header.js'\nimport {Layout} from './layout.js'\nimport {DeclarativeRegion, readDeclarativeRegions} from './declarativeRegion.js'\nimport {controlId, layoutParticipantClass} from '../controlUtils.js'\n\nconst panelLiveProps = ['disabled'] as const\n\n/** Toolbar content rendered between a Panel heading and its ordinary children. */\nexport class PanelToolbar extends DeclarativeRegion {}\n\nexport type PanelProps = ComponentProps\n& CapillaryUiLayoutParticipantProps\n& CapillaryUiOptionalLayoutDirectionProps\n& CapillaryUiPresentationContextProps\n& LivePropContract<(typeof panelLiveProps)[number]>\n& {\n id?: string | number | null\n header?: CapillaryUiChild\n /** @deprecated Supply `<PanelToolbar>` as a direct child. */\n toolbar?: never\n /** @deprecated Use the `horizontal` or `vertical` boolean modifier. */\n orientation?: 'horizontal' | 'vertical'\n /** Make the Panel body its overflow owner. Defaults to true for compatibility. */\n scroll?: boolean\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 if (this.props.toolbar != null) {\n throw new Error('Panel toolbar content must use a direct PanelToolbar child')\n }\n const {\n header = null,\n children = [],\n orientation,\n scroll = true,\n disabled = false,\n context = null,\n } = this.props\n const {content, regions} = readDeclarativeRegions('Panel', children, {\n toolbar: PanelToolbar,\n })\n if (orientation != null && !['horizontal', 'vertical'].includes(orientation)) {\n throw new TypeError('Panel orientation must be horizontal or vertical')\n }\n if (orientation != null\n && ((this.props.horizontal && orientation !== 'horizontal')\n || (this.props.vertical && orientation !== 'vertical'))) {\n throw new TypeError('Panel direction modifier conflicts with orientation')\n }\n const direction = layoutDirectionFromProps(\n this.props,\n orientation ?? 'vertical',\n 'Panel',\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 data-cap-context={context}\n role={header == null ? null : 'region'}\n className={layoutParticipantClass(this.props)}\n aria-disabled={disabled ? 'true' : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {regions.toolbar ?? null}\n <Layout\n {...(direction === 'horizontal' ? {horizontal: true} : {vertical: true})}\n scroll={scroll}\n className=\"panel-content\"\n >{content}</Layout>\n </Host>\n }\n\n static override hostName = 'panel'\n static override dependencies = [Header, Layout, PanelToolbar]\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 min-width: 0;\n min-height: 0;\n overflow: hidden;\n flex: 0 0 auto;\n }\n\n & > cap-layout.panel-content {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n padding: var(--panel-padding, 0.75rem);\n gap: var(--spacing-medium, 1rem);\n }\n\n &[aria-disabled=\"true\"] {\n opacity: .65;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from './layoutTraits.js'\nimport {Header} from './header.js'\nimport {DeclarativeRegion, readDeclarativeRegions} from './declarativeRegion.js'\nimport {controlId, layoutParticipantClass} from '../controlUtils.js'\n\n/** Toolbar content rendered between a Sidebar heading and its scrolling body. */\nexport class SidebarToolbar extends DeclarativeRegion {}\n\nexport interface SidebarProps extends ComponentProps, CapillaryUiLayoutParticipantProps {\n id?: string | number | null\n header?: CapillaryUiChild\n /** @deprecated Supply `<SidebarToolbar>` as a direct child. */\n toolbar?: never\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(): CapillaryUiChild {\n if (this.props.toolbar != null) {\n throw new Error('Sidebar toolbar content must use a direct SidebarToolbar child')\n }\n const {\n header = null,\n ariaLabel,\n children = [],\n } = this.props\n const {content, regions} = readDeclarativeRegions('Sidebar', children, {\n toolbar: SidebarToolbar,\n })\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={layoutParticipantClass(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 {regions.toolbar == null ? null : <cap-toolbarcontent>{regions.toolbar}</cap-toolbarcontent>}\n <cap-content tabIndex={0}>{content}</cap-content>\n </aside>\n </Host>\n }\n\n static override hostName = 'sidebar'\n static override dependencies = [Header, SidebarToolbar]\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 > cap-header,\n & > aside > cap-toolbarcontent {\n flex: none;\n }\n\n & > aside > cap-toolbarcontent {\n min-width: 0;\n overflow-x: auto;\n }\n\n & > aside > cap-content {\n flex: 1;\n min-height: 0;\n overflow: auto;\n }\n `\n}\n","import {Component, css, h, isVNode} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, VNode} from '../component.js'\nimport {classNames, componentClass, invoke} from '../controlUtils.js'\nimport {Layout} from './layout.js'\nimport type {LayoutContainerProps} from './layout.js'\nimport {\n layoutAllocationClassName,\n layoutDirectionFromProps,\n} from './layoutTraits.js'\nimport type {\n CapillaryUiLayoutDirection,\n CapillaryUiOptionalLayoutDirectionProps,\n CapillaryUiLayoutParticipantProps,\n} from './layoutTraits.js'\n\nexport type SplitPaneProps = Omit<LayoutContainerProps, 'allocation'> & {\n /** Pane allocation is owned by SplitView. */\n allocation?: never\n /** Accessible region name for this pane. */\n label?: string\n}\n\nabstract class SplitPane extends Layout<SplitPaneProps> {\n override render(): CapillaryUiChild {\n if ((this.props as LayoutContainerProps).allocation != null) {\n throw new TypeError('SplitView owns SplitPrimary and SplitSecondary allocation')\n }\n return super.render()\n }\n\n protected override defaultDirection(): CapillaryUiLayoutDirection {\n return 'vertical'\n }\n\n protected override defaultScroll(): boolean {\n return true\n }\n\n protected override hostAccessibilityProps(): {\n role: string | null\n 'aria-label': string | null\n tabIndex: number | null\n } {\n const {label, scroll} = this.props\n const scrolls = scroll ?? this.defaultScroll()\n return {\n role: label == null ? null : 'region',\n 'aria-label': label ?? null,\n tabIndex: scrolls ? 0 : null,\n }\n }\n}\n\n/** Named Layout pane whose size is controlled by its parent SplitView. */\nexport class SplitPrimary extends SplitPane {\n static override hostName = 'primary'\n}\n\n/** Named Layout pane that receives the SplitView's remaining space. */\nexport class SplitSecondary extends SplitPane {\n static override hostName = 'secondary'\n}\n\nexport type SplitViewProps = ComponentProps\n& CapillaryUiOptionalLayoutDirectionProps\n& CapillaryUiLayoutParticipantProps\n& {\n /** @deprecated Supply `<SplitPrimary>` as a direct child. */\n primary?: never\n /** @deprecated Supply `<SplitSecondary>` as a direct child. */\n secondary?: never\n /** @deprecated Use the `horizontal` or `vertical` boolean modifier. */\n direction?: 'horizontal' | 'vertical'\n /** Initial primary-pane size as a non-empty CSS size. */\n primarySize?: string\n /** @deprecated Put `label` on `<SplitPrimary>`. */\n primaryLabel?: string\n /** @deprecated Put `label` on `<SplitSecondary>`. */\n secondaryLabel?: string\n /** Minimum primary-pane size in CSS pixels. */\n primaryMinSize?: number\n /** Minimum secondary-pane size in CSS pixels. */\n secondaryMinSize?: number\n /** Keyboard resize increment in CSS pixels. */\n resizeStep?: number\n /** Accessible name for the resize separator. */\n separatorLabel?: string\n /** Enable separator interaction. Defaults to true. */\n resizable?: boolean\n /** Receives the current primary-pane pixel size after an interaction. */\n onResize?: (primarySize: string, event: PointerEvent | KeyboardEvent) => void\n}\n\ninterface PointerResize {\n pointerId: number\n startCoordinate: number\n startSize: number\n}\n\n/** Resizable two-pane layout with named Layout children and an accessible separator. */\nexport class SplitView extends Component<SplitViewProps> {\n static override liveProps: readonly string[] = []\n private pointerResize: PointerResize | null = null\n private primarySizeOverride: string | null = null\n\n override setProps(nextProps: SplitViewProps): this {\n if (nextProps.primarySize !== this.props.primarySize) this.primarySizeOverride = null\n return super.setProps(nextProps)\n }\n\n render(): CapillaryUiChild {\n if (this.props.primary != null || this.props.secondary != null) {\n throw new Error('SplitView pane content must use direct SplitPrimary and SplitSecondary children')\n }\n const {\n direction,\n primarySize,\n primaryLabel,\n secondaryLabel,\n primaryMinSize = 96,\n secondaryMinSize = 96,\n resizeStep = 16,\n separatorLabel = this.capillaryUiMessage('splitViewSeparatorLabel'),\n resizable = true,\n } = this.props\n if (direction != null && !['horizontal', 'vertical'].includes(direction)) {\n throw new TypeError('SplitView direction must be horizontal or vertical')\n }\n if (direction != null\n && ((this.props.horizontal && direction !== 'horizontal')\n || (this.props.vertical && direction !== 'vertical'))) {\n throw new TypeError('SplitView direction modifier conflicts with direction')\n }\n const axis = layoutDirectionFromProps(this.props, direction ?? 'horizontal', 'SplitView')\n validateCSSSize(primarySize, 'primarySize')\n validateNonNegativeNumber(primaryMinSize, 'primaryMinSize')\n validateNonNegativeNumber(secondaryMinSize, 'secondaryMinSize')\n validatePositiveNumber(resizeStep, 'resizeStep')\n\n const {primary, secondary} = readSplitPanes(this.props.children)\n const Host = this.Host\n return <Host\n className={classNames(\n componentClass(this.props),\n layoutAllocationClassName(this.props.allocation),\n axis,\n ) || null}\n style={{\n '--split-primary-size': this.primarySizeOverride ?? primarySize ?? '40%',\n '--split-primary-min-size': `${primaryMinSize}px`,\n '--split-secondary-min-size': `${secondaryMinSize}px`,\n }}\n data-resizable={resizable ? 'true' : 'false'}\n >\n {withFallbackLabel(primary, primaryLabel)}\n <cap-separator\n role=\"separator\"\n aria-label={separatorLabel}\n aria-orientation={axis === 'horizontal' ? 'vertical' : 'horizontal'}\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow=\"40\"\n aria-disabled={resizable ? null : 'true'}\n tabIndex={resizable ? 0 : null}\n {...(resizable ? {\n onPointerDown: this.handlePointerDown,\n onPointerMove: this.handlePointerMove,\n onPointerUp: this.handlePointerEnd,\n onPointerCancel: this.handlePointerEnd,\n onKeyDown: this.handleKeyDown,\n } : {})}\n />\n {withFallbackLabel(secondary, secondaryLabel)}\n </Host>\n }\n\n override afterMount(): void {\n this.updateSeparatorValue()\n }\n\n override afterUpdate(): void {\n this.updateSeparatorValue()\n }\n\n private readonly handlePointerDown = (event: PointerEvent & {currentTarget: HTMLElement}): void => {\n if (event.button !== 0) return\n const primary = this.primaryElement()\n if (primary == null) return\n const axis = this.axis()\n this.pointerResize = {\n pointerId: event.pointerId,\n startCoordinate: axis === 'horizontal' ? event.clientX : event.clientY,\n startSize: axis === 'horizontal'\n ? primary.getBoundingClientRect().width\n : primary.getBoundingClientRect().height,\n }\n event.currentTarget.setPointerCapture?.(event.pointerId)\n event.preventDefault()\n }\n\n private readonly handlePointerMove = (\n event: PointerEvent & {currentTarget: HTMLElement},\n ): void => {\n const resize = this.pointerResize\n if (resize == null || resize.pointerId !== event.pointerId) return\n const coordinate = this.axis() === 'horizontal' ? event.clientX : event.clientY\n this.resizeTo(resize.startSize + coordinate - resize.startCoordinate, event)\n event.preventDefault()\n }\n\n private readonly handlePointerEnd = (event: PointerEvent & {currentTarget: HTMLElement}): void => {\n if (this.pointerResize?.pointerId !== event.pointerId) return\n event.currentTarget.releasePointerCapture?.(event.pointerId)\n this.pointerResize = null\n }\n\n private readonly handleKeyDown = (\n event: KeyboardEvent & {currentTarget: HTMLElement},\n ): void => {\n const axis = this.axis()\n const decreaseKey = axis === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const increaseKey = axis === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const primary = this.primaryElement()\n if (primary == null) return\n let next: number\n if (event.key === decreaseKey) {\n next = this.primaryExtent(primary) - this.resizeIncrement(event)\n } else if (event.key === increaseKey) {\n next = this.primaryExtent(primary) + this.resizeIncrement(event)\n } else if (event.key === 'Home') {\n next = this.props.primaryMinSize ?? 96\n } else if (event.key === 'End') {\n next = Number.POSITIVE_INFINITY\n } else {\n return\n }\n this.resizeTo(next, event)\n event.preventDefault()\n }\n\n private resizeTo(requestedSize: number, event: PointerEvent | KeyboardEvent): void {\n const host = this.hostElement()\n const separator = this.separatorElement()\n if (host == null || separator == null) return\n const horizontal = this.axis() === 'horizontal'\n const extent = horizontal ? host.clientWidth : host.clientHeight\n const separatorExtent = horizontal ? separator.offsetWidth : separator.offsetHeight\n const primaryMin = this.props.primaryMinSize ?? 96\n const secondaryMin = this.props.secondaryMinSize ?? 96\n const maximum = Math.max(primaryMin, extent - separatorExtent - secondaryMin)\n const size = Math.min(Math.max(requestedSize, primaryMin), maximum)\n const value = `${Math.round(size * 100) / 100}px`\n this.primarySizeOverride = value\n host.style.setProperty('--split-primary-size', value)\n this.updateSeparatorValue()\n invoke(this.props.onResize, value, event)\n }\n\n private resizeIncrement(event: KeyboardEvent): number {\n return (this.props.resizeStep ?? 16) * (event.shiftKey ? 4 : 1)\n }\n\n private primaryExtent(primary: HTMLElement): number {\n const bounds = primary.getBoundingClientRect()\n return this.axis() === 'horizontal' ? bounds.width : bounds.height\n }\n\n private updateSeparatorValue(): void {\n const host = this.hostElement()\n const primary = this.primaryElement()\n const separator = this.separatorElement()\n if (host == null || primary == null || separator == null) return\n const horizontal = this.axis() === 'horizontal'\n const total = (horizontal ? host.clientWidth : host.clientHeight)\n - (horizontal ? separator.offsetWidth : separator.offsetHeight)\n if (total <= 0) return\n const percentage = Math.round((this.primaryExtent(primary) / total) * 100)\n separator.setAttribute('aria-valuenow', String(percentage))\n separator.setAttribute('aria-valuetext', `${percentage}% primary pane`)\n }\n\n private axis(): CapillaryUiLayoutDirection {\n return layoutDirectionFromProps(\n this.props,\n this.props.direction ?? 'horizontal',\n 'SplitView',\n )\n }\n\n private hostElement(): HTMLElement | null {\n return this.dom instanceof HTMLElement ? this.dom : null\n }\n\n private primaryElement(): HTMLElement | null {\n return this.hostElement()?.querySelector(':scope > cap-primary') ?? null\n }\n\n private separatorElement(): HTMLElement | null {\n return this.hostElement()?.querySelector(':scope > cap-separator') ?? null\n }\n\n static override hostName = 'split-view'\n static override dependencies = [SplitPrimary, SplitSecondary]\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 & > cap-primary {\n flex: 0 0 var(--split-primary-size, 40%);\n }\n\n & > cap-secondary {\n flex: 1 1 0;\n }\n\n &.horizontal > cap-primary {\n min-inline-size: var(--split-primary-min-size, 96px);\n }\n\n &.horizontal > cap-secondary {\n min-inline-size: var(--split-secondary-min-size, 96px);\n }\n\n &.vertical > cap-primary {\n min-block-size: var(--split-primary-min-size, 96px);\n }\n\n &.vertical > cap-secondary {\n min-block-size: var(--split-secondary-min-size, 96px);\n }\n\n & > cap-separator {\n position: relative;\n flex: none;\n box-sizing: border-box;\n background: var(--ui-border-color);\n touch-action: none;\n user-select: none;\n }\n\n & > cap-separator::after {\n content: '';\n position: absolute;\n border-radius: 999px;\n background: currentColor;\n opacity: 0;\n }\n\n & > cap-separator:hover::after,\n & > cap-separator:focus-visible::after {\n opacity: .45;\n }\n\n &.horizontal > cap-separator {\n inline-size: .45rem;\n cursor: col-resize;\n }\n\n &.horizontal > cap-separator::after {\n inset-block: 35%;\n inset-inline: 1px;\n }\n\n &.vertical > cap-separator {\n block-size: .45rem;\n cursor: row-resize;\n }\n\n &.vertical > cap-separator::after {\n inset-inline: 35%;\n inset-block: 1px;\n }\n\n &[data-resizable=\"false\"] > cap-separator {\n cursor: default;\n }\n `\n}\n\nfunction readSplitPanes(children: ComponentProps['children']): {\n primary: VNode<SplitPaneProps>\n secondary: VNode<SplitPaneProps>\n} {\n let primary: VNode<SplitPaneProps> | null = null\n let secondary: VNode<SplitPaneProps> | null = null\n const values = flattenChildren(children)\n for (const child of values) {\n if (!isVNode(child)) {\n throw new Error('SplitView accepts only direct SplitPrimary and SplitSecondary children')\n }\n if (child.type === SplitPrimary) {\n if (primary != null) throw new Error('SplitView received duplicate SplitPrimary')\n primary = child as VNode<SplitPaneProps>\n } else if (child.type === SplitSecondary) {\n if (secondary != null) throw new Error('SplitView received duplicate SplitSecondary')\n secondary = child as VNode<SplitPaneProps>\n } else {\n throw new Error('SplitView accepts only direct SplitPrimary and SplitSecondary children')\n }\n }\n if (primary == null) throw new Error('SplitView requires SplitPrimary')\n if (secondary == null) throw new Error('SplitView requires SplitSecondary')\n return {primary, secondary}\n}\n\nfunction flattenChildren(children: ComponentProps['children']): CapillaryUiChild[] {\n const flattened: CapillaryUiChild[] = []\n const visit = (value: CapillaryUiChild | readonly CapillaryUiChild[]): void => {\n if (Array.isArray(value)) {\n for (const child of value) visit(child)\n } else if (value != null && value !== false && value !== true) {\n flattened.push(value)\n }\n }\n visit(children ?? [])\n return flattened\n}\n\nfunction withFallbackLabel(\n pane: VNode<SplitPaneProps>,\n fallback: string | undefined,\n): VNode<SplitPaneProps> {\n if (fallback == null || pane.props.label != null) return pane\n const {children, ...props} = pane.props\n return h(pane.type as typeof SplitPrimary, {\n ...props,\n key: pane.key,\n label: fallback,\n }, children) as VNode<SplitPaneProps>\n}\n\nfunction validateCSSSize(value: string | undefined, name: string): void {\n if (value != null && (typeof value !== 'string' || value.length === 0)) {\n throw new TypeError(`SplitView ${name} must be a non-empty CSS size`)\n }\n}\n\nfunction validateNonNegativeNumber(value: number, name: string): void {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new TypeError(`SplitView ${name} must be a finite non-negative number`)\n }\n}\n\nfunction validatePositiveNumber(value: number, name: string): void {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n throw new TypeError(`SplitView ${name} must be a finite positive number`)\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\nexport interface DescriptionItemProps extends ComponentProps {\n term: CapillaryUiChild\n value?: CapillaryUiChild\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(): CapillaryUiChild {\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(): CapillaryUiChild {\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 user-select: none;\n }\n\n & > dl {\n display: grid;\n margin: 0;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {Header} from '../layout/header.js'\n\nexport interface InfoFieldProps extends ComponentProps {\n label: CapillaryUiChild\n value?: CapillaryUiChild\n}\n\n/** A labeled key-value field rendered as native `dt`/`dd` pair. */\nexport class InfoField extends Component<InfoFieldProps> {\n static override liveProps: readonly string[] = []\n render(): CapillaryUiChild {\n const {label, value, children = []} = this.props\n return [\n <dt>{label}</dt>,\n <dd>{value ?? children}</dd>,\n ]\n }\n}\n\nexport interface InfoPanelProps extends ComponentProps {\n id?: string | number | null\n title?: CapillaryUiChild\n label?: string\n}\n\n/** Bordered info panel with an optional heading and key-value field content. */\nexport class InfoPanel extends Component<InfoPanelProps> {\n static override liveProps: readonly string[] = []\n readonly panelId: string\n readonly headerId: string\n\n constructor(props: InfoPanelProps = {}) {\n super(props)\n this.panelId = controlId('info-panel', props.id)\n this.headerId = `${this.panelId}-title`\n }\n\n render(): CapillaryUiChild {\n const {title = null, label, children = []} = this.props\n const Host = this.Host\n const header = title == null\n ? null\n : <Header\n id={`${this.panelId}-header`}\n headingId={this.headerId}\n >{title}</Header>\n\n return <Host\n id={this.panelId}\n role={title == null ? null : 'region'}\n className={componentClass(this.props) || null}\n aria-labelledby={title == null ? null : this.headerId}\n >\n {header}\n <dl aria-label={label ?? null}>{children}</dl>\n </Host>\n }\n\n static override hostName = 'infopanel'\n static override dependencies = [Header, InfoField]\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 user-select: none;\n }\n\n & > dl {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: var(--space-sm, 0.375rem) var(--space-md, 1rem);\n margin: 0;\n padding: var(--panel-padding, 0.75rem);\n }\n\n & > dl > dt {\n font-weight: 600;\n color: var(--info-panel-label-color, var(--ui-muted-text-color));\n }\n\n & > dl > dd {\n margin: 0;\n }\n `\n}\n","import {Component, css} from './component.js'\nimport type {ComponentProps} from './component.js'\nimport {StatusPresentation} from './status/statusPresentation.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 static override dependencies = [StatusPresentation]\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: cap-working-progress .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 @media (prefers-reduced-motion: reduce) {\n &::after {\n animation: none !important;\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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\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 Capillary UI 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 '@capillaryjs/capillary'\nimport type {\n EmitterNotification,\n SubscribeOptions,\n} from '@capillaryjs/capillary'\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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport {ErrorMessage} from '../../status/statusPresentation.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) => CapillaryUiChild\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 override setProps(nextProps: ListViewProps<TItem>): this {\n if (this.ownedItemsEmitter != null) {\n if (isReadableEmitter(nextProps.items)) {\n throw new TypeError(\n 'ListView cannot replace static or declarative items with an emitter',\n )\n }\n this.ownedItemsEmitter.set(nextProps.items ?? [], 'list items changed')\n }\n return super.setProps(nextProps)\n }\n\n initialize(): void {\n this.watch(this.itemsEmitter, this.selectedItemsEmitter)\n }\n\n render(): CapillaryUiChild {\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 ? <ErrorMessage\n className=\"cap-error-banner\"\n error={error}\n fallback={this.capillaryUiMessage('listViewLoadError')}\n />\n : null}\n {isLoading && rows.length === 0\n ? <>\n <p role=\"status\">{this.capillaryUiMessage('listViewLoading')}</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\">{this.capillaryUiMessage('listViewEmpty')}</p>\n : null}\n {rows.length > 0\n ? <ul\n role=\"listbox\"\n aria-label={this.props.label ?? this.capillaryUiMessage('listViewLabel')}\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-cap-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-cap-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, ErrorMessage]\n\n static override hostName = 'listview'\n\n static override css = css`\n & {\n display: flex;\n position: relative;\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\"][aria-busy=\"true\"] > [role=\"option\"]::after {\n content: \"\";\n position: absolute;\n z-index: 1;\n inset: 0;\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n border-radius: inherit;\n animation: cap-working-progress .55s linear infinite;\n pointer-events: 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 margin: 0;\n padding: var(--ui-padding);\n }\n\n &:has(> cap-error) {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > [role=\"listbox\"][aria-busy=\"true\"] > [role=\"option\"]::after {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n &:has(> cap-error) {\n outline: 2px solid Mark;\n outline-offset: -2px;\n }\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): CapillaryUiChild {\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","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 position: relative;\n flex-flow: row wrap;\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 + cap-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 + cap-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 + cap-checkshell {\n outline: 2px solid var(--focus-color, var(--ui-accent-color, Highlight));\n outline-offset: 1px;\n }\n\n & > label > input:disabled + cap-checkshell {\n opacity: 0.6;\n filter: saturate(0.6);\n }\n\n & > label > input[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) + cap-checkshell {\n background: var(--working-background-image), var(--checkbox-box-background,\n var(--ui-input-bg, transparent));\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > label:has(> input[aria-invalid=\"true\"]) {\n color: var(--error-color);\n }\n\n & > label > input[aria-invalid=\"true\"] + cap-checkshell {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > label > input[aria-busy=\"true\"] + cap-checkshell {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > label > input[aria-invalid=\"true\"] + cap-checkshell {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","import {css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild, 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 {ErrorMessage} from '../../status/statusPresentation.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: CapillaryUiChild,\n value: TValue,\n]\n\nconst checkboxLiveProps = ['disabled', 'required', 'busy', '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?: CapillaryUiChild\n /** Text alternative used by Capillary UI's state announcement when `label` is rich content. */\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n busy?: 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 override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n label = this.props.value ?? this.capillaryUiMessage('checkboxOptionLabel'),\n ariaLabel,\n disabled = false,\n required = false,\n busy = 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 localizedStateName = this.localizedStateName(semanticState, stateName)\n const textLabel = ariaLabel ?? textAlternative(label)\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-busy={busy ? 'true' : null}\n aria-label={textLabel == null\n ? null\n : this.capillaryUiMessage('checkboxStateLabel')(textLabel, localizedStateName)}\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 <cap-checkshell aria-hidden=\"true\">{shellSymbol}</cap-checkshell>\n {label}\n </label>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n }\n\n static override hostName = 'check-box'\n\n static override css = css`\n & > label > input[value=\"require\"] + cap-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\"] + cap-checkshell {\n color: var(--palette-contrast-light);\n background: var(--palette-red);\n box-shadow: var(--checkbox-box-shadow-checked);\n }\n `\n\n private localizedStateName(semanticState: TValue, fallback: string): string {\n if (semanticState === FilterMode.Deny) return this.capillaryUiMessage('filterModeDenyLabel')\n if (semanticState === FilterMode.Neutral) return this.capillaryUiMessage('filterModeNeutralLabel')\n if (semanticState === FilterMode.Prefer) return this.capillaryUiMessage('filterModePreferLabel')\n if (semanticState === FilterMode.Require) return this.capillaryUiMessage('filterModeRequireLabel')\n return fallback\n }\n\n}\n\nfunction textAlternative(label: CapillaryUiChild): string | null {\n return typeof label === 'string' || typeof label === 'number'\n ? String(label)\n : null\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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\n\nimport {Component, css} from '../../component.js'\nimport type {ComponentConstructor, ComponentProps, CapillaryUiChild} 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 {ErrorMessage} from '../../status/statusPresentation.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?: CapillaryUiChild\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(): CapillaryUiChild {\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 <ErrorMessage\n className=\"cap-error-banner\"\n error={error}\n fallback={this.capillaryUiMessage('filterPanelLoadError')}\n />\n </Host>\n }\n if (isLoading && values.length === 0) {\n return <Host className={hostClass} aria-busy=\"true\">\n <p role=\"status\">{this.capillaryUiMessage('filterPanelLoading')}</p>\n </Host>\n }\n\n return <Host\n className={hostClass}\n role=\"group\"\n aria-label={this.props.label ?? this.capillaryUiMessage('filterPanelLabel')}\n aria-busy={isLoading ? 'true' : null}\n >\n {fetchState === FetchState.Error\n ? <ErrorMessage\n className=\"cap-error-banner\"\n error={error}\n fallback={this.capillaryUiMessage('filterPanelLoadError')}\n />\n : null}\n {isLoading ? <p role=\"status\">{this.capillaryUiMessage('filterPanelLoading')}</p> : null}\n {values.length === 0\n ? <p>{this.capillaryUiMessage('filterPanelEmpty')}</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, ErrorMessage]\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 user-select: none;\n }\n\n & > p {\n margin: 0;\n }\n\n &[aria-busy=\"true\"]::after {\n content: \"\";\n position: absolute;\n z-index: 1;\n inset: 0;\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n animation: cap-working-progress .55s linear infinite;\n pointer-events: none;\n }\n\n &:has(> cap-error) {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n &[aria-busy=\"true\"]::after {\n animation: none !important;\n }\n }\n `\n}\n\n// Passing a generic class as a runtime vnode erases its state parameter. The\n// concrete props below restore the FilterMode relationship checked by tsc.\nconst FilterModeCheckbox = Checkbox as unknown as ComponentConstructor<\n CheckboxProps<FilterModeValue>\n>\n\nfunction normalizeFilters(\n filters: FilterPanelProps['filters'],\n): Map<FilterValue, FilterModeValue> {\n if (filters == null) return new Map<FilterValue, FilterModeValue>()\n if (filters instanceof Map) return new Map(filters)\n if (Array.isArray(filters)) return new Map(filters)\n throw new TypeError('FilterPanel filters must be a Map or tuple array')\n}\n\nfunction optionValue(option: FilterOptionInput): FilterValue {\n if (typeof option === 'string' || typeof option === 'number') return option\n if (option != null && typeof option === 'object') {\n const value = Reflect.get(option, 'value')\n if (typeof value === 'string' || typeof value === 'number') return value\n }\n throw new TypeError('Filter options must be strings, numbers, or value/label objects')\n}\n\nfunction optionLabel(option: FilterOptionInput): CapillaryUiChild {\n if (option != null && typeof option === 'object') {\n const label = Reflect.get(option, 'label')\n if (label != null) return isCapillaryUiLabel(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 isCapillaryUiLabel(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","import {Component, css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild} 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?: CapillaryUiChild\n /** Text alternative used by Capillary UI-authored sort and filter controls. */\n ariaLabel?: string\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) => CapillaryUiChild\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(): CapillaryUiChild {\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 textLabel = this.props.ariaLabel ?? textAlternative(label) ?? String(this.props.field)\n const filterLabel = this.capillaryUiMessage('tableFilterColumnLabel')(textLabel)\n\n let panel: CapillaryUiChild = 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={this.capillaryUiMessage('tableSortColumnLabel')(textLabel)}\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 cap-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 cap-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 cap-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 cap-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 cap-datatable > table > thead > tr > th[aria-sort] > button.filter:hover {\n opacity: 1;\n }\n `\n}\n\nfunction textAlternative(label: CapillaryUiChild): string | null {\n return typeof label === 'string' || typeof label === 'number'\n ? String(label)\n : null\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, CapillaryUiChild} 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(): CapillaryUiChild {\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.ariaLabel == null ? {} : {ariaLabel: column.ariaLabel})}\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 cap-datatable > table > thead {\n color: var(--table-header-color);\n background: var(--ui-gradient);\n }\n\n cap-datatable > table > thead > tr > th {\n border: 2px groove #fff7;\n border-left: none;\n }\n\n cap-datatable > table > thead > tr > th:last-child {\n border-right: none;\n }\n `\n}\n","import type {UrlLike} from '@capillaryjs/capillary'\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 Capillary UI'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 '@capillaryjs/capillary'\nimport type {\n FetchLike,\n QueryHandlerLike,\n QuerySerializer,\n ReadableEmitter,\n} from '@capillaryjs/capillary'\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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport {ErrorMessage} from '../../status/statusPresentation.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?: CapillaryUiChild\n emptyMessage?: CapillaryUiChild\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(): CapillaryUiChild {\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\">{this.capillaryUiMessage('dataTableLoading')}</p> : null}\n {status === FetchState.Error\n ? <ErrorMessage\n className=\"cap-error-banner\"\n error={error}\n fallback={this.capillaryUiMessage('dataTableLoadError')}\n />\n : null}\n {status === FetchState.Error && typeof this.dataSource?.retry === 'function'\n ? <button\n type=\"button\"\n onClick={() => this.dataSource?.retry?.('table retry')}\n >{this.capillaryUiMessage('dataTableRetry')}</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 ?? this.capillaryUiMessage('dataTableEmpty')}\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 ): CapillaryUiChild {\n const key = this.rowKey(row, index)\n const selected = selectedKeys.has(key)\n return <tr\n key={String(key)}\n data-cap-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(): CapillaryUiChild[] {\n const count = this.props.placeholderCount ?? 5\n return Array.from({length: count}, (_, rowIndex) =>\n <tr key={`placeholder-${rowIndex}`} aria-hidden=\"true\">\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-cap-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, ErrorMessage]\n\n static override hostName = 'data-table'\n\n static css = css`\n & {\n display: block;\n position: relative;\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 position: relative;\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 cap-placeholder {\n font-size: var(--ui-font-size);\n height: var(--ui-font-size);\n }\n\n & > table[aria-busy=\"true\"] > tbody > tr[data-cap-selectable-row] > td::after {\n content: \"\";\n position: absolute;\n z-index: 1;\n inset: 0;\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n animation: cap-working-progress .55s linear infinite;\n pointer-events: none;\n }\n\n &:has(> cap-error) {\n outline: 1px solid var(--error-color);\n outline-offset: -1px;\n }\n\n &:has(> cap-error) > button {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > table[aria-busy=\"true\"] > tbody > tr[data-cap-selectable-row] > td::after {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n &:has(> cap-error) {\n outline: 2px solid Mark;\n }\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): CapillaryUiChild {\n if (value == null || typeof value === 'string' || typeof value === 'number') return value\n return String(value)\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild, Key} from '../../component.js'\n\nexport interface TreeNode<TValue = unknown> {\n id: Key\n label: CapillaryUiChild\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: CapillaryUiChild\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(): CapillaryUiChild {\n return this.props.children ?? []\n }\n}\n","import {DerivedEmitter} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css, isVNode} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild, Key} from '../../component.js'\nimport {componentClass, invoke} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {ErrorMessage} from '../../status/statusPresentation.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 placeholderCount?: number\n selectedKeyEmitter?: ValueEmitter<Key | null>\n expandedKeysEmitter?: ValueEmitter<Key[]>\n renderItem?: (node: TreeNode<TValue>, depth: number) => CapillaryUiChild\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(): CapillaryUiChild {\n const nodes = this.nodesEmitter.get()\n assertTreeNodes(nodes)\n const fetchState = this.nodesEmitter.getFetchState()\n const sourceError = this.nodesEmitter.getError()\n const isLoading = fetchState === FetchState.Initial || fetchState === FetchState.Loading\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 ? <ErrorMessage\n className=\"cap-error-banner\"\n error={sourceError}\n fallback={this.capillaryUiMessage('treeViewLoadError')}\n />\n : null}\n {isLoading && visible.length === 0\n ? <>\n <p role=\"status\">{this.capillaryUiMessage('treeViewLoading')}</p>\n <ul aria-hidden=\"true\">\n {Array.from({length: this.props.placeholderCount ?? 5}, (_, index) => {\n const depth = [0, 1, 2, 1, 0][index % 5] ?? 0\n return <li\n key={`placeholder-${index}`}\n style={{'--tree-depth': depth}}\n >\n <cap-expander>•</cap-expander>\n <Placeholder width={42 + (index % 5) * 9} />\n </li>\n })}\n </ul>\n </>\n : null}\n {fetchState === FetchState.Ready && visible.length === 0\n ? <p role=\"status\">{this.capillaryUiMessage('treeViewEmpty')}</p>\n : null}\n {visible.length > 0\n ? <ul\n role=\"tree\"\n aria-label={this.props.label}\n aria-busy={isLoading ? 'true' : null}\n >\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 <cap-expander aria-hidden=\"true\">\n {hasChildren ? (isExpanded ? '▾' : '▸') : '•'}\n </cap-expander>\n <cap-label\n {...(labelClassName == null ? {} : {className: labelClassName})}\n {...(labelStyle == null ? {} : {style: labelStyle})}\n >{label}</cap-label>\n </li>\n })}\n </ul>\n : null}\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, Placeholder, ErrorMessage]\n\n static override hostName = 'tree-view'\n\n static css = css`\n & {\n display: flex;\n position: relative;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n & > [role=\"tree\"],\n & > ul[aria-hidden=\"true\"] {\n display: grid;\n align-content: start;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n & [role=\"treeitem\"],\n & > ul[aria-hidden=\"true\"] > li {\n display: flex;\n position: relative;\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 & > ul[aria-hidden=\"true\"] cap-placeholder {\n align-self: center;\n height: var(--ui-font-size);\n }\n\n & > [role=\"tree\"][aria-busy=\"true\"] > [role=\"treeitem\"]::after {\n content: \"\";\n position: absolute;\n z-index: 1;\n inset: 0;\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n animation: cap-working-progress .55s linear infinite;\n pointer-events: 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 & cap-expander {\n flex: 0 0 1rem;\n text-align: center;\n }\n\n & [role=\"treeitem\"][aria-expanded] > cap-expander {\n cursor: pointer;\n }\n\n & cap-label {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n & > [role=\"status\"] {\n margin: 0;\n padding: var(--ui-padding, 0.75rem);\n }\n\n &:has(> cap-error) {\n outline: 1px solid var(--error-color);\n outline-offset: -1px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > [role=\"tree\"][aria-busy=\"true\"] > [role=\"treeitem\"]::after {\n animation: none !important;\n }\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 &:has(> cap-error) {\n outline: 2px solid Mark;\n }\n }\n `\n\n private reconcile(nodes: readonly TreeNode<TValue>[]): void {\n assertTreeNodes(nodes)\n const allKeys = new Set(flattenAll(nodes).map(({node}) => node.id))\n const selected = this.selectedKeyEmitter.get()\n if (this.ownedSelectedEmitter != null && selected != null && !allKeys.has(selected)) {\n this.selectedKeyEmitter.set(null, 'selected tree item removed')\n }\n const expanded = this.expandedKeysEmitter.get()\n const retained = expanded.filter((key) => allKeys.has(key))\n if (this.ownedExpandedEmitter != null && !sameKeys(expanded, retained)) {\n this.expandedKeysEmitter.set(retained, 'removed tree expansions reconciled')\n }\n if (this.focusedKey != null && !allKeys.has(this.focusedKey)) this.focusedKey = null\n }\n\n private selectNode(node: TreeNode<TValue>, event: Event): void {\n this.selectedKeyEmitter.set(node.id, 'tree item selected')\n invoke(this.props.onSelect, node, event)\n this.focusRow(node.id)\n }\n\n private toggleExpanded(key: Key): void {\n const expanded = this.expandedKeysEmitter.get()\n const contains = expanded.some((candidate) => Object.is(candidate, key))\n this.expandedKeysEmitter.set(\n contains\n ? expanded.filter((candidate) => !Object.is(candidate, key))\n : [...expanded, key],\n contains ? 'tree item collapsed' : 'tree item expanded',\n )\n }\n\n private handleKeyDown(\n event: KeyboardEvent,\n index: number,\n visible: readonly VisibleNode<TValue>[],\n ): void {\n const current = visible[index]\n if (current == null) return\n if (event.key === 'ArrowDown') return this.move(event, visible[index + 1]?.node.id)\n if (event.key === 'ArrowUp') return this.move(event, visible[index - 1]?.node.id)\n if (event.key === 'Home') return this.move(event, visible[0]?.node.id)\n if (event.key === 'End') return this.move(event, visible.at(-1)?.node.id)\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n const children = current.node.children ?? []\n if (children.length === 0) return\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (!expanded) this.toggleExpanded(current.node.id)\n else this.focusRow(children[0]!.id)\n return\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (expanded) this.toggleExpanded(current.node.id)\n else if (current.parentId != null) this.focusRow(current.parentId)\n return\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.selectNode(current.node, event)\n return\n }\n if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n this.handleTypeahead(event, visible, index)\n }\n }\n\n private move(event: KeyboardEvent, key: Key | undefined): void {\n if (key === undefined) return\n event.preventDefault()\n this.focusRow(key)\n }\n\n private focusRow(key: Key): void {\n this.focusedKey = key\n const rows = this.dom instanceof Element\n ? [...this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')]\n : []\n for (const row of rows) {\n const index = Number(row.dataset.index)\n const visible = flattenVisible(\n this.nodesEmitter.get(),\n new Set(this.expandedKeysEmitter.get()),\n )\n const matches = Object.is(visible[index]?.node.id, key)\n row.tabIndex = matches ? 0 : -1\n if (matches) row.focus()\n }\n }\n\n private handleTypeahead(\n event: KeyboardEvent,\n visible: readonly VisibleNode<TValue>[],\n index: number,\n ): void {\n event.preventDefault()\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.typeahead += event.key.toLocaleLowerCase()\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = ''\n this.typeaheadTimer = null\n }, 650)\n const candidates = [...visible.slice(index + 1), ...visible.slice(0, index + 1)]\n const match = candidates.find(({node}) => textValue(node)\n .toLocaleLowerCase()\n .startsWith(this.typeahead))\n if (match != null) this.focusRow(match.node.id)\n }\n}\n\nfunction extractDeclarativeNodes<TValue>(children: ComponentProps['children']): TreeNode<TValue>[] {\n const values = Array.isArray(children) ? children : children == null ? [] : [children]\n return values.filter((child) => isVNode(child) && child.type === TreeItem).map((child) => {\n if (!isVNode(child)) throw new TypeError('TreeView children must be TreeItem nodes')\n const props = child.props as unknown as TreeItemProps<TValue>\n return {\n id: props.id,\n label: props.label,\n ...(props.textValue == null ? {} : {textValue: props.textValue}),\n ...(props.value === undefined ? {} : {value: props.value}),\n children: extractDeclarativeNodes<TValue>(props.children),\n }\n })\n}\n\nfunction flattenVisible<TValue>(\n nodes: readonly TreeNode<TValue>[],\n expanded: ReadonlySet<Key>,\n): VisibleNode<TValue>[] {\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n if ((node.children?.length ?? 0) > 0 && expanded.has(node.id)) {\n visit(node.children ?? [], depth + 1, node.id)\n }\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction flattenAll<TValue>(nodes: readonly TreeNode<TValue>[]): VisibleNode<TValue>[] {\n const allKeys = new Set<Key>()\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n if (allKeys.has(node.id)) throw new Error(`Duplicate tree item id: ${String(node.id)}`)\n allKeys.add(node.id)\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n visit(node.children ?? [], depth + 1, node.id)\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction textValue<TValue>(node: TreeNode<TValue>): string {\n if (node.textValue != null) return node.textValue\n if (typeof node.label === 'string' || typeof node.label === 'number') return String(node.label)\n return String(node.id)\n}\n\nfunction sameKeys(left: readonly Key[], right: readonly Key[]): boolean {\n return left.length === right.length\n && left.every((value, index) => Object.is(value, right[index]))\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction isExpanderTarget(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest('cap-expander') != null\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, LivePropContract} from '../component.js'\nimport {componentClass, controlId, invoke} from '../controlUtils.js'\nimport {ErrorMessage} from '../status/statusPresentation.js'\n\nconst buttonLiveProps = ['disabled', 'pressed', 'busy', 'error'] as const\n\nexport interface ButtonProps extends ComponentProps,\n LivePropContract<(typeof buttonLiveProps)[number]> {\n label?: CapillaryUiChild\n type?: 'button' | 'reset' | 'submit'\n disabled?: boolean\n pressed?: boolean\n busy?: boolean\n busyLabel?: CapillaryUiChild\n error?: unknown\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 static override dependencies = [ErrorMessage]\n readonly errorId: string\n\n constructor(props: ButtonProps = {}) {\n super(props)\n this.errorId = `${controlId('button', props.id)}-error`\n if (props.onClick != null && typeof props.onClick !== 'function') {\n throw new TypeError('Button onClick must be a function')\n }\n }\n\n render(): CapillaryUiChild {\n const {\n children = [],\n label,\n type = 'button',\n disabled = false,\n pressed,\n busy = false,\n busyLabel,\n error = null,\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 aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onClick={(event: MouseEvent) => {\n if (!unavailable) invoke(onClick, event)\n }}\n >{content}</button>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\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 & {\n display: inline-flex;\n position: relative;\n flex-flow: row wrap;\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 & > button[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--button-background-disabled);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > button[aria-invalid=\"true\"] {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > button[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > button[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","import {Button} from '../menu/button.js'\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, 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 {DeclarativeRegion, readDeclarativeRegions} from '../layout/declarativeRegion.js'\n\nconst dialogLiveProps = ['showCloseButton'] as const\n\n/** Caller-defined actions rendered in a Dialog footer before its close button. */\nexport class DialogActions extends DeclarativeRegion {}\n\nexport interface DialogProps extends ValueControlProps<boolean>,\n LivePropContract<(typeof dialogLiveProps)[number]> {\n id?: string | number | null\n title: CapillaryUiChild\n description?: CapillaryUiChild\n /** @deprecated Supply `<DialogActions>` as a direct child. */\n actions?: never\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(): CapillaryUiChild {\n if (this.props.actions != null) {\n throw new Error('Dialog action content must use a direct DialogActions child')\n }\n const {\n title,\n description,\n closeLabel = this.capillaryUiMessage('dialogCloseLabel'),\n showCloseButton = true,\n children = [],\n } = this.props\n const {content, regions} = readDeclarativeRegions('Dialog', children, {\n actions: DialogActions,\n })\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 <cap-content>{content}</cap-content>\n {regions.actions == null && !showCloseButton ? null : <footer>\n {regions.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, DialogActions]\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 > cap-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 user-select: none;\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 > cap-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: normal;\n box-sizing: border-box;\n user-select: none;\n }\n\n cap-groupbox > cap-content > cap-layout > & {\n align-self: stretch;\n }\n\n & > label {\n align-self: center;\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 & {\n min-width: 0;\n }\n\n & > cap-selectshell {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n isolation: isolate;\n min-height: var(--control-min-height, 2rem);\n min-width: 0;\n box-sizing: border-box;\n margin-left: auto;\n }\n\n & > cap-selectshell > select {\n position: relative;\n z-index: 1;\n min-height: var(--control-min-height, 2rem);\n width: var(--input-width, 15rem);\n max-width: 100%;\n min-width: var(--input-min-width, 6rem);\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 user-select: none;\n white-space: nowrap;\n }\n\n & > cap-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 & > cap-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 & > cap-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 & > cap-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 & > cap-selectshell:has(> select:disabled)::after {\n background: var(--dropdown-underlay-background-disabled);\n border: var(--dropdown-underlay-border-disabled);\n }\n\n & > cap-selectshell > select:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n & > cap-selectshell:has(> select[aria-busy=\"true\"]:not([aria-invalid=\"true\"]))::after {\n background: var(--working-background-image), var(--dropdown-underlay-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > cap-selectshell > select[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--dropdown-select-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > cap-selectshell:has(> select[aria-invalid=\"true\"])::before,\n & > cap-selectshell:has(> select[aria-invalid=\"true\"])::after,\n & > cap-selectshell > select[aria-invalid=\"true\"] {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > cap-selectshell:has(> select[aria-busy=\"true\"])::after,\n & > cap-selectshell > select[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > cap-selectshell::before,\n & > cap-selectshell::after {\n display: none;\n }\n\n & > cap-selectshell > select {\n appearance: auto;\n padding-inline-end: var(--space-sm);\n }\n\n & > cap-selectshell > select[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","import {Emitter, FetchState} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\nimport type {CapillaryUiChild, 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 {ErrorMessage} from '../status/statusPresentation.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?: CapillaryUiChild\n disabled?: boolean\n}\n\nconst dropdownLiveProps = ['disabled', 'required', 'busy', '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?: CapillaryUiChild\n name?: string\n disabled?: boolean\n required?: boolean\n busy?: boolean\n error?: unknown\n placeholder?: CapillaryUiChild\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 static override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n label,\n name,\n disabled = false,\n required = false,\n busy = false,\n error = null,\n placeholder = this.capillaryUiMessage('dropdownPlaceholder'),\n ariaLabel,\n } = this.props\n const options = this.optionsEmitter.get() ?? []\n assertOptions<DropdownOption<TValue>>(options)\n const currentValue = this.valueEmitter.get()\n const optionsState = this.optionsEmitter.getFetchState()\n const sourceBusy = !this.ownsOptionsEmitter\n && (optionsState === FetchState.Initial || optionsState === FetchState.Loading)\n const hasSourceError = !this.ownsOptionsEmitter && optionsState === FetchState.Error\n const sourceError = hasSourceError\n ? this.optionsEmitter.getError()\n : null\n const displayedError = error ?? (hasSourceError\n ? sourceError ?? this.capillaryUiMessage('dropdownLoadError')\n : null)\n const isBusy = busy || sourceBusy\n\n const Host = this.Host\n return <Host\n className={this.hostClass()}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <cap-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-busy={isBusy ? 'true' : null}\n aria-invalid={displayedError == null ? null : 'true'}\n aria-describedby={displayedError == null ? null : this.errorId}\n onChange={(event: Event) => this.selectOption(event)}\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 >{this.optionLabel(option)}</option>\n })}\n </select>\n </cap-selectshell>\n {displayedError == null ? null\n : <ErrorMessage id={this.errorId} error={displayedError} />}\n </Host>\n }\n\n /** Host class list. Subclasses may prepend a stable marker class. */\n protected hostClass(): string {\n return componentClass(this.props)\n }\n\n /** Resolve the rendered label for one option. */\n protected optionLabel(option: DropdownOption<TValue>): CapillaryUiChild {\n return option.label ?? String(option.value)\n }\n\n /** Handle a native select change: resolve the option, update the value, emit. */\n protected selectOption(event: Event): void {\n const raw = eventValue(event, 'dropdown change')\n const options = this.optionsEmitter.get() ?? []\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 this.emitChange(nextValue, option, event)\n }\n\n /** Emit the public change callback. Subclasses may forward extra detail. */\n protected emitChange(\n value: TValue,\n _option: DropdownOption<TValue> | undefined,\n event: Event,\n ): void {\n invoke(this.props.onChange, value, event)\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 && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === '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, CapillaryUiChild, 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?: CapillaryUiChild\n htmlFor?: string\n}\n\nexport class Label extends Component<LabelProps> {\n static override liveProps = labelLiveProps\n\n render(): CapillaryUiChild {\n const {text, htmlFor, children} = this.props\n return <label\n className={componentClass(this.props) || undefined}\n htmlFor={htmlFor}\n data-cap-component=\"label\"\n >\n {text ?? children}\n </label>\n }\n}\n","import {Component, css} from '../component.js'\nimport type {\n ComponentProps,\n CapillaryUiChild,\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 {ErrorMessage} from '../status/statusPresentation.js'\nimport {CheckableControl} from './CheckableControl.js'\n\nexport type RadioOption<TValue extends Key = string> = readonly [\n value: TValue,\n label: CapillaryUiChild,\n]\n\nconst radioButtonLiveProps = ['checked', 'disabled', 'required', 'busy', 'error'] as const\nconst radioGroupLiveProps = ['disabled', 'required', 'busy', 'error'] as const\n\nexport interface RadioButtonProps extends ComponentProps,\n LivePropContract<(typeof radioButtonLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n name?: string\n value?: Key\n checked?: boolean\n disabled?: boolean\n required?: boolean\n busy?: 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 static override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n label = this.props.value ?? this.capillaryUiMessage('radioOptionLabel'),\n checked = false,\n disabled = false,\n required = false,\n busy = 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-busy={busy ? 'true' : null}\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 <cap-checkshell aria-hidden=\"true\" />\n {label}\n </label>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n }\n\n static override hostName = 'radio-button'\n\n static override css = css`\n & > label > input[type=\"radio\"] + cap-checkshell {\n border-radius: 50%;\n }\n\n & > label > input[type=\"radio\"]:checked + cap-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?: CapillaryUiChild\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 /** Loading presentation; does not disable the group. */\n busy?: 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, ErrorMessage]\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(): CapillaryUiChild {\n const {\n options = [],\n label,\n disabled = false,\n required = false,\n busy = false,\n error = null,\n } = 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-busy={busy ? '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 busy={busy && error == null}\n onChange={(checked, event) => {\n if (checked) this.selectOption(value, event)\n }}\n />)}\n </fieldset>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\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 & {\n position: relative;\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 & > fieldset[aria-invalid=\"true\"] cap-checkshell {\n border-color: var(--error-color);\n }\n\n & > fieldset[aria-invalid=\"true\"] cap-radiobutton > label {\n color: var(--error-color);\n }\n\n @media (forced-colors: active) {\n & > fieldset[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\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 {CapillaryUiChild, 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 {ErrorMessage} from '../status/statusPresentation.js'\nimport {LabeledInputControl} from './LabeledInputControl.js'\n\nconst textboxLiveProps = ['disabled', 'required', 'readOnly', 'busy', 'error'] as const\n\nexport interface TextboxProps extends ValueControlProps<string>,\n LivePropContract<(typeof textboxLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n placeholder?: string\n type?: string\n name?: string\n disabled?: boolean\n required?: boolean\n readOnly?: boolean\n busy?: 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 static override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n label,\n placeholder,\n type = 'text',\n name,\n disabled = false,\n required = false,\n readOnly = false,\n busy = 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-busy={busy ? 'true' : 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 : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n }\n\n static override hostName = 'textbox'\n\n static override css = css`\n & {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n justify-content: center;\n min-height: var(--control-min-height, 2rem);\n min-width: 0;\n line-height: normal;\n }\n\n & > input {\n min-height: var(--control-min-height, 2rem);\n width: var(--input-width, 15rem);\n max-width: 100%;\n min-width: var(--input-min-width, 6rem);\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 margin-left: auto;\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 & > input[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--input-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > input:disabled[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--input-background-disabled);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n }\n\n & > input[aria-invalid=\"true\"] {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > input[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > input[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\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 {css} from '../component.js'\nimport type {CapillaryUiChild, Key, LivePropContract} from '../component.js'\nimport {LabeledInputControl} from './LabeledInputControl.js'\nimport {\n assertOptions,\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\nimport {ErrorMessage} from '../status/statusPresentation.js'\n\nexport type ToggleOption<TValue extends Key = string> = readonly [\n value: TValue,\n label: CapillaryUiChild,\n]\n\nconst toggleLiveProps = ['disabled', 'required', 'busy', '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?: CapillaryUiChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n busy?: 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 LabeledInputControl<ToggleProps<TValue>> {\n static override liveProps = toggleLiveProps\n static override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n options = [],\n label,\n disabled = false,\n required = false,\n busy = 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 : <cap-label id={this.legendId}>{label}</cap-label>}\n <cap-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-busy={busy ? '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>)}</cap-options>\n {error == null ? null : <ErrorMessage id={this.errorId} error={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 min-height: var(--control-min-height, 2rem);\n display: flex;\n position: relative;\n flex-flow: row nowrap;\n align-content: center;\n align-items: center;\n gap: .75em;\n color: var(--text-color);\n outline: none;\n }\n\n & > cap-label {\n display: block;\n align-self: center;\n }\n\n & > cap-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 margin-left: auto;\n }\n\n & > cap-options > button[role=\"radio\"] {\n min-height: var(--control-min-height, 2rem);\n position: relative;\n font-family: inherit;\n font-size: var(--ui-font-size);\n color: var(--button-color);\n background: var(--toggle-button-background);\n user-select: none;\n white-space: nowrap;\n box-sizing: border-box;\n border: var(--button-border);\n border-left: none;\n border-right: none;\n border-radius: 0;\n box-shadow: var(--toggle-button-shadow);\n cursor: default;\n }\n\n & > cap-options > button[role=\"radio\"]:hover:not(:disabled)[aria-checked=\"false\"] {\n background: var(--button-background-hover);\n }\n\n & > cap-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 & > cap-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 & > cap-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 & > cap-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: none;\n margin-inline: var(--toggle-button-selected-inline-overlap);\n z-index: var(--toggle-button-selected-z-index);\n }\n\n & > cap-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 & > cap-options[aria-busy=\"true\"]:not([aria-invalid=\"true\"])\n > button[role=\"radio\"] {\n background: var(--working-background-image), var(--toggle-button-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > cap-options[aria-busy=\"true\"]:not([aria-invalid=\"true\"])\n > button[role=\"radio\"][aria-checked=\"true\"] {\n background: var(--working-background-image), var(--toggle-button-background-checked);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n }\n\n & > cap-options[aria-invalid=\"true\"] > button[role=\"radio\"] {\n border-color: var(--error-color);\n }\n\n & > cap-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 @media (prefers-reduced-motion: reduce) {\n & > cap-options[aria-busy=\"true\"] > button[role=\"radio\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > cap-options[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n\nfunction validateToggleOptions<TValue extends Key>(\n options: unknown,\n): asserts options is readonly ToggleOption<TValue>[] {\n assertOptions<unknown>(options)\n for (const option of options) {\n if (!Array.isArray(option) || option.length < 2) {\n throw new TypeError('Toggle options must be [value, label] tuples')\n }\n }\n}\n","const CIVIL_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/\n\nconst DAY_MILLISECONDS = 86_400_000\n\n/**\n * A wall-clock date in ISO-8601 `YYYY-MM-DD` form.\n * @experimental This type is experimental and may change in any release.\n */\nexport type CivilDate = string\n\n/** @experimental This interface is experimental and may change in any release. */\nexport interface CivilDateParts {\n readonly year: number\n readonly month: number\n readonly day: number\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function isCivilDate(value: unknown): value is CivilDate {\n if (typeof value !== 'string') return false\n return CIVIL_DATE_PATTERN.test(value) && parseCivilDate(value) != null\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function parseCivilDate(value: CivilDate | string | null | undefined): CivilDateParts | null {\n if (value == null) return null\n const match = CIVIL_DATE_PATTERN.exec(value)\n if (match == null) return null\n const year = Number(match[1])\n const month = Number(match[2])\n const day = Number(match[3])\n const milliseconds = Date.UTC(year, month - 1, day)\n const parsed = new Date(milliseconds)\n if (\n Number.isNaN(milliseconds)\n || parsed.getUTCFullYear() !== year\n || parsed.getUTCMonth() !== month - 1\n || parsed.getUTCDate() !== day\n ) {\n return null\n }\n return {year, month, day}\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function formatCivilDate(parts: CivilDateParts): CivilDate {\n const year = String(parts.year).padStart(4, '0')\n const month = String(parts.month).padStart(2, '0')\n const day = String(parts.day).padStart(2, '0')\n const candidate = `${year}-${month}-${day}` as CivilDate\n if (parseCivilDate(candidate) == null) {\n throw new TypeError(`Invalid civil date: ${candidate}`)\n }\n return candidate\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function civilDateToDay(value: CivilDate): number {\n const parts = parseCivilDate(value)\n if (parts == null) throw new TypeError(`Invalid civil date: ${value}`)\n return Math.floor(Date.UTC(parts.year, parts.month - 1, parts.day) / DAY_MILLISECONDS)\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function dayToCivilDate(day: number): CivilDate {\n if (!Number.isInteger(day)) throw new TypeError('Civil day must be an integer')\n return new Date(day * DAY_MILLISECONDS).toISOString().slice(0, 10) as CivilDate\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function addCivilDays(value: CivilDate, days: number): CivilDate {\n if (!Number.isInteger(days)) throw new TypeError('Civil date offset must be an integer')\n return dayToCivilDate(civilDateToDay(value) + days)\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function todayCivilDate(now: Date = new Date()): CivilDate {\n if (!(now instanceof Date) || Number.isNaN(now.getTime())) {\n throw new TypeError('todayCivilDate requires a valid Date')\n }\n return `${String(now.getFullYear()).padStart(4, '0')}-${String(\n now.getMonth() + 1,\n ).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}` as CivilDate\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function compareCivilDates(left: CivilDate, right: CivilDate): number {\n return civilDateToDay(left) - civilDateToDay(right)\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function daysInMonth(year: number, month: number): number {\n const next = month === 12 ? {year: year + 1, month: 1} : {year, month: month + 1}\n const first = Date.UTC(next.year, next.month - 1, 1)\n const previous = new Date(first - DAY_MILLISECONDS)\n return previous.getUTCDate()\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function startOfMonthDay(year: number, month: number): number {\n return new Date(Date.UTC(year, month - 1, 1)).getUTCDay()\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function addMonths(year: number, month: number, delta: number): {year: number; month: number} {\n const total = (year * 12 + (month - 1)) + delta\n const nextYear = Math.floor(total / 12)\n const nextMonth = ((total % 12) + 12) % 12 + 1\n return {year: nextYear, month: nextMonth}\n}\n","import {Component, h} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../../component.js'\nimport type {CivilDate} from './civilDate.js'\nimport {\n addCivilDays,\n addMonths,\n compareCivilDates,\n daysInMonth,\n formatCivilDate,\n parseCivilDate,\n startOfMonthDay,\n} from './civilDate.js'\n\nexport interface CalendarProps extends ComponentProps {\n value: CivilDate | null\n focusedDate: CivilDate\n viewYear: number\n viewMonth: number\n min?: CivilDate | null | undefined\n max?: CivilDate | null | undefined\n today: CivilDate\n onSelect: (date: CivilDate, event: Event) => void\n onFocusedDateChange: (date: CivilDate) => void\n onViewChange: (year: number, month: number) => void\n onCancel: () => void\n}\n\nexport class Calendar extends Component<CalendarProps> {\n render(): CapillaryUiChild {\n const {\n value,\n focusedDate,\n viewYear,\n viewMonth,\n min,\n max,\n today,\n onSelect,\n onFocusedDateChange,\n onViewChange,\n onCancel,\n } = this.props\n\n const focusedParts = parseCivilDate(focusedDate)\n const selectedParts = value == null ? null : parseCivilDate(value)\n\n const monthStartDay = startOfMonthDay(viewYear, viewMonth)\n const totalDays = daysInMonth(viewYear, viewMonth)\n const rowCount = Math.ceil((monthStartDay + totalDays) / 7)\n const locale = this.localization.locale\n\n const focusedDayId = `cap-calendar-day-${focusedDate}`\n\n const move = (delta: number): void => {\n const base = focusedParts ?? parseCivilDate(today)!\n const next = addCivilDays(formatCivilDate(base), delta)\n this.clampAndMove(next, viewYear, viewMonth, onFocusedDateChange, onViewChange)\n }\n\n const setMonth = (delta: number): void => {\n const nextMonth = addMonths(viewYear, viewMonth, delta)\n const currentFocusedParts = parseCivilDate(focusedDate)\n const baseParts = currentFocusedParts ?? parseCivilDate(today)!\n const clampedDay = Math.min(baseParts.day, daysInMonth(nextMonth.year, nextMonth.month))\n const next = formatCivilDate({\n year: nextMonth.year,\n month: nextMonth.month,\n day: clampedDay,\n })\n this.clampAndMove(next, viewYear, viewMonth, onFocusedDateChange, onViewChange)\n }\n\n const goToStart = (): void => {\n const next = formatCivilDate({year: viewYear, month: viewMonth, day: 1})\n this.clampAndMove(next, viewYear, viewMonth, onFocusedDateChange, onViewChange)\n }\n\n const goToEnd = (): void => {\n const next = formatCivilDate({year: viewYear, month: viewMonth, day: totalDays})\n this.clampAndMove(next, viewYear, viewMonth, onFocusedDateChange, onViewChange)\n }\n\n const rows: CapillaryUiChild[] = []\n for (let row = 0; row < rowCount; row += 1) {\n const cells: CapillaryUiChild[] = []\n for (let col = 0; col < 7; col += 1) {\n const dayNumber = row * 7 + col - monthStartDay + 1\n if (dayNumber < 1 || dayNumber > totalDays) {\n cells.push(<td role=\"gridcell\" key={`empty-${row}-${col}`} />)\n continue\n }\n const parts: {year: number; month: number; day: number} = {\n year: viewYear,\n month: viewMonth,\n day: dayNumber,\n }\n const date = formatCivilDate(parts)\n const isSelected = value != null && date === value\n const isToday = date === today\n const isFocused = date === focusedDate\n const isDisabled = this.isDisabledDate(date, min, max)\n const dayId = `cap-calendar-day-${date}`\n\n cells.push(\n <td role=\"gridcell\" key={date}>\n <button\n id={dayId}\n type=\"button\"\n tabIndex={isFocused ? 0 : -1}\n data-focused={isFocused ? 'true' : null}\n data-day={String(dayNumber)}\n aria-selected={isSelected ? 'true' : null}\n aria-disabled={isDisabled ? 'true' : null}\n data-today={isToday ? 'true' : null}\n data-selected={isSelected ? 'true' : null}\n disabled={isDisabled}\n onClick={(event: MouseEvent) => {\n if (!isDisabled) onSelect(date, event)\n }}\n >\n {formatCalendarDay(dayNumber, locale)}\n </button>\n </td>,\n )\n }\n rows.push(<tr role=\"row\" key={row}>{cells}</tr>)\n }\n\n const monthLabel = formatCalendarMonth(viewYear, viewMonth, locale)\n const dayLabels = calendarDayLabels(locale)\n\n return (\n <div className=\"cap-calendar\">\n <div className=\"cap-calendar-header\">\n <button\n type=\"button\"\n aria-label={this.capillaryUiMessage('calendarPreviousMonthLabel')}\n onClick={() => setMonth(-1)}\n >\n {'<'}\n </button>\n <span role=\"heading\" aria-level=\"3\">{monthLabel}</span>\n <button\n type=\"button\"\n aria-label={this.capillaryUiMessage('calendarNextMonthLabel')}\n onClick={() => setMonth(1)}\n >\n {'>'}\n </button>\n </div>\n <table\n role=\"grid\"\n aria-label={this.capillaryUiMessage('calendarGridLabel')}\n tabIndex={-1}\n onKeyDown={(event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault()\n move(-1)\n break\n case 'ArrowRight':\n event.preventDefault()\n move(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n move(-7)\n break\n case 'ArrowDown':\n event.preventDefault()\n move(7)\n break\n case 'PageUp':\n event.preventDefault()\n setMonth(-1)\n break\n case 'PageDown':\n event.preventDefault()\n setMonth(1)\n break\n case 'Home':\n event.preventDefault()\n goToStart()\n break\n case 'End':\n event.preventDefault()\n goToEnd()\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n if (!this.isDisabledDate(focusedDate, min, max)) {\n const fakeEvent = new MouseEvent('click', {bubbles: true})\n onSelect(focusedDate, fakeEvent)\n }\n break\n case 'Escape':\n event.preventDefault()\n onCancel()\n break\n }\n }}\n >\n <thead>\n <tr role=\"row\">\n {dayLabels.map(({index, short, long}) => (\n <th scope=\"col\" role=\"columnheader\" key={index}>\n <span aria-label={long}>{short}</span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>{rows}</tbody>\n </table>\n </div>\n )\n }\n\n private isDisabledDate(\n date: CivilDate,\n min: CivilDate | null | undefined,\n max: CivilDate | null | undefined,\n ): boolean {\n if (min != null && compareCivilDates(date, min) < 0) return true\n if (max != null && compareCivilDates(date, max) > 0) return true\n return false\n }\n\n private clampAndMove(\n next: CivilDate,\n viewYear: number,\n viewMonth: number,\n onFocusedDateChange: (date: CivilDate) => void,\n onViewChange: (year: number, month: number) => void,\n ): void {\n const parts = parseCivilDate(next)!\n if (parts.year !== viewYear || parts.month !== viewMonth) {\n onViewChange(parts.year, parts.month)\n }\n onFocusedDateChange(next)\n }\n\n static override css = ''\n}\n\ninterface CalendarDayLabel {\n readonly index: number\n readonly short: string\n readonly long: string\n}\n\nconst calendarDayLabelCache = new Map<string, readonly CalendarDayLabel[]>()\nconst calendarDayNumberFormatterCache = new Map<string, Intl.NumberFormat>()\n\nfunction calendarDayLabels(locale: string | undefined): readonly CalendarDayLabel[] {\n const cacheKey = locale ?? ''\n const cached = calendarDayLabelCache.get(cacheKey)\n if (cached != null) return cached\n\n const shortFormatter = new Intl.DateTimeFormat(locale, {\n calendar: 'gregory',\n weekday: 'short',\n })\n const longFormatter = new Intl.DateTimeFormat(locale, {\n calendar: 'gregory',\n weekday: 'long',\n })\n const labels = Object.freeze(Array.from({length: 7}, (_, index) => {\n const date = new Date(2026, 0, 4 + index, 12, 0, 0)\n return Object.freeze({\n index,\n short: shortFormatter.format(date),\n long: longFormatter.format(date),\n })\n }))\n calendarDayLabelCache.set(cacheKey, labels)\n return labels\n}\n\nfunction formatCalendarMonth(\n year: number,\n month: number,\n locale: string | undefined,\n): string {\n return new Intl.DateTimeFormat(locale, {\n calendar: 'gregory',\n month: 'long',\n year: 'numeric',\n }).format(new Date(year, month - 1, 15, 12, 0, 0))\n}\n\nfunction formatCalendarDay(day: number, locale: string | undefined): string {\n const cacheKey = locale ?? ''\n let formatter = calendarDayNumberFormatterCache.get(cacheKey)\n if (formatter == null) {\n formatter = new Intl.NumberFormat(locale, {useGrouping: false})\n calendarDayNumberFormatterCache.set(cacheKey, formatter)\n }\n return formatter.format(day)\n}\n","import {css} from '../../component.js'\nimport type {CapillaryUiChild, 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 {ErrorMessage} from '../../status/statusPresentation.js'\nimport {LabeledInputControl} from '../LabeledInputControl.js'\nimport {Calendar} from './Calendar.js'\nimport type {CivilDate} from './civilDate.js'\nimport {\n compareCivilDates,\n formatCivilDate,\n isCivilDate,\n parseCivilDate,\n todayCivilDate,\n} from './civilDate.js'\n\nconst datePickerLiveProps = ['disabled', 'required', 'readOnly', 'busy', 'error'] as const\n\nexport interface DatePickerProps extends ValueControlProps<CivilDate | null>,\n LivePropContract<(typeof datePickerLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n readOnly?: boolean\n busy?: boolean\n error?: unknown\n min?: CivilDate | undefined\n max?: CivilDate | undefined\n placeholder?: string | undefined\n inputRef?: Ref<HTMLInputElement>\n onInput?: (value: CivilDate | null, event: Event) => void\n onChange?: (value: CivilDate | null, event: Event) => void\n}\n\n/** @experimental This component is experimental and may change in any release. */\nexport class DatePicker extends LabeledInputControl<DatePickerProps> {\n static override liveProps = datePickerLiveProps\n static dependencies = [Calendar, ErrorMessage]\n readonly inputId: string\n readonly errorId: string\n readonly popupId: string\n readonly valueEmitter: ValueEmitter<CivilDate | null>\n private isOpen: boolean = false\n private opening: boolean = false\n private viewYear: number\n private viewMonth: number\n private focusedDate: CivilDate\n private lastValue: CivilDate | null = null\n private popupRef: {current: HTMLDialogElement | null} = {current: null}\n private inputElement: HTMLInputElement | null = null\n private wasOpen: boolean = false\n private focusCalendarOnOpen: boolean = false\n\n constructor(props: DatePickerProps = {}) {\n super(props)\n this.inputId = controlId('datepicker', props.id)\n this.errorId = `${this.inputId}-error`\n this.popupId = `${this.inputId}-popup`\n this.valueEmitter = createValueEmitter(this, props, null, 'datepicker value')\n const value = this.valueEmitter.get()\n this.lastValue = value\n const base = value ?? todayCivilDate()\n const parts = parseCivilDate(base)!\n this.viewYear = parts.year\n this.viewMonth = parts.month\n this.focusedDate = base\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n private syncFromValue(): void {\n const value = this.valueEmitter.get()\n if (value !== this.lastValue) {\n this.lastValue = value\n const base = value ?? todayCivilDate()\n const parts = parseCivilDate(base)!\n this.viewYear = parts.year\n this.viewMonth = parts.month\n this.focusedDate = base\n }\n }\n\n private setValue(value: CivilDate | null, event: Event): void {\n if (this.valueEmitter.get() === value) return\n this.valueEmitter.set(value, 'datepicker selection')\n invoke(this.props.onInput, value, event)\n }\n\n private handleClickOutside = (event: MouseEvent): void => {\n if (!this.isOpen || this.dom == null) return\n const target = event.target as Node | null\n if (target == null) return\n if (!this.dom.contains(target)) this.close()\n }\n\n private open(focusCalendar: boolean = false): void {\n if (this.isOpen) return\n this.isOpen = true\n this.opening = true\n this.focusCalendarOnOpen = focusCalendar\n const value = this.valueEmitter.get()\n const base = value ?? todayCivilDate()\n const parts = parseCivilDate(base)!\n this.viewYear = parts.year\n this.viewMonth = parts.month\n this.focusedDate = base\n document.addEventListener('mousedown', this.handleClickOutside)\n this.update()\n }\n\n private close(): void {\n if (!this.isOpen) return\n this.isOpen = false\n this.opening = false\n document.removeEventListener('mousedown', this.handleClickOutside)\n this.update()\n }\n\n onDestroy(): void {\n document.removeEventListener('mousedown', this.handleClickOutside)\n }\n\n private handleInput(event: Event): void {\n if (event.type === 'change') {\n // The value has already been set by input events; report commit.\n invoke(this.props.onChange, this.valueEmitter.get(), event)\n return\n }\n const input = event.currentTarget as HTMLInputElement\n const raw = input.value\n if (raw === '') {\n this.setValue(null, event)\n return\n }\n if (isCivilDate(raw)) {\n this.setValue(raw, event)\n return\n }\n // Invalid typed text: do not overwrite the value, but still call onInput with null\n // so the application can decide how to react.\n invoke(this.props.onInput, null, event)\n }\n\n private handleSelect(date: CivilDate, _event: Event): void {\n if (this.isDisabledDate(date)) return\n if (this.valueEmitter.get() === date) {\n this.close()\n return\n }\n this.valueEmitter.set(date, 'datepicker selection')\n invoke(this.props.onChange, date, new Event('change', {bubbles: true}))\n this.close()\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.close()\n return\n }\n if (event.key === 'ArrowDown' || event.key === 'Enter') {\n event.preventDefault()\n this.open(true)\n return\n }\n }\n\n private handleCalendarKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Tab' || event.key === 'Escape') {\n if (event.key === 'Escape') {\n this.close()\n }\n return\n }\n // Calendar handles arrow/page/enter internally and calls onFocusedDateChange/onViewChange.\n // We do not stop propagation for those.\n }\n\n private isDisabledDate(date: CivilDate): boolean {\n const {min, max} = this.props\n if (min != null && compareCivilDates(date, min) < 0) return true\n if (max != null && compareCivilDates(date, max) > 0) return true\n return false\n }\n\n private ensureFocusable(): void {\n if (this.isDisabledDate(this.focusedDate)) {\n const value = this.valueEmitter.get()\n if (value != null && !this.isDisabledDate(value)) {\n this.focusedDate = value\n } else {\n const today = todayCivilDate()\n if (!this.isDisabledDate(today)) {\n this.focusedDate = today\n } else {\n const parts = parseCivilDate(today)!\n this.focusedDate = formatCivilDate({\n year: parts.year,\n month: parts.month,\n day: 1,\n })\n }\n }\n }\n }\n\n afterUpdate(): void {\n if (this.isOpen && this.opening) {\n this.opening = false\n if (this.focusCalendarOnOpen) {\n const activeDay = this.popupRef.current?.querySelector<HTMLElement>('button[data-focused=\"true\"]')\n if (activeDay != null) activeDay.focus()\n }\n } else if (!this.isOpen && this.wasOpen) {\n if (this.inputElement != null) {\n this.inputElement.focus()\n }\n }\n this.wasOpen = this.isOpen\n }\n\n render(): CapillaryUiChild {\n this.syncFromValue()\n\n const {\n label,\n ariaLabel,\n placeholder,\n disabled = false,\n required = false,\n readOnly = false,\n busy = false,\n error = null,\n inputRef,\n onInput,\n onChange,\n } = this.props\n\n const value = this.valueEmitter.get()\n this.ensureFocusable()\n\n const Host = this.Host\n const dialogRef = (element: HTMLDialogElement | null) => {\n this.popupRef.current = element\n }\n const inputCallback = (element: HTMLInputElement | null) => {\n this.inputElement = element\n if (typeof inputRef === 'function') {\n inputRef(element)\n } else if (inputRef != null) {\n inputRef.current = element\n }\n }\n\n return (\n <Host className={componentClass(this.props) || null}>\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <input\n id={this.inputId}\n type=\"text\"\n value={value ?? ''}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n readOnly={readOnly}\n aria-label={label == null ? ariaLabel : null}\n aria-busy={busy ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n aria-haspopup=\"dialog\"\n aria-expanded={this.isOpen}\n aria-controls={this.isOpen ? this.popupId : null}\n onInput={(event: Event) => this.handleInput(event)}\n onChange={(event: Event) => this.handleInput(event)}\n onClick={() => !readOnly && !disabled && this.open(true)}\n onKeyDown={(event: KeyboardEvent) => this.handleKeyDown(event)}\n ref={inputCallback}\n />\n <button\n type=\"button\"\n disabled={disabled || readOnly}\n tabIndex={-1}\n aria-label={this.capillaryUiMessage('datePickerOpenCalendarLabel')}\n onClick={() => !readOnly && !disabled && this.open(true)}\n >\n {'▼'}\n </button>\n {this.isOpen ? (\n <dialog\n id={this.popupId}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={this.capillaryUiMessage('datePickerDialogLabel')}\n open\n ref={dialogRef}\n onKeyDown={(event: KeyboardEvent) => this.handleCalendarKeyDown(event)}\n >\n <Calendar\n value={value}\n focusedDate={this.focusedDate}\n viewYear={this.viewYear}\n viewMonth={this.viewMonth}\n min={this.props.min}\n max={this.props.max}\n today={todayCivilDate()}\n onSelect={(date, event) => this.handleSelect(date, event)}\n onFocusedDateChange={(date) => {\n this.focusedDate = date\n this.update()\n }}\n onViewChange={(year, month) => {\n this.viewYear = year\n this.viewMonth = month\n this.update()\n }}\n onCancel={() => this.close()}\n />\n </dialog>\n ) : null}\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n )\n }\n\n static override hostName = 'datepicker'\n\n static override css = css`\n & {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n gap: 0.5em;\n position: relative;\n min-height: var(--control-min-height, 2rem);\n min-width: 0;\n }\n\n & > input {\n min-height: var(--control-min-height, 2rem);\n width: var(--input-width, 10rem);\n max-width: 100%;\n min-width: var(--input-min-width, 6rem);\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 user-select: text;\n cursor: text;\n }\n\n & > input:disabled,\n & > input[readonly] {\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 & > button {\n min-height: var(--control-min-height, 2rem);\n min-width: 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 cursor: pointer;\n font: inherit;\n user-select: none;\n }\n\n & > button:disabled {\n color: var(--input-color-disabled);\n background: var(--input-background-disabled);\n cursor: not-allowed;\n }\n\n & > dialog {\n position: absolute;\n inset-block-start: 100%;\n inset-inline-start: 0;\n z-index: 1;\n margin: 0.25em 0 0;\n padding: 0.5em;\n min-width: 16rem;\n background: var(--island-background, var(--application-background));\n border: var(--island-border, var(--input-border));\n border-radius: var(--radius-md);\n box-shadow: var(--island-shadow, var(--input-shadow));\n color: var(--ui-color);\n }\n\n & > dialog::backdrop {\n display: none;\n }\n\n & > input[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--input-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > input[aria-invalid=\"true\"] {\n border-color: var(--error-color);\n }\n\n & > dialog .cap-calendar {\n display: inline-block;\n font: inherit;\n user-select: none;\n }\n\n & > dialog .cap-calendar .cap-calendar-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 0.5em;\n padding: 0.25em 0.5em;\n font: inherit;\n text-align: center;\n }\n\n & > dialog .cap-calendar .cap-calendar-header button {\n min-inline-size: 2em;\n min-block-size: 2em;\n padding: 0.25em;\n cursor: pointer;\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] {\n border-collapse: collapse;\n width: 100%;\n font: inherit;\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] th,\n & > dialog .cap-calendar table[role=\"grid\"] td {\n padding: 0.125em;\n text-align: center;\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] th {\n font-weight: 600;\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] td button {\n inline-size: 2em;\n block-size: 2em;\n padding: 0;\n border: 1px solid transparent;\n border-radius: var(--radius-sm, 0.25rem);\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] td button:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] td button[data-today=\"true\"] {\n border-color: var(--palette-primary-500);\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] td button[data-selected=\"true\"] {\n background: var(--palette-primary-500);\n color: var(--palette-primary-contrast);\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] td button:disabled,\n & > dialog .cap-calendar table[role=\"grid\"] td button[aria-disabled=\"true\"] {\n color: var(--input-color-disabled);\n cursor: not-allowed;\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > input[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > input[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n\n & > dialog .cap-calendar table[role=\"grid\"] td button[data-selected=\"true\"] {\n outline: 2px solid ButtonText;\n }\n }\n `\n}\n","const TIME_PATTERN = /^(\\d{2}):(\\d{2})$/\n\n/**\n * A wall-clock time in `HH:mm` form.\n * @experimental This type is experimental and may change in any release.\n */\nexport type TimeString = string\n\n/** @experimental This interface is experimental and may change in any release. */\nexport interface TimeParts {\n readonly hours: number\n readonly minutes: number\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function isTimeString(value: unknown): value is TimeString {\n if (typeof value !== 'string') return false\n return TIME_PATTERN.test(value) && parseTime(value) != null\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function parseTime(value: TimeString | string | null | undefined): TimeParts | null {\n if (value == null) return null\n const match = TIME_PATTERN.exec(value)\n if (match == null) return null\n const hours = Number(match[1])\n const minutes = Number(match[2])\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null\n return {hours, minutes}\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function formatTime(parts: TimeParts): TimeString {\n if (parts.hours < 0 || parts.hours > 23 || parts.minutes < 0 || parts.minutes > 59) {\n throw new TypeError(`Invalid time parts: ${JSON.stringify(parts)}`)\n }\n const hours = String(parts.hours).padStart(2, '0')\n const minutes = String(parts.minutes).padStart(2, '0')\n return `${hours}:${minutes}` as TimeString\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function timeToMinutes(value: TimeString): number {\n const parts = parseTime(value)\n if (parts == null) throw new TypeError(`Invalid time: ${value}`)\n return parts.hours * 60 + parts.minutes\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function minutesToTime(minutes: number): TimeString {\n if (!Number.isInteger(minutes) || minutes < 0 || minutes >= 24 * 60) {\n throw new TypeError(`Invalid time minutes: ${minutes}`)\n }\n return formatTime({hours: Math.floor(minutes / 60), minutes: minutes % 60})\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function timeStepOptions(\n min: TimeString | null | undefined,\n max: TimeString | null | undefined,\n step: number,\n): {value: TimeString; label: string}[] {\n if (!Number.isInteger(step) || step <= 0) throw new TypeError('Time step must be a positive integer')\n const minMinutes = min == null ? 0 : timeToMinutes(min)\n const maxMinutes = max == null ? (24 * 60 - 1) : timeToMinutes(max)\n if (maxMinutes < minMinutes) throw new TypeError('max time must be >= min time')\n const options: {value: TimeString; label: string}[] = []\n for (let minutes = minMinutes; minutes <= maxMinutes; minutes += step) {\n const value = minutesToTime(minutes)\n options.push({value, label: value})\n }\n return options\n}\n","import {css} from '../../component.js'\nimport type {CapillaryUiChild, 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 {ErrorMessage} from '../../status/statusPresentation.js'\nimport {SelectControl} from '../SelectControl.js'\nimport type {TimeString} from './timeString.js'\nimport {formatTime, isTimeString, parseTime, timeStepOptions} from './timeString.js'\n\nconst timePickerLiveProps = ['disabled', 'required', 'busy', 'error'] as const\n\nexport interface TimePickerProps extends ValueControlProps<TimeString | null>,\n LivePropContract<(typeof timePickerLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n busy?: boolean\n error?: unknown\n min?: TimeString | undefined\n max?: TimeString | undefined\n step?: number | undefined\n placeholder?: string | undefined\n onInput?: (value: TimeString | null, event: Event) => void\n onChange?: (value: TimeString | null, event: Event) => void\n}\n\n/** @experimental This component is experimental and may change in any release. */\nexport class TimePicker extends SelectControl<TimePickerProps> {\n static override liveProps = timePickerLiveProps\n static override dependencies = [ErrorMessage]\n readonly inputId: string\n readonly errorId: string\n readonly valueEmitter: ValueEmitter<TimeString | null>\n private options: {value: TimeString; label: string}[] = []\n private selectElement: HTMLSelectElement | null = null\n\n constructor(props: TimePickerProps = {}) {\n super(props)\n this.inputId = controlId('timepicker', props.id)\n this.errorId = `${this.inputId}-error`\n this.valueEmitter = createValueEmitter(this, props, null, 'timepicker value')\n this.maybeClampToRequired()\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n private getCurrentOptions(): {value: TimeString; label: string}[] {\n const {min, max, step = 30} = this.props\n return timeStepOptions(min, max, step)\n }\n\n private maybeClampToRequired(): void {\n const {required} = this.props\n if (!required) return\n const options = this.getCurrentOptions()\n if (this.valueEmitter.get() == null && options.length > 0) {\n const first = options[0]\n if (first != null) this.valueEmitter.set(first.value)\n }\n }\n\n private handleChange(event: Event): void {\n const target = event.currentTarget as HTMLSelectElement\n const raw = target.value\n let value: TimeString | null\n if (raw === '') {\n value = null\n } else if (isTimeString(raw)) {\n value = raw\n } else {\n value = null\n }\n this.applyValue(value, event)\n }\n\n private applyValue(value: TimeString | null, event: Event): void {\n if (this.valueEmitter.get() !== value) {\n this.valueEmitter.set(value, 'timepicker selection')\n }\n const {onInput, onChange} = this.props\n if (event.type === 'input') {\n invoke(onInput, value, event)\n } else if (event.type === 'change') {\n invoke(onChange, value, event)\n }\n }\n\n private resolveDisplayValue(): TimeString | '' {\n const value = this.valueEmitter.get()\n if (value == null) return ''\n if (this.options.some((option) => option.value === value)) return value\n const parts = parseTime(value)\n if (parts == null) return ''\n return formatTime(parts)\n }\n\n private applySelection(): void {\n if (this.selectElement == null) return\n const currentValue = this.resolveDisplayValue()\n const index = [...this.selectElement.options].findIndex(\n (option) => option.value === currentValue,\n )\n if (index !== -1 && this.selectElement.selectedIndex !== index) {\n this.selectElement.selectedIndex = index\n }\n }\n\n afterMount(): void {\n this.applySelection()\n }\n\n afterUpdate(): void {\n this.maybeClampToRequired()\n this.applySelection()\n }\n\n render(): CapillaryUiChild {\n const {\n label,\n ariaLabel,\n placeholder = this.capillaryUiMessage('timePickerPlaceholder'),\n disabled = false,\n required = false,\n busy = false,\n error = null,\n } = this.props\n\n this.options = this.getCurrentOptions()\n const currentValue = this.resolveDisplayValue()\n\n const Host = this.Host\n return (\n <Host className={componentClass(this.props) || null}>\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <cap-selectshell>\n <select\n id={this.inputId}\n value={currentValue}\n ref={(element: HTMLSelectElement | null) => { this.selectElement = element }}\n disabled={disabled}\n required={required}\n aria-label={label == null ? ariaLabel : null}\n aria-busy={busy ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onInput={(event: Event) => this.handleChange(event)}\n onChange={(event: Event) => this.handleChange(event)}\n >\n {currentValue === '' ? (\n <option value=\"\" selected={true} disabled={required}>\n {placeholder}\n </option>\n ) : null}\n {currentValue !== '' && !this.options.some((option) => option.value === currentValue) ? (\n <option value={currentValue} selected={true}>\n {currentValue}\n </option>\n ) : null}\n {this.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n selected={currentValue === option.value}\n >\n {option.label}\n </option>\n ))}\n </select>\n </cap-selectshell>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n )\n }\n\n static override hostName = 'timepicker'\n\n static override css = css`\n & > cap-selectshell > select {\n min-width: 7rem;\n }\n `\n}\n","import {Emitter} from '@capillaryjs/capillary'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild, LivePropContract} from '../../component.js'\nimport {componentClass, controlId, createValueEmitter, invoke} from '../../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../../controlUtils.js'\nimport {ErrorMessage} from '../../status/statusPresentation.js'\nimport type {CivilDate} from './civilDate.js'\nimport {DatePicker} from './DatePicker.js'\nimport {TimePicker} from './TimePicker.js'\nimport type {TimeString} from './timeString.js'\n\nconst dateTimePickerLiveProps = ['disabled', 'required', 'busy', 'error'] as const\n\nexport interface DateTimeValue {\n date: CivilDate | null\n time: TimeString | null\n}\n\nexport interface DateTimePickerProps extends ValueControlProps<DateTimeValue | null>,\n LivePropContract<(typeof dateTimePickerLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n busy?: boolean\n error?: unknown\n minDate?: CivilDate | undefined\n maxDate?: CivilDate | undefined\n minTime?: TimeString | undefined\n maxTime?: TimeString | undefined\n timeStep?: number | undefined\n datePlaceholder?: string | undefined\n timePlaceholder?: string | undefined\n onInput?: (value: DateTimeValue | null, event: Event) => void\n onChange?: (value: DateTimeValue | null, event: Event) => void\n}\n\n/** @experimental This component is experimental and may change in any release. */\nexport class DateTimePicker extends Component<DateTimePickerProps> {\n static override liveProps = dateTimePickerLiveProps\n static dependencies = [DatePicker, TimePicker, ErrorMessage]\n readonly valueEmitter: ValueEmitter<DateTimeValue | null>\n readonly datePart: ValueEmitter<CivilDate | null>\n readonly timePart: ValueEmitter<TimeString | null>\n readonly errorId: string\n private lastParent: DateTimeValue | null = null\n private parentUnsubscribe: (() => void) | null = null\n\n constructor(props: DateTimePickerProps = {}) {\n super(props)\n this.errorId = controlId('datetimepicker-error', props.id)\n this.valueEmitter = createValueEmitter(this, props, null, 'datetime value')\n const initial = this.valueEmitter.get() ?? {date: null, time: null}\n this.datePart = new Emitter<CivilDate | null>(initial.date, {\n owner: this,\n purpose: 'datetime date part',\n })\n this.timePart = new Emitter<TimeString | null>(initial.time, {\n owner: this,\n purpose: 'datetime time part',\n })\n this.lastParent = this.valueEmitter.get()\n }\n\n initialize(): void {\n this.parentUnsubscribe = this.valueEmitter.subscribe(({value}) => {\n if (!dateTimeEqual(value, this.lastParent)) {\n this.lastParent = value\n this.syncChildren(value)\n }\n })\n }\n\n onDestroy(): void {\n this.parentUnsubscribe?.()\n }\n\n private syncChildren(value: DateTimeValue | null): void {\n const next = value ?? {date: null, time: null}\n if (this.datePart.get() !== next.date) this.datePart.set(next.date)\n if (this.timePart.get() !== next.time) this.timePart.set(next.time)\n }\n\n private handlePartChange(_part: 'date' | 'time', event: Event): void {\n const nextDate = this.datePart.get()\n const nextTime = this.timePart.get()\n const next = nextDate == null && nextTime == null ? null : {date: nextDate, time: nextTime}\n const changed = !dateTimeEqual(this.valueEmitter.get(), next)\n if (changed) {\n this.valueEmitter.set(next, 'datetime part change')\n this.lastParent = next\n }\n const {onInput, onChange} = this.props\n if (event.type === 'input' && changed) {\n invoke(onInput, next, event)\n } else if (event.type === 'change') {\n invoke(onChange, this.valueEmitter.get(), event)\n }\n }\n\n render(): CapillaryUiChild {\n const {\n label,\n ariaLabel,\n disabled = false,\n required = false,\n busy = false,\n error = null,\n minDate,\n maxDate,\n minTime,\n maxTime,\n timeStep = 30,\n datePlaceholder,\n timePlaceholder,\n } = this.props\n\n const Host = this.Host\n return (\n <Host className={componentClass(this.props) || null}>\n <fieldset\n aria-label={label == null ? ariaLabel : null}\n aria-required={required ? 'true' : null}\n aria-busy={busy ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n disabled={disabled}\n >\n {label != null ? <legend>{label}</legend> : null}\n <DatePicker\n ariaLabel={this.capillaryUiMessage('dateTimePickerDateLabel')}\n valueEmitter={this.datePart}\n disabled={disabled}\n required={required}\n busy={busy && error == null}\n min={minDate}\n max={maxDate}\n placeholder={datePlaceholder}\n onInput={(_value, event) => this.handlePartChange('date', event)}\n onChange={(_value, event) => this.handlePartChange('date', event)}\n />\n <TimePicker\n ariaLabel={this.capillaryUiMessage('dateTimePickerTimeLabel')}\n valueEmitter={this.timePart}\n disabled={disabled}\n required={required}\n busy={busy && error == null}\n min={minTime}\n max={maxTime}\n step={timeStep}\n placeholder={timePlaceholder}\n onInput={(_value, event) => this.handlePartChange('time', event)}\n onChange={(_value, event) => this.handlePartChange('time', event)}\n />\n </fieldset>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n )\n }\n\n static override hostName = 'datetimepicker'\n\n static override css = css`\n & {\n display: block;\n position: relative;\n min-width: 0;\n }\n\n & > fieldset {\n margin: 0;\n padding: 0;\n min-inline-size: 0;\n border: 0;\n display: flex;\n flex-flow: row wrap;\n align-items: flex-start;\n gap: 0.5em;\n width: 100%;\n }\n\n & > fieldset > legend {\n display: block;\n width: 100%;\n padding: 0;\n margin: 0 0 0.25em;\n font: inherit;\n user-select: none;\n }\n\n & > fieldset[aria-invalid=\"true\"] cap-datepicker > input,\n & > fieldset[aria-invalid=\"true\"] cap-timepicker > cap-selectshell::before,\n & > fieldset[aria-invalid=\"true\"] cap-timepicker > cap-selectshell::after,\n & > fieldset[aria-invalid=\"true\"] cap-timepicker > cap-selectshell > select {\n border-color: var(--error-color);\n }\n\n @media (forced-colors: active) {\n & > fieldset[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n\nfunction dateTimeEqual(\n left: DateTimeValue | null,\n right: DateTimeValue | null,\n): boolean {\n if (left === right) return true\n if (left == null || right == null) return false\n return left.date === right.date && left.time === right.time\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from '../layout/layoutTraits.js'\nimport {layoutParticipantClass} from '../controlUtils.js'\n\nexport interface ToolbarProps extends ComponentProps, CapillaryUiLayoutParticipantProps {\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(): CapillaryUiChild {\n const {\n children = [],\n id,\n label = this.capillaryUiMessage('toolbarLabel'),\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={layoutParticipantClass(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(--toolbar-spacing, 1.5rem);\n padding: var(--ui-padding);\n user-select: none;\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 '@capillaryjs/capillary'\n\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {StatusPresentation} from './statusPresentation.js'\n\nexport interface ProgressBarProps extends ComponentProps {\n id?: string | number | null\n label: CapillaryUiChild\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 static override dependencies = [StatusPresentation]\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(): CapillaryUiChild {\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 ? this.capillaryUiMessage('progressInProgress')\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 <cap-content aria-hidden=\"true\">\n <cap-progress\n style={percentage == null ? undefined : {\n '--progress-width': `${percentage}%`,\n '--progress-inverse-width': `${10000 / Math.max(percentage, 1)}%`,\n }}\n ><cap-inverse>{this.props.label}</cap-inverse></cap-progress>\n <cap-label>{this.props.label}</cap-label>\n </cap-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 & > cap-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 user-select: none;\n }\n\n & > cap-content > cap-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 & > cap-content > cap-progress > cap-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 & > cap-content > cap-label {\n position: relative;\n z-index: 0;\n display: block;\n height: 100%;\n white-space: nowrap;\n }\n\n &:has(> progress:indeterminate) > cap-content > cap-progress {\n display: none;\n }\n\n &:has(> progress:indeterminate) > cap-content > cap-label {\n z-index: 2;\n }\n\n &:has(> progress:indeterminate) > cap-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: cap-working-progress .55s linear infinite;\n opacity: .5;\n }\n\n @media (prefers-reduced-motion: reduce) {\n &:has(> progress:indeterminate) > cap-content::after {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > cap-content {\n border: 1px solid CanvasText;\n background: Canvas;\n box-shadow: none;\n color: CanvasText;\n }\n\n & > cap-content > cap-progress {\n background: Highlight;\n box-shadow: none;\n }\n\n & > cap-content > cap-progress > cap-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 CapillaryUiStylesheetKind = 'theme' | 'colors'\nexport type CapillaryUiAppearance = 'light' | 'dark' | 'system'\nexport type CapillaryUiThemeAppearanceCapability = 'light' | 'dark' | 'adaptive'\n\nexport interface CapillaryUiStylesheetOption {\n value: string\n label: string\n href: string\n}\n\nexport interface CapillaryUiThemeOption extends CapillaryUiStylesheetOption {\n /** Appearance modes the selected theme deliberately supports. */\n appearance: CapillaryUiThemeAppearanceCapability\n}\n\nexport type CapillaryUiThemeVariableLayer = 'palette' | 'theme'\nexport type CapillaryUiThemeVariableValue =\n | 'background'\n | 'border'\n | 'color'\n | 'dimension'\n | 'duration'\n | 'font'\n | 'opacity'\n | 'radius'\n | 'shadow'\n\nexport interface CapillaryUiThemeVariableDefinition {\n name: `--${string}`\n layer: CapillaryUiThemeVariableLayer\n family: string\n value: CapillaryUiThemeVariableValue\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 capillaryUiThemeVariableCatalog = 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 CapillaryUiThemeVariableDefinition[])\n\nexport const capillaryUiThemeOptions = 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 capillaryUiColorOptions = 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 Capillary UI presentation stylesheets. */\nexport function replaceCapillaryUiStylesheet(\n kind: CapillaryUiStylesheetKind,\n selection: CapillaryUiStylesheetOption,\n targetDocument: Document = globalThis.document,\n): HTMLLinkElement {\n assertOption(selection)\n if (targetDocument?.head == null || targetDocument.documentElement == null) {\n throw new TypeError('replaceCapillaryUiStylesheet requires a document with a head and root')\n }\n\n const selector = `link[data-cap-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.capStylesheet = kind\n targetDocument.head.append(link)\n }\n link.dataset.capSelection = 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 Capillary UI theme resolves its light and dark mappings.\n * `system` removes the root attribute so the browser preference applies.\n */\nexport function setCapillaryUiAppearance(\n appearance: CapillaryUiAppearance,\n targetDocument: Document = globalThis.document,\n): void {\n if (targetDocument?.documentElement == null) {\n throw new TypeError('setCapillaryUiAppearance requires a document with a root')\n }\n if (appearance !== 'light' && appearance !== 'dark' && appearance !== 'system') {\n throw new TypeError('Capillary UI 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 getCapillaryUiAppearance(\n targetDocument: Document = globalThis.document,\n): CapillaryUiAppearance {\n if (targetDocument?.documentElement == null) {\n throw new TypeError('getCapillaryUiAppearance 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 findCapillaryUiStylesheetOption(\n options: readonly CapillaryUiStylesheetOption[],\n value: string,\n): CapillaryUiStylesheetOption {\n const selection = options.find((option) => option.value === value)\n if (selection == null) throw new RangeError(`Unknown Capillary UI stylesheet selection: ${value}`)\n return selection\n}\n\nfunction variable(\n name: CapillaryUiThemeVariableDefinition['name'],\n layer: CapillaryUiThemeVariableLayer,\n family: string,\n value: CapillaryUiThemeVariableValue,\n description: string,\n fallback?: CapillaryUiThemeVariableDefinition['fallback'],\n): CapillaryUiThemeVariableDefinition {\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): CapillaryUiStylesheetOption {\n return Object.freeze({value, label, href})\n}\n\nfunction themeOption(\n value: string,\n label: string,\n href: string,\n appearance: CapillaryUiThemeAppearanceCapability,\n): CapillaryUiThemeOption {\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 CapillaryUiStylesheetOption {\n if (option == null || typeof option !== 'object') {\n throw new TypeError('Capillary UI 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(`Capillary UI stylesheet option ${field} must be a non-empty string`)\n }\n }\n}\n","import type {CapillaryUiChild, LivePropContract} from '../component.js'\nimport {\n classNames,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps} from '../controlUtils.js'\nimport {Dropdown} from '../lineinputs/dropdown.js'\nimport type {DropdownOption} from '../lineinputs/dropdown.js'\nimport {\n findCapillaryUiStylesheetOption,\n capillaryUiColorOptions,\n capillaryUiThemeOptions,\n replaceCapillaryUiStylesheet,\n} from '../../styling/theme.js'\nimport type {\n CapillaryUiStylesheetKind,\n CapillaryUiStylesheetOption,\n} from '../../styling/theme.js'\n\nexport interface StylesheetPickerProps extends ValueControlProps<string>,\n LivePropContract<'disabled'> {\n id?: string | number | null\n label?: CapillaryUiChild\n ariaLabel?: string\n disabled?: boolean\n options?: readonly CapillaryUiStylesheetOption[]\n targetDocument?: Document\n onChange?: (value: string, option: CapillaryUiStylesheetOption, event: Event) => void\n}\n\n/**\n * A {@link Dropdown} that applies a Capillary UI stylesheet (theme or color set) when\n * the selection changes. Renders as a regular `cap-dropdown` host carrying a\n * `cap-<kind>-picker` class, so it inherits all standard dropdown styling and\n * behavior while adding stylesheet resolution and localized option labels.\n */\nabstract class StylesheetPicker extends Dropdown<string> {\n private readonly kind: CapillaryUiStylesheetKind\n private readonly stylesheetOptions: readonly CapillaryUiStylesheetOption[]\n private readonly customOptions: boolean\n private readonly targetDocument: Document | undefined\n private readonly changeHandler?: StylesheetPickerProps['onChange']\n\n constructor(\n props: StylesheetPickerProps,\n kind: CapillaryUiStylesheetKind,\n defaults: readonly CapillaryUiStylesheetOption[],\n ) {\n const stylesheetOptions = props.options ?? defaults\n validateOptions(stylesheetOptions)\n const {options: _options, targetDocument, onChange, ...dropdownProps} = props\n super({\n ...dropdownProps,\n options: stylesheetOptions,\n })\n this.kind = kind\n this.stylesheetOptions = stylesheetOptions\n this.customOptions = props.options != null\n this.targetDocument = targetDocument\n this.changeHandler = onChange\n findCapillaryUiStylesheetOption(stylesheetOptions, this.valueEmitter.get())\n }\n\n protected override hostClass(): string {\n return classNames(`cap-${this.kind}-picker`, super.hostClass())\n }\n\n protected override optionLabel(option: DropdownOption<string>): CapillaryUiChild {\n if (this.customOptions) return super.optionLabel(option)\n switch (`${this.kind}:${option.value}`) {\n case 'theme:java': return this.capillaryUiMessage('themeOptionJavaLabel')\n case 'theme:minimal': return this.capillaryUiMessage('themeOptionMinimalLabel')\n case 'theme:shiny': return this.capillaryUiMessage('themeOptionShinyLabel')\n case 'colors:gray': return this.capillaryUiMessage('colorOptionGrayLabel')\n case 'colors:green': return this.capillaryUiMessage('colorOptionGreenLabel')\n case 'colors:iceblue': return this.capillaryUiMessage('colorOptionIceBlueLabel')\n case 'colors:ocean': return this.capillaryUiMessage('colorOptionOceanLabel')\n case 'colors:orange': return this.capillaryUiMessage('colorOptionOrangeLabel')\n case 'colors:purple': return this.capillaryUiMessage('colorOptionPurpleLabel')\n case 'colors:red': return this.capillaryUiMessage('colorOptionRedLabel')\n case 'colors:yellow': return this.capillaryUiMessage('colorOptionYellowLabel')\n default: return super.optionLabel(option)\n }\n }\n\n protected override emitChange(\n value: string,\n _option: DropdownOption<string> | undefined,\n event: Event,\n ): void {\n invoke(this.changeHandler, value,\n findCapillaryUiStylesheetOption(this.stylesheetOptions, value), event)\n }\n\n override afterMount(dom: ChildNode | null): void {\n super.afterMount(dom)\n this.applySelection()\n }\n\n override afterUpdate(dom: ChildNode | null): void {\n super.afterUpdate(dom)\n this.applySelection()\n }\n\n private applySelection(): void {\n const targetDocument = this.targetDocument\n ?? (typeof document === 'undefined' ? null : document)\n if (targetDocument == null) return\n replaceCapillaryUiStylesheet(\n this.kind,\n findCapillaryUiStylesheetOption(this.stylesheetOptions, this.valueEmitter.get()),\n targetDocument,\n )\n }\n}\n\nexport class ThemePicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'theme', capillaryUiThemeOptions)\n }\n}\n\nexport class ColorPicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'colors', capillaryUiColorOptions)\n }\n}\n\nfunction validateOptions(\n options: readonly CapillaryUiStylesheetOption[],\n): asserts options is readonly CapillaryUiStylesheetOption[] {\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","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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\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 {CapillaryUiChild, 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?: CapillaryUiChild\n component?: CapillaryUiChild\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: CapillaryUiChild\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(): CapillaryUiChild {\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, CapillaryUiChild, 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(): CapillaryUiChild {\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 CapillaryUiChild,\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(): CapillaryUiChild {\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","layoutDirectionFromProps","props","fallback","componentName","horizontal","vertical","layoutDirectionClassName","direction","layoutAllocationClassName","allocation","FilterMode","isFilterMode","value","mode","nextControlId","controlId","prefix","provided","createValueEmitter","component","purpose","assertEmitter","initialValue","options","Emitter","name","classNames","values","componentClass","layoutParticipantClass","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","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","isExternalDestination","NavigationBar","validateNavigation","Breadcrumb","validateBreadcrumb","last","CapillaryUiApp","before","targetDocument","parentDocument","dependency","_children","_key","classAlias","className","_island","sizing","layout","landmark","hostProps","rootClassName","mergeClassNames","sizingClassName","landmarkRole","mountCapillaryUiApp","runtime","appType","CapillaryUiRuntime","caller","merged","Header","level","Heading","GroupBox","header","StatusPresentation","ErrorMessage","formatErrorMessage","error","isMessageError","isDerivedErrors","messages","entry","DeclarativeRegion","readDeclarativeRegions","supportedRegions","entries","regions","type","isDeclarativeRegionType","required","OptionGroupHeaderEnd","optionGroupLiveProps","OptionGroup","headerEnd","ariaLabel","busy","OptionsBox","Layout","role","scroll","panelLiveProps","PanelToolbar","Panel","orientation","title","SidebarToolbar","Sidebar","SplitPane","scrolls","SplitPrimary","SplitSecondary","SplitView","primary","axis","_b","resize","coordinate","_c","decreaseKey","increaseKey","primarySize","primaryLabel","secondaryLabel","primaryMinSize","secondaryMinSize","resizeStep","separatorLabel","resizable","validateCSSSize","validateNonNegativeNumber","validatePositiveNumber","secondary","readSplitPanes","withFallbackLabel","requestedSize","host","separator","extent","separatorExtent","primaryMin","secondaryMin","maximum","size","bounds","total","percentage","flattenChildren","flattened","visit","pane","DescriptionItem","term","DescriptionList","InfoField","InfoPanel","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","range","isCommandPressed","mergeByKey","key","candidate","candidateIndex","startIndex","endIndex","createSelectionHandler","source","eventOrCause","notification","length","result","keys","ListView","isReadableEmitter","normalizeKeyGetter","status","isLoading","FetchState","_","defaultItemLabel","dom","itemKey","isRenderablePrimitive","CheckableControl","checkboxLiveProps","Checkbox","componentType","validateSymbols","currentIndex","nextValue","semanticState","semanticIndex","symbol","shellSymbol","stateName","localizedStateName","textLabel","textAlternative","checked","isCheckedSemanticState","symbols","tuple","FilterPanel","isEmitterLike","fetchState","filters","normalizeFilters","filterModes","defaultSemanticState","activeValues","optionValue","hostClass","optionLabel","FilterModeCheckbox","nextState","_dom","emitter","existing","isCapillaryUiLabel","TableHeaderCell","currentSort","isFilterSelectionEntry","filterLabel","panel","TableHeader","column","DefaultTableFilterEncoding","serializeTableQuery","url","sort","assertUrlLike","assertSort","field","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","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","pressed","busyLabel","normalContent","unavailable","dialogLiveProps","DialogActions","Dialog","description","closeLabel","showCloseButton","element","dialog","shouldOpen","showModal","focusInitial","restore","ref","_QuadCheckbox","QuadCheckbox","_TriCheckbox","TriCheckbox","LabeledInputControl","SelectControl","dropdownLiveProps","Dropdown","suppliedOptions","firstValue","placeholder","currentValue","optionsState","sourceBusy","hasSourceError","displayedError","isBusy","eventValue","_option","labelLiveProps","Label","text","htmlFor","radioButtonLiveProps","radioGroupLiveProps","RadioButton","RadioGroup","validateRadioOptions","selectedValue","textboxLiveProps","Textbox","readOnly","autoComplete","inputMode","minLength","maxLength","pattern","inputRef","onInput","onChange","toggleLiveProps","Toggle","validateToggleOptions","selectedIndex","radio","CIVIL_DATE_PATTERN","DAY_MILLISECONDS","isCivilDate","parseCivilDate","year","month","day","milliseconds","parsed","formatCivilDate","parts","civilDateToDay","dayToCivilDate","addCivilDays","days","todayCivilDate","now","compareCivilDates","daysInMonth","startOfMonthDay","addMonths","delta","nextYear","nextMonth","Calendar","focusedDate","viewYear","viewMonth","min","max","today","onSelect","onFocusedDateChange","onViewChange","onCancel","focusedParts","monthStartDay","totalDays","rowCount","locale","move","base","setMonth","baseParts","clampedDay","goToStart","goToEnd","cells","col","dayNumber","date","isToday","isFocused","isDisabled","dayId","formatCalendarDay","monthLabel","formatCalendarMonth","dayLabels","calendarDayLabels","fakeEvent","short","long","calendarDayLabelCache","calendarDayNumberFormatterCache","cacheKey","cached","shortFormatter","longFormatter","labels","formatter","datePickerLiveProps","DatePicker","focusCalendar","activeDay","dialogRef","inputCallback","TIME_PATTERN","isTimeString","parseTime","hours","minutes","formatTime","timeToMinutes","minutesToTime","timeStepOptions","step","minMinutes","maxMinutes","timePickerLiveProps","TimePicker","dateTimePickerLiveProps","DateTimePicker","initial","dateTimeEqual","_part","nextDate","nextTime","changed","minDate","maxDate","minTime","maxTime","timeStep","datePlaceholder","timePlaceholder","_value","Toolbar","ProgressBar","sourceValue","valueText","capillaryUiThemeVariableCatalog","paletteRamp","variable","capillaryUiThemeOptions","themeOption","distributedAssetUrl","capillaryUiColorOptions","replaceCapillaryUiStylesheet","kind","selection","assertOption","selector","link","setCapillaryUiAppearance","appearance","getCapillaryUiAppearance","findCapillaryUiStylesheetOption","layer","family","stop","href","packageRelativePath","StylesheetPicker","defaults","stylesheetOptions","validateOptions","_options","dropdownProps","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","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/Components/layout/layoutTraits.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/navigation/breadcrumb.tsx","../src/Components/app/app.tsx","../src/Components/layout/header.tsx","../src/Components/layout/groupBox.tsx","../src/Components/status/statusPresentation.tsx","../src/Components/layout/declarativeRegion.ts","../src/Components/layout/optionGroup.tsx","../src/Components/layout/optionsBox.tsx","../src/Components/layout/layout.tsx","../src/Components/layout/panel.tsx","../src/Components/layout/sidebar.tsx","../src/Components/layout/splitView.tsx","../src/Components/data/descriptionList.tsx","../src/Components/data/infoPanel.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/lineinputs/datetime/TemporalInput.tsx","../src/Components/lineinputs/datetime/civilDate.ts","../src/Components/lineinputs/datetime/DatePicker.tsx","../src/Components/lineinputs/datetime/timeString.ts","../src/Components/lineinputs/datetime/TimePicker.tsx","../src/Components/lineinputs/datetime/localDateTime.ts","../src/Components/lineinputs/datetime/DateTimePicker.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, CapillaryUiChild, Key} from '../../component.js'\nimport type {LiteralRouteDescriptor} from '../../../routing/route.js'\n\nexport interface TabProps extends ComponentProps {\n id?: Key\n label?: CapillaryUiChild\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(): CapillaryUiChild {\n return this.props.children ?? []\n }\n}\n","/** Direction in which a supported component arranges application-owned children. */\nexport type CapillaryUiLayoutDirection = 'horizontal' | 'vertical'\n\n/** Main-axis participation of a supported component in its containing layout. */\nexport type CapillaryUiLayoutAllocation = 'natural' | 'flexible'\n\n/** Opt-in contract for components whose host intentionally participates in layout. */\nexport interface CapillaryUiLayoutParticipantProps {\n allocation?: CapillaryUiLayoutAllocation\n}\n\n/** Concise, mutually exclusive direction modifiers for intentional layout components. */\nexport type CapillaryUiLayoutDirectionProps =\n | {horizontal: boolean, vertical?: never}\n | {horizontal?: never, vertical: boolean}\n\n/** Presentation context a container declares for its descendants. */\nexport type CapillaryUiPresentationContext = 'control' | 'form'\n\n/**\n * Opt-in contract for containers that declare a presentation context.\n * The nearest marked ancestor wins: descendants read context through\n * inherited CSS custom properties, so a nested marker overrides an outer one.\n */\nexport interface CapillaryUiPresentationContextProps {\n context?: CapillaryUiPresentationContext\n}\n\n/** Compatibility form for components that retain an established default direction. */\nexport type CapillaryUiOptionalLayoutDirectionProps =\n | CapillaryUiLayoutDirectionProps\n | {horizontal?: never, vertical?: never}\n\n/** Resolve boolean direction modifiers, with an optional compatibility fallback. */\nexport function layoutDirectionFromProps(\n props: {horizontal?: boolean, vertical?: boolean},\n fallback?: CapillaryUiLayoutDirection,\n componentName = 'Layout component',\n): CapillaryUiLayoutDirection {\n const {horizontal = false, vertical = false} = props\n if (horizontal && vertical) {\n throw new TypeError(`${componentName} cannot be both horizontal and vertical`)\n }\n if (horizontal) return 'horizontal'\n if (vertical) return 'vertical'\n if (fallback != null) return fallback\n throw new TypeError(`${componentName} requires either horizontal or vertical`)\n}\n\nexport function layoutDirectionClassName(direction: CapillaryUiLayoutDirection): string {\n if (direction === 'horizontal') return 'cap-layout-horizontal'\n if (direction === 'vertical') return 'cap-layout-vertical'\n throw new TypeError('Layout direction must be horizontal or vertical')\n}\n\nexport function layoutAllocationClassName(\n allocation: CapillaryUiLayoutAllocation | null | undefined,\n): string | undefined {\n if (allocation == null) return undefined\n if (allocation === 'natural') return 'cap-size-natural'\n if (allocation === 'flexible') return 'cap-size-flexible'\n throw new TypeError('Layout allocation must be natural or flexible')\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 Capillary UI'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 '@capillaryjs/capillary'\nimport type {EmitterOptions, ReadableEmitter} from '@capillaryjs/capillary'\n\nimport type {Component, ComponentProps} from './component.js'\nimport {layoutAllocationClassName} from './layout/layoutTraits.js'\nimport type {CapillaryUiLayoutParticipantProps} from './layout/layoutTraits.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 `cap-${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\n/** Build the host class for a component that intentionally exposes allocation. */\nexport function layoutParticipantClass(\n props: Pick<ComponentProps, 'class' | 'className'> & CapillaryUiLayoutParticipantProps,\n): string {\n return classNames(componentClass(props), layoutAllocationClassName(props.allocation))\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, CapillaryUiChild, 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?: CapillaryUiChild\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(): CapillaryUiChild {\n const {\n tabs = [],\n label = this.capillaryUiMessage('tabLineLabel'),\n baseId = 'cap-tabs',\n } = 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, CapillaryUiChild} 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 CapillaryUiRuntime')\n this.closeScope = router.openScope(this.props.context, this)\n }\n\n render(): CapillaryUiChild {\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 {CapillaryUiChild, 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: CapillaryUiChild): CapillaryUiChild {\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, CapillaryUiChild, 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?: CapillaryUiChild\n disabled?: boolean\n content?: CapillaryUiChild\n component?: CapillaryUiChild\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: CapillaryUiChild\n disabled: boolean\n content: CapillaryUiChild\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(): CapillaryUiChild {\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\"] > cap-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, CapillaryUiChild} 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 CapillaryUiRuntime')\n this.watch(router.transition)\n }\n\n render(): CapillaryUiChild {\n const router = this._runtime.router\n if (router == null) throw new Error('RouteLink requires a router in CapillaryUiRuntime')\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, CapillaryUiChild, Key} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from '../layout/layoutTraits.js'\nimport {layoutParticipantClass} 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\n/**\n * A navigation destination outside the current router, rendered as a native\n * anchor. Used for cross-application or cross-origin links where the router\n * must not intercept activation.\n */\nexport interface ExternalDestination {\n readonly kind: 'external'\n readonly href: string\n}\n\nexport function isExternalDestination(value: unknown): value is ExternalDestination {\n return value != null\n && typeof value === 'object'\n && (value as {kind?: unknown}).kind === 'external'\n}\n\ninterface NavigationBarItemBase {\n id: Key\n label: CapillaryUiChild\n disabled?: boolean\n target?: string\n download?: string | boolean\n title?: string\n onClick?: (event: MouseEvent) => void\n}\n\n/** A router-owned destination with optional route-current matching. */\nexport interface NavigationBarRouteItem extends NavigationBarItemBase {\n to: RouteDescriptor | RouteTarget | ResolvedRoute\n exact?: boolean\n}\n\n/** An application-controlled native-link destination outside the current router. */\nexport interface NavigationBarExternalItem extends NavigationBarItemBase {\n to: ExternalDestination\n /** External links have no router-current state, so exact matching is invalid. */\n exact?: never\n}\n\n/** One router-aware or application-controlled destination in a NavigationBar. */\nexport type NavigationBarItem = NavigationBarRouteItem | NavigationBarExternalItem\n\nexport interface NavigationBarProps extends ComponentProps, CapillaryUiLayoutParticipantProps {\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(): CapillaryUiChild {\n validateNavigation(this.props)\n const Host = this.Host\n return <Host className={layoutParticipantClass(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 : isExternalDestination(item.to)\n ? <a\n href={item.to.href}\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}</a>\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 user-select: none;\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 destination')\n if (isExternalDestination(item.to)) {\n if (typeof item.to.href !== 'string' || item.to.href.trim() === '') {\n throw new TypeError('External navigation item requires a non-blank href')\n }\n if (item.exact != null) {\n throw new TypeError('External navigation item cannot use exact route matching')\n }\n }\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 {ComponentProps, CapillaryUiChild, 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 BreadcrumbItem {\n id: Key\n label: CapillaryUiChild\n to?: RouteDescriptor | RouteTarget | ResolvedRoute\n onClick?: (event: MouseEvent) => void\n title?: string\n}\n\nexport interface BreadcrumbProps extends ComponentProps {\n items: readonly BreadcrumbItem[]\n label?: string\n}\n\n/**\n * Ordered path of ancestor links ending in the current location. The final item\n * is rendered as `aria-current=\"page\"` text; earlier items are router-aware\n * links when `to` is set, action anchors when only `onClick` is set, or plain\n * text otherwise.\n */\nexport class Breadcrumb extends Component<BreadcrumbProps> {\n static override liveProps: readonly string[] = []\n\n constructor(props: BreadcrumbProps) {\n super(props)\n validateBreadcrumb(props)\n }\n\n render(): CapillaryUiChild {\n validateBreadcrumb(this.props)\n const Host = this.Host\n const items = this.props.items\n const last = items.length - 1\n return <Host className={componentClass(this.props) || null}>\n <nav aria-label={this.props.label ?? this.capillaryUiMessage('breadcrumbLabel')}>\n <ol>{items.map((item, index) => <li key={String(item.id)}>\n {index === last\n ? <span aria-current=\"page\" {...(item.title == null ? {} : {title: item.title})}>{item.label}</span>\n : item.to != null\n ? <RouteLink\n to={item.to}\n {...(item.title == null ? {} : {title: item.title})}\n {...(item.onClick == null ? {} : {onClick: item.onClick})}\n >{item.label}</RouteLink>\n : item.onClick != null\n ? <a\n href=\"#\"\n {...(item.title == null ? {} : {title: item.title})}\n onClick={(event: MouseEvent) => {\n event.preventDefault()\n item.onClick!(event)\n }}\n >{item.label}</a>\n : <span {...(item.title == null ? {} : {title: item.title})}>{item.label}</span>}\n </li>)}</ol>\n </nav>\n </Host>\n }\n\n static dependencies = [RouteLink]\n static override hostName = 'breadcrumb'\n\n static override css = css`\n & {\n display: block;\n min-width: 0;\n user-select: none;\n }\n\n & > nav > ol {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n gap: var(--breadcrumb-gap, 0.375rem);\n margin: 0;\n padding: 0;\n list-style: none;\n min-width: 0;\n }\n\n & > nav > ol > li {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n }\n\n & > nav > ol > li + li::before {\n content: \"/\";\n margin-inline-end: var(--breadcrumb-gap, 0.375rem);\n color: var(--breadcrumb-separator-color, var(--muted-color, currentColor));\n opacity: 0.6;\n }\n\n & > nav > ol > li > a {\n color: var(--breadcrumb-link-color, inherit);\n text-decoration: none;\n white-space: nowrap;\n }\n\n & > nav > ol > li > a:hover {\n text-decoration: underline;\n }\n\n & > nav > ol > li > [aria-current=\"page\"] {\n font-weight: var(--breadcrumb-current-font-weight, 600);\n }\n `\n}\n\nfunction validateBreadcrumb(props: BreadcrumbProps): void {\n if (!Array.isArray(props.items)) throw new TypeError('Breadcrumb 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 breadcrumb item requires an id')\n if (item.label == null) throw new TypeError('Each breadcrumb item requires a label')\n if (item.onClick != null && typeof item.onClick !== 'function') {\n throw new TypeError('Breadcrumb item onClick must be a function')\n }\n if (ids.has(item.id)) throw new Error(`Duplicate breadcrumb item id: ${String(item.id)}`)\n ids.add(item.id)\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentDependency, ComponentProps, CapillaryUiChild} from '../component.js'\nimport {CapillaryUiRuntime} from '../../runtime.js'\nimport {layoutDirectionClassName} from '../layout/layoutTraits.js'\nimport type {CapillaryUiLayoutDirection} from '../layout/layoutTraits.js'\n\n/** Viewport sizing policy for a Capillary UI application root. */\nexport type CapillaryUiAppSizing =\n | 'embedded'\n | 'viewport-width'\n | 'viewport-height'\n | 'viewport'\n\n/** Landmark policy for a Capillary UI application root. */\nexport type CapillaryUiAppLandmark = 'main' | 'none'\n\nexport interface CapillaryUiAppProps extends ComponentProps {\n /**\n * Select the viewport axes claimed by the application shell. Embedded is\n * sizing-neutral; the other values use Capillary UI's public fill traits.\n */\n sizing?: CapillaryUiAppSizing\n /** Arrange application-owned root children on the bounded host. */\n layout?: CapillaryUiLayoutDirection\n /**\n * `main` exposes the app as the document's primary-content landmark.\n * Embedded applications should select `none`.\n */\n landmark?: CapillaryUiAppLandmark\n}\n\n/**\n * A fixed application shell with a `cap-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 CapillaryUiApp extends Component<CapillaryUiAppProps> {\n override mount(parent: ParentNode | null = null, before: Node | null = null): this {\n if (parent != null) {\n const targetDocument = parentDocument(parent, 'CapillaryUiApp.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(): CapillaryUiChild {\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 layout,\n landmark = 'main',\n ...hostProps\n } = this.props\n const Host = this.Host\n const rootClassName = mergeClassNames(\n classAlias,\n className,\n sizingClassName(sizing),\n layout == null ? undefined : layoutDirectionClassName(layout),\n )\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 mountCapillaryUiApp<TArgs extends unknown[], TApp extends CapillaryUiApp>(\n runtime: CapillaryUiRuntime,\n appType: (new(...args: TArgs) => TApp) & ComponentDependency,\n parent: ParentNode,\n ...args: TArgs\n): TApp {\n if (!(runtime instanceof CapillaryUiRuntime)) {\n throw new TypeError('mountCapillaryUiApp requires a CapillaryUiRuntime')\n }\n const targetDocument = parentDocument(parent, 'mountCapillaryUiApp')\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: CapillaryUiAppSizing): string | undefined {\n switch (sizing) {\n case 'embedded': return undefined\n case 'viewport-width': return 'cap-fill-horizontal'\n case 'viewport-height': return 'cap-fill-vertical'\n case 'viewport': return 'cap-fill-horizontal cap-fill-vertical'\n default: throw new TypeError(\n 'CapillaryUiApp sizing must be embedded, viewport-width, viewport-height, or viewport',\n )\n }\n}\n\nfunction landmarkRole(landmark: CapillaryUiAppLandmark): 'main' | null {\n if (landmark === 'main') return 'main'\n if (landmark === 'none') return null\n throw new TypeError('CapillaryUiApp 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, CapillaryUiChild} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from './layoutTraits.js'\nimport {controlId, layoutParticipantClass} from '../controlUtils.js'\n\nexport type HeaderLevel = 1 | 2 | 3 | 4 | 5 | 6\n\nexport interface HeaderProps extends ComponentProps, CapillaryUiLayoutParticipantProps {\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(): CapillaryUiChild {\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={layoutParticipantClass(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 font-size: var(--section-header-font-size);\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 user-select: none;\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, CapillaryUiChild} from '../component.js'\nimport {classNames, componentClass, controlId} from '../controlUtils.js'\nimport {Header} from './header.js'\n\n/** Structural role of a GroupBox within a nested form section. */\nexport type GroupBoxVariant = 'section' | 'column'\n\nexport interface GroupBoxBaseProps extends ComponentProps {\n id?: string | number | null\n /** Optional structural section or column presentation. */\n variant?: GroupBoxVariant\n}\n\nexport interface GroupBoxProps extends GroupBoxBaseProps {\n header: CapillaryUiChild\n}\n\n/** Bordered control group with a full-height vertical section header. */\nexport class GroupBox<\n TProps extends GroupBoxBaseProps = GroupBoxProps,\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-box', props.id)\n this.headerId = `${this.panelId}-title`\n }\n\n render(): CapillaryUiChild {\n const {header, children = []} = this.props as TProps & GroupBoxProps\n return this.renderGroupBox(header, children)\n }\n\n protected renderGroupBox(header: CapillaryUiChild, content: CapillaryUiChild): CapillaryUiChild {\n const Host = this.Host\n const variantClass = groupBoxVariantClass(this.props.variant)\n return <Host\n id={this.panelId}\n role=\"group\"\n className={classNames(componentClass(this.props), variantClass) || null}\n aria-labelledby={this.headerId}\n >\n <Header\n id={`${this.panelId}-header`}\n headingId={this.headerId}\n >{header}</Header>\n <cap-content>{content}</cap-content>\n </Host>\n }\n\n static override hostName = 'group-box'\n static override dependencies: ComponentDependency[] = [Header]\n\n static css = css`\n & {\n display: flex;\n flex-flow: var(--cap-groupbox-flow, row nowrap);\n align-items: stretch;\n box-sizing: border-box;\n gap: var(--cap-groupbox-gap, 0 0.35rem);\n padding: var(--cap-groupbox-padding, 0.125rem 0.35rem 0.125rem 0.125rem);\n padding-top: var(--cap-groupbox-padding-top, .125rem);\n border: var(--cap-groupbox-border, 1px solid var(--ui-border-color));\n border-radius: var(--ui-border-radius);\n position: relative;\n min-width: 0;\n min-height: 0;\n flex: var(--cap-groupbox-flex, 0 1 auto);\n }\n\n & > cap-header {\n position: var(--cap-groupbox-header-position, static);\n left: var(--cap-groupbox-header-inset, auto);\n top: var(--cap-groupbox-header-inset, auto);\n display: grid;\n place-items: var(--cap-groupbox-header-align, center);\n box-sizing: border-box;\n width: var(--cap-groupbox-header-width, 1.7em);\n padding: var(--cap-groupbox-header-padding, 0.125em);\n border-radius: var(--ui-border-radius);\n color: var(--cap-groupbox-header-color, var(--section-header-color));\n background: var(--cap-groupbox-header-background, var(--section-header-background));\n box-shadow: var(--cap-groupbox-header-shadow, var(--section-header-shadow));\n writing-mode: var(--cap-groupbox-header-writing, vertical-rl);\n transform: var(--cap-groupbox-header-transform, rotate(180deg));\n font-weight: normal;\n font-size: var(--ui-font-size);\n min-width: 0;\n min-height: 0;\n }\n\n & > cap-content {\n display: block;\n min-width: 0;\n min-height: 0;\n margin-left: var(--cap-groupbox-content-margin, .25em);\n flex: 1 1 auto;\n }\n\n & > cap-content > cap-layout {\n gap: .5rem;\n justify-content: flex-start;\n align-content: flex-start;\n justify-items: flex-start;\n align-items: flex-start;\n }\n\n /* Presentation contexts: each marker sets the complete context-sensitive\n property set, so the nearest marked ancestor wins through ordinary\n custom-property inheritance. Unmarked containers keep the control\n defaults declared as var() fallbacks above. */\n [data-cap-context='control'] {\n --cap-groupbox-flow: row nowrap;\n --cap-groupbox-gap: 0 0.35rem;\n --cap-groupbox-padding: 0.125rem 0.35rem 0.125rem 0.125rem;\n --cap-groupbox-border: 1px solid var(--ui-border-color);\n --cap-groupbox-header-align: center;\n --cap-groupbox-header-width: 1.7em;\n --cap-groupbox-header-padding: 0.125em;\n --cap-groupbox-header-color: var(--section-header-color);\n --cap-groupbox-header-background: var(--section-header-background);\n --cap-groupbox-header-shadow: var(--section-header-shadow);\n --cap-groupbox-header-writing: vertical-rl;\n --cap-groupbox-header-transform: rotate(180deg);\n --cap-groupbox-content-margin: .25em;\n --cap-groupbox-flex: 0 1 auto;\n --cap-groupbox-padding-top: .125rem;\n --cap-groupbox-header-position: static;\n --cap-groupbox-header-inset: auto;\n }\n\n [data-cap-context='form'] {\n --cap-groupbox-flow: column nowrap;\n --cap-groupbox-gap: 0.25rem 0;\n --cap-groupbox-padding: 0.5rem;\n --cap-groupbox-border: 1px solid var(--ui-border-color);\n --cap-groupbox-header-align: center start;\n --cap-groupbox-header-width: auto;\n --cap-groupbox-header-padding: 2px 5px;\n --cap-groupbox-header-color: var(--text-color);\n --cap-groupbox-header-background: var(--panel-background);\n --cap-groupbox-header-shadow: none;\n --cap-groupbox-header-writing: horizontal-tb;\n --cap-groupbox-header-transform: none;\n --cap-groupbox-content-margin: 0;\n --cap-groupbox-flex: 0 1 auto;\n --cap-groupbox-padding-top: 1em;\n --cap-groupbox-header-position: absolute;\n --cap-groupbox-header-inset: calc(0px - var(--ui-font-size) / 2);\n }\n\n .cap-layout-horizontal > & {\n max-inline-size: max-content;\n min-inline-size: min-content;\n }\n\n &.cap-groupbox-section {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n grid-template-rows: max-content minmax(max-content, 1fr);\n align-self: stretch;\n align-items: start;\n gap: 0;\n padding: 0;\n padding-top: 0;\n border: 0;\n border-radius: 0;\n min-inline-size: 0;\n max-inline-size: none;\n flex: 0 0 auto;\n }\n\n &.cap-groupbox-section::before {\n content: \"\";\n grid-column: 2;\n grid-row: 1;\n align-self: center;\n border-block-start: 1px solid var(--ui-border-color);\n }\n\n &.cap-groupbox-section > cap-header {\n position: static;\n grid-column: 1;\n grid-row: 1;\n display: block;\n width: auto;\n min-width: 0;\n min-height: 0;\n padding: 0 0.5rem 0 0;\n border-radius: 0;\n color: var(--text-color);\n background: transparent;\n box-shadow: none;\n writing-mode: horizontal-tb;\n transform: none;\n font-size: var(--groupbox-section-font-size, 1.2em);\n font-weight: 600;\n }\n\n &.cap-groupbox-section > cap-content {\n grid-column: 1 / -1;\n grid-row: 2;\n margin-left: 0;\n padding-block: 0.75rem;\n min-width: 0;\n }\n\n .cap-layout-horizontal > &.cap-groupbox-section {\n grid-template-columns: max-content minmax(0, 1fr);\n grid-template-rows: max-content minmax(max-content, 1fr);\n }\n\n .cap-layout-horizontal > &.cap-groupbox-section::before {\n grid-column: 1;\n grid-row: 2;\n justify-self: stretch;\n align-self: stretch;\n border-block-start: 0;\n border-inline-end: 1px solid var(--ui-border-color);\n }\n\n .cap-layout-horizontal > &.cap-groupbox-section > cap-header {\n padding: 0 0.5rem 0.5rem 0;\n }\n\n .cap-layout-horizontal > &.cap-groupbox-section > cap-content {\n grid-column: 2;\n grid-row: 1 / -1;\n padding-block: 0;\n padding-inline: 0.75rem;\n min-block-size: 0;\n }\n\n &.cap-groupbox-column {\n gap: 0;\n padding: 0 1rem;\n padding-top: 0;\n border: 0;\n border-radius: 0;\n flex: 0 1 auto;\n }\n\n &.cap-groupbox-column > cap-header {\n position: static;\n display: block;\n width: auto;\n min-width: 0;\n min-height: 0;\n padding: 0;\n margin-block-end: 0.75rem;\n border-radius: 0;\n color: var(--text-color);\n background: transparent;\n box-shadow: none;\n writing-mode: horizontal-tb;\n transform: none;\n font-size: var(--ui-font-size);\n font-weight: 600;\n }\n\n &.cap-groupbox-column > cap-content {\n margin-left: 0;\n }\n\n .cap-layout-horizontal > &.cap-groupbox-column,\n .cap-layout-vertical > &.cap-groupbox-column {\n align-self: stretch;\n }\n\n .cap-layout-horizontal > &.cap-groupbox-column + &.cap-groupbox-column {\n border-inline-start: 1px solid var(--ui-border-color);\n }\n\n .cap-layout-horizontal > &.cap-groupbox-column:first-child {\n padding-inline-start: 0;\n }\n\n .cap-layout-horizontal > &.cap-groupbox-column:last-child {\n padding-inline-end: 0;\n }\n\n .cap-layout-vertical > &.cap-groupbox-column {\n padding-inline: 0;\n padding-block: 1rem;\n }\n\n .cap-layout-vertical > &.cap-groupbox-column + &.cap-groupbox-column {\n border-block-start: 1px solid var(--ui-border-color);\n }\n\n .cap-layout-vertical > &.cap-groupbox-column:first-child {\n padding-block-start: 0;\n }\n\n .cap-layout-vertical > &.cap-groupbox-column:last-child {\n padding-block-end: 0;\n }\n `\n}\n\nfunction groupBoxVariantClass(variant: GroupBoxVariant | undefined): string | undefined {\n if (variant == null) return undefined\n if (variant === 'section' || variant === 'column') return `cap-groupbox-${variant}`\n throw new TypeError('GroupBox variant must be section or column')\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\n/** Shared structural keyframe dependency for loading-capable Capillary UI components. */\nexport class StatusPresentation extends Component {\n static override hostName = null\n\n static override css = css`\n @keyframes cap-working-progress {\n from { background-position: 0 0, 0 0; }\n to { background-position: 2rem 0, 0 0; }\n }\n `\n}\n\nexport interface ErrorMessageProps extends ComponentProps {\n id?: string\n error: unknown\n fallback?: string\n}\n\n/** Accessible error text exposed visually from an overlay icon on hover or focus. */\nexport class ErrorMessage extends Component<ErrorMessageProps> {\n render(): CapillaryUiChild {\n const message = formatErrorMessage(this.props.error, this.props.fallback ?? '')\n const Host = this.Host\n return <Host\n id={this.props.id}\n className={componentClass(this.props) || null}\n role=\"alert\"\n tabIndex={0}\n aria-label={message}\n >\n <cap-erroricon aria-hidden=\"true\" />\n <cap-errortext>{message}</cap-errortext>\n </Host>\n }\n\n static override hostName = 'error'\n static override dependencies = [StatusPresentation]\n\n static override css = css`\n & {\n position: absolute;\n z-index: 1200;\n inset-block-start: -.35em;\n inset-inline-end: -.35em;\n display: block;\n width: 1.25em;\n height: 1.25em;\n margin: 0;\n color: var(--error-color);\n font-size: .875em;\n line-height: 1.35;\n outline: none;\n box-sizing: border-box;\n }\n\n & > cap-erroricon {\n position: absolute;\n inset: 0;\n display: grid;\n width: 1.25em;\n height: 1.25em;\n color: var(--error-contrast);\n background: var(--error-color);\n border: 1px solid var(--error-color);\n border-radius: 50%;\n box-sizing: border-box;\n font-weight: 700;\n line-height: 1;\n place-items: center;\n }\n\n & > cap-erroricon::before {\n content: \"!\";\n }\n\n & > cap-errortext {\n position: absolute;\n z-index: 1;\n inset-block-start: calc(100% + .25em);\n inset-inline-end: 0;\n display: block;\n visibility: hidden;\n width: max-content;\n max-width: min(22rem, 80vw);\n padding: var(--space-xs) var(--space-sm);\n color: var(--ui-color);\n background: var(--error-bg-neutral, var(--application-background));\n border: 1px solid var(--error-color);\n border-radius: var(--radius-md);\n box-shadow: var(--ui-shadow);\n opacity: 0;\n overflow-wrap: anywhere;\n pointer-events: none;\n transform: translateY(-.2em);\n transition: opacity var(--motion-fast), transform var(--motion-fast), visibility 0s linear var(--motion-fast);\n }\n\n & > cap-erroricon:hover + cap-errortext,\n &:focus-visible > cap-errortext {\n visibility: visible;\n opacity: 1;\n transform: translateY(0);\n transition-delay: 0s;\n }\n\n &:focus-visible > cap-erroricon {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n @media (forced-colors: active) {\n & > cap-erroricon,\n & > cap-errortext {\n color: CanvasText;\n background: Canvas;\n border-color: Mark;\n forced-color-adjust: auto;\n }\n }\n `\n}\n\nexport function formatErrorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n if (isMessageError(error)) return error.message\n if (isDerivedErrors(error)) {\n const messages = error\n .map((entry) => formatErrorMessage(entry.error, ''))\n .filter((message) => message.length > 0)\n if (messages.length > 0) return [...new Set(messages)].join('; ')\n }\n return error == null ? fallback : String(error)\n}\n\nfunction isMessageError(error: unknown): error is {message: string} {\n return error != null\n && typeof error === 'object'\n && typeof Reflect.get(error, 'message') === 'string'\n}\n\nfunction isDerivedErrors(error: unknown): error is readonly {error: unknown}[] {\n return Array.isArray(error) && error.every((entry) =>\n entry != null && typeof entry === 'object' && Object.hasOwn(entry, 'error'))\n}\n","import {Component, isVNode} from '../component.js'\nimport type {\n ComponentConstructor,\n ComponentProps,\n CapillaryUiChild,\n} from '../component.js'\n\n/**\n * Base for non-visual, parent-specific content-region markers.\n *\n * A marker must be consumed as a direct child by the component that defines\n * its meaning. The marker itself never contributes a DOM or component host.\n */\nexport abstract class DeclarativeRegion<\n TProps extends ComponentProps = ComponentProps,\n> extends Component<TProps> {\n static override liveProps: readonly string[] = []\n\n render(): never {\n throw new Error(`${this.constructor.name} must be a direct child of its documented parent`)\n }\n}\n\nexport interface ReadDeclarativeRegionsOptions<TName extends string> {\n /** Allow ordinary, unmarked children. Defaults to true. */\n allowContent?: boolean\n /** Region names that must be supplied exactly once. */\n required?: readonly NoInfer<TName>[]\n}\n\nexport interface ReadDeclarativeRegionsResult<TName extends string> {\n /** Ordinary children retained in their authored order. */\n content: readonly CapillaryUiChild[]\n /** Contents of each unique, parent-specific region marker. */\n regions: Readonly<Partial<Record<TName, readonly CapillaryUiChild[]>>>\n}\n\n/**\n * Separate direct declarative-region children from ordinary ordered content\n * and validate one component's documented region contract.\n */\nexport function readDeclarativeRegions<TName extends string>(\n componentName: string,\n children: ComponentProps['children'],\n supportedRegions: Readonly<Record<TName, ComponentConstructor>>,\n options: ReadDeclarativeRegionsOptions<TName> = {},\n): ReadDeclarativeRegionsResult<TName> {\n const entries = Object.entries(supportedRegions) as [TName, ComponentConstructor][]\n const content: CapillaryUiChild[] = []\n const regions: Partial<Record<TName, readonly CapillaryUiChild[]>> = {}\n const values = Array.isArray(children) ? children : children == null ? [] : [children]\n\n for (const child of values) {\n if (!isVNode(child)) {\n content.push(child)\n continue\n }\n const entry = entries.find(([, type]) => child.type === type)\n if (entry == null) {\n if (isDeclarativeRegionType(child.type)) {\n throw new Error(`${componentName} does not support region: ${child.type.name}`)\n }\n content.push(child)\n continue\n }\n\n const [name] = entry\n if (regions[name] != null) throw new Error(`${componentName} received duplicate region: ${name}`)\n regions[name] = child.props.children\n }\n\n if (options.allowContent === false && content.length > 0) {\n throw new Error(`${componentName} accepts only its documented region children`)\n }\n for (const required of options.required ?? []) {\n if (!Object.hasOwn(supportedRegions, required)) {\n throw new Error(`${componentName} requires undeclared region: ${required}`)\n }\n if (regions[required] == null) throw new Error(`${componentName} requires region: ${required}`)\n }\n\n return {content, regions}\n}\n\nfunction isDeclarativeRegionType(type: unknown): type is ComponentConstructor {\n return typeof type === 'function'\n && type.prototype instanceof DeclarativeRegion\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, LivePropContract} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {ErrorMessage} from '../status/statusPresentation.js'\nimport {DeclarativeRegion, readDeclarativeRegions} from './declarativeRegion.js'\n\n/** Trailing content rendered in an OptionGroup legend. */\nexport class OptionGroupHeaderEnd extends DeclarativeRegion {}\n\nconst optionGroupLiveProps = ['disabled', 'required', 'busy', 'error'] as const\n\nexport interface OptionGroupBaseProps extends ComponentProps,\n LivePropContract<(typeof optionGroupLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n ariaLabel?: string\n /** @deprecated Supply `<OptionGroupHeaderEnd>` as a direct child. */\n headerEnd?: never\n disabled?: boolean\n required?: boolean\n busy?: boolean\n error?: unknown\n}\n\n/** Labeled fieldset section for use inside an OptionsBox or standalone. */\nexport class OptionGroup<TProps extends OptionGroupBaseProps = OptionGroupBaseProps>\n extends Component<TProps> {\n static override liveProps = optionGroupLiveProps\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(): CapillaryUiChild {\n if (this.props.headerEnd != null) {\n throw new Error('OptionGroup trailing header content must use a direct OptionGroupHeaderEnd child')\n }\n const {content, regions} = readDeclarativeRegions('OptionGroup', this.props.children, {\n headerEnd: OptionGroupHeaderEnd,\n })\n return this.renderOptionGroup(content, regions.headerEnd ?? null)\n }\n\n protected renderOptionGroup(content: CapillaryUiChild, headerEnd: CapillaryUiChild): CapillaryUiChild {\n const Host = this.Host\n const {\n label,\n ariaLabel,\n disabled = false,\n required = false,\n busy = 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-busy={busy ? '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 {this.renderOptionGroupError(error)}\n </Host>\n }\n\n /** Shared error anatomy for OptionGroup specializations. */\n protected renderOptionGroupError(error: unknown): CapillaryUiChild {\n return error == null ? null : <ErrorMessage id={this.errorId} error={error} />\n }\n\n static override hostName = 'option-group'\n static override dependencies = [OptionGroupHeaderEnd, ErrorMessage]\n\n static css = css`\n & {\n display: block;\n position: relative;\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 box-sizing: border-box;\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 user-select: none;\n }\n\n & > fieldset > legend > span {\n flex: 1;\n min-width: 0;\n }\n\n & > fieldset[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > fieldset[aria-invalid=\"true\"] {\n border: 1px solid var(--error-color);\n border-radius: var(--radius-md);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > fieldset[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > fieldset[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","import {css} from '../component.js'\nimport {GroupBox} from './groupBox.js'\nimport type {GroupBoxBaseProps} from './groupBox.js'\nimport type {CapillaryUiChild} from '../component.js'\n\nexport interface OptionsBoxProps extends GroupBoxBaseProps {\n header: CapillaryUiChild\n}\n\n/** Bordered panel with a vertical section header, designed to contain OptionGroups. */\nexport class OptionsBox<TProps extends GroupBoxBaseProps = OptionsBoxProps>\n extends GroupBox<TProps> {\n static override hostName = 'options-box'\n\n static css = css`\n & > cap-content {\n display: flex;\n flex-direction: column;\n align-self: stretch;\n flex: 1 1 0;\n gap: 1rem;\n }\n\n & > cap-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.25rem;\n margin-bottom: 0.25rem;\n border-bottom: 1px solid var(--ui-border-color);\n user-select: none;\n }\n\n & > cap-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: .33rem;\n padding: .25em 0 .5em 0;\n }\n `\n}\n","import {Component} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {classNames, componentClass} from '../controlUtils.js'\nimport {\n layoutAllocationClassName,\n layoutDirectionClassName,\n layoutDirectionFromProps,\n} from './layoutTraits.js'\nimport type {\n CapillaryUiLayoutDirection,\n CapillaryUiLayoutDirectionProps,\n CapillaryUiOptionalLayoutDirectionProps,\n CapillaryUiLayoutParticipantProps,\n CapillaryUiPresentationContextProps,\n} from './layoutTraits.js'\n\nexport type LayoutContainerProps = ComponentProps\n& CapillaryUiOptionalLayoutDirectionProps\n& CapillaryUiLayoutParticipantProps\n& CapillaryUiPresentationContextProps\n& {\n id?: string\n role?: string\n ariaLabel?: string\n tabIndex?: number\n /** Make this bounded Layout host its own overflow owner. */\n scroll?: boolean\n}\n\nexport type LayoutProps = LayoutContainerProps & CapillaryUiLayoutDirectionProps\n\ninterface LayoutHostAccessibilityProps {\n role?: string | null\n 'aria-label'?: string | null\n tabIndex?: number | null\n}\n\n/** Presentation-only horizontal or vertical arrangement for arbitrary children. */\nexport class Layout<TProps extends LayoutContainerProps = LayoutProps> extends Component<TProps> {\n static override liveProps: readonly string[] = []\n\n protected defaultDirection(): CapillaryUiLayoutDirection | undefined {\n return undefined\n }\n\n protected defaultScroll(): boolean {\n return false\n }\n\n protected hostAccessibilityProps(): LayoutHostAccessibilityProps {\n const {role, ariaLabel, tabIndex} = this.props\n return {\n role: role ?? (ariaLabel == null ? null : 'region'),\n 'aria-label': ariaLabel ?? null,\n tabIndex: tabIndex ?? null,\n }\n }\n\n render(): CapillaryUiChild {\n const direction = layoutDirectionFromProps(\n this.props,\n this.defaultDirection(),\n this.constructor.name,\n )\n const scroll = this.props.scroll ?? this.defaultScroll()\n const Host = this.Host\n return <Host\n id={this.props.id}\n data-cap-context={this.props.context ?? null}\n {...this.hostAccessibilityProps()}\n className={classNames(\n componentClass(this.props),\n layoutDirectionClassName(direction),\n layoutAllocationClassName(this.props.allocation),\n scroll ? 'cap-scroll' : undefined,\n ) || null}\n >{this.props.children ?? []}</Host>\n }\n\n static override hostName = 'layout'\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, LivePropContract} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from './layoutTraits.js'\nimport type {CapillaryUiOptionalLayoutDirectionProps, CapillaryUiPresentationContextProps} from './layoutTraits.js'\nimport {layoutDirectionFromProps} from './layoutTraits.js'\nimport {Header} from './header.js'\nimport {Layout} from './layout.js'\nimport {DeclarativeRegion, readDeclarativeRegions} from './declarativeRegion.js'\nimport {controlId, layoutParticipantClass} from '../controlUtils.js'\n\nconst panelLiveProps = ['disabled'] as const\n\n/** Toolbar content rendered between a Panel heading and its ordinary children. */\nexport class PanelToolbar extends DeclarativeRegion {}\n\nexport type PanelProps = ComponentProps\n& CapillaryUiLayoutParticipantProps\n& CapillaryUiOptionalLayoutDirectionProps\n& CapillaryUiPresentationContextProps\n& LivePropContract<(typeof panelLiveProps)[number]>\n& {\n id?: string | number | null\n header?: CapillaryUiChild\n /** @deprecated Supply `<PanelToolbar>` as a direct child. */\n toolbar?: never\n /** @deprecated Use the `horizontal` or `vertical` boolean modifier. */\n orientation?: 'horizontal' | 'vertical'\n /** Make the Panel body its overflow owner. Defaults to true for compatibility. */\n scroll?: boolean\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 if (this.props.toolbar != null) {\n throw new Error('Panel toolbar content must use a direct PanelToolbar child')\n }\n const {\n header = null,\n children = [],\n orientation,\n scroll = true,\n disabled = false,\n context = null,\n } = this.props\n const {content, regions} = readDeclarativeRegions('Panel', children, {\n toolbar: PanelToolbar,\n })\n if (orientation != null && !['horizontal', 'vertical'].includes(orientation)) {\n throw new TypeError('Panel orientation must be horizontal or vertical')\n }\n if (orientation != null\n && ((this.props.horizontal && orientation !== 'horizontal')\n || (this.props.vertical && orientation !== 'vertical'))) {\n throw new TypeError('Panel direction modifier conflicts with orientation')\n }\n const direction = layoutDirectionFromProps(\n this.props,\n orientation ?? 'vertical',\n 'Panel',\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 data-cap-context={context}\n role={header == null ? null : 'region'}\n className={layoutParticipantClass(this.props)}\n aria-disabled={disabled ? 'true' : null}\n aria-labelledby={header == null ? null : this.headerId}\n >\n {title}\n {regions.toolbar ?? null}\n <Layout\n {...(direction === 'horizontal' ? {horizontal: true} : {vertical: true})}\n scroll={scroll}\n className=\"panel-content\"\n >{content}</Layout>\n </Host>\n }\n\n static override hostName = 'panel'\n static override dependencies = [Header, Layout, PanelToolbar]\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 min-width: 0;\n min-height: 0;\n overflow: hidden;\n flex: 0 0 auto;\n }\n\n & > cap-layout.panel-content {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n padding: var(--panel-content-padding, var(--panel-padding, 0.75rem));\n gap: var(--spacing-small, 1rem);\n }\n\n &.island:has(> cap-header) > cap-layout.panel-content:has(> [data-cap-surface='data']:only-child) {\n --panel-content-padding: 0;\n }\n\n &[aria-disabled=\"true\"] {\n opacity: .65;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from './layoutTraits.js'\nimport {Header} from './header.js'\nimport {DeclarativeRegion, readDeclarativeRegions} from './declarativeRegion.js'\nimport {controlId, layoutParticipantClass} from '../controlUtils.js'\n\n/** Toolbar content rendered between a Sidebar heading and its scrolling body. */\nexport class SidebarToolbar extends DeclarativeRegion {}\n\nexport interface SidebarProps extends ComponentProps, CapillaryUiLayoutParticipantProps {\n id?: string | number | null\n header?: CapillaryUiChild\n /** @deprecated Supply `<SidebarToolbar>` as a direct child. */\n toolbar?: never\n ariaLabel?: string\n}\n\n/** Labelled complementary 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(): CapillaryUiChild {\n if (this.props.toolbar != null) {\n throw new Error('Sidebar toolbar content must use a direct SidebarToolbar child')\n }\n const {\n header = null,\n ariaLabel,\n children = [],\n } = this.props\n const {content, regions} = readDeclarativeRegions('Sidebar', children, {\n toolbar: SidebarToolbar,\n })\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\n id={this.sidebarId}\n role=\"complementary\"\n aria-label={header == null ? ariaLabel : null}\n aria-labelledby={header == null ? null : this.headerId}\n className={layoutParticipantClass(this.props) || null}\n >\n {title}\n {regions.toolbar == null ? null : <cap-toolbarcontent>{regions.toolbar}</cap-toolbarcontent>}\n <cap-content tabIndex={0}>{content}</cap-content>\n </Host>\n }\n\n static override hostName = 'sidebar'\n static override dependencies = [Header, SidebarToolbar]\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n flex: 1 1 auto;\n overflow: hidden;\n }\n\n & > cap-header,\n & > cap-toolbarcontent {\n flex: none;\n }\n\n & > cap-toolbarcontent {\n min-width: 0;\n overflow-x: auto;\n }\n\n & > cap-content {\n flex: 1;\n min-height: 0;\n overflow: auto;\n }\n `\n}\n","import {Component, css, h, isVNode} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, VNode} from '../component.js'\nimport {classNames, componentClass, invoke} from '../controlUtils.js'\nimport {Layout} from './layout.js'\nimport type {LayoutContainerProps} from './layout.js'\nimport {\n layoutAllocationClassName,\n layoutDirectionFromProps,\n} from './layoutTraits.js'\nimport type {\n CapillaryUiLayoutDirection,\n CapillaryUiOptionalLayoutDirectionProps,\n CapillaryUiLayoutParticipantProps,\n} from './layoutTraits.js'\n\nexport type SplitPaneProps = Omit<LayoutContainerProps, 'allocation'> & {\n /** Pane allocation is owned by SplitView. */\n allocation?: never\n /** Accessible region name for this pane. */\n label?: string\n}\n\nabstract class SplitPane extends Layout<SplitPaneProps> {\n override render(): CapillaryUiChild {\n if ((this.props as LayoutContainerProps).allocation != null) {\n throw new TypeError('SplitView owns SplitPrimary and SplitSecondary allocation')\n }\n return super.render()\n }\n\n protected override defaultDirection(): CapillaryUiLayoutDirection {\n return 'vertical'\n }\n\n protected override defaultScroll(): boolean {\n return true\n }\n\n protected override hostAccessibilityProps(): {\n role: string | null\n 'aria-label': string | null\n tabIndex: number | null\n } {\n const {label, scroll} = this.props\n const scrolls = scroll ?? this.defaultScroll()\n return {\n role: label == null ? null : 'region',\n 'aria-label': label ?? null,\n tabIndex: scrolls ? 0 : null,\n }\n }\n}\n\n/** Named Layout pane whose size is controlled by its parent SplitView. */\nexport class SplitPrimary extends SplitPane {\n static override hostName = 'primary'\n}\n\n/** Named Layout pane that receives the SplitView's remaining space. */\nexport class SplitSecondary extends SplitPane {\n static override hostName = 'secondary'\n}\n\nexport type SplitViewProps = ComponentProps\n& CapillaryUiOptionalLayoutDirectionProps\n& CapillaryUiLayoutParticipantProps\n& {\n /** @deprecated Supply `<SplitPrimary>` as a direct child. */\n primary?: never\n /** @deprecated Supply `<SplitSecondary>` as a direct child. */\n secondary?: never\n /** @deprecated Use the `horizontal` or `vertical` boolean modifier. */\n direction?: 'horizontal' | 'vertical'\n /** Initial primary-pane size as a non-empty CSS size. */\n primarySize?: string\n /** @deprecated Put `label` on `<SplitPrimary>`. */\n primaryLabel?: string\n /** @deprecated Put `label` on `<SplitSecondary>`. */\n secondaryLabel?: string\n /** Minimum primary-pane size in CSS pixels. */\n primaryMinSize?: number\n /** Minimum secondary-pane size in CSS pixels. */\n secondaryMinSize?: number\n /** Keyboard resize increment in CSS pixels. */\n resizeStep?: number\n /** Accessible name for the resize separator. */\n separatorLabel?: string\n /** Enable separator interaction. Defaults to true. */\n resizable?: boolean\n /** Receives the current primary-pane pixel size after an interaction. */\n onResize?: (primarySize: string, event: PointerEvent | KeyboardEvent) => void\n}\n\ninterface PointerResize {\n pointerId: number\n startCoordinate: number\n startSize: number\n}\n\n/** Resizable two-pane layout with named Layout children and an accessible separator. */\nexport class SplitView extends Component<SplitViewProps> {\n static override liveProps: readonly string[] = []\n private pointerResize: PointerResize | null = null\n private primarySizeOverride: string | null = null\n\n override setProps(nextProps: SplitViewProps): this {\n if (nextProps.primarySize !== this.props.primarySize) this.primarySizeOverride = null\n return super.setProps(nextProps)\n }\n\n render(): CapillaryUiChild {\n if (this.props.primary != null || this.props.secondary != null) {\n throw new Error('SplitView pane content must use direct SplitPrimary and SplitSecondary children')\n }\n const {\n direction,\n primarySize,\n primaryLabel,\n secondaryLabel,\n primaryMinSize = 96,\n secondaryMinSize = 96,\n resizeStep = 16,\n separatorLabel = this.capillaryUiMessage('splitViewSeparatorLabel'),\n resizable = true,\n } = this.props\n if (direction != null && !['horizontal', 'vertical'].includes(direction)) {\n throw new TypeError('SplitView direction must be horizontal or vertical')\n }\n if (direction != null\n && ((this.props.horizontal && direction !== 'horizontal')\n || (this.props.vertical && direction !== 'vertical'))) {\n throw new TypeError('SplitView direction modifier conflicts with direction')\n }\n const axis = layoutDirectionFromProps(this.props, direction ?? 'horizontal', 'SplitView')\n validateCSSSize(primarySize, 'primarySize')\n validateNonNegativeNumber(primaryMinSize, 'primaryMinSize')\n validateNonNegativeNumber(secondaryMinSize, 'secondaryMinSize')\n validatePositiveNumber(resizeStep, 'resizeStep')\n\n const {primary, secondary} = readSplitPanes(this.props.children)\n const Host = this.Host\n return <Host\n className={classNames(\n componentClass(this.props),\n layoutAllocationClassName(this.props.allocation),\n axis,\n ) || null}\n style={{\n '--split-primary-size': this.primarySizeOverride ?? primarySize ?? '40%',\n '--split-primary-min-size': `${primaryMinSize}px`,\n '--split-secondary-min-size': `${secondaryMinSize}px`,\n }}\n data-resizable={resizable ? 'true' : 'false'}\n >\n {withFallbackLabel(primary, primaryLabel)}\n <cap-separator\n role=\"separator\"\n aria-label={separatorLabel}\n aria-orientation={axis === 'horizontal' ? 'vertical' : 'horizontal'}\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow=\"40\"\n aria-disabled={resizable ? null : 'true'}\n tabIndex={resizable ? 0 : null}\n {...(resizable ? {\n onPointerDown: this.handlePointerDown,\n onPointerMove: this.handlePointerMove,\n onPointerUp: this.handlePointerEnd,\n onPointerCancel: this.handlePointerEnd,\n onKeyDown: this.handleKeyDown,\n } : {})}\n />\n {withFallbackLabel(secondary, secondaryLabel)}\n </Host>\n }\n\n override afterMount(): void {\n this.updateSeparatorValue()\n }\n\n override afterUpdate(): void {\n this.updateSeparatorValue()\n }\n\n private readonly handlePointerDown = (event: PointerEvent & {currentTarget: HTMLElement}): void => {\n if (event.button !== 0) return\n const primary = this.primaryElement()\n if (primary == null) return\n const axis = this.axis()\n this.pointerResize = {\n pointerId: event.pointerId,\n startCoordinate: axis === 'horizontal' ? event.clientX : event.clientY,\n startSize: axis === 'horizontal'\n ? primary.getBoundingClientRect().width\n : primary.getBoundingClientRect().height,\n }\n event.currentTarget.setPointerCapture?.(event.pointerId)\n event.preventDefault()\n }\n\n private readonly handlePointerMove = (\n event: PointerEvent & {currentTarget: HTMLElement},\n ): void => {\n const resize = this.pointerResize\n if (resize == null || resize.pointerId !== event.pointerId) return\n const coordinate = this.axis() === 'horizontal' ? event.clientX : event.clientY\n this.resizeTo(resize.startSize + coordinate - resize.startCoordinate, event)\n event.preventDefault()\n }\n\n private readonly handlePointerEnd = (event: PointerEvent & {currentTarget: HTMLElement}): void => {\n if (this.pointerResize?.pointerId !== event.pointerId) return\n event.currentTarget.releasePointerCapture?.(event.pointerId)\n this.pointerResize = null\n }\n\n private readonly handleKeyDown = (\n event: KeyboardEvent & {currentTarget: HTMLElement},\n ): void => {\n const axis = this.axis()\n const decreaseKey = axis === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const increaseKey = axis === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const primary = this.primaryElement()\n if (primary == null) return\n let next: number\n if (event.key === decreaseKey) {\n next = this.primaryExtent(primary) - this.resizeIncrement(event)\n } else if (event.key === increaseKey) {\n next = this.primaryExtent(primary) + this.resizeIncrement(event)\n } else if (event.key === 'Home') {\n next = this.props.primaryMinSize ?? 96\n } else if (event.key === 'End') {\n next = Number.POSITIVE_INFINITY\n } else {\n return\n }\n this.resizeTo(next, event)\n event.preventDefault()\n }\n\n private resizeTo(requestedSize: number, event: PointerEvent | KeyboardEvent): void {\n const host = this.hostElement()\n const separator = this.separatorElement()\n if (host == null || separator == null) return\n const horizontal = this.axis() === 'horizontal'\n const extent = horizontal ? host.clientWidth : host.clientHeight\n const separatorExtent = horizontal ? separator.offsetWidth : separator.offsetHeight\n const primaryMin = this.props.primaryMinSize ?? 96\n const secondaryMin = this.props.secondaryMinSize ?? 96\n const maximum = Math.max(primaryMin, extent - separatorExtent - secondaryMin)\n const size = Math.min(Math.max(requestedSize, primaryMin), maximum)\n const value = `${Math.round(size * 100) / 100}px`\n this.primarySizeOverride = value\n host.style.setProperty('--split-primary-size', value)\n this.updateSeparatorValue()\n invoke(this.props.onResize, value, event)\n }\n\n private resizeIncrement(event: KeyboardEvent): number {\n return (this.props.resizeStep ?? 16) * (event.shiftKey ? 4 : 1)\n }\n\n private primaryExtent(primary: HTMLElement): number {\n const bounds = primary.getBoundingClientRect()\n return this.axis() === 'horizontal' ? bounds.width : bounds.height\n }\n\n private updateSeparatorValue(): void {\n const host = this.hostElement()\n const primary = this.primaryElement()\n const separator = this.separatorElement()\n if (host == null || primary == null || separator == null) return\n const horizontal = this.axis() === 'horizontal'\n const total = (horizontal ? host.clientWidth : host.clientHeight)\n - (horizontal ? separator.offsetWidth : separator.offsetHeight)\n if (total <= 0) return\n const percentage = Math.round((this.primaryExtent(primary) / total) * 100)\n separator.setAttribute('aria-valuenow', String(percentage))\n separator.setAttribute('aria-valuetext', `${percentage}% primary pane`)\n }\n\n private axis(): CapillaryUiLayoutDirection {\n return layoutDirectionFromProps(\n this.props,\n this.props.direction ?? 'horizontal',\n 'SplitView',\n )\n }\n\n private hostElement(): HTMLElement | null {\n return this.dom instanceof HTMLElement ? this.dom : null\n }\n\n private primaryElement(): HTMLElement | null {\n return this.hostElement()?.querySelector(':scope > cap-primary') ?? null\n }\n\n private separatorElement(): HTMLElement | null {\n return this.hostElement()?.querySelector(':scope > cap-separator') ?? null\n }\n\n static override hostName = 'split-view'\n static override dependencies = [SplitPrimary, SplitSecondary]\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 & > cap-primary {\n flex: 0 0 var(--split-primary-size, 40%);\n }\n\n & > cap-secondary {\n flex: 1 1 0;\n }\n\n &.horizontal > cap-primary {\n min-inline-size: var(--split-primary-min-size, 96px);\n }\n\n &.horizontal > cap-secondary {\n min-inline-size: var(--split-secondary-min-size, 96px);\n }\n\n &.vertical > cap-primary {\n min-block-size: var(--split-primary-min-size, 96px);\n }\n\n &.vertical > cap-secondary {\n min-block-size: var(--split-secondary-min-size, 96px);\n }\n\n & > cap-separator {\n position: relative;\n flex: none;\n box-sizing: border-box;\n background: var(--ui-border-color);\n touch-action: none;\n user-select: none;\n }\n\n & > cap-separator::after {\n content: '';\n position: absolute;\n border-radius: 999px;\n background: currentColor;\n opacity: 0;\n }\n\n & > cap-separator:hover::after,\n & > cap-separator:focus-visible::after {\n opacity: .45;\n }\n\n &.horizontal > cap-separator {\n inline-size: .45rem;\n cursor: col-resize;\n }\n\n &.horizontal > cap-separator::after {\n inset-block: 35%;\n inset-inline: 1px;\n }\n\n &.vertical > cap-separator {\n block-size: .45rem;\n cursor: row-resize;\n }\n\n &.vertical > cap-separator::after {\n inset-inline: 35%;\n inset-block: 1px;\n }\n\n &[data-resizable=\"false\"] > cap-separator {\n cursor: default;\n }\n `\n}\n\nfunction readSplitPanes(children: ComponentProps['children']): {\n primary: VNode<SplitPaneProps>\n secondary: VNode<SplitPaneProps>\n} {\n let primary: VNode<SplitPaneProps> | null = null\n let secondary: VNode<SplitPaneProps> | null = null\n const values = flattenChildren(children)\n for (const child of values) {\n if (!isVNode(child)) {\n throw new Error('SplitView accepts only direct SplitPrimary and SplitSecondary children')\n }\n if (child.type === SplitPrimary) {\n if (primary != null) throw new Error('SplitView received duplicate SplitPrimary')\n primary = child as VNode<SplitPaneProps>\n } else if (child.type === SplitSecondary) {\n if (secondary != null) throw new Error('SplitView received duplicate SplitSecondary')\n secondary = child as VNode<SplitPaneProps>\n } else {\n throw new Error('SplitView accepts only direct SplitPrimary and SplitSecondary children')\n }\n }\n if (primary == null) throw new Error('SplitView requires SplitPrimary')\n if (secondary == null) throw new Error('SplitView requires SplitSecondary')\n return {primary, secondary}\n}\n\nfunction flattenChildren(children: ComponentProps['children']): CapillaryUiChild[] {\n const flattened: CapillaryUiChild[] = []\n const visit = (value: CapillaryUiChild | readonly CapillaryUiChild[]): void => {\n if (Array.isArray(value)) {\n for (const child of value) visit(child)\n } else if (value != null && value !== false && value !== true) {\n flattened.push(value)\n }\n }\n visit(children ?? [])\n return flattened\n}\n\nfunction withFallbackLabel(\n pane: VNode<SplitPaneProps>,\n fallback: string | undefined,\n): VNode<SplitPaneProps> {\n if (fallback == null || pane.props.label != null) return pane\n const {children, ...props} = pane.props\n return h(pane.type as typeof SplitPrimary, {\n ...props,\n key: pane.key,\n label: fallback,\n }, children) as VNode<SplitPaneProps>\n}\n\nfunction validateCSSSize(value: string | undefined, name: string): void {\n if (value != null && (typeof value !== 'string' || value.length === 0)) {\n throw new TypeError(`SplitView ${name} must be a non-empty CSS size`)\n }\n}\n\nfunction validateNonNegativeNumber(value: number, name: string): void {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new TypeError(`SplitView ${name} must be a finite non-negative number`)\n }\n}\n\nfunction validatePositiveNumber(value: number, name: string): void {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n throw new TypeError(`SplitView ${name} must be a finite positive number`)\n }\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {componentClass} from '../controlUtils.js'\n\nexport interface DescriptionItemProps extends ComponentProps {\n term: CapillaryUiChild\n value?: CapillaryUiChild\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(): CapillaryUiChild {\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(): CapillaryUiChild {\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 user-select: none;\n }\n\n & > dl {\n display: grid;\n margin: 0;\n }\n `\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {Header} from '../layout/header.js'\n\nexport interface InfoFieldProps extends ComponentProps {\n label: CapillaryUiChild\n value?: CapillaryUiChild\n}\n\n/** A labeled key-value field rendered as native `dt`/`dd` pair. */\nexport class InfoField extends Component<InfoFieldProps> {\n static override liveProps: readonly string[] = []\n render(): CapillaryUiChild {\n const {label, value, children = []} = this.props\n return [\n <dt>{label}</dt>,\n <dd>{value ?? children}</dd>,\n ]\n }\n}\n\nexport interface InfoPanelProps extends ComponentProps {\n id?: string | number | null\n title?: CapillaryUiChild\n label?: string\n}\n\n/** Bordered info panel with an optional heading and key-value field content. */\nexport class InfoPanel extends Component<InfoPanelProps> {\n static override liveProps: readonly string[] = []\n readonly panelId: string\n readonly headerId: string\n\n constructor(props: InfoPanelProps = {}) {\n super(props)\n this.panelId = controlId('info-panel', props.id)\n this.headerId = `${this.panelId}-title`\n }\n\n render(): CapillaryUiChild {\n const {title = null, label, children = []} = this.props\n const Host = this.Host\n const header = title == null\n ? null\n : <Header\n id={`${this.panelId}-header`}\n headingId={this.headerId}\n >{title}</Header>\n\n return <Host\n id={this.panelId}\n role={title == null ? null : 'region'}\n className={componentClass(this.props) || null}\n aria-labelledby={title == null ? null : this.headerId}\n >\n {header}\n <dl aria-label={label ?? null}>{children}</dl>\n </Host>\n }\n\n static override hostName = 'infopanel'\n static override dependencies = [Header, InfoField]\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 user-select: none;\n }\n\n & > dl {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: var(--space-sm, 0.375rem) var(--space-md, 1rem);\n margin: 0;\n padding: var(--panel-padding, 0.75rem);\n }\n\n & > dl > dt {\n font-weight: 600;\n color: var(--info-panel-label-color, var(--ui-muted-text-color));\n }\n\n & > dl > dd {\n margin: 0;\n }\n `\n}\n","import {Component, css} from './component.js'\nimport type {ComponentProps} from './component.js'\nimport {StatusPresentation} from './status/statusPresentation.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 static override dependencies = [StatusPresentation]\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: cap-working-progress .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 @media (prefers-reduced-motion: reduce) {\n &::after {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & {\n background: CanvasText;\n forced-color-adjust: none;\n }\n\n &::after {\n display: 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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\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 Capillary UI 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 '@capillaryjs/capillary'\nimport type {\n EmitterNotification,\n SubscribeOptions,\n} from '@capillaryjs/capillary'\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 protected anchorSelected: boolean | 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.anchorSelected = true\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 anchor = items[this.anchorIndex]\n const selected = anchor !== undefined && this.anchorSelected == null\n ? isSelectedByKey(this.getSelectedItems(), anchor, this.anchorIndex, this.getKey)\n : this.anchorSelected === true\n const next = applyRangeSelection(\n items,\n this.getSelectedItems(),\n first,\n last,\n selected,\n this.getKey,\n )\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.anchorSelected = !exists\n this.setSelectedItems(next, 'multi selection toggled')\n return\n }\n\n this.anchorIndex = index\n this.anchorSelected = true\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.anchorSelected = true\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\nfunction isSelectedByKey<TItem>(\n selected: readonly TItem[],\n item: TItem,\n index: number,\n getKey: ItemKeyGetter<TItem>,\n): boolean {\n const key = getKey(item, index)\n return selected.some((candidate, candidateIndex) =>\n Object.is(getKey(candidate, candidateIndex), key))\n}\n\nfunction applyRangeSelection<TItem>(\n items: readonly TItem[],\n selected: readonly TItem[],\n first: number,\n last: number,\n shouldSelect: boolean,\n getKey: ItemKeyGetter<TItem>,\n): TItem[] {\n const rangeKeys = new Set(items\n .slice(first, last + 1)\n .map((item, index) => getKey(item, first + index)))\n const selectedKeys = new Set(selected.map((item, index) => getKey(item, index)))\n for (const key of rangeKeys) {\n if (shouldSelect) selectedKeys.add(key)\n else selectedKeys.delete(key)\n }\n return items.filter((item, index) => selectedKeys.has(getKey(item, index)))\n}\n","import {Emitter, FetchState} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport {ErrorMessage} from '../../status/statusPresentation.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[] | undefined, unknown>\n itemKey?: string | ItemKeyGetter<TItem>\n label?: string\n placeholderCount?: number\n renderItem?: (item: TItem, index: number) => CapillaryUiChild\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[] | undefined, unknown>\n readonly items$: ReadableEmitter<readonly TItem[] | undefined, 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[] | undefined>(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 override setProps(nextProps: ListViewProps<TItem>): this {\n if (this.ownedItemsEmitter != null) {\n if (isReadableEmitter(nextProps.items)) {\n throw new TypeError(\n 'ListView cannot replace static or declarative items with an emitter',\n )\n }\n this.ownedItemsEmitter.set(nextProps.items ?? [], 'list items changed')\n }\n return super.setProps(nextProps)\n }\n\n initialize(): void {\n this.watch(this.itemsEmitter, this.selectedItemsEmitter)\n }\n\n render(): CapillaryUiChild {\n const result = this.itemsEmitter.get()\n if (result !== undefined && !Array.isArray(result)) {\n throw new TypeError('ListView items must be an array')\n }\n const rows = result ?? []\n const status = this.itemsEmitter.getFetchState()\n const error = this.itemsEmitter.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const replacesContent = status === FetchState.Initial\n || (status === FetchState.Loading && result === undefined)\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 aria-busy={isLoading ? 'true' : null}\n >\n {status === FetchState.Error\n ? <ErrorMessage\n className=\"cap-error-banner\"\n error={error}\n fallback={this.capillaryUiMessage('listViewLoadError')}\n />\n : null}\n {replacesContent\n ? <>\n <p role=\"status\">{this.capillaryUiMessage('listViewLoading')}</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\">{this.capillaryUiMessage('listViewEmpty')}</p>\n : null}\n {!replacesContent && rows.length > 0\n ? <ul\n role=\"listbox\"\n aria-label={this.props.label ?? this.capillaryUiMessage('listViewLabel')}\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-cap-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-cap-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, ErrorMessage]\n\n static override hostName = 'listview'\n static override dataSurface = 'data' as const\n\n static override css = css`\n & {\n display: flex;\n position: relative;\n flex: 1 1 auto;\n flex-direction: column;\n min-inline-size: 0;\n min-block-size: 0;\n max-block-size: 100%;\n overflow: auto;\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 & > ul[aria-hidden=\"true\"] > li {\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 align-items: center;\n }\n\n & > ul[aria-hidden=\"true\"] cap-placeholder {\n font-size: var(--ui-font-size);\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 margin: 0;\n padding: var(--ui-padding);\n }\n\n &:has(> cap-error) {\n border-color: var(--error-color);\n }\n\n @media (forced-colors: active) {\n &:has(> cap-error) {\n outline: 2px solid Mark;\n outline-offset: -2px;\n }\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): CapillaryUiChild {\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","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 position: relative;\n flex-flow: row wrap;\n align-items: center;\n align-content: center;\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: 1.2;\n }\n\n & > label {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n min-height: 1.2em;\n margin: 0;\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 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 + cap-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: 1;\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 + cap-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 + cap-checkshell {\n outline: 2px solid var(--focus-color, var(--ui-accent-color, Highlight));\n outline-offset: 1px;\n }\n\n & > label > input:disabled + cap-checkshell {\n opacity: 0.6;\n filter: saturate(0.6);\n }\n\n & > label > input[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) + cap-checkshell {\n background: var(--working-background-image), var(--checkbox-box-background,\n var(--ui-input-bg, transparent));\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > label:has(> input[aria-invalid=\"true\"]) {\n color: var(--error-color);\n }\n\n & > label > input[aria-invalid=\"true\"] + cap-checkshell {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > label > input[aria-busy=\"true\"] + cap-checkshell {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > label > input[aria-invalid=\"true\"] + cap-checkshell {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","import {css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild, 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 {ErrorMessage} from '../../status/statusPresentation.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: CapillaryUiChild,\n value: TValue,\n]\n\nconst checkboxLiveProps = ['disabled', 'required', 'busy', '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?: CapillaryUiChild\n /** Text alternative used by Capillary UI's state announcement when `label` is rich content. */\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n busy?: 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 override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n label = this.props.value ?? this.capillaryUiMessage('checkboxOptionLabel'),\n ariaLabel,\n disabled = false,\n required = false,\n busy = 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 localizedStateName = this.localizedStateName(semanticState, stateName)\n const textLabel = ariaLabel ?? textAlternative(label)\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-busy={busy ? 'true' : null}\n aria-label={textLabel == null\n ? null\n : this.capillaryUiMessage('checkboxStateLabel')(textLabel, localizedStateName)}\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 <cap-checkshell aria-hidden=\"true\">{shellSymbol}</cap-checkshell>\n {label}\n </label>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n }\n\n static override hostName = 'check-box'\n\n static override css = css`\n & > label > input[value=\"require\"] + cap-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\"] + cap-checkshell {\n color: var(--palette-contrast-light);\n background: var(--palette-red);\n box-shadow: var(--checkbox-box-shadow-checked);\n }\n `\n\n private localizedStateName(semanticState: TValue, fallback: string): string {\n if (semanticState === FilterMode.Deny) return this.capillaryUiMessage('filterModeDenyLabel')\n if (semanticState === FilterMode.Neutral) return this.capillaryUiMessage('filterModeNeutralLabel')\n if (semanticState === FilterMode.Prefer) return this.capillaryUiMessage('filterModePreferLabel')\n if (semanticState === FilterMode.Require) return this.capillaryUiMessage('filterModeRequireLabel')\n return fallback\n }\n\n}\n\nfunction textAlternative(label: CapillaryUiChild): string | null {\n return typeof label === 'string' || typeof label === 'number'\n ? String(label)\n : null\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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\n\nimport {Component, css} from '../../component.js'\nimport type {ComponentConstructor, ComponentProps, CapillaryUiChild} 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 {ErrorMessage} from '../../status/statusPresentation.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?: CapillaryUiChild\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(): CapillaryUiChild {\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 <ErrorMessage\n className=\"cap-error-banner\"\n error={error}\n fallback={this.capillaryUiMessage('filterPanelLoadError')}\n />\n </Host>\n }\n if (isLoading && values.length === 0) {\n return <Host className={hostClass} aria-busy=\"true\">\n <p role=\"status\">{this.capillaryUiMessage('filterPanelLoading')}</p>\n </Host>\n }\n\n return <Host\n className={hostClass}\n role=\"group\"\n aria-label={this.props.label ?? this.capillaryUiMessage('filterPanelLabel')}\n aria-busy={isLoading ? 'true' : null}\n >\n {fetchState === FetchState.Error\n ? <ErrorMessage\n className=\"cap-error-banner\"\n error={error}\n fallback={this.capillaryUiMessage('filterPanelLoadError')}\n />\n : null}\n {isLoading ? <p role=\"status\">{this.capillaryUiMessage('filterPanelLoading')}</p> : null}\n {values.length === 0\n ? <p>{this.capillaryUiMessage('filterPanelEmpty')}</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, ErrorMessage]\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 user-select: none;\n }\n\n & > p {\n margin: 0;\n }\n\n &[aria-busy=\"true\"]::after {\n content: \"\";\n position: absolute;\n z-index: 1;\n inset: 0;\n background-image: var(--working-background-image);\n background-repeat: repeat;\n background-size: 2rem 2rem;\n animation: cap-working-progress .55s linear infinite;\n pointer-events: none;\n }\n\n &:has(> cap-error) {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n &[aria-busy=\"true\"]::after {\n animation: none !important;\n }\n }\n `\n}\n\n// Passing a generic class as a runtime vnode erases its state parameter. The\n// concrete props below restore the FilterMode relationship checked by tsc.\nconst FilterModeCheckbox = Checkbox as unknown as ComponentConstructor<\n CheckboxProps<FilterModeValue>\n>\n\nfunction normalizeFilters(\n filters: FilterPanelProps['filters'],\n): Map<FilterValue, FilterModeValue> {\n if (filters == null) return new Map<FilterValue, FilterModeValue>()\n if (filters instanceof Map) return new Map(filters)\n if (Array.isArray(filters)) return new Map(filters)\n throw new TypeError('FilterPanel filters must be a Map or tuple array')\n}\n\nfunction optionValue(option: FilterOptionInput): FilterValue {\n if (typeof option === 'string' || typeof option === 'number') return option\n if (option != null && typeof option === 'object') {\n const value = Reflect.get(option, 'value')\n if (typeof value === 'string' || typeof value === 'number') return value\n }\n throw new TypeError('Filter options must be strings, numbers, or value/label objects')\n}\n\nfunction optionLabel(option: FilterOptionInput): CapillaryUiChild {\n if (option != null && typeof option === 'object') {\n const label = Reflect.get(option, 'label')\n if (label != null) return isCapillaryUiLabel(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 isCapillaryUiLabel(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","import {Component, css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild} 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?: CapillaryUiChild\n /** Text alternative used by Capillary UI-authored sort and filter controls. */\n ariaLabel?: string\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) => CapillaryUiChild\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(): CapillaryUiChild {\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 textLabel = this.props.ariaLabel ?? textAlternative(label) ?? String(this.props.field)\n const filterLabel = this.capillaryUiMessage('tableFilterColumnLabel')(textLabel)\n\n let panel: CapillaryUiChild = 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={this.capillaryUiMessage('tableSortColumnLabel')(textLabel)}\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 cap-datatable > table > thead > tr > th[aria-sort] {\n position: sticky;\n inset-block-start: 0;\n padding-right: 24px;\n user-select: var(--noselect-user-select);\n cursor: var(--noselect-cursor);\n }\n\n cap-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 cap-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 cap-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 cap-datatable > table > thead > tr > th[aria-sort] > button.filter:hover {\n opacity: 1;\n }\n `\n}\n\nfunction textAlternative(label: CapillaryUiChild): string | null {\n return typeof label === 'string' || typeof label === 'number'\n ? String(label)\n : null\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, CapillaryUiChild} 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(): CapillaryUiChild {\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.ariaLabel == null ? {} : {ariaLabel: column.ariaLabel})}\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 cap-datatable > table > thead {\n color: var(--table-header-color);\n background: var(--ui-gradient);\n }\n\n cap-datatable > table > thead > tr > th {\n position: sticky;\n inset-block-start: 0;\n z-index: 2;\n background: var(--ui-gradient);\n border: 2px groove #fff7;\n border-left: none;\n }\n\n cap-datatable > table > thead > tr > th:last-child {\n border-right: none;\n }\n `\n}\n","import type {UrlLike} from '@capillaryjs/capillary'\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 Capillary UI'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 '@capillaryjs/capillary'\nimport type {\n FetchLike,\n QueryHandlerLike,\n QuerySerializer,\n ReadableEmitter,\n} from '@capillaryjs/capillary'\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 = createLocalTableView(data, state, options.owner)\n return new ManagedTableDataSource(query, state, () => {\n query.dispose()\n ownedData?.dispose()\n })\n}\n\n/**\n * Package a caller-owned query with a locally derived sort/filter view.\n *\n * The supplied query remains application-owned; this source owns only the\n * derived view and its state emitters. This keeps query-shaped data on the\n * same interaction path as direct local data.\n */\nexport function createQueryTableDataSource<TRow extends TableRow>(\n options: QueryTableDataSourceOptions<TRow>,\n): TableDataSource<TRow> {\n assertTableQuery<TRow>(options.query)\n const state = createState(options)\n const query = createLocalTableView(options.query, state, options.owner)\n const retry = options.query.retry\n return new ManagedTableDataSource(\n query,\n state,\n () => query.dispose(),\n retry == null\n ? undefined\n : (cause?: unknown) => options.query.retry?.call(options.query, cause),\n )\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\ntype LocalTableViewSources<TRow extends TableRow> = readonly [\n ReadableEmitter<readonly TRow[] | undefined, unknown>,\n ValueEmitter<TableSort | null>,\n ValueEmitter<TableFilters>,\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 retry: ((cause?: unknown) => unknown) | undefined = query.retry,\n ) {\n this.sortEmitter = state.sortEmitter\n this.filtersEmitter = state.filtersEmitter\n if (retry != null) this.retry = (cause?: unknown) => 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 createLocalTableView<TRow extends TableRow>(\n data: ReadableEmitter<readonly TRow[] | undefined, unknown>,\n state: ManagedState,\n owner: unknown,\n): DerivedEmitter<readonly TRow[] | undefined, LocalTableViewSources<TRow>> {\n return new DerivedEmitter(\n [data, state.sortEmitter, state.filtersEmitter] as const,\n ([rows, sort, filters]): readonly TRow[] | undefined => rows == null\n ? undefined\n : applyLocalTableState(rows, sort, filters),\n {owner, purpose: 'local table view'},\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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport {ErrorMessage} from '../../status/statusPresentation.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?: CapillaryUiChild\n emptyMessage?: CapillaryUiChild\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(): CapillaryUiChild {\n const result = this.query?.get()\n const rows = result ?? []\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 replacesContent = status === FetchState.Initial\n || (status === FetchState.Loading && result === undefined)\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 {replacesContent ? <p role=\"status\">{this.capillaryUiMessage('dataTableLoading')}</p> : null}\n {status === FetchState.Error\n ? <ErrorMessage\n className=\"cap-error-banner\"\n error={error}\n fallback={this.capillaryUiMessage('dataTableLoadError')}\n />\n : null}\n {status === FetchState.Error && typeof this.dataSource?.retry === 'function'\n ? <button\n type=\"button\"\n onClick={() => this.dataSource?.retry?.('table retry')}\n >{this.capillaryUiMessage('dataTableRetry')}</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 {replacesContent\n ? this.renderPlaceholders()\n : rows.length > 0\n ? rows.map((row, index) =>\n this.renderRow(row, index, selectedKeys))\n : status === FetchState.Error\n ? null\n : <tr key=\"empty\">\n <td colSpan={this.columns.length}>\n {this.props.emptyMessage ?? this.capillaryUiMessage('dataTableEmpty')}\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 ): CapillaryUiChild {\n const key = this.rowKey(row, index)\n const selected = selectedKeys.has(key)\n return <tr\n key={String(key)}\n data-cap-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(): CapillaryUiChild[] {\n const count = this.props.placeholderCount ?? 5\n return Array.from({length: count}, (_, rowIndex) =>\n <tr key={`placeholder-${rowIndex}`} aria-hidden=\"true\">\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-cap-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, ErrorMessage]\n\n static override hostName = 'data-table'\n static override dataSurface = 'data' as const\n\n static css = css`\n & {\n display: block;\n position: relative;\n flex: 1 1 auto;\n min-inline-size: 0;\n min-block-size: 0;\n max-block-size: 100%;\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 position: relative;\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 cap-placeholder {\n font-size: var(--ui-font-size);\n height: var(--ui-font-size);\n }\n\n &:has(> cap-error) {\n outline: 1px solid var(--error-color);\n outline-offset: -1px;\n }\n\n &:has(> cap-error) > button {\n border-color: var(--error-color);\n }\n\n @media (forced-colors: active) {\n &:has(> cap-error) {\n outline: 2px solid Mark;\n }\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): CapillaryUiChild {\n if (value == null || typeof value === 'string' || typeof value === 'number') return value\n return String(value)\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild, Key} from '../../component.js'\n\nexport interface TreeNode<TValue = unknown> {\n id: Key\n label: CapillaryUiChild\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: CapillaryUiChild\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(): CapillaryUiChild {\n return this.props.children ?? []\n }\n}\n","import {DerivedEmitter} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css, isVNode} from '../../component.js'\nimport type {ComponentProps, CapillaryUiChild, Key} from '../../component.js'\nimport {componentClass, invoke} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {ErrorMessage} from '../../status/statusPresentation.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>[] | undefined, unknown>\n label: string\n placeholderCount?: number\n selectedKeyEmitter?: ValueEmitter<Key | null>\n expandedKeysEmitter?: ValueEmitter<Key[]>\n renderItem?: (node: TreeNode<TValue>, depth: number) => CapillaryUiChild\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>[] | undefined, 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>[] | undefined>(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(): CapillaryUiChild {\n const result = this.nodesEmitter.get()\n const nodes = result ?? []\n assertTreeNodes(nodes)\n const fetchState = this.nodesEmitter.getFetchState()\n const sourceError = this.nodesEmitter.getError()\n const isLoading = fetchState === FetchState.Initial || fetchState === FetchState.Loading\n const replacesContent = fetchState === FetchState.Initial\n || (fetchState === FetchState.Loading && result === undefined)\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 aria-busy={isLoading ? 'true' : null}>\n {fetchState === FetchState.Error\n ? <ErrorMessage\n className=\"cap-error-banner\"\n error={sourceError}\n fallback={this.capillaryUiMessage('treeViewLoadError')}\n />\n : null}\n {replacesContent\n ? <>\n <p role=\"status\">{this.capillaryUiMessage('treeViewLoading')}</p>\n <ul aria-hidden=\"true\">\n {Array.from({length: this.props.placeholderCount ?? 5}, (_, index) => {\n const depth = [0, 1, 2, 1, 0][index % 5] ?? 0\n return <li\n key={`placeholder-${index}`}\n style={{'--tree-depth': depth}}\n >\n <cap-expander>•</cap-expander>\n <Placeholder width={42 + (index % 5) * 9} />\n </li>\n })}\n </ul>\n </>\n : null}\n {fetchState === FetchState.Ready && visible.length === 0\n ? <p role=\"status\">{this.capillaryUiMessage('treeViewEmpty')}</p>\n : null}\n {!replacesContent && visible.length > 0\n ? <ul\n role=\"tree\"\n aria-label={this.props.label}\n aria-busy={isLoading ? 'true' : null}\n >\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 <cap-expander aria-hidden=\"true\">\n {hasChildren ? (isExpanded ? '▾' : '▸') : '•'}\n </cap-expander>\n <cap-label\n {...(labelClassName == null ? {} : {className: labelClassName})}\n {...(labelStyle == null ? {} : {style: labelStyle})}\n >{label}</cap-label>\n </li>\n })}\n </ul>\n : null}\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, Placeholder, ErrorMessage]\n\n static override hostName = 'tree-view'\n static override dataSurface = 'data' as const\n\n static css = css`\n & {\n display: flex;\n position: relative;\n flex: 1 1 auto;\n flex-direction: column;\n min-inline-size: 0;\n min-block-size: 0;\n max-block-size: 100%;\n overflow: auto;\n }\n\n & > [role=\"tree\"],\n & > ul[aria-hidden=\"true\"] {\n display: grid;\n align-content: start;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n & [role=\"treeitem\"],\n & > ul[aria-hidden=\"true\"] > li {\n display: flex;\n position: relative;\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 & > ul[aria-hidden=\"true\"] cap-placeholder {\n align-self: center;\n height: var(--ui-font-size);\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 & cap-expander {\n flex: 0 0 1rem;\n text-align: center;\n }\n\n & [role=\"treeitem\"][aria-expanded] > cap-expander {\n cursor: pointer;\n }\n\n & cap-label {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n & > [role=\"status\"] {\n margin: 0;\n padding: var(--ui-padding, 0.75rem);\n }\n\n &:has(> cap-error) {\n outline: 1px solid var(--error-color);\n outline-offset: -1px;\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 &:has(> cap-error) {\n outline: 2px solid Mark;\n }\n }\n `\n\n private reconcile(nodes: readonly TreeNode<TValue>[]): void {\n assertTreeNodes(nodes)\n const allKeys = new Set(flattenAll(nodes).map(({node}) => node.id))\n const selected = this.selectedKeyEmitter.get()\n if (this.ownedSelectedEmitter != null && selected != null && !allKeys.has(selected)) {\n this.selectedKeyEmitter.set(null, 'selected tree item removed')\n }\n const expanded = this.expandedKeysEmitter.get()\n const retained = expanded.filter((key) => allKeys.has(key))\n if (this.ownedExpandedEmitter != null && !sameKeys(expanded, retained)) {\n this.expandedKeysEmitter.set(retained, 'removed tree expansions reconciled')\n }\n if (this.focusedKey != null && !allKeys.has(this.focusedKey)) this.focusedKey = null\n }\n\n private selectNode(node: TreeNode<TValue>, event: Event): void {\n this.selectedKeyEmitter.set(node.id, 'tree item selected')\n invoke(this.props.onSelect, node, event)\n this.focusRow(node.id)\n }\n\n private toggleExpanded(key: Key): void {\n const expanded = this.expandedKeysEmitter.get()\n const contains = expanded.some((candidate) => Object.is(candidate, key))\n this.expandedKeysEmitter.set(\n contains\n ? expanded.filter((candidate) => !Object.is(candidate, key))\n : [...expanded, key],\n contains ? 'tree item collapsed' : 'tree item expanded',\n )\n }\n\n private handleKeyDown(\n event: KeyboardEvent,\n index: number,\n visible: readonly VisibleNode<TValue>[],\n ): void {\n const current = visible[index]\n if (current == null) return\n if (event.key === 'ArrowDown') return this.move(event, visible[index + 1]?.node.id)\n if (event.key === 'ArrowUp') return this.move(event, visible[index - 1]?.node.id)\n if (event.key === 'Home') return this.move(event, visible[0]?.node.id)\n if (event.key === 'End') return this.move(event, visible.at(-1)?.node.id)\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n const children = current.node.children ?? []\n if (children.length === 0) return\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (!expanded) this.toggleExpanded(current.node.id)\n else this.focusRow(children[0]!.id)\n return\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (expanded) this.toggleExpanded(current.node.id)\n else if (current.parentId != null) this.focusRow(current.parentId)\n return\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.selectNode(current.node, event)\n return\n }\n if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n this.handleTypeahead(event, visible, index)\n }\n }\n\n private move(event: KeyboardEvent, key: Key | undefined): void {\n if (key === undefined) return\n event.preventDefault()\n this.focusRow(key)\n }\n\n private focusRow(key: Key): void {\n this.focusedKey = key\n const rows = this.dom instanceof Element\n ? [...this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')]\n : []\n for (const row of rows) {\n const index = Number(row.dataset.index)\n const visible = flattenVisible(\n this.nodesEmitter.get() ?? [],\n new Set(this.expandedKeysEmitter.get()),\n )\n const matches = Object.is(visible[index]?.node.id, key)\n row.tabIndex = matches ? 0 : -1\n if (matches) row.focus()\n }\n }\n\n private handleTypeahead(\n event: KeyboardEvent,\n visible: readonly VisibleNode<TValue>[],\n index: number,\n ): void {\n event.preventDefault()\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.typeahead += event.key.toLocaleLowerCase()\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = ''\n this.typeaheadTimer = null\n }, 650)\n const candidates = [...visible.slice(index + 1), ...visible.slice(0, index + 1)]\n const match = candidates.find(({node}) => textValue(node)\n .toLocaleLowerCase()\n .startsWith(this.typeahead))\n if (match != null) this.focusRow(match.node.id)\n }\n}\n\nfunction extractDeclarativeNodes<TValue>(children: ComponentProps['children']): TreeNode<TValue>[] {\n const values = Array.isArray(children) ? children : children == null ? [] : [children]\n return values.filter((child) => isVNode(child) && child.type === TreeItem).map((child) => {\n if (!isVNode(child)) throw new TypeError('TreeView children must be TreeItem nodes')\n const props = child.props as unknown as TreeItemProps<TValue>\n return {\n id: props.id,\n label: props.label,\n ...(props.textValue == null ? {} : {textValue: props.textValue}),\n ...(props.value === undefined ? {} : {value: props.value}),\n children: extractDeclarativeNodes<TValue>(props.children),\n }\n })\n}\n\nfunction flattenVisible<TValue>(\n nodes: readonly TreeNode<TValue>[],\n expanded: ReadonlySet<Key>,\n): VisibleNode<TValue>[] {\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n if ((node.children?.length ?? 0) > 0 && expanded.has(node.id)) {\n visit(node.children ?? [], depth + 1, node.id)\n }\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction flattenAll<TValue>(nodes: readonly TreeNode<TValue>[]): VisibleNode<TValue>[] {\n const allKeys = new Set<Key>()\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n if (allKeys.has(node.id)) throw new Error(`Duplicate tree item id: ${String(node.id)}`)\n allKeys.add(node.id)\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n visit(node.children ?? [], depth + 1, node.id)\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction textValue<TValue>(node: TreeNode<TValue>): string {\n if (node.textValue != null) return node.textValue\n if (typeof node.label === 'string' || typeof node.label === 'number') return String(node.label)\n return String(node.id)\n}\n\nfunction sameKeys(left: readonly Key[], right: readonly Key[]): boolean {\n return left.length === right.length\n && left.every((value, index) => Object.is(value, right[index]))\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction isExpanderTarget(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest('cap-expander') != null\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, LivePropContract} from '../component.js'\nimport {componentClass, controlId, invoke} from '../controlUtils.js'\nimport {ErrorMessage} from '../status/statusPresentation.js'\n\nconst buttonLiveProps = ['disabled', 'pressed', 'busy', 'error'] as const\n\nexport interface ButtonProps extends ComponentProps,\n LivePropContract<(typeof buttonLiveProps)[number]> {\n label?: CapillaryUiChild\n type?: 'button' | 'reset' | 'submit'\n disabled?: boolean\n pressed?: boolean\n busy?: boolean\n busyLabel?: CapillaryUiChild\n error?: unknown\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 static override dependencies = [ErrorMessage]\n readonly errorId: string\n\n constructor(props: ButtonProps = {}) {\n super(props)\n this.errorId = `${controlId('button', props.id)}-error`\n if (props.onClick != null && typeof props.onClick !== 'function') {\n throw new TypeError('Button onClick must be a function')\n }\n }\n\n render(): CapillaryUiChild {\n const {\n children = [],\n label,\n type = 'button',\n disabled = false,\n pressed,\n busy = false,\n busyLabel,\n error = null,\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 aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onClick={(event: MouseEvent) => {\n if (!unavailable) invoke(onClick, event)\n }}\n >{content}</button>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n }\n\n static override hostName = 'button'\n\n static override css = css`\n & > button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: var(--control-min-height, 2em);\n margin: 0;\n padding: 0 5px;\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: inherit;\n user-select: none;\n white-space: nowrap;\n }\n\n & {\n display: inline-flex;\n position: relative;\n flex-flow: row wrap;\n align-items: center;\n align-content: center;\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: 1.2;\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-color: var(--button-border-disabled);\n cursor: not-allowed;\n pointer-events: none;\n }\n\n & > button[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--button-background-disabled);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > button[aria-invalid=\"true\"] {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > button[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > button[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","import {Button} from '../menu/button.js'\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild, 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 {DeclarativeRegion, readDeclarativeRegions} from '../layout/declarativeRegion.js'\n\nconst dialogLiveProps = ['showCloseButton'] as const\n\n/** Caller-defined actions rendered in a Dialog footer before its close button. */\nexport class DialogActions extends DeclarativeRegion {}\n\nexport interface DialogProps extends ValueControlProps<boolean>,\n LivePropContract<(typeof dialogLiveProps)[number]> {\n id?: string | number | null\n title: CapillaryUiChild\n description?: CapillaryUiChild\n /** @deprecated Supply `<DialogActions>` as a direct child. */\n actions?: never\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(): CapillaryUiChild {\n if (this.props.actions != null) {\n throw new Error('Dialog action content must use a direct DialogActions child')\n }\n const {\n title,\n description,\n closeLabel = this.capillaryUiMessage('dialogCloseLabel'),\n showCloseButton = true,\n children = [],\n } = this.props\n const {content, regions} = readDeclarativeRegions('Dialog', children, {\n actions: DialogActions,\n })\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 <cap-content>{content}</cap-content>\n {regions.actions == null && !showCloseButton ? null : <footer>\n {regions.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, DialogActions]\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 > cap-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 user-select: none;\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 > cap-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, 2em);\n color: var(--ui-text-color);\n font-family: inherit;\n font-size: var(--ui-font-size);\n line-height: 1.2;\n box-sizing: border-box;\n user-select: none;\n }\n\n cap-groupbox > cap-content > cap-layout > & {\n align-self: stretch;\n }\n\n & > label {\n align-self: center;\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 & {\n display: grid;\n grid-template-columns: minmax(var(--input-min-width, 6rem), 1fr);\n min-width: 0;\n }\n\n &:has(> label) {\n grid-template-columns: max-content minmax(var(--input-min-width, 6rem), 1fr);\n }\n\n & > cap-selectshell {\n display: flex;\n flex-flow: row nowrap;\n position: relative;\n isolation: isolate;\n min-height: var(--control-min-height, 2em);\n width: var(--input-width, 15rem);\n max-width: 100%;\n min-width: var(--input-min-width, 6rem);\n box-sizing: border-box;\n margin-left: auto;\n }\n\n & > cap-selectshell > select {\n position: relative;\n z-index: 1;\n min-height: var(--control-min-height, 2em);\n width: var(--input-width, 15rem);\n max-width: 100%;\n min-width: var(--input-min-width, 6rem);\n margin: 0;\n padding: 0 5px;\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 user-select: none;\n white-space: nowrap;\n }\n\n & > cap-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 & > cap-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 & > cap-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 & > cap-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 & > cap-selectshell:has(> select:disabled)::after {\n background: var(--dropdown-underlay-background-disabled);\n border: var(--dropdown-underlay-border-disabled);\n }\n\n & > cap-selectshell > select:focus-visible {\n outline: 2px solid transparent;\n outline-offset: 1px;\n box-shadow: var(--focus-ring);\n }\n\n & > cap-selectshell:has(> select[aria-busy=\"true\"]:not([aria-invalid=\"true\"]))::after {\n background: var(--working-background-image), var(--dropdown-underlay-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > cap-selectshell > select[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--dropdown-select-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > cap-selectshell:has(> select[aria-invalid=\"true\"])::before,\n & > cap-selectshell:has(> select[aria-invalid=\"true\"])::after,\n & > cap-selectshell > select[aria-invalid=\"true\"] {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > cap-selectshell:has(> select[aria-busy=\"true\"])::after,\n & > cap-selectshell > select[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > cap-selectshell::before,\n & > cap-selectshell::after {\n display: none;\n }\n\n & > cap-selectshell > select {\n appearance: auto;\n padding-inline-end: var(--space-sm);\n }\n\n & > cap-selectshell > select[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","import {Emitter, FetchState} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\nimport type {CapillaryUiChild, 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 {ErrorMessage} from '../status/statusPresentation.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?: CapillaryUiChild\n disabled?: boolean\n}\n\nconst dropdownLiveProps = ['disabled', 'required', 'busy', '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?: CapillaryUiChild\n name?: string\n disabled?: boolean\n required?: boolean\n busy?: boolean\n error?: unknown\n placeholder?: CapillaryUiChild\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 static override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n label,\n name,\n disabled = false,\n required = false,\n busy = false,\n error = null,\n placeholder = this.capillaryUiMessage('dropdownPlaceholder'),\n ariaLabel,\n } = this.props\n const options = this.optionsEmitter.get() ?? []\n assertOptions<DropdownOption<TValue>>(options)\n const currentValue = this.valueEmitter.get()\n const optionsState = this.optionsEmitter.getFetchState()\n const sourceBusy = !this.ownsOptionsEmitter\n && (optionsState === FetchState.Initial || optionsState === FetchState.Loading)\n const hasSourceError = !this.ownsOptionsEmitter && optionsState === FetchState.Error\n const sourceError = hasSourceError\n ? this.optionsEmitter.getError()\n : null\n const displayedError = error ?? (hasSourceError\n ? sourceError ?? this.capillaryUiMessage('dropdownLoadError')\n : null)\n const isBusy = busy || sourceBusy\n\n const Host = this.Host\n return <Host\n className={this.hostClass()}\n >\n {label == null ? null : <label htmlFor={this.inputId}>{label}</label>}\n <cap-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-busy={isBusy ? 'true' : null}\n aria-invalid={displayedError == null ? null : 'true'}\n aria-describedby={displayedError == null ? null : this.errorId}\n onChange={(event: Event) => this.selectOption(event)}\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 >{this.optionLabel(option)}</option>\n })}\n </select>\n </cap-selectshell>\n {displayedError == null ? null\n : <ErrorMessage id={this.errorId} error={displayedError} />}\n </Host>\n }\n\n /** Host class list. Subclasses may prepend a stable marker class. */\n protected hostClass(): string {\n return componentClass(this.props)\n }\n\n /** Resolve the rendered label for one option. */\n protected optionLabel(option: DropdownOption<TValue>): CapillaryUiChild {\n return option.label ?? String(option.value)\n }\n\n /** Handle a native select change: resolve the option, update the value, emit. */\n protected selectOption(event: Event): void {\n const raw = eventValue(event, 'dropdown change')\n const options = this.optionsEmitter.get() ?? []\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 this.emitChange(nextValue, option, event)\n }\n\n /** Emit the public change callback. Subclasses may forward extra detail. */\n protected emitChange(\n value: TValue,\n _option: DropdownOption<TValue> | undefined,\n event: Event,\n ): void {\n invoke(this.props.onChange, value, event)\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 && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === '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, CapillaryUiChild, 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?: CapillaryUiChild\n htmlFor?: string\n}\n\nexport class Label extends Component<LabelProps> {\n static override liveProps = labelLiveProps\n\n render(): CapillaryUiChild {\n const {text, htmlFor, children} = this.props\n return <label\n className={componentClass(this.props) || undefined}\n htmlFor={htmlFor}\n data-cap-component=\"label\"\n >\n {text ?? children}\n </label>\n }\n}\n","import {Component, css} from '../component.js'\nimport type {\n ComponentProps,\n CapillaryUiChild,\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 {ErrorMessage} from '../status/statusPresentation.js'\nimport {CheckableControl} from './CheckableControl.js'\n\nexport type RadioOption<TValue extends Key = string> = readonly [\n value: TValue,\n label: CapillaryUiChild,\n]\n\nconst radioButtonLiveProps = ['checked', 'disabled', 'required', 'busy', 'error'] as const\nconst radioGroupLiveProps = ['disabled', 'required', 'busy', 'error'] as const\n\nexport interface RadioButtonProps extends ComponentProps,\n LivePropContract<(typeof radioButtonLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n name?: string\n value?: Key\n checked?: boolean\n disabled?: boolean\n required?: boolean\n busy?: 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 static override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n label = this.props.value ?? this.capillaryUiMessage('radioOptionLabel'),\n checked = false,\n disabled = false,\n required = false,\n busy = 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-busy={busy ? 'true' : null}\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 <cap-checkshell aria-hidden=\"true\" />\n {label}\n </label>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n }\n\n static override hostName = 'radio-button'\n\n static override css = css`\n & > label > input[type=\"radio\"] + cap-checkshell {\n border-radius: 50%;\n }\n\n & > label > input[type=\"radio\"]:checked + cap-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?: CapillaryUiChild\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 /** Loading presentation; does not disable the group. */\n busy?: 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, ErrorMessage]\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(): CapillaryUiChild {\n const {\n options = [],\n label,\n disabled = false,\n required = false,\n busy = false,\n error = null,\n } = 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-busy={busy ? '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 busy={busy && error == null}\n onChange={(checked, event) => {\n if (checked) this.selectOption(value, event)\n }}\n />)}\n </fieldset>\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\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 & {\n position: relative;\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 & > fieldset[aria-invalid=\"true\"] cap-checkshell {\n border-color: var(--error-color);\n }\n\n & > fieldset[aria-invalid=\"true\"] cap-radiobutton > label {\n color: var(--error-color);\n }\n\n @media (forced-colors: active) {\n & > fieldset[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\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 {CapillaryUiChild, 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 {ErrorMessage} from '../status/statusPresentation.js'\nimport {LabeledInputControl} from './LabeledInputControl.js'\n\nconst textboxLiveProps = ['disabled', 'required', 'readOnly', 'busy', 'error'] as const\n\nexport interface TextboxProps extends ValueControlProps<string>,\n LivePropContract<(typeof textboxLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n placeholder?: string\n type?: string\n name?: string\n disabled?: boolean\n required?: boolean\n readOnly?: boolean\n busy?: 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 static override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n label,\n placeholder,\n type = 'text',\n name,\n disabled = false,\n required = false,\n readOnly = false,\n busy = 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-busy={busy ? 'true' : 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 : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n }\n\n static override hostName = 'textbox'\n\n static override css = css`\n & {\n display: grid;\n grid-template-columns: minmax(var(--input-min-width, 6rem), 1fr);\n align-items: center;\n min-width: 0;\n }\n\n &:has(> label) {\n grid-template-columns: max-content minmax(var(--input-min-width, 6rem), 1fr);\n }\n\n & > input {\n min-height: var(--control-min-height, 2em);\n width: var(--input-width, 15rem);\n max-width: 100%;\n min-width: var(--input-min-width, 6rem);\n margin: 0;\n padding: 0 5px;\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 appearance: none;\n pointer-events: all;\n user-select: text;\n white-space: nowrap;\n cursor: text;\n margin-left: auto;\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 & > input[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--input-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > input:disabled[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--input-background-disabled);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n }\n\n & > input[aria-invalid=\"true\"] {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > input[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > input[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\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 {css} from '../component.js'\nimport type {CapillaryUiChild, Key, LivePropContract} from '../component.js'\nimport {LabeledInputControl} from './LabeledInputControl.js'\nimport {\n assertOptions,\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\nimport {ErrorMessage} from '../status/statusPresentation.js'\n\nexport type ToggleOption<TValue extends Key = string> = readonly [\n value: TValue,\n label: CapillaryUiChild,\n]\n\nconst toggleLiveProps = ['disabled', 'required', 'busy', '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?: CapillaryUiChild\n ariaLabel?: string\n disabled?: boolean\n required?: boolean\n busy?: 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 LabeledInputControl<ToggleProps<TValue>> {\n static override liveProps = toggleLiveProps\n static override dependencies = [ErrorMessage]\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(): CapillaryUiChild {\n const {\n options = [],\n label,\n disabled = false,\n required = false,\n busy = 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 : <cap-label id={this.legendId}>{label}</cap-label>}\n <cap-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-busy={busy ? '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>)}</cap-options>\n {error == null ? null : <ErrorMessage id={this.errorId} error={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 min-height: var(--control-min-height, 2em);\n display: flex;\n position: relative;\n flex-flow: row nowrap;\n align-content: center;\n align-items: center;\n gap: .75em;\n color: var(--text-color);\n outline: none;\n }\n\n & > cap-label {\n display: block;\n align-self: center;\n }\n\n & > cap-options {\n display: flex;\n min-height: var(--control-min-height, 2em);\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 margin-left: auto;\n }\n\n & > cap-options > button[role=\"radio\"] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-height: var(--control-min-height, 2em);\n min-width: 2em;\n margin: 0;\n padding: 0 6px;\n position: relative;\n isolation: isolate;\n font: inherit;\n color: var(--button-color);\n background: transparent;\n user-select: none;\n white-space: nowrap;\n box-sizing: border-box;\n border: 0;\n border-radius: 0;\n cursor: default;\n }\n\n /* Chrome may overlap adjacent segments, but never moves their text. */\n & > cap-options > button[role=\"radio\"]::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -1;\n pointer-events: none;\n box-sizing: border-box;\n background: var(--toggle-button-background);\n border: var(--button-border);\n border-left: none;\n border-right: none;\n border-radius: inherit;\n box-shadow: var(--toggle-button-shadow);\n }\n\n & > cap-options > button[role=\"radio\"]:hover:not(:disabled)[aria-checked=\"false\"]::before {\n background: var(--button-background-hover);\n }\n\n & > cap-options > button[role=\"radio\"]:first-of-type {\n border-radius: var(--radius-md) 0 0 var(--radius-md);\n }\n\n & > cap-options > button[role=\"radio\"]:first-of-type::before {\n border: var(--button-border);\n border-right: none;\n }\n\n & > cap-options > button[role=\"radio\"]:last-of-type {\n border-radius: 0 var(--radius-md) var(--radius-md) 0;\n }\n\n & > cap-options > button[role=\"radio\"]:only-of-type {\n border-radius: var(--radius-md);\n }\n\n & > cap-options > button[role=\"radio\"]:last-of-type::before {\n border: var(--button-border);\n border-left: none;\n }\n\n & > cap-options > button[role=\"radio\"][aria-checked=\"false\"]\n + [role=\"radio\"][aria-checked=\"false\"]::before {\n border-inline-start: var(--button-border);\n border-inline-start-color: var(--toggle-inactive-shared-border-color);\n }\n\n & > cap-options > button[role=\"radio\"][aria-checked=\"true\"] {\n color: var(--selection-color);\n z-index: var(--toggle-button-selected-z-index);\n }\n\n & > cap-options > button[role=\"radio\"][aria-checked=\"true\"]::before {\n background: var(--toggle-button-background-checked);\n border: var(--toggle-button-border-checked);\n box-shadow: none;\n inset-inline: var(--toggle-button-selected-inline-overlap);\n }\n\n & > cap-options > button[role=\"radio\"]:disabled {\n color: var(--input-color-disabled);\n cursor: not-allowed;\n }\n\n & > cap-options > button[role=\"radio\"]:disabled::before {\n background: var(--button-background-disabled);\n border: var(--button-border-disabled);\n }\n\n & > cap-options[aria-busy=\"true\"]:not([aria-invalid=\"true\"])\n > button[role=\"radio\"]::before {\n background: var(--working-background-image), var(--toggle-button-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > cap-options[aria-busy=\"true\"]:not([aria-invalid=\"true\"])\n > button[role=\"radio\"][aria-checked=\"true\"]::before {\n background: var(--working-background-image), var(--toggle-button-background-checked);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n }\n\n & > cap-options[aria-invalid=\"true\"] > button[role=\"radio\"]::before {\n border-color: var(--error-color);\n }\n\n & > cap-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 @media (prefers-reduced-motion: reduce) {\n & > cap-options[aria-busy=\"true\"] > button[role=\"radio\"]::before {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > cap-options[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n\nfunction validateToggleOptions<TValue extends Key>(\n options: unknown,\n): asserts options is readonly ToggleOption<TValue>[] {\n assertOptions<unknown>(options)\n for (const option of options) {\n if (!Array.isArray(option) || option.length < 2) {\n throw new TypeError('Toggle options must be [value, label] tuples')\n }\n }\n}\n","import {css} from '../../component.js'\nimport type {CapillaryUiChild, 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 {ErrorMessage} from '../../status/statusPresentation.js'\nimport {LabeledInputControl} from '../LabeledInputControl.js'\n\nconst temporalInputLiveProps = ['disabled', 'required', 'readOnly', 'busy', 'error'] as const\n\n/**\n * Shared props for the native temporal line inputs. The concrete component\n * fixes the value domain — `CivilDate`, `TimeString`, or `LocalDateTime` —\n * through `TValue`; an empty input is reported as `null`.\n * @experimental This interface is experimental and may change in any release.\n */\nexport interface TemporalInputProps<TValue> extends ValueControlProps<TValue | null>,\n LivePropContract<(typeof temporalInputLiveProps)[number]> {\n id?: string | number | null\n label?: CapillaryUiChild\n ariaLabel?: string\n name?: string\n autoComplete?: string\n disabled?: boolean\n required?: boolean\n readOnly?: boolean\n busy?: boolean\n error?: unknown\n /** Earliest accepted value, in the component's value format. */\n min?: TValue | undefined\n /** Latest accepted value, in the component's value format. */\n max?: TValue | undefined\n /**\n * Native `step` granularity. Days for `DatePicker`; seconds for\n * `TimePicker` and `DateTimePicker`, where `'any'` disables stepping.\n */\n step?: number | 'any' | undefined\n inputRef?: Ref<HTMLInputElement>\n onInput?: (value: TValue | null, event: Event) => void\n onChange?: (value: TValue | null, event: Event) => void\n}\n\n/**\n * Base class for the temporal line inputs. Subclasses declare the native\n * input `type` and the value-domain validator; this class owns the shared\n * label/input/error rendering, value emission, and event plumbing.\n * @experimental This class is experimental and may change in any release.\n */\nexport abstract class TemporalInput<\n TValue,\n TProps extends TemporalInputProps<TValue> = TemporalInputProps<TValue>,\n> extends LabeledInputControl<TProps> {\n static override liveProps = temporalInputLiveProps\n static override dependencies = [ErrorMessage]\n readonly inputId: string\n readonly errorId: string\n readonly valueEmitter: ValueEmitter<TValue | null>\n\n /** The native `<input>` type rendered by the concrete component. */\n protected abstract readonly inputType: 'date' | 'time' | 'datetime-local'\n\n /** Whether a raw input string belongs to this component's value domain. */\n protected abstract isValidValue(raw: string): boolean\n\n constructor(props: TProps) {\n super(props)\n const hostName = (this.constructor as {hostName?: string | null}).hostName\n this.inputId = controlId(hostName ?? 'temporal', props.id)\n this.errorId = `${this.inputId}-error`\n this.valueEmitter = createValueEmitter(this, props, null, `${hostName ?? 'temporal'} value`)\n }\n\n initialize(): void {\n this.watch(this.valueEmitter)\n }\n\n private handleEvent(event: Event): void {\n const input = event.currentTarget as HTMLInputElement\n const raw = input.value\n // An empty or domain-valid entry updates the emitter; an invalid\n // in-progress entry is reported as null without touching the emitter,\n // so the re-render cannot clobber the text the user is still typing.\n const valid = raw === '' || this.isValidValue(raw)\n const value = valid && raw !== '' ? raw as TValue : null\n if (valid && this.valueEmitter.get() !== value) {\n this.valueEmitter.set(value, `${this.inputType} input`)\n }\n const {onInput, onChange} = this.props\n if (event.type === 'input') {\n invoke(onInput, value, event)\n } else if (event.type === 'change') {\n invoke(onChange, value, event)\n }\n }\n\n render(): CapillaryUiChild {\n const {\n label,\n ariaLabel,\n name,\n autoComplete,\n disabled = false,\n required = false,\n readOnly = false,\n busy = false,\n error = null,\n min,\n max,\n step,\n inputRef,\n } = this.props\n const value = this.valueEmitter.get()\n\n const Host = this.Host\n return (\n <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={this.inputType}\n value={value ?? ''}\n min={min}\n max={max}\n step={step}\n autoComplete={autoComplete}\n disabled={disabled}\n required={required}\n readOnly={readOnly}\n ref={inputRef}\n aria-label={label == null ? ariaLabel : null}\n aria-busy={busy ? 'true' : null}\n aria-invalid={error == null ? null : 'true'}\n aria-describedby={error == null ? null : this.errorId}\n onInput={(event: Event) => this.handleEvent(event)}\n onChange={(event: Event) => this.handleEvent(event)}\n />\n {error == null ? null : <ErrorMessage id={this.errorId} error={error} />}\n </Host>\n )\n }\n\n static override css = css`\n & {\n display: grid;\n grid-template-columns: minmax(var(--input-min-width, 6rem), 1fr);\n align-items: center;\n min-width: 0;\n }\n\n &:has(> label) {\n grid-template-columns: max-content minmax(var(--input-min-width, 6rem), 1fr);\n }\n\n & > input {\n min-height: var(--control-min-height, 2em);\n width: var(--input-width, max-content);\n max-width: 100%;\n min-width: var(--input-min-width, 6rem);\n margin: 0;\n margin-left: auto;\n padding: 0 5px;\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 }\n\n & > input:disabled,\n & > input[readonly] {\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 & > input[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--input-background);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n animation: cap-working-progress .55s linear infinite;\n }\n\n & > input:disabled[aria-busy=\"true\"]:not([aria-invalid=\"true\"]) {\n background: var(--working-background-image), var(--input-background-disabled);\n background-repeat: repeat, no-repeat;\n background-size: 2rem 2rem, 100% 100%;\n }\n\n & > input[aria-invalid=\"true\"] {\n border-color: var(--error-color);\n }\n\n @media (prefers-reduced-motion: reduce) {\n & > input[aria-busy=\"true\"] {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > input[aria-invalid=\"true\"] {\n outline: 2px solid Mark;\n outline-offset: 1px;\n }\n }\n `\n}\n","const CIVIL_DATE_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/\n\nconst DAY_MILLISECONDS = 86_400_000\n\n/**\n * A wall-clock date in ISO-8601 `YYYY-MM-DD` form.\n * @experimental This type is experimental and may change in any release.\n */\nexport type CivilDate = string\n\n/** @experimental This interface is experimental and may change in any release. */\nexport interface CivilDateParts {\n readonly year: number\n readonly month: number\n readonly day: number\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function isCivilDate(value: unknown): value is CivilDate {\n if (typeof value !== 'string') return false\n return CIVIL_DATE_PATTERN.test(value) && parseCivilDate(value) != null\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function parseCivilDate(value: CivilDate | string | null | undefined): CivilDateParts | null {\n if (value == null) return null\n const match = CIVIL_DATE_PATTERN.exec(value)\n if (match == null) return null\n const year = Number(match[1])\n const month = Number(match[2])\n const day = Number(match[3])\n const milliseconds = Date.UTC(year, month - 1, day)\n const parsed = new Date(milliseconds)\n if (\n Number.isNaN(milliseconds)\n || parsed.getUTCFullYear() !== year\n || parsed.getUTCMonth() !== month - 1\n || parsed.getUTCDate() !== day\n ) {\n return null\n }\n return {year, month, day}\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function formatCivilDate(parts: CivilDateParts): CivilDate {\n const year = String(parts.year).padStart(4, '0')\n const month = String(parts.month).padStart(2, '0')\n const day = String(parts.day).padStart(2, '0')\n const candidate = `${year}-${month}-${day}` as CivilDate\n if (parseCivilDate(candidate) == null) {\n throw new TypeError(`Invalid civil date: ${candidate}`)\n }\n return candidate\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function civilDateToDay(value: CivilDate): number {\n const parts = parseCivilDate(value)\n if (parts == null) throw new TypeError(`Invalid civil date: ${value}`)\n return Math.floor(Date.UTC(parts.year, parts.month - 1, parts.day) / DAY_MILLISECONDS)\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function dayToCivilDate(day: number): CivilDate {\n if (!Number.isInteger(day)) throw new TypeError('Civil day must be an integer')\n return new Date(day * DAY_MILLISECONDS).toISOString().slice(0, 10) as CivilDate\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function addCivilDays(value: CivilDate, days: number): CivilDate {\n if (!Number.isInteger(days)) throw new TypeError('Civil date offset must be an integer')\n return dayToCivilDate(civilDateToDay(value) + days)\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function todayCivilDate(now: Date = new Date()): CivilDate {\n if (!(now instanceof Date) || Number.isNaN(now.getTime())) {\n throw new TypeError('todayCivilDate requires a valid Date')\n }\n return `${String(now.getFullYear()).padStart(4, '0')}-${String(\n now.getMonth() + 1,\n ).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}` as CivilDate\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function compareCivilDates(left: CivilDate, right: CivilDate): number {\n return civilDateToDay(left) - civilDateToDay(right)\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function daysInMonth(year: number, month: number): number {\n const next = month === 12 ? {year: year + 1, month: 1} : {year, month: month + 1}\n const first = Date.UTC(next.year, next.month - 1, 1)\n const previous = new Date(first - DAY_MILLISECONDS)\n return previous.getUTCDate()\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function startOfMonthDay(year: number, month: number): number {\n return new Date(Date.UTC(year, month - 1, 1)).getUTCDay()\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function addMonths(year: number, month: number, delta: number): {year: number; month: number} {\n const total = (year * 12 + (month - 1)) + delta\n const nextYear = Math.floor(total / 12)\n const nextMonth = ((total % 12) + 12) % 12 + 1\n return {year: nextYear, month: nextMonth}\n}\n","import type {CivilDate} from './civilDate.js'\nimport {isCivilDate} from './civilDate.js'\nimport {TemporalInput} from './TemporalInput.js'\nimport type {TemporalInputProps} from './TemporalInput.js'\n\n/**\n * Props for `DatePicker`. Values, `min`, and `max` are `CivilDate` strings in\n * `YYYY-MM-DD` form; `step` is a day count.\n * @experimental This interface is experimental and may change in any release.\n */\nexport interface DatePickerProps extends TemporalInputProps<CivilDate> {\n /** Day granularity of the native date input. */\n step?: number | undefined\n}\n\n/**\n * Wall-clock date input backed by the native `<input type=\"date\">` element.\n * The emitted value is a `CivilDate` string, or `null` while the field is\n * empty or holds an incomplete entry.\n * @experimental This component is experimental and may change in any release.\n */\nexport class DatePicker extends TemporalInput<CivilDate, DatePickerProps> {\n protected override readonly inputType = 'date' as const\n\n protected override isValidValue(raw: string): boolean {\n return isCivilDate(raw)\n }\n\n static override hostName = 'datepicker'\n}\n","const TIME_PATTERN = /^(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?$/\n\n/**\n * A wall-clock time in `HH:mm` form, with optional `:ss` seconds and `.sss`\n * milliseconds — the value format produced by the native\n * `<input type=\"time\">` element.\n * @experimental This type is experimental and may change in any release.\n */\nexport type TimeString = string\n\n/** @experimental This interface is experimental and may change in any release. */\nexport interface TimeParts {\n readonly hours: number\n readonly minutes: number\n readonly seconds?: number\n readonly milliseconds?: number\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function isTimeString(value: unknown): value is TimeString {\n if (typeof value !== 'string') return false\n return TIME_PATTERN.test(value) && parseTime(value) != null\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function parseTime(value: TimeString | string | null | undefined): TimeParts | null {\n if (value == null) return null\n const match = TIME_PATTERN.exec(value)\n if (match == null) return null\n const hours = Number(match[1])\n const minutes = Number(match[2])\n const seconds = match[3] == null ? 0 : Number(match[3])\n const milliseconds = match[4] == null ? 0 : Number(match[4].padEnd(3, '0'))\n if (hours > 23 || minutes > 59 || seconds > 59) return null\n return {hours, minutes, seconds, milliseconds}\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function formatTime(parts: TimeParts): TimeString {\n const seconds = parts.seconds ?? 0\n const milliseconds = parts.milliseconds ?? 0\n if (\n !Number.isInteger(parts.hours) || parts.hours < 0 || parts.hours > 23\n || !Number.isInteger(parts.minutes) || parts.minutes < 0 || parts.minutes > 59\n || !Number.isInteger(seconds) || seconds < 0 || seconds > 59\n || !Number.isInteger(milliseconds) || milliseconds < 0 || milliseconds > 999\n ) {\n throw new TypeError(`Invalid time parts: ${JSON.stringify(parts)}`)\n }\n const hours = String(parts.hours).padStart(2, '0')\n const minutes = String(parts.minutes).padStart(2, '0')\n let value = `${hours}:${minutes}`\n if (seconds !== 0 || milliseconds !== 0) {\n value += `:${String(seconds).padStart(2, '0')}`\n if (milliseconds !== 0) value += `.${String(milliseconds).padStart(3, '0')}`\n }\n return value as TimeString\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function timeToMinutes(value: TimeString): number {\n const parts = parseTime(value)\n if (parts == null) throw new TypeError(`Invalid time: ${value}`)\n return parts.hours * 60 + parts.minutes\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function minutesToTime(minutes: number): TimeString {\n if (!Number.isInteger(minutes) || minutes < 0 || minutes >= 24 * 60) {\n throw new TypeError(`Invalid time minutes: ${minutes}`)\n }\n return formatTime({hours: Math.floor(minutes / 60), minutes: minutes % 60})\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function timeStepOptions(\n min: TimeString | null | undefined,\n max: TimeString | null | undefined,\n step: number,\n): {value: TimeString; label: string}[] {\n if (!Number.isInteger(step) || step <= 0) throw new TypeError('Time step must be a positive integer')\n const minMinutes = min == null ? 0 : timeToMinutes(min)\n const maxMinutes = max == null ? (24 * 60 - 1) : timeToMinutes(max)\n if (maxMinutes < minMinutes) throw new TypeError('max time must be >= min time')\n const options: {value: TimeString; label: string}[] = []\n for (let minutes = minMinutes; minutes <= maxMinutes; minutes += step) {\n const value = minutesToTime(minutes)\n options.push({value, label: value})\n }\n return options\n}\n","import {TemporalInput} from './TemporalInput.js'\nimport type {TemporalInputProps} from './TemporalInput.js'\nimport type {TimeString} from './timeString.js'\nimport {isTimeString} from './timeString.js'\n\n/**\n * Props for `TimePicker`. Values, `min`, and `max` are `TimeString` strings in\n * `HH:mm` form (with optional seconds); `step` is a second count, or `'any'`\n * to disable stepping.\n * @experimental This interface is experimental and may change in any release.\n */\nexport interface TimePickerProps extends TemporalInputProps<TimeString> {}\n\n/**\n * Wall-clock time input backed by the native `<input type=\"time\">` element.\n * The emitted value is a `TimeString`, or `null` while the field is empty or\n * holds an incomplete entry.\n * @experimental This component is experimental and may change in any release.\n */\nexport class TimePicker extends TemporalInput<TimeString, TimePickerProps> {\n protected override readonly inputType = 'time' as const\n\n protected override isValidValue(raw: string): boolean {\n return isTimeString(raw)\n }\n\n static override hostName = 'timepicker'\n}\n","import type {CivilDate, CivilDateParts} from './civilDate.js'\nimport {formatCivilDate, parseCivilDate} from './civilDate.js'\nimport type {TimeParts, TimeString} from './timeString.js'\nimport {formatTime, parseTime} from './timeString.js'\n\nconst LOCAL_DATE_TIME_PATTERN = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,3})?)?)$/\n\n/**\n * A wall-clock date and time in `YYYY-MM-DDTHH:mm` form, with optional\n * `:ss` seconds and `.sss` milliseconds — the value format produced by the\n * native `<input type=\"datetime-local\">` element.\n * @experimental This type is experimental and may change in any release.\n */\nexport type LocalDateTime = string\n\n/** @experimental This interface is experimental and may change in any release. */\nexport interface LocalDateTimeParts extends CivilDateParts, TimeParts {}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function isLocalDateTime(value: unknown): value is LocalDateTime {\n return typeof value === 'string' && parseLocalDateTime(value) != null\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function parseLocalDateTime(\n value: LocalDateTime | string | null | undefined,\n): LocalDateTimeParts | null {\n if (value == null) return null\n const match = LOCAL_DATE_TIME_PATTERN.exec(value)\n if (match == null) return null\n const date = parseCivilDate(match[1])\n const time = parseTime(match[2])\n if (date == null || time == null) return null\n return {...date, ...time}\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function formatLocalDateTime(parts: LocalDateTimeParts): LocalDateTime {\n return `${formatCivilDate(parts)}T${formatTime(parts)}` as LocalDateTime\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function compareLocalDateTimes(left: LocalDateTime, right: LocalDateTime): number {\n const leftParts = parseLocalDateTime(left)\n const rightParts = parseLocalDateTime(right)\n if (leftParts == null || rightParts == null) {\n throw new TypeError(`Invalid local date-time: ${leftParts == null ? left : right}`)\n }\n return leftParts.year - rightParts.year\n || leftParts.month - rightParts.month\n || leftParts.day - rightParts.day\n || leftParts.hours - rightParts.hours\n || leftParts.minutes - rightParts.minutes\n || (leftParts.seconds ?? 0) - (rightParts.seconds ?? 0)\n || (leftParts.milliseconds ?? 0) - (rightParts.milliseconds ?? 0)\n}\n\n/**\n * Split a local date-time into its civil-date and time parts. A missing time\n * part is reported as `null`.\n * @experimental This function is experimental and may change in any release.\n */\nexport function splitLocalDateTime(\n value: LocalDateTime | string | null | undefined,\n): {date: CivilDate; time: TimeString} | null {\n const parts = parseLocalDateTime(value)\n if (parts == null) return null\n return {date: formatCivilDate(parts), time: formatTime(parts)}\n}\n\n/**\n * Combine a civil date and a time into a local date-time. A `null` time\n * resolves to midnight.\n * @experimental This function is experimental and may change in any release.\n */\nexport function combineLocalDateTime(\n date: CivilDate | string | null | undefined,\n time: TimeString | string | null | undefined,\n): LocalDateTime | null {\n const dateParts = parseCivilDate(date)\n if (dateParts == null) return null\n const timeParts = time == null ? {hours: 0, minutes: 0} : parseTime(time)\n if (timeParts == null) return null\n return formatLocalDateTime({...dateParts, ...timeParts})\n}\n\n/**\n * Interpret a local date-time as a `Date` in the environment's local timezone.\n * @experimental This function is experimental and may change in any release.\n */\nexport function localDateTimeToDate(value: LocalDateTime): Date {\n const parts = parseLocalDateTime(value)\n if (parts == null) throw new TypeError(`Invalid local date-time: ${value}`)\n return new Date(\n parts.year,\n parts.month - 1,\n parts.day,\n parts.hours,\n parts.minutes,\n parts.seconds ?? 0,\n parts.milliseconds ?? 0,\n )\n}\n\n/**\n * Read a `Date` as a wall-clock local date-time in the environment's local\n * timezone. Seconds and milliseconds are included only when non-zero.\n * @experimental This function is experimental and may change in any release.\n */\nexport function dateToLocalDateTime(date: Date): LocalDateTime {\n if (!(date instanceof Date) || Number.isNaN(date.getTime())) {\n throw new TypeError('dateToLocalDateTime requires a valid Date')\n }\n return formatLocalDateTime({\n year: date.getFullYear(),\n month: date.getMonth() + 1,\n day: date.getDate(),\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n milliseconds: date.getMilliseconds(),\n })\n}\n\n/** @experimental This function is experimental and may change in any release. */\nexport function nowLocalDateTime(now: Date = new Date()): LocalDateTime {\n return dateToLocalDateTime(now)\n}\n","import {TemporalInput} from './TemporalInput.js'\nimport type {TemporalInputProps} from './TemporalInput.js'\nimport type {LocalDateTime} from './localDateTime.js'\nimport {isLocalDateTime} from './localDateTime.js'\n\n/**\n * Props for `DateTimePicker`. Values, `min`, and `max` are `LocalDateTime`\n * strings in `YYYY-MM-DDTHH:mm` form (with optional seconds); `step` is a\n * second count, or `'any'` to disable stepping.\n * @experimental This interface is experimental and may change in any release.\n */\nexport interface DateTimePickerProps extends TemporalInputProps<LocalDateTime> {}\n\n/**\n * Wall-clock date-and-time input backed by the native\n * `<input type=\"datetime-local\">` element. The emitted value is a\n * `LocalDateTime` string, or `null` while the field is empty or holds an\n * incomplete entry.\n * @experimental This component is experimental and may change in any release.\n */\nexport class DateTimePicker extends TemporalInput<LocalDateTime, DateTimePickerProps> {\n protected override readonly inputType = 'datetime-local' as const\n\n protected override isValidValue(raw: string): boolean {\n return isLocalDateTime(raw)\n }\n\n static override hostName = 'datetimepicker'\n}\n","import {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport type {CapillaryUiLayoutParticipantProps} from '../layout/layoutTraits.js'\nimport {layoutParticipantClass} from '../controlUtils.js'\n\nexport interface ToolbarProps extends ComponentProps, CapillaryUiLayoutParticipantProps {\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(): CapillaryUiChild {\n const {\n children = [],\n id,\n label = this.capillaryUiMessage('toolbarLabel'),\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={layoutParticipantClass(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(--toolbar-spacing, 1.5rem);\n padding: var(--ui-padding);\n user-select: none;\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 '@capillaryjs/capillary'\n\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, CapillaryUiChild} from '../component.js'\nimport {componentClass, controlId} from '../controlUtils.js'\nimport {StatusPresentation} from './statusPresentation.js'\n\nexport interface ProgressBarProps extends ComponentProps {\n id?: string | number | null\n label: CapillaryUiChild\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 static override dependencies = [StatusPresentation]\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(): CapillaryUiChild {\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 ? this.capillaryUiMessage('progressInProgress')\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 <cap-content aria-hidden=\"true\">\n <cap-progress\n style={percentage == null ? undefined : {\n '--progress-width': `${percentage}%`,\n '--progress-inverse-width': `${10000 / Math.max(percentage, 1)}%`,\n }}\n ><cap-inverse>{this.props.label}</cap-inverse></cap-progress>\n <cap-label>{this.props.label}</cap-label>\n </cap-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 & > cap-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 user-select: none;\n }\n\n & > cap-content > cap-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 & > cap-content > cap-progress > cap-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 & > cap-content > cap-label {\n position: relative;\n z-index: 0;\n display: block;\n height: 100%;\n white-space: nowrap;\n }\n\n &:has(> progress:indeterminate) > cap-content > cap-progress {\n display: none;\n }\n\n &:has(> progress:indeterminate) > cap-content > cap-label {\n z-index: 2;\n }\n\n &:has(> progress:indeterminate) > cap-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: cap-working-progress .55s linear infinite;\n opacity: .5;\n }\n\n @media (prefers-reduced-motion: reduce) {\n &:has(> progress:indeterminate) > cap-content::after {\n animation: none !important;\n }\n }\n\n @media (forced-colors: active) {\n & > cap-content {\n border: 1px solid CanvasText;\n background: Canvas;\n box-shadow: none;\n color: CanvasText;\n }\n\n & > cap-content > cap-progress {\n background: Highlight;\n box-shadow: none;\n }\n\n & > cap-content > cap-progress > cap-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 CapillaryUiStylesheetKind = 'theme' | 'colors'\nexport type CapillaryUiAppearance = 'light' | 'dark' | 'system'\nexport type CapillaryUiThemeAppearanceCapability = 'light' | 'dark' | 'adaptive'\n\nexport interface CapillaryUiStylesheetOption {\n value: string\n label: string\n href: string\n}\n\nexport interface CapillaryUiThemeOption extends CapillaryUiStylesheetOption {\n /** Appearance modes the selected theme deliberately supports. */\n appearance: CapillaryUiThemeAppearanceCapability\n}\n\nexport type CapillaryUiThemeVariableLayer = 'palette' | 'theme'\nexport type CapillaryUiThemeVariableValue =\n | 'background'\n | 'border'\n | 'color'\n | 'dimension'\n | 'duration'\n | 'font'\n | 'opacity'\n | 'radius'\n | 'shadow'\n\nexport interface CapillaryUiThemeVariableDefinition {\n name: `--${string}`\n layer: CapillaryUiThemeVariableLayer\n family: string\n value: CapillaryUiThemeVariableValue\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 capillaryUiThemeVariableCatalog = 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 CapillaryUiThemeVariableDefinition[])\n\nexport const capillaryUiThemeOptions = 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 capillaryUiColorOptions = 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 Capillary UI presentation stylesheets. */\nexport function replaceCapillaryUiStylesheet(\n kind: CapillaryUiStylesheetKind,\n selection: CapillaryUiStylesheetOption,\n targetDocument: Document = globalThis.document,\n): HTMLLinkElement {\n assertOption(selection)\n if (targetDocument?.head == null || targetDocument.documentElement == null) {\n throw new TypeError('replaceCapillaryUiStylesheet requires a document with a head and root')\n }\n\n const selector = `link[data-cap-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.capStylesheet = kind\n targetDocument.head.append(link)\n }\n link.dataset.capSelection = 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 Capillary UI theme resolves its light and dark mappings.\n * `system` removes the root attribute so the browser preference applies.\n */\nexport function setCapillaryUiAppearance(\n appearance: CapillaryUiAppearance,\n targetDocument: Document = globalThis.document,\n): void {\n if (targetDocument?.documentElement == null) {\n throw new TypeError('setCapillaryUiAppearance requires a document with a root')\n }\n if (appearance !== 'light' && appearance !== 'dark' && appearance !== 'system') {\n throw new TypeError('Capillary UI 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 getCapillaryUiAppearance(\n targetDocument: Document = globalThis.document,\n): CapillaryUiAppearance {\n if (targetDocument?.documentElement == null) {\n throw new TypeError('getCapillaryUiAppearance 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 findCapillaryUiStylesheetOption(\n options: readonly CapillaryUiStylesheetOption[],\n value: string,\n): CapillaryUiStylesheetOption {\n const selection = options.find((option) => option.value === value)\n if (selection == null) throw new RangeError(`Unknown Capillary UI stylesheet selection: ${value}`)\n return selection\n}\n\nfunction variable(\n name: CapillaryUiThemeVariableDefinition['name'],\n layer: CapillaryUiThemeVariableLayer,\n family: string,\n value: CapillaryUiThemeVariableValue,\n description: string,\n fallback?: CapillaryUiThemeVariableDefinition['fallback'],\n): CapillaryUiThemeVariableDefinition {\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): CapillaryUiStylesheetOption {\n return Object.freeze({value, label, href})\n}\n\nfunction themeOption(\n value: string,\n label: string,\n href: string,\n appearance: CapillaryUiThemeAppearanceCapability,\n): CapillaryUiThemeOption {\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 CapillaryUiStylesheetOption {\n if (option == null || typeof option !== 'object') {\n throw new TypeError('Capillary UI 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(`Capillary UI stylesheet option ${field} must be a non-empty string`)\n }\n }\n}\n","import type {CapillaryUiChild, LivePropContract} from '../component.js'\nimport {\n classNames,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps} from '../controlUtils.js'\nimport {Dropdown} from '../lineinputs/dropdown.js'\nimport type {DropdownOption} from '../lineinputs/dropdown.js'\nimport {\n findCapillaryUiStylesheetOption,\n capillaryUiColorOptions,\n capillaryUiThemeOptions,\n replaceCapillaryUiStylesheet,\n} from '../../styling/theme.js'\nimport type {\n CapillaryUiStylesheetKind,\n CapillaryUiStylesheetOption,\n} from '../../styling/theme.js'\n\nexport interface StylesheetPickerProps extends ValueControlProps<string>,\n LivePropContract<'disabled'> {\n id?: string | number | null\n label?: CapillaryUiChild\n ariaLabel?: string\n disabled?: boolean\n options?: readonly CapillaryUiStylesheetOption[]\n targetDocument?: Document\n onChange?: (value: string, option: CapillaryUiStylesheetOption, event: Event) => void\n}\n\n/**\n * A {@link Dropdown} that applies a Capillary UI stylesheet (theme or color set) when\n * the selection changes. Renders as a regular `cap-dropdown` host carrying a\n * `cap-<kind>-picker` class, so it inherits all standard dropdown styling and\n * behavior while adding stylesheet resolution and localized option labels.\n */\nabstract class StylesheetPicker extends Dropdown<string> {\n private readonly kind: CapillaryUiStylesheetKind\n private readonly stylesheetOptions: readonly CapillaryUiStylesheetOption[]\n private readonly customOptions: boolean\n private readonly targetDocument: Document | undefined\n private readonly changeHandler?: StylesheetPickerProps['onChange']\n\n constructor(\n props: StylesheetPickerProps,\n kind: CapillaryUiStylesheetKind,\n defaults: readonly CapillaryUiStylesheetOption[],\n ) {\n const stylesheetOptions = props.options ?? defaults\n validateOptions(stylesheetOptions)\n const {options: _options, targetDocument, onChange, ...dropdownProps} = props\n super({\n ...dropdownProps,\n options: stylesheetOptions,\n })\n this.kind = kind\n this.stylesheetOptions = stylesheetOptions\n this.customOptions = props.options != null\n this.targetDocument = targetDocument\n this.changeHandler = onChange\n findCapillaryUiStylesheetOption(stylesheetOptions, this.valueEmitter.get())\n }\n\n protected override hostClass(): string {\n return classNames(`cap-${this.kind}-picker`, super.hostClass())\n }\n\n protected override optionLabel(option: DropdownOption<string>): CapillaryUiChild {\n if (this.customOptions) return super.optionLabel(option)\n switch (`${this.kind}:${option.value}`) {\n case 'theme:java': return this.capillaryUiMessage('themeOptionJavaLabel')\n case 'theme:minimal': return this.capillaryUiMessage('themeOptionMinimalLabel')\n case 'theme:shiny': return this.capillaryUiMessage('themeOptionShinyLabel')\n case 'colors:gray': return this.capillaryUiMessage('colorOptionGrayLabel')\n case 'colors:green': return this.capillaryUiMessage('colorOptionGreenLabel')\n case 'colors:iceblue': return this.capillaryUiMessage('colorOptionIceBlueLabel')\n case 'colors:ocean': return this.capillaryUiMessage('colorOptionOceanLabel')\n case 'colors:orange': return this.capillaryUiMessage('colorOptionOrangeLabel')\n case 'colors:purple': return this.capillaryUiMessage('colorOptionPurpleLabel')\n case 'colors:red': return this.capillaryUiMessage('colorOptionRedLabel')\n case 'colors:yellow': return this.capillaryUiMessage('colorOptionYellowLabel')\n default: return super.optionLabel(option)\n }\n }\n\n protected override emitChange(\n value: string,\n _option: DropdownOption<string> | undefined,\n event: Event,\n ): void {\n invoke(this.changeHandler, value,\n findCapillaryUiStylesheetOption(this.stylesheetOptions, value), event)\n }\n\n override afterMount(dom: ChildNode | null): void {\n super.afterMount(dom)\n this.applySelection()\n }\n\n override afterUpdate(dom: ChildNode | null): void {\n super.afterUpdate(dom)\n this.applySelection()\n }\n\n private applySelection(): void {\n const targetDocument = this.targetDocument\n ?? (typeof document === 'undefined' ? null : document)\n if (targetDocument == null) return\n replaceCapillaryUiStylesheet(\n this.kind,\n findCapillaryUiStylesheetOption(this.stylesheetOptions, this.valueEmitter.get()),\n targetDocument,\n )\n }\n}\n\nexport class ThemePicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'theme', capillaryUiThemeOptions)\n }\n}\n\nexport class ColorPicker extends StylesheetPicker {\n constructor(props: StylesheetPickerProps = {}) {\n super(props, 'colors', capillaryUiColorOptions)\n }\n}\n\nfunction validateOptions(\n options: readonly CapillaryUiStylesheetOption[],\n): asserts options is readonly CapillaryUiStylesheetOption[] {\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","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 '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\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 {CapillaryUiChild, 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?: CapillaryUiChild\n component?: CapillaryUiChild\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: CapillaryUiChild\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(): CapillaryUiChild {\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, CapillaryUiChild, 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(): CapillaryUiChild {\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 CapillaryUiChild,\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(): CapillaryUiChild {\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","layoutDirectionFromProps","props","fallback","componentName","horizontal","vertical","layoutDirectionClassName","direction","layoutAllocationClassName","allocation","FilterMode","isFilterMode","value","mode","nextControlId","controlId","prefix","provided","createValueEmitter","component","purpose","assertEmitter","initialValue","options","Emitter","name","classNames","values","componentClass","layoutParticipantClass","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","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","isExternalDestination","NavigationBar","validateNavigation","Breadcrumb","validateBreadcrumb","last","CapillaryUiApp","before","targetDocument","parentDocument","dependency","_children","_key","classAlias","className","_island","sizing","layout","landmark","hostProps","rootClassName","mergeClassNames","sizingClassName","landmarkRole","mountCapillaryUiApp","runtime","appType","CapillaryUiRuntime","caller","merged","Header","level","Heading","GroupBox","header","variantClass","groupBoxVariantClass","variant","StatusPresentation","ErrorMessage","formatErrorMessage","error","isMessageError","isDerivedErrors","messages","entry","DeclarativeRegion","readDeclarativeRegions","supportedRegions","entries","regions","type","isDeclarativeRegionType","required","OptionGroupHeaderEnd","optionGroupLiveProps","OptionGroup","headerEnd","ariaLabel","busy","OptionsBox","Layout","role","scroll","panelLiveProps","PanelToolbar","Panel","orientation","title","SidebarToolbar","Sidebar","SplitPane","scrolls","SplitPrimary","SplitSecondary","SplitView","primary","axis","_b","resize","coordinate","_c","decreaseKey","increaseKey","primarySize","primaryLabel","secondaryLabel","primaryMinSize","secondaryMinSize","resizeStep","separatorLabel","resizable","validateCSSSize","validateNonNegativeNumber","validatePositiveNumber","secondary","readSplitPanes","withFallbackLabel","requestedSize","host","separator","extent","separatorExtent","primaryMin","secondaryMin","maximum","size","bounds","total","percentage","flattenChildren","flattened","visit","pane","DescriptionItem","term","DescriptionList","InfoField","InfoPanel","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","anchor","isSelectedByKey","applyRangeSelection","isCommandPressed","key","exists","candidate","candidateIndex","startIndex","endIndex","range","mergeByKey","createSelectionHandler","source","eventOrCause","notification","length","result","keys","shouldSelect","rangeKeys","ListView","isReadableEmitter","normalizeKeyGetter","status","isLoading","FetchState","replacesContent","_","defaultItemLabel","dom","itemKey","isRenderablePrimitive","CheckableControl","checkboxLiveProps","Checkbox","componentType","validateSymbols","currentIndex","nextValue","semanticState","semanticIndex","symbol","shellSymbol","stateName","localizedStateName","textLabel","textAlternative","checked","isCheckedSemanticState","symbols","tuple","FilterPanel","isEmitterLike","fetchState","filters","normalizeFilters","filterModes","defaultSemanticState","activeValues","optionValue","hostClass","optionLabel","FilterModeCheckbox","nextState","_dom","emitter","existing","isCapillaryUiLabel","TableHeaderCell","currentSort","isFilterSelectionEntry","filterLabel","panel","TableHeader","column","DefaultTableFilterEncoding","serializeTableQuery","url","sort","assertUrlLike","assertSort","field","applyLocalTableState","filtered","matchesFilters","compareValues","readField","isSortDirection","searchParams","createLocalTableDataSource","createState","ownedData","data","createLocalTableView","ManagedTableDataSource","createQueryTableDataSource","assertTableQuery","retry","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","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","pressed","busyLabel","normalContent","unavailable","dialogLiveProps","DialogActions","Dialog","description","closeLabel","showCloseButton","element","dialog","shouldOpen","showModal","focusInitial","restore","ref","_QuadCheckbox","QuadCheckbox","_TriCheckbox","TriCheckbox","LabeledInputControl","SelectControl","dropdownLiveProps","Dropdown","suppliedOptions","firstValue","placeholder","currentValue","optionsState","sourceBusy","hasSourceError","displayedError","isBusy","eventValue","_option","labelLiveProps","Label","text","htmlFor","radioButtonLiveProps","radioGroupLiveProps","RadioButton","RadioGroup","validateRadioOptions","selectedValue","textboxLiveProps","Textbox","readOnly","autoComplete","inputMode","minLength","maxLength","pattern","inputRef","onInput","onChange","toggleLiveProps","Toggle","validateToggleOptions","selectedIndex","radio","temporalInputLiveProps","TemporalInput","hostName","valid","min","max","step","CIVIL_DATE_PATTERN","DAY_MILLISECONDS","isCivilDate","parseCivilDate","year","month","day","milliseconds","parsed","formatCivilDate","parts","civilDateToDay","dayToCivilDate","addCivilDays","days","todayCivilDate","now","compareCivilDates","daysInMonth","startOfMonthDay","addMonths","delta","nextYear","nextMonth","DatePicker","TIME_PATTERN","isTimeString","parseTime","hours","minutes","seconds","formatTime","timeToMinutes","minutesToTime","timeStepOptions","minMinutes","maxMinutes","TimePicker","LOCAL_DATE_TIME_PATTERN","isLocalDateTime","parseLocalDateTime","date","time","formatLocalDateTime","compareLocalDateTimes","leftParts","rightParts","splitLocalDateTime","combineLocalDateTime","dateParts","timeParts","localDateTimeToDate","dateToLocalDateTime","nowLocalDateTime","DateTimePicker","Toolbar","ProgressBar","sourceValue","valueText","capillaryUiThemeVariableCatalog","paletteRamp","variable","capillaryUiThemeOptions","themeOption","distributedAssetUrl","capillaryUiColorOptions","replaceCapillaryUiStylesheet","kind","selection","assertOption","selector","link","setCapillaryUiAppearance","appearance","getCapillaryUiAppearance","findCapillaryUiStylesheetOption","layer","family","stop","href","packageRelativePath","StylesheetPicker","defaults","stylesheetOptions","validateOptions","_options","dropdownProps","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","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":";;;;;;AAYO,MAAMA,WAAYC,EAAoB;AAAA,EAEzC,SAA2B;AACvB,WAAO,KAAK,MAAM,YAAY,CAAA;AAAA,EAClC;AACJ;AAJIC,EADSF,IACO,aAA+B,CAAA;ACqB5C,SAASG,GACZC,GACAC,GACAC,IAAgB,oBACU;AAC1B,QAAM,EAAC,YAAAC,IAAa,IAAO,UAAAC,IAAW,OAASJ;AAC/C,MAAIG,KAAcC;AACd,UAAM,IAAI,UAAU,GAAGF,CAAa,yCAAyC;AAEjF,MAAIC,EAAY,QAAO;AACvB,MAAIC,EAAU,QAAO;AACrB,MAAIH,KAAY,KAAM,QAAOA;AAC7B,QAAM,IAAI,UAAU,GAAGC,CAAa,yCAAyC;AACjF;AAEO,SAASG,GAAyBC,GAA+C;AACpF,MAAIA,MAAc,aAAc,QAAO;AACvC,MAAIA,MAAc,WAAY,QAAO;AACrC,QAAM,IAAI,UAAU,iDAAiD;AACzE;AAEO,SAASC,GACZC,GACkB;AAClB,MAAIA,KAAc,MAClB;AAAA,QAAIA,MAAe,UAAW,QAAO;AACrC,QAAIA,MAAe,WAAY,QAAO;AACtC,UAAM,IAAI,UAAU,+CAA+C;AAAA;AACvE;AC7DO,MAAMC,IAAa;AAAA;AAAA,EAEtB,MAAM;AAAA;AAAA,EAEN,SAAS;AAAA;AAAA,EAET,QAAQ;AAAA;AAAA,EAER,SAAS;AACb;AAKO,SAASC,GAAaC,GAA0C;AACnE,SAAO,OAAO,OAAOF,CAAU,EAAE,KAAK,CAACG,MAASA,MAASD,CAAK;AAClE;ACEA,IAAIE,KAAgB;AAEb,SAASC,EAAUC,GAAgBC,GAA2C;AACjF,SAAIA,KAAY,QAAQ,OAAOA,CAAQ,EAAE,SAAS,IAAU,OAAOA,CAAQ,IACpE,OAAOD,CAAM,IAAIF,IAAe;AAC3C;AAEO,SAASI,EACZC,GACAlB,GACAC,GACAkB,GACoB;AACpB,MAAInB,EAAM,gBAAgB;AACtB,WAAAoB,GAAsBpB,EAAM,cAAc,cAAc,GACjDA,EAAM;AAEjB,QAAMqB,IAAerB,EAAM,gBACpBA,EAAM,SACNA,EAAM,gBACNC,GACDqB,IAAkC,EAAC,OAAOJ,GAAW,SAAAC,EAAA;AAC3D,SAAO,IAAII,EAAQF,GAAcC,CAAO;AAC5C;AAEO,SAASF,GACZT,GACAa,IAAO,WAC8B;AACrC,MAAIb,KAAS,QACL,OAAOA,KAAU,YAAY,OAAOA,KAAU,cAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AAC9C,UAAM,IAAI,UAAU,GAAGa,CAAI,qBAAqB;AAExD;AAEO,SAASC,MAAcC,GAA2B;AACrD,SAAOA,EACF,QAAQ,CAACf,MAAU,OAAOA,KAAU,WAAWA,EAAM,MAAM,KAAK,IAAI,CAAA,CAAE,EACtE,OAAO,OAAO,EACd,KAAK,GAAG;AACjB;AAEO,SAASgB,EAAe3B,GAA4D;AACvF,SAAOA,EAAM,aAAaA,EAAM,SAAS;AAC7C;AAGO,SAAS4B,GACZ5B,GACM;AACN,SAAOyB,GAAWE,EAAe3B,CAAK,GAAGO,GAA0BP,EAAM,UAAU,CAAC;AACxF;AAEO,SAAS6B,EACZC,MACGC,GACC;AACJ,MAAID,KAAY,MAChB;AAAA,QAAI,OAAOA,KAAa,WAAY,OAAM,IAAI,UAAU,qCAAqC;AAC7F,IAAAA,EAAS,GAAGC,CAAI;AAAA;AACpB;AAEO,SAASC,GACZV,GACAE,IAAO,WACqB;AAC5B,MAAI,CAAC,MAAM,QAAQF,CAAO,SAAS,IAAI,UAAU,GAAGE,CAAI,mBAAmB;AAC/E;AAEO,SAASS,GAActB,GAAwB;AAClD,SAAID,GAAaC,CAAK,IAAUA,IACzB,OAAOA,CAAK;AACvB;ACpEO,MAAMuB,WAAgBrC,EAAwB;AAAA,EAKjD,YAAYG,IAAsB,IAAI;;AAClC,UAAMA,CAAK;AAJN,IAAAF,EAAA;AACA,IAAAA,EAAA;AAIL,UAAMqC,IAAOnC,EAAM,QAAQ,CAAA;AAC3B,IAAAoC,GAAaD,CAAI;AACjB,UAAME,IAA6B,EAAC,GAAGrC,EAAA;AACvC,IAAIqC,EAAa,gBAAgB,QAAQrC,EAAM,oBAAoB,SAC/DqC,EAAa,eAAerC,EAAM,mBAElCqC,EAAa,gBAAgB,QAAQrC,EAAM,sBAAsB,SACjEqC,EAAa,eAAerC,EAAM,qBAEtC,KAAK,eAAeiB;AAAA,MAChB;AAAA,MACAoB;AAAA,QACAC,IAAAH,EAAK,KAAK,CAACI,MAAQ,CAACA,EAAI,QAAQ,MAAhC,gBAAAD,EAAmC,OAAM;AAAA,MACzC;AAAA,IAAA,GAEJ,KAAK,mBAAmB,KAAK;AAAA,EACjC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,UAAUC,GAA6BC,IAAsB,MAAY;AACrE,IAAID,KAAO,QAAQA,EAAI,aACnB,KAAK,MAAM,eAAe,OAC1B,KAAK,aAAa,IAAIA,EAAI,IAAI,cAAc,IAE5C,KAAK,MAAM,YAAYA,GAAKC,CAAK,GAErCX,EAAO,KAAK,MAAM,UAAUU,EAAI,IAAIC,CAAK;AAAA,EAC7C;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,MAAAL,IAAO,CAAA;AAAA,MACP,OAAAM,IAAQ,KAAK,mBAAmB,cAAc;AAAA,MAC9C,QAAAC,IAAS;AAAA,IAAA,IACT,KAAK;AACT,IAAAN,GAAaD,CAAI;AACjB,UAAMQ,IAAc,KAAK,aAAa,IAAA,GAEhCC,IAAO,KAAK;AAClB,WAAO,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,MAAK;AAAA,QACL,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,cAAYc;AAAA,QAEX,UAAAN,EAAK,IAAI,CAACI,GAAKO,MAAU,gBAAAD;AAAA,UAAC;AAAA,UAAA;AAAA,YAEvB,IAAIE,GAAYL,GAAQH,EAAI,EAAE;AAAA,YAC9B,MAAK;AAAA,YACL,MAAK;AAAA,YACL,UAAU,EAAQA,EAAI;AAAA,YACtB,iBAAe,OAAO,GAAGI,GAAaJ,EAAI,EAAE,IAAI,SAAS;AAAA,YACzD,iBAAeS,GAAWN,GAAQH,EAAI,EAAE;AAAA,YACxC,UAAU,OAAO,GAAGI,GAAaJ,EAAI,EAAE,IAAI,IAAI;AAAA,YAC/C,SAAS,CAACC,MAAsB,KAAK,UAAUD,GAAKC,CAAK;AAAA,YACzD,WAAW,CAACA,MAAyB,KAAK,cAAcA,GAAOM,GAAOX,CAAI;AAAA,YAC5E,UAAAI,EAAI,SAAS,OAAOA,EAAI,EAAE;AAAA,UAAA;AAAA,UAVnB,OAAOA,EAAI,EAAE;AAAA,QAAA,CAUiB;AAAA,MAAA;AAAA,IAAA;AAAA,EAE/C;AAAA,EAEA,cAAcC,GAAsBM,GAAeX,GAAmC;AAClF,UAAMc,IAAUd,EACX,IAAI,CAACI,GAAKW,OAAc,EAAC,KAAAX,GAAK,UAAAW,EAAA,EAAU,EACxC,OAAO,CAAC,EAAC,KAAAX,QAAS,CAACA,EAAI,QAAQ;AACpC,QAAIU,EAAQ,WAAW,EAAG;AAC1B,UAAME,IAAU,KAAK;AAAA,MAAI;AAAA,MACrBF,EAAQ,UAAU,CAAC,EAAC,UAAAC,EAAA,MAAcA,MAAaJ,CAAK;AAAA,IAAA;AACxD,QAAIM;AACJ,QAAIZ,EAAM,QAAQ,gBAAgBA,EAAM,QAAQ;AAC5C,MAAAY,IAAOH,GAASE,IAAU,KAAKF,EAAQ,MAAM;AAAA,aACtCT,EAAM,QAAQ,eAAeA,EAAM,QAAQ;AAClD,MAAAY,IAAOH,GAASE,IAAU,IAAIF,EAAQ,UAAUA,EAAQ,MAAM;AAAA,aACvDT,EAAM,QAAQ,OAAQ,CAAAY,IAAOH,EAAQ,CAAC;AAAA,aACxCT,EAAM,QAAQ,MAAO,CAAAY,IAAOH,EAAQ,GAAG,EAAE;AAAA,QAC7C;AAEL,QAAIG,KAAQ,SACZZ,EAAM,eAAA,GACN,KAAK,UAAUY,EAAK,KAAKZ,CAAK,GAC1B,KAAK,eAAe,UAAS;AAC7B,YAAMD,IAAM,KAAK,IAAI,iBAA8B,cAAc,EAAEa,EAAK,QAAQ;AAChF,MAAAb,KAAA,QAAAA,EAAK;AAAA,IACT;AAAA,EACJ;AAoEJ;AA/JIzC,EADSoC,IACO,aAA+B,CAAA,IA6F/CpC,EA9FSoC,IA8FO,YAAW,aAE3BpC,EAhGSoC,IAgGO,OAAMmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkEnB,SAASN,GAAYL,GAAgBY,GAAiB;AACzD,SAAO,GAAGZ,CAAM,QAAQa,GAAOD,CAAE,CAAC;AACtC;AAEO,SAASN,GAAWN,GAAgBY,GAAiB;AACxD,SAAO,GAAGZ,CAAM,UAAUa,GAAOD,CAAE,CAAC;AACxC;AAEA,SAASC,GAAO5C,GAAoB;AAChC,SAAO,mBAAmB,OAAOA,CAAK,CAAC,EAAE,WAAW,KAAK,GAAG;AAChE;AAEA,SAASyB,GAAaD,GAAsD;AACxE,MAAI,CAAC,MAAM,QAAQA,CAAI,EAAG,OAAM,IAAI,UAAU,+BAA+B;AAC7E,QAAMqB,wBAAU,IAAA;AAChB,aAAWjB,KAAOJ,GAAM;AACpB,QAAII,KAAO,QAAQA,EAAI,MAAM,KAAM,OAAM,IAAI,UAAU,yBAAyB;AAChF,QAAIiB,EAAI,IAAIjB,EAAI,EAAE,EAAG,OAAM,IAAI,MAAM,qBAAqB,OAAOA,EAAI,EAAE,CAAC,EAAE;AAC1E,IAAAiB,EAAI,IAAIjB,EAAI,EAAE;AAAA,EAClB;AACJ;ACtMO,MAAMkB,WAAmB5D,EAA2B;AAAA,EAApD;AAAA;AAEK,IAAAC,EAAA,oBAAkC;AAAA;AAAA,EAE1C,aAAmB;AACf,UAAM4D,IAAS,KAAK,SAAS;AAC7B,QAAIA,KAAU,KAAM,OAAM,IAAI,MAAM,oDAAoD;AACxF,SAAK,aAAaA,EAAO,UAAU,KAAK,MAAM,SAAS,IAAI;AAAA,EAC/D;AAAA,EAEA,SAA2B;AACvB,WAAOC,EAAEC,IAAU,MAAM,KAAK,MAAM,YAAY,EAAE;AAAA,EACtD;AAAA,EAES,aAAmB;;AACxB,KAAAtB,IAAA,KAAK,SAAS,WAAd,QAAAA,EAAsB,cAAc,KAAK,MAAM,SAAS;AAAA,EAC5D;AAAA,EAES,2BAA0C;AAC/C,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAES,YAAkB;;AACvB,KAAAA,IAAA,KAAK,eAAL,QAAAA,EAAA,YACA,KAAK,aAAa;AAAA,EACtB;AACJ;AAzBIxC,EADS2D,IACO,aAA+B,CAAA;ACY5C,MAAMI,GAA6D;AAAA,EAMtE,YACqBC,GACRC,GACQzC,GACnB;AATM,IAAAxB,EAAA,2CAAoB,IAAA;AACX,IAAAA,EAAA,wCAAiB,IAAA;AAC1B,IAAAA,EAAA,0BAAyC;AACzC,IAAAA,EAAA,0BAAyC;AAG5B,SAAA,QAAAgE,GACR,KAAA,eAAAC,GACQ,KAAA,UAAAzC;AAAA,EAClB;AAAA,EAEH,QAAQ0C,GAA+B;;AACnC,SAAK,eAAeA,CAAK;AACzB,UAAMC,IAAY,KAAK,YAAYD,CAAK;AACxC,IAAIC,KAAa,OACb,KAAK,aAAa,IAAIA,EAAU,IAAI,KAAK,QAAQ,YAAY,IACrDD,EAAM,KAAK,CAAC,EAAC,IAAAV,EAAA,MAAQ,OAAO,GAAGA,GAAI,KAAK,aAAa,IAAA,CAAK,CAAC,KACnE,KAAK,aAAa,MAAIhB,IAAA0B,EAAM,KAAK,CAACE,MAAS,CAACA,EAAK,QAAQ,MAAnC,gBAAA5B,EAAsC,OAAM,IAAI;AAAA,EAE9E;AAAA,EAEA,SAAS0B,GAAuC;AAC5C,WAAOA,EAAM,KAAK,CAAC,EAAC,IAAAV,QAAQ,OAAO,GAAGA,GAAI,KAAK,aAAa,KAAK,CAAC,KAC3DU,EAAM,KAAK,CAACE,MAAS,CAACA,EAAK,QAAQ,KACnC;AAAA,EACX;AAAA,EAEA,cAAcF,GAAyBG,GAA8C;;AACjF,UAAMC,IAAe,IAAI,IAAIJ,EAAM,IAAI,CAAC,EAAC,IAAAV,QAAQA,CAAE,CAAC;AACpD,eAAWA,KAAM,KAAK;AAClB,MAAKc,EAAa,IAAId,CAAE,KAAG,KAAK,WAAW,OAAOA,CAAE;AAGxD,UAAMe,KAAa/B,IAAA,KAAK,SAAS0B,CAAK,MAAnB,gBAAA1B,EAAsB;AACzC,QAAI6B,MAAW;AACX,iBAAW,EAAC,IAAAb,OAAOU,EAAO,MAAK,WAAW,IAAIV,CAAE;AAAA;AAEhD,MAAIa,MAAW,iBAAe,KAAK,WAAW,MAAA,GAC1CE,MAAe,UAAW,KAAK,WAAW,IAAIA,CAAU;AAEhE,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,OAAOH,GAAmB;;AACtB,UAAMI,IAAUJ,EAAK,SAAS,OAAO,OAAO,KAAK,cAAc,IAAIA,EAAK,KAAK;AAC7E,IAAII,KAAW,OACX,KAAK,aAAa,IAAIJ,EAAK,IAAI,KAAK,QAAQ,aAAa,KAEpD5B,IAAA,KAAK,qBAAL,QAAAA,EAAuB,SAASgC;AAAA,EAE7C;AAAA,EAEA,cAAcJ,GAAaK,GAA6C;AACpE,UAAMD,IAAUJ,EAAK,SAAS,OAAO,OAAO,KAAK,cAAc,IAAIA,EAAK,KAAK;AAC7E,WAAOI,KAAW,OACZC,IACAZ,EAAEF,IAAY,EAAC,KAAKa,EAAQ,UAAU,SAAAA,EAAA,GAAUC,CAAO;AAAA,EACjE;AAAA,EAEA,UAAgB;AACZ,IAAI,KAAK,oBAAoB,QAAQ,KAAK,oBAAoB,QAC1D,KAAK,iBAAiB,iBAAiB,KAAK,kBAAkB,KAAK,KAAK,GAE5E,KAAK,mBAAmB,MACxB,KAAK,mBAAmB,MACxB,KAAK,cAAc,MAAA,GACnB,KAAK,WAAW,MAAA;AAAA,EACpB;AAAA,EAEQ,eAAeP,GAA+B;AAClD,UAAMN,IAAS,KAAK,MAAM,SAAS,QAC7Bc,IAAS,KAAK,MAAM;AAC1B,IAAI,KAAK,oBAAoB,QAAQ,KAAK,oBAAoB,QAC1D,KAAK,iBAAiB,iBAAiB,KAAK,kBAAkB,KAAK,KAAK,GAE5E,KAAK,mBAAmB,MACxB,KAAK,mBAAmB,MACxB,KAAK,cAAc,MAAA;AAEnB,UAAMC,IAAST,EAAM,OAAO,CAACE,MAExBA,EAAK,SAAS,IAAI;AACvB,QAAIO,EAAO,WAAW,GACtB;AAAA,UAAIf,KAAU,QAAQc,KAAU;AAC5B,cAAM,IAAI,MAAM,UAAU,KAAK,QAAQ,OAAO,8CAA8C;AAGhG,WAAK,mBAAmBd,GACxB,KAAK,mBAAmBc,GACxB,KAAK,gBAAgB,IAAI,IAAId,EAAO;AAAA,QAChCc;AAAA,QACA,KAAK;AAAA,QACLC,EAAO,IAAI,CAACP,OAAU;AAAA,UAClB,OAAOA,EAAK;AAAA,UACZ,UAAUA,EAAK;AAAA,UACf,QAAQ,MAAM,OAAO,GAAG,KAAK,aAAa,IAAA,GAAOA,EAAK,EAAE;AAAA,UACxD,UAAU,MAAM;AACZ,iBAAK,aAAa,IAAIA,EAAK,IAAI,KAAK,QAAQ,aAAa;AAAA,UAC7D;AAAA,QAAA,EACF;AAAA,QACF,CAACQ,MAAa,KAAK,aAAa,UAAUA,GAAU,EAAC,aAAa,GAAA,CAAM;AAAA,MAAA,CAC3E;AAAA;AAAA,EACL;AAAA,EAEQ,YAAYV,GAA4C;;AAC5D,UAAMW,KAAarC,IAAA,KAAK,qBAAL,gBAAAA,EAAuB,WAAW;AACrD,SAAIqC,KAAA,gBAAAA,EAAY,WAAU,UAAW;AACrC,UAAMC,IAAoBD,EAAW,kBAAkB,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AAC3E,WAAOX,EAAM,KAAK,CAACE,MAAS;AACxB,UAAIA,EAAK,YAAYA,EAAK,SAAS,KAAM,QAAO;AAChD,YAAMI,IAAU,KAAK,cAAc,IAAIJ,EAAK,KAAK;AACjD,aAAOI,KAAW,SACdM,MAAsBN,EAAQ,YAC3BM,EAAkB,WAAW,GAAGN,EAAQ,QAAQ,GAAG;AAAA,IAE9D,CAAC;AAAA,EACL;AACJ;AAEO,SAASO,EACZlE,GACAT,GACkB;AAClB,QAAMiE,IAASxD,KAAS;AACxB,MAAIwD,MAAW,WAAWA,MAAW,UAAUA,MAAW;AACtD,UAAM,IAAI,UAAU,GAAGjE,CAAa,kDAAkD;AAE1F,SAAOiE;AACX;ACnGO,MAAMW,WAAiBjF,EAAyB;AAAA,EAOnD,YAAYG,IAAuB,IAAI;;AACnC,UAAMA,CAAK;AANN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AAIb,UAAMqC,IAAO4C,GAAY/E,CAAK,GACxBqC,IAA8B,EAAC,GAAGrC,EAAA;AACxC,IAAIqC,EAAa,gBAAgB,QAAQrC,EAAM,oBAAoB,SAC/DqC,EAAa,eAAerC,EAAM,mBAElCqC,EAAa,gBAAgB,QAAQrC,EAAM,sBAAsB,SACjEqC,EAAa,eAAerC,EAAM,qBAEtC,KAAK,eAAeiB;AAAA,MAChB;AAAA,MACAoB;AAAA,QACAC,IAAAH,EAAK,KAAK,CAACI,MAAQ,CAACA,EAAI,QAAQ,MAAhC,gBAAAD,EAAmC,OAAM;AAAA,MACzC;AAAA,IAAA,GAEJ,KAAK,mBAAmB,KAAK,cAC7B,KAAK,SAASxB,EAAU,QAAQd,EAAM,EAAE,GACxC,KAAK,YAAY,IAAI6D,GAA0B,MAAM,KAAK,cAAc;AAAA,MACpE,SAAS;AAAA,MACT,eAAe;AAAA,MACf,cAAc;AAAA,MACd,eAAe;AAAA,IAAA,CAClB;AAAA,EACL;AAAA,EAEA,aAAmB;AACf,UAAM1B,IAAO4C,GAAY,KAAK,KAAK;AACnC,IAAAF,EAAuB,KAAK,MAAM,aAAa,UAAU,GACzD,KAAK,UAAU,QAAQ1C,CAAI,GAC3B,KAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,SAAS6C,GAAgC;AACrC,WAAAH,EAAuBG,EAAU,aAAa,UAAU,GACxD,MAAM,SAASA,CAAS,GACxB,KAAK,UAAU,QAAQD,GAAYC,CAAS,CAAC,GAC7C,KAAK,OAAA,GACE;AAAA,EACX;AAAA,EAEA,SAA2B;;AACvB,UAAM7C,IAAO4C,GAAY,KAAK,KAAK,GAC7BE,IAAcJ,EAAuB,KAAK,MAAM,aAAa,UAAU,GACvER,KAAa/B,IAAA,KAAK,UAAU,SAASH,CAAI,MAA5B,gBAAAG,EAA+B,IAC5C4C,IAAgB,KAAK,UAAU,cAAc/C,GAAM8C,CAAW,GAC9DrC,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QAEzC,UAAA;AAAA,UAAA,gBAAAkB;AAAA,YAACX;AAAA,YAAA;AAAA,cAEG,MAAMC,EAAK,IAAI,CAAC,EAAC,IAAAmB,GAAI,OAAAb,GAAO,UAAA2C,EAAA,OAAe,EAAC,IAAA9B,GAAI,OAAAb,GAAO,UAAA2C,IAAU;AAAA,cACjE,cAAc,KAAK;AAAA,cACnB,QAAQ,KAAK;AAAA,cACZ,GAAI,KAAK,MAAM,SAAS,OAAO,KAAK,EAAC,OAAO,KAAK,MAAM,MAAA;AAAA,cACvD,GAAI,KAAK,MAAM,YAAY,OAAO,KAAK,EAAC,UAAU,KAAK,MAAM,SAAA;AAAA,cAC9D,aAAa,CAAC7C,GAAKC,MAAU,KAAK,UAAUD,GAAKC,CAAK;AAAA,YAAA;AAAA,YANlD;AAAA,UAAA;AAAA,UAQPL,EAAK,IAAI,CAACI,MAAQ;AACf,kBAAM8C,IAAW,OAAO,GAAGhB,GAAY9B,EAAI,EAAE;AAC7C,mBAAO,gBAAAM;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEJ,IAAIG,GAAW,KAAK,QAAQT,EAAI,EAAE;AAAA,gBAClC,MAAK;AAAA,gBACL,mBAAiBQ,GAAY,KAAK,QAAQR,EAAI,EAAE;AAAA,gBAChD,UAAU8C,IAAW,IAAI;AAAA,gBACzB,QAAQ,CAACA;AAAA,gBACX,UAAAH,EAAc,IAAI3C,EAAI,EAAE,IAChB,KAAK,UAAU,cAAcA,GAAKA,EAAI,OAAO,IAC7C;AAAA,cAAA;AAAA,cARD,OAAOA,EAAI,EAAE;AAAA,YAAA;AAAA,UAS1B,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAET;AAAA,EAES,YAAkB;AACvB,SAAK,UAAU,QAAA;AAAA,EACnB;AAAA,EAEQ,UAAUA,GAAiB+C,GAA4B;AAC3D,UAAMD,IAAWN,GAAY,KAAK,KAAK,EAAE,KAAK,CAAC,EAAC,IAAAzB,EAAA,MAAQ,OAAO,GAAGA,GAAIf,EAAI,EAAE,CAAC;AAC7E,IAAI8C,KAAY,QAAM,KAAK,UAAU,OAAOA,CAAQ;AAAA,EACxD;AAqCJ;AA9HIvF,EADSgF,IACO,aAA+B,CAAA,IA2F/ChF,EA5FSgF,IA4FF,gBAAe,CAACrB,IAAYvB,IAAStC,EAAG,IAE/CE,EA9FSgF,IA8FO,YAAW,cAE3BhF,EAhGSgF,IAgGF,OAAMzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCjB,SAAS0B,GAAY/E,GAAuC;AACxD,QAAMuF,IAASvF,EAAM,QAAQ,CAAA;AAC7B,MAAI,CAAC,MAAM,QAAQuF,CAAM,EAAG,OAAM,IAAI,UAAU,gCAAgC;AAIhF,QAAMC,KAHW,MAAM,QAAQxF,EAAM,QAAQ,IACvCA,EAAM,WACNA,EAAM,YAAY,OAAO,CAAA,IAAK,CAACA,EAAM,QAAQ,GAE9C,OAAO,CAACyF,MAAUC,GAAQD,CAAK,KAAKA,EAAM,SAAS7F,EAAG,EACtD,IAAI,CAAC6F,GAAO3C,MAAU;AACnB,QAAI,CAAC4C,GAAQD,CAAK,EAAG,OAAM,IAAI,UAAU,qCAAqC;AAG9E,UAAME,IAAWF,EAAM;AACvB,WAAO;AAAA,MACH,IAAIE,EAAS,MAAM,OAAO7C,IAAQ,CAAC;AAAA,MACnC,OAAO6C,EAAS,SAAS,OAAO7C,IAAQ,CAAC;AAAA,MACzC,UAAU,EAAQ6C,EAAS;AAAA,MAC3B,SAASA,EAAS,YAAY,CAAA;AAAA,MAC9B,GAAIA,EAAS,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAS,MAAA;AAAA,IAAK;AAAA,EAEhE,CAAC,GACCxD,IAAwBoD,EAAO,SAAS,IACxCA,EAAO,IAAI,CAAChD,OAAwB;AAAA,IAClC,GAAGA;AAAA,IACH,OAAOA,EAAI,SAAS,OAAOA,EAAI,EAAE;AAAA,IACjC,UAAU,EAAQA,EAAI;AAAA,IACtB,SAASA,EAAI,WAAWA,EAAI,aAAa,CAAA;AAAA,IACzC,GAAIA,EAAI,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAI,MAAA;AAAA,EAAK,EAChD,IACAiD,GACAhC,wBAAU,IAAA;AAChB,aAAWjB,KAAOJ,GAAM;AACpB,SAAII,KAAA,gBAAAA,EAAK,OAAM,KAAM,OAAM,IAAI,UAAU,yBAAyB;AAClE,QAAIiB,EAAI,IAAIjB,EAAI,EAAE,EAAG,OAAM,IAAI,MAAM,qBAAqB,OAAOA,EAAI,EAAE,CAAC,EAAE;AAC1E,IAAAiB,EAAI,IAAIjB,EAAI,EAAE;AAAA,EAClB;AACA,SAAOJ;AACX;ACzNA,MAAMyD,yBAAuB,QAAA,GACvBC,yBAAmB,QAAA;AAyDlB,MAAMC,GAAc;AAAA,EACvB,YAAqBC,GAAqB;AAArB,SAAA,SAAAA,GACjBC,GAAkBD,CAAM,GACxB,OAAO,OAAO,IAAI;AAAA,EACtB;AACJ;AAEO,MAAME,WAA8B,MAAM;AAAA,EAG7C,YAAYC,IAAU,sCAAsC;AACxD,UAAMA,CAAO;AAHC,IAAApG,EAAA,cAAO;AAAA,EAIzB;AACJ;AAEO,MAAMqG,KAAuC,OAAO,OAAO;AAAA,EAC9D,OAAO,CAACxF,MAAkBA;AAAA,EAC1B,QAAQ,CAACA,MAAkBA;AAC/B,CAAC,GAEYyF,KAAiD,OAAO,OAAO;AAAA,EACxE,MAAM1E,GAA2B;AAC7B,QAAIA,EAAO,WAAW,EAAG,OAAM,IAAI,UAAU,0BAA0B;AACvE,WAAOA,EAAO,CAAC,KAAK;AAAA,EACxB;AAAA,EACA,QAAQ,CAACf,MAAkB,CAACA,CAAK;AACrC,CAAC,GAEY0F,KAAmD,OAAO,OAAO;AAAA,EAC1E,MAAM3E,GAA2B;AAC7B,QAAIA,EAAO,WAAW,KAAMA,EAAO,CAAC,MAAM,UAAUA,EAAO,CAAC,MAAM;AAC9D,YAAM,IAAI,UAAU,kCAAkC;AAE1D,WAAOA,EAAO,CAAC,MAAM;AAAA,EACzB;AAAA,EACA,QAAQ,CAACf,MAAmB,CAAC,OAAOA,CAAK,CAAC;AAC9C,CAAC;AAEM,SAAS2F,GAAYhD,GAAYiD,IAAOjD,GAA4B;AACvE,QAAMkD,IAAeC,GAAUnD,GAAI,UAAU,GACvCoD,IAAiBC,GAAaJ,GAAM,YAAY,GAChDK,IAAa,OAAO,OAAO;AAAA,IAC7B,IAAIJ;AAAA,IACJ,MAAM;AAAA,IACN,MAAME;AAAA,EAAA,CACT;AACD,SAAAd,GAAiB,IAAIgB,CAAU,GACxBA;AACX;AAEO,SAASC,GACZvD,GACAwD,GACAtF,IAAO8B,GACyB;AAChC,QAAMkD,IAAeC,GAAUnD,GAAI,UAAU,GACvCyD,IAAiBN,GAAUjF,GAAM,sBAAsB;AAC7D,EAAAwF,GAAiBF,CAAK;AACtB,QAAMF,IAAa,OAAO,OAAO;AAAA,IAC7B,IAAIJ;AAAA,IACJ,MAAM;AAAA,IACN,MAAMO;AAAA,IACN,OAAAD;AAAA,EAAA,CACH;AACD,SAAAlB,GAAiB,IAAIgB,CAAU,GACxBA;AACX;AAEO,SAASK,GACZC,GACAvG,GAC2B;AAE3B,MADAwG,EAAsBD,CAAK,GACvBA,EAAM,SAAS;AACf,UAAM,IAAI,UAAU,2CAA2C;AAEnE,QAAME,IAAYF,EAAM,MAAM,OAAOvG,CAAK;AAC1C,SAAA0G,GAAuBD,GAAWF,EAAM,IAAI,GACrC,OAAO,OAAO,EAAC,OAAAA,GAAO,OAAAvG,GAAM;AACvC;AAEO,SAAS2G,MACTC,GACQ;AACX,MAAIA,EAAO,WAAW,EAAG,OAAM,IAAI,UAAU,yCAAyC;AACtF,aAAWC,KAAQD;AACf,QAAIE,GAAsBD,CAAI;AAC1B,MAAAL,EAAsBK,EAAK,KAAK;AAAA,aAEhCL,EAAsBK,CAAI,GACtBA,EAAK,SAAS;AACd,YAAM,IAAI,UAAU,uDAAuD;AAIvF,QAAMzB,IAAS,OAAO,OAAO,EAAC,QAAQ,OAAO,OAAO,CAAC,GAAGwB,CAAM,CAAC,GAAE;AACjE,SAAA1B,GAAa,IAAIE,CAAM,GAChBA;AACX;AAEO,SAAS2B,GACZ3B,GACA4B,GACW;AAEX,MADA3B,GAAkBD,CAAM,GACpB4B,KAAS,QAAQ,OAAOA,KAAU,YAAY,MAAM,QAAQA,CAAK;AACjE,UAAM,IAAI,UAAU,sCAAsC;AAE9D,QAAMvE,IAAO,OAAO,OAAO,EAAC,QAAQ2C,EAAO,QAAQ,OAAO,OAAO,OAAO,EAAC,GAAG4B,EAAA,CAAM,GAAE;AACpF,SAAA9B,GAAa,IAAIzC,CAAI,GACdA;AACX;AAEO,SAASwE,GAAW7B,GAAoC;AAC3D,SAAO,IAAID,GAAcC,CAAM;AACnC;AAEO,SAAS8B,GAAkBlH,GAA6C;AAC3E,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAYiF,GAAiB,IAAIjF,CAAK;AACnF;AAEO,SAASwG,EAAsBxG,GAAqD;AACvF,MAAI,CAACkH,GAAkBlH,CAAK;AACxB,UAAM,IAAI,UAAU,qEAAqE;AAEjG;AAEO,SAASmH,GAAcnH,GAAsC;AAChE,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAYkF,GAAa,IAAIlF,CAAK;AAC/E;AAEO,SAASqF,GAAkBrF,GAA8C;AAC5E,MAAI,CAACmH,GAAcnH,CAAK,EAAG,OAAM,IAAI,UAAU,4CAA4C;AAC/F;AAEO,SAASqG,GACZF,GACmC;AACnC,MAAIA,KAAS,QACN,OAAOA,KAAU,YACjB,OAAOA,EAAM,SAAU,cACvB,OAAOA,EAAM,UAAW;AAC3B,UAAM,IAAI,UAAU,iDAAiD;AAE7E;AAEO,SAASiB,GACZjB,GACwC;AACxC,MAAIA,KAAS,QACN,OAAOA,KAAU,YACjB,OAAOA,EAAM,SAAU,cACvB,OAAOA,EAAM,UAAW;AAC3B,UAAM,IAAI,UAAU,uDAAuD;AAEnF;AAEO,SAASkB,GAAkBjC,GAA6B;AAC3D,EAAAC,GAAkBD,CAAM;AACxB,QAAMkC,IAAWlC,EAAO,OAAO,IAAI,CAACyB,MAAS;AACzC,QAAIC,GAAsBD,CAAI,GAAG;AAC7B,YAAMJ,IAAYI,EAAK,MAAM,MAAM,OAAOA,EAAK,KAAK;AACpD,aAAAH,GAAuBD,GAAWI,EAAK,MAAM,IAAI,GAC1C,mBAAmBJ,CAAS;AAAA,IACvC;AACA,WAAO,mBAAmBI,EAAK,IAAI;AAAA,EACvC,CAAC,GACKU,IAAS,IAAI,gBAAA;AACnB,aAAW,CAAC1G,GAAM2G,CAAG,KAAK,OAAO,QAAQpC,EAAO,SAAS,CAAA,CAAE,EAAE,KAAK,CAAC,CAACqC,CAAI,GAAG,CAACC,CAAK,MAC7ED,EAAK,cAAcC,CAAK,CAAC,GAAG;AAC5B,QAAIF,KAAO,KAAM;AACjB,UAAMzG,IAAS,MAAM,QAAQyG,CAAG,IAAIA,IAAM,CAACA,CAAG;AAC9C,eAAWxH,KAASe,EAAQ,CAAAwG,EAAO,OAAO1G,GAAMb,CAAK;AAAA,EACzD;AACA,QAAMgH,IAAQO,EAAO,SAAA;AACrB,SAAO,IAAID,EAAS,KAAK,GAAG,CAAC,GAAGN,MAAU,KAAK,KAAK,IAAIA,CAAK,EAAE;AACnE;AAEA,SAASF,GAAsB9G,GAA8C;AACzE,SAAOA,KAAS,QACT,OAAOA,KAAU,YACjB,WAAWA,KACX,WAAWA,KACXkH,GAAkBlH,EAAM,KAAK,KAC7BA,EAAM,MAAM,SAAS;AAChC;AAEA,SAAS8F,GAAU9F,GAAgB8B,GAAuB;AACtD,MAAI,OAAO9B,KAAU,YAAY,CAAC,kCAAkC,KAAKA,CAAK;AAC1E,UAAM,IAAI,UAAU,GAAG8B,CAAK,sCAAsC;AAEtE,SAAO9B;AACX;AAEA,SAASgG,GAAahG,GAAgB8B,GAAuB;AACzD,MAAI,OAAO9B,KAAU,YACdA,MAAU,MACVA,MAAU,OACVA,MAAU,QACVA,EAAM,SAAS,GAAG,KAClBA,EAAM,SAAS,GAAG,KAClBA,EAAM,SAAS,GAAG;AACrB,UAAM,IAAI,UAAU,GAAG8B,CAAK,qCAAqC;AAErE,MAAI;AACA,IAAA4E,GAAuB,mBAAmB1G,CAAK,GAAG8B,CAAK;AAAA,EAC3D,QAAQ;AACJ,UAAM,IAAI,UAAU,GAAGA,CAAK,kCAAkC;AAAA,EAClE;AACA,SAAO9B;AACX;AAEA,SAAS0G,GAAuB1G,GAAgB8B,GAAwC;AACpF,MAAI,OAAO9B,KAAU,YAAYA,MAAU,MAAMA,EAAM,SAAS,GAAG;AAC/D,UAAM,IAAI,UAAU,GAAG8B,CAAK,+CAA+C;AAEnF;ACrQO,MAAM6F,WAAkBzI,EAA0B;AAAA,EAErD,aAAmB;AACf,UAAM6D,IAAS,KAAK,SAAS;AAC7B,QAAIA,KAAU,KAAM,OAAM,IAAI,MAAM,mDAAmD;AACvF,SAAK,MAAMA,EAAO,UAAU;AAAA,EAChC;AAAA,EAEA,SAA2B;AACvB,UAAMA,IAAS,KAAK,SAAS;AAC7B,QAAIA,KAAU,KAAM,OAAM,IAAI,MAAM,mDAAmD;AACvF,UAAMqC,IAAS8B,GAAkB,KAAK,MAAM,EAAE,IACxCnE,EAAO,QAAQ,KAAK,MAAM,IAAI,KAAK,iBAAiBA,EAAO,IAAI,IAC/D,KAAK,MAAM,IACX;AAAA,MACF,IAAI6E;AAAA,MACJ,OAAAC,IAAQ;AAAA,MACR,UAAAC,IAAW,CAAA;AAAA,MACX,SAAAC;AAAA,MACA,GAAGC;AAAA,IAAA,IACH,KAAK;AACT,WAAOhF,EAAE,KAAK;AAAA,MACV,GAAGgF;AAAA,MACH,MAAMjF,EAAO,KAAKqC,CAAM;AAAA,MACxB,gBAAgBrC,EAAO,SAASqC,GAAQyC,CAAK,IAAI,SAAS;AAAA,MAC1D,SAAS,CAAChG,MAAsB;AAE5B,QADAkG,KAAA,QAAAA,EAAUlG,IACLoG,GAAkBpG,GAAOmG,EAAY,QAAQA,EAAY,QAAQ,MACtEnG,EAAM,eAAA,GACDkB,EAAO,SAASqC,CAAM;AAAA,MAC/B;AAAA,IAAA,GACD0C,CAAQ;AAAA,EACf;AACJ;AAhCI3I,EADSwI,IACO,aAA+B,CAAA;AAkCnD,SAASM,GACLpG,GACAuD,GACA8C,GACO;AACP,SAAI,EAAArG,EAAM,oBACHA,EAAM,WAAW,KACjBA,EAAM,WACNA,EAAM,WACNA,EAAM,YACNA,EAAM,UACNqG,KAAY,QAAQA,MAAa,MACjC9C,KAAU,QAAQA,MAAW,MAAMA,MAAW;AAEzD;AC9CO,SAAS+C,GAAsBnI,GAA8C;AAChF,SAAOA,KAAS,QACT,OAAOA,KAAU,YAChBA,EAA2B,SAAS;AAChD;AAkCO,MAAMoI,WAAsBlJ,EAA8B;AAAA,EAG7D,YAAYG,GAA2B;AACnC,UAAMA,CAAK,GACXgJ,GAAmBhJ,CAAK;AAAA,EAC5B;AAAA,EAEA,SAA2B;AACvB,IAAAgJ,GAAmB,KAAK,KAAK;AAC7B,UAAMpG,IAAO,KAAK;AAClB,6BAAQA,GAAA,EAAK,WAAWhB,GAAuB,KAAK,KAAK,KAAK,MAC1D,UAAA,gBAAAiB,EAAC,OAAA,EAAI,cAAY,KAAK,MAAM,OACxB,UAAA,gBAAAA,EAAC,MAAA,EAAI,eAAK,MAAM,MAAM,IAAI,CAACqB,MAAS,gBAAArB,EAAC,MAAA,EAChC,YAAK,WACA,gBAAAA,EAAC,UAAK,iBAAc,QAAO,OAAOqB,EAAK,OAAQ,UAAAA,EAAK,MAAA,CAAM,IAC1D4E,GAAsB5E,EAAK,EAAE,IACzB,gBAAArB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAMqB,EAAK,GAAG;AAAA,QACb,GAAIA,EAAK,UAAU,OAAO,CAAA,IAAK,EAAC,QAAQA,EAAK,OAAA;AAAA,QAC7C,GAAIA,EAAK,YAAY,OAAO,CAAA,IAAK,EAAC,UAAUA,EAAK,SAAA;AAAA,QACjD,GAAIA,EAAK,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAK,MAAA;AAAA,QAC3C,GAAIA,EAAK,WAAW,OAAO,CAAA,IAAK,EAAC,SAASA,EAAK,QAAA;AAAA,QAClD,UAAAA,EAAK;AAAA,MAAA;AAAA,IAAA,IACL,gBAAArB;AAAA,MAACyF;AAAA,MAAA;AAAA,QACC,IAAIpE,EAAK;AAAA,QACR,GAAIA,EAAK,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAK,MAAA;AAAA,QAC3C,GAAIA,EAAK,UAAU,OAAO,CAAA,IAAK,EAAC,QAAQA,EAAK,OAAA;AAAA,QAC7C,GAAIA,EAAK,YAAY,OAAO,CAAA,IAAK,EAAC,UAAUA,EAAK,SAAA;AAAA,QACjD,GAAIA,EAAK,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAK,MAAA;AAAA,QAC3C,GAAIA,EAAK,WAAW,OAAO,CAAA,IAAK,EAAC,SAASA,EAAK,QAAA;AAAA,QAClD,UAAAA,EAAK;AAAA,MAAA;AAAA,IAAA,EAAM,GAlBoB,OAAOA,EAAK,EAAE,CAmB3D,CAAK,EAAA,CAAE,GACX,GACJ;AAAA,EACJ;AAuFJ;AAzHIpE,EADSiJ,IACO,aAA+B,CAAA,IAoC/CjJ,EArCSiJ,IAqCF,gBAAe,CAACT,EAAS,IAChCxI,EAtCSiJ,IAsCO,YAAW,mBAE3BjJ,EAxCSiJ,IAwCO,OAAM1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoF1B,SAAS2F,GAAmBhJ,GAAiC;AACzD,MAAI,OAAOA,EAAM,SAAU,YAAYA,EAAM,MAAM,KAAA,MAAW;AAC1D,UAAM,IAAI,UAAU,gDAAgD;AAExE,MAAI,CAAC,MAAM,QAAQA,EAAM,KAAK,EAAG,OAAM,IAAI,UAAU,sCAAsC;AAC3F,QAAMwD,wBAAU,IAAA;AAChB,aAAWU,KAAQlE,EAAM,OAAO;AAC5B,QAAIkE,KAAQ,QAAQA,EAAK,MAAM,KAAM,OAAM,IAAI,UAAU,qCAAqC;AAC9F,QAAIA,EAAK,SAAS,KAAM,OAAM,IAAI,UAAU,uCAAuC;AACnF,QAAIA,EAAK,MAAM,KAAM,OAAM,IAAI,UAAU,6CAA6C;AACtF,QAAI4E,GAAsB5E,EAAK,EAAE,GAAG;AAChC,UAAI,OAAOA,EAAK,GAAG,QAAS,YAAYA,EAAK,GAAG,KAAK,KAAA,MAAW;AAC5D,cAAM,IAAI,UAAU,oDAAoD;AAE5E,UAAIA,EAAK,SAAS;AACd,cAAM,IAAI,UAAU,0DAA0D;AAAA,IAEtF;AACA,QAAIV,EAAI,IAAIU,EAAK,EAAE,EAAG,OAAM,IAAI,MAAM,iCAAiC,OAAOA,EAAK,EAAE,CAAC,EAAE;AACxF,QAAIA,EAAK,WAAW,QAAQ,OAAOA,EAAK,WAAY;AAChD,YAAM,IAAI,UAAU,4CAA4C;AAEpE,IAAAV,EAAI,IAAIU,EAAK,EAAE;AAAA,EACnB;AACJ;AClLO,MAAM+E,WAAmBpJ,EAA2B;AAAA,EAGvD,YAAYG,GAAwB;AAChC,UAAMA,CAAK,GACXkJ,GAAmBlJ,CAAK;AAAA,EAC5B;AAAA,EAEA,SAA2B;AACvB,IAAAkJ,GAAmB,KAAK,KAAK;AAC7B,UAAMtG,IAAO,KAAK,MACZoB,IAAQ,KAAK,MAAM,OACnBmF,IAAOnF,EAAM,SAAS;AAC5B,WAAO,gBAAAnB,EAACD,KAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAClD,UAAA,gBAAAkB,EAAC,OAAA,EAAI,cAAY,KAAK,MAAM,SAAS,KAAK,mBAAmB,iBAAiB,GAC1E,UAAA,gBAAAA,EAAC,MAAA,EAAI,UAAAmB,EAAM,IAAI,CAACE,GAAMpB,MAAU,gBAAAD,EAAC,MAAA,EAC5B,gBAAUsG,IACL,gBAAAtG,EAAC,UAAK,gBAAa,QAAQ,GAAIqB,EAAK,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAK,MAAA,GAAU,YAAK,MAAA,CAAM,IAC3FA,EAAK,MAAM,OACP,gBAAArB;AAAA,MAACyF;AAAA,MAAA;AAAA,QACC,IAAIpE,EAAK;AAAA,QACR,GAAIA,EAAK,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAK,MAAA;AAAA,QAC3C,GAAIA,EAAK,WAAW,OAAO,CAAA,IAAK,EAAC,SAASA,EAAK,QAAA;AAAA,QAClD,UAAAA,EAAK;AAAA,MAAA;AAAA,IAAA,IACLA,EAAK,WAAW,OACZ,gBAAArB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACJ,GAAIqB,EAAK,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAK,MAAA;AAAA,QAC5C,SAAS,CAAC1B,MAAsB;AAC5B,UAAAA,EAAM,eAAA,GACN0B,EAAK,QAAS1B,CAAK;AAAA,QACvB;AAAA,QACF,UAAA0B,EAAK;AAAA,MAAA;AAAA,IAAA,IACL,gBAAArB,EAAC,QAAA,EAAM,GAAIqB,EAAK,SAAS,OAAO,KAAK,EAAC,OAAOA,EAAK,SAAU,UAAAA,EAAK,OAAM,EAAA,GAlBhD,OAAOA,EAAK,EAAE,CAmBvD,CAAK,GAAE,EAAA,CACX,EAAA,CACJ;AAAA,EACJ;AAkDJ;AAtFIpE,EADSmJ,IACO,aAA+B,CAAA,IAsC/CnJ,EAvCSmJ,IAuCF,gBAAe,CAACX,EAAS,IAChCxI,EAxCSmJ,IAwCO,YAAW,eAE3BnJ,EA1CSmJ,IA0CO,OAAM5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+C1B,SAAS6F,GAAmBlJ,GAA8B;AACtD,MAAI,CAAC,MAAM,QAAQA,EAAM,KAAK,EAAG,OAAM,IAAI,UAAU,mCAAmC;AACxF,QAAMwD,wBAAU,IAAA;AAChB,aAAWU,KAAQlE,EAAM,OAAO;AAC5B,QAAIkE,KAAQ,QAAQA,EAAK,MAAM,KAAM,OAAM,IAAI,UAAU,qCAAqC;AAC9F,QAAIA,EAAK,SAAS,KAAM,OAAM,IAAI,UAAU,uCAAuC;AACnF,QAAIA,EAAK,WAAW,QAAQ,OAAOA,EAAK,WAAY;AAChD,YAAM,IAAI,UAAU,4CAA4C;AAEpE,QAAIV,EAAI,IAAIU,EAAK,EAAE,EAAG,OAAM,IAAI,MAAM,iCAAiC,OAAOA,EAAK,EAAE,CAAC,EAAE;AACxF,IAAAV,EAAI,IAAIU,EAAK,EAAE;AAAA,EACnB;AACJ;AC1FO,MAAMkF,WAAuBvJ,EAA+B;AAAA,EACtD,MAAM2E,IAA4B,MAAM6E,IAAsB,MAAY;AAC/E,QAAI7E,KAAU,MAAM;AAChB,YAAM8E,IAAiBC,GAAe/E,GAAQ,sBAAsB,GAC9DgF,IAAa,KAAK;AACxB,WAAK,SAAS,eAAeA,CAAU,EAAE,aAAaF,CAAc;AAAA,IACxE;AACA,WAAO,MAAM,MAAM9E,GAAQ6E,CAAM;AAAA,EACrC;AAAA,EAEU,gBAAkC;AACxC,WAAO,KAAK,MAAM,YAAY;AAAA,EAClC;AAAA,EAEA,SAAS;AACL,UAAM;AAAA,MACF,UAAUI;AAAA,MACV,KAAKC;AAAA,MACL,OAAOC;AAAA,MACP,WAAAC;AAAA,MACA,QAAQC;AAAA,MACR,QAAAC,IAAS;AAAA,MACT,QAAAC;AAAA,MACA,UAAAC,IAAW;AAAA,MACX,GAAGC;AAAA,IAAA,IACH,KAAK,OACHrH,IAAO,KAAK,MACZsH,IAAgBC;AAAA,MAClBR;AAAA,MACAC;AAAA,MACAQ,GAAgBN,CAAM;AAAA,MACtBC,KAAU,OAAO,SAAY1J,GAAyB0J,CAAM;AAAA,IAAA;AAEhE,WAAO,gBAAAlH;AAAA,MAACD;AAAA,MAAA;AAAA,QACH,GAAGqH;AAAA,QACJ,MAAMI,GAAaL,CAAQ;AAAA,QAC1B,GAAIE,KAAiB,OAAO,CAAA,IAAK,EAAC,WAAWA,EAAA;AAAA,QAE7C,eAAK,cAAA;AAAA,MAAc;AAAA,IAAA;AAAA,EAE5B;AAeJ;AAbIpK,EA1CSsJ,IA0CO,YAAW,QAE3BtJ,EA5CSsJ,IA4CO,OAAM/F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBnB,SAASiH,GACZC,GACAC,GACAhG,MACGzC,GACC;AACJ,MAAI,EAAEwI,aAAmBE;AACrB,UAAM,IAAI,UAAU,mDAAmD;AAE3E,QAAMnB,IAAiBC,GAAe/E,GAAQ,qBAAqB;AAEnE,SAAA+F,EAAQ,eAAeC,CAAO,EAAE,aAAalB,CAAc,GACpDiB,EAAQ,MAAMA,EAAQ,OAAOC,GAAS,GAAGzI,CAAI,GAAGyC,CAAM;AACjE;AAEA,SAAS+E,GAAe/E,GAAoBkG,GAA0B;AAClE,MAAIlG,KAAU,QAAQ,OAAOA,KAAW,YAAY,EAAE,mBAAmBA;AACrE,UAAM,IAAI,UAAU,GAAGkG,CAAM,6BAA6B;AAE9D,QAAMpB,IAAiB9E,EAAO,kBAAkBA,EAAO,aAAa,IAAIA,IAAqB;AAC7F,OAAI8E,KAAA,gBAAAA,EAAgB,SAAQ;AACxB,UAAM,IAAI,UAAU,GAAGoB,CAAM,oDAAoD;AAErF,SAAOpB;AACX;AAEA,SAASc,GAAgBN,GAAkD;AACvE,UAAQA,GAAA;AAAA,IACJ,KAAK;AAAY;AAAA,IACjB,KAAK;AAAkB,aAAO;AAAA,IAC9B,KAAK;AAAmB,aAAO;AAAA,IAC/B,KAAK;AAAY,aAAO;AAAA,IACxB;AAAS,YAAM,IAAI;AAAA,QACf;AAAA,MAAA;AAAA,EACJ;AAER;AAEA,SAASO,GAAaL,GAAiD;AACnE,MAAIA,MAAa,OAAQ,QAAO;AAChC,MAAIA,MAAa,OAAQ,QAAO;AAChC,QAAM,IAAI,UAAU,8CAA8C;AACtE;AAEA,SAASG,MAAmBzI,GAAoE;AAC5F,QAAMiJ,IAASjJ,EAAO,QAAQ,CAAAf,OAASA,KAAA,gBAAAA,EAAO,OAAO,MAAM,WAAU,CAAA,CAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACjG,SAAOgK,EAAO,WAAW,IAAI,SAAYA;AAC7C;ACnIO,MAAMC,UAAe/K,EAAuB;AAAA,EAK/C,YAAYG,IAAqB,IAAI;AACjC,UAAMA,CAAK;AAJN,IAAAF,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,WAAWgB,EAAU,UAAUd,EAAM,EAAE,GAC5C,KAAK,YAAYc,EAAU,gBAAgBd,EAAM,aAAa,GAAG,KAAK,QAAQ,QAAQ;AAAA,EAC1F;AAAA,EAEA,SAA2B;AACvB,UAAM,EAAC,OAAA6K,IAAQ,GAAG,UAAApC,IAAW,CAAA,EAAC,IAAK,KAAK;AACxC,QAAI,CAAC,OAAO,UAAUoC,CAAK,KAAKA,IAAQ,KAAKA,IAAQ;AACjD,YAAM,IAAI,UAAU,6CAA6C;AAGrE,UAAMjI,IAAO,KAAK;AAClB,WAAO,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,WAAWhB,GAAuB,KAAK,KAAK,KAAK;AAAA,QAE/C,WAAA,MAAM;AACJ,gBAAMkJ,IAAU,IAAID,CAAK;AACzB,iBAAO,gBAAAhI,EAACiI,GAAA,EAAQ,IAAI,KAAK,WAAY,UAAArC,GAAS;AAAA,QAClD,GAAA;AAAA,MAAG;AAAA,IAAA;AAAA,EAEX;AA2BJ;AArDI3I,EADS8K,GACO,aAA+B,CAAA,IA4B/C9K,EA7BS8K,GA6BO,YAAW,WAE3B9K,EA/BS8K,GA+BF,OAAMvH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC1BV,MAAM0H,WAEHlL,EAAkB;AAAA,EAKxB,YAAYG,GAAe;AACvB,UAAMA,CAAK;AAJN,IAAAF,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUgB,EAAU,aAAad,EAAM,EAAE,GAC9C,KAAK,WAAW,GAAG,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,SAA2B;AACvB,UAAM,EAAC,QAAAgL,GAAQ,UAAAvC,IAAW,CAAA,EAAC,IAAK,KAAK;AACrC,WAAO,KAAK,eAAeuC,GAAQvC,CAAQ;AAAA,EAC/C;AAAA,EAEU,eAAeuC,GAA0BzG,GAA6C;AAC5F,UAAM3B,IAAO,KAAK,MACZqI,IAAeC,GAAqB,KAAK,MAAM,OAAO;AAC5D,WAAO,gBAAA/F;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,MAAK;AAAA,QACL,WAAWnB,GAAWE,EAAe,KAAK,KAAK,GAAGsJ,CAAY,KAAK;AAAA,QACnE,mBAAiB,KAAK;AAAA,QAEtB,UAAA;AAAA,UAAA,gBAAApI;AAAA,YAAC+H;AAAA,YAAA;AAAA,cACG,IAAI,GAAG,KAAK,OAAO;AAAA,cACnB,WAAW,KAAK;AAAA,cAClB,UAAAI;AAAA,YAAA;AAAA,UAAA;AAAA,UACF,gBAAAnI,EAAC,iBAAa,UAAA0B,EAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAE9B;AA0PJ;AAxRIzE,EAHSiL,IAGO,aAA+B,CAAA,IAgC/CjL,EAnCSiL,IAmCO,YAAW,cAC3BjL,EApCSiL,IAoCO,gBAAsC,CAACH,CAAM,IAE7D9K,EAtCSiL,IAsCF,OAAM1H;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuPjB,SAAS6H,GAAqBC,GAA0D;AACpF,MAAIA,KAAW,MACf;AAAA,QAAIA,MAAY,aAAaA,MAAY,SAAU,QAAO,gBAAgBA,CAAO;AACjF,UAAM,IAAI,UAAU,4CAA4C;AAAA;AACpE;AC/SO,MAAMC,WAA2BvL,EAAU;AASlD;AARIC,EADSsL,IACO,YAAW,OAE3BtL,EAHSsL,IAGO,OAAM/H;AAAA;AAAA;AAAA;AAAA;AAAA;AAenB,MAAMgI,UAAqBxL,EAA6B;AAAA,EAC3D,SAA2B;AACvB,UAAMqG,IAAUoF,GAAmB,KAAK,MAAM,OAAO,KAAK,MAAM,YAAY,EAAE,GACxE1I,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK,MAAM;AAAA,QACf,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,MAAK;AAAA,QACL,UAAU;AAAA,QACV,cAAYuE;AAAA,QAEZ,UAAA;AAAA,UAAA,gBAAArD,EAAC,iBAAA,EAAc,eAAY,OAAA,CAAO;AAAA,UAClC,gBAAAA,EAAC,mBAAe,UAAAqD,EAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEhC;AAwFJ;AAtFIpG,EAhBSuL,GAgBO,YAAW,UAC3BvL,EAjBSuL,GAiBO,gBAAe,CAACD,EAAkB,IAElDtL,EAnBSuL,GAmBO,OAAMhI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqFnB,SAASiI,GAAmBC,GAAgBtL,GAA0B;AAEzE,MADIsL,aAAiB,SACjBC,GAAeD,CAAK,EAAG,QAAOA,EAAM;AACxC,MAAIE,GAAgBF,CAAK,GAAG;AACxB,UAAMG,IAAWH,EACZ,IAAI,CAACI,MAAUL,GAAmBK,EAAM,OAAO,EAAE,CAAC,EAClD,OAAO,CAACzF,MAAYA,EAAQ,SAAS,CAAC;AAC3C,QAAIwF,EAAS,SAAS,EAAG,QAAO,CAAC,GAAG,IAAI,IAAIA,CAAQ,CAAC,EAAE,KAAK,IAAI;AAAA,EACpE;AACA,SAAOH,KAAS,OAAOtL,IAAW,OAAOsL,CAAK;AAClD;AAEA,SAASC,GAAeD,GAA4C;AAChE,SAAOA,KAAS,QACT,OAAOA,KAAU,YACjB,OAAO,QAAQ,IAAIA,GAAO,SAAS,KAAM;AACpD;AAEA,SAASE,GAAgBF,GAAsD;AAC3E,SAAO,MAAM,QAAQA,CAAK,KAAKA,EAAM,MAAM,CAACI,MACxCA,KAAS,QAAQ,OAAOA,KAAU,YAAY,OAAO,OAAOA,GAAO,OAAO,CAAC;AACnF;ACvIO,MAAeC,WAEZ/L,EAAkB;AAAA,EAGxB,SAAgB;AACZ,UAAM,IAAI,MAAM,GAAG,KAAK,YAAY,IAAI,kDAAkD;AAAA,EAC9F;AACJ;AALIC,EAHkB8L,IAGF,aAA+B,CAAA;AAyB5C,SAASC,GACZ3L,GACAuI,GACAqD,GACAxK,IAAgD,CAAA,GACb;AACnC,QAAMyK,IAAU,OAAO,QAAQD,CAAgB,GACzCvH,IAA8B,CAAA,GAC9ByH,IAA+D,CAAA,GAC/DtK,IAAS,MAAM,QAAQ+G,CAAQ,IAAIA,IAAWA,KAAY,OAAO,KAAK,CAACA,CAAQ;AAErF,aAAWhD,KAAS/D,GAAQ;AACxB,QAAI,CAACgE,GAAQD,CAAK,GAAG;AACjB,MAAAlB,EAAQ,KAAKkB,CAAK;AAClB;AAAA,IACJ;AACA,UAAMkG,IAAQI,EAAQ,KAAK,CAAC,CAAA,EAAGE,CAAI,MAAMxG,EAAM,SAASwG,CAAI;AAC5D,QAAIN,KAAS,MAAM;AACf,UAAIO,GAAwBzG,EAAM,IAAI;AAClC,cAAM,IAAI,MAAM,GAAGvF,CAAa,6BAA6BuF,EAAM,KAAK,IAAI,EAAE;AAElF,MAAAlB,EAAQ,KAAKkB,CAAK;AAClB;AAAA,IACJ;AAEA,UAAM,CAACjE,CAAI,IAAImK;AACf,QAAIK,EAAQxK,CAAI,KAAK,KAAM,OAAM,IAAI,MAAM,GAAGtB,CAAa,+BAA+BsB,CAAI,EAAE;AAChG,IAAAwK,EAAQxK,CAAI,IAAIiE,EAAM,MAAM;AAAA,EAChC;AAEA,MAAInE,EAAQ,iBAAiB,MAASiD,EAAQ,SAAS;AACnD,UAAM,IAAI,MAAM,GAAGrE,CAAa,8CAA8C;AAElF,aAAWiM,KAAY7K,EAAQ,YAAY,CAAA,GAAI;AAC3C,QAAI,CAAC,OAAO,OAAOwK,GAAkBK,CAAQ;AACzC,YAAM,IAAI,MAAM,GAAGjM,CAAa,gCAAgCiM,CAAQ,EAAE;AAE9E,QAAIH,EAAQG,CAAQ,KAAK,KAAM,OAAM,IAAI,MAAM,GAAGjM,CAAa,qBAAqBiM,CAAQ,EAAE;AAAA,EAClG;AAEA,SAAO,EAAC,SAAA5H,GAAS,SAAAyH,EAAA;AACrB;AAEA,SAASE,GAAwBD,GAA6C;AAC1E,SAAO,OAAOA,KAAS,cAChBA,EAAK,qBAAqBL;AACrC;AChFO,MAAMQ,WAA6BR,GAAkB;AAAC;AAE7D,MAAMS,KAAuB,CAAC,YAAY,YAAY,QAAQ,OAAO;AAgB9D,MAAMC,WACDzM,EAAkB;AAAA,EAK1B,YAAYG,GAAe;AACvB,UAAMA,CAAK;AAJN,IAAAF,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUgB,EAAU,gBAAgBd,EAAM,EAAE,GACjD,KAAK,UAAU,GAAG,KAAK,OAAO;AAAA,EAClC;AAAA,EAEA,SAA2B;AACvB,QAAI,KAAK,MAAM,aAAa;AACxB,YAAM,IAAI,MAAM,kFAAkF;AAEtG,UAAM,EAAC,SAAAuE,GAAS,SAAAyH,MAAWH,GAAuB,eAAe,KAAK,MAAM,UAAU;AAAA,MAClF,WAAWO;AAAA,IAAA,CACd;AACD,WAAO,KAAK,kBAAkB7H,GAASyH,EAAQ,aAAa,IAAI;AAAA,EACpE;AAAA,EAEU,kBAAkBzH,GAA2BgI,GAA+C;AAClG,UAAM3J,IAAO,KAAK,MACZ;AAAA,MACF,OAAAH;AAAA,MACA,WAAA+J;AAAA,MACA,UAAApH,IAAW;AAAA,MACX,UAAA+G,IAAW;AAAA,MACX,MAAAM,IAAO;AAAA,MACP,OAAAlB,IAAQ;AAAA,IAAA,IACR,KAAK;AACT,6BAAQ3I,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAClD,UAAA;AAAA,MAAA,gBAAAwD;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAI,KAAK;AAAA,UACT,UAAAC;AAAA,UACA,cAAY3C,KAAS,OAAO+J,IAAY;AAAA,UACxC,iBAAeL,IAAW,SAAS;AAAA,UACnC,aAAWM,IAAO,SAAS;AAAA,UAC3B,gBAAclB,KAAS,OAAO,OAAO;AAAA,UACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,UAE7C,UAAA;AAAA,YAAA9I,KAAS,QAAQ8J,KAAa,OAAO,gBAAApH,EAAC,UAAA,EAClC,UAAA;AAAA,cAAA1C,KAAS,OAAO,gBAAAI,EAAC,QAAA,EAAM,UAAAJ,EAAA,CAAM,IAAU;AAAA,cACvC8J;AAAA,YAAA,EAAA,CACL,IAAY;AAAA,YACXhI;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEJ,KAAK,uBAAuBgH,CAAK;AAAA,IAAA,GACtC;AAAA,EACJ;AAAA;AAAA,EAGU,uBAAuBA,GAAkC;AAC/D,WAAOA,KAAS,OAAO,OAAO,gBAAA1I,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAAE,GAAc;AAAA,EAChF;AAiEJ;AAtHIzL,EAFSwM,IAEO,aAAYD,KAuD5BvM,EAzDSwM,IAyDO,YAAW,iBAC3BxM,EA1DSwM,IA0DO,gBAAe,CAACF,IAAsBf,CAAY,IAElEvL,EA5DSwM,IA4DF,OAAMjJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC3EV,MAAMqJ,WACD3B,GAAiB;AAwC7B;AAvCIjL,EAFS4M,IAEO,YAAW,gBAE3B5M,EAJS4M,IAIF,OAAMrJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACwBV,MAAMsJ,WAAkE9M,EAAkB;AAAA,EAGnF,mBAA2D;AAAA,EAErE;AAAA,EAEU,gBAAyB;AAC/B,WAAO;AAAA,EACX;AAAA,EAEU,yBAAuD;AAC7D,UAAM,EAAC,MAAA+M,GAAM,WAAAJ,GAAW,UAAAtJ,EAAA,IAAY,KAAK;AACzC,WAAO;AAAA,MACH,MAAM0J,MAASJ,KAAa,OAAO,OAAO;AAAA,MAC1C,cAAcA,KAAa;AAAA,MAC3B,UAAUtJ,KAAY;AAAA,IAAA;AAAA,EAE9B;AAAA,EAEA,SAA2B;AACvB,UAAM5C,IAAYP;AAAA,MACd,KAAK;AAAA,MACL,KAAK,iBAAA;AAAA,MACL,KAAK,YAAY;AAAA,IAAA,GAEf8M,IAAS,KAAK,MAAM,UAAU,KAAK,cAAA,GACnCjK,IAAO,KAAK;AAClB,WAAO,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK,MAAM;AAAA,QACf,oBAAkB,KAAK,MAAM,WAAW;AAAA,QACvC,GAAG,KAAK,uBAAA;AAAA,QACT,WAAWnB;AAAA,UACPE,EAAe,KAAK,KAAK;AAAA,UACzBtB,GAAyBC,CAAS;AAAA,UAClCC,GAA0B,KAAK,MAAM,UAAU;AAAA,UAC/CsM,IAAS,eAAe;AAAA,QAAA,KACvB;AAAA,QACP,UAAA,KAAK,MAAM,YAAY,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,EAC9B;AAGJ;AAzCI/M,EADS6M,IACO,aAA+B,CAAA,IAwC/C7M,EAzCS6M,IAyCO,YAAW;ACrE/B,MAAMG,KAAiB,CAAC,UAAU;AAG3B,MAAMC,WAAqBnB,GAAkB;AAAC;AAmB9C,MAAMoB,WAAcnN,EAAsB;AAAA,EAK7C,YAAYG,IAAoB,IAAI;AAChC,UAAMA,CAAK;AAJN,IAAAF,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUgB,EAAU,SAASd,EAAM,EAAE,GAC1C,KAAK,WAAW,GAAG,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,SAAS;AACL,QAAI,KAAK,MAAM,WAAW;AACtB,YAAM,IAAI,MAAM,4DAA4D;AAEhF,UAAM;AAAA,MACF,QAAAgL,IAAS;AAAA,MACT,UAAAvC,IAAW,CAAA;AAAA,MACX,aAAAwE;AAAA,MACA,QAAAJ,IAAS;AAAA,MACT,UAAAzH,IAAW;AAAA,MACX,SAAAd,IAAU;AAAA,IAAA,IACV,KAAK,OACH,EAAC,SAAAC,GAAS,SAAAyH,EAAA,IAAWH,GAAuB,SAASpD,GAAU;AAAA,MACjE,SAASsE;AAAA,IAAA,CACZ;AACD,QAAIE,KAAe,QAAQ,CAAC,CAAC,cAAc,UAAU,EAAE,SAASA,CAAW;AACvE,YAAM,IAAI,UAAU,kDAAkD;AAE1E,QAAIA,KAAe,SACV,KAAK,MAAM,cAAcA,MAAgB,gBACtC,KAAK,MAAM,YAAYA,MAAgB;AAC/C,YAAM,IAAI,UAAU,qDAAqD;AAE7E,UAAM3M,IAAYP;AAAA,MACd,KAAK;AAAA,MACLkN,KAAe;AAAA,MACf;AAAA,IAAA,GAGErK,IAAO,KAAK,MACZsK,IAAQlC,KAAU,OAClB,OACA,gBAAAnI;AAAA,MAAC+H;AAAA,MAAA;AAAA,QACC,IAAI,GAAG,KAAK,OAAO;AAAA,QACnB,WAAW,KAAK;AAAA,QAClB,UAAAI;AAAA,MAAA;AAAA,IAAA;AAEN,WAAO,gBAAA7F;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,oBAAkB0B;AAAA,QAClB,MAAM0G,KAAU,OAAO,OAAO;AAAA,QAC9B,WAAWpJ,GAAuB,KAAK,KAAK;AAAA,QAC5C,iBAAewD,IAAW,SAAS;AAAA,QACnC,mBAAiB4F,KAAU,OAAO,OAAO,KAAK;AAAA,QAE7C,UAAA;AAAA,UAAAkC;AAAA,UACAlB,EAAQ,WAAW;AAAA,UACpB,gBAAAnJ;AAAA,YAAC8J;AAAA,YAAA;AAAA,cACI,GAAIrM,MAAc,eAAe,EAAC,YAAY,OAAQ,EAAC,UAAU,GAAA;AAAA,cAClE,QAAAuM;AAAA,cACA,WAAU;AAAA,cACZ,UAAAtI;AAAA,YAAA;AAAA,UAAA;AAAA,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EAElB;AAoCJ;AAnGIzE,EADSkN,IACO,aAAYF,KAiE5BhN,EAlESkN,IAkEO,YAAW,UAC3BlN,EAnESkN,IAmEO,gBAAe,CAACpC,GAAQ+B,IAAQI,EAAY,IAE5DjN,EArESkN,IAqEF,OAAM3J;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC7FV,MAAM8J,WAAuBvB,GAAkB;AAAC;AAWhD,MAAMwB,WAAgBvN,EAAwB;AAAA,EAKjD,YAAYG,IAAsB,IAAI;AAClC,UAAMA,CAAK;AAJN,IAAAF,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,YAAYgB,EAAU,WAAWd,EAAM,EAAE,GAC9C,KAAK,WAAW,GAAG,KAAK,SAAS;AAAA,EACrC;AAAA,EAEA,SAA2B;AACvB,QAAI,KAAK,MAAM,WAAW;AACtB,YAAM,IAAI,MAAM,gEAAgE;AAEpF,UAAM;AAAA,MACF,QAAAgL,IAAS;AAAA,MACT,WAAAwB;AAAA,MACA,UAAA/D,IAAW,CAAA;AAAA,IAAC,IACZ,KAAK,OACH,EAAC,SAAAlE,GAAS,SAAAyH,EAAA,IAAWH,GAAuB,WAAWpD,GAAU;AAAA,MACnE,SAAS0E;AAAA,IAAA,CACZ,GACKvK,IAAO,KAAK,MACZsK,IAAQlC,KAAU,OAClB,OACA,gBAAAnI;AAAA,MAAC+H;AAAA,MAAA;AAAA,QACC,IAAI,GAAG,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK;AAAA,QAClB,UAAAI;AAAA,MAAA;AAAA,IAAA;AAEN,WAAO,gBAAA7F;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,MAAK;AAAA,QACL,cAAYoI,KAAU,OAAOwB,IAAY;AAAA,QACzC,mBAAiBxB,KAAU,OAAO,OAAO,KAAK;AAAA,QAC9C,WAAWpJ,GAAuB,KAAK,KAAK,KAAK;AAAA,QAEhD,UAAA;AAAA,UAAAsL;AAAA,UACAlB,EAAQ,WAAW,OAAO,OAAO,gBAAAnJ,EAAC,sBAAA,EAAoB,YAAQ,SAAQ;AAAA,UACvE,gBAAAA,EAAC,eAAA,EAAY,UAAU,GAAI,UAAA0B,EAAA,CAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAE3C;AA+BJ;AAxEIzE,EADSsN,IACO,aAA+B,CAAA,IA2C/CtN,EA5CSsN,IA4CO,YAAW,YAC3BtN,EA7CSsN,IA6CO,gBAAe,CAACxC,GAAQuC,EAAc,IAEtDrN,EA/CSsN,IA+CF,OAAM/J;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC5CjB,MAAegK,WAAkBV,GAAuB;AAAA,EAC3C,SAA2B;AAChC,QAAK,KAAK,MAA+B,cAAc;AACnD,YAAM,IAAI,UAAU,2DAA2D;AAEnF,WAAO,MAAM,OAAA;AAAA,EACjB;AAAA,EAEmB,mBAA+C;AAC9D,WAAO;AAAA,EACX;AAAA,EAEmB,gBAAyB;AACxC,WAAO;AAAA,EACX;AAAA,EAEmB,yBAIjB;AACE,UAAM,EAAC,OAAAlK,GAAO,QAAAoK,EAAA,IAAU,KAAK,OACvBS,IAAUT,KAAU,KAAK,cAAA;AAC/B,WAAO;AAAA,MACH,MAAMpK,KAAS,OAAO,OAAO;AAAA,MAC7B,cAAcA,KAAS;AAAA,MACvB,UAAU6K,IAAU,IAAI;AAAA,IAAA;AAAA,EAEhC;AACJ;AAGO,MAAMC,WAAqBF,GAAU;AAE5C;AADIvN,EADSyN,IACO,YAAW;AAIxB,MAAMC,WAAuBH,GAAU;AAE9C;AADIvN,EADS0N,IACO,YAAW;AAwCxB,MAAMC,WAAkB5N,EAA0B;AAAA,EAAlD;AAAA;AAEK,IAAAC,EAAA,uBAAsC;AACtC,IAAAA,EAAA,6BAAqC;AAiF5B,IAAAA,EAAA,2BAAoB,CAAC0C,MAA6D;;AAC/F,UAAIA,EAAM,WAAW,EAAG;AACxB,YAAMkL,IAAU,KAAK,eAAA;AACrB,UAAIA,KAAW,KAAM;AACrB,YAAMC,IAAO,KAAK,KAAA;AAClB,WAAK,gBAAgB;AAAA,QACjB,WAAWnL,EAAM;AAAA,QACjB,iBAAiBmL,MAAS,eAAenL,EAAM,UAAUA,EAAM;AAAA,QAC/D,WAAWmL,MAAS,eACdD,EAAQ,wBAAwB,QAChCA,EAAQ,wBAAwB;AAAA,MAAA,IAE1CE,KAAAtL,IAAAE,EAAM,eAAc,sBAApB,QAAAoL,EAAA,KAAAtL,GAAwCE,EAAM,YAC9CA,EAAM,eAAA;AAAA,IACV;AAEiB,IAAA1C,EAAA,2BAAoB,CACjC0C,MACO;AACP,YAAMqL,IAAS,KAAK;AACpB,UAAIA,KAAU,QAAQA,EAAO,cAAcrL,EAAM,UAAW;AAC5D,YAAMsL,IAAa,KAAK,KAAA,MAAW,eAAetL,EAAM,UAAUA,EAAM;AACxE,WAAK,SAASqL,EAAO,YAAYC,IAAaD,EAAO,iBAAiBrL,CAAK,GAC3EA,EAAM,eAAA;AAAA,IACV;AAEiB,IAAA1C,EAAA,0BAAmB,CAAC0C,MAA6D;;AAC9F,QAAIF,IAAA,KAAK,kBAAL,gBAAAA,EAAoB,eAAcE,EAAM,eAC5CuL,KAAAH,IAAApL,EAAM,eAAc,0BAApB,QAAAuL,EAAA,KAAAH,GAA4CpL,EAAM,YAClD,KAAK,gBAAgB;AAAA,IACzB;AAEiB,IAAA1C,EAAA,uBAAgB,CAC7B0C,MACO;AACP,YAAMmL,IAAO,KAAK,KAAA,GACZK,IAAcL,MAAS,eAAe,cAAc,WACpDM,IAAcN,MAAS,eAAe,eAAe,aACrDD,IAAU,KAAK,eAAA;AACrB,UAAIA,KAAW,KAAM;AACrB,UAAItK;AACJ,UAAIZ,EAAM,QAAQwL;AACd,QAAA5K,IAAO,KAAK,cAAcsK,CAAO,IAAI,KAAK,gBAAgBlL,CAAK;AAAA,eACxDA,EAAM,QAAQyL;AACrB,QAAA7K,IAAO,KAAK,cAAcsK,CAAO,IAAI,KAAK,gBAAgBlL,CAAK;AAAA,eACxDA,EAAM,QAAQ;AACrB,QAAAY,IAAO,KAAK,MAAM,kBAAkB;AAAA,eAC7BZ,EAAM,QAAQ;AACrB,QAAAY,IAAO,OAAO;AAAA;AAEd;AAEJ,WAAK,SAASA,GAAMZ,CAAK,GACzBA,EAAM,eAAA;AAAA,IACV;AAAA;AAAA,EArIS,SAASwC,GAAiC;AAC/C,WAAIA,EAAU,gBAAgB,KAAK,MAAM,qBAAkB,sBAAsB,OAC1E,MAAM,SAASA,CAAS;AAAA,EACnC;AAAA,EAEA,SAA2B;AACvB,QAAI,KAAK,MAAM,WAAW,QAAQ,KAAK,MAAM,aAAa;AACtD,YAAM,IAAI,MAAM,iFAAiF;AAErG,UAAM;AAAA,MACF,WAAA1E;AAAA,MACA,aAAA4N;AAAA,MACA,cAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,gBAAAC,IAAiB;AAAA,MACjB,kBAAAC,IAAmB;AAAA,MACnB,YAAAC,IAAa;AAAA,MACb,gBAAAC,IAAiB,KAAK,mBAAmB,yBAAyB;AAAA,MAClE,WAAAC,IAAY;AAAA,IAAA,IACZ,KAAK;AACT,QAAInO,KAAa,QAAQ,CAAC,CAAC,cAAc,UAAU,EAAE,SAASA,CAAS;AACnE,YAAM,IAAI,UAAU,oDAAoD;AAE5E,QAAIA,KAAa,SACR,KAAK,MAAM,cAAcA,MAAc,gBACpC,KAAK,MAAM,YAAYA,MAAc;AAC7C,YAAM,IAAI,UAAU,uDAAuD;AAE/E,UAAMqN,IAAO5N,GAAyB,KAAK,OAAOO,KAAa,cAAc,WAAW;AACxF,IAAAoO,GAAgBR,GAAa,aAAa,GAC1CS,GAA0BN,GAAgB,gBAAgB,GAC1DM,GAA0BL,GAAkB,kBAAkB,GAC9DM,GAAuBL,GAAY,YAAY;AAE/C,UAAM,EAAC,SAAAb,GAAS,WAAAmB,EAAA,IAAaC,GAAe,KAAK,MAAM,QAAQ,GACzDlM,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,WAAWnB;AAAA,UACPE,EAAe,KAAK,KAAK;AAAA,UACzBpB,GAA0B,KAAK,MAAM,UAAU;AAAA,UAC/CoN;AAAA,QAAA,KACC;AAAA,QACL,OAAO;AAAA,UACH,wBAAwB,KAAK,uBAAuBO,KAAe;AAAA,UACnE,4BAA4B,GAAGG,CAAc;AAAA,UAC7C,8BAA8B,GAAGC,CAAgB;AAAA,QAAA;AAAA,QAErD,kBAAgBG,IAAY,SAAS;AAAA,QAEpC,UAAA;AAAA,UAAAM,GAAkBrB,GAASS,CAAY;AAAA,UACxC,gBAAAtL;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAK;AAAA,cACL,cAAY2L;AAAA,cACZ,oBAAkBb,MAAS,eAAe,aAAa;AAAA,cACvD,iBAAc;AAAA,cACd,iBAAc;AAAA,cACd,iBAAc;AAAA,cACd,iBAAec,IAAY,OAAO;AAAA,cAClC,UAAUA,IAAY,IAAI;AAAA,cACzB,GAAIA,IAAY;AAAA,gBACb,eAAe,KAAK;AAAA,gBACpB,eAAe,KAAK;AAAA,gBACpB,aAAa,KAAK;AAAA,gBAClB,iBAAiB,KAAK;AAAA,gBACtB,WAAW,KAAK;AAAA,cAAA,IAChB,CAAA;AAAA,YAAC;AAAA,UAAA;AAAA,UAERM,GAAkBF,GAAWT,CAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEpD;AAAA,EAES,aAAmB;AACxB,SAAK,qBAAA;AAAA,EACT;AAAA,EAES,cAAoB;AACzB,SAAK,qBAAA;AAAA,EACT;AAAA,EA0DQ,SAASY,GAAuBxM,GAA2C;AAC/E,UAAMyM,IAAO,KAAK,YAAA,GACZC,IAAY,KAAK,iBAAA;AACvB,QAAID,KAAQ,QAAQC,KAAa,KAAM;AACvC,UAAM/O,IAAa,KAAK,KAAA,MAAW,cAC7BgP,IAAShP,IAAa8O,EAAK,cAAcA,EAAK,cAC9CG,IAAkBjP,IAAa+O,EAAU,cAAcA,EAAU,cACjEG,IAAa,KAAK,MAAM,kBAAkB,IAC1CC,IAAe,KAAK,MAAM,oBAAoB,IAC9CC,IAAU,KAAK,IAAIF,GAAYF,IAASC,IAAkBE,CAAY,GACtEE,IAAO,KAAK,IAAI,KAAK,IAAIR,GAAeK,CAAU,GAAGE,CAAO,GAC5D5O,IAAQ,GAAG,KAAK,MAAM6O,IAAO,GAAG,IAAI,GAAG;AAC7C,SAAK,sBAAsB7O,GAC3BsO,EAAK,MAAM,YAAY,wBAAwBtO,CAAK,GACpD,KAAK,qBAAA,GACLkB,EAAO,KAAK,MAAM,UAAUlB,GAAO6B,CAAK;AAAA,EAC5C;AAAA,EAEQ,gBAAgBA,GAA8B;AAClD,YAAQ,KAAK,MAAM,cAAc,OAAOA,EAAM,WAAW,IAAI;AAAA,EACjE;AAAA,EAEQ,cAAckL,GAA8B;AAChD,UAAM+B,IAAS/B,EAAQ,sBAAA;AACvB,WAAO,KAAK,WAAW,eAAe+B,EAAO,QAAQA,EAAO;AAAA,EAChE;AAAA,EAEQ,uBAA6B;AACjC,UAAMR,IAAO,KAAK,YAAA,GACZvB,IAAU,KAAK,eAAA,GACfwB,IAAY,KAAK,iBAAA;AACvB,QAAID,KAAQ,QAAQvB,KAAW,QAAQwB,KAAa,KAAM;AAC1D,UAAM/O,IAAa,KAAK,KAAA,MAAW,cAC7BuP,KAASvP,IAAa8O,EAAK,cAAcA,EAAK,iBAC7C9O,IAAa+O,EAAU,cAAcA,EAAU;AACtD,QAAIQ,KAAS,EAAG;AAChB,UAAMC,IAAa,KAAK,MAAO,KAAK,cAAcjC,CAAO,IAAIgC,IAAS,GAAG;AACzE,IAAAR,EAAU,aAAa,iBAAiB,OAAOS,CAAU,CAAC,GAC1DT,EAAU,aAAa,kBAAkB,GAAGS,CAAU,gBAAgB;AAAA,EAC1E;AAAA,EAEQ,OAAmC;AACvC,WAAO5P;AAAA,MACH,KAAK;AAAA,MACL,KAAK,MAAM,aAAa;AAAA,MACxB;AAAA,IAAA;AAAA,EAER;AAAA,EAEQ,cAAkC;AACtC,WAAO,KAAK,eAAe,cAAc,KAAK,MAAM;AAAA,EACxD;AAAA,EAEQ,iBAAqC;;AACzC,aAAOuC,IAAA,KAAK,YAAA,MAAL,gBAAAA,EAAoB,cAAc,4BAA2B;AAAA,EACxE;AAAA,EAEQ,mBAAuC;;AAC3C,aAAOA,IAAA,KAAK,YAAA,MAAL,gBAAAA,EAAoB,cAAc,8BAA6B;AAAA,EAC1E;AA4FJ;AAlSIxC,EADS2N,IACO,aAA+B,CAAA,IAwM/C3N,EAzMS2N,IAyMO,YAAW,eAC3B3N,EA1MS2N,IA0MO,gBAAe,CAACF,IAAcC,EAAc,IAE5D1N,EA5MS2N,IA4MF,OAAMpK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyFjB,SAASyL,GAAerG,GAGtB;AACE,MAAIiF,IAAwC,MACxCmB,IAA0C;AAC9C,QAAMnN,IAASkO,GAAgBnH,CAAQ;AACvC,aAAWhD,KAAS/D,GAAQ;AACxB,QAAI,CAACgE,GAAQD,CAAK;AACd,YAAM,IAAI,MAAM,wEAAwE;AAE5F,QAAIA,EAAM,SAAS8H,IAAc;AAC7B,UAAIG,KAAW,KAAM,OAAM,IAAI,MAAM,2CAA2C;AAChF,MAAAA,IAAUjI;AAAA,IACd,WAAWA,EAAM,SAAS+H,IAAgB;AACtC,UAAIqB,KAAa,KAAM,OAAM,IAAI,MAAM,6CAA6C;AACpF,MAAAA,IAAYpJ;AAAA,IAChB;AACI,YAAM,IAAI,MAAM,wEAAwE;AAAA,EAEhG;AACA,MAAIiI,KAAW,KAAM,OAAM,IAAI,MAAM,iCAAiC;AACtE,MAAImB,KAAa,KAAM,OAAM,IAAI,MAAM,mCAAmC;AAC1E,SAAO,EAAC,SAAAnB,GAAS,WAAAmB,EAAA;AACrB;AAEA,SAASe,GAAgBnH,GAA0D;AAC/E,QAAMoH,IAAgC,CAAA,GAChCC,IAAQ,CAACnP,MAAgE;AAC3E,QAAI,MAAM,QAAQA,CAAK;AACnB,iBAAW8E,KAAS9E,EAAO,CAAAmP,EAAMrK,CAAK;AAAA,SAC/B9E,KAAS,QAAQA,MAAU,MAASA,MAAU,MACrDkP,EAAU,KAAKlP,CAAK;AAAA,EAE5B;AACA,SAAAmP,EAAMrH,KAAY,EAAE,GACboH;AACX;AAEA,SAASd,GACLgB,GACA9P,GACqB;AACrB,MAAIA,KAAY,QAAQ8P,EAAK,MAAM,SAAS,KAAM,QAAOA;AACzD,QAAM,EAAC,UAAAtH,GAAU,GAAGzI,EAAA,IAAS+P,EAAK;AAClC,SAAOpM,EAAEoM,EAAK,MAA6B;AAAA,IACvC,GAAG/P;AAAA,IACH,KAAK+P,EAAK;AAAA,IACV,OAAO9P;AAAA,EAAA,GACRwI,CAAQ;AACf;AAEA,SAASiG,GAAgB/N,GAA2Ba,GAAoB;AACpE,MAAIb,KAAS,SAAS,OAAOA,KAAU,YAAYA,EAAM,WAAW;AAChE,UAAM,IAAI,UAAU,aAAaa,CAAI,+BAA+B;AAE5E;AAEA,SAASmN,GAA0BhO,GAAea,GAAoB;AAClE,MAAI,OAAOb,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,KAAKA,IAAQ;AAChE,UAAM,IAAI,UAAU,aAAaa,CAAI,uCAAuC;AAEpF;AAEA,SAASoN,GAAuBjO,GAAea,GAAoB;AAC/D,MAAI,OAAOb,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,KAAKA,KAAS;AACjE,UAAM,IAAI,UAAU,aAAaa,CAAI,mCAAmC;AAEhF;ACncO,MAAMwO,WAAwBnQ,EAAgC;AAAA,EAEjE,SAA2B;AACvB,UAAM,EAAC,MAAAoQ,GAAM,OAAAtP,GAAO,UAAA8H,IAAW,CAAA,EAAC,IAAK,KAAK;AAC1C,WAAO;AAAA,MACH,gBAAA5F,EAAC,QAAI,UAAAoN,EAAA,CAAK;AAAA,MACV,gBAAApN,EAAC,MAAA,EAAI,UAAAlC,KAAS8H,EAAA,CAAS;AAAA,IAAA;AAAA,EAE/B;AACJ;AARI3I,EADSkQ,IACO,aAA+B,CAAA;AAe5C,MAAME,WAAwBrQ,EAAgC;AAAA,EAEjE,SAA2B;AACvB,UAAM+C,IAAO,KAAK;AAClB,6BAAQA,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAClD,UAAA,gBAAAkB,EAAC,QAAG,cAAY,KAAK,MAAM,OAAQ,UAAA,KAAK,MAAM,YAAY,IAAG,GACjE;AAAA,EACJ;AAiBJ;AAvBI/C,EADSoQ,IACO,aAA+B,CAAA,IAQ/CpQ,EATSoQ,IASO,YAAW,oBAE3BpQ,EAXSoQ,IAWF,gBAAe,CAACF,EAAe,IAEtClQ,EAbSoQ,IAaF,OAAM7M;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC5BV,MAAM8M,WAAkBtQ,EAA0B;AAAA,EAErD,SAA2B;AACvB,UAAM,EAAC,OAAA4C,GAAO,OAAA9B,GAAO,UAAA8H,IAAW,CAAA,EAAC,IAAK,KAAK;AAC3C,WAAO;AAAA,MACH,gBAAA5F,EAAC,QAAI,UAAAJ,EAAA,CAAM;AAAA,MACX,gBAAAI,EAAC,MAAA,EAAI,UAAAlC,KAAS8H,EAAA,CAAS;AAAA,IAAA;AAAA,EAE/B;AACJ;AARI3I,EADSqQ,IACO,aAA+B,CAAA;AAiB5C,MAAMC,WAAkBvQ,EAA0B;AAAA,EAKrD,YAAYG,IAAwB,IAAI;AACpC,UAAMA,CAAK;AAJN,IAAAF,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUgB,EAAU,cAAcd,EAAM,EAAE,GAC/C,KAAK,WAAW,GAAG,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,SAA2B;AACvB,UAAM,EAAC,OAAAkN,IAAQ,MAAM,OAAAzK,GAAO,UAAAgG,IAAW,CAAA,EAAC,IAAK,KAAK,OAC5C7F,IAAO,KAAK,MACZoI,IAASkC,KAAS,OAClB,OACA,gBAAArK;AAAA,MAAC+H;AAAA,MAAA;AAAA,QACC,IAAI,GAAG,KAAK,OAAO;AAAA,QACnB,WAAW,KAAK;AAAA,QAClB,UAAAsC;AAAA,MAAA;AAAA,IAAA;AAEN,WAAO,gBAAA/H;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,MAAMsK,KAAS,OAAO,OAAO;AAAA,QAC7B,WAAWvL,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,mBAAiBuL,KAAS,OAAO,OAAO,KAAK;AAAA,QAE5C,UAAA;AAAA,UAAAlC;AAAA,UACD,gBAAAnI,EAAC,MAAA,EAAG,cAAYJ,KAAS,MAAO,UAAAgG,EAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEjD;AAmCJ;AAhEI3I,EADSsQ,IACO,aAA+B,CAAA,IA+B/CtQ,EAhCSsQ,IAgCO,YAAW,cAC3BtQ,EAjCSsQ,IAiCO,gBAAe,CAACxF,GAAQuF,EAAS,IAEjDrQ,EAnCSsQ,IAmCF,OAAM/M;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACvDV,MAAMgN,UAAoBxQ,EAA4B;AAAA,EAGzD,SAAS;AACL,UAAMyQ,IAAQC,GAAe,KAAK,MAAM,SAAS,EAAE,GAC7C3N,IAAO,KAAK;AAClB,WAAO,gBAAAC,EAACD,GAAA,EAAK,OAAO,EAAC,OAAO,GAAG0N,CAAK,IAAA,GAAM,eAAY,OAAA,CAAO;AAAA,EACjE;AAgDJ;AAtDIxQ,EADSuQ,GACO,aAA+B,CAAA,IAC/CvQ,EAFSuQ,GAEO,gBAAe,CAACjF,EAAkB,IAOlDtL,EATSuQ,GASO,YAAW,gBAE3BvQ,EAXSuQ,GAWO,OAAMhN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8C1B,SAASkN,GAAeD,GAAgC;AACpD,QAAME,IAAU,OAAOF,CAAK;AAC5B,MAAI,CAAC,OAAO,SAASE,CAAO,EAAG,OAAM,IAAI,UAAU,mCAAmC;AACtF,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,IAAIA,CAAO,CAAC;AAC9C;ACpCO,SAASC,GACZvM,GACAwM,GACAC,GACO;AACP,EAAAC,GAAkBD,CAAU;AAC5B,aAAWE,KAAaF,GAAY;AAChC,UAAMG,IAAcJ,EAAMG,EAAU,GAAG;AACvC,QAAIC,KAAe,KAAM;AACzB,UAAMC,IAASF,EAAU,QAAQ,QAAQ,CAACG,MAAW;AACjD,YAAMpQ,IAAOkQ,EAAYE,EAAO,GAAG;AACnC,aAAOpQ,KAAQ,QAAQA,MAASH,EAAW,UAAU,CAAA,IAAK,CAAC,EAAC,QAAAuQ,GAAQ,MAAApQ,GAAK;AAAA,IAC7E,CAAC;AAKD,QAJImQ,EAAO,KAAK,CAAC,EAAC,QAAAC,GAAQ,MAAApQ,EAAA,MAAUA,MAASH,EAAW,QAAQuQ,EAAO,QAAQ9M,CAAI,CAAC,KAGnE6M,EAAO,OAAO,CAAC,EAAC,MAAAnQ,QAAUA,MAASH,EAAW,OAAO,EACzD,KAAK,CAAC,EAAC,QAAAuQ,EAAA,MAAY,CAACA,EAAO,QAAQ9M,CAAI,CAAC;AACjD,aAAO;AAEX,UAAM+M,IAAYF,EAAO,OAAO,CAAC,EAAC,MAAAnQ,QAAUA,MAASH,EAAW,MAAM;AACtE,QAAIwQ,EAAU,SAAS,KAAK,CAACA,EAAU,KAAK,CAAC,EAAC,QAAAD,EAAA,MAAYA,EAAO,QAAQ9M,CAAI,CAAC;AAC1E,aAAO;AAAA,EAEf;AACA,SAAO;AACX;AAEO,SAASgN,GACZlN,GACA0M,GACAC,GACO;AACP,MAAI,CAAC,MAAM,QAAQ3M,CAAK,EAAG,OAAM,IAAI,UAAU,iCAAiC;AAChF,SAAOA,EAAM,OAAO,CAACE,MAASuM,GAAmBvM,GAAMwM,GAAOC,CAAU,CAAC;AAC7E;AAGO,SAASQ,GACZT,GACAC,GACA7M,IAAiB,MACyE;AAC1F,SAAA8M,GAAkBD,CAAU,GACrB,IAAIS;AAAA,IACP,CAACV,CAAK;AAAA,IACN,CAAC,CAACvN,CAAO,MAAM,CAACe,MAAgBuM,GAAmBvM,GAAMf,GAASwN,CAAU;AAAA,IAC5E,EAAC,OAAA7M,GAAO,SAAS,mBAAA;AAAA,EAAkB;AAE3C;AAGO,SAASuN,GACZrN,GACA0M,GACAC,GACA7M,IAAiB,MAInB;AACE,SAAA8M,GAAkBD,CAAU,GACrB,IAAIS;AAAA,IACP,CAACpN,GAAO0M,CAAK;AAAA,IACb,CAAC,CAACY,GAAcC,CAAY,MAAML,GAAcI,GAAcC,GAAcZ,CAAU;AAAA,IACtF,EAAC,OAAA7M,GAAO,SAAS,iBAAA;AAAA,EAAgB;AAEzC;AAGO,SAAS0N,GAAqBd,GAA2C;AAC5E,EAAAe,GAAkBf,CAAK;AACvB,QAAMC,IAA8D,CAAA;AACpE,aAAWe,KAAgB,OAAO,KAAKhB,CAAK,EAAE,QAAQ;AAClD,UAAMpP,IAA2C,CAAA,GAC3CuP,IAAYH,EAAMgB,CAAY;AACpC,eAAWC,KAAa,OAAO,KAAKd,CAAS,EAAE;AAC3C,MAAAvP,EAAQqQ,CAAS,IAAId,EAAUc,CAAS;AAE5C,IAAAhB,EAAWe,CAAY,IAAIpQ;AAAA,EAC/B;AACA,SAAO,EAAC,SAAS,GAAG,YAAAqP,EAAA;AACxB;AAGO,SAASiB,GAAiBjR,GAA6B;AAC1D,MAAI,CAACkR,GAASlR,CAAK,KAAKA,EAAM,YAAY,KAAK,CAACkR,GAASlR,EAAM,UAAU;AACrE,UAAM,IAAI,UAAU,0DAA0D;AAElF,QAAM+P,IAAyD,CAAA;AAC/D,aAAW,CAACgB,GAAcI,CAAU,KAAK,OAAO,QAAQnR,EAAM,UAAU,GAAG;AAEvE,QADAoR,GAAUL,GAAc,kBAAkB,GACtC,CAACG,GAASC,CAAU;AACpB,YAAM,IAAI,UAAU,oBAAoBJ,CAAY,oBAAoB;AAE5E,UAAMpQ,IAA2C,CAAA;AACjD,eAAW,CAACqQ,GAAW/Q,CAAI,KAAK,OAAO,QAAQkR,CAAU,GAAG;AAExD,UADAC,GAAUJ,GAAW,oBAAoBD,CAAY,EAAE,GACnD,CAAChR,GAAaE,CAAI;AAClB,cAAM,IAAI;AAAA,UACN,2BAA2B8Q,CAAY,IAAIC,CAAS,KAAK,OAAO/Q,CAAI,CAAC;AAAA,QAAA;AAG7E,MAAAU,EAAQqQ,CAAS,IAAI/Q;AAAA,IACzB;AACA,IAAA8P,EAAMgB,CAAY,IAAIpQ;AAAA,EAC1B;AACA,SAAOoP;AACX;AAEA,SAASe,GAAkB9Q,GAA8C;AACrE,MAAI,CAACkR,GAASlR,CAAK,EAAG,OAAM,IAAI,UAAU,gCAAgC;AAC1E,aAAW,CAAC+Q,GAAcpQ,CAAO,KAAK,OAAO,QAAQX,CAAK,GAAG;AAEzD,QADAoR,GAAUL,GAAc,kBAAkB,GACtC,CAACG,GAASvQ,CAAO;AACjB,YAAM,IAAI,UAAU,oBAAoBoQ,CAAY,oBAAoB;AAE5E,eAAW,CAACC,GAAW/Q,CAAI,KAAK,OAAO,QAAQU,CAAO;AAElD,UADAyQ,GAAUJ,GAAW,oBAAoBD,CAAY,EAAE,GACnD,CAAChR,GAAaE,CAAI;AAClB,cAAM,IAAI;AAAA,UACN,2BAA2B8Q,CAAY,IAAIC,CAAS,KAAK,OAAO/Q,CAAI,CAAC;AAAA,QAAA;AAAA,EAIrF;AACJ;AAEA,SAASgQ,GACLD,GACI;AACJ,MAAI,CAAC,MAAM,QAAQA,CAAU,EAAG,OAAM,IAAI,UAAU,oCAAoC;AACxF,QAAMqB,wBAAoB,IAAA;AAC1B,aAAWnB,KAAaF,GAAY;AAEhC,QADAoB,GAAUlB,EAAU,KAAK,kBAAkB,GACvCmB,EAAc,IAAInB,EAAU,GAAG;AAC/B,YAAM,IAAI,MAAM,+BAA+BA,EAAU,GAAG,EAAE;AAGlE,QADAmB,EAAc,IAAInB,EAAU,GAAG,GAC3B,CAAC,MAAM,QAAQA,EAAU,OAAO;AAChC,YAAM,IAAI,UAAU,oBAAoBA,EAAU,GAAG,2BAA2B;AAEpF,UAAMoB,wBAAiB,IAAA;AACvB,eAAWjB,KAAUH,EAAU,SAAS;AAEpC,UADAkB,GAAUf,EAAO,KAAK,oBAAoBH,EAAU,GAAG,EAAE,GACrDoB,EAAW,IAAIjB,EAAO,GAAG;AACzB,cAAM,IAAI,MAAM,4BAA4BH,EAAU,GAAG,IAAIG,EAAO,GAAG,EAAE;AAG7E,UADAiB,EAAW,IAAIjB,EAAO,GAAG,GACrB,OAAOA,EAAO,WAAY;AAC1B,cAAM,IAAI,UAAU,kBAAkBH,EAAU,GAAG,IAAIG,EAAO,GAAG,qBAAqB;AAAA,IAE9F;AAAA,EACJ;AACJ;AAEA,SAASe,GAAUpR,GAAea,GAAoB;AAClD,MAAIb,EAAM,WAAW,KAAKA,MAAU,eAAeA,MAAU,eACtDA,MAAU;AACb,UAAM,IAAI,UAAU,GAAGa,CAAI,sCAAsC;AAEzE;AAEA,SAASqQ,GAASlR,GAAkD;AAChE,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK;AAC7E;ACzJO,MAAMuR,GAAsC;AAAA,EAoB/C,YAAY;AAAA,IACR,UAAAC;AAAA,IACA,QAAAC,IAASC;AAAA,IACT,sBAAAC;AAAA,IACA,OAAAxO,IAAQ;AAAA,EAAA,GAC0B;AAxB7B,IAAAhE,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACC,IAAAA,EAAA,cAAsB,CAAA;AACf,IAAAA,EAAA,qBAAiC,CAAA;AACxC,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAA6B;AAC7B,IAAAA,EAAA,wBAAiC;AACnC,IAAAA,EAAA,wBAAgC;AAChC,IAAAA,EAAA,yBAAqC;AACrC,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,qBAAmC;AACnC,IAAAA,EAAA,2BAAoB;AACpB,IAAAA,EAAA,4BAA2D;AAC3D,IAAAA,EAAA,mBAAY;AACH,IAAAA,EAAA;AAQb,QAAI,OAAOqS,KAAa;AACpB,YAAM,IAAI,UAAU,+CAA+C;AAEvE,QAAI,OAAOC,KAAW;AAClB,YAAM,IAAI,UAAU,6CAA6C;AAErE,SAAK,WAAWD,GAChB,KAAK,SAASC,GACd,KAAK,4BAA4BE,KAAwB,OACnD,IAAI/Q,EAAiB,IAAI,EAAC,OAAAuC,GAAO,SAAS,iBAAA,CAAiB,IAC3D,MACN,KAAK,uBAAuBwO,KACrB,KAAK,2BACZ,KAAK,iBAAiB,KAAK,sBAC3B,KAAK,2BAA2B,KAAK,6BAA6B;AAAA,EACtE;AAAA,EAEA,YAAYC,GAAmE;AAC3E,IAAI,KAAK,cACT,KAAK,YAAA,GACL,KAAK,OAAO,MAAM,KAAKA,KAAQ,CAAA,CAAE,GACjC,KAAK,KAAK,QAAQ,CAACC,GAAK1P,MAAU,KAAK,QAAQ0P,GAAK1P,CAAK,CAAC,GAC1D,KAAK,cAAc2P,GAAW,KAAK,aAAa,KAAK,KAAK,MAAM,GAChE,KAAK,uBAAA,GACL,KAAK,SAAA;AAAA,EACT;AAAA,EAEQ,QAAQD,GAAkB1P,GAAqB;AACnD,UAAM4F,IAAU,CAAClG,MAA4B,KAAK,YAAYM,GAAON,CAAK,GACpEkQ,IAAY,CAAClQ,MAA+B,KAAK,cAAcM,GAAON,CAAK,GAC3EmQ,IAAc,CAACnQ,MAA4B,KAAK,gBAAgBM,GAAON,GAAOgQ,CAAG,GACjFI,IAAe,CAACpQ,MAA4B,KAAK,iBAAiBM,GAAON,CAAK;AACpF,IAAAgQ,EAAI,iBAAiB,SAAS9J,CAAO,GACrC8J,EAAI,iBAAiB,WAAWE,CAAS,GACzCF,EAAI,iBAAiB,aAAaG,CAAW,GAC7CH,EAAI,iBAAiB,cAAcI,CAAY,GAC/C,KAAK,YAAY,KAAK,MAAM;AACxB,MAAAJ,EAAI,oBAAoB,SAAS9J,CAAO,GACxC8J,EAAI,oBAAoB,WAAWE,CAAS,GAC5CF,EAAI,oBAAoB,aAAaG,CAAW,GAChDH,EAAI,oBAAoB,cAAcI,CAAY;AAAA,IACtD,CAAC;AAAA,EACL;AAAA,EAEQ,YAAY9P,GAAeN,GAAyB;;AAExD,QADAA,EAAM,eAAA,GACF,KAAK,mBAAmB;AACxB,WAAK,sBAAA;AACL;AAAA,IACJ;AACA,SAAK,cAAcM,GACnB,KAAK,YAAYA,GAAON,CAAK,IAC7BF,IAAA,KAAK,KAAKQ,CAAK,MAAf,QAAAR,EAAkB;AAAA,EACtB;AAAA,EAEQ,gBAAgBQ,GAAeN,GAAmBgQ,GAAwB;AAC9E,QAAIhQ,EAAM,WAAW,KAAK,CAAC,KAAK,wBAAyB;AACzD,SAAK,WAAW,EAAK,GACrB,KAAK,sBAAA,GACL,KAAK,iBAAiBM,GACtB,KAAK,kBAAkBN,GACvB,KAAK,YAAY;AACjB,UAAMqQ,IAAgBL,EAAI,eACpBM,IAAY,MAAY,KAAK,WAAW,KAAK,SAAS;AAC5D,IAAAD,EAAc,iBAAiB,WAAWC,CAAS,GACnD,KAAK,cAAc,MAAMD,EAAc,oBAAoB,WAAWC,CAAS;AAAA,EACnF;AAAA,EAEQ,iBAAiBhQ,GAAeN,GAAyB;;AAC7D,IAAI,KAAK,kBAAkB,SACvBM,MAAU,KAAK,kBAAkB,CAAC,KAAK,aACvCA,MAAU,KAAK,eAAe,KAAK,cACvCN,EAAM,eAAA,GACN,KAAK,YAAY,IACjB,KAAK,cAAcM,GACnB,KAAK,gBAAgB,KAAK,gBAAgBA,GAAO,KAAK,mBAAmBN,CAAK,IAC9EF,IAAA,KAAK,KAAKQ,CAAK,MAAf,QAAAR,EAAkB;AAAA,EACtB;AAAA,EAEQ,cAAcQ,GAAeN,GAA4B;;AAC7D,UAAMuQ,IAAY,KAAK,KAAK,SAAS;AACrC,QAAIC;AACJ,QAAIxQ,EAAM,QAAQ,YAAa,CAAAwQ,IAAY,KAAK,IAAIlQ,IAAQ,GAAGiQ,CAAS;AAAA,aAC/DvQ,EAAM,QAAQ,UAAW,CAAAwQ,IAAY,KAAK,IAAIlQ,IAAQ,GAAG,CAAC;AAAA,aAC1DN,EAAM,QAAQ,OAAQ,CAAAwQ,IAAY;AAAA,aAClCxQ,EAAM,QAAQ,MAAO,CAAAwQ,IAAYD;AAAA,aACjCvQ,EAAM,QAAQ,OAAOA,EAAM,QAAQ,SAAS;AACjD,MAAAA,EAAM,eAAA,GACN,KAAK,cAAcM,GACnB,KAAK,YAAYA,GAAON,CAAK;AAC7B;AAAA,IACJ,MAAO;AAEP,IAAAA,EAAM,eAAA,GACN,KAAK,cAAcwQ,GACnB,KAAK,eAAeA,GAAWxQ,CAAK,GACpC,KAAK,SAAA,IACLF,IAAA,KAAK,KAAK0Q,CAAS,MAAnB,QAAA1Q,EAAsB;AAAA,EAC1B;AAAA,EAEU,eAAeQ,GAAeN,GAA4B;AAChE,SAAK,YAAYM,GAAON,CAAK;AAAA,EACjC;AAAA,EAEU,wBAAiC;AACvC,WAAO;AAAA,EACX;AAAA,EAEU,gBACNyQ,GACAC,GACA5N,GACI;AAAA,EAAC;AAAA,EAEC,YAAY6N,GAAgB7N,GAA8B;AAAA,EAAC;AAAA,EAE3D,iBAAiBtB,GAAgBoP,IAAQ,qBAA2B;AAC1E,SAAK,qBAAqB,IAAIpP,GAAOoP,CAAK,GAC1C,KAAK,SAAA;AAAA,EACT;AAAA,EAEA,mBAA4B;AACxB,WAAO,KAAK,qBAAqB,IAAA,KAAS,CAAA;AAAA,EAC9C;AAAA,EAEA,0BAAiD;AAC7C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,yBAA+B;AACnC,UAAM/N,IAAW,KAAK,iBAAA;AACtB,QAAIA,EAAS,WAAW,EAAG;AAC3B,UAAMgO,IAAe,IAAI,IAAIhO,EAAS,IAAI,CAACnB,GAAMpB,MAAU,KAAK,OAAOoB,GAAMpB,CAAK,CAAC,CAAC,GAC9EK,IAAU,KAAK,SAAA,EAAW,OAAO,CAACe,GAAMpB,MAC1CuQ,EAAa,IAAI,KAAK,OAAOnP,GAAMpB,CAAK,CAAC,CAAC;AAC9C,KAAIK,EAAQ,WAAWkC,EAAS,UACzBlC,EAAQ,KAAK,CAACe,GAAMpB,MAAU,CAAC,OAAO,GAAGoB,GAAMmB,EAASvC,CAAK,CAAC,CAAC,MAClE,KAAK,qBAAqB,IAAI,CAAC,GAAGK,CAAO,GAAG,gCAAgC;AAAA,EAEpF;AAAA,EAEQ,WAAiB;AACrB,UAAMkQ,IAAe,IAAI,IAAI,KAAK,mBAAmB,IAAI,CAACnP,GAAMpB,MAC5D,KAAK,OAAOoB,GAAMpB,CAAK,CAAC,CAAC,GACvBkB,IAAQ,KAAK,SAAA;AACnB,SAAK,KAAK,QAAQ,CAACwO,GAAK1P,MAAU;AAC9B,YAAMoB,IAAOF,EAAMlB,CAAK,GAClBuC,IAAWnB,MAAS,UACnBmP,EAAa,IAAI,KAAK,OAAOnP,GAAMpB,CAAK,CAAC;AAChD,MAAA0P,EAAI,UAAU,OAAO,YAAYnN,CAAQ,GACzCmN,EAAI,aAAa,iBAAiB,OAAOnN,CAAQ,CAAC,GAClDmN,EAAI,WAAW1P,MAAU,KAAK,cAAc,IAAI;AAAA,IACpD,CAAC;AAAA,EACL;AAAA,EAEQ,cAAoB;AACxB,eAAWwQ,KAAW,KAAK,YAAY,OAAO,CAAC,EAAG,CAAAA,EAAA;AAClD,SAAK,OAAO,CAAA;AAAA,EAChB;AAAA,EAEQ,WAAWC,GAA8B;;AAM7C,KALAjR,IAAA,KAAK,gBAAL,QAAAA,EAAA,YACA,KAAK,cAAc,MACnB,KAAK,iBAAiB,MACtB,KAAK,kBAAkB,MACvB,KAAK,YAAY,IACZiR,MACL,KAAK,oBAAoB,IACrB,KAAK,sBAAsB,QAAM,aAAa,KAAK,kBAAkB,GACzE,KAAK,qBAAqB,WAAW,MAAM,KAAK,sBAAA,GAAyB,CAAC;AAAA,EAC9E;AAAA,EAEQ,wBAA8B;AAClC,SAAK,oBAAoB,IACrB,KAAK,sBAAsB,QAAM,aAAa,KAAK,kBAAkB,GACzE,KAAK,qBAAqB;AAAA,EAC9B;AAAA,EAEA,UAAgB;;AACZ,IAAI,KAAK,cACT,KAAK,YAAY,IACjB,KAAK,WAAW,EAAK,GACrB,KAAK,sBAAA,GACL,KAAK,YAAA,IACLjR,IAAA,KAAK,8BAAL,QAAAA,EAAgC;AAAA,EACpC;AACJ;AAEO,MAAMkR,WAAgDtB,GAA4B;AAAA,EAKrF,YAAYuB,GAA6C;AACrD,UAAMC,IAAQD,EAAO,uBAAuB,OACtC,IAAIlS,EAAsB,MAAM;AAAA,MAC9B,OAAOkS,EAAO;AAAA,MACd,SAAS;AAAA,IAAA,CACZ,IACC,MACAE,IAAsBF,EAAO,uBAAuBC;AAC1D,UAAM;AAAA,MACF,UAAUD,EAAO;AAAA,MACjB,GAAIA,EAAO,UAAU,OAAO,CAAA,IAAK,EAAC,QAAQA,EAAO,OAAA;AAAA,MACjD,GAAIA,EAAO,UAAU,SAAY,CAAA,IAAK,EAAC,OAAOA,EAAO,MAAA;AAAA,MACrD,sBAAsB,IAAIG,GAAyBD,CAAmB;AAAA,IAAA,CACzE;AAjBI,IAAA7T,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AAgBb,SAAK,2BAA2B4T,GAChC,KAAK,sBAAsBC,GAC3B,KAAK,gBAAgBA;AAAA,EACzB;AAAA,EAEU,YAAY7Q,GAAqB;AACvC,UAAMoB,IAAO,KAAK,SAAA,EAAWpB,CAAK;AAClC,IAAIoB,MAAS,WACb,KAAK,cAAcpB,GACnB,KAAK,iBAAiB,IACtB,KAAK,iBAAiB,CAACoB,CAAI,GAAG,0BAA0B;AAAA,EAC5D;AAAA,EAEA,kBAAgC;AAC5B,WAAO,KAAK,oBAAoB,IAAA;AAAA,EACpC;AAAA,EAES,UAAgB;;AACrB,UAAM,QAAA,IACN5B,IAAA,KAAK,6BAAL,QAAAA,EAA+B;AAAA,EACnC;AACJ;AAEO,MAAMuR,WAA+C3B,GAA4B;AAAA,EAC1E,YAAYpP,GAAeN,GAA6B;AAC9D,UAAMwB,IAAQ,KAAK,SAAA,GACbE,IAAOF,EAAMlB,CAAK;AACxB,QAAIoB,MAAS,QAEb;AAAA,UAAI1B,EAAM,YAAY,KAAK,eAAe,MAAM;AAC5C,cAAMsR,IAAQ,KAAK,IAAI,KAAK,aAAahR,CAAK,GACxCqG,IAAO,KAAK,IAAI,KAAK,aAAarG,CAAK,GACvCiR,IAAS/P,EAAM,KAAK,WAAW,GAC/BqB,IAAW0O,MAAW,UAAa,KAAK,kBAAkB,OAC1DC,GAAgB,KAAK,iBAAA,GAAoBD,GAAQ,KAAK,aAAa,KAAK,MAAM,IAC9E,KAAK,mBAAmB,IACxB3Q,IAAO6Q;AAAA,UACTjQ;AAAA,UACA,KAAK,iBAAA;AAAA,UACL8P;AAAA,UACA3K;AAAA,UACA9D;AAAA,UACA,KAAK;AAAA,QAAA;AAET,aAAK,iBAAiBjC,GAAM,yBAAyB;AACrD;AAAA,MACJ;AAEA,UAAI8Q,GAAiB1R,CAAK,KAAM,SAASA,KAASA,EAAM,QAAQ,KAAM;AAClE,cAAM6C,IAAW,KAAK,iBAAA,GAChB8O,IAAM,KAAK,OAAOjQ,GAAMpB,CAAK,GAC7BsR,IAAS/O,EAAS,KAAK,CAACgP,GAAWC,MACrC,OAAO,GAAG,KAAK,OAAOD,GAAWC,CAAc,GAAGH,CAAG,CAAC,GACpD/Q,IAAOgR,IACP/O,EAAS,OAAO,CAACgP,GAAWC,MAC1B,CAAC,OAAO,GAAG,KAAK,OAAOD,GAAWC,CAAc,GAAGH,CAAG,CAAC,IACzD,CAAC,GAAG9O,GAAUnB,CAAI;AACxB,aAAK,cAAcpB,GACnB,KAAK,iBAAiB,CAACsR,GACvB,KAAK,iBAAiBhR,GAAM,yBAAyB;AACrD;AAAA,MACJ;AAEA,WAAK,cAAcN,GACnB,KAAK,iBAAiB,IACtB,KAAK,iBAAiB,CAACoB,CAAI,GAAG,yBAAyB;AAAA;AAAA,EAC3D;AAAA,EAEU,eAAepB,GAAeN,GAA4B;AAChE,IAAIA,EAAM,YAAU,KAAK,YAAYM,GAAON,CAAK;AAAA,EACrD;AAAA,EAEU,wBAAiC;AACvC,WAAO;AAAA,EACX;AAAA,EAEU,gBACN+R,GACAC,GACAhS,GACI;AACJ,UAAMwB,IAAQ,KAAK,SAAA,GACb8P,IAAQ,KAAK,IAAIS,GAAYC,CAAQ,GACrCrL,IAAO,KAAK,IAAIoL,GAAYC,CAAQ,GACpCC,IAAQzQ,EAAM,MAAM8P,GAAO3K,IAAO,CAAC,GACnC/F,IAAO8Q,GAAiB1R,CAAK,IAC7BkS,GAAW,KAAK,iBAAA,GAAoBD,GAAO,KAAK,MAAM,IACtD,CAAC,GAAGA,CAAK;AACf,SAAK,cAAcF,GACnB,KAAK,iBAAiB,IACtB,KAAK,iBAAiBnR,GAAM,wBAAwB;AAAA,EACxD;AACJ;AAQO,SAASuR,GACZlB,GAC2B;AAC3B,SAAOA,EAAO,cACR,IAAII,GAAsBJ,CAAM,IAChC,IAAID,GAAuBC,CAAM;AAC3C;AAEA,MAAMG,GAAiE;AAAA,EACnE,YAA6BgB,GAAoC;AAApC,SAAA,SAAAA;AAAA,EAAqC;AAAA,EAElE,MAAe;AACX,UAAMjU,IAAQ,KAAK,OAAO,IAAA;AAC1B,WAAOA,KAAS,OAAO,CAAA,IAAK,CAACA,CAAK;AAAA,EACtC;AAAA,EAEA,WAAoB;AAChB,WAAO,KAAK,OAAO,SAAA;AAAA,EACvB;AAAA,EAEA,gBAAyE;AACrE,WAAO,KAAK,OAAO,cAAA;AAAA,EACvB;AAAA,EAEA,IAAIA,GAAgBkU,GAAiC;AACjD,WAAO,KAAK,OAAO,IAAIlU,EAAM,CAAC,KAAK,MAAMkU,CAAY;AAAA,EACzD;AAAA,EAEA,UACInQ,GACApD,GACU;AACV,WAAO,KAAK,OAAO,UAAU,CAACwT,MAAiBpQ,EAAS;AAAA,MACpD,GAAGoQ;AAAA,MACH,OAAOA,EAAa,SAAS,OAAO,CAAA,IAAK,CAACA,EAAa,KAAK;AAAA,IAAA,CAC/D,GAAGxT,CAAO;AAAA,EACf;AACJ;AAEO,SAAS+Q,GAAsBnO,GAAapB,GAAwB;AACvE,MAAIoB,KAAQ,QAAQ,OAAOA,KAAS,UAAU;AAC1C,UAAMZ,IAAK,QAAQ,IAAIY,GAAM,IAAI;AACjC,QAAIZ,KAAM,KAAM,QAAOA;AAAA,EAC3B;AACA,MAAI,OAAOY,KAAS,YAAY,OAAOA,KAAS,SAAU,QAAOA;AACjE,QAAM,IAAI;AAAA,IACN,2BAA2BpB,CAAK;AAAA,EAAA;AAExC;AAEA,SAASoR,GAAiB1R,GAA4C;AAClE,SAAO,GAAQA,EAAM,WAAWA,EAAM;AAC1C;AAEA,SAASiQ,GAAW3P,GAAeiS,GAAwB;AACvD,SAAIA,KAAU,IAAU,IACjB,KAAK,IAAI,KAAK,IAAIjS,GAAO,CAAC,GAAGiS,IAAS,CAAC;AAClD;AAEA,SAASL,GACLtM,GACAC,GACA+J,GACO;AACP,QAAM4C,IAAS,CAAC,GAAG5M,CAAI,GACjB6M,IAAO,IAAI,IAAI7M,EAAK,IAAI,CAAClE,GAAMpB,MAAUsP,EAAOlO,GAAMpB,CAAK,CAAC,CAAC;AACnE,aAAWoB,KAAQmE,GAAO;AACtB,UAAM8L,IAAM/B,EAAOlO,GAAM8Q,EAAO,MAAM;AACtC,IAAKC,EAAK,IAAId,CAAG,MACbc,EAAK,IAAId,CAAG,GACZa,EAAO,KAAK9Q,CAAI;AAAA,EAExB;AACA,SAAO8Q;AACX;AAEA,SAAShB,GACL3O,GACAnB,GACApB,GACAsP,GACO;AACP,QAAM+B,IAAM/B,EAAOlO,GAAMpB,CAAK;AAC9B,SAAOuC,EAAS,KAAK,CAACgP,GAAWC,MAC7B,OAAO,GAAGlC,EAAOiC,GAAWC,CAAc,GAAGH,CAAG,CAAC;AACzD;AAEA,SAASF,GACLjQ,GACAqB,GACAyO,GACA3K,GACA+L,GACA9C,GACO;AACP,QAAM+C,IAAY,IAAI,IAAInR,EACrB,MAAM8P,GAAO3K,IAAO,CAAC,EACrB,IAAI,CAACjF,GAAMpB,MAAUsP,EAAOlO,GAAM4P,IAAQhR,CAAK,CAAC,CAAC,GAChDuQ,IAAe,IAAI,IAAIhO,EAAS,IAAI,CAACnB,GAAMpB,MAAUsP,EAAOlO,GAAMpB,CAAK,CAAC,CAAC;AAC/E,aAAWqR,KAAOgB;AACd,IAAID,IAAc7B,EAAa,IAAIc,CAAG,IACjCd,EAAa,OAAOc,CAAG;AAEhC,SAAOnQ,EAAM,OAAO,CAACE,GAAMpB,MAAUuQ,EAAa,IAAIjB,EAAOlO,GAAMpB,CAAK,CAAC,CAAC;AAC9E;AC1bO,MAAMsS,WAAkCvV,EAAgC;AAAA,EAY3E,YAAYG,IAA8B,IAAI;AAC1C,UAAMA,CAAK;AAXN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AAIb,IAAIuV,GAAgDrV,EAAM,KAAK,KAC3D,KAAK,eAAeA,EAAM,OAC1B,KAAK,oBAAoB,SAEzB,KAAK,oBAAoB,IAAIuB,EAA0BvB,EAAM,SAAS,CAAA,GAAI;AAAA,MACtE,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,eAAe,KAAK,oBAE7B,KAAK,SAAS,KAAK,cACnB,KAAK,aAAasV,GAAmBtV,EAAM,OAAO,GAClD,KAAK,mBAAmBA,EAAM,gBAAgB,KACxC2U,GAAuB;AAAA,MACrB,OAAO;AAAA,MACP,aAAa;AAAA,MACb,GAAI3U,EAAM,wBAAwB,OAC5B,CAAA,IACA,EAAC,sBAAsBA,EAAM,qBAAA;AAAA,MACnC,UAAU,MAAM,KAAK,aAAa,IAAA,KAAS,CAAA;AAAA,MAC3C,QAAQ,KAAK;AAAA,IAAA,CAChB,IACC2U,GAAuB;AAAA,MACrB,OAAO;AAAA,MACP,GAAI3U,EAAM,uBAAuB,OAC3B,CAAA,IACA,EAAC,qBAAqBA,EAAM,oBAAA;AAAA,MAClC,UAAU,MAAM,KAAK,aAAa,IAAA,KAAS,CAAA;AAAA,MAC3C,QAAQ,KAAK;AAAA,IAAA,CAChB,GACL,KAAK,uBAAuB,KAAK,iBAAiB,sBAClD,KAAK,iBAAiB,KAAK,sBAC3B,KAAK,sBAAsB,KAAK,4BAA4BwT,KACtD,KAAK,iBAAiB,sBACtB,MACN,KAAK,gBAAgB,KAAK;AAAA,EAC9B;AAAA,EAES,SAASxO,GAAuC;AACrD,QAAI,KAAK,qBAAqB,MAAM;AAChC,UAAIqQ,GAAkBrQ,EAAU,KAAK;AACjC,cAAM,IAAI;AAAA,UACN;AAAA,QAAA;AAGR,WAAK,kBAAkB,IAAIA,EAAU,SAAS,CAAA,GAAI,oBAAoB;AAAA,IAC1E;AACA,WAAO,MAAM,SAASA,CAAS;AAAA,EACnC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,cAAc,KAAK,oBAAoB;AAAA,EAC3D;AAAA,EAEA,SAA2B;AACvB,UAAMgQ,IAAS,KAAK,aAAa,IAAA;AACjC,QAAIA,MAAW,UAAa,CAAC,MAAM,QAAQA,CAAM;AAC7C,YAAM,IAAI,UAAU,iCAAiC;AAEzD,UAAMzC,IAAOyC,KAAU,CAAA,GACjBO,IAAS,KAAK,aAAa,cAAA,GAC3BhK,IAAQ,KAAK,aAAa,SAAA,GAC1BiK,IAAYD,MAAWE,EAAW,WAAWF,MAAWE,EAAW,SACnEC,IAAkBH,MAAWE,EAAW,WACtCF,MAAWE,EAAW,WAAWT,MAAW,QAC9C3B,IAAe,IAAI,IAAI,KAAK,qBAAqB,MAClD,IAAI,CAACnP,GAAMpB,MAAU,KAAK,WAAWoB,GAAMpB,CAAK,CAAC,CAAC,GAEjDF,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,aAAW6T,IAAY,SAAS;AAAA,QAE/B,UAAA;AAAA,UAAAD,MAAWE,EAAW,QACjB,gBAAA5S;AAAA,YAACwI;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAAE;AAAA,cACA,UAAU,KAAK,mBAAmB,mBAAmB;AAAA,YAAA;AAAA,UAAA,IAEvD;AAAA,UACLmK,IACK,gBAAAvQ,EAAAvB,IAAA,EACE,UAAA;AAAA,YAAA,gBAAAf,EAAC,OAAE,MAAK,UAAU,UAAA,KAAK,mBAAmB,iBAAiB,GAAE;AAAA,YAC7D,gBAAAA,EAAC,MAAA,EAAG,eAAY,QACX,UAAA,MAAM,KAAK,EAAC,QAAQ,KAAK,MAAM,oBAAoB,EAAA,GAAI,CAAC8S,GAAG7S,MACxD,gBAAAD,EAAC,MAAA,EACG,UAAA,gBAAAA,EAACwN,GAAA,EAAY,OAAO,KAAKvN,IAAQ,EAAA,CAAG,EAAA,GAD/B,eAAeA,CAAK,EAE7B,CAAK,EAAA,CACb;AAAA,UAAA,EAAA,CACJ,IACE;AAAA,UACLyS,MAAWE,EAAW,SAASlD,EAAK,WAAW,IAC1C,gBAAA1P,EAAC,KAAA,EAAE,MAAK,UAAU,UAAA,KAAK,mBAAmB,eAAe,GAAE,IAC3D;AAAA,UACL,CAAC6S,KAAmBnD,EAAK,SAAS,IAC7B,gBAAA1P;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAY,KAAK,MAAM,SAAS,KAAK,mBAAmB,eAAe;AAAA,cACvE,aAAW2S,IAAY,SAAS;AAAA,cAChC,wBAAsB,KAAK,MAAM,cAAc,SAAS;AAAA,cAC1D,UAAAjD,EAAK,IAAI,CAACrO,GAAMpB,MAAU;AACxB,sBAAMqR,IAAM,KAAK,WAAWjQ,GAAMpB,CAAK,GACjCuC,IAAWgO,EAAa,IAAIc,CAAG,GAC/B5P,IAAU,KAAK,MAAM,aACrB,KAAK,MAAM,WAAWL,GAAMpB,CAAK,IACjC8S,GAAiB1R,CAAI;AAC3B,uBAAO,gBAAArB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEJ,MAAK;AAAA,oBACL,2BAAwB;AAAA,oBACxB,iBAAe,OAAOwC,CAAQ;AAAA,oBAC9B,UAAUvC,MAAU,IAAI,IAAI;AAAA,oBAC9B,UAAAyB;AAAA,kBAAA;AAAA,kBALO,OAAO4P,CAAG;AAAA,gBAAA;AAAA,cAMvB,CAAC;AAAA,YAAA;AAAA,UAAA,IACC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEd;AAAA,EAEA,YAAY0B,GAA6B;AACrC,UAAMtD,IAAOsD,aAAe,UACtBA,EAAI,iBAA8B,2BAA2B,IAC7D,CAAA;AACN,SAAK,iBAAiB,YAAYtD,CAAI;AAAA,EAC1C;AAAA,EAEA,mBAA4B;AACxB,WAAO,KAAK,iBAAiB,iBAAA;AAAA,EACjC;AAAA,EAEA,0BAAiD;AAC7C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,kBAAgC;;AAC5B,aAAOjQ,IAAA,KAAK,wBAAL,gBAAAA,EAA0B,UAAS;AAAA,EAC9C;AAAA,EAEA,yBAA4D;AACxD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,YAAkB;;AACd,SAAK,iBAAiB,QAAA,IACtBA,IAAA,KAAK,sBAAL,QAAAA,EAAwB;AAAA,EAC5B;AAiFJ;AA9OIxC,EADSsV,IACO,aAA+B,CAAA,IA+J/CtV,EAhKSsV,IAgKF,gBAAe,CAAC/E,GAAahF,CAAY,IAEhDvL,EAlKSsV,IAkKO,YAAW,aAC3BtV,EAnKSsV,IAmKO,eAAc,SAE9BtV,EArKSsV,IAqKO,OAAM/R;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4E1B,SAASiS,GACLQ,GACoB;AACpB,MAAIA,KAAW,KAAM,QAAOzD;AAC5B,MAAI,OAAOyD,KAAY,WAAY,QAAOA;AAC1C,MAAI,OAAOA,KAAY,YAAYA,EAAQ,SAAS;AAChD,WAAO,CAAC5R,GAAMpB,MAAU;AACpB,UAAIoB,KAAQ,QAAS,OAAOA,KAAS,YAAY,OAAOA,KAAS;AAC7D,cAAM,IAAI,UAAU,0BAA0BpB,CAAK,UAAUgT,CAAO,EAAE;AAE1E,YAAM3B,IAAM,QAAQ,IAAIjQ,GAAM4R,CAAO;AACrC,UAAI3B,KAAO;AACP,cAAM,IAAI,UAAU,0BAA0BrR,CAAK,UAAUgT,CAAO,EAAE;AAE1E,aAAO3B;AAAA,IACX;AAEJ,QAAM,IAAI,UAAU,sDAAsD;AAC9E;AAEA,SAASkB,GAA0B1U,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAASiV,GAAiB1R,GAAiC;AACvD,MAAIA,KAAQ,SAAS,OAAOA,KAAS,YAAY,OAAOA,KAAS,aAAa;AAC1E,UAAMzB,IAAQ,QAAQ,IAAIyB,GAAM,OAAO;AACvC,QAAI6R,GAAsBtT,CAAK,EAAG,QAAOA;AAAA,EAC7C;AACA,SAAO,OAAOyB,CAAI;AACtB;AAEA,SAAS6R,GAAsBpV,GAA6D;AACxF,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAY,OAAOA,KAAU;AAC1E;AC3TO,MAAeqV,WAEZnW,EAAkB;AAiH5B;AAhHIC,EAHkBkW,IAGF,OAAM3S;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACc1B,MAAM4S,KAAoB,CAAC,YAAY,YAAY,QAAQ,OAAO;AAmB3D,MAAMC,UACDF,GAAwC;AAAA,EAehD,YAAYhW,IAA+B,IAAI;AAC3C,UAAMA,CAAK;AAPN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUgB,EAAU,YAAYd,EAAM,EAAE,GAC7C,KAAK,UAAU,GAAG,KAAK,OAAO;AAC9B,UAAMmW,IAAgB,KAAK;AAG3B,SAAK,UAAUnW,EAAM,WACdmW,EAAc,SACrBC,GAAgB,KAAK,OAAO;AAC5B,UAAMnW,IAAWD,EAAM,wBAChBmW,EAAc,wBACd,KAAK,QAAQ,CAAC,EAAG,CAAC,GACnB9T,IAAsC,EAAC,GAAGrC,EAAA;AAChD,IAAIqC,EAAa,gBAAgB,QAAQrC,EAAM,wBAAwB,SACnEqC,EAAa,eAAerC,EAAM,uBAEtC,KAAK,eAAeiB;AAAA,MAA2B;AAAA,MAAMoB;AAAA,MAAcpC;AAAA,MAC/D;AAAA,IAAA,GAEJ,KAAK,uBAAuB,KAAK;AAAA,EACrC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,WAAWK,IAAY,GAAGkC,IAAsB,MAAY;AACxD,QAAI,KAAK,MAAM,SAAU;AACzB,UAAM6T,IAAe,KAAK,QAAQ,UAAU,CAAC,CAAA,EAAG3F,CAAK,MACjD,OAAO,GAAGA,GAAO,KAAK,aAAa,IAAA,CAAK,CAAC,GAEvCsC,MADYqD,IAAe,IAAI,IAAIA,KACV/V,IAAY,KAAK,QAAQ,UAAU,KAAK,QAAQ,QACzEgW,IAAY,KAAK,QAAQtD,CAAS,EAAG,CAAC;AAC5C,SAAK,aAAa,IAAIsD,GAAW,wBAAwB,GACzDzU,EAAO,KAAK,MAAM,UAAUyU,GAAW9T,CAAK;AAAA,EAChD;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,OAAAC,IAAQ,KAAK,MAAM,SAAS,KAAK,mBAAmB,qBAAqB;AAAA,MACzE,WAAA+J;AAAA,MACA,UAAApH,IAAW;AAAA,MACX,UAAA+G,IAAW;AAAA,MACX,MAAAM,IAAO;AAAA,MACP,OAAAlB,IAAQ;AAAA,IAAA,IACR,KAAK,OACHgL,IAAgB,KAAK,aAAa,IAAA,GAClCC,IAAgB,KAAK,QAAQ,UAAU,CAAC,CAAA,EAAG9F,CAAK,MAClD,OAAO,GAAGA,GAAO6F,CAAa,CAAC,GAC7B,CAACE,CAAM,IAAI,KAAK,QAAQD,CAAa,KAAK,CAAC,KAAKD,CAAa,GAG7DG,IAAcD,MAAW,MAAM,OAAOA,GACtCE,IAAY1U,GAAcsU,CAAa,GACvCK,IAAqB,KAAK,mBAAmBL,GAAeI,CAAS,GACrEE,IAAYrK,KAAasK,GAAgBrU,CAAK,GAC9CsU,IAAUC,GAAuB,KAAK,SAAST,CAAa,GAE5D3T,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,cAAYgV;AAAA,QAEZ,UAAA;AAAA,UAAA,gBAAAxR,EAAC,SAAA,EACG,UAAA;AAAA,YAAA,gBAAAtC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACG,IAAI,KAAK;AAAA,gBACT,MAAK;AAAA,gBACL,SAAAkU;AAAA,gBACA,UAAA3R;AAAA,gBACA,UAAA+G;AAAA,gBACA,MAAM,KAAK,MAAM;AAAA,gBACjB,OAAO,OAAOoK,CAAa;AAAA,gBAC3B,aAAW9J,IAAO,SAAS;AAAA,gBAC3B,cAAYoK,KAAa,OACnB,OACA,KAAK,mBAAmB,oBAAoB,EAAEA,GAAWD,CAAkB;AAAA,gBACjF,gBAAcrL,KAAS,OAAO,OAAO;AAAA,gBACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,gBAC9C,UAAU,CAAC/I,MAAiB;AACxB,uBAAK,WAAW,GAAGA,CAAK,GAKtBA,EAAM,cAAmC,UAAUwU;AAAA,oBACjD,KAAK;AAAA,oBACL,KAAK,aAAa,IAAA;AAAA,kBAAI;AAAA,gBAE9B;AAAA,gBACA,WAAW,CAACxU,MAAyB;AACjC,kBAAIA,EAAM,QAAQ,gBAAgBA,EAAM,QAAQ,eAC5CA,EAAM,eAAA,GACN,KAAK,WAAW,GAAGA,CAAK,MACjBA,EAAM,QAAQ,eAAeA,EAAM,QAAQ,eAClDA,EAAM,eAAA,GACN,KAAK,WAAW,IAAIA,CAAK;AAAA,gBAEjC;AAAA,cAAA;AAAA,YAAA;AAAA,YAEJ,gBAAAK,EAAC,kBAAA,EAAe,eAAY,QAAQ,UAAA6T,GAAY;AAAA,YAC/CjU;AAAA,UAAA,GACL;AAAA,UACC8I,KAAS,OAAO,OAAO,gBAAA1I,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAAE,EAAA,CAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAE9E;AAAA,EAkBQ,mBAAmBgL,GAAuBtW,GAA0B;AACxE,WAAIsW,MAAkB9V,EAAW,OAAa,KAAK,mBAAmB,qBAAqB,IACvF8V,MAAkB9V,EAAW,UAAgB,KAAK,mBAAmB,wBAAwB,IAC7F8V,MAAkB9V,EAAW,SAAe,KAAK,mBAAmB,uBAAuB,IAC3F8V,MAAkB9V,EAAW,UAAgB,KAAK,mBAAmB,wBAAwB,IAC1FR;AAAA,EACX;AAEJ;AAjJIH,EAFSoW,GAEO,aAAYD,KAC5BnW,EAHSoW,GAGO,gBAAe,CAAC7K,CAAY,IAC5CvL,EAJSoW,GAIF,WAAsD;AAAA,EACzD,CAAC,KAAKzV,EAAW,OAAO;AAAA,EACxB,CAAC,KAAKA,EAAW,MAAM;AAAA,IAE3BX,EARSoW,GAQF,wBAAuBzV,EAAW,UAmHzCX,EA3HSoW,GA2HO,YAAW,cAE3BpW,EA7HSoW,GA6HO,OAAM7S;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwB1B,SAASyT,GAAgBrU,GAAwC;AAC7D,SAAO,OAAOA,KAAU,YAAY,OAAOA,KAAU,WAC/C,OAAOA,CAAK,IACZ;AACV;AAEA,SAAS2T,GACLa,GACoD;AACpD,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,UAAM,IAAI,UAAU,kDAAkD;AAE1E,aAAWC,KAASD;AAChB,QAAI,CAAC,MAAM,QAAQC,CAAK,KAAKA,EAAM,SAAS;AACxC,YAAM,IAAI,UAAU,iDAAiD;AAGjF;AAEA,SAASF,GACLC,GACAV,GACO;AACP,QAAMC,IAAgBS,EAAQ,UAAU,CAAC,CAAA,EAAGvG,CAAK,MAAM,OAAO,GAAGA,GAAO6F,CAAa,CAAC;AACtF,SAAOA,MAAkB9V,EAAW,UAC7B8V,MAAkB9V,EAAW,WAC5BwW,EAAQ,WAAW,KAAKT,MAAkB;AACtD;ACnLO,MAAMW,UAAoBtX,EAA4B;AAAA,EAMzD,YAAYG,IAA0B,IAAI;AACtC,UAAMA,CAAK;AALN,IAAAF,EAAA;AACQ,IAAAA,EAAA,iDAA0B,IAAA;AACnC,IAAAA,EAAA,+CAAwB,IAAA;AAI5B,SAAK,iBAAiBsX,GAA6BpX,EAAM,OAAO,IAAIA,EAAM,UAAU;AAAA,EACxF;AAAA,EAEA,aAAmB;AACf,IAAI,KAAK,kBAAgB,KAAK,MAAM,KAAK,cAAc;AAAA,EAC3D;AAAA,EAEA,SAA2B;;AACvB,UAAM0B,MAASY,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,WAC5B,MAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,KAAK,MAAM,UAAU,CAAA;AACjE,QAAI,CAAC,MAAM,QAAQZ,CAAM;AACrB,YAAM,IAAI,UAAU,2DAA2D;AAEnF,UAAM2V,MAAazJ,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,oBAAmB6H,EAAW,OAChElK,KAAQwC,IAAA,KAAK,mBAAL,gBAAAA,EAAqB,YAC7BuJ,IAAUC,GAAiB,KAAK,MAAM,OAAO,GAC7CC,IAAc,KAAK,MAAM,eAAetB,EAAS,SACjDuB,IAAuB,KAAK,MAAM,wBAAwBhX,EAAW,SACrEiX,IAAe,IAAI,IAAIhW,EAAO,IAAIiW,EAAW,CAAC;AACpD,SAAK,oBAAoB,IAAI;AAAA,MACzB,CAAC,GAAG,KAAK,oBAAoB,MAAM,EAAE,OAAO,CAAChX,MAAU,CAAC+W,EAAa,IAAI/W,CAAK,CAAC;AAAA,IAAA;AAEnF,UAAMiC,IAAO,KAAK,MAEZ4S,IAAY6B,MAAe5B,EAAW,WAAW4B,MAAe5B,EAAW,SAC3EmC,IAAYjW,EAAe,KAAK,KAAK,KAAK;AAChD,WAAI0V,MAAe5B,EAAW,SAAS/T,EAAO,WAAW,IAC9C,gBAAAmB,EAACD,GAAA,EAAK,WAAWgV,GACpB,UAAA,gBAAA/U;AAAA,MAACwI;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,OAAAE;AAAA,QACA,UAAU,KAAK,mBAAmB,sBAAsB;AAAA,MAAA;AAAA,IAAA,GAEhE,IAEAiK,KAAa9T,EAAO,WAAW,IACxB,gBAAAmB,EAACD,GAAA,EAAK,WAAWgV,GAAW,aAAU,QACzC,UAAA,gBAAA/U,EAAC,KAAA,EAAE,MAAK,UAAU,UAAA,KAAK,mBAAmB,oBAAoB,GAAE,GACpE,IAGG,gBAAAsC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,WAAWgV;AAAA,QACX,MAAK;AAAA,QACL,cAAY,KAAK,MAAM,SAAS,KAAK,mBAAmB,kBAAkB;AAAA,QAC1E,aAAWpC,IAAY,SAAS;AAAA,QAE/B,UAAA;AAAA,UAAA6B,MAAe5B,EAAW,QACrB,gBAAA5S;AAAA,YAACwI;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAAE;AAAA,cACA,UAAU,KAAK,mBAAmB,sBAAsB;AAAA,YAAA;AAAA,UAAA,IAE1D;AAAA,UACLiK,sBAAa,KAAA,EAAE,MAAK,UAAU,UAAA,KAAK,mBAAmB,oBAAoB,EAAA,CAAE,IAAO;AAAA,UACnF9T,EAAO,WAAW,IACb,gBAAAmB,EAAC,KAAA,EAAG,UAAA,KAAK,mBAAmB,kBAAkB,EAAA,CAAE,IAChDnB,EAAO,IAAI,CAACsP,MAAW;AACrB,kBAAMrQ,IAAQgX,GAAY3G,CAAM,GAC1BvO,IAAQoV,GAAY7G,CAAM,GAC1BN,IAAQ4G,EAAQ,IAAI3W,CAAK,KAAK8W,GAC9B1T,IAAe,KAAK,cAAcpD,GAAO+P,CAAK;AACpD,mBAAO,gBAAA7N;AAAA,cAACiV;AAAA,cAAA;AAAA,gBAEJ,OAAArV;AAAA,gBACA,cAAAsB;AAAA,gBACA,SAASyT;AAAA,gBACT,UAAU,CAACO,GAAWvV,MAAU;;AAC5B,kBAAAA,KAAA,QAAAA,EAAO;AACP,wBAAMY,IAAOmU,GAAiB,KAAK,MAAM,OAAO;AAChD,kBAAIQ,MAActX,EAAW,UAAS2C,EAAK,OAAOzC,CAAK,IAClDyC,EAAK,IAAIzC,GAAOoX,CAAS,IAC9BnK,MAAAtL,IAAA,KAAK,OAAM,aAAX,QAAAsL,GAAA,KAAAtL,GAAsBc,GAAMZ;AAAA,gBAChC;AAAA,cAAA;AAAA,cAVKmP,GAAUhR,CAAK;AAAA,YAAA;AAAA,UAY5B,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,YAAYqX,GAA8B;;AACtC,eAAWrX,KAAS,KAAK;AACrB,OAAA2B,IAAA,KAAK,oBAAoB,IAAI3B,CAAK,MAAlC,QAAA2B,EAAqC,WACrC,KAAK,oBAAoB,OAAO3B,CAAK;AAEzC,SAAK,kBAAkB,MAAA;AAAA,EAC3B;AAAA,EAEA,YAAkB;AACd,eAAWsX,KAAW,KAAK,oBAAoB,OAAA,KAAkB,QAAA;AACjE,SAAK,oBAAoB,MAAA;AAAA,EAC7B;AAAA,EAEQ,cACJtX,GACA+P,GACwB;AACxB,UAAMwH,IAAW,KAAK,oBAAoB,IAAIvX,CAAK;AACnD,QAAIuX,KAAY;AACZ,aAAIA,EAAS,UAAUxH,KAAOwH,EAAS,IAAIxH,GAAO,4BAA4B,GACvEwH;AAEX,UAAMD,IAAU,IAAI1W,EAAQmP,GAAO,EAAC,OAAO,MAAM,SAAS,iBAAiB,OAAO/P,CAAK,CAAC,IAAG;AAC3F,gBAAK,oBAAoB,IAAIA,GAAOsX,CAAO,GACpCA;AAAA,EACX;AAiDJ;AAhKInY,EADSqX,GACO,aAA+B,CAAA,IAiH/CrX,EAlHSqX,GAkHF,gBAAe,CAACjB,GAAU7K,CAAY,IAE7CvL,EApHSqX,GAoHO,YAAW,iBAE3BrX,EAtHSqX,GAsHF,OAAM9T;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CjB,MAAMyU,KAAqB5B;AAI3B,SAASqB,GACLD,GACiC;AACjC,MAAIA,KAAW,KAAM,QAAO,oBAAI,IAAA;AAChC,MAAIA,aAAmB,IAAK,QAAO,IAAI,IAAIA,CAAO;AAClD,MAAI,MAAM,QAAQA,CAAO,EAAG,QAAO,IAAI,IAAIA,CAAO;AAClD,QAAM,IAAI,UAAU,kDAAkD;AAC1E;AAEA,SAASK,GAAY3G,GAAwC;AACzD,MAAI,OAAOA,KAAW,YAAY,OAAOA,KAAW,SAAU,QAAOA;AACrE,MAAIA,KAAU,QAAQ,OAAOA,KAAW,UAAU;AAC9C,UAAMrQ,IAAQ,QAAQ,IAAIqQ,GAAQ,OAAO;AACzC,QAAI,OAAOrQ,KAAU,YAAY,OAAOA,KAAU,SAAU,QAAOA;AAAA,EACvE;AACA,QAAM,IAAI,UAAU,iEAAiE;AACzF;AAEA,SAASkX,GAAY7G,GAA6C;AAC9D,MAAIA,KAAU,QAAQ,OAAOA,KAAW,UAAU;AAC9C,UAAMvO,IAAQ,QAAQ,IAAIuO,GAAQ,OAAO;AACzC,QAAIvO,KAAS,KAAM,QAAO0V,GAAmB1V,CAAK,IAAIA,IAAQ,OAAOA,CAAK;AAAA,EAC9E;AACA,SAAO,OAAOkV,GAAY3G,CAAM,CAAC;AACrC;AAEA,SAASW,GAAUhR,GAA4B;AAC3C,SAAO,GAAG,OAAOA,CAAK,IAAI,OAAOA,CAAK,CAAC;AAC3C;AAEA,SAASwX,GAAmBxX,GAA0C;AAClE,SAAO,OAAOA,KAAU,YAAY,OAAOA,KAAU;AACzD;AAEA,SAASyW,GAAsBzW,GAA2D;AACtF,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AChNO,MAAMyX,WAAwBvY,EAAgC;AAAA,EAA9D;AAAA;AAEK,IAAAC,EAAA,uBAAgB;AAkGP,IAAAA,EAAA,uBAAgB,CAAC0C,MAA4B;AAC1D,MAAI,KAAK,iBACF,KAAK,eAAe,QACpBA,EAAM,kBAAkB,QACxB,CAAC,KAAK,IAAI,SAASA,EAAM,MAAM,MAClC,KAAK,gBAAgB,IACrB,KAAK,OAAA;AAAA,IAEb;AAAA;AAAA,EAxGA,aAAmB;AACf,SAAK,MAAM,KAAK,MAAM,aAAa,KAAK,MAAM,cAAc,GACxD,KAAK,MAAM,iBAAiB,QAC5B,KAAK,OAAmB,UAAU,SAAS,KAAK,aAAa;AAAA,EAErE;AAAA,EAEA,aAAmB;AACf,QAAI,CAAC,KAAK,MAAM,SAAU;AAC1B,UAAMW,IAAU,KAAK,MAAM,YAAY,IAAA;AACvC,QAAIC;AACJ,KAAID,KAAA,gBAAAA,EAAS,WAAU,KAAK,MAAM,QAC9BC,IAAO,EAAC,OAAO,KAAK,MAAM,OAAO,WAAW,MAAA,IACrCD,EAAQ,cAAc,QAC7BC,IAAO,EAAC,OAAO,KAAK,MAAM,OAAO,WAAW,OAAA,IACzCA,IAAO,MACd,KAAK,MAAM,YAAY,IAAIA,GAAM,oBAAoB;AAAA,EACzD;AAAA,EAEA,kBAAkBZ,GAAyB;AACvC,IAAAA,EAAM,gBAAA,GACN,KAAK,gBAAgB,CAAC,KAAK,eAC3B,KAAK,OAAA;AAAA,EACT;AAAA,EAEA,cAAcY,GAAuBZ,GAA2B;;AAC5D,UAAM8U,IAAwB,EAAC,GAAG,KAAK,MAAM,eAAe,MAAI;AAChE,IAAIlU,EAAK,SAAS,WAAUkU,EAAQ,KAAK,MAAM,KAAK,IAC/CA,EAAQ,KAAK,MAAM,KAAK,IAAI,CAAC,GAAGlU,EAAK,SAAS,GACnD,KAAK,MAAM,eAAe,IAAIkU,GAAS,uBAAuB,IAC9D1J,KAAAtL,IAAA,KAAK,OAAM,mBAAX,QAAAsL,EAAA,KAAAtL,GAA4BgV,GAAS9U;AAAA,EACzC;AAAA,EAEA,SAA2B;AACvB,UAAM6V,IAAc,KAAK,MAAM,YAAY,IAAA,GACrC/X,KAAY+X,KAAA,gBAAAA,EAAa,WAAU,KAAK,MAAM,QAC9CA,EAAY,YACZ,MACAf,IAAU,IAAI;AAAA,OACf,KAAK,MAAM,eAAe,IAAA,EAAM,KAAK,MAAM,KAAK,KAAK,CAAA,GACjD,OAAOgB,EAAsB;AAAA,IAAA,GAEhC7V,IAAQ,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,KAAK,GACnDoU,IAAY,KAAK,MAAM,aAAaC,GAAgBrU,CAAK,KAAK,OAAO,KAAK,MAAM,KAAK,GACrF8V,IAAc,KAAK,mBAAmB,wBAAwB,EAAE1B,CAAS;AAE/E,QAAI2B,IAA0B;AAC9B,WAAI,KAAK,iBAAiB,KAAK,MAAM,iBAAiB,SAClDA,IAAQ,gBAAA3V;AAAA,MAACsU;AAAA,MAAA;AAAA,QAEL,OAAOoB;AAAA,QACP,SAAS,KAAK,MAAM;AAAA,QACpB,SAAAjB;AAAA,QACA,UAAU,CAAClU,GAAMZ,MAAU,KAAK,cAAcY,GAAMZ,CAAK;AAAA,QACxD,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,QAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,CAAA,IACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,MAAoB;AAAA,MAVxD;AAAA,IAAA,IAcL,gBAAA2C;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,OAAM;AAAA,QACN,aAAW7E,MAAc,QACnB,cACAA,MAAc,SAAS,eAAe;AAAA,QAC5C,OAAO,EAAC,QAAQ,KAAK,gBAAgB,OAAO,KAAA;AAAA,QAE3C,UAAA;AAAA,UAAA,KAAK,MAAM,WACN,gBAAA6E;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAM;AAAA,cACN,cAAY,KAAK,mBAAmB,sBAAsB,EAAE0R,CAAS;AAAA,cACrE,SAAS,MAAM,KAAK,WAAA;AAAA,cAEnB,UAAA;AAAA,gBAAApU;AAAA,gBACD,gBAAAI,EAAC,QAAA,EAAK,OAAM,iBAAgB,eAAY,QACnC,UAAAvC,MAAc,QAAQ,MAAMA,MAAc,SAAS,MAAM,GAAA,CAC9D;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,IAEF,gBAAAuC,EAAC,QAAA,EAAM,UAAAJ,EAAA,CAAM;AAAA,UAClB,KAAK,MAAM,iBAAiB,OACvB,OACA,gBAAAI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAM;AAAA,cACN,cAAY0V;AAAA,cACZ,iBAAe,OAAO,KAAK,aAAa;AAAA,cACxC,SAAS,CAAC/V,MAAsB,KAAK,kBAAkBA,CAAK;AAAA,cAC/D,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UACJgW;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAET;AAuEJ;AAxKI1Y,EADSsY,IACO,aAA+B,CAAA,IA6G/CtY,EA9GSsY,IA8GF,gBAAe,CAACjB,CAAW,IAElCrX,EAhHSsY,IAgHO,OAAM/U;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2D1B,SAASyT,GAAgBrU,GAAwC;AAC7D,SAAO,OAAOA,KAAU,YAAY,OAAOA,KAAU,WAC/C,OAAOA,CAAK,IACZ;AACV;AAEA,SAAS6V,GACL3M,GACgD;AAChD,SAAO,OAAOA,EAAM,CAAC,KAAM,YAAY,OAAOA,EAAM,CAAC,KAAM;AAC/D;ACrMO,MAAM8M,WACD5Y,EAAkC;AAAA,EAE1C,SAA2B;AACvB,WAAO,gBAAAgD,EAAC,WACJ,UAAA,gBAAAA,EAAC,MAAA,EACI,eAAK,MAAM,QAAQ,IAAI,CAAC6V,MAAW,gBAAA7V;AAAA,MAACuV;AAAA,MAAA;AAAA,QAEjC,OAAOM,EAAO;AAAA,QACd,aAAa,KAAK,MAAM;AAAA,QACxB,gBAAgB,KAAK,MAAM;AAAA,QAC1B,GAAIA,EAAO,SAAS,OAAO,CAAA,IAAK,EAAC,OAAOA,EAAO,MAAA;AAAA,QAC/C,GAAIA,EAAO,aAAa,OAAO,CAAA,IAAK,EAAC,WAAWA,EAAO,UAAA;AAAA,QACvD,GAAIA,EAAO,YAAY,OAAO,CAAA,IAAK,EAAC,UAAUA,EAAO,SAAA;AAAA,QACrD,GAAIA,EAAO,iBAAiB,OACvB,CAAA,IACA,EAAC,eAAeA,EAAO,cAAA;AAAA,QAC5B,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,QAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,KACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,QACvC,GAAI,KAAK,MAAM,kBAAkB,OAC5B,CAAA,IACA,EAAC,gBAAgB,KAAK,MAAM,eAAA;AAAA,MAAc;AAAA,MAlB3C,OAAOA,EAAO,KAAK;AAAA,IAAA,CAmB1B,GACN,EAAA,CACJ;AAAA,EACJ;AAuBJ;AAlDI5Y,EAFS2Y,IAEO,aAA+B,CAAA,IA6B/C3Y,EA/BS2Y,IA+BF,gBAAe,CAACL,EAAe,IAEtCtY,EAjCS2Y,IAiCF,OAAMpV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AChCV,MAAMsV,KAAwE;AAAA,EACjF,CAAClY,EAAW,OAAO,GAAG;AAAA,EACtB,CAACA,EAAW,MAAM,GAAG;AAAA,EACrB,CAACA,EAAW,OAAO,GAAG;AAAA,EACtB,CAACA,EAAW,IAAI,GAAG;AACvB;AAWO,SAASmY,GACZC,GACA,EAAC,MAAAC,IAAO,MAAM,SAAAxB,IAAU,CAAA,EAAC,IAAsB,IAC3C;AACJ,EAAAyB,GAAcF,CAAG,GACbC,KAAQ,SACRE,GAAWF,CAAI,GACfD,EAAI,aAAa,IAAI,QAAQ,GAAGC,EAAK,KAAK,IAAIA,EAAK,SAAS,EAAE;AAElE,aAAW,CAACG,GAAOlN,CAAO,KAAK,OAAO,QAAQuL,CAAO;AACjD,eAAW,CAAC3W,GAAOC,CAAI,KAAKmL,GAAS;AACjC,UAAI,CAACrL,GAAaE,CAAI;AAClB,cAAM,IAAI,UAAU,2BAA2BqY,CAAK,KAAK,OAAOrY,CAAI,CAAC,EAAE;AAE3E,MAAAiY,EAAI,aAAa;AAAA,QACb;AAAA,QACA,GAAGI,CAAK,IAAIN,GAA2B/X,CAAI,CAAC,IAAI,KAAK,UAAUD,CAAK,CAAC;AAAA,MAAA;AAAA,IAE7E;AAEJ,SAAOkY;AACX;AAEO,SAASK,GACZ3G,GACAuG,GACAxB,GACM;AACN,MAAI,CAAC,MAAM,QAAQ/E,CAAI,EAAG,OAAM,IAAI,UAAU,mCAAmC;AACjF,QAAM4G,IAAW5G,EAAK,OAAO,CAACC,MAAQ4G,GAAe5G,GAAK8E,CAAO,CAAC;AAClE,MAAIwB,KAAQ,KAAM,QAAOK;AACzB,EAAAH,GAAWF,CAAI;AACf,QAAMxY,IAAYwY,EAAK,cAAc,QAAQ,IAAI;AACjD,SAAO,CAAC,GAAGK,CAAQ,EAAE,KAAK,CAAC/Q,GAAMC,MAC7BgR,GAAcC,GAAUlR,GAAM0Q,EAAK,KAAK,GAAGQ,GAAUjR,GAAOyQ,EAAK,KAAK,CAAC,IAAIxY,CAAS;AAC5F;AAEA,SAAS8Y,GAAqB5G,GAAW8E,GAAgC;AACrE,aAAW,CAAC2B,GAAOlN,CAAO,KAAK,OAAO,QAAQuL,CAAO,GAAG;AACpD,UAAM3W,IAAQ2Y,GAAU9G,GAAKyG,CAAK;AAElC,QADelN,EAAQ,OAAO,CAAC,CAAA,EAAGnL,CAAI,MAAMA,MAASH,EAAW,IAAI,EACzD,KAAK,CAAC,CAAC4T,CAAS,MAAM,OAAO,GAAGA,GAAW1T,CAAK,CAAC,EAAG,QAAO;AAEtE,UAAMwL,IAAWJ,EAAQ,OAAO,CAAC,CAAA,EAAGnL,CAAI,MAAMA,MAASH,EAAW,OAAO;AACzE,QAAI0L,EAAS,SAAS,KACf,CAACA,EAAS,KAAK,CAAC,CAACkI,CAAS,MAAM,OAAO,GAAGA,GAAW1T,CAAK,CAAC,EAAG,QAAO;AAE5E,UAAMsQ,IAAYlF,EAAQ,OAAO,CAAC,CAAA,EAAGnL,CAAI,MAAMA,MAASH,EAAW,MAAM;AACzE,QAAIwQ,EAAU,SAAS,KAChB,CAACA,EAAU,KAAK,CAAC,CAACoD,CAAS,MAAM,OAAO,GAAGA,GAAW1T,CAAK,CAAC,EAAG,QAAO;AAAA,EACjF;AACA,SAAO;AACX;AAEO,SAASqY,GAAWF,GAA0C;AACjE,MAAIA,KAAQ,QACL,OAAOA,KAAS,YAChB,OAAO,QAAQ,IAAIA,GAAM,OAAO,KAAM,YACtC,CAACS,GAAgB,QAAQ,IAAIT,GAAM,WAAW,CAAC;AAClD,UAAM,IAAI,UAAU,wDAAwD;AAEpF;AAEA,SAASS,GAAgB5Y,GAAiD;AACtE,SAAOA,MAAU,SAASA,MAAU;AACxC;AAEA,SAAS0Y,GAAcjR,GAAeC,GAAwB;AAC1D,SAAI,OAAO,GAAGD,GAAMC,CAAK,IAAU,IAC/BD,KAAQ,OAAa,KACrBC,KAAS,OAAa,IACtB,OAAOD,KAAS,YAAY,OAAOC,KAAU,WAAiBD,IAAOC,IAClE,OAAOD,CAAI,EAAE,cAAc,OAAOC,CAAK,CAAC;AACnD;AAEA,SAASiR,GAAU3Y,GAAgBsY,GAAwB;AACvD,MAAI,EAAAtY,KAAS,QAAS,OAAOA,KAAU,YAAY,OAAOA,KAAU;AAGpE,WAAO,QAAQ,IAAIA,GAAOsY,CAAK;AACnC;AAEA,SAASF,GAAcpY,GAA0C;AAC7D,MAAIA,KAAS,QACL,OAAOA,KAAU,YAAY,OAAOA,KAAU,cAC/C,OAAO,QAAQ,IAAIA,GAAO,UAAU,KAAM;AAC7C,UAAM,IAAI,UAAU,iCAAiC;AAEzD,QAAM6Y,IAAe,QAAQ,IAAI7Y,GAAO,cAAc;AACtD,MAAI6Y,KAAgB,QACb,OAAO,QAAQ,IAAIA,GAAc,KAAK,KAAM,cAC5C,OAAO,QAAQ,IAAIA,GAAc,QAAQ,KAAM;AAClD,UAAM,IAAI,UAAU,iDAAiD;AAE7E;AC9DO,SAASC,GACZnY,GACqB;AACrB,QAAMoP,IAAQgJ,GAAYpY,CAAO,GAC3BqY,IAAYtE,GAAmC/T,EAAQ,IAAI,IAC3D,OACA,IAAIC,EAAyBD,EAAQ,MAAM;AAAA,IACzC,OAAOA,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,GACCsY,IAAOD,KAAarY,EAAQ,MAC5BqG,IAAQkS,GAAqBD,GAAMlJ,GAAOpP,EAAQ,KAAK;AAC7D,SAAO,IAAIwY,GAAuBnS,GAAO+I,GAAO,MAAM;AAClD,IAAA/I,EAAM,QAAA,GACNgS,KAAA,QAAAA,EAAW;AAAA,EACf,CAAC;AACL;AASO,SAASI,GACZzY,GACqB;AACrB,EAAA0Y,GAAuB1Y,EAAQ,KAAK;AACpC,QAAMoP,IAAQgJ,GAAYpY,CAAO,GAC3BqG,IAAQkS,GAAqBvY,EAAQ,OAAOoP,GAAOpP,EAAQ,KAAK,GAChE2Y,IAAQ3Y,EAAQ,MAAM;AAC5B,SAAO,IAAIwY;AAAA,IACPnS;AAAA,IACA+I;AAAA,IACA,MAAM/I,EAAM,QAAA;AAAA,IACZsS,KAAS,OACH,SACA,CAAC7G,MAAA;;AAAoB,cAAA9Q,IAAAhB,EAAQ,MAAM,UAAd,gBAAAgB,EAAqB,KAAKhB,EAAQ,OAAO8R;AAAA;AAAA,EAAK;AAEjF;AAGO,SAAS8G,GACZ5Y,GACqB;AACrB,MAAIA,EAAQ,WAAW,QAAQ,OAAOA,EAAQ,QAAQ,SAAU;AAC5D,UAAM,IAAI,UAAU,gDAAgD;AAExE,QAAMoP,IAAQgJ,GAAYpY,CAAO,GAC3BwX,IAAO,IAAIqB,GAA2B,QAAQzJ,EAAM,aAAa;AAAA,IACnE,OAAOpP,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,GACKgW,IAAU,IAAI6C,GAAuB,WAAWzJ,EAAM,gBAAgB;AAAA,IACxE,OAAOpP,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,GACKqG,IAAQ,IAAIyS,GAAyE;AAAA,IACvF,SAAS9Y,EAAQ;AAAA,IACjB,MAAM,EAAC,MAAAwX,GAAM,SAAAxB,EAAA;AAAA,IACb,OAAOhW,EAAQ;AAAA,IACf,SAAS;AAAA,IACT,mBAAmB;AAAA,EAAA,CACtB;AACD,SAAO,IAAIwY,GAAuBnS,GAAO+I,GAAO,MAAM;AAClD,IAAA/I,EAAM,QAAA,GACNmR,EAAK,QAAA,GACLxB,EAAQ,QAAA;AAAA,EACZ,CAAC;AACL;AAGO,SAAS+C,GACZ/Y,GACqB;AACrB,MAAI,OAAOA,EAAQ,OAAQ,YAAYA,EAAQ,IAAI,WAAW;AAC1D,UAAM,IAAI,UAAU,uCAAuC;AAE/D,QAAMgZ,IAKF;AAAA,IACA,KAAKhZ,EAAQ;AAAA,IACb,WAAWA,EAAQ,kBAAkBsX;AAAA,EAAA;AAEzC,SAAItX,EAAQ,WAAW,SAAMgZ,EAAe,UAAUhZ,EAAQ,UAC1DA,EAAQ,SAAS,SAAMgZ,EAAe,QAAQhZ,EAAQ,QACnD4Y,GAA6B;AAAA,IAChC,SAAS,IAAIK,GAAuDD,CAAc;AAAA,IAClF,GAAIhZ,EAAQ,eAAe,OAAO,CAAA,IAAK,EAAC,aAAaA,EAAQ,YAAA;AAAA,IAC7D,GAAIA,EAAQ,kBAAkB,OAAO,CAAA,IAAK,EAAC,gBAAgBA,EAAQ,eAAA;AAAA,IACnE,GAAIA,EAAQ,UAAU,SAAY,CAAA,IAAK,EAAC,OAAOA,EAAQ,MAAA;AAAA,EAAK,CAC/D;AACL;AAeA,MAAMwY,GAA+E;AAAA,EAMjF,YACanS,GACQ+I,GACA8J,IAAoC,MACrDP,IAAoDtS,EAAM,OAC5D;AAVO,IAAA7H,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACD,IAAAA,EAAA,kBAAW;AAGN,SAAA,QAAA6H,GACQ,KAAA,QAAA+I,GACA,KAAA,eAAA8J,GAGjB,KAAK,cAAc9J,EAAM,aACzB,KAAK,iBAAiBA,EAAM,gBACxBuJ,KAAS,SAAM,KAAK,QAAQ,CAAC7G,MAAoB6G,EAAM7G,CAAK;AAAA,EACpE;AAAA,EAEA,UAAgB;;AACZ,IAAI,KAAK,aACT,KAAK,WAAW,KAChB9Q,IAAA,KAAK,iBAAL,QAAAA,EAAA,aACAsL,IAAA,KAAK,MAAM,qBAAX,QAAAA,EAA6B,YAC7BG,IAAA,KAAK,MAAM,wBAAX,QAAAA,EAAgC;AAAA,EACpC;AACJ;AAEA,SAAS8L,GACLD,GACAlJ,GACA5M,GACwE;AACxE,SAAO,IAAIsN;AAAA,IACP,CAACwI,GAAMlJ,EAAM,aAAaA,EAAM,cAAc;AAAA,IAC9C,CAAC,CAAC6B,GAAMuG,GAAMxB,CAAO,MAAmC/E,KAAQ,OAC1D,SACA2G,GAAqB3G,GAAMuG,GAAMxB,CAAO;AAAA,IAC9C,EAAC,OAAAxT,GAAO,SAAS,mBAAA;AAAA,EAAkB;AAE3C;AAEA,SAAS4V,GAAYpY,GAA0C;AAC3D,QAAMmZ,IAAmBnZ,EAAQ,eAAe,OAC1C,IAAIC,EAA0B,MAAM;AAAA,IAClC,OAAOD,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,IACC,MACAoZ,IAAsBpZ,EAAQ,kBAAkB,OAChD,IAAIC,EAAsB,IAAI;AAAA,IAC5B,OAAOD,EAAQ;AAAA,IACf,SAAS;AAAA,EAAA,CACZ,IACC;AACN,SAAO;AAAA,IACH,aAAaA,EAAQ,eAAemZ;AAAA,IACpC,gBAAgBnZ,EAAQ,kBAAkBoZ;AAAA,IAC1C,kBAAAD;AAAA,IACA,qBAAAC;AAAA,EAAA;AAER;AAEA,SAASrF,GAA0B1U,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM,cAC3C,OAAO,QAAQ,IAAIA,GAAO,eAAe,KAAM,cAC/C,OAAO,QAAQ,IAAIA,GAAO,UAAU,KAAM;AACrD;AAEA,SAASqZ,GACLrZ,GACsC;AACtC,MAAI,CAAC0U,GAA+C1U,CAAK;AACrD,UAAM,IAAI,UAAU,gCAAgC;AAE5D;ACpLO,MAAMga,WACD9a,EAAgC;AAAA,EAgBxC,YAAYG,GAA6B;;AACrC,UAAMA,CAAK;AAfN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA,eAAsC;AAC9B,IAAAA,EAAA,oBAA2C;AAClC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA,yBAAgD;AAIpD,IAAA8a,GAAqB5a,CAAK,GAC1B,KAAK,UAAU6a,GAAiB7a,EAAM,OAAO,GAC7C,KAAK,SAAS8a,GAAgB9a,EAAM,MAAM,GAC1C,KAAK,qBAAqBA,EAAM,cAAc,MAC9C,KAAK,mBAAmB,KAAK,sBAAsB,OAC7C,IAAIuB,EAA0B,MAAM,EAAC,OAAO,MAAM,SAAS,aAAA,CAAa,IACxE,MACN,KAAK,sBAAsB,KAAK,sBAAsB,OAChD,IAAIA,EAAsB,IAAI,EAAC,OAAO,MAAM,SAAS,gBAAA,CAAgB,IACrE,MACN,KAAK,gBAAce,IAAA,KAAK,uBAAL,gBAAAA,EAAyB,gBAAe,KAAK,kBAChE,KAAK,mBAAiBsL,IAAA,KAAK,uBAAL,gBAAAA,EAAyB,mBAAkB,KAAK,qBACtE,KAAK,mBAAmB5N,EAAM,gBAAgB,KACxC2U,GAAuB;AAAA,MACrB,OAAO;AAAA,MACP,aAAa;AAAA,MACb,GAAI3U,EAAM,wBAAwB,OAC5B,CAAA,IACA,EAAC,sBAAsBA,EAAM,qBAAA;AAAA,MACnC,UAAU,MAAA;;AAAM,iBAAAsC,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAS,CAAA;AAAA;AAAA,MACrC,QAAQ,KAAK;AAAA,IAAA,CAChB,IACCqS,GAAuB;AAAA,MACrB,OAAO;AAAA,MACP,GAAI3U,EAAM,uBAAuB,OAC3B,CAAA,IACA,EAAC,qBAAqBA,EAAM,oBAAA;AAAA,MAClC,UAAU,MAAA;;AAAM,iBAAAsC,IAAA,KAAK,UAAL,gBAAAA,EAAY,UAAS,CAAA;AAAA;AAAA,MACrC,QAAQ,KAAK;AAAA,IAAA,CAChB,GACL,KAAK,uBAAuB,KAAK,iBAAiB,sBAClD,KAAK,sBAAsB,KAAK,4BAA4BkR,KACtD,KAAK,iBAAiB,sBACtB;AAAA,EACV;AAAA,EAEA,aAAmB;AACf,IAAI,KAAK,sBAAsB,OAC3B,KAAK,aAAa,KAAK,qBAChB,KAAK,MAAM,QAAQ,QAC1B,KAAK,kBAAkB6G,GAA0B;AAAA,MAC7C,GAAG,KAAK,MAAM;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,gBAAgB,KAAK;AAAA,MACrB,OAAO;AAAA,IAAA,CACV,GACD,KAAK,aAAa,KAAK,oBAEvB,KAAK,kBAAkBZ,GAA2B;AAAA,MAC9C,MAAM,KAAK,MAAM,QAAQ,CAAA;AAAA,MACzB,aAAa,KAAK;AAAA,MAClB,gBAAgB,KAAK;AAAA,MACrB,OAAO;AAAA,IAAA,CACV,GACD,KAAK,aAAa,KAAK,kBAE3B,KAAK,QAAQ,KAAK,WAAW,OAC7B,KAAK,MAAM,KAAK,OAAO,KAAK,oBAAoB;AAAA,EACpD;AAAA,EAEA,SAA2B;;AACvB,UAAMzE,KAAS1S,IAAA,KAAK,UAAL,gBAAAA,EAAY,OACrBiQ,IAAOyC,KAAU,CAAA;AACvB,QAAI,CAAC,MAAM,QAAQzC,CAAI,EAAG,OAAM,IAAI,UAAU,wCAAwC;AACtF,UAAMgD,MAAS3H,IAAA,KAAK,UAAL,gBAAAA,EAAY,oBAAmB6H,EAAW,SACnDlK,KAAQwC,IAAA,KAAK,UAAL,gBAAAA,EAAY,YACpByH,IAAYD,MAAWE,EAAW,WAAWF,MAAWE,EAAW,SACnEC,IAAkBH,MAAWE,EAAW,WACtCF,MAAWE,EAAW,WAAWT,MAAW,QAC9C3B,IAAe,IAAI;AAAA,MACrB,KAAK,qBAAqB,IAAA,EAAM,IAAI,CAACnP,GAAMpB,MAAU,KAAK,OAAOoB,GAAMpB,CAAK,CAAC;AAAA,IAAA,GAE3EF,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QAExC,UAAA;AAAA,UAAA+T,IAAkB,gBAAA7S,EAAC,OAAE,MAAK,UAAU,eAAK,mBAAmB,kBAAkB,GAAE,IAAO;AAAA,UACvF0S,MAAWE,EAAW,QACjB,gBAAA5S;AAAA,YAACwI;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAAE;AAAA,cACA,UAAU,KAAK,mBAAmB,oBAAoB;AAAA,YAAA;AAAA,UAAA,IAExD;AAAA,UACLgK,MAAWE,EAAW,SAAS,SAAOsF,IAAA,KAAK,eAAL,gBAAAA,EAAiB,UAAU,aAC5D,gBAAAlY;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAA;;AAAM,wBAAA+K,KAAAtL,IAAA,KAAK,eAAL,gBAAAA,EAAiB,UAAjB,gBAAAsL,EAAA,KAAAtL,GAAyB;AAAA;AAAA,cAC1C,UAAA,KAAK,mBAAmB,gBAAgB;AAAA,YAAA;AAAA,UAAA,IACxC;AAAA,UACN,gBAAA6C,EAAC,SAAA,EAAM,aAAWqQ,IAAY,SAAS,MAClC,UAAA;AAAA,YAAA,KAAK,MAAM,WAAW,OAAO,yBAAQ,WAAA,EAAS,UAAA,KAAK,MAAM,QAAA,CAAQ;AAAA,YAClE,gBAAA3S;AAAA,cAAC4V;AAAA,cAAA;AAAA,gBAEG,SAAS,KAAK;AAAA,gBACd,aAAa,KAAK;AAAA,gBAClB,gBAAgB,KAAK;AAAA,gBACpB,GAAI,KAAK,MAAM,eAAe,OACzB,KACA,EAAC,aAAa,KAAK,MAAM,YAAA;AAAA,gBAC9B,GAAI,KAAK,MAAM,wBAAwB,OAClC,KACA,EAAC,sBAAsB,KAAK,MAAM,qBAAA;AAAA,gBACvC,GAAI,KAAK,MAAM,kBAAkB,OAC5B,CAAA,IACA,EAAC,gBAAgB,KAAK,MAAM,eAAA;AAAA,cAAc;AAAA,cAZ5C;AAAA,YAAA;AAAA,8BAcP,SAAA,EACI,UAAA/C,IACK,KAAK,uBACLnD,EAAK,SAAS,IACVA,EAAK,IAAI,CAACC,GAAK1P,MACb,KAAK,UAAU0P,GAAK1P,GAAOuQ,CAAY,CAAC,IAC1CkC,MAAWE,EAAW,QAClB,OACA,gBAAA5S,EAAC,QACC,UAAA,gBAAAA,EAAC,MAAA,EAAG,SAAS,KAAK,QAAQ,QACrB,UAAA,KAAK,MAAM,gBAAgB,KAAK,mBAAmB,gBAAgB,EAAA,CACxE,KAHM,OAIV,EAAA,CAChB;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAER;AAAA,EAEQ,UACJ2P,GACA1P,GACAuQ,GACgB;AAChB,UAAMc,IAAM,KAAK,OAAO3B,GAAK1P,CAAK,GAC5BuC,IAAWgO,EAAa,IAAIc,CAAG;AACrC,WAAO,gBAAAtR;AAAA,MAAC;AAAA,MAAA;AAAA,QAEJ,2BAAwB;AAAA,QACxB,iBAAe,OAAOwC,CAAQ;AAAA,QAC9B,UAAUvC,MAAU,IAAI,IAAI;AAAA,QAE3B,UAAA,KAAK,QAAQ,IAAI,CAAC4V,wBAAY,MAAA,EAC1B,UAAAA,EAAO,SACFA,EAAO,OAAOlG,GAAK1P,CAAK,IACxBkY,GAAgBxI,EAAIkG,EAAO,KAAK,CAAC,KAHJ,OAAOA,EAAO,KAAK,CAI1D,CAAK;AAAA,MAAA;AAAA,MATA,OAAOvE,CAAG;AAAA,IAAA;AAAA,EAWvB;AAAA,EAEQ,qBAAyC;AAC7C,UAAM8G,IAAQ,KAAK,MAAM,oBAAoB;AAC7C,WAAO,MAAM,KAAK,EAAC,QAAQA,KAAQ,CAACtF,GAAGuF,MACnC,gBAAArY,EAAC,QAAmC,eAAY,QAC3C,eAAK,QAAQ,IAAI,CAAC6V,GAAQyC,wBACtB,MAAA,EACG,UAAA,gBAAAtY;AAAA,MAACwN;AAAA,MAAA;AAAA,QACG,OAAO,MAAO6K,IAAWC,KAAe,IAAK;AAAA,MAAA;AAAA,IAAA,KAF5C,OAAOzC,EAAO,KAAK,CAI5B,CAAK,EAAA,GANJ,eAAewC,CAAQ,EAOhC,CAAK;AAAA,EACb;AAAA,EAEA,YAAYrF,GAA6B;AACrC,UAAMtD,IAAOsD,aAAe,UACtBA,EAAI,iBAA8B,iCAAiC,IACnE,CAAA;AACN,SAAK,iBAAiB,YAAYtD,CAAI;AAAA,EAC1C;AAAA,EAEA,kBAA0B;AACtB,WAAO,KAAK,iBAAiB,iBAAA;AAAA,EACjC;AAAA,EAEA,yBAA+C;AAC3C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,iBAA8B;;AAC1B,aAAOjQ,IAAA,KAAK,wBAAL,gBAAAA,EAA0B,UAAS;AAAA,EAC9C;AAAA,EAEA,wBAA0D;AACtD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,YAAkB;;AACd,SAAK,iBAAiB,QAAA,IACtBA,IAAA,KAAK,oBAAL,QAAAA,EAAsB,YACtBsL,IAAA,KAAK,qBAAL,QAAAA,EAAuB,YACvBG,IAAA,KAAK,wBAAL,QAAAA,EAA0B;AAAA,EAC9B;AAyFJ;AArSIjO,EAFS6a,IAEO,aAA+B,CAAA,IA8M/C7a,EAhNS6a,IAgNF,gBAAe,CAACtK,GAAaoI,IAAapN,CAAY,IAE7DvL,EAlNS6a,IAkNO,YAAW,eAC3B7a,EAnNS6a,IAmNO,eAAc,SAE9B7a,EArNS6a,IAqNF,OAAMtX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoFjB,SAASwX,GACLO,GAC4B;AAC5B,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,UAAM,IAAI,UAAU,6CAA6C;AAErE,QAAMC,wBAAa,IAAA;AACnB,SAAOD,EAAQ,IAAI,CAAC1C,MAAoB;AACpC,QAAIA,KAAU,QAAQ,OAAOA,KAAW;AACpC,YAAM,IAAI,UAAU,yCAAyC;AAEjE,UAAMO,IAAQ,QAAQ,IAAIP,GAAQ,OAAO;AACzC,QAAI,OAAOO,KAAU,YAAYA,EAAM,WAAW;AAC9C,YAAM,IAAI,UAAU,yCAAyC;AAEjE,QAAIoC,EAAO,IAAIpC,CAAK,SAAS,IAAI,MAAM,+BAA+BA,CAAK,EAAE;AAC7E,IAAAoC,EAAO,IAAIpC,CAAK;AAChB,UAAMqC,IAAS,QAAQ,IAAI5C,GAAQ,QAAQ;AAC3C,QAAI4C,KAAU,QAAQ,OAAOA,KAAW;AACpC,YAAM,IAAI,UAAU,oBAAoBrC,CAAK,4BAA4B;AAI7E,WAAOP;AAAA,EACX,CAAC;AACL;AAEA,SAASkC,GAA4C5a,GAAmC;;AAGpF,QAAMub,IAFc;AAAA,IAAC;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAgB;AAAA,IAAY;AAAA,IAAW;AAAA,IACzE;AAAA,EAAA,EACuB,KAAK,CAAC/Z,MAAS,OAAO,OAAOxB,GAAOwB,CAAI,CAAC;AACpE,MAAI+Z,KAAU;AACV,UAAM,IAAI;AAAA,MACN,aAAaA,CAAM;AAAA,IAAA;AAG3B,QAAMC,IAAUxb,EAAM,SAAS,QACzByb,IAAgBzb,EAAM,eAAe,QACrC0b,IAAU1b,EAAM,SAAS;AAC/B,MAAI,OAAOwb,CAAO,IAAI,OAAOC,CAAa,IAAI,OAAOC,CAAO,IAAI;AAC5D,UAAM,IAAI,UAAU,4DAA4D;AAEpF,MAAID,GAAe;AACf,UAAM7G,IAAS5U,EAAM;AACrB,QAAI4U,KAAU,QACP,OAAOA,KAAW,YAClBA,EAAO,SAAS,QAChB,SAAOtS,IAAAsS,EAAO,gBAAP,gBAAAtS,EAAoB,QAAQ,cACnC,SAAOsL,IAAAgH,EAAO,mBAAP,gBAAAhH,EAAuB,QAAQ,cACtC,OAAOgH,EAAO,WAAY;AAC7B,YAAM,IAAI,UAAU,oEAAoE;AAAA,EAEhG;AACJ;AAEA,SAASkG,GACLa,GACmB;AACnB,MAAIA,KAAU,KAAM,QAAOtJ;AAC3B,MAAI,OAAOsJ,KAAW,WAAY,QAAOA;AACzC,MAAI,OAAOA,KAAW,YAAYA,EAAO,SAAS;AAC9C,WAAO,CAACnJ,GAAK1P,MAAU;AACnB,YAAMqR,IAAM3B,EAAImJ,CAAM;AACtB,UAAIxH,KAAO;AACP,cAAM,IAAI,UAAU,0BAA0BrR,CAAK,UAAU6Y,CAAM,EAAE;AAEzE,aAAOxH;AAAA,IACX;AAEJ,QAAM,IAAI,UAAU,sDAAsD;AAC9E;AAEA,SAAS6G,GAAgBra,GAAkC;AACvD,SAAIA,KAAS,QAAQ,OAAOA,KAAU,YAAY,OAAOA,KAAU,WAAiBA,IAC7E,OAAOA,CAAK;AACvB;AC9aO,MAAMib,WAAmC/b,EAAiC;AAAA,EAE7E,SAA2B;AACvB,WAAO,KAAK,MAAM,YAAY,CAAA;AAAA,EAClC;AACJ;AAJIC,EADS8b,IACO,aAA+B,CAAA;ACZ5C,SAASC,GACZlb,GAC4C;AAC5C,MAAI,CAAC,MAAM,QAAQA,CAAK,EAAG,OAAM,IAAI,UAAU,6BAA6B;AAC5E,QAAMsU,wBAAW,IAAA,GACXnF,IAAQ,CAACgM,MAA6C;AACxD,eAAWC,KAAQD,GAAO;AACtB,UAAIC,KAAQ,QAAQ,OAAOA,KAAS,YAAYA,EAAK,MAAM;AACvD,cAAM,IAAI,UAAU,+BAA+B;AAEvD,UAAI9G,EAAK,IAAI8G,EAAK,EAAE,EAAG,OAAM,IAAI,MAAM,2BAA2B,OAAOA,EAAK,EAAE,CAAC,EAAE;AAEnF,UADA9G,EAAK,IAAI8G,EAAK,EAAE,GACZ,CAAC,MAAM,QAAQA,EAAK,YAAY,CAAA,CAAE;AAClC,cAAM,IAAI,UAAU,aAAa,OAAOA,EAAK,EAAE,CAAC,4BAA4B;AAEhF,MAAAjM,EAAMiM,EAAK,YAAY,EAAE;AAAA,IAC7B;AAAA,EACJ;AACA,EAAAjM,EAAMnP,CAAoC;AAC9C;AAEO,SAASqb,GACZF,GACA3H,GACuB;AACvB,SAAA0H,GAAgBC,CAAK,GACdG,GAAsBH,GAAO3H,CAAG;AAC3C;AAQO,SAAS+H,GACZJ,GACA3H,GACArQ,IAAiB,MAOnB;AACE,SAAO,IAAIsN;AAAA,IACP,CAAC0K,GAAO3H,CAAG;AAAA,IACX,CAAC,CAACgI,GAAcC,CAAU,OACtBP,GAAgBM,CAAY,GACrBC,KAAc,OAAO,OAAOH,GAAsBE,GAAcC,CAAU;AAAA,IAErF,EAAC,OAAAtY,GAAO,SAAS,uBAAA;AAAA,EAAsB;AAE/C;AAGO,SAASuY,GACZP,GACA3H,GACAmI,GAC2B;AAE3B,MADAT,GAAgBC,CAAK,GACjB,OAAOQ,KAAW,WAAY,OAAM,IAAI,UAAU,qCAAqC;AAE3F,QAAMxM,IAAQ,CAAC9L,MAAoE;AAC/E,aAASlB,IAAQ,GAAGA,IAAQkB,EAAM,QAAQlB,KAAS,GAAG;AAClD,YAAMiZ,IAAO/X,EAAMlB,CAAK;AACxB,UAAI,OAAO,GAAGiZ,EAAK,IAAI5H,CAAG,GAAG;AACzB,cAAMoI,IAAUD,EAAOP,CAAI;AAC3B,YAAIQ,KAAW,QAAQ,OAAOA,KAAY;AACtC,gBAAM,IAAI,UAAU,0CAA0C;AAElE,YAAI,CAAC,OAAO,GAAGA,EAAQ,IAAIR,EAAK,EAAE;AAC9B,gBAAM,IAAI,MAAM,8CAA8C;AAElE,YAAI,OAAO,GAAGQ,GAASR,CAAI,EAAG,QAAO/X;AACrC,cAAMgR,IAAS,CAAC,GAAGhR,CAAK;AACxBgR,eAAAA,EAAOlS,CAAK,IAAIyZ,GACTvH;AAAAA,MACX;AACA,YAAMvM,IAAWsT,EAAK,YAAY,CAAA,GAC5BS,IAAkB1M,EAAMrH,CAAQ;AACtC,UAAI,CAAC,OAAO,GAAG+T,GAAiB/T,CAAQ,GAAG;AACvC,cAAMuM,IAAS,CAAC,GAAGhR,CAAK;AACxBgR,eAAAA,EAAOlS,CAAK,IAAI,EAAC,GAAGiZ,GAAM,UAAUS,EAAA,GAC7BxH;AAAAA,MACX;AAAA,IACJ;AACA,WAAOhR;AAAA,EACX,GAEMgR,IAASlF,EAAMgM,CAAK;AAC1B,SAAK,OAAO,GAAG9G,GAAQ8G,CAAK,QAAmB9G,CAAM,GAC9CA;AACX;AAGO,SAASyH,GACZX,GACA3H,GACAmI,GACAlJ,IAAiB,qBACV;AACP,QAAMjQ,IAAU2Y,EAAM,IAAA,GAChB1Y,IAAOiZ,GAAelZ,GAASgR,GAAKmI,CAAM;AAChD,SAAO,OAAO,GAAGlZ,GAAMD,CAAO,IAAI,KAAQ2Y,EAAM,IAAI1Y,GAAMgQ,CAAK;AACnE;AAEA,SAAS6I,GACLH,GACA3H,GACuB;AACvB,aAAW4H,KAAQD,GAAO;AACtB,QAAI,OAAO,GAAGC,EAAK,IAAI5H,CAAG,EAAG,QAAO4H;AACpC,UAAMW,IAAQT,GAAsBF,EAAK,YAAY,CAAA,GAAI5H,CAAG;AAC5D,QAAIuI,KAAS,KAAM,QAAOA;AAAA,EAC9B;AACA,SAAO;AACX;ACxFO,MAAMC,WAAmC9c,EAAiC;AAAA,EAY7E,YAAYG,GAA8B;AACtC,UAAMA,CAAK;AAXN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA,oBAAyB;AACzB,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,wBAAuD;AAIvDuV,QAAAA,GAA2DrV,EAAM,KAAK;AACtE,WAAK,eAAeA,EAAM,OAC1B,KAAK,oBAAoB;AAAA,SACtB;AACH,YAAM8b,IAAQ9b,EAAM,SAAS4c,GAAgC5c,EAAM,QAAQ;AAC3E,WAAK,oBAAoB,IAAIuB,EAAQua,GAAO;AAAA,QACxC,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,CACZ,GACD,KAAK,eAAe,KAAK;AAAA,IAC7B;AACA,SAAK,uBAAuB9b,EAAM,sBAAsB,OAClD,IAAIuB,EAAoB,MAAM,EAAC,OAAO,MAAM,SAAS,oBAAA,CAAoB,IACzE,MACN,KAAK,qBAAqBvB,EAAM,sBAAsB,KAAK,sBAC3D,KAAK,uBAAuBA,EAAM,uBAAuB,OACnD,IAAIuB,EAAe,IAAI,EAAC,OAAO,MAAM,SAAS,qBAAA,CAAqB,IACnE,MACN,KAAK,sBAAsBvB,EAAM,uBAAuB,KAAK;AAAA,EACjE;AAAA,EAEA,aAAmB;AACf,SAAK,UAAU,KAAK,aAAa,IAAA,KAAS,CAAA,CAAE,GAC5C,KAAK,MAAM,KAAK,cAAc,KAAK,oBAAoB,KAAK,mBAAmB,GAC/E,KAAK,UAAU,KAAK,aAAa,UAAU,CAAC,EAAC,OAAAW,EAAA,MAAW,KAAK,UAAUA,KAAS,CAAA,CAAE,GAAG;AAAA,MACjF,aAAa;AAAA,IAAA,CAChB,CAAC;AAAA,EACN;AAAA,EAES,SAASqE,GAAwC;AACtD,QAAI,KAAK,qBAAqB,MAAM;AAChC,UAAIqQ,GAAkBrQ,EAAU,KAAK;AACjC,cAAM,IAAI;AAAA,UACN;AAAA,QAAA;AAGR,WAAK,kBAAkB;AAAA,QACnBA,EAAU,SAAS4X,GAAgC5X,EAAU,QAAQ;AAAA,QACrE;AAAA,MAAA;AAAA,IAER;AACA,WAAO,MAAM,SAASA,CAAS;AAAA,EACnC;AAAA,EAEA,SAA2B;AACvB,UAAMgQ,IAAS,KAAK,aAAa,IAAA,GAC3B8G,IAAQ9G,KAAU,CAAA;AACxB,IAAA6G,GAAgBC,CAAK;AACrB,UAAMzE,IAAa,KAAK,aAAa,cAAA,GAC/BwF,IAAc,KAAK,aAAa,SAAA,GAChCrH,IAAY6B,MAAe5B,EAAW,WAAW4B,MAAe5B,EAAW,SAC3EC,IAAkB2B,MAAe5B,EAAW,WAC1C4B,MAAe5B,EAAW,WAAWT,MAAW,QAClD8H,IAAW,IAAI,IAAI,KAAK,oBAAoB,KAAK,GACjDC,IAAUC,GAAelB,GAAOgB,CAAQ,GACxCzX,IAAW,KAAK,mBAAmB,IAAA,GACnC0L,IAASgM,EAAQ,KAAK,CAAC,EAAC,MAAAhB,EAAA,MAAU,OAAO,GAAGA,EAAK,IAAI,KAAK,UAAU,CAAC,KACpEgB,EAAQ,KAAK,CAAC,EAAC,MAAAhB,QAAU,OAAO,GAAGA,EAAK,IAAI1W,CAAQ,CAAC,KACrD0X,EAAQ,CAAC,KACT;AACP,SAAK,cAAahM,KAAA,gBAAAA,EAAQ,KAAK,OAAM;AAErC,UAAMnO,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QAClD,aAAW6T,IAAY,SAAS;AAAA,QAC/B,UAAA;AAAA,UAAA6B,MAAe5B,EAAW,QACrB,gBAAA5S;AAAA,YAACwI;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAOwR;AAAA,cACP,UAAU,KAAK,mBAAmB,mBAAmB;AAAA,YAAA;AAAA,UAAA,IAEvD;AAAA,UACLnH,IACK,gBAAAvQ,EAAAvB,IAAA,EACE,UAAA;AAAA,YAAA,gBAAAf,EAAC,OAAE,MAAK,UAAU,UAAA,KAAK,mBAAmB,iBAAiB,GAAE;AAAA,YAC7D,gBAAAA,EAAC,MAAA,EAAG,eAAY,QACX,gBAAM,KAAK,EAAC,QAAQ,KAAK,MAAM,oBAAoB,EAAA,GAAI,CAAC8S,GAAG7S,MAAU;AAClE,oBAAMma,IAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAEna,IAAQ,CAAC,KAAK;AAC5C,qBAAO,gBAAAqC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEJ,OAAO,EAAC,gBAAgB8X,EAAA;AAAA,kBAExB,UAAA;AAAA,oBAAA,gBAAApa,EAAC,kBAAa,UAAA,IAAA,CAAC;AAAA,sCACdwN,GAAA,EAAY,OAAO,KAAMvN,IAAQ,IAAK,EAAA,CAAG;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAJrC,eAAeA,CAAK;AAAA,cAAA;AAAA,YAMjC,CAAC,EAAA,CACL;AAAA,UAAA,EAAA,CACJ,IACE;AAAA,UACLuU,MAAe5B,EAAW,SAASsH,EAAQ,WAAW,IACjD,gBAAAla,EAAC,KAAA,EAAE,MAAK,UAAU,UAAA,KAAK,mBAAmB,eAAe,GAAE,IAC3D;AAAA,UACL,CAAC6S,KAAmBqH,EAAQ,SAAS,IAChC,gBAAAla;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAY,KAAK,MAAM;AAAA,cACvB,aAAW2S,IAAY,SAAS;AAAA,cAE/B,UAAAuH,EAAQ,IAAI,CAAC7Y,GAAMpB,MAAU;;AAC1B,sBAAM,EAAC,MAAAiZ,GAAM,OAAAkB,GAAO,UAAAC,GAAU,SAAAC,MAAWjZ,GACnCkZ,OAAe9a,KAAAyZ,EAAK,aAAL,gBAAAzZ,GAAe,WAAU,KAAK,GAC7C+a,IAAaD,KAAeN,EAAS,IAAIf,EAAK,EAAE,GAChDuB,IAAa,OAAO,GAAGvB,EAAK,IAAI1W,CAAQ,GACxC5C,MAAQsL,MAAAH,KAAA,KAAK,OAAM,eAAX,gBAAAG,GAAA,KAAAH,IAAwBmO,GAAMkB,OAAUlB,EAAK,OACrDwB,KAAiBC,MAAAzC,KAAA,KAAK,OAAM,uBAAX,gBAAAyC,GAAA,KAAAzC,IAAgCgB,GAAMkB,IACvDQ,MAAaC,MAAAC,KAAA,KAAK,OAAM,mBAAX,gBAAAD,GAAA,KAAAC,IAA4B5B,GAAMkB;AACrD,uBAAO,gBAAA9X;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEJ,MAAK;AAAA,oBACL,cAAYrC;AAAA,oBACZ,cAAYma,IAAQ;AAAA,oBACpB,iBAAeC;AAAA,oBACf,gBAAcC;AAAA,oBACd,iBAAeC,IAAc,OAAOC,CAAU,IAAI;AAAA,oBAClD,iBAAe,OAAOC,CAAU;AAAA,oBAChC,UAAU,OAAO,GAAGvB,EAAK,IAAIhL,KAAA,gBAAAA,EAAQ,KAAK,EAAE,IAAI,IAAI;AAAA,oBACpD,OAAO,EAAC,gBAAgBkM,EAAA;AAAA,oBACxB,SAAS,CAACza,OAAsB;AAE5B,0BADA,KAAK,aAAauZ,EAAK,IACnB6B,GAAiBpb,GAAM,MAAM,KAAK4a,GAAa;AAC/C,6BAAK,eAAerB,EAAK,EAAE,GAC3B,KAAK,SAASA,EAAK,EAAE;AACrB;AAAA,sBACJ;AACA,2BAAK,WAAWA,GAAMvZ,EAAK;AAAA,oBAC/B;AAAA,oBACA,SAAS,MAAM,KAAK,aAAauZ,EAAK;AAAA,oBACtC,WAAW,CAACvZ,OACR,KAAK,cAAcA,IAAOM,GAAOia,CAAO;AAAA,oBAE5C,UAAA;AAAA,sBAAA,gBAAAla,EAAC,kBAAa,eAAY,QACrB,cAAewa,IAAa,MAAM,MAAO,IAAA,CAC9C;AAAA,sBACA,gBAAAxa;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACI,GAAI0a,KAAkB,OAAO,CAAA,IAAK,EAAC,WAAWA,EAAA;AAAA,0BAC9C,GAAIE,MAAc,OAAO,CAAA,IAAK,EAAC,OAAOA,GAAA;AAAA,0BACzC,UAAAhb;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAAM;AAAA,kBAAA;AAAA,kBA7BHsZ,EAAK;AAAA,gBAAA;AAAA,cA+BlB,CAAC;AAAA,YAAA;AAAA,UAAA,IAEH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEd;AAAA,EAEA,YAAkB;;AACd,IAAI,KAAK,kBAAkB,QAAM,aAAa,KAAK,cAAc,IACjEzZ,IAAA,KAAK,sBAAL,QAAAA,EAAwB,YACxBsL,IAAA,KAAK,yBAAL,QAAAA,EAA2B,YAC3BG,IAAA,KAAK,yBAAL,QAAAA,EAA2B;AAAA,EAC/B;AAAA,EAmGQ,UAAU+N,GAA0C;AACxD,IAAAD,GAAgBC,CAAK;AACrB,UAAM+B,IAAU,IAAI,IAAIC,GAAWhC,CAAK,EAAE,IAAI,CAAC,EAAC,MAAAC,EAAA,MAAUA,EAAK,EAAE,CAAC,GAC5D1W,IAAW,KAAK,mBAAmB,IAAA;AACzC,IAAI,KAAK,wBAAwB,QAAQA,KAAY,QAAQ,CAACwY,EAAQ,IAAIxY,CAAQ,KAC9E,KAAK,mBAAmB,IAAI,MAAM,4BAA4B;AAElE,UAAMyX,IAAW,KAAK,oBAAoB,IAAA,GACpCiB,IAAWjB,EAAS,OAAO,CAAC3I,MAAQ0J,EAAQ,IAAI1J,CAAG,CAAC;AAC1D,IAAI,KAAK,wBAAwB,QAAQ,CAAC6J,GAASlB,GAAUiB,CAAQ,KACjE,KAAK,oBAAoB,IAAIA,GAAU,oCAAoC,GAE3E,KAAK,cAAc,QAAQ,CAACF,EAAQ,IAAI,KAAK,UAAU,MAAG,KAAK,aAAa;AAAA,EACpF;AAAA,EAEQ,WAAW9B,GAAwBvZ,GAAoB;AAC3D,SAAK,mBAAmB,IAAIuZ,EAAK,IAAI,oBAAoB,GACzDla,EAAO,KAAK,MAAM,UAAUka,GAAMvZ,CAAK,GACvC,KAAK,SAASuZ,EAAK,EAAE;AAAA,EACzB;AAAA,EAEQ,eAAe5H,GAAgB;AACnC,UAAM2I,IAAW,KAAK,oBAAoB,IAAA,GACpCmB,IAAWnB,EAAS,KAAK,CAACzI,MAAc,OAAO,GAAGA,GAAWF,CAAG,CAAC;AACvE,SAAK,oBAAoB;AAAA,MACrB8J,IACMnB,EAAS,OAAO,CAACzI,MAAc,CAAC,OAAO,GAAGA,GAAWF,CAAG,CAAC,IACzD,CAAC,GAAG2I,GAAU3I,CAAG;AAAA,MACvB8J,IAAW,wBAAwB;AAAA,IAAA;AAAA,EAE3C;AAAA,EAEQ,cACJzb,GACAM,GACAia,GACI;;AACJ,UAAM5Z,IAAU4Z,EAAQja,CAAK;AAC7B,QAAIK,KAAW,MACf;AAAA,UAAIX,EAAM,QAAQ,YAAa,QAAO,KAAK,KAAKA,IAAOF,IAAAya,EAAQja,IAAQ,CAAC,MAAjB,gBAAAR,EAAoB,KAAK,EAAE;AAClF,UAAIE,EAAM,QAAQ,UAAW,QAAO,KAAK,KAAKA,IAAOoL,IAAAmP,EAAQja,IAAQ,CAAC,MAAjB,gBAAA8K,EAAoB,KAAK,EAAE;AAChF,UAAIpL,EAAM,QAAQ,OAAQ,QAAO,KAAK,KAAKA,IAAOuL,IAAAgP,EAAQ,CAAC,MAAT,gBAAAhP,EAAY,KAAK,EAAE;AACrE,UAAIvL,EAAM,QAAQ,MAAO,QAAO,KAAK,KAAKA,IAAOuY,IAAAgC,EAAQ,GAAG,EAAE,MAAb,gBAAAhC,EAAgB,KAAK,EAAE;AACxE,UAAIvY,EAAM,QAAQ,cAAc;AAC5B,QAAAA,EAAM,eAAA;AACN,cAAMiG,IAAWtF,EAAQ,KAAK,YAAY,CAAA;AAC1C,YAAIsF,EAAS,WAAW,EAAG;AAG3B,QAFiB,KAAK,oBAAoB,IAAA,EAAM,KAAK,CAAC0L,MAClD,OAAO,GAAGA,GAAKhR,EAAQ,KAAK,EAAE,CAAC,IAE9B,KAAK,SAASsF,EAAS,CAAC,EAAG,EAAE,IADnB,KAAK,eAAetF,EAAQ,KAAK,EAAE;AAElD;AAAA,MACJ;AACA,UAAIX,EAAM,QAAQ,aAAa;AAC3B,QAAAA,EAAM,eAAA,GACW,KAAK,oBAAoB,IAAA,EAAM,KAAK,CAAC2R,MAClD,OAAO,GAAGA,GAAKhR,EAAQ,KAAK,EAAE,CAAC,IACrB,KAAK,eAAeA,EAAQ,KAAK,EAAE,IACxCA,EAAQ,YAAY,QAAM,KAAK,SAASA,EAAQ,QAAQ;AACjE;AAAA,MACJ;AACA,UAAIX,EAAM,QAAQ,WAAWA,EAAM,QAAQ,KAAK;AAC5C,QAAAA,EAAM,eAAA,GACN,KAAK,WAAWW,EAAQ,MAAMX,CAAK;AACnC;AAAA,MACJ;AACA,MAAIA,EAAM,IAAI,WAAW,KAAK,CAACA,EAAM,UAAU,CAACA,EAAM,WAAW,CAACA,EAAM,WACpE,KAAK,gBAAgBA,GAAOua,GAASja,CAAK;AAAA;AAAA,EAElD;AAAA,EAEQ,KAAKN,GAAsB2R,GAA4B;AAC3D,IAAIA,MAAQ,WACZ3R,EAAM,eAAA,GACN,KAAK,SAAS2R,CAAG;AAAA,EACrB;AAAA,EAEQ,SAASA,GAAgB;;AAC7B,SAAK,aAAaA;AAClB,UAAM5B,IAAO,KAAK,eAAe,UAC3B,CAAC,GAAG,KAAK,IAAI,iBAA8B,mBAAmB,CAAC,IAC/D,CAAA;AACN,eAAWC,KAAOD,GAAM;AACpB,YAAMzP,IAAQ,OAAO0P,EAAI,QAAQ,KAAK,GAChCuK,IAAUC;AAAA,QACZ,KAAK,aAAa,IAAA,KAAS,CAAA;AAAA,QAC3B,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAAA,MAAA,GAEpCkB,IAAU,OAAO,IAAG5b,IAAAya,EAAQja,CAAK,MAAb,gBAAAR,EAAgB,KAAK,IAAI6R,CAAG;AACtD,MAAA3B,EAAI,WAAW0L,IAAU,IAAI,IACzBA,OAAa,MAAA;AAAA,IACrB;AAAA,EACJ;AAAA,EAEQ,gBACJ1b,GACAua,GACAja,GACI;AACJ,IAAAN,EAAM,eAAA,GACF,KAAK,kBAAkB,QAAM,aAAa,KAAK,cAAc,GACjE,KAAK,aAAaA,EAAM,IAAI,kBAAA,GAC5B,KAAK,iBAAiB,WAAW,MAAM;AACnC,WAAK,YAAY,IACjB,KAAK,iBAAiB;AAAA,IAC1B,GAAG,GAAG;AAEN,UAAM2b,IADa,CAAC,GAAGpB,EAAQ,MAAMja,IAAQ,CAAC,GAAG,GAAGia,EAAQ,MAAM,GAAGja,IAAQ,CAAC,CAAC,EACtD,KAAK,CAAC,EAAC,MAAAiZ,EAAA,MAAUqC,GAAUrC,CAAI,EACnD,kBAAA,EACA,WAAW,KAAK,SAAS,CAAC;AAC/B,IAAIoC,KAAS,QAAM,KAAK,SAASA,EAAM,KAAK,EAAE;AAAA,EAClD;AACJ;AArXIre,EADS6c,IACO,aAA+B,CAAA,IAoK/C7c,EArKS6c,IAqKF,gBAAe,CAACf,IAAUvL,GAAahF,CAAY,IAE1DvL,EAvKS6c,IAuKO,YAAW,cAC3B7c,EAxKS6c,IAwKO,eAAc,SAE9B7c,EA1KS6c,IA0KF,OAAMtZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8MjB,SAASuZ,GAAgCnU,GAA0D;AAE/F,UADe,MAAM,QAAQA,CAAQ,IAAIA,IAAWA,KAAY,OAAO,KAAK,CAACA,CAAQ,GACvE,OAAO,CAAChD,MAAUC,GAAQD,CAAK,KAAKA,EAAM,SAASmW,EAAQ,EAAE,IAAI,CAACnW,MAAU;AACtF,QAAI,CAACC,GAAQD,CAAK,EAAG,OAAM,IAAI,UAAU,0CAA0C;AACnF,UAAMzF,IAAQyF,EAAM;AACpB,WAAO;AAAA,MACH,IAAIzF,EAAM;AAAA,MACV,OAAOA,EAAM;AAAA,MACb,GAAIA,EAAM,aAAa,OAAO,CAAA,IAAK,EAAC,WAAWA,EAAM,UAAA;AAAA,MACrD,GAAIA,EAAM,UAAU,SAAY,CAAA,IAAK,EAAC,OAAOA,EAAM,MAAA;AAAA,MACnD,UAAU4c,GAAgC5c,EAAM,QAAQ;AAAA,IAAA;AAAA,EAEhE,CAAC;AACL;AAEA,SAASgd,GACLlB,GACAgB,GACqB;AACrB,QAAM9H,IAAgC,CAAA,GAChClF,IAAQ,CAAC9L,GAAoCiZ,GAAeoB,MAAyB;AACvF,IAAAra,EAAM,QAAQ,CAAC+X,GAAMjZ,MAAU;;AAC3B,MAAAkS,EAAO,KAAK,EAAC,MAAA+G,GAAM,OAAAkB,GAAO,UAAAoB,GAAU,UAAUvb,IAAQ,GAAG,SAASkB,EAAM,OAAA,CAAO,MAC1E1B,IAAAyZ,EAAK,aAAL,gBAAAzZ,EAAe,WAAU,KAAK,KAAKwa,EAAS,IAAIf,EAAK,EAAE,KACxDjM,EAAMiM,EAAK,YAAY,CAAA,GAAIkB,IAAQ,GAAGlB,EAAK,EAAE;AAAA,IAErD,CAAC;AAAA,EACL;AACA,SAAAjM,EAAMgM,GAAO,GAAG,IAAI,GACb9G;AACX;AAEA,SAAS8I,GAAmBhC,GAA2D;AACnF,QAAM+B,wBAAc,IAAA,GACd7I,IAAgC,CAAA,GAChClF,IAAQ,CAAC9L,GAAoCiZ,GAAeoB,MAAyB;AACvF,IAAAra,EAAM,QAAQ,CAAC+X,GAAMjZ,MAAU;AAC3B,UAAI+a,EAAQ,IAAI9B,EAAK,EAAE,EAAG,OAAM,IAAI,MAAM,2BAA2B,OAAOA,EAAK,EAAE,CAAC,EAAE;AACtF,MAAA8B,EAAQ,IAAI9B,EAAK,EAAE,GACnB/G,EAAO,KAAK,EAAC,MAAA+G,GAAM,OAAAkB,GAAO,UAAAoB,GAAU,UAAUvb,IAAQ,GAAG,SAASkB,EAAM,OAAA,CAAO,GAC/E8L,EAAMiM,EAAK,YAAY,CAAA,GAAIkB,IAAQ,GAAGlB,EAAK,EAAE;AAAA,IACjD,CAAC;AAAA,EACL;AACA,SAAAjM,EAAMgM,GAAO,GAAG,IAAI,GACb9G;AACX;AAEA,SAASoJ,GAAkBrC,GAAgC;AACvD,SAAIA,EAAK,aAAa,OAAaA,EAAK,YACpC,OAAOA,EAAK,SAAU,YAAY,OAAOA,EAAK,SAAU,WAAiB,OAAOA,EAAK,KAAK,IACvF,OAAOA,EAAK,EAAE;AACzB;AAEA,SAASiC,GAAS5V,GAAsBC,GAAgC;AACpE,SAAOD,EAAK,WAAWC,EAAM,UACtBD,EAAK,MAAM,CAACzH,GAAOmC,MAAU,OAAO,GAAGnC,GAAO0H,EAAMvF,CAAK,CAAC,CAAC;AACtE;AAEA,SAASuS,GAA0B1U,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;AAEA,SAASid,GAAiB7X,GAAqC;AAC3D,SAAOA,aAAkB,WAAWA,EAAO,QAAQ,cAAc,KAAK;AAC1E;AC7dA,MAAMuY,KAAkB,CAAC,YAAY,WAAW,QAAQ,OAAO;AAoBxD,MAAMC,UAAe1e,EAAuB;AAAA,EAK/C,YAAYG,IAAqB,IAAI;AACjC,UAAMA,CAAK;AAHN,IAAAF,EAAA;AAIL,aAAK,UAAU,GAAGgB,EAAU,UAAUd,EAAM,EAAE,CAAC,UAC3CA,EAAM,WAAW,QAAQ,OAAOA,EAAM,WAAY;AAClD,YAAM,IAAI,UAAU,mCAAmC;AAAA,EAE/D;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,UAAAyI,IAAW,CAAA;AAAA,MACX,OAAAhG;AAAA,MACA,MAAAwJ,IAAO;AAAA,MACP,UAAA7G,IAAW;AAAA,MACX,SAAAoZ;AAAA,MACA,MAAA/R,IAAO;AAAA,MACP,WAAAgS;AAAA,MACA,OAAAlT,IAAQ;AAAA,MACR,IAAAjI;AAAA,MACA,MAAA9B;AAAA,MACA,OAAAb;AAAA,MACA,OAAAuM;AAAA,MACA,WAAAV;AAAA,MACA,SAAA9D;AAAA,IAAA,IACA,KAAK,OAIHgW,KAHc,MAAM,QAAQjW,CAAQ,IACpCA,EAAS,SAAS,IAClBA,KAAY,QAAQ,OAAOA,KAAa,aACVA,IAAYhG,KAAS,IACnD8B,IAAUkI,IAAQgS,KAAaC,IAAiBA,GAChDC,IAAcvZ,KAAYqH,GAE1B7J,IAAO,KAAK;AAClB,6BAAQA,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAClD,UAAA;AAAA,MAAA,gBAAAkB;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAAS;AAAA,UACA,MAAA9B;AAAA,UACA,OAAOb,KAAS,OAAO,SAAY,OAAOA,CAAK;AAAA,UAC/C,OAAAuM;AAAA,UACA,MAAAjB;AAAA,UACA,UAAU0S;AAAA,UACV,cAAYnS;AAAA,UACZ,gBAAcgS,KAAW,OAAO,OAAO,OAAO,EAAQA,CAAQ;AAAA,UAC9D,aAAW/R,IAAO,SAAS;AAAA,UAC3B,gBAAclB,KAAS,OAAO,OAAO;AAAA,UACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,UAC9C,SAAS,CAAC/I,MAAsB;AAC5B,YAAKmc,KAAa9c,EAAO6G,GAASlG,CAAK;AAAA,UAC3C;AAAA,UACF,UAAA+B;AAAA,QAAA;AAAA,MAAA;AAAA,MACDgH,KAAS,OAAO,OAAO,gBAAA1I,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAAE,EAAA,CAAc;AAAA,IAAA,GAC1E;AAAA,EACJ;AAoFJ;AA5IIzL,EADSye,GACO,aAAYD,KAC5Bxe,EAFSye,GAEO,gBAAe,CAAClT,CAAY,IAyD5CvL,EA3DSye,GA2DO,YAAW,WAE3Bze,EA7DSye,GA6DO,OAAMlb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC1E1B,MAAMub,KAAkB,CAAC,iBAAiB;AAGnC,MAAMC,WAAsBjT,GAAkB;AAAC;AAgB/C,MAAMkT,WAAejf,EAAuB;AAAA,EAU/C,YAAYG,GAAoB;AAC5B,UAAMA,CAAK;AATN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACD,IAAAA,EAAA,uBAA0C;AAC1C,IAAAA,EAAA,wBAAqC;AACrC,IAAAA,EAAA,0BAAmB;AAIvB,SAAK,cAAcmB,EAAmB,MAAMjB,GAAO,IAAO,mBAAmB,GAC7E,KAAK,WAAWc,EAAU,UAAUd,EAAM,EAAE,GAC5C,KAAK,UAAU,GAAG,KAAK,QAAQ,UAC/B,KAAK,gBAAgB,GAAG,KAAK,QAAQ;AAAA,EACzC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,WAAW;AAAA,EAC/B;AAAA,EAEA,SAA2B;AACvB,QAAI,KAAK,MAAM,WAAW;AACtB,YAAM,IAAI,MAAM,6DAA6D;AAEjF,UAAM;AAAA,MACF,OAAAkN;AAAA,MACA,aAAA6R;AAAA,MACA,YAAAC,IAAa,KAAK,mBAAmB,kBAAkB;AAAA,MACvD,iBAAAC,IAAkB;AAAA,MAClB,UAAAxW,IAAW,CAAA;AAAA,IAAC,IACZ,KAAK,OACH,EAAC,SAAAlE,GAAS,SAAAyH,EAAA,IAAWH,GAAuB,UAAUpD,GAAU;AAAA,MAClE,SAASoW;AAAA,IAAA,CACZ,GACKjc,IAAO,KAAK;AAClB,6BAAQA,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAClD,UAAA,gBAAAwD;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,IAAI,KAAK;AAAA,QACT,mBAAiB,KAAK;AAAA,QACtB,oBAAkB4Z,KAAe,OAAO,OAAO,KAAK;AAAA,QACpD,cAAW;AAAA,QACX,KAAK,CAACG,MAAsC,KAAK,gBAAgBA;AAAA,QAEjE,UAAA;AAAA,UAAA,gBAAArc,EAAC,YACG,UAAA,gBAAAA,EAAC,MAAA,EAAG,IAAI,KAAK,SAAU,aAAM,EAAA,CACjC;AAAA,UACCkc,KAAe,OAAO,OAAO,gBAAAlc,EAAC,OAAE,IAAI,KAAK,eACrC,UAAAkc,EAAA,CACL;AAAA,UACA,gBAAAlc,EAAC,iBAAa,UAAA0B,EAAA,CAAQ;AAAA,UACrByH,EAAQ,WAAW,QAAQ,CAACiT,IAAkB,yBAAQ,UAAA,EAClD,UAAA;AAAA,YAAAjT,EAAQ;AAAA,YACRiT,IAAkB,gBAAApc;AAAA,cAAC0b;AAAA,cAAA;AAAA,gBAChB,OAAOS;AAAA,gBACP,SAAS,MAAM,KAAK,aAAA;AAAA,cAAa;AAAA,YAAA,IAChC;AAAA,UAAA,EAAA,CACT;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAER;AAAA,EACJ;AAAA,EAEA,aAAmB;AACf,UAAMG,IAAS,KAAK;AACpB,IAAIA,KAAU,SACd,KAAK,OAAOA,GAAQ,UAAU,CAAC3c,MAAiB;AAC5C,MAAAA,EAAM,eAAA,GACN,KAAK,aAAA;AAAA,IACT,CAAC,GACD,KAAK,OAAO2c,GAAQ,SAAS,MAAM;AAC/B,MAAI,KAAK,YAAY,IAAA,UAAY,YAAY,IAAI,IAAO,sBAAsB,GAC9E,KAAK,YAAA;AAAA,IACT,CAAC,GACD,KAAK,cAAA;AAAA,EACT;AAAA,EAEA,cAAoB;AAChB,SAAK,cAAA;AAAA,EACT;AAAA,EAEA,QAAc;AACV,SAAK,aAAA;AAAA,EACT;AAAA,EAEA,YAAkB;AACd,UAAMA,IAAS,KAAK;AACpB,KAAIA,KAAA,gBAAAA,EAAQ,UAAS,MAAQ,OAAOA,EAAO,SAAU,gBAAmB,MAAA,GACxE,KAAK,YAAA,GACL,KAAK,gBAAgB;AAAA,EACzB;AAAA,EAiFQ,eAAqB;AACzB,IAAK,KAAK,YAAY,SACtB,KAAK,YAAY,IAAI,IAAO,wBAAwB;AAAA,EACxD;AAAA,EAEQ,gBAAsB;AAC1B,UAAMA,IAAS,KAAK;AACpB,QAAIA,KAAU,KAAM;AACpB,UAAMC,IAAa,KAAK,YAAY,IAAA;AACpC,QAAIA,KAAc,CAACD,EAAO,MAAM;AAC5B,YAAMpO,IAAS,SAAS;AACxB,WAAK,iBAAiBA,aAAkB,cAAcA,IAAS,MAC/DsO,GAAUF,CAAM,GAChB,KAAK,mBAAmB,IACxBG,GAAaH,GAAQ,KAAK,MAAM,eAAe;AAC/C;AAAA,IACJ;AACA,QAAI,CAACC,KAAcD,EAAO,MAAM;AAC5B,MAAIA,EAAO,QAAQ,OAAOA,EAAO,SAAU,eAAmB,MAAA,IACzDA,EAAO,gBAAgB,MAAM,GAClC,KAAK,YAAA;AACL;AAAA,IACJ;AACA,IAAI,CAACC,KAAc,KAAK,yBAAuB,YAAA;AAAA,EACnD;AAAA,EAEQ,cAAoB;AACxB,QAAI,CAAC,KAAK,oBAAoB,KAAK,kBAAkB,KAAM;AAC3D,SAAK,mBAAmB;AACxB,UAAMG,IAAU,KAAK;AACrB,SAAK,iBAAiB,OAClBA,KAAA,gBAAAA,EAAS,iBAAgB,MAAMA,EAAQ,MAAA,GAC3C1d,EAAO,KAAK,MAAM,OAAO;AAAA,EAC7B;AACJ;AA5MI/B,EADSgf,IACO,aAAYF,KA2F5B9e,EA5FSgf,IA4FO,YAAW,WAC3Bhf,EA7FSgf,IA6FO,gBAAe,CAACP,GAAQM,EAAa,IAErD/e,EA/FSgf,IA+FO,OAAMzb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgH1B,SAASgc,GAAUF,GAAiC;AAChD,MAAI,CAAAA,EAAO,MACX;AAAA,QAAI,OAAOA,EAAO,aAAc,YAAY;AACxC,MAAAA,EAAO,UAAA;AACP;AAAA,IACJ;AACA,IAAAA,EAAO,aAAa,QAAQ,EAAE;AAAA;AAClC;AAEA,SAASG,GAAaH,GAA2BK,GAAyC;AAItF,QAAMzZ,KAHayZ,KAAO,QAEpB,OAAOA,KAAQ,aADf,OACmCA,EAAI,YAChBL,EAAO;AAAA,IAChC;AAAA,EAAA;AAEJ,EAAApZ,KAAA,QAAAA,EAAQ;AACZ;ACpPO,MAAM0Z,IAAN,MAAMA,UAAqBvJ,EAA0B;AAAA,EAYxD,YAAYlW,IAA2B,IAAI;AACvC,UAAM,EAAC,GAAGA,GAAO,SAASyf,EAAa,SAAQ;AAAA,EACnD;AACJ;AAdI3f,EADS2f,GACO,YAAW,iBAE3B3f,EAHS2f,GAGF,WAAU;AAAA,EACb,CAAC,KAAKhf,EAAW,IAAI;AAAA,EACrB,CAAC,KAAKA,EAAW,OAAO;AAAA,EACxB,CAAC,KAAKA,EAAW,MAAM;AAAA,EACvB,CAAC,KAAKA,EAAW,OAAO;AAAA,IAG5BX,EAVS2f,GAUF,wBAAuBhf,EAAW;AAVtC,IAAMif,KAAND;ACJA,MAAME,IAAN,MAAMA,UAAoBzJ,EAA0B;AAAA,EAWvD,YAAYlW,IAA0B,IAAI;AACtC,UAAM,EAAC,GAAGA,GAAO,SAAS2f,EAAY,SAAQ;AAAA,EAClD;AACJ;AAbI7f,EADS6f,GACO,YAAW,gBAE3B7f,EAHS6f,GAGF,WAAU;AAAA,EACb,CAAC,KAAKlf,EAAW,IAAI;AAAA,EACrB,CAAC,KAAKA,EAAW,OAAO;AAAA,EACxB,CAAC,KAAKA,EAAW,MAAM;AAAA,IAG3BX,EATS6f,GASF,wBAAuBlf,EAAW;AATtC,IAAMmf,KAAND;ACHA,MAAeE,WAEZhgB,EAAkB;AA4B5B;AA3BIC,EAHkB+f,IAGF,OAAMxc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACFnB,MAAeyc,WAEZD,GAA4B;AAqJtC;AApJI/f,EAHkBggB,IAGF,OAAMzc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACc1B,MAAM0c,KAAoB,CAAC,YAAY,YAAY,QAAQ,OAAO;AAkB3D,MAAMC,WACDF,GAAqC;AAAA,EAS7C,YAAY9f,IAA+B,IAAI;;AAC3C,UAAMA,CAAK;AAPN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AAIb,SAAK,UAAUgB,EAAU,YAAYd,EAAM,EAAE,GAC7C,KAAK,UAAU,GAAG,KAAK,OAAO;AAC9B,UAAMigB,IAAkBjgB,EAAM,WAAW,CAAA;AACzC,IAAIqV,GAAqD4K,CAAe,KACpE,KAAK,iBAAiBA,GACtB,KAAK,qBAAqB,OAE1Bje,GAAsCie,CAAe,GACrD,KAAK,iBAAiB,IAAI1e,EAA2C0e,GAAiB;AAAA,MAClF,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,qBAAqB;AAI9B,UAAMC,MAAa5d,IAAA,KAAK,eAAe,MAAM,CAAC,MAA3B,gBAAAA,EAA8B,UAAS;AAC1D,SAAK,eAAerB,EAA2B,MAAMjB,GAAOkgB,GAAY,gBAAgB;AAAA,EAC5F;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,cAAc,KAAK,cAAc;AAAA,EACrD;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,OAAAzd;AAAA,MACA,MAAAjB;AAAA,MACA,UAAA4D,IAAW;AAAA,MACX,UAAA+G,IAAW;AAAA,MACX,MAAAM,IAAO;AAAA,MACP,OAAAlB,IAAQ;AAAA,MACR,aAAA4U,IAAc,KAAK,mBAAmB,qBAAqB;AAAA,MAC3D,WAAA3T;AAAA,IAAA,IACA,KAAK,OACHlL,IAAU,KAAK,eAAe,IAAA,KAAS,CAAA;AAC7C,IAAAU,GAAsCV,CAAO;AAC7C,UAAM8e,IAAe,KAAK,aAAa,IAAA,GACjCC,IAAe,KAAK,eAAe,cAAA,GACnCC,IAAa,CAAC,KAAK,uBACjBD,MAAiB5K,EAAW,WAAW4K,MAAiB5K,EAAW,UACrE8K,IAAiB,CAAC,KAAK,sBAAsBF,MAAiB5K,EAAW,OACzEoH,IAAc0D,IACd,KAAK,eAAe,aACpB,MACAC,IAAiBjV,MAAUgV,IAC3B1D,KAAe,KAAK,mBAAmB,mBAAmB,IAC1D,OACA4D,IAAShU,KAAQ6T,GAEjB1d,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,WAAW,KAAK,UAAA;AAAA,QAEf,UAAA;AAAA,UAAAH,KAAS,OAAO,OAAO,gBAAAI,EAAC,WAAM,SAAS,KAAK,SAAU,UAAAJ,EAAA,CAAM;AAAA,4BAC5D,mBAAA,EACG,UAAA,gBAAA0C;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,KAAK;AAAA,cACT,MAAA3D;AAAA,cACA,OAAO4e,KAAgB,OAAO,KAAK,OAAOA,CAAY;AAAA,cACtD,UAAAhb;AAAA,cACA,UAAA+G;AAAA,cACA,cAAY1J,KAAS,OAAO+J,IAAY;AAAA,cACxC,aAAWiU,IAAS,SAAS;AAAA,cAC7B,gBAAcD,KAAkB,OAAO,OAAO;AAAA,cAC9C,oBAAkBA,KAAkB,OAAO,OAAO,KAAK;AAAA,cACvD,UAAU,CAAChe,MAAiB,KAAK,aAAaA,CAAK;AAAA,cAElD,UAAA;AAAA,gBAAA4d,KAAgB,QAAQA,MAAiB,KACpC,gBAAAvd,EAAC,UAAA,EAAO,OAAM,IAAG,UAAUsJ,GAAU,UAAU,IAAO,UAAAgU,EAAA,CAAY,IAClE;AAAA,gBACL7e,EAAQ,IAAI,CAAC0P,MAAW;AACrB,sBAAIA,KAAU,QAAQ,CAAC,OAAO,OAAOA,GAAQ,OAAO;AAChD,0BAAM,IAAI,UAAU,iDAAiD;AAEzE,yBAAO,gBAAAnO;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBAEJ,OAAO,OAAOmO,EAAO,KAAK;AAAA,sBAC1B,UAAU,EAAQA,EAAO;AAAA,sBACzB,UAAU,OAAO,GAAGoP,GAAcpP,EAAO,KAAK;AAAA,sBAChD,UAAA,KAAK,YAAYA,CAAM;AAAA,oBAAA;AAAA,oBAJhB,OAAOA,EAAO,KAAK;AAAA,kBAAA;AAAA,gBAKhC,CAAC;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,GAET;AAAA,UACCwP,KAAkB,OAAO,OACpB,gBAAA3d,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAOmV,EAAA,CAAgB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAErE;AAAA;AAAA,EAGU,YAAoB;AAC1B,WAAO7e,EAAe,KAAK,KAAK;AAAA,EACpC;AAAA;AAAA,EAGU,YAAYqP,GAAkD;AACpE,WAAOA,EAAO,SAAS,OAAOA,EAAO,KAAK;AAAA,EAC9C;AAAA;AAAA,EAGU,aAAaxO,GAAoB;AACvC,UAAM2F,IAAMuY,GAAWle,GAAO,iBAAiB,GAEzCwO,KADU,KAAK,eAAe,IAAA,KAAS,CAAA,GACtB,KAAK,CAAC,EAAC,OAAArQ,QAAW,OAAOA,CAAK,MAAMwH,CAAG,GAGxDmO,KAAYtF,KAAA,gBAAAA,EAAQ,UAAS7I;AACnC,SAAK,aAAa,IAAImO,GAAW,oBAAoB,GACrD,KAAK,WAAWA,GAAWtF,GAAQxO,CAAK;AAAA,EAC5C;AAAA;AAAA,EAGU,WACN7B,GACAggB,GACAne,GACI;AACJ,IAAAX,EAAO,KAAK,MAAM,UAAUlB,GAAO6B,CAAK;AAAA,EAC5C;AAKJ;AArII1C,EAFSkgB,IAEO,aAAYD,KAC5BjgB,EAHSkgB,IAGO,gBAAe,CAAC3U,CAAY,IAiI5CvL,EApISkgB,IAoIO,YAAW,aAE3BlgB,EAtISkgB,IAsIO,OAAM;AAG1B,SAAS3K,GAA0B1U,GAA2D;AAC1F,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM,cAC3C,OAAO,QAAQ,IAAIA,GAAO,eAAe,KAAM,cAC/C,OAAO,QAAQ,IAAIA,GAAO,UAAU,KAAM;AACrD;AAEA,SAAS+f,GAAWle,GAAcrB,GAAyB;AACvD,QAAM4E,IAASvD,EAAM;AACrB,MAAIuD,KAAU,QAAQ,OAAO,QAAQ,IAAIA,GAAQ,OAAO,KAAM;AAC1D,UAAM,IAAI,UAAU,GAAG5E,CAAO,wCAAwC;AAE1E,SAAO,QAAQ,IAAI4E,GAAQ,OAAO;AACtC;AC5LA,MAAM6a,KAAiB,CAAC,MAAM;AASvB,MAAMC,WAAchhB,EAAsB;AAAA,EAG7C,SAA2B;AACvB,UAAM,EAAC,MAAAihB,GAAM,SAAAC,GAAS,UAAAtY,EAAA,IAAY,KAAK;AACvC,WAAO,gBAAA5F;AAAA,MAAC;AAAA,MAAA;AAAA,QACJ,WAAWlB,EAAe,KAAK,KAAK,KAAK;AAAA,QACzC,SAAAof;AAAA,QACA,sBAAmB;AAAA,QAElB,UAAAD,KAAQrY;AAAA,MAAA;AAAA,IAAA;AAAA,EAEjB;AACJ;AAZI3I,EADS+gB,IACO,aAAYD;ACShC,MAAMI,KAAuB,CAAC,WAAW,YAAY,YAAY,QAAQ,OAAO,GAC1EC,KAAsB,CAAC,YAAY,YAAY,QAAQ,OAAO;AAiB7D,MAAMC,UAAoBlL,GAAmC;AAAA,EAMhE,YAAYhW,IAA0B,IAAI;AACtC,UAAMA,CAAK;AAJN,IAAAF,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUgB,EAAU,SAASd,EAAM,EAAE,GAC1C,KAAK,UAAU,GAAG,KAAK,OAAO;AAAA,EAClC;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,OAAAyC,IAAQ,KAAK,MAAM,SAAS,KAAK,mBAAmB,kBAAkB;AAAA,MACtE,SAAAsU,IAAU;AAAA,MACV,UAAA3R,IAAW;AAAA,MACX,UAAA+G,IAAW;AAAA,MACX,MAAAM,IAAO;AAAA,MACP,OAAAlB,IAAQ;AAAA,IAAA,IACR,KAAK,OACH3I,IAAO,KAAK;AAClB,6BAAQA,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAClD,UAAA;AAAA,MAAA,gBAAAwD,EAAC,SAAA,EAAM,SAAS,KAAK,SACjB,UAAA;AAAA,QAAA,gBAAAtC;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,IAAI,KAAK;AAAA,YACT,MAAK;AAAA,YACL,MAAM,KAAK,MAAM;AAAA,YACjB,OAAO,KAAK,MAAM,SAAS,OAAO,SAAY,OAAO,KAAK,MAAM,KAAK;AAAA,YACrE,SAAAkU;AAAA,YACA,UAAA3R;AAAA,YACA,UAAA+G;AAAA,YACA,aAAWM,IAAO,SAAS;AAAA,YAC3B,gBAAclB,KAAS,OAAO,OAAO;AAAA,YACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,YAC9C,UAAU,CAAC/I,MAAiBX;AAAA,cAAO,KAAK,MAAM;AAAA,cACzCW,EAAM,cAAmC;AAAA,cAASA;AAAA,YAAA;AAAA,UAAK;AAAA,QAAA;AAAA,QAEhE,gBAAAK,EAAC,kBAAA,EAAe,eAAY,OAAA,CAAO;AAAA,QAClCJ;AAAA,MAAA,GACL;AAAA,MACC8I,KAAS,OAAO,OAAO,gBAAA1I,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAAE,EAAA,CAAc;AAAA,IAAA,GAC1E;AAAA,EACJ;AAiBJ;AA3DIzL,EADSohB,GACO,aAAYF,KAC5BlhB,EAFSohB,GAEO,gBAAe,CAAC7V,CAAY,IA2C5CvL,EA7CSohB,GA6CO,YAAW,iBAE3BphB,EA/CSohB,GA+CO,OAAM7d;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCnB,MAAM8d,WACDthB,EAAmC;AAAA,EAQ3C,YAAYG,IAAiC,IAAI;;AAC7C,UAAMA,CAAK;AALN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIL,UAAMwB,IAAUtB,EAAM,WAAW,CAAA;AACjC,IAAAohB,GAAqB9f,CAAO;AAC5B,UAAM4e,MAAa5d,IAAAhB,EAAQ,CAAC,MAAT,gBAAAgB,EAAa,OAAM;AACtC,SAAK,eAAerB,EAAmB,MAAMjB,GAAOkgB,GAAY,mBAAmB,GACnF,KAAK,UAAUpf,EAAU,eAAed,EAAM,EAAE,GAChD,KAAK,UAAU,GAAG,KAAK,OAAO;AAAA,EAClC;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,SAASgF,GAA0C;AAC/C,UAAM1D,IAAU0D,EAAU,WAAW,CAAA;AACrC,WAAAoc,GAAqB9f,CAAO,GAC5B,MAAM,SAAS0D,CAAS,GACxB,KAAK,2BAA2B1D,CAAO,GAChC;AAAA,EACX;AAAA,EAEA,aAAaX,GAAe6B,IAAsB,MAAY;AAC1D,IAAI,KAAK,MAAM,aACf,KAAK,aAAa,IAAI7B,GAAO,uBAAuB,GACpDkB,EAAO,KAAK,MAAM,UAAUlB,GAAO6B,CAAK;AAAA,EAC5C;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,SAAAlB,IAAU,CAAA;AAAA,MACV,OAAAmB;AAAA,MACA,UAAA2C,IAAW;AAAA,MACX,UAAA+G,IAAW;AAAA,MACX,MAAAM,IAAO;AAAA,MACP,OAAAlB,IAAQ;AAAA,IAAA,IACR,KAAK;AACT,IAAA6V,GAAqB9f,CAAO;AAC5B,UAAM+f,IAAgB,KAAK,aAAa,IAAA,GAClCze,IAAO,KAAK;AAClB,WAAO,gBAAAuC;AAAA,MAACvC;AAAA,MAAA;AAAA,QACJ,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QAEzC,UAAA;AAAA,UAAA,gBAAAwD;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,IAAI,KAAK;AAAA,cACT,UAAAC;AAAA,cACA,cAAY3C,KAAS,OAAO,KAAK,MAAM,YAAY;AAAA,cACnD,iBAAe0J,IAAW,SAAS;AAAA,cACnC,aAAWM,IAAO,SAAS;AAAA,cAC3B,gBAAclB,KAAS,OAAO,OAAO;AAAA,cACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,cAE7C,UAAA;AAAA,gBAAA9I,KAAS,OAAO,OAAO,gBAAAI,EAAC,UAAA,EAAQ,UAAAJ,GAAM;AAAA,gBACtCnB,EAAQ,IAAI,CAAC,CAACX,GAAOkX,CAAW,GAAG/U,MAAU,gBAAAD;AAAA,kBAACqe;AAAA,kBAAA;AAAA,oBAE3C,IAAI,GAAG,KAAK,OAAO,IAAIpe,CAAK;AAAA,oBAC5B,MAAM,KAAK,MAAM,QAAQ,KAAK;AAAA,oBAC9B,OAAAnC;AAAA,oBACA,OAAOkX;AAAA,oBACP,SAAS,OAAO,GAAGwJ,GAAe1gB,CAAK;AAAA,oBACvC,UAAAyE;AAAA,oBACA,UAAA+G;AAAA,oBACA,MAAMM,KAAQlB,KAAS;AAAA,oBACvB,UAAU,CAACwL,GAASvU,MAAU;AAC1B,sBAAIuU,KAAS,KAAK,aAAapW,GAAO6B,CAAK;AAAA,oBAC/C;AAAA,kBAAA;AAAA,kBAXK,OAAO7B,CAAK;AAAA,gBAAA,CAYnB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEL4K,KAAS,OAAO,OAAO,gBAAA1I,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAAE,EAAA,CAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAE9E;AAAA,EA2CQ,2BAA2BjK,GAA+C;;AAC9E,IAAKA,EAAQ,KAAK,CAAC,CAACX,CAAK,MAAM,OAAO,GAAGA,GAAO,KAAK,aAAa,IAAA,CAAK,CAAC,KACpE,KAAK,aAAa;AAAA,QAAI2B,IAAAhB,EAAQ,CAAC,MAAT,gBAAAgB,EAAa,OAAM;AAAA,MACrC;AAAA,IAAA;AAAA,EAEZ;AACJ;AA9HIxC,EAFSqhB,IAEF,gBAAe,CAACD,GAAa7V,CAAY,IAChDvL,EAHSqhB,IAGO,aAAYF,KA8E5BnhB,EAjFSqhB,IAiFO,YAAW,gBAE3BrhB,EAnFSqhB,IAmFO,OAAM9d;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+C1B,SAAS+d,GACL9f,GACiD;AACjD,EAAAU,GAAuBV,GAAS,qBAAqB;AACrD,aAAW0P,KAAU1P;AACjB,QAAI,CAAC,MAAM,QAAQ0P,CAAM,KAAKA,EAAO,SAAS;AAC1C,YAAM,IAAI,UAAU,mDAAmD;AAGnF;AC3PA,MAAMsQ,KAAmB,CAAC,YAAY,YAAY,YAAY,QAAQ,OAAO;AAyBtE,MAAMC,WAAgB1B,GAAkC;AAAA,EAO3D,YAAY7f,IAAsB,IAAI;AAClC,UAAMA,CAAK;AALN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIL,SAAK,UAAUgB,EAAU,WAAWd,EAAM,EAAE,GAC5C,KAAK,UAAU,GAAG,KAAK,OAAO,UAC9B,KAAK,eAAeiB,EAAmB,MAAMjB,GAAO,IAAI,eAAe;AAAA,EAC3E;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,OAAAyC;AAAA,MACA,aAAA0d;AAAA,MACA,MAAAlU,IAAO;AAAA,MACP,MAAAzK;AAAA,MACA,UAAA4D,IAAW;AAAA,MACX,UAAA+G,IAAW;AAAA,MACX,UAAAqV,IAAW;AAAA,MACX,MAAA/U,IAAO;AAAA,MACP,OAAAlB,IAAQ;AAAA,MACR,cAAAkW;AAAA,MACA,WAAAC;AAAA,MACA,WAAAC;AAAA,MACA,WAAAC;AAAA,MACA,SAAAC;AAAA,MACA,WAAArV;AAAA,MACA,UAAAsV;AAAA,MACA,SAAAC;AAAA,MACA,UAAAC;AAAA,IAAA,IACA,KAAK,OACHrhB,IAAQ,KAAK,aAAa,IAAA,KAAS,IAEnCiC,IAAO,KAAK;AAClB,6BAAQA,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MACjD,UAAA;AAAA,MAAAc,KAAS,OAAO,OAAO,gBAAAI,EAAC,WAAM,SAAS,KAAK,SAAU,UAAAJ,EAAA,CAAM;AAAA,MAC7D,gBAAAI;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAI,KAAK;AAAA,UACT,MAAArB;AAAA,UACA,MAAAyK;AAAA,UACA,OAAAtL;AAAA,UACA,aAAAwf;AAAA,UACA,UAAA/a;AAAA,UACA,UAAA+G;AAAA,UACA,UAAAqV;AAAA,UACA,cAAAC;AAAA,UACA,WAAAC;AAAA,UACA,WAAAC;AAAA,UACA,WAAAC;AAAA,UACA,SAAAC;AAAA,UACA,KAAKC;AAAA,UACL,cAAYrf,KAAS,OAAO+J,IAAY;AAAA,UACxC,aAAWC,IAAO,SAAS;AAAA,UAC3B,gBAAclB,KAAS,OAAO,OAAO;AAAA,UACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,UAC9C,SAAS,CAAC/I,MAAiB;AACvB,kBAAM8T,IAAYoK,GAAWle,GAAO,eAAe;AACnD,iBAAK,aAAa,IAAI8T,GAAW,eAAe,GAChDzU,EAAOkgB,GAASzL,GAAW9T,CAAK;AAAA,UACpC;AAAA,UACA,UAAU,CAACA,MAAiBX;AAAA,YACxBmgB;AAAA,YACAtB,GAAWle,GAAO,gBAAgB;AAAA,YAClCA;AAAA,UAAA;AAAA,QACJ;AAAA,MAAA;AAAA,MAEH+I,KAAS,OAAO,OAAO,gBAAA1I,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAAE,EAAA,CAAc;AAAA,IAAA,GAC1E;AAAA,EACJ;AAiFJ;AA5JIzL,EADSyhB,IACO,aAAYD,KAC5BxhB,EAFSyhB,IAEO,gBAAe,CAAClW,CAAY,IA4E5CvL,EA9ESyhB,IA8EO,YAAW,YAE3BzhB,EAhFSyhB,IAgFO,OAAMle;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+E1B,SAASqd,GAAWle,GAAcrB,GAAyB;AACvD,QAAM4E,IAASvD,EAAM;AACrB,MAAIuD,KAAU,QAAQ,OAAO,QAAQ,IAAIA,GAAQ,OAAO,KAAM;AAC1D,UAAM,IAAI,UAAU,GAAG5E,CAAO,wCAAwC;AAE1E,SAAO,QAAQ,IAAI4E,GAAQ,OAAO;AACtC;ACxLA,MAAMkc,KAAkB,CAAC,YAAY,YAAY,QAAQ,OAAO;AAgBzD,MAAMC,WAA4CrC,GAAyC;AAAA,EAQ9F,YAAY7f,IAA6B,IAAI;;AACzC,UAAMA,CAAK;AANN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIL,UAAMwB,IAAUtB,EAAM,WAAW,CAAA;AACjC,IAAAmiB,GAAsB7gB,CAAO;AAC7B,UAAM4e,MAAa5d,IAAAhB,EAAQ,CAAC,MAAT,gBAAAgB,EAAa,OAAM;AAGtC,SAAK,eAAerB;AAAA,MAChB;AAAA,MACAjB;AAAA,MACAkgB,KAAc;AAAA,MACd;AAAA,IAAA,GAEJ,KAAK,UAAUpf,EAAU,UAAUd,EAAM,EAAE,GAC3C,KAAK,WAAW,GAAG,KAAK,OAAO,UAC/B,KAAK,UAAU,GAAG,KAAK,OAAO;AAAA,EAClC;AAAA,EAEA,aAAmB;AACf,SAAK,2BAA2B,KAAK,MAAM,WAAW,CAAA,CAAE,GACxD,KAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,SAASgF,GAAsC;AAC3C,UAAM1D,IAAU0D,EAAU,WAAW,CAAA;AACrC,WAAAmd,GAAsB7gB,CAAO,GAC7B,MAAM,SAAS0D,CAAS,GACxB,KAAK,2BAA2B1D,CAAO,GAChC;AAAA,EACX;AAAA,EAEA,aAAaX,GAAe6B,IAAsB,MAAY;AAC1D,IAAI,KAAK,MAAM,aACf,KAAK,aAAa,IAAI7B,GAAO,wBAAwB,GACrDkB,EAAO,KAAK,MAAM,UAAUlB,GAAO6B,CAAK;AAAA,EAC5C;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,SAAAlB,IAAU,CAAA;AAAA,MACV,OAAAmB;AAAA,MACA,UAAA2C,IAAW;AAAA,MACX,UAAA+G,IAAW;AAAA,MACX,MAAAM,IAAO;AAAA,MACP,OAAAlB,IAAQ;AAAA,IAAA,IACR,KAAK;AACT,IAAA4W,GAAsB7gB,CAAO;AAC7B,UAAM+f,IAAgB,KAAK,aAAa,IAAA,GAClCe,IAAgB,KAAK;AAAA,MAAI;AAAA,MAC3B9gB,EAAQ,UAAU,CAAC,CAACX,CAAK,MAAM,OAAO,GAAGA,GAAO0gB,CAAa,CAAC;AAAA,IAAA,GAE5Dze,IAAO,KAAK;AAClB,WAAO,gBAAAuC,EAACvC,GAAA,EAAK,IAAI,KAAK,SAAS,WAAWjB,EAAe,KAAK,KAAK,KAAK,MACnE,UAAA;AAAA,MAAAc,KAAS,OAAO,OAAO,gBAAAI,EAAC,eAAU,IAAI,KAAK,UAAW,UAAAJ,EAAA,CAAM;AAAA,MAC7D,gBAAAI;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,MAAK;AAAA,UACL,cAAYJ,KAAS,OAAO,KAAK,MAAM,YAAY;AAAA,UACnD,mBAAiBA,KAAS,OAAO,OAAO,KAAK;AAAA,UAC7C,iBAAe0J,IAAW,SAAS;AAAA,UACnC,aAAWM,IAAO,SAAS;AAAA,UAC3B,gBAAclB,KAAS,OAAO,OAAO;AAAA,UACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,UAChD,YAAQ,IAAI,CAAC,CAAC5K,GAAOkX,CAAW,GAAG/U,MAAU,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cAE5C,MAAK;AAAA,cACL,MAAK;AAAA,cACL,UAAAuC;AAAA,cACA,gBAAc,OAAO,GAAGic,GAAe1gB,CAAK,IAAI,SAAS;AAAA,cACzD,UAAUmC,MAAUsf,IAAgB,IAAI;AAAA,cACxC,SAAS,CAAC5f,MAAsB,KAAK,aAAa7B,GAAO6B,CAAK;AAAA,cAC9D,WAAW,CAACA,MACR,KAAK,cAAcA,GAAOM,GAAOxB,CAAO;AAAA,cAC9C,UAAAuW;AAAA,YAAA;AAAA,YATO,OAAOlX,CAAK;AAAA,UAAA,CASE;AAAA,QAAA;AAAA,MAAA;AAAA,MACtB4K,KAAS,OAAO,OAAO,gBAAA1I,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAAE,EAAA,CAAc;AAAA,IAAA,GAC1E;AAAA,EACJ;AAAA,EAEA,cACI/I,GACAM,GACAxB,GACI;AACJ,UAAM,EAAC,KAAA6S,MAAO3R;AACd,QAAIwQ;AACJ,QAAImB,MAAQ,gBAAgBA,MAAQ,YAAa,CAAAnB,KAAalQ,IAAQ,KAAKxB,EAAQ;AAAA,aAC1E6S,MAAQ,eAAeA,MAAQ;AACpC,MAAAnB,KAAalQ,IAAQ,IAAIxB,EAAQ,UAAUA,EAAQ;AAAA,aAC5C6S,MAAQ,OAAQ,CAAAnB,IAAY;AAAA,aAC9BmB,MAAQ,MAAO,CAAAnB,IAAY1R,EAAQ,SAAS;AAAA,QAChD;AAEL,IAAAkB,EAAM,eAAA;AACN,UAAMwO,IAAS1P,EAAQ0R,CAAS;AAChC,QAAIhC,KAAU,SACd,KAAK,aAAaA,EAAO,CAAC,GAAGxO,CAAK,GAC9B,KAAK,eAAe,UAAS;AAC7B,YAAM6f,IAAQ,KAAK,IAAI,iBAA8B,gBAAgB,EAAErP,CAAS;AAChF,MAAAqP,KAAA,QAAAA,EAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEQ,2BAA2B/gB,GAAgD;;AAC/E,IAAKA,EAAQ,KAAK,CAAC,CAACX,CAAK,MAAM,OAAO,GAAGA,GAAO,KAAK,aAAa,IAAA,CAAK,CAAC,KACpE,KAAK,aAAa;AAAA,QAAI2B,IAAAhB,EAAQ,CAAC,MAAT,gBAAAgB,EAAa,OAAM;AAAA,MACrC;AAAA,IAAA;AAAA,EAEZ;AAsKJ;AAvRIxC,EADSoiB,IACO,aAAYD,KAC5BniB,EAFSoiB,IAEO,gBAAe,CAAC7W,CAAY,IAkH5CvL,EApHSoiB,IAoHO,YAAW,WAE3BpiB,EAtHSoiB,IAsHO,OAAM7e;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoK1B,SAAS8e,GACL7gB,GACkD;AAClD,EAAAU,GAAuBV,CAAO;AAC9B,aAAW0P,KAAU1P;AACjB,QAAI,CAAC,MAAM,QAAQ0P,CAAM,KAAKA,EAAO,SAAS;AAC1C,YAAM,IAAI,UAAU,8CAA8C;AAG9E;ACzTA,MAAMsR,KAAyB,CAAC,YAAY,YAAY,YAAY,QAAQ,OAAO;AAwC5E,MAAeC,UAGZ1C,GAA4B;AAAA,EAalC,YAAY7f,GAAe;AACvB,UAAMA,CAAK;AAXN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAUL,UAAM0iB,IAAY,KAAK,YAA2C;AAClE,SAAK,UAAU1hB,EAAU0hB,KAAY,YAAYxiB,EAAM,EAAE,GACzD,KAAK,UAAU,GAAG,KAAK,OAAO,UAC9B,KAAK,eAAeiB,EAAmB,MAAMjB,GAAO,MAAM,GAAGwiB,KAAY,UAAU,QAAQ;AAAA,EAC/F;AAAA,EAEA,aAAmB;AACf,SAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEQ,YAAYhgB,GAAoB;AAEpC,UAAM2F,IADQ3F,EAAM,cACF,OAIZigB,IAAQta,MAAQ,MAAM,KAAK,aAAaA,CAAG,GAC3CxH,IAAQ8hB,KAASta,MAAQ,KAAKA,IAAgB;AACpD,IAAIsa,KAAS,KAAK,aAAa,IAAA,MAAU9hB,KACrC,KAAK,aAAa,IAAIA,GAAO,GAAG,KAAK,SAAS,QAAQ;AAE1D,UAAM,EAAC,SAAAohB,GAAS,UAAAC,EAAA,IAAY,KAAK;AACjC,IAAIxf,EAAM,SAAS,UACfX,EAAOkgB,GAASphB,GAAO6B,CAAK,IACrBA,EAAM,SAAS,YACtBX,EAAOmgB,GAAUrhB,GAAO6B,CAAK;AAAA,EAErC;AAAA,EAEA,SAA2B;AACvB,UAAM;AAAA,MACF,OAAAC;AAAA,MACA,WAAA+J;AAAA,MACA,MAAAhL;AAAA,MACA,cAAAigB;AAAA,MACA,UAAArc,IAAW;AAAA,MACX,UAAA+G,IAAW;AAAA,MACX,UAAAqV,IAAW;AAAA,MACX,MAAA/U,IAAO;AAAA,MACP,OAAAlB,IAAQ;AAAA,MACR,KAAAmX;AAAA,MACA,KAAAC;AAAA,MACA,MAAAC;AAAA,MACA,UAAAd;AAAA,IAAA,IACA,KAAK,OACHnhB,IAAQ,KAAK,aAAa,IAAA,GAE1BiC,IAAO,KAAK;AAClB,6BACKA,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAC1C,UAAA;AAAA,MAAAc,KAAS,OAAO,OAAO,gBAAAI,EAAC,WAAM,SAAS,KAAK,SAAU,UAAAJ,EAAA,CAAM;AAAA,MAC7D,gBAAAI;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAI,KAAK;AAAA,UACT,MAAArB;AAAA,UACA,MAAM,KAAK;AAAA,UACX,OAAOb,KAAS;AAAA,UAChB,KAAA+hB;AAAA,UACA,KAAAC;AAAA,UACA,MAAAC;AAAA,UACA,cAAAnB;AAAA,UACA,UAAArc;AAAA,UACA,UAAA+G;AAAA,UACA,UAAAqV;AAAA,UACA,KAAKM;AAAA,UACL,cAAYrf,KAAS,OAAO+J,IAAY;AAAA,UACxC,aAAWC,IAAO,SAAS;AAAA,UAC3B,gBAAclB,KAAS,OAAO,OAAO;AAAA,UACrC,oBAAkBA,KAAS,OAAO,OAAO,KAAK;AAAA,UAC9C,SAAS,CAAC/I,MAAiB,KAAK,YAAYA,CAAK;AAAA,UACjD,UAAU,CAACA,MAAiB,KAAK,YAAYA,CAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAErD+I,KAAS,OAAO,OAAO,gBAAA1I,EAACwI,KAAa,IAAI,KAAK,SAAS,OAAAE,EAAA,CAAc;AAAA,IAAA,GAC1E;AAAA,EAER;AA2EJ;AAnKIzL,EAJkByiB,GAIF,aAAYD,KAC5BxiB,EALkByiB,GAKF,gBAAe,CAAClX,CAAY,IAyF5CvL,EA9FkByiB,GA8FF,OAAMlf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AClJ1B,MAAMwf,KAAqB,6BAErBC,KAAmB;AAgBlB,SAASC,GAAYpiB,GAAoC;AAC5D,SAAI,OAAOA,KAAU,WAAiB,KAC/BkiB,GAAmB,KAAKliB,CAAK,KAAKqiB,GAAeriB,CAAK,KAAK;AACtE;AAGO,SAASqiB,GAAeriB,GAAqE;AAChG,MAAIA,KAAS,KAAM,QAAO;AAC1B,QAAMwd,IAAQ0E,GAAmB,KAAKliB,CAAK;AAC3C,MAAIwd,KAAS,KAAM,QAAO;AAC1B,QAAM8E,IAAO,OAAO9E,EAAM,CAAC,CAAC,GACtB+E,IAAQ,OAAO/E,EAAM,CAAC,CAAC,GACvBgF,IAAM,OAAOhF,EAAM,CAAC,CAAC,GACrBiF,IAAe,KAAK,IAAIH,GAAMC,IAAQ,GAAGC,CAAG,GAC5CE,IAAS,IAAI,KAAKD,CAAY;AACpC,SACI,OAAO,MAAMA,CAAY,KACtBC,EAAO,qBAAqBJ,KAC5BI,EAAO,YAAA,MAAkBH,IAAQ,KACjCG,EAAO,WAAA,MAAiBF,IAEpB,OAEJ,EAAC,MAAAF,GAAM,OAAAC,GAAO,KAAAC,EAAA;AACzB;AAGO,SAASG,GAAgBC,GAAkC;AAC9D,QAAMN,IAAO,OAAOM,EAAM,IAAI,EAAE,SAAS,GAAG,GAAG,GACzCL,IAAQ,OAAOK,EAAM,KAAK,EAAE,SAAS,GAAG,GAAG,GAC3CJ,IAAM,OAAOI,EAAM,GAAG,EAAE,SAAS,GAAG,GAAG,GACvClP,IAAY,GAAG4O,CAAI,IAAIC,CAAK,IAAIC,CAAG;AACzC,MAAIH,GAAe3O,CAAS,KAAK;AAC7B,UAAM,IAAI,UAAU,uBAAuBA,CAAS,EAAE;AAE1D,SAAOA;AACX;AAGO,SAASmP,GAAe7iB,GAA0B;AACrD,QAAM4iB,IAAQP,GAAeriB,CAAK;AAClC,MAAI4iB,KAAS,KAAM,OAAM,IAAI,UAAU,uBAAuB5iB,CAAK,EAAE;AACrE,SAAO,KAAK,MAAM,KAAK,IAAI4iB,EAAM,MAAMA,EAAM,QAAQ,GAAGA,EAAM,GAAG,IAAIT,EAAgB;AACzF;AAGO,SAASW,GAAeN,GAAwB;AACnD,MAAI,CAAC,OAAO,UAAUA,CAAG,EAAG,OAAM,IAAI,UAAU,8BAA8B;AAC9E,SAAO,IAAI,KAAKA,IAAML,EAAgB,EAAE,cAAc,MAAM,GAAG,EAAE;AACrE;AAGO,SAASY,GAAa/iB,GAAkBgjB,GAAyB;AACpE,MAAI,CAAC,OAAO,UAAUA,CAAI,EAAG,OAAM,IAAI,UAAU,sCAAsC;AACvF,SAAOF,GAAeD,GAAe7iB,CAAK,IAAIgjB,CAAI;AACtD;AAGO,SAASC,GAAeC,IAAY,oBAAI,QAAmB;AAC9D,MAAI,EAAEA,aAAe,SAAS,OAAO,MAAMA,EAAI,QAAA,CAAS;AACpD,UAAM,IAAI,UAAU,sCAAsC;AAE9D,SAAO,GAAG,OAAOA,EAAI,YAAA,CAAa,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI;AAAA,IACpDA,EAAI,aAAa;AAAA,EAAA,EACnB,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOA,EAAI,QAAA,CAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAChE;AAGO,SAASC,GAAkB1b,GAAiBC,GAA0B;AACzE,SAAOmb,GAAepb,CAAI,IAAIob,GAAenb,CAAK;AACtD;AAGO,SAAS0b,GAAYd,GAAcC,GAAuB;AAC7D,QAAM9f,IAAO8f,MAAU,KAAK,EAAC,MAAMD,IAAO,GAAG,OAAO,EAAA,IAAK,EAAC,MAAAA,GAAM,OAAOC,IAAQ,EAAA,GACzEpP,IAAQ,KAAK,IAAI1Q,EAAK,MAAMA,EAAK,QAAQ,GAAG,CAAC;AAEnD,SADiB,IAAI,KAAK0Q,IAAQgP,EAAgB,EAClC,WAAA;AACpB;AAGO,SAASkB,GAAgBf,GAAcC,GAAuB;AACjE,SAAO,IAAI,KAAK,KAAK,IAAID,GAAMC,IAAQ,GAAG,CAAC,CAAC,EAAE,UAAA;AAClD;AAGO,SAASe,GAAUhB,GAAcC,GAAegB,GAA8C;AACjG,QAAMxU,IAASuT,IAAO,MAAMC,IAAQ,KAAMgB,GACpCC,IAAW,KAAK,MAAMzU,IAAQ,EAAE,GAChC0U,KAAc1U,IAAQ,KAAM,MAAM,KAAK;AAC7C,SAAO,EAAC,MAAMyU,GAAU,OAAOC,EAAA;AACnC;ACxFO,MAAMC,WAAmB9B,EAA0C;AAAA,EAAnE;AAAA;AACyB,IAAAziB,EAAA,mBAAY;AAAA;AAAA,EAErB,aAAaqI,GAAsB;AAClD,WAAO4a,GAAY5a,CAAG;AAAA,EAC1B;AAGJ;AADIrI,EAPSukB,IAOO,YAAW;AC5B/B,MAAMC,KAAe;AAmBd,SAASC,GAAa5jB,GAAqC;AAC9D,SAAI,OAAOA,KAAU,WAAiB,KAC/B2jB,GAAa,KAAK3jB,CAAK,KAAK6jB,GAAU7jB,CAAK,KAAK;AAC3D;AAGO,SAAS6jB,GAAU7jB,GAAiE;AACvF,MAAIA,KAAS,KAAM,QAAO;AAC1B,QAAMwd,IAAQmG,GAAa,KAAK3jB,CAAK;AACrC,MAAIwd,KAAS,KAAM,QAAO;AAC1B,QAAMsG,IAAQ,OAAOtG,EAAM,CAAC,CAAC,GACvBuG,IAAU,OAAOvG,EAAM,CAAC,CAAC,GACzBwG,IAAUxG,EAAM,CAAC,KAAK,OAAO,IAAI,OAAOA,EAAM,CAAC,CAAC,GAChDiF,IAAejF,EAAM,CAAC,KAAK,OAAO,IAAI,OAAOA,EAAM,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC;AAC1E,SAAIsG,IAAQ,MAAMC,IAAU,MAAMC,IAAU,KAAW,OAChD,EAAC,OAAAF,GAAO,SAAAC,GAAS,SAAAC,GAAS,cAAAvB,EAAA;AACrC;AAGO,SAASwB,GAAWrB,GAA8B;AACrD,QAAMoB,IAAUpB,EAAM,WAAW,GAC3BH,IAAeG,EAAM,gBAAgB;AAC3C,MACI,CAAC,OAAO,UAAUA,EAAM,KAAK,KAAKA,EAAM,QAAQ,KAAKA,EAAM,QAAQ,MAChE,CAAC,OAAO,UAAUA,EAAM,OAAO,KAAKA,EAAM,UAAU,KAAKA,EAAM,UAAU,MACzE,CAAC,OAAO,UAAUoB,CAAO,KAAKA,IAAU,KAAKA,IAAU,MACvD,CAAC,OAAO,UAAUvB,CAAY,KAAKA,IAAe,KAAKA,IAAe;AAEzE,UAAM,IAAI,UAAU,uBAAuB,KAAK,UAAUG,CAAK,CAAC,EAAE;AAEtE,QAAMkB,IAAQ,OAAOlB,EAAM,KAAK,EAAE,SAAS,GAAG,GAAG,GAC3CmB,IAAU,OAAOnB,EAAM,OAAO,EAAE,SAAS,GAAG,GAAG;AACrD,MAAI5iB,IAAQ,GAAG8jB,CAAK,IAAIC,CAAO;AAC/B,UAAIC,MAAY,KAAKvB,MAAiB,OAClCziB,KAAS,IAAI,OAAOgkB,CAAO,EAAE,SAAS,GAAG,GAAG,CAAC,IACzCvB,MAAiB,MAAGziB,KAAS,IAAI,OAAOyiB,CAAY,EAAE,SAAS,GAAG,GAAG,CAAC,MAEvEziB;AACX;AAGO,SAASkkB,GAAclkB,GAA2B;AACrD,QAAM4iB,IAAQiB,GAAU7jB,CAAK;AAC7B,MAAI4iB,KAAS,KAAM,OAAM,IAAI,UAAU,iBAAiB5iB,CAAK,EAAE;AAC/D,SAAO4iB,EAAM,QAAQ,KAAKA,EAAM;AACpC;AAGO,SAASuB,GAAcJ,GAA6B;AACvD,MAAI,CAAC,OAAO,UAAUA,CAAO,KAAKA,IAAU,KAAKA,KAAW;AACxD,UAAM,IAAI,UAAU,yBAAyBA,CAAO,EAAE;AAE1D,SAAOE,GAAW,EAAC,OAAO,KAAK,MAAMF,IAAU,EAAE,GAAG,SAASA,IAAU,GAAA,CAAG;AAC9E;AAGO,SAASK,GACZrC,GACAC,GACAC,GACoC;AACpC,MAAI,CAAC,OAAO,UAAUA,CAAI,KAAKA,KAAQ,EAAG,OAAM,IAAI,UAAU,sCAAsC;AACpG,QAAMoC,IAAatC,KAAO,OAAO,IAAImC,GAAcnC,CAAG,GAChDuC,IAAatC,KAAO,OAAQ,OAAekC,GAAclC,CAAG;AAClE,MAAIsC,IAAaD,EAAY,OAAM,IAAI,UAAU,8BAA8B;AAC/E,QAAM1jB,IAAgD,CAAA;AACtD,WAASojB,IAAUM,GAAYN,KAAWO,GAAYP,KAAW9B,GAAM;AACnE,UAAMjiB,IAAQmkB,GAAcJ,CAAO;AACnC,IAAApjB,EAAQ,KAAK,EAAC,OAAAX,GAAO,OAAOA,GAAM;AAAA,EACtC;AACA,SAAOW;AACX;ACvEO,MAAM4jB,WAAmB3C,EAA2C;AAAA,EAApE;AAAA;AACyB,IAAAziB,EAAA,mBAAY;AAAA;AAAA,EAErB,aAAaqI,GAAsB;AAClD,WAAOoc,GAAapc,CAAG;AAAA,EAC3B;AAGJ;AADIrI,EAPSolB,IAOO,YAAW;ACrB/B,MAAMC,KAA0B;AAczB,SAASC,GAAgBzkB,GAAwC;AACpE,SAAO,OAAOA,KAAU,YAAY0kB,GAAmB1kB,CAAK,KAAK;AACrE;AAGO,SAAS0kB,GACZ1kB,GACyB;AACzB,MAAIA,KAAS,KAAM,QAAO;AAC1B,QAAMwd,IAAQgH,GAAwB,KAAKxkB,CAAK;AAChD,MAAIwd,KAAS,KAAM,QAAO;AAC1B,QAAMmH,IAAOtC,GAAe7E,EAAM,CAAC,CAAC,GAC9BoH,IAAOf,GAAUrG,EAAM,CAAC,CAAC;AAC/B,SAAImH,KAAQ,QAAQC,KAAQ,OAAa,OAClC,EAAC,GAAGD,GAAM,GAAGC,EAAA;AACxB;AAGO,SAASC,GAAoBjC,GAA0C;AAC1E,SAAO,GAAGD,GAAgBC,CAAK,CAAC,IAAIqB,GAAWrB,CAAK,CAAC;AACzD;AAGO,SAASkC,GAAsBrd,GAAqBC,GAA8B;AACrF,QAAMqd,IAAYL,GAAmBjd,CAAI,GACnCud,IAAaN,GAAmBhd,CAAK;AAC3C,MAAIqd,KAAa,QAAQC,KAAc;AACnC,UAAM,IAAI,UAAU,4BAA4BD,KAAa,OAAOtd,IAAOC,CAAK,EAAE;AAEtF,SAAOqd,EAAU,OAAOC,EAAW,QAC5BD,EAAU,QAAQC,EAAW,SAC7BD,EAAU,MAAMC,EAAW,OAC3BD,EAAU,QAAQC,EAAW,SAC7BD,EAAU,UAAUC,EAAW,YAC9BD,EAAU,WAAW,MAAMC,EAAW,WAAW,OACjDD,EAAU,gBAAgB,MAAMC,EAAW,gBAAgB;AACvE;AAOO,SAASC,GACZjlB,GAC0C;AAC1C,QAAM4iB,IAAQ8B,GAAmB1kB,CAAK;AACtC,SAAI4iB,KAAS,OAAa,OACnB,EAAC,MAAMD,GAAgBC,CAAK,GAAG,MAAMqB,GAAWrB,CAAK,EAAA;AAChE;AAOO,SAASsC,GACZP,GACAC,GACoB;AACpB,QAAMO,IAAY9C,GAAesC,CAAI;AACrC,MAAIQ,KAAa,KAAM,QAAO;AAC9B,QAAMC,IAAYR,KAAQ,OAAO,EAAC,OAAO,GAAG,SAAS,EAAA,IAAKf,GAAUe,CAAI;AACxE,SAAIQ,KAAa,OAAa,OACvBP,GAAoB,EAAC,GAAGM,GAAW,GAAGC,GAAU;AAC3D;AAMO,SAASC,GAAoBrlB,GAA4B;AAC5D,QAAM4iB,IAAQ8B,GAAmB1kB,CAAK;AACtC,MAAI4iB,KAAS,KAAM,OAAM,IAAI,UAAU,4BAA4B5iB,CAAK,EAAE;AAC1E,SAAO,IAAI;AAAA,IACP4iB,EAAM;AAAA,IACNA,EAAM,QAAQ;AAAA,IACdA,EAAM;AAAA,IACNA,EAAM;AAAA,IACNA,EAAM;AAAA,IACNA,EAAM,WAAW;AAAA,IACjBA,EAAM,gBAAgB;AAAA,EAAA;AAE9B;AAOO,SAAS0C,GAAoBX,GAA2B;AAC3D,MAAI,EAAEA,aAAgB,SAAS,OAAO,MAAMA,EAAK,QAAA,CAAS;AACtD,UAAM,IAAI,UAAU,2CAA2C;AAEnE,SAAOE,GAAoB;AAAA,IACvB,MAAMF,EAAK,YAAA;AAAA,IACX,OAAOA,EAAK,SAAA,IAAa;AAAA,IACzB,KAAKA,EAAK,QAAA;AAAA,IACV,OAAOA,EAAK,SAAA;AAAA,IACZ,SAASA,EAAK,WAAA;AAAA,IACd,SAASA,EAAK,WAAA;AAAA,IACd,cAAcA,EAAK,gBAAA;AAAA,EAAgB,CACtC;AACL;AAGO,SAASY,GAAiBrC,IAAY,oBAAI,QAAuB;AACpE,SAAOoC,GAAoBpC,CAAG;AAClC;AC3GO,MAAMsC,WAAuB5D,EAAkD;AAAA,EAA/E;AAAA;AACyB,IAAAziB,EAAA,mBAAY;AAAA;AAAA,EAErB,aAAaqI,GAAsB;AAClD,WAAOid,GAAgBjd,CAAG;AAAA,EAC9B;AAGJ;AADIrI,EAPSqmB,IAOO,YAAW;AChBxB,MAAMC,WAAgBvmB,EAAwB;AAAA,EAEjD,SAA2B;AACvB,UAAM;AAAA,MACF,UAAA4I,IAAW,CAAA;AAAA,MACX,IAAAnF;AAAA,MACA,OAAAb,IAAQ,KAAK,mBAAmB,cAAc;AAAA,MAC9C,aAAAwK,IAAc;AAAA,IAAA,IACd,KAAK;AACT,QAAI,CAAC,CAAC,cAAc,UAAU,EAAE,SAASA,CAAW;AAChD,YAAM,IAAI,UAAU,oDAAoD;AAG5E,UAAMrK,IAAO,KAAK;AAClB,WAAO,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,IAAAU;AAAA,QACA,MAAK;AAAA,QACL,WAAW1B,GAAuB,KAAK,KAAK,KAAK;AAAA,QACjD,cAAYa;AAAA,QACZ,oBAAkBwK;AAAA,QACpB,UAAAxE;AAAA,MAAA;AAAA,IAAA;AAAA,EACN;AA2BJ;AA/CI3I,EADSsmB,IACO,aAA+B,CAAA,IAsB/CtmB,EAvBSsmB,IAuBO,YAAW,YAE3BtmB,EAzBSsmB,IAyBF,OAAM/iB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACnBV,MAAMgjB,WAAoBxmB,EAA4B;AAAA,EAKzD,YAAYG,GAAyB;AACjC,UAAMA,CAAK;AAHN,IAAAF,EAAA;AAIL,aAAK,aAAagB,EAAU,YAAYd,EAAM,EAAE,GAC5CA,EAAM,gBAAgB,QAAQ,CAACqV,GAAkBrV,EAAM,YAAY;AACnE,YAAM,IAAI,UAAU,qDAAqD;AAAA,EAEjF;AAAA,EAEA,SAA2B;AACvB,UAAM2iB,IAAM,KAAK,MAAM,OAAO;AAC9B,QAAI,CAAC,OAAO,SAASA,CAAG,KAAKA,KAAO;AAChC,YAAM,IAAI,WAAW,kDAAkD;AAE3E,UAAM2D,IAAc,KAAK,MAAM,gBAAgB,OACxC,KAAK,MAAM,SAAS,OACrB,KAAK,KAAK,KAAK,MAAM,YAAY;AACvC,QAAIA,KAAe,SAAS,CAAC,OAAO,SAASA,CAAW,KAAKA,IAAc;AACvE,YAAM,IAAI,WAAW,gEAAgE;AAEzF,UAAM3lB,IAAQ2lB,KAAe,OAAO,OAAO,KAAK,IAAIA,GAAa3D,CAAG,GAC9DhT,IAAahP,KAAS,OAAO,OAAOA,IAAQgiB,IAAM,KAClD4D,IAAY,KAAK,MAAM,cAAc5lB,KAAS,OAC9C,KAAK,mBAAmB,oBAAoB,IAC5C,GAAG,KAAK,MAAMA,IAAQgiB,IAAM,GAAG,CAAC,MAChC/f,IAAO,KAAK;AAClB,6BAAQA,GAAA,EAAK,WAAWjB,EAAe,KAAK,KAAK,KAAK,MAClD,UAAA;AAAA,MAAA,gBAAAkB,EAAC,WAAM,SAAS,KAAK,YAAa,UAAA,KAAK,MAAM,OAAM;AAAA,MACnD,gBAAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,IAAI,KAAK;AAAA,UACT,OAAOlC,KAAgB;AAAA,UACvB,KAAAgiB;AAAA,UACA,kBAAgB4D;AAAA,UAClB,UAAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MACF,gBAAAphB,EAAC,eAAA,EAAY,eAAY,QACrB,UAAA;AAAA,QAAA,gBAAAtC;AAAA,UAAC;AAAA,UAAA;AAAA,YACG,OAAO8M,KAAc,OAAO,SAAY;AAAA,cACpC,oBAAoB,GAAGA,CAAU;AAAA,cACjC,4BAA4B,GAAG,MAAQ,KAAK,IAAIA,GAAY,CAAC,CAAC;AAAA,YAAA;AAAA,YAErE,UAAA,gBAAA9M,EAAC,eAAA,EAAa,UAAA,KAAK,MAAM,MAAA,CAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAChC,gBAAAA,EAAC,aAAA,EAAW,UAAA,KAAK,MAAM,MAAA,CAAM;AAAA,MAAA,EAAA,CACjC;AAAA,IAAA,GACJ;AAAA,EACJ;AAqHJ;AApKI/C,EADSumB,IACO,aAA+B,CAAA,IAC/CvmB,EAFSumB,IAEO,gBAAe,CAACjb,EAAkB,IAgDlDtL,EAlDSumB,IAkDO,YAAW,iBAE3BvmB,EApDSumB,IAoDF,OAAMhjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmHjB,SAASgS,GAAkB1U,GAAkE;AACzF,SAAOA,KAAS,SACR,OAAOA,KAAU,YAAY,OAAOA,KAAU,eAC/C,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AACtD;ACrJO,MAAM6lB,KAAkC,OAAO,OAAO;AAAA,EACzD,GAAGC,GAAY,SAAS;AAAA,EACxB,GAAGA,GAAY,WAAW;AAAA,EAC1B,GAAGA,GAAY,SAAS;AAAA,EACxBC,EAAS,qBAAqB,WAAW,WAAW,SAAS,wBAAwB,uBAAuB;AAAA,EAC5GA,EAAS,2BAA2B,WAAW,WAAW,SAAS,uBAAuB,uBAAuB;AAAA,EACjHA,EAAS,0BAA0B,WAAW,WAAW,SAAS,sBAAsB,uBAAuB;AAAA,EAC/GA,EAAS,uBAAuB,WAAW,aAAa,SAAS,0BAA0B,yBAAyB;AAAA,EACpHA,EAAS,6BAA6B,WAAW,aAAa,SAAS,yBAAyB,yBAAyB;AAAA,EACzHA,EAAS,4BAA4B,WAAW,aAAa,SAAS,wBAAwB,yBAAyB;AAAA,EACvHA,EAAS,qBAAqB,WAAW,WAAW,SAAS,wBAAwB,uBAAuB;AAAA,EAC5GA,EAAS,2BAA2B,WAAW,WAAW,SAAS,uBAAuB,uBAAuB;AAAA,EACjHA,EAAS,0BAA0B,WAAW,WAAW,SAAS,sBAAsB,uBAAuB;AAAA,EAC/GA,EAAS,mBAAmB,WAAW,YAAY,SAAS,gBAAgB;AAAA,EAC5EA,EAAS,kBAAkB,WAAW,YAAY,SAAS,eAAe;AAAA,EAC1EA,EAAS,yBAAyB,WAAW,YAAY,SAAS,4BAA4B;AAAA,EAC9FA,EAAS,yBAAyB,WAAW,YAAY,SAAS,kCAAkC;AAAA,EACpGA,EAAS,+BAA+B,WAAW,WAAW,SAAS,wCAAwC,iBAAiB;AAAA,EAChIA,EAAS,8BAA8B,WAAW,WAAW,SAAS,uCAAuC,gBAAgB;AAAA,EAC7HA,EAAS,iCAAiC,WAAW,aAAa,SAAS,0CAA0C,iBAAiB;AAAA,EACtIA,EAAS,gCAAgC,WAAW,aAAa,SAAS,yCAAyC,gBAAgB;AAAA,EACnIA,EAAS,+BAA+B,WAAW,WAAW,SAAS,wCAAwC,iBAAiB;AAAA,EAChIA,EAAS,8BAA8B,WAAW,WAAW,SAAS,uCAAuC,gBAAgB;AAAA,EAC7HA,EAAS,4BAA4B,WAAW,YAAY,SAAS,gCAAgC,iBAAiB;AAAA,EACtHA,EAAS,2BAA2B,WAAW,YAAY,SAAS,+BAA+B,gBAAgB;AAAA,EACnHA,EAAS,iBAAiB,WAAW,OAAO,SAAS,mBAAmB;AAAA,EACxEA,EAAS,mBAAmB,WAAW,OAAO,SAAS,qBAAqB;AAAA,EAE5EA,EAAS,iBAAiB,SAAS,cAAc,QAAQ,eAAe;AAAA,EACxEA,EAAS,eAAe,SAAS,cAAc,aAAa,mBAAmB;AAAA,EAC/EA,EAAS,iBAAiB,SAAS,cAAc,aAAa,qBAAqB;AAAA,EACnFA,EAAS,wBAAwB,SAAS,WAAW,aAAa,wBAAwB;AAAA,EAC1FA,EAAS,cAAc,SAAS,WAAW,aAAa,qBAAqB;AAAA,EAC7EA,EAAS,cAAc,SAAS,WAAW,aAAa,eAAe;AAAA,EACvEA,EAAS,cAAc,SAAS,WAAW,aAAa,gBAAgB;AAAA,EACxEA,EAAS,cAAc,SAAS,WAAW,aAAa,eAAe;AAAA,EACvEA,EAAS,eAAe,SAAS,SAAS,UAAU,qBAAqB;AAAA,EACzEA,EAAS,eAAe,SAAS,SAAS,UAAU,wBAAwB;AAAA,EAC5EA,EAAS,eAAe,SAAS,SAAS,UAAU,qBAAqB;AAAA,EACzEA,EAAS,iBAAiB,SAAS,UAAU,YAAY,6BAA6B;AAAA,EAEtFA,EAAS,4BAA4B,SAAS,WAAW,cAAc,oBAAoB;AAAA,EAC3FA,EAAS,mBAAmB,SAAS,WAAW,cAAc,uBAAuB;AAAA,EACrFA,EAAS,cAAc,SAAS,WAAW,SAAS,iBAAiB;AAAA,EACrEA,EAAS,eAAe,SAAS,WAAW,UAAU,mBAAmB;AAAA,EACzEA,EAAS,eAAe,SAAS,WAAW,UAAU,uBAAuB;AAAA,EAC7EA,EAAS,gBAAgB,SAAS,SAAS,UAAU,qBAAqB;AAAA,EAC1EA,EAAS,iBAAiB,SAAS,SAAS,SAAS,sBAAsB;AAAA,EAC3EA,EAAS,iBAAiB,SAAS,UAAU,SAAS,mBAAmB;AAAA,EACzEA,EAAS,oBAAoB,SAAS,UAAU,SAAS,6BAA6B;AAAA,EACtFA,EAAS,mBAAmB,SAAS,UAAU,SAAS,qBAAqB;AAAA,EAE7EA,EAAS,sBAAsB,SAAS,SAAS,cAAc,iBAAiB,iBAAiB;AAAA,EACjGA,EAAS,iBAAiB,SAAS,SAAS,SAAS,iBAAiB,YAAY;AAAA,EAClFA,EAAS,kBAAkB,SAAS,SAAS,UAAU,gBAAgB,aAAa;AAAA,EACpFA,EAAS,kBAAkB,SAAS,SAAS,UAAU,gBAAgB,aAAa;AAAA,EACpFA,EAAS,kBAAkB,SAAS,SAAS,UAAU,gBAAgB,aAAa;AAAA,EACpFA,EAAS,mBAAmB,SAAS,UAAU,aAAa,yCAAyC;AAAA,EACrGA,EAAS,oBAAoB,SAAS,UAAU,aAAa,yCAAyC;AAAA,EACtGA,EAAS,uBAAuB,SAAS,UAAU,cAAc,2BAA2B,oBAAoB;AAAA,EAChHA,EAAS,mBAAmB,SAAS,UAAU,UAAU,wBAAwB,gBAAgB;AAAA,EACjGA,EAAS,mBAAmB,SAAS,UAAU,UAAU,0BAA0B,gBAAgB;AAAA,EACnGA,EAAS,mBAAmB,SAAS,UAAU,UAAU,6BAA6B,gBAAgB;AAAA,EACtGA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB,gBAAgB;AAAA,EAChGA,EAAS,gCAAgC,SAAS,UAAU,cAAc,gBAAgB;AAAA,EAE1FA,EAAS,uBAAuB,SAAS,UAAU,cAAc,wBAAwB;AAAA,EACzFA,EAAS,kBAAkB,SAAS,UAAU,SAAS,wBAAwB;AAAA,EAC/EA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB;AAAA,EAChFA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB;AAAA,EAChFA,EAAS,+BAA+B,SAAS,UAAU,cAAc,0BAA0B,qBAAqB;AAAA,EACxHA,EAAS,0BAA0B,SAAS,UAAU,SAAS,0BAA0B,gBAAgB;AAAA,EACzGA,EAAS,2BAA2B,SAAS,UAAU,UAAU,yBAAyB,iBAAiB;AAAA,EAC3GA,EAAS,2BAA2B,SAAS,UAAU,UAAU,yBAAyB,iBAAiB;AAAA,EAC3GA,EAAS,6BAA6B,SAAS,UAAU,cAAc,wBAAwB,6BAA6B;AAAA,EAC5HA,EAAS,wBAAwB,SAAS,UAAU,SAAS,wBAAwB,wBAAwB;AAAA,EAC7GA,EAAS,8BAA8B,SAAS,UAAU,cAAc,yBAAyB,6BAA6B;AAAA,EAC9HA,EAAS,yBAAyB,SAAS,UAAU,SAAS,yBAAyB,wBAAwB;AAAA,EAE/GA,EAAS,uBAAuB,SAAS,UAAU,cAAc,wBAAwB;AAAA,EACzFA,EAAS,6BAA6B,SAAS,UAAU,cAAc,wBAAwB;AAAA,EAC/FA,EAAS,8BAA8B,SAAS,UAAU,cAAc,wBAAwB;AAAA,EAChGA,EAAS,gCAAgC,SAAS,UAAU,cAAc,yBAAyB;AAAA,EACnGA,EAAS,kBAAkB,SAAS,UAAU,SAAS,wBAAwB;AAAA,EAC/EA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB;AAAA,EAChFA,EAAS,mBAAmB,SAAS,UAAU,UAAU,uBAAuB;AAAA,EAChFA,EAAS,0BAA0B,SAAS,UAAU,UAAU,uBAAuB;AAAA,EACvFA,EAAS,gCAAgC,SAAS,UAAU,UAAU,6BAA6B;AAAA,EACnGA,EAAS,8BAA8B,SAAS,UAAU,cAAc,yBAAyB,qBAAqB;AAAA,EACtHA,EAAS,sCAAsC,SAAS,UAAU,cAAc,0BAA0B,wBAAwB;AAAA,EAClIA,EAAS,2BAA2B,SAAS,UAAU,cAAc,eAAe,qBAAqB;AAAA,EACzGA,EAAS,kCAAkC,SAAS,UAAU,cAAc,sBAAsB,yBAAyB;AAAA,EAC3HA,EAAS,4BAA4B,SAAS,UAAU,cAAc,uBAAuB,qBAAqB;AAAA,EAClHA,EAAS,iCAAiC,SAAS,UAAU,cAAc,kCAAkC,qBAAqB;AAAA,EAClIA,EAAS,oCAAoC,SAAS,UAAU,cAAc,+BAA+B,qBAAqB;AAAA,EAElIA,EAAS,sBAAsB,SAAS,SAAS,cAAc,eAAe;AAAA,EAC9EA,EAAS,iBAAiB,SAAS,SAAS,SAAS,eAAe;AAAA,EACpEA,EAAS,kBAAkB,SAAS,SAAS,UAAU,cAAc;AAAA,EACrEA,EAAS,kBAAkB,SAAS,SAAS,UAAU,cAAc;AAAA,EACrEA,EAAS,+BAA+B,SAAS,SAAS,cAAc,wBAAwB;AAAA,EAChGA,EAAS,0BAA0B,SAAS,SAAS,SAAS,wBAAwB;AAAA,EAEtFA,EAAS,0BAA0B,SAAS,aAAa,cAAc,uBAAuB;AAAA,EAC9FA,EAAS,qBAAqB,SAAS,aAAa,SAAS,uBAAuB;AAAA,EACpFA,EAAS,0BAA0B,SAAS,OAAO,cAAc,6BAA6B;AAAA,EAC9FA,EAAS,0BAA0B,SAAS,SAAS,cAAc,uBAAuB;AAAA,EAC1FA,EAAS,8BAA8B,SAAS,SAAS,cAAc,wBAAwB;AAAA,EAE/FA,EAAS,6BAA6B,SAAS,YAAY,cAAc,0BAA0B,oBAAoB;AAAA,EACvHA,EAAS,qCAAqC,SAAS,YAAY,cAAc,wBAAwB,wBAAwB;AAAA,EACjIA,EAAS,yBAAyB,SAAS,YAAY,UAAU,uBAAuB,gBAAgB;AAAA,EACxGA,EAAS,2BAA2B,SAAS,YAAY,SAAS,mBAAmB,mBAAmB;AAAA,EAExGA,EAAS,wBAAwB,SAAS,WAAW,cAAc,mBAAmB,oBAAoB;AAAA,EAC1GA,EAAS,mBAAmB,SAAS,WAAW,SAAS,mBAAmB,eAAe;AAAA,EAC3FA,EAAS,oBAAoB,SAAS,WAAW,UAAU,kBAAkB,gBAAgB;AAAA,EAC7FA,EAAS,oBAAoB,SAAS,WAAW,UAAU,kBAAkB,gBAAgB;AAAA,EAC7FA,EAAS,+BAA+B,SAAS,cAAc,cAAc,wBAAwB;AAAA,EACrGA,EAAS,0BAA0B,SAAS,cAAc,SAAS,wBAAwB;AAAA,EAC3FA,EAAS,2BAA2B,SAAS,cAAc,UAAU,uBAAuB;AAAA,EAC5FA,EAAS,2BAA2B,SAAS,cAAc,UAAU,0BAA0B;AAAA,EAC/FA,EAAS,4BAA4B,SAAS,cAAc,aAAa,8BAA8B;AAAA,EACvGA,EAAS,wBAAwB,SAAS,cAAc,aAAa,qBAAqB;AAAA,EAC1FA,EAAS,2BAA2B,SAAS,cAAc,SAAS,yBAAyB;AAAA,EAC7FA,EAAS,iCAAiC,SAAS,cAAc,SAAS,iCAAiC;AAAA,EAC3GA,EAAS,kCAAkC,SAAS,cAAc,SAAS,iCAAiC;AAAA,EAC5GA,EAAS,mCAAmC,SAAS,cAAc,SAAS,iCAAiC;AAAA,EAC7GA,EAAS,oCAAoC,SAAS,cAAc,SAAS,kCAAkC;AAAA,EAC/GA,EAAS,gCAAgC,SAAS,cAAc,cAAc,yBAAyB;AAAA,EACvGA,EAAS,sCAAsC,SAAS,cAAc,cAAc,iCAAiC;AAAA,EACrHA,EAAS,uCAAuC,SAAS,cAAc,cAAc,iCAAiC;AAAA,EACtHA,EAAS,wCAAwC,SAAS,cAAc,cAAc,iCAAiC;AAAA,EACvHA,EAAS,yCAAyC,SAAS,cAAc,cAAc,kCAAkC;AAAA,EACzHA,EAAS,4BAA4B,SAAS,cAAc,UAAU,wBAAwB;AAAA,EAC9FA,EAAS,oCAAoC,SAAS,cAAc,UAAU,gCAAgC;AAAA,EAC9GA,EAAS,4BAA4B,SAAS,cAAc,UAAU,2BAA2B;AAAA,EACjGA,EAAS,oCAAoC,SAAS,cAAc,UAAU,mCAAmC;AAAA,EACjHA,EAAS,6BAA6B,SAAS,cAAc,aAAa,+BAA+B;AAAA,EACzGA,EAAS,4BAA4B,SAAS,cAAc,UAAU,+BAA+B;AAAA,EACrGA,EAAS,yCAAyC,SAAS,cAAc,QAAQ,kCAAkC;AAAA,EACnHA,EAAS,wBAAwB,SAAS,QAAQ,cAAc,qBAAqB,oBAAoB;AAAA,EACzGA,EAAS,2BAA2B,SAAS,QAAQ,cAAc,sBAAsB,oBAAoB;AAAA,EAC7GA,EAAS,+BAA+B,SAAS,YAAY,cAAc,gBAAgB;AAAA,EAC3FA,EAAS,0BAA0B,SAAS,YAAY,SAAS,sBAAsB;AAAA,EACvFA,EAAS,2BAA2B,SAAS,YAAY,UAAU,sBAAsB;AAAA,EACzFA,EAAS,+BAA+B,SAAS,YAAY,cAAc,gBAAgB;AAAA,EAC3FA,EAAS,0BAA0B,SAAS,YAAY,SAAS,0BAA0B;AAAA,EAC3FA,EAAS,2BAA2B,SAAS,YAAY,UAAU,0BAA0B;AAAA,EAC7FA,EAAS,8BAA8B,SAAS,UAAU,cAAc,+BAA+B;AAAA,EACvGA,EAAS,kBAAkB,SAAS,WAAW,SAAS,4BAA4B,mBAAmB;AAAA,EACvGA,EAAS,mBAAmB,SAAS,WAAW,SAAS,6BAA6B,yBAAyB;AAAA,EAC/GA,EAAS,kBAAkB,SAAS,WAAW,SAAS,4BAA4B,wBAAwB;AAAA,EAC5GA,EAAS,sBAAsB,SAAS,WAAW,SAAS,4BAA4B,0BAA0B;AAAA,EAClHA,EAAS,oBAAoB,SAAS,WAAW,UAAU,qBAAqB;AAAA,EAChFA,EAAS,8BAA8B,SAAS,eAAe,UAAU,+BAA+B,aAAa;AAAA,EACrHA,EAAS,8BAA8B,SAAS,eAAe,UAAU,+BAA+B,aAAa;AAAA,EACrHA,EAAS,8BAA8B,SAAS,eAAe,UAAU,4BAA4B;AACzG,CAAyD,GAE5CC,KAA0B,OAAO,OAAO;AAAA,EACjDC,GAAY,SAAS,SAASC,EAAoB,wBAAwB,GAAG,OAAO;AAAA,EACpFD,GAAY,QAAQ,QAAQC,EAAoB,uBAAuB,GAAG,OAAO;AAAA,EACjFD,GAAY,WAAW,WAAWC,EAAoB,0BAA0B,GAAG,UAAU;AACjG,CAAC,GAEYC,KAA0B,OAAO,OAAO;AAAA,EACjD9V,EAAO,WAAW,YAAY6V,EAAoB,2BAA2B,CAAC;AAAA,EAC9E7V,EAAO,SAAS,SAAS6V,EAAoB,yBAAyB,CAAC;AAAA,EACvE7V,EAAO,SAAS,SAAS6V,EAAoB,yBAAyB,CAAC;AAAA,EACvE7V,EAAO,QAAQ,QAAQ6V,EAAoB,wBAAwB,CAAC;AAAA,EACpE7V,EAAO,UAAU,UAAU6V,EAAoB,0BAA0B,CAAC;AAAA,EAC1E7V,EAAO,UAAU,UAAU6V,EAAoB,0BAA0B,CAAC;AAAA,EAC1E7V,EAAO,OAAO,OAAO6V,EAAoB,uBAAuB,CAAC;AAAA,EACjE7V,EAAO,UAAU,UAAU6V,EAAoB,0BAA0B,CAAC;AAC9E,CAAC;AAGM,SAASE,GACZC,GACAC,GACA3d,IAA2B,WAAW,UACvB;AAEf,MADA4d,GAAaD,CAAS,IAClB3d,KAAA,gBAAAA,EAAgB,SAAQ,QAAQA,EAAe,mBAAmB;AAClE,UAAM,IAAI,UAAU,uEAAuE;AAG/F,QAAM6d,IAAW,6BAA6BH,CAAI;AAClD,MAAII,IAAO9d,EAAe,KAAK,cAA+B6d,CAAQ;AACtE,SAAIC,KAAQ,SACRA,IAAO9d,EAAe,cAAc,MAAM,GAC1C8d,EAAK,MAAM,cACXA,EAAK,QAAQ,gBAAgBJ,GAC7B1d,EAAe,KAAK,OAAO8d,CAAI,IAEnCA,EAAK,QAAQ,eAAeH,EAAU,OAClCG,EAAK,aAAa,MAAM,MAAMH,EAAU,QAAMG,EAAK,aAAa,QAAQH,EAAU,IAAI,GAEtFD,MAAS,UAAS1d,EAAe,gBAAgB,QAAQ,QAAQ2d,EAAU,QAC1E3d,EAAe,gBAAgB,QAAQ,QAAQ2d,EAAU,OACvDG;AACX;AAMO,SAASC,GACZC,GACAhe,IAA2B,WAAW,UAClC;AACJ,OAAIA,KAAA,gBAAAA,EAAgB,oBAAmB;AACnC,UAAM,IAAI,UAAU,0DAA0D;AAElF,MAAIge,MAAe,WAAWA,MAAe,UAAUA,MAAe;AAClE,UAAM,IAAI,UAAU,wDAAwD;AAEhF,EAAIA,MAAe,WAAUhe,EAAe,gBAAgB,gBAAgB,iBAAiB,IACxFA,EAAe,gBAAgB,QAAQ,aAAage;AAC7D;AAEO,SAASC,GACZje,IAA2B,WAAW,UACjB;AACrB,OAAIA,KAAA,gBAAAA,EAAgB,oBAAmB;AACnC,UAAM,IAAI,UAAU,0DAA0D;AAElF,QAAMge,IAAahe,EAAe,gBAAgB,QAAQ;AAC1D,SAAOge,MAAe,WAAWA,MAAe,SAASA,IAAa;AAC1E;AAEO,SAASE,GACZlmB,GACAX,GAC2B;AAC3B,QAAMsmB,IAAY3lB,EAAQ,KAAK,CAAC0P,MAAWA,EAAO,UAAUrQ,CAAK;AACjE,MAAIsmB,KAAa,KAAM,OAAM,IAAI,WAAW,8CAA8CtmB,CAAK,EAAE;AACjG,SAAOsmB;AACX;AAEA,SAASP,EACLllB,GACAimB,GACAC,GACA/mB,GACAoe,GACA9e,GACkC;AAClC,SAAOA,KAAY,OACb,OAAO,OAAO,EAAC,MAAAuB,GAAM,OAAAimB,GAAO,QAAAC,GAAQ,OAAA/mB,GAAO,aAAAoe,EAAA,CAAY,IACvD,OAAO,OAAO,EAAC,MAAAvd,GAAM,OAAAimB,GAAO,QAAAC,GAAQ,OAAA/mB,GAAO,aAAAoe,GAAa,UAAA9e,GAAS;AAC3E;AAEA,SAASwmB,GAAYiB,GAA6C;AAC9D,SAAO,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,IAAI,CAACC;;AAC/D,WAAAjB;AAAA,MACI,aAAagB,CAAM,IAAIC,CAAI;AAAA,MAC3B;AAAA,MACAD;AAAA,MACA;AAAA,MACA,IAAGplB,IAAAolB,EAAO,CAAC,MAAR,gBAAAplB,EAAW,aAAa,GAAGolB,EAAO,MAAM,CAAC,CAAC,iBAAiBC,CAAI;AAAA,IAAA;AAAA,GACrE;AACT;AAEA,SAAS3W,EAAOrQ,GAAe8B,GAAemlB,GAA2C;AACrF,SAAO,OAAO,OAAO,EAAC,OAAAjnB,GAAO,OAAA8B,GAAO,MAAAmlB,GAAK;AAC7C;AAEA,SAAShB,GACLjmB,GACA8B,GACAmlB,GACAN,GACsB;AACtB,SAAO,OAAO,OAAO,EAAC,OAAA3mB,GAAO,OAAA8B,GAAO,MAAAmlB,GAAM,YAAAN,GAAW;AACzD;AAQA,SAAST,EAAoBtgB,GAAsB;AAC/C,QAAMshB,IAAsB,YAAY,IAAI,SAAS,eAAe,IAC9D,SAASthB,CAAI,KACb,MAAMA,CAAI;AAChB,SAAO,IAAI,IAAIshB,GAAqB,YAAY,GAAG,EAAE;AACzD;AAEA,SAASX,GAAalW,GAAgE;AAClF,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACpC,UAAM,IAAI,UAAU,qDAAqD;AAE7E,aAAWiI,KAAS,CAAC,SAAS,SAAS,MAAM;AACzC,QAAI,OAAO,QAAQ,IAAIjI,GAAQiI,CAAK,KAAM,YACnC,OAAO,QAAQ,IAAIjI,GAAQiI,CAAK,CAAC,EAAE,WAAW;AACjD,YAAM,IAAI,UAAU,kCAAkCA,CAAK,6BAA6B;AAGpG;ACjTA,MAAe6O,WAAyB9H,GAAiB;AAAA,EAOrD,YACIhgB,GACAgnB,GACAe,GACF;AACE,UAAMC,IAAoBhoB,EAAM,WAAW+nB;AAC3C,IAAAE,GAAgBD,CAAiB;AACjC,UAAM,EAAC,SAASE,GAAU,gBAAA5e,GAAgB,UAAA0Y,GAAU,GAAGmG,MAAiBnoB;AACxE,UAAM;AAAA,MACF,GAAGmoB;AAAA,MACH,SAASH;AAAA,IAAA,CACZ;AAjBY,IAAAloB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAcb,SAAK,OAAOknB,GACZ,KAAK,oBAAoBgB,GACzB,KAAK,gBAAgBhoB,EAAM,WAAW,MACtC,KAAK,iBAAiBsJ,GACtB,KAAK,gBAAgB0Y,GACrBwF,GAAgCQ,GAAmB,KAAK,aAAa,IAAA,CAAK;AAAA,EAC9E;AAAA,EAEmB,YAAoB;AACnC,WAAOvmB,GAAW,OAAO,KAAK,IAAI,WAAW,MAAM,WAAW;AAAA,EAClE;AAAA,EAEmB,YAAYuP,GAAkD;AAC7E,QAAI,KAAK,cAAe,QAAO,MAAM,YAAYA,CAAM;AACvD,YAAQ,GAAG,KAAK,IAAI,IAAIA,EAAO,KAAK,IAAA;AAAA,MAChC,KAAK;AAAc,eAAO,KAAK,mBAAmB,sBAAsB;AAAA,MACxE,KAAK;AAAiB,eAAO,KAAK,mBAAmB,yBAAyB;AAAA,MAC9E,KAAK;AAAe,eAAO,KAAK,mBAAmB,uBAAuB;AAAA,MAC1E,KAAK;AAAe,eAAO,KAAK,mBAAmB,sBAAsB;AAAA,MACzE,KAAK;AAAgB,eAAO,KAAK,mBAAmB,uBAAuB;AAAA,MAC3E,KAAK;AAAkB,eAAO,KAAK,mBAAmB,yBAAyB;AAAA,MAC/E,KAAK;AAAgB,eAAO,KAAK,mBAAmB,uBAAuB;AAAA,MAC3E,KAAK;AAAiB,eAAO,KAAK,mBAAmB,wBAAwB;AAAA,MAC7E,KAAK;AAAiB,eAAO,KAAK,mBAAmB,wBAAwB;AAAA,MAC7E,KAAK;AAAc,eAAO,KAAK,mBAAmB,qBAAqB;AAAA,MACvE,KAAK;AAAiB,eAAO,KAAK,mBAAmB,wBAAwB;AAAA,MAC7E;AAAS,eAAO,MAAM,YAAYA,CAAM;AAAA,IAAA;AAAA,EAEhD;AAAA,EAEmB,WACfrQ,GACAggB,GACAne,GACI;AACJ,IAAAX;AAAA,MAAO,KAAK;AAAA,MAAelB;AAAA,MACvB6mB,GAAgC,KAAK,mBAAmB7mB,CAAK;AAAA,MAAG6B;AAAA,IAAA;AAAA,EACxE;AAAA,EAES,WAAWqT,GAA6B;AAC7C,UAAM,WAAWA,CAAG,GACpB,KAAK,eAAA;AAAA,EACT;AAAA,EAES,YAAYA,GAA6B;AAC9C,UAAM,YAAYA,CAAG,GACrB,KAAK,eAAA;AAAA,EACT;AAAA,EAEQ,iBAAuB;AAC3B,UAAMvM,IAAiB,KAAK,mBACpB,OAAO,WAAa,MAAc,OAAO;AACjD,IAAIA,KAAkB,QACtByd;AAAA,MACI,KAAK;AAAA,MACLS,GAAgC,KAAK,mBAAmB,KAAK,aAAa,KAAK;AAAA,MAC/Ele;AAAA,IAAA;AAAA,EAER;AACJ;AAEO,MAAM8e,WAAoBN,GAAiB;AAAA,EAC9C,YAAY9nB,IAA+B,IAAI;AAC3C,UAAMA,GAAO,SAAS2mB,EAAuB;AAAA,EACjD;AACJ;AAEO,MAAM0B,WAAoBP,GAAiB;AAAA,EAC9C,YAAY9nB,IAA+B,IAAI;AAC3C,UAAMA,GAAO,UAAU8mB,EAAuB;AAAA,EAClD;AACJ;AAEA,SAASmB,GACL3mB,GACyD;AACzD,MAAI,CAAC,MAAM,QAAQA,CAAO,KAAKA,EAAQ,WAAW;AAC9C,UAAM,IAAI,UAAU,qDAAqD;AAE7E,QAAMI,wBAAa,IAAA;AACnB,aAAWsP,KAAU1P,GAAS;AAC1B,QAAI0P,KAAU,QAAQ,OAAOA,KAAW;AACpC,YAAM,IAAI,UAAU,2CAA2C;AAEnE,eAAWiI,KAAS,CAAC,SAAS,SAAS,MAAM;AACzC,UAAI,OAAOjI,EAAOiI,CAAK,KAAM,YAAYjI,EAAOiI,CAAK,EAAE,WAAW;AAC9D,cAAM,IAAI,UAAU,4BAA4BA,CAAK,mBAAmB;AAGhF,QAAIvX,EAAO,IAAIsP,EAAO,KAAK;AACvB,YAAM,IAAI,MAAM,sCAAsCA,EAAO,KAAK,EAAE;AAExE,IAAAtP,EAAO,IAAIsP,EAAO,KAAK;AAAA,EAC3B;AACJ;ACpIO,MAAMsX,GAAqD;AAAA,EAK9D,YAAYC,IAAkB,KAAK;AAJlB,IAAAzoB,EAAA,uCAAgB,IAAA;AACzB,IAAAA,EAAA;AACA,IAAAA,EAAA,eAAQ;AAGZ,SAAK,UAAU,CAAC0oB,EAAuBD,CAAe,CAAC;AAAA,EAC3D;AAAA,EAEA,OAAe;AACX,WAAO,KAAK,QAAQ,KAAK,KAAK,KAAK;AAAA,EACvC;AAAA,EAEA,KAAKE,GAA0B;AAC3B,WAAOD,EAAuBC,CAAQ;AAAA,EAC1C;AAAA,EAEA,KAAKA,GAAwB;AACzB,SAAK,UAAU,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,CAAC,GACnD,KAAK,QAAQ,KAAKD,EAAuBC,CAAQ,CAAC,GAClD,KAAK,SAAS;AAAA,EAClB;AAAA,EAEA,QAAQA,GAAwB;AAC5B,SAAK,QAAQ,KAAK,KAAK,IAAID,EAAuBC,CAAQ;AAAA,EAC9D;AAAA,EAEA,UAAU/jB,GAAkC;AACxC,QAAI,OAAOA,KAAa;AACpB,YAAM,IAAI,UAAU,kDAAkD;AAE1E,SAAK,UAAU,IAAIA,CAAQ;AAC3B,QAAIqM,IAAS;AACb,WAAO,MAAM;AACT,MAAKA,MACLA,IAAS,IACT,KAAK,UAAU,OAAOrM,CAAQ;AAAA,IAClC;AAAA,EACJ;AAAA,EAEA,OAAa;AACT,IAAI,KAAK,UAAU,MACnB,KAAK,SAAS,GACd,KAAK,OAAA;AAAA,EACT;AAAA,EAEA,UAAgB;AACZ,IAAI,KAAK,SAAS,KAAK,QAAQ,SAAS,MACxC,KAAK,SAAS,GACd,KAAK,OAAA;AAAA,EACT;AAAA,EAEA,IAAI,SAAiB;AACjB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEQ,SAAe;AACnB,eAAWA,KAAY,CAAC,GAAG,KAAK,SAAS,EAAG,CAAAA,EAAA;AAAA,EAChD;AACJ;AAEO,SAASgkB,GACZ3iB,IAAkC,WAAW,QAC7CzE,IAAoC,CAAA,GACnB;AACjB,EAAAqnB,GAAoB5iB,CAAM;AAC1B,QAAM6iB,IAAWC,GAAkBvnB,EAAQ,YAAY,GAAG;AAC1D,SAAO;AAAA,IACH,OAAO;AACH,YAAMwnB,IAAW/iB,EAAO,SAAS,UAC3BgjB,IAAWD,MAAaF,EAAS,MAAM,GAAG,EAAE,IAC5C,MACAE,EAAS,WAAWF,CAAQ,IACxB,IAAIE,EAAS,MAAMF,EAAS,MAAM,CAAC,KACnCE;AACV,aAAON,EAAuB,GAAGO,CAAQ,GAAGhjB,EAAO,SAAS,MAAM,EAAE;AAAA,IACxE;AAAA,IACA,KAAK0iB,GAAU;AACX,YAAMO,IAAaR,EAAuBC,CAAQ;AAClD,aAAO,GAAGG,CAAQ,GAAGI,EAAW,MAAM,CAAC,CAAC;AAAA,IAC5C;AAAA,IACA,KAAKP,GAAU;AACX,MAAA1iB,EAAO,QAAQ,UAAU,MAAM,IAAI,KAAK,KAAK0iB,CAAQ,CAAC;AAAA,IAC1D;AAAA,IACA,QAAQA,GAAU;AACd,MAAA1iB,EAAO,QAAQ,aAAa,MAAM,IAAI,KAAK,KAAK0iB,CAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,UAAU/jB,GAAU;AAChB,aAAAqB,EAAO,iBAAiB,YAAYrB,CAAQ,GACrC,MAAMqB,EAAO,oBAAoB,YAAYrB,CAAQ;AAAA,IAChE;AAAA,EAAA;AAER;AAEO,SAASukB,GACZljB,IAAkC,WAAW,QAC5B;AACjB,SAAA4iB,GAAoB5iB,CAAM,GACnB;AAAA,IACH,OAAO;AACH,aAAOyiB,EAAuBziB,EAAO,SAAS,KAAK,MAAM,CAAC,KAAK,GAAG;AAAA,IACtE;AAAA,IACA,KAAK0iB,GAAU;AACX,aAAO,IAAID,EAAuBC,CAAQ,CAAC;AAAA,IAC/C;AAAA,IACA,KAAKA,GAAU;AACX,MAAA1iB,EAAO,QAAQ,UAAU,MAAM,IAAI,KAAK,KAAK0iB,CAAQ,CAAC;AAAA,IAC1D;AAAA,IACA,QAAQA,GAAU;AACd,MAAA1iB,EAAO,QAAQ,aAAa,MAAM,IAAI,KAAK,KAAK0iB,CAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,UAAU/jB,GAAU;AAChB,UAAIyE,IAAO,KAAK,KAAA;AAChB,YAAM+f,IAAS,MAAM;AACjB,cAAM9lB,IAAO,KAAK,KAAA;AAClB,QAAIA,MAAS+F,MACbA,IAAO/F,GACPsB,EAAA;AAAA,MACJ;AACA,aAAAqB,EAAO,iBAAiB,YAAYmjB,CAAM,GAC1CnjB,EAAO,iBAAiB,cAAcmjB,CAAM,GACrC,MAAM;AACT,QAAAnjB,EAAO,oBAAoB,YAAYmjB,CAAM,GAC7CnjB,EAAO,oBAAoB,cAAcmjB,CAAM;AAAA,MACnD;AAAA,IACJ;AAAA,EAAA;AAER;AAEO,SAASV,EAAuBC,GAA0B;AAC7D,MAAI,OAAOA,KAAa,SAAU,OAAM,IAAI,UAAU,iCAAiC;AACvF,QAAMU,IAAYV,EAAS,QAAQ,GAAG,GAChCW,IAAcD,IAAY,IAAIV,IAAWA,EAAS,MAAM,GAAGU,CAAS,GACpEE,IAAaD,EAAY,QAAQ,GAAG,GACpCE,IAAUD,IAAa,IAAID,IAAcA,EAAY,MAAM,GAAGC,CAAU,GACxEnhB,IAASmhB,IAAa,IAAI,KAAKD,EAAY,MAAMC,CAAU;AAGjE,SAAO,IAFQC,EAAQ,WAAW,GAAG,IAAIA,IAAU,IAAIA,CAAO,IACtC,QAAQ,WAAW,GAAG,EAAE,QAAQ,OAAO,EAAE,KAAK,GACpD,GAAGphB,CAAM;AAC/B;AAEA,SAAS2gB,GAAkBloB,GAAuB;AAC9C,QAAMqoB,IAAaR,EAAuB7nB,CAAK,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AAClE,SAAOqoB,MAAe,MAAM,MAAM,GAAGA,CAAU;AACnD;AAEA,SAASL,GAAoBhoB,GAA0D;AACnF,MAAIA,KAAS,QACN,OAAOA,KAAU,YACjB,EAAE,cAAcA,MAChB,EAAE,aAAaA,MACf,EAAE,sBAAsBA;AAC3B,UAAM,IAAI,UAAU,kDAAkD;AAE9E;AC9CA,MAAM4oB,KAAgB;AAEf,MAAMC,GAAc;AAAA,EAmBvB,YAAqBC,GAA4B;AAlBxC,IAAA3pB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,oCAAa,IAAA;AACb,IAAAA,EAAA,0CAAmB,IAAA;AACnB,IAAAA,EAAA,6CAAsB,IAAA;AACtB,IAAAA,EAAA,6CAAsB,IAAA;AACtB,IAAAA,EAAA;AACT,IAAAA,EAAA,oBAAqC;AACrC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,kBAAW;AAEE,SAAA,UAAA2pB,GACjBC,GAAwBD,CAAO,GAC/B,KAAK,OAAO,OAAO,OAAO;AAAA,MACtB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU;AAAA,IAAA,CACb,GACDE,GAAoB,IAAI,KAAK,MAAM,IAAI,GACvC,KAAK,gBAAgB,KAAK,MAC1B,KAAK,YAAYC,GAAcH,EAAQ,KAAA,CAAM;AAC7C,UAAMI,IAAoB,OAAO,OAAO;AAAA,MACpC,OAAO;AAAA,MACP,mBAAmB,KAAK,UAAU;AAAA,MAClC,iBAAiB;AAAA,IAAA,CACpB;AACD,SAAK,oBAAoB,IAAItoB,EAA8BsoB,GAAmB;AAAA,MAC1E,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,eAAe,IAAItoB,EAAgC,MAAM;AAAA,MAC1D,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACZ,GACD,KAAK,aAAa,KAAK,mBACvB,KAAK,QAAQ,KAAK,cAClB,KAAK,qBAAqBkoB,EAAQ,UAAU,MAAM;AAC9C,WAAK,gBAAgBA,EAAQ,KAAA,GAAQ,GAAG,EAAK;AAAA,IACjD,CAAC,GACD,KAAK,gBAAgB,KAAK,UAAU,UAAU,GAAG,EAAK;AAAA,EAC1D;AAAA,EAEA,UAAUnlB,GAAwBR,GAA2B;AACzD,SAAK,aAAA,GACLgmB,EAAoBxlB,GAAS,IAAI,GACjCylB,GAAYjmB,CAAK;AACjB,UAAMkmB,IAAQ,KAAK,MAAM1lB,CAAO;AAChC,QAAI0lB,EAAM,OAAO,IAAIlmB,CAAK,EAAG,OAAM,IAAI,MAAM,yCAAyC;AACtF,IAAAkmB,EAAM,OAAO,IAAIlmB,GAAO,EAAC,UAAU,IAAM,GACzC,KAAK,aAAA;AACL,QAAIiN,IAAS;AACb,WAAO,MAAM;AACT,MAAKA,MACLA,IAAS,IACTiZ,EAAM,OAAO,OAAOlmB,CAAK,GACzB,KAAK,mBAAmBkmB,GAAOlmB,CAAK,GACpC,KAAK,mBAAmBkmB,GAAOlmB,CAAK,GAChCkmB,EAAM,OAAO,SAAS,KACnBA,EAAM,QAAQ,SAAS,KACvBA,EAAM,QAAQ,SAAS,KAC1B,KAAK,OAAO,OAAO1lB,CAAO,GAE9B,KAAK,aAAA;AAAA,IACT;AAAA,EACJ;AAAA,EAEA,cAAcA,GAAwBR,GAAqB;AACvD,SAAK,aAAA,GACLgmB,EAAoBxlB,GAAS,IAAI;AACjC,UAAM2lB,IAAa,KAAK,MAAM3lB,CAAO,EAAE,OAAO,IAAIR,CAAK;AACvD,QAAImmB,KAAc,KAAM,OAAM,IAAI,MAAM,yCAAyC;AACjF,IAAAC,GAAc,KAAK,MAAM5lB,CAAO,CAAC,GACjC2lB,EAAW,WAAW,IACtB,KAAK,aAAA;AAAA,EACT;AAAA,EAEA,wBACIzlB,GACAV,GACAqmB,GACAC,GACkD;AAIlD,QAHA,KAAK,aAAA,GACLN,EAAoBtlB,GAAQ,IAAI,GAChCulB,GAAYjmB,CAAK,GACb,CAAC,MAAM,QAAQqmB,CAAQ,EAAG,OAAM,IAAI,UAAU,iCAAiC;AACnF,QAAI,OAAOC,KAAc;AACrB,YAAM,IAAI,UAAU,oDAAoD;AAE5E,UAAMJ,IAAQ,KAAK,MAAMxlB,CAAM,GACzB6lB,wBAAe,IAAA,GACfC,wBAAkB,IAAA;AACxB,eAAWC,KAAWJ,GAAU;AAE5B,UADAhjB,EAAsBojB,EAAQ,KAAK,GAC/BA,EAAQ,MAAM,SAAS;AACvB,cAAM,IAAI,UAAU,+CAA+C;AAEvE,UAAID,EAAY,IAAIC,EAAQ,KAAK,KAAKP,EAAM,QAAQ,IAAIO,EAAQ,KAAK;AACjE,cAAM,IAAI,MAAM,iCAAiCA,EAAQ,MAAM,EAAE,EAAE;AAEvE,MAAAD,EAAY,IAAIC,EAAQ,KAAK;AAC7B,YAAMjmB,IAAU,KAAK,eAAeE,GAAQ+lB,EAAQ,KAAK,GACnD5e,IAAoB;AAAA,QACtB,OAAA7H;AAAA,QACA,YAAYymB,EAAQ;AAAA,QACpB,QAAA/lB;AAAA,QACA,OAAO,CAACgmB,MAAYC,GAAcD,CAAO,MAAMD,EAAQ,MAAM,OACvD,EAAC,OAAO,KAAA,IACR;AAAA,QACN,cAAc,MAAMA,EAAQ,OAAA,IAAW,OAAO;AAAA,QAC9C,UAAU,OAAOpM,GAAOuM,GAAUC,MAAW;AACzC,cAAIJ,EAAQ;AACR,kBAAM,IAAItkB;AAAA,cACN,UAAUskB,EAAQ,MAAM,EAAE;AAAA,YAAA;AAGlC,cAAII,EAAO,QAAS,OAAMA,EAAO;AACjC,uBAAMJ,EAAQ,SAASI,CAAM,GACtBxM;AAAA,QACX;AAAA,QACA,SAAS,MAAM7Z;AAAA,QACf,qBAAqB,MAAM;AAAA,QAAC;AAAA,MAAA;AAEhC,MAAA0lB,EAAM,QAAQ,IAAIO,EAAQ,OAAO5e,CAAK,GACtC0e,EAAS,IAAIE,EAAQ,OAAOjmB,CAAO;AAAA,IACvC;AACA,UAAMsmB,IAAcR,EAAU,MAAM,KAAK,mBAAmB;AAC5D,eAAWxjB,KAAc0jB,GAAa;AAClC,YAAM3e,IAAQqe,EAAM,QAAQ,IAAIpjB,CAAU;AAC1C,MAAI+E,KAAS,SACPA,EAA4C,sBAAsBif;AAAA,IAE5E;AACA,gBAAK,aAAA,GACEP;AAAA,EACX;AAAA,EAEA,iBAAiB7lB,GAAuBV,GAAqB;AACzD,UAAMkmB,IAAQ,KAAK,OAAO,IAAIxlB,CAAM;AACpC,IAAIwlB,KAAS,SACb,KAAK,mBAAmBA,GAAOlmB,CAAK,GACpC,KAAK,aAAA;AAAA,EACT;AAAA,EAEA,mBACIU,GACAV,GACAymB,GAC8D;AAK9D,QAJA,KAAK,aAAA,GACLT,EAAoBtlB,GAAQ,IAAI,GAChCulB,GAAYjmB,CAAK,GACjBqD,EAAsBojB,EAAQ,KAAK,GAC/BA,EAAQ,MAAM,SAAS;AACvB,YAAM,IAAI,UAAU,mDAAmD;AAG3E,QADAM,GAAsBN,EAAQ,cAAc,qBAAqB,GAC7DA,EAAQ,WAAW,QAAQ,OAAOA,EAAQ,WAAY;AACtD,YAAM,IAAI,UAAU,yCAAyC;AAEjE,UAAMP,IAAQ,KAAK,MAAMxlB,CAAM;AAC/B,QAAIwlB,EAAM,QAAQ,IAAIO,EAAQ,KAAK;AAC/B,YAAM,IAAI,MAAM,iCAAiCA,EAAQ,MAAM,EAAE,EAAE;AAEvE,UAAMO,IAAa,CAACnqB,MAAkB,KAAK,iBAAiB6D,GAAQ+lB,EAAQ,OAAO5pB,CAAK,GAClFiqB,IAAcL,EAAQ,aAAa,UAAU,MAAM,KAAK,qBAAqB;AAAA,MAC/E,aAAa;AAAA,IAAA,CAChB,GACK5e,IAAoB;AAAA,MACtB,OAAA7H;AAAA,MACA,YAAYymB,EAAQ;AAAA,MACpB,QAAA/lB;AAAA,MACA,OAAO,CAACgmB,MAAY;AAChB,cAAMO,IAAUN,GAAcD,CAAO,GAC/B7pB,IAAQ4pB,EAAQ,MAAM,MAAM,MAAMQ,CAAO;AAE/C,YADkBR,EAAQ,MAAM,MAAM,OAAO5pB,CAAK,MAChCoqB;AACd,gBAAM,IAAI;AAAA,YACN,oBAAoBR,EAAQ,MAAM,IAAI;AAAA,UAAA;AAG9C,eAAO,EAAC,OAAA5pB,EAAA;AAAA,MACZ;AAAA,MACA,cAAc,MAAM4pB,EAAQ,aAAa,IAAA;AAAA,MACzC,UAAU,OAAOpM,GAAO7Z,GAASqmB,MAAW;AACxC,cAAMtH,IAASlF,EAAM,OACf6M,IAAWT,EAAQ,WAAW,OAC9BlH,IACA,MAAMkH,EAAQ,QAAQlH,GAAQ/e,GAASqmB,CAAM;AACnD,YAAIK,aAAoBllB,GAAe,QAAOklB;AAC9C,YAAIL,EAAO,QAAS,OAAMA,EAAO;AACjC,oBAAK,gBAAgB,MAAMJ,EAAQ,aAAa;AAAA,UAC5CS;AAAA,UACA;AAAA,QAAA,CACH,GACM,EAAC,OAAOA,EAAA;AAAA,MACnB;AAAA,MACA,SAAS,CAACrqB,MAAUmqB,EAAWnqB,CAAe;AAAA,MAC9C,qBAAqBiqB;AAAA,IAAA;AAEzB,IAAAZ,EAAM,QAAQ,IAAIO,EAAQ,OAAO5e,CAAK,GACtC,KAAK,aAAA;AACL,QAAIoF,IAAS;AACb,WAAO;AAAA,MACH,SAASka,GAAkBV,EAAQ,cAAcO,GAAYtmB,CAAM;AAAA,MACnE,YAAAsmB;AAAA,MACA,SAAS,MAAM;AACX,YAAI,CAAC/Z,EAAQ;AACb,QAAAA,IAAS,IACOiZ,EAAM,QAAQ,IAAIO,EAAQ,KAAK,MAC/B5e,KAAOqe,EAAM,QAAQ,OAAOO,EAAQ,KAAK,GACzDK,EAAA,GACA,KAAK,aAAA;AAAA,MACT;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,cACItmB,GACAR,GACAymB,GACU;AACV,SAAK,aAAA,GACLT,EAAoBxlB,GAAS,IAAI,GACjCylB,GAAYjmB,CAAK;AACjB,UAAMtC,IAAO0pB,GAAUX,EAAQ,IAAI;AACnC,IAAAM,GAAsBN,EAAQ,cAAc,qBAAqB,GACjExiB,GAAsBwiB,EAAQ,KAAK;AACnC,UAAMY,IAASZ,EAAQ,UAAU,OAAO;AACxC,QAAI,OAAOY,KAAW,WAAY,OAAM,IAAI,UAAU,uCAAuC;AAC7F,UAAMnB,IAAQ,KAAK,MAAM1lB,CAAO;AAChC,QAAI0lB,EAAM,QAAQ,IAAIxoB,CAAI,SAAS,IAAI,MAAM,+BAA+BA,CAAI,EAAE;AAClF,SAAK,gBAAgB,IAAIA,CAAI;AAC7B,UAAMopB,IAAcL,EAAQ,aAAa,UAAU,MAAM,KAAK,qBAAqB;AAAA,MAC/E,aAAa;AAAA,IAAA,CAChB,GACK5e,IAA4B;AAAA,MAC9B,OAAA7H;AAAA,MACA,SAAAQ;AAAA,MACA,MAAA9C;AAAA,MACA,SAAS+oB,EAAQ;AAAA,MACjB,OAAOA,EAAQ;AAAA,MACf,cAAcA,EAAQ;AAAA,MACtB,QAAAY;AAAA,MACA,qBAAqBP;AAAA,IAAA;AAEzB,IAAAZ,EAAM,QAAQ,IAAIxoB,GAAMmK,CAA4B,GACpD,KAAK,gBAAgBA,GAAO,KAAK,SAAS,GAC1C,KAAK,aAAA;AACL,QAAIoF,IAAS;AACb,WAAO,MAAM;AACT,MAAKA,MACLA,IAAS,IACLiZ,EAAM,QAAQ,IAAIxoB,CAAI,MAAMmK,KAAOqe,EAAM,QAAQ,OAAOxoB,CAAI,GAChEopB,EAAA,GACA,KAAK,kBAAA;AAAA,IACT;AAAA,EACJ;AAAA,EAEA,SACI7kB,GACAzE,IAA6C,IAChC;AACb,SAAK,aAAA;AACL,UAAMmnB,IAAW2C,GAAgBrlB,CAAM,IACjC,KAAK,cAAcA,CAAM,IACzBiC,GAAkBqjB,GAAetlB,CAAM,CAAC;AAC9C,gBAAK,aAAa,IAAI,MAAM,2BAA2B,IAClDzE,EAAQ,WAAW,YAAY,YAAW,KAAK,QAAQ,QAAQmnB,CAAQ,IACvE,KAAK,QAAQ,KAAKA,CAAQ,GACxB,KAAK,gBAAgBA,GAAU,GAAG,EAAI;AAAA,EACjD;AAAA,EAEA,SAAS1iB,GAAoD;AACzD,WAAO,KAAK,SAASA,GAAQ,EAAC,SAAS,WAAU;AAAA,EACrD;AAAA,EAEA,KAAKA,GAA6C;AAC9C,SAAK,aAAA;AACL,UAAM0iB,IAAW2C,GAAgBrlB,CAAM,IACjC,KAAK,cAAcA,CAAM,IACzBiC,GAAkBqjB,GAAetlB,CAAM,CAAC;AAC9C,WAAO,KAAK,QAAQ,KAAK0iB,CAAQ;AAAA,EACrC;AAAA,EAEA,QAAQvhB,GAAwBokB,GAAoC;;AAChE,IAAAnkB,EAAsBD,CAAK,GAC3B4iB,EAAoBwB,GAAM,IAAI;AAC9B,QAAIhnB,IAAgCgnB;AACpC,WAAOhnB,KAAW,QAAM;AACpB,YAAMqH,KAAQrJ,IAAA,KAAK,OAAO,IAAIgC,CAAO,MAAvB,gBAAAhC,EAA0B,QAAQ,IAAI4E;AACpD,UAAIyE,KAAS,MAAM;AACf,cAAMhL,IAAQgL,EAAM,aAAA;AACpB,YAAIA,EAAM,WAAW,SAAS,eAAehL,KAAS;AAClD,gBAAM,IAAI;AAAA,YACN,kBAAkBuG,EAAM,EAAE;AAAA,UAAA;AAGlC,eAAOyE,EAAM,QAAQhL,CAAK;AAAA,MAC9B;AACA,MAAA2D,IAAUA,EAAQ;AAAA,IACtB;AACA,UAAM,IAAI,MAAM,UAAU4C,EAAM,EAAE,kDAAkD;AAAA,EACxF;AAAA,EAEA,uBAA+B;AAC3B,WAAO,KAAK,oBAAA;AAAA,EAChB;AAAA,EAEA,SAASnB,GAAqCyC,IAAQ,IAAgB;AAClE,UAAMlE,IAAU8mB,GAAgBrlB,CAAM,IAChCA,IACA,KAAK,qBAAqBslB,GAAetlB,CAAM,CAAC;AACtD,WAAOyC,IAAQlE,MAAY,KAAK,gBAAgBinB,GAAWjnB,GAAS,KAAK,aAAa;AAAA,EAC1F;AAAA,EAEA,UAAgB;;AACZ,QAAI,MAAK,UACT;AAAA,WAAK,WAAW,KAChBhC,IAAA,KAAK,eAAL,QAAAA,EAAiB,MAAM,IAAI,aAAa,mBAAmB,YAAY,IACvE,KAAK,aAAa,MAClB,KAAK,mBAAA;AACL,iBAAW0nB,KAAS,KAAK,OAAO,OAAA,GAAU;AACtC,cAAMwB,wBAAoB,IAAA;AAC1B,mBAAW7f,KAASqe,EAAM,QAAQ,OAAA,EAAU,CAAAwB,EAAc,IAAI7f,EAAM,mBAAmB;AACvF,mBAAWA,KAASqe,EAAM,QAAQ,OAAA,EAAU,CAAAwB,EAAc,IAAI7f,EAAM,mBAAmB;AACvF,mBAAWif,KAAeY,EAAe,CAAAZ,EAAA;AAAA,MAC7C;AACA,WAAK,OAAO,MAAA,GACZ,KAAK,gBAAgB,MAAA,GACrB,KAAK,aAAA,GACL,KAAK,kBAAkB,QAAA,GACvB,KAAK,aAAa,QAAA;AAAA;AAAA,EACtB;AAAA,EAEQ,gBACJnC,GACAgD,GACAC,GACa;;AACb,SAAK,aAAA,IACLppB,IAAA,KAAK,eAAL,QAAAA,EAAiB,MAAM,IAAI,aAAa,yBAAyB,YAAY;AAC7E,UAAMqpB,IAAa,IAAI,gBAAA;AACvB,gBAAK,aAAaA,GAClB,KAAK,YAAY/B,GAAcnB,CAAQ,GACnCiD,KAAY,KAAK,aAAa,IAAI,MAAM,0BAA0B,GACtE,KAAK,kBAAkB,IAAI,OAAO,OAAO;AAAA,MACrC,OAAO;AAAA,MACP,mBAAmB,KAAK,UAAU;AAAA,MAClC,iBAAiB,KAAK,cAAc,KAAK,aAAa;AAAA,IAAA,CACzD,GAAG,0BAA0B,GACvB,KAAK,cAAc,KAAK,WAAWC,GAAYF,CAAa,EAAE,MAAM,CAAClgB,MAAU;AAClF,UAAI,CAACogB,EAAW,OAAO,QAAS,OAAMpgB;AAAA,IAC1C,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,cACVtH,GACA0nB,GACAF,GACa;AACb,UAAMd,IAASgB,EAAW;AAC1B,QAAIrnB,IAAU,KAAK;AACnB,UAAM5C,wBAAa,IAAA;AAEnB,eAAW8oB,KAAWvmB,EAAU,UAAU;AACtC,YAAM+lB,IAAQ,MAAM,KAAK,qBAAqB1lB,GAASqmB,CAAM;AAC7D,UAAIxM;AACJ,UAAI;AACA,QAAAA,IAAQyN,GAAW5B,GAAOQ,CAAO;AAAA,MACrC,SAASjf,GAAO;AACZ,aAAK,SAAStH,GAAWK,GAAS,MAAMunB,GAAkBtgB,CAAK,CAAC;AAChE;AAAA,MACJ;AACA,UAAI4S,KAAS,MAAM;AACf,aAAK,SAASla,GAAWK,GAAS,MAAM,0BAA0BmmB,GAAcD,CAAO,CAAC,GAAG;AAC3F;AAAA,MACJ;AACA,YAAMsB,IAAsC,OAAO,OAAO;AAAA,QACtD,mBAAmB7nB,EAAU;AAAA,QAC7B,gBAAgBvC;AAAA,MAAA,CACnB;AACD,UAAI;AACA,cAAMsT,IAAS,MAAMmJ,EAAM,MAAM,SAASA,EAAM,OAAO2N,GAAgBnB,CAAM;AAC7E,YAAI3V,aAAkBlP,IAAe;AACjC,cAAI2lB,KAAiBlC,IAAe;AAChC,iBAAK,SAAStlB,GAAWK,GAAS6Z,EAAM,MAAM,YAAY,0BAA0B;AACpF;AAAA,UACJ;AACA,gBAAMpY,IAASiC,GAAkBgN,EAAO,MAAM;AAC9C,eAAK,QAAQ,QAAQjP,CAAM,GAC3B,MAAM,KAAK,gBAAgBA,GAAQ0lB,IAAgB,GAAG,EAAK;AAC3D;AAAA,QACJ;AACA,QAAAtN,IAAQ,EAAC,OAAOA,EAAM,OAAO,OAAOnJ,EAAA;AAAA,MACxC,SAASzJ,GAAO;AACZ,YAAIof,EAAO,QAAS;AACpB,aAAK;AAAA,UACD1mB;AAAA,UACAK;AAAA,UACA6Z,EAAM,MAAM;AAAA,UACZ0N,GAAkBtgB,CAAK;AAAA,QAAA;AAE3B;AAAA,MACJ;AACA,MAAA7J,EAAO,IAAIyc,EAAM,MAAM,YAAYA,EAAM,MAAM,KAAK,GACpD7Z,IAAU6Z,EAAM,MAAM,QAAQA,EAAM,MAAM,KAAK;AAAA,IACnD;AAOA,QALIwM,EAAO,YACPrmB,MAAY,KAAK,SACjB,MAAM,KAAK,qBAAqB,KAAK,MAAMqmB,CAAM,GACjDrmB,IAAU,KAAK,kBAAA,IAEfqmB,EAAO,SAAS;AACpB,SAAK,gBAAgBrmB,GACrB,KAAK,sBAAsBA,GAASL,CAAS;AAC7C,UAAM8nB,IAAU,KAAK,cAAcznB,CAAO;AAC1C,IAAIynB,MAAY9nB,EAAU,YAAU,KAAK,QAAQ,QAAQ8nB,CAAO,GAChE,KAAK,kBAAkB,IAAI,OAAO,OAAO;AAAA,MACrC,OAAO;AAAA,MACP,mBAAmB9nB,EAAU;AAAA,MAC7B,iBAAiB8nB;AAAA,IAAA,CACpB,GAAG,0BAA0B,GAC9B,KAAK,kBAAA;AAAA,EACT;AAAA,EAEA,MAAc,qBACVznB,GACAqmB,GACoB;AACpB,eAAa;AACT,UAAIA,EAAO,QAAS,OAAMA,EAAO;AACjC,YAAMX,IAAQ,KAAK,OAAO,IAAI1lB,CAAO;AACrC,UAAI0lB,KAAS,QAAQgC,GAAgBhC,CAAK,EAAG,QAAOA;AACpD,YAAM,KAAK,sBAAsBW,CAAM;AAAA,IAC3C;AAAA,EACJ;AAAA,EAEQ,sBAAsBA,GAAoC;AAC9D,WAAO,IAAI,QAAQ,CAACsB,GAASC,MAAW;AACpC,YAAMC,IAAO,MAAM;AACf,QAAAxB,EAAO,oBAAoB,SAASyB,CAAK,GACzC,KAAK,gBAAgB,OAAOD,CAAI,GAChCF,EAAA;AAAA,MACJ,GACMG,IAAQ,MAAM;AAChB,aAAK,gBAAgB,OAAOD,CAAI,GAChCD,EAAOvB,EAAO,MAAM;AAAA,MACxB;AACA,WAAK,gBAAgB,IAAIwB,CAAI,GAC7BxB,EAAO,iBAAiB,SAASyB,GAAO,EAAC,MAAM,IAAK;AAAA,IACxD,CAAC;AAAA,EACL;AAAA,EAEQ,eAAqB;AACzB,UAAMC,IAAU,CAAC,GAAG,KAAK,eAAe;AACxC,SAAK,gBAAgB,MAAA;AACrB,eAAWF,KAAQE,EAAS,CAAAF,EAAA;AAAA,EAChC;AAAA,EAEQ,SACJloB,GACAK,GACAgoB,GACAC,GACI;AACJ,SAAK,gBAAgBjoB;AACrB,UAAMkoB,IAAmBloB,MAAY,KAAK,OACpC,KAAK,wBACL,KAAK,cAAcA,CAAO;AAChC,SAAK,QAAQ,QAAQkoB,CAAgB,GACrC,KAAK,aAAa,IAAI,OAAO,OAAO;AAAA,MAChC,mBAAmBvoB,EAAU;AAAA,MAC7B,gBAAeqoB,KAAA,gBAAAA,EAAa,OAAM;AAAA,MAClC,QAAAC;AAAA,MACA,kBAAAC;AAAA,IAAA,CACH,GAAG,yBAAyB,GAC7B,KAAK,kBAAkB,IAAI,OAAO,OAAO;AAAA,MACrC,OAAO;AAAA,MACP,mBAAmBvoB,EAAU;AAAA,MAC7B,iBAAiBuoB;AAAA,IAAA,CACpB,GAAG,4BAA4B;AAAA,EACpC;AAAA,EAEQ,eACJhoB,GACA0C,GACa;AACb,WAAO,KAAK,cAAc1C,GAAQ0C,GAAOA,EAAM,MAAM,IAAI;AAAA,EAC7D;AAAA,EAEQ,qBAAqBnB,GAAoC;AAC7D,QAAIzB,IAAU,KAAK;AACnB,eAAWkD,KAAQzB,EAAO;AACtB,MAAI,WAAWyB,IACXlD,IAAU,KAAK,iBAAiBA,GAASkD,EAAK,OAAOA,EAAK,KAAK,IAE/DlD,IAAU,KAAK,eAAeA,GAASkD,CAAI;AAGnD,WAAOlD;AAAA,EACX;AAAA,EAEQ,iBACJE,GACA0C,GACAvG,GACa;AACb,UAAMyG,IAAYF,EAAM,MAAM,OAAOvG,CAAK;AAC1C,QAAI,OAAOyG,KAAc,YAAYA,MAAc,MAAMA,EAAU,SAAS,GAAG;AAC3E,YAAM,IAAI,UAAU,oBAAoBF,EAAM,IAAI,gCAAgC;AAEtF,WAAO,KAAK,cAAc1C,GAAQ0C,GAAOE,GAAWzG,CAAK;AAAA,EAC7D;AAAA,EAEQ,cACJ6D,GACA0C,GACAsjB,GACA7pB,GACa;AACb,UAAMmoB,IAAW2D,GAASjoB,EAAO,UAAUgmB,CAAO,GAC5CrW,IAAM,GAAGuY,GAAWloB,CAAM,CAAC,KAAS0C,EAAM,EAAE,KAASsjB,CAAO,IAC5DtS,IAAW,KAAK,aAAa,IAAI/D,CAAG;AAC1C,QAAI+D,KAAY,KAAM,QAAOA;AAC7B,UAAM5T,IAAyB,OAAO,OAAO,EAAC,OAAA4C,GAAO,QAAA1C,GAAQ,SAAAgmB,GAAS,OAAA7pB,GAAO,UAAAmoB,GAAS;AACtF,WAAAa,GAAoB,IAAIrlB,GAAS,IAAI,GACrC,KAAK,aAAa,IAAI6P,GAAK7P,CAAO,GAC3BA;AAAA,EACX;AAAA,EAEQ,MAAMA,GAAqC;AAC/C,QAAI0lB,IAAQ,KAAK,OAAO,IAAI1lB,CAAO;AACnC,WAAI0lB,KAAS,SACTA,IAAQ,EAAC,QAAQ,oBAAI,OAAO,SAAS,oBAAI,OAAO,SAAS,oBAAI,MAAI,GACjE,KAAK,OAAO,IAAI1lB,GAAS0lB,CAAK,IAE3BA;AAAA,EACX;AAAA,EAEQ,mBAAmBA,GAAoBlmB,GAAqB;AAChE,UAAM0nB,wBAAoB,IAAA;AAC1B,eAAW,CAACtkB,GAAOyE,CAAK,KAAKqe,EAAM;AAC/B,MAAIre,EAAM,UAAU7H,MACpB0nB,EAAc,IAAI7f,EAAM,mBAAmB,GAC3Cqe,EAAM,QAAQ,OAAO9iB,CAAK;AAE9B,eAAW0jB,KAAeY,EAAe,CAAAZ,EAAA;AAAA,EAC7C;AAAA,EAEQ,mBAAmBZ,GAAoBlmB,GAAqB;AAChE,eAAW,CAACtC,GAAMmK,CAAK,KAAKqe,EAAM;AAC9B,MAAIre,EAAM,UAAU7H,MACpB6H,EAAM,oBAAA,GACNqe,EAAM,QAAQ,OAAOxoB,CAAI;AAAA,EAEjC;AAAA,EAEQ,oBAA0B;AAC9B,IAAI,KAAK,WAAW,KAAK,KAAK,YAAY,KAAK,eAC/C,KAAK,aAAa,IAClB,eAAe,MAAM;AAGjB,UAFA,KAAK,aAAa,IACd,KAAK,WAAW,KAAK,KAAK,YAC1B,KAAK,kBAAkB,IAAA,EAAM,UAAU,UAAW;AACtD,YAAMinB,IAAW,KAAK,oBAAA;AACtB,MAAIA,MAAa,KAAK,QAAQ,KAAA,KAAQ,KAAK,QAAQ,QAAQA,CAAQ,GACnE,KAAK,YAAYmB,GAAcnB,CAAQ,GACvC,KAAK,gBAAgB,KAAK,kBAAA,GAC1B,KAAK,kBAAkB,IAAI,OAAO,OAAO;AAAA,QACrC,GAAG,KAAK,kBAAkB,IAAA;AAAA,QAC1B,OAAO;AAAA,QACP,iBAAiBA;AAAA,MAAA,CACpB,GAAG,0BAA0B;AAAA,IAClC,CAAC;AAAA,EACL;AAAA,EAEQ,sBAA8B;AAClC,WAAO,KAAK,cAAc,KAAK,kBAAA,CAAmB;AAAA,EACtD;AAAA,EAEQ,oBAAmC;AACvC,QAAInkB,IAAU,KAAK;AACnB,UAAMqoB,wBAAc,IAAA;AACpB,WAAO,CAACA,EAAQ,IAAIroB,CAAO,KAAG;AAC1B,MAAAqoB,EAAQ,IAAIroB,CAAO;AACnB,YAAM0lB,IAAQ,KAAK,OAAO,IAAI1lB,CAAO;AACrC,UAAI0lB,KAAS,KAAM;AACnB,YAAMjZ,IAAS,CAAC,GAAGiZ,EAAM,QAAQ,OAAA,CAAQ,EAAE,OAAO,CAACre,MAC/CA,EAAM,mBAAmB,UAAaA,EAAM,aAAA,MAAmB,IAAI,GACjEihB,IAAkB,CAAC,GAAG5C,EAAM,QAAQ,OAAA,CAAQ,EAAE,KAAK,CAACre,MACtDA,EAAM,WAAW,SAAS,aAAaA,EAAM,aAAA,MAAmB,IAAI,GAClEA,IAAQoF,EAAO,CAAC,KAAK6b;AAC3B,UAAIjhB,KAAS,KAAM;AACnB,YAAMhL,IAAQgL,EAAM,aAAA;AACpB,MAAArH,IAAUqH,EAAM,QAAQhL,CAAK;AAAA,IACjC;AACA,WAAO2D;AAAA,EACX;AAAA,EAEQ,cAAcA,GAAgC;AAClD,UAAM4D,IAAS,IAAI,gBAAgB,KAAK,UAAU,MAAM;AACxD,eAAW1G,KAAQ,KAAK,gBAAiB,CAAA0G,EAAO,OAAO1G,CAAI;AAC3D,eAAWqrB,KAAkBC,GAAaxoB,CAAO,GAAG;AAChD,YAAM0lB,IAAQ,KAAK,OAAO,IAAI6C,CAAc;AAC5C,UAAI7C,KAAS;AACb,mBAAWre,KAAS,CAAC,GAAGqe,EAAM,QAAQ,OAAA,CAAQ,EAAE,KAAK,CAAC5hB,GAAMC,MACxDD,EAAK,KAAK,cAAcC,EAAM,IAAI,CAAC,GAAG;AACtC,cAAIsD,EAAM,OAAOA,EAAM,QAAQ,OAAOA,EAAM,YAAY,EAAG;AAC3D,gBAAMjK,IAASiK,EAAM,MAAM,OAAOA,EAAM,QAAQ,KAAK;AACrD,cAAI,CAAC,MAAM,QAAQjK,CAAM;AACrB,kBAAM,IAAI,UAAU,gBAAgBiK,EAAM,IAAI,8BAA8B;AAEhF,qBAAWhL,KAASe,EAAQ,CAAAwG,EAAO,OAAOyD,EAAM,MAAMhL,CAAK;AAAA,QAC/D;AAAA,IACJ;AACA,IAAAuH,EAAO,KAAA;AACP,UAAMP,IAAQO,EAAO,SAAA;AACrB,WAAO,GAAG5D,EAAQ,QAAQ,GAAGqD,MAAU,KAAK,KAAK,IAAIA,CAAK,EAAE;AAAA,EAChE;AAAA,EAEQ,sBAAsBrD,GAAwBL,GAAiC;AACnF,eAAW4oB,KAAkBC,GAAaxoB,CAAO,GAAG;AAChD,YAAM0lB,IAAQ,KAAK,OAAO,IAAI6C,CAAc;AAC5C,UAAI7C,KAAS;AACb,mBAAWre,KAASqe,EAAM,QAAQ,OAAA,EAAU,MAAK,gBAAgBre,GAAO1H,CAAS;AAAA,IACrF;AAAA,EACJ;AAAA,EAEQ,gBAAwB0H,GAA2B1H,GAAiC;;AACxF,QAAI,CAACsnB,GAAW5f,EAAM,SAAS,KAAK,aAAa,KAC1C,CAACohB,GAAaphB,EAAM,QAAQ,UAAU1H,EAAU,QAAQ,EAAG;AAClE,UAAMkE,IAAMlE,EAAU,OAAO,OAAO0H,EAAM,IAAI;AAC9C,QAAI;AACA,YAAMhL,IAAQwH,EAAI,WAAW,IAAIwD,EAAM,eAAeA,EAAM,MAAM,MAAMxD,CAAG;AAC3E,MAAKwD,EAAM,OAAOA,EAAM,QAAQ,IAAA,GAAOhL,CAAK,KACxC,KAAK,gBAAgB,MAAMgL,EAAM,QAAQ,IAAIhL,GAAO,sBAAsB,CAAC;AAAA,IAEnF,SAAS4K,GAAO;AACZ,MAAKI,EAAM,OAAOA,EAAM,QAAQ,IAAA,GAAOA,EAAM,YAAY,KACrD,KAAK,gBAAgB,MAAMA,EAAM,QAAQ;AAAA,QACrCA,EAAM;AAAA,QACN;AAAA,MAAA,CACH;AAEL,YAAMzD,IAAS,IAAI,gBAAgBjE,EAAU,MAAM;AACnD,MAAAiE,EAAO,OAAOyD,EAAM,IAAI,GACxBzD,EAAO,KAAA;AACP,YAAMskB,IAAmB,GAAGvoB,EAAU,QAAQ,GAAGiE,EAAO,SAAS,IAC3D,KACA,IAAIA,EAAO,SAAA,CAAU,EAAE;AAC7B,WAAK,QAAQ,QAAQskB,CAAgB,GACrC,KAAK,aAAa,IAAI,OAAO,OAAO;AAAA,QAChC,mBAAmBvoB,EAAU;AAAA,QAC7B,iBAAe3B,IAAAqJ,EAAM,QAAQ,UAAd,gBAAArJ,EAAqB,OAAM;AAAA,QAC1C,QAAQupB,GAAkBtgB,CAAK;AAAA,QAC/B,kBAAAihB;AAAA,MAAA,CACH,GAAG,qBAAqB;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEQ,gBAAgBQ,GAA0B;AAC9C,SAAK,YAAY;AACjB,QAAI;AACA,MAAAA,EAAA;AAAA,IACJ,UAAA;AACI,WAAK,YAAY;AAAA,IACrB;AAAA,EACJ;AAAA,EAEQ,eAAqB;AACzB,QAAI,KAAK,SAAU,OAAM,IAAI,MAAM,iCAAiC;AAAA,EACxE;AACJ;AAEA,MAAMrD,yBAA0B,QAAA;AAEzB,SAASsD,GAAoB3rB,GAA8C;AAC9E,MAAIA,KAAW,QAAQ,OAAOA,KAAY,YAAY,MAAM,QAAQA,CAAO;AACvE,UAAM,IAAI,UAAU,0CAA0C;AAElE,SAAO,IAAIkoB,GAAcloB,EAAQ,OAAO;AAC5C;AAEO,SAAS4rB,GACZjV,GACAkV,GACAxC,GACe;AACf,MAAI1S,KAAW,QAAQ,OAAOA,EAAQ,aAAc;AAChD,UAAM,IAAI,UAAU,+CAA+C;AAEvE,MAAI,OAAOkV,KAAW;AAClB,UAAM,IAAI,UAAU,oDAAoD;AAE5E,SAAO,IAAI,QAAQ,CAAClB,GAASC,MAAW;AACpC,QAAIH,IAAU,IACVnB,IAAc,MAAM;AAAA,IAAC;AACzB,UAAMwC,IAAS,CAACJ,MAAuB;AACnC,MAAIjB,MACJA,IAAU,IACVnB,EAAA,GACAD,EAAO,oBAAoB,SAASyB,CAAK,GACzCY,EAAA;AAAA,IACJ,GACMZ,IAAQ,MAAM;AAChB,MAAAgB,EAAO,MAAMlB,EAAOvB,EAAO,MAAM,CAAC;AAAA,IACtC,GACM0C,IAAU,CAAC1sB,GAAe0W,GAAoB9L,MAAyB;AACzE,MAAI8L,MAAe,UACf+V,EAAO,MAAMlB;AAAA,QACT3gB,KAAS,IAAItF,GAAsB,2BAA2B;AAAA,MAAA,CACjE,IACMknB,EAAOxsB,CAAK,KACnBysB,EAAO,MAAMnB,EAAQtrB,CAAK,CAAC;AAAA,IAEnC;AACA,QAAIgqB,EAAO,SAAS;AAChB,MAAAyB,EAAA;AACA;AAAA,IACJ;AAEA,IADAiB,EAAQpV,EAAQ,OAAOA,EAAQ,iBAAiBA,EAAQ,UAAU,GAC9D,CAAA8T,MACJnB,IAAc3S,EAAQ,UAAU,CAAC,EAAC,OAAAtX,GAAO,YAAA0W,GAAY,OAAA9L,QAAW;AAC5D,MAAA8hB,EAAQ1sB,GAAO0W,GAAY9L,CAAK;AAAA,IACpC,GAAG,EAAC,aAAa,IAAM,GACnBwgB,IAASnB,EAAA,MACD,iBAAiB,SAASwB,GAAO,EAAC,MAAM,IAAK;AAAA,EAC7D,CAAC;AACL;AAEA,SAASxC,GAAcnB,GAAkC;AACrD,QAAMO,IAAaR,EAAuBC,CAAQ,GAC5CY,IAAaL,EAAW,QAAQ,GAAG,GACnCF,IAAWO,IAAa,IAAIL,IAAaA,EAAW,MAAM,GAAGK,CAAU,GACvE1hB,IAAQ0hB,IAAa,IAAI,KAAKL,EAAW,MAAMK,IAAa,CAAC,GAC7DiE,IAAcxE,EAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACtD,SAAO,OAAO,OAAO;AAAA,IACjB,UAAUE;AAAA,IACV,UAAAF;AAAA,IACA,UAAU,OAAO,OAAOwE,CAAW;AAAA,IACnC,QAAQ,IAAI,gBAAgB3lB,CAAK;AAAA,EAAA,CACpC;AACL;AAEA,SAASuiB,GAAcF,GAA0B;AAC7C,QAAMxmB,wBAAU,IAAA,GACV+pB,wBAAmB,IAAA;AACzB,MAAIC,IAAuC;AAC3C,aAAW7hB,KAASqe,EAAM,QAAQ,OAAA,GAAU;AACxC,QAAIxmB,EAAI,IAAImI,EAAM,WAAW,EAAE;AAC3B,YAAM,IAAI,MAAM,oCAAoCA,EAAM,WAAW,EAAE,EAAE;AAG7E,QADAnI,EAAI,IAAImI,EAAM,WAAW,EAAE,GACvBA,EAAM,WAAW,SAAS,WAAW;AACrC,UAAI4hB,EAAa,IAAI5hB,EAAM,WAAW,IAAI;AACtC,cAAM,IAAI,MAAM,sCAAsCA,EAAM,WAAW,IAAI,EAAE;AAEjF,MAAA4hB,EAAa,IAAI5hB,EAAM,WAAW,IAAI;AAAA,IAC1C,OAAA;AAAA,UAAW6hB,KAAa;AACpB,cAAM,IAAI;AAAA,UACN,4CAA4CA,EAAU,EAAE,KAAK7hB,EAAM,WAAW,EAAE;AAAA,QAAA;AAGpF,MAAA6hB,IAAY7hB,EAAM;AAAA;AAAA,EAE1B;AACJ;AAEA,SAASigB,GACL5B,GACAQ,GAC8C;AAC9C,QAAMze,IAAU,CAAC,GAAGie,EAAM,QAAQ,QAAQ,EAAE,KAAK,CAAC5hB,GAAMC,MACpDD,EAAK,WAAW,SAASC,EAAM,WAAW,OACpC,IACAD,EAAK,WAAW,SAAS,YAAY,KAAK,CAAC;AACrD,aAAWuD,KAASI,GAAS;AACzB,UAAMoS,IAAQxS,EAAM,MAAM6e,CAAO;AACjC,QAAIrM,KAAS,KAAM,QAAO,EAAC,OAAAxS,GAAO,OAAAwS,EAAA;AAAA,EACtC;AACA,SAAO;AACX;AAEA,SAAS6N,GAAgBhC,GAA6B;AAClD,SAAOA,EAAM,OAAO,OAAO,KACpB,CAAC,GAAGA,EAAM,OAAO,OAAA,CAAQ,EAAE,MAAM,CAAC,EAAC,UAAAyD,EAAA,MAAcA,CAAQ;AACpE;AAEA,SAASX,GAAaxoB,GAAyC;AAC3D,QAAM0Q,IAA0B,CAAA;AAChC,MAAI7R,IAAgCmB;AACpC,SAAOnB,KAAW;AACd,IAAA6R,EAAO,QAAQ7R,CAAO,GACtBA,IAAUA,EAAQ;AAEtB,SAAO6R;AACX;AAEA,SAASuW,GAAWmC,GAAyBppB,GAAiC;AAC1E,MAAInB,IAAgCmB;AACpC,SAAOnB,KAAW,QAAM;AACpB,QAAIA,MAAYuqB,EAAU,QAAO;AACjC,IAAAvqB,IAAUA,EAAQ;AAAA,EACtB;AACA,SAAO;AACX;AAEA,SAAS4pB,GAAavoB,GAAgB+B,GAAuB;AACzD,SAAO/B,MAAW,OAAO+B,MAAS/B,KAAU+B,EAAK,WAAW,GAAG/B,CAAM,GAAG;AAC5E;AAEA,SAASioB,GAASjoB,GAAgBgmB,GAAyB;AACvD,SAAO,GAAGhmB,MAAW,MAAM,KAAKA,CAAM,IAAI,mBAAmBgmB,CAAO,CAAC;AACzE;AAEA,SAASkC,GAAWpoB,GAAgC;AAChD,SAAOA,EAAQ;AACnB;AAEA,SAASmmB,GAAcD,GAAyB;AAC5C,MAAI;AACA,WAAO,mBAAmBA,CAAO;AAAA,EACrC,QAAQ;AACJ,UAAM,IAAIvkB,GAAsB,2CAA2C;AAAA,EAC/E;AACJ;AAEA,SAASilB,GAAUvqB,GAAwB;AACvC,MAAI,OAAOA,KAAU,YAAY,CAAC,4BAA4B,KAAKA,CAAK;AACpE,UAAM,IAAI,UAAU,uEAAuE;AAE/F,SAAOA;AACX;AAEA,SAASkrB,GAAkBtgB,GAAwB;AAC/C,SAAOA,aAAiB,SAASA,EAAM,YAAY,KAC7CA,EAAM,UACN;AACV;AAEA,SAAS0f,GACLhT,GACA6S,GACAtmB,GACa;AACb,QAAMrB,IAAU8U,EAAQ,IAAA;AACxB,SAAO9U,KAAW,OAAOqB,IAASsmB,EAAW3nB,CAAO;AACxD;AAEA,SAASkoB,GAAetlB,GAAkC;AACtD,SAAAC,GAAkBD,CAAM,GACjBA;AACX;AAEA,SAASqlB,GAAgBzqB,GAAwC;AAC7D,SAAOA,KAAS,QAAQ,OAAOA,KAAU,YAAYgpB,GAAoB,IAAIhpB,CAAK;AACtF;AAEA,SAASmpB,EACLnpB,GACA+C,GAC8B;AAC9B,MAAI/C,MAAU+C,EAAO,SACjB,CAAC0nB,GAAgBzqB,CAAK,KAAKgpB,GAAoB,IAAIhpB,CAAK,MAAM+C;AAC9D,UAAM,IAAI,UAAU,+CAA+C;AAE3E;AAEA,SAASgmB,GAAwB/oB,GAAoD;AACjF,MAAIA,KAAS,QACN,OAAOA,KAAU,YACjB,OAAO,QAAQ,IAAIA,GAAO,MAAM,KAAM,cACtC,OAAO,QAAQ,IAAIA,GAAO,MAAM,KAAM,cACtC,OAAO,QAAQ,IAAIA,GAAO,MAAM,KAAM,cACtC,OAAO,QAAQ,IAAIA,GAAO,SAAS,KAAM,cACzC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AAC9C,UAAM,IAAI,UAAU,6CAA6C;AAEzE;AAEA,SAASopB,GAAYppB,GAAyC;AAC1D,MAAIA,KAAS,QAAS,OAAOA,KAAU,YAAY,OAAOA,KAAU;AAChE,UAAM,IAAI,UAAU,4CAA4C;AAExE;AAEA,SAASkqB,GAAsBlqB,GAAgB8B,GAAqB;AAChE,MAAI9B,KAAS,QACN,OAAOA,KAAU,YACjB,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,KAAK,KAAM,cACrC,OAAO,QAAQ,IAAIA,GAAO,WAAW,KAAM;AAC9C,UAAM,IAAI,UAAU,GAAG8B,CAAK,6BAA6B;AAEjE;ACn+BO,MAAMkrB,WAAoB9tB,EAA4B;AAAA,EAOzD,YAAYG,GAAyB;;AACjC,UAAMA,CAAK;AANN,IAAAF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACQ,IAAAA,EAAA;AAIb,UAAM8tB,IAAQC,GAAe7tB,EAAM,KAAK,GAClCqC,IAAiC,EAAC,GAAGrC,EAAA;AAC3C,IAAIqC,EAAa,gBAAgB,QAAQrC,EAAM,qBAAqB,SAChEqC,EAAa,eAAerC,EAAM,oBAElCqC,EAAa,gBAAgB,QAAQrC,EAAM,uBAAuB,SAClEqC,EAAa,eAAerC,EAAM,sBAEtC,KAAK,eAAeiB;AAAA,MAChB;AAAA,MACAoB;AAAA,QACAC,IAAAsrB,EAAM,KAAK,CAACE,MAAS,CAACA,EAAK,QAAQ,MAAnC,gBAAAxrB,EAAsC,OAAM;AAAA,MAC5C;AAAA,IAAA,GAEJ,KAAK,oBAAoB,KAAK,cAC9B,KAAK,WAAWxB,EAAU,gBAAgBd,EAAM,EAAE,GAClD,KAAK,YAAY,IAAI6D,GAA0B,MAAM,KAAK,cAAc;AAAA,MACpE,SAAS;AAAA,MACT,eAAe;AAAA,MACf,cAAc;AAAA,MACd,eAAe;AAAA,IAAA,CAClB;AAAA,EACL;AAAA,EAEA,aAAmB;AACf,UAAM+pB,IAAQC,GAAe,KAAK,MAAM,KAAK;AAC7C,IAAAhpB,EAAuB,KAAK,MAAM,aAAa,aAAa,GAC5D,KAAK,UAAU,QAAQ+oB,CAAK,GAC5B,KAAK,MAAM,KAAK,YAAY;AAAA,EAChC;AAAA,EAEA,SAAS5oB,GAAmC;AACxC,WAAAH,EAAuBG,EAAU,aAAa,aAAa,GAC3D,MAAM,SAASA,CAAS,GACxB,KAAK,UAAU,QAAQ6oB,GAAe7oB,EAAU,KAAK,CAAC,GACtD,KAAK,OAAA,GACE;AAAA,EACX;AAAA,EAEA,SAA2B;AACvB,UAAM4oB,IAAQC,GAAe,KAAK,MAAM,KAAK,GACvC1pB,IAASU,EAAuB,KAAK,MAAM,aAAa,aAAa,GACrEQ,IAAW,KAAK,UAAU,SAASuoB,CAAK,GACxCG,IAAa,KAAK,UAAU,cAAcH,GAAOzpB,CAAM,GACvDvB,IAAO,KAAK;AAClB,WAAO,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACJ,IAAI,KAAK;AAAA,QACT,WAAWjB,EAAe,KAAK,KAAK,KAAK;AAAA,QAC3C,UAAAisB,EAAM,IAAI,CAACE,MAAS;AACd,gBAAM/c,IAAS1L,KAAY,QAAQ,OAAO,GAAGA,EAAS,IAAIyoB,EAAK,EAAE;AACjE,iBAAO,gBAAAjrB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEJ,QAAQ,CAACkO;AAAA,cACX,UAAAgd,EAAW,IAAID,EAAK,EAAE,IACd,KAAK,UAAU,cAAcA,GAAMA,EAAK,OAAO,IAC/C;AAAA,YAAA;AAAA,YAJD,OAAOA,EAAK,EAAE;AAAA,UAAA;AAAA,QAK3B,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACT;AAAA,EAES,YAAkB;AACvB,SAAK,UAAU,QAAA;AAAA,EACnB;AA4BJ;AAjGIhuB,EADS6tB,IACO,aAA+B,CAAA,IAuE/C7tB,EAxES6tB,IAwEF,gBAAe,CAAClqB,EAAU,IACjC3D,EAzES6tB,IAyEO,YAAW,iBAE3B7tB,EA3ES6tB,IA2EO,OAAMtqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyB1B,SAASwqB,GAAeD,GAAuC;AAC3D,MAAI,CAAC,MAAM,QAAQA,CAAK,EAAG,OAAM,IAAI,UAAU,oCAAoC;AACnF,QAAMpqB,wBAAU,IAAA,GACV+D,wBAAa,IAAA;AACnB,SAAOqmB,EAAM,IAAI,CAACE,MAAgC;AAC9C,QAAIA,KAAQ,QAAQA,EAAK,MAAM,KAAM,OAAM,IAAI,UAAU,gCAAgC;AACzF,QAAIA,EAAK,SAAS,QAAQA,EAAK,MAAM,SAAS;AAC1C,YAAM,IAAI,UAAU,qDAAqD;AAE7E,QAAItqB,EAAI,IAAIsqB,EAAK,EAAE,EAAG,OAAM,IAAI,MAAM,4BAA4B,OAAOA,EAAK,EAAE,CAAC,EAAE;AACnF,QAAIvmB,EAAO,IAAIumB,EAAK,KAAK,EAAG,OAAM,IAAI,MAAM,2BAA2BA,EAAK,MAAM,EAAE,EAAE;AACtF,WAAAtqB,EAAI,IAAIsqB,EAAK,EAAE,GACfvmB,EAAO,IAAIumB,EAAK,KAAK,GACd;AAAA,MACH,IAAIA,EAAK;AAAA,MACT,OAAOA,EAAK;AAAA,MACZ,UAAU,EAAQA,EAAK;AAAA,MACvB,SAASA,EAAK,WAAWA,EAAK,aAAa,CAAA;AAAA,IAAC;AAAA,EAEpD,CAAC;AACL;ACjJO,MAAME,WAA2BnuB,EAAmC;AAAA,EAApE;AAAA;AAEK,IAAAC,EAAA,oBAAkC;AAAA;AAAA,EAE1C,aAAmB;AACf,UAAM4D,IAAS,KAAK,SAAS;AAC7B,QAAIA,KAAU,QAAQ,KAAK,iBAAiB;AACxC,YAAM,IAAI,MAAM,yDAAyD;AAE7E,SAAK,aAAaA,EAAO,cAAc,KAAK,eAAe,MAAM;AAAA,MAC7D,MAAM,KAAK,MAAM;AAAA,MACjB,cAAc,KAAK,MAAM;AAAA,MACzB,OAAO,KAAK,MAAM;AAAA,MAClB,cAAc,KAAK,MAAM;AAAA,MACzB,GAAI,KAAK,MAAM,UAAU,OAAO,CAAA,IAAK,EAAC,QAAQ,KAAK,MAAM,OAAA;AAAA,IAAM,CAClE;AAAA,EACL;AAAA,EAEA,SAA2B;AACvB,WAAOC,EAAEC,IAAU,MAAM,KAAK,MAAM,YAAY,EAAE;AAAA,EACtD;AAAA,EAES,YAAkB;;AACvB,KAAAtB,IAAA,KAAK,eAAL,QAAAA,EAAA,YACA,KAAK,aAAa;AAAA,EACtB;AACJ;AAzBIxC,EADSkuB,IACO,aAA+B,CAAA;ACQ5C,MAAMC,WAA2BpuB,EAAmC;AAAA,EAApE;AAAA;AAEK,IAAAC,EAAA,sBAEI;AAAA;AAAA,EAEZ,aAAmB;AACf,UAAM4D,IAAS,KAAK,SAAS;AAC7B,QAAIA,KAAU,QAAQ,KAAK,iBAAiB;AACxC,YAAM,IAAI,MAAM,yDAAyD;AAE7E,SAAK,eAAeA,EAAO,mBAAmB,KAAK,eAAe,MAAM;AAAA,MACpE,OAAO,KAAK,MAAM;AAAA,MAClB,cAAc,KAAK,MAAM;AAAA,MACzB,GAAI,KAAK,MAAM,WAAW,OAAO,CAAA,IAAK,EAAC,SAAS,KAAK,MAAM,QAAA;AAAA,IAAO,CACrE,GACD,KAAK,MAAM,KAAK,MAAM,YAAY;AAAA,EACtC;AAAA,EAEA,SAA2B;AACvB,UAAM/C,IAAQ,KAAK,MAAM,aAAa,IAAA,GAChC8H,IAAW,KAAK,MAAM,YAAY,CAAA;AACxC,WAAI,CAAC,KAAK,MAAM,iBAAiB9H,KAAS,QAAQ,KAAK,gBAAgB,OAC5DgD,EAAEC,IAAU,MAAM6E,CAAQ,IAE9B9E,EAAEF,IAAY;AAAA,MACjB,KAAK,KAAK,aAAa,WAAW9C,CAAK,EAAE;AAAA,MACzC,SAAS,KAAK,aAAa,WAAWA,CAAK;AAAA,MAC3C,UAAA8H;AAAA,IAAA,CACH;AAAA,EACL;AAAA,EAES,YAAkB;;AACvB,KAAAnG,IAAA,KAAK,iBAAL,QAAAA,EAAmB,WACnB,KAAK,eAAe;AAAA,EACxB;AACJ;AAnCIxC,EADSmuB,IACO,aAA+B,CAAA;"}
|