@capillaryjs/capillary-viz 1.1.0 → 1.3.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/grouping.ts","../src/block.ts","../../capillary-ui/src/styling/styleRegistry.ts","../../capillary-ui/src/services.ts","../../capillary-ui/src/localization.ts","../../capillary-ui/src/runtime.ts","../../capillary-ui/src/Components/component.ts","../../capillary-ui/src/jsx-runtime.ts","../src/components/BlockGraph.tsx","../src/components/CollapsibleOptionGroup.tsx","../src/components/CategoryHidePanel.tsx","../src/dates.ts","../src/lineChart.ts","../src/components/LineGraph.tsx","../src/splits.ts","../src/components/SplitSelectionPanel.tsx","../src/series.ts"],"sourcesContent":["import {BaseEmitter, DerivedEmitter, Emitter} from '@capillaryjs/capillary'\nimport type {\n EmitterNotification,\n ReadableEmitter,\n} from '@capillaryjs/capillary'\n\nexport type CategoryColors = readonly [dark: string, base: string, light: string]\n\n/**\n * CSS inputs for category-aware visualization surfaces.\n *\n * The short `c1`/`c2`/`c3` names intentionally preserve the established graph\n * recipe: dark → base → light. The longer aliases keep ordinary Capillary UI traits\n * available to component structure and interaction treatment.\n */\nexport interface CategoryColorVariables {\n readonly '--c1': string\n readonly '--c2': string\n readonly '--c3': string\n readonly '--colored-dark'?: string\n readonly '--colored-base'?: string\n readonly '--colored-light'?: string\n}\n\nexport function categoryColorVariables(\n [dark, base, light]: CategoryColors,\n): CategoryColorVariables {\n // A category may deliberately inherit the theme's colored trait (for\n // example `var(--colored-base)`). Re-declaring that exact alias on the\n // element turns it into a self-reference and invalidates its background,\n // border, and foreground. Preserve the inherited token in that case.\n return {\n '--c1': dark,\n '--c2': base,\n '--c3': light,\n ...(isOwnColoredAlias(dark, '--colored-dark') ? {} : {'--colored-dark': dark}),\n ...(isOwnColoredAlias(base, '--colored-base') ? {} : {'--colored-base': base}),\n ...(isOwnColoredAlias(light, '--colored-light') ? {} : {'--colored-light': light}),\n }\n}\n\nfunction isOwnColoredAlias(value: string, property: '--colored-dark' | '--colored-base' | '--colored-light'): boolean {\n return value.trim().replaceAll(' ', '') === `var(${property})`\n}\nexport type CategoryVisibility = 'hidden' | 'visible'\n\nexport interface VisualizationValueEmitter<TValue> extends ReadableEmitter<TValue> {\n set(value: TValue, eventOrCause?: unknown): boolean\n}\n\nexport interface Category<TItem> {\n readonly key: string\n readonly label: string\n readonly predicate: (item: TItem) => boolean\n readonly colors: CategoryColors\n readonly colorKey?: string\n readonly hiddenByDefault?: boolean\n readonly generated?: boolean\n}\n\nexport interface CategoryDescriptor {\n readonly label: string\n readonly colors: CategoryColors\n readonly colorKey?: string\n readonly hiddenByDefault?: boolean\n}\n\nexport interface CriterionOptions<TItem> {\n readonly key: string\n readonly label: string\n readonly categories$: ReadableEmitter<readonly Category<TItem>[]>\n readonly allowResorting?: boolean\n readonly initialHiddenKeys?: ReadonlySet<string> | readonly string[]\n /** @internal The factory-created source released with the criterion. */\n readonly ownedCategories?: {dispose(): void}\n}\n\nexport interface StaticCriterionOptions<TItem>\nextends Omit<CriterionOptions<TItem>, 'categories$' | 'ownedCategories'> {\n readonly categories: readonly Category<TItem>[]\n}\n\nexport interface DerivedCategorySummary {\n readonly key: string\n readonly count: number\n readonly label: string\n}\n\nexport interface DerivedCriterionOptions<TItem>\nextends Omit<CriterionOptions<TItem>, 'categories$' | 'ownedCategories'> {\n readonly source$: ReadableEmitter<readonly TItem[]>\n readonly extractKeys: (item: TItem) => string | readonly string[] | null | undefined\n readonly describe: (key: string, count: number) => CategoryDescriptor\n readonly unmatched?: CategoryDescriptor & {readonly key: string}\n readonly compare?: (\n left: DerivedCategorySummary,\n right: DerivedCategorySummary,\n ) => number\n}\n\n/** One grouping dimension with reactive categories and stable-key visibility state. */\nexport class GroupingCriterion<TItem> {\n readonly key: string\n readonly label: string\n readonly categories$: ReadableEmitter<readonly Category<TItem>[]>\n readonly hidden$: Emitter<ReadonlySet<string>>\n readonly visibleCategories$: ReadableEmitter<readonly Category<TItem>[]>\n readonly allowResorting: boolean\n private readonly ownedCategories: {dispose(): void} | undefined\n private readonly visibleCategoriesEmitter: DerivedEmitter<\n readonly Category<TItem>[],\n readonly [\n ReadableEmitter<readonly Category<TItem>[]>,\n Emitter<ReadonlySet<string>>,\n ]\n >\n private readonly seenKeys = new Set<string>()\n private readonly visibilityEmitters = new Map<string, VisibilityEmitter>()\n private readonly releaseCategoryDefaults: () => void\n private disposed = false\n\n constructor(options: CriterionOptions<TItem>) {\n assertObject(options, 'Criterion options')\n this.key = assertKey(options.key, 'Criterion key')\n this.label = assertLabel(options.label, 'Criterion label')\n assertReadableEmitter(options.categories$, 'Criterion categories$')\n this.categories$ = options.categories$\n this.allowResorting = options.allowResorting ?? false\n this.ownedCategories = options.ownedCategories\n this.hidden$ = new Emitter<ReadonlySet<string>>(\n new Set(options.initialHiddenKeys ?? []),\n {owner: this, purpose: `${this.key} hidden categories`, equals: setsEqual},\n )\n this.visibleCategoriesEmitter = new DerivedEmitter<\n readonly Category<TItem>[],\n readonly [\n ReadableEmitter<readonly Category<TItem>[]>,\n Emitter<ReadonlySet<string>>,\n ]\n >(\n [this.categories$, this.hidden$] as const,\n ([categories, hidden]) => Object.freeze(\n categories.filter(({key}) => !hidden.has(key)),\n ),\n {owner: this, purpose: `${this.key} visible categories`},\n )\n this.visibleCategories$ = this.visibleCategoriesEmitter\n this.releaseCategoryDefaults = this.categories$.subscribe(({value}) => {\n if (!Array.isArray(value)) return\n this.applyFirstSeenDefaults(value)\n })\n }\n\n visibility(categoryKey: string): VisualizationValueEmitter<CategoryVisibility> {\n this.assertActive()\n const key = assertKey(categoryKey, 'Category key')\n let emitter = this.visibilityEmitters.get(key)\n if (emitter == null) {\n emitter = new VisibilityEmitter(this.hidden$, key, this)\n this.visibilityEmitters.set(key, emitter)\n }\n return emitter\n }\n\n setAllVisible(visible: boolean, eventOrCause?: unknown): boolean {\n this.assertActive()\n const currentKeys = new Set(this.categories$.get().map(({key}) => key))\n const next = new Set(this.hidden$.get())\n for (const key of currentKeys) {\n if (visible) next.delete(key)\n else next.add(key)\n }\n return this.hidden$.set(next, eventOrCause ?? `${this.key} category visibility changed`)\n }\n\n pruneHidden(eventOrCause?: unknown): boolean {\n this.assertActive()\n const currentKeys = new Set(this.categories$.get().map(({key}) => key))\n const next = new Set([...this.hidden$.get()].filter((key) => currentKeys.has(key)))\n return this.hidden$.set(next, eventOrCause ?? `${this.key} hidden categories pruned`)\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.releaseCategoryDefaults()\n for (const emitter of this.visibilityEmitters.values()) emitter.dispose()\n this.visibilityEmitters.clear()\n this.visibleCategoriesEmitter.dispose()\n this.hidden$.dispose()\n this.ownedCategories?.dispose()\n }\n\n private applyFirstSeenDefaults(categories: readonly Category<TItem>[]): void {\n validateCategories(categories, `${this.label} categories`)\n const next = new Set(this.hidden$.get())\n let changed = false\n for (const category of categories) {\n if (this.seenKeys.has(category.key)) continue\n this.seenKeys.add(category.key)\n if (category.hiddenByDefault === true && !next.has(category.key)) {\n next.add(category.key)\n changed = true\n }\n }\n if (changed) this.hidden$.set(next, `${this.key} first-seen defaults applied`)\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error(`Criterion \"${this.key}\" is disposed`)\n }\n}\n\nexport function staticCriterion<TItem>(\n options: StaticCriterionOptions<TItem>,\n): GroupingCriterion<TItem> {\n assertObject(options, 'Static criterion options')\n const categories = freezeCategories(options.categories, `${options.label} categories`)\n const categories$ = new Emitter<readonly Category<TItem>[]>(categories, {\n purpose: `${options.key} static categories`,\n })\n return new GroupingCriterion({...options, categories$, ownedCategories: categories$})\n}\n\nexport function derivedCriterion<TItem>(\n options: DerivedCriterionOptions<TItem>,\n): GroupingCriterion<TItem> {\n assertObject(options, 'Derived criterion options')\n assertReadableEmitter(options.source$, 'Derived criterion source$')\n if (typeof options.extractKeys !== 'function') {\n throw new TypeError('Derived criterion extractKeys must be a function')\n }\n if (typeof options.describe !== 'function') {\n throw new TypeError('Derived criterion describe must be a function')\n }\n const categories$ = new DerivedEmitter(\n [options.source$] as const,\n ([items]) => deriveCategories(items, options),\n {purpose: `${options.key} derived categories`},\n )\n return new GroupingCriterion({\n ...options,\n allowResorting: options.allowResorting ?? true,\n categories$,\n ownedCategories: categories$,\n })\n}\n\nexport function deriveCategories<TItem>(\n items: readonly TItem[],\n options: Pick<\n DerivedCriterionOptions<TItem>,\n 'extractKeys' | 'describe' | 'unmatched' | 'compare'\n >,\n): readonly Category<TItem>[] {\n if (!Array.isArray(items)) throw new TypeError('Derived category items must be an array')\n const counts = new Map<string, number>()\n let unmatchedCount = 0\n for (const item of items) {\n const keys = normalizedKeys(options.extractKeys(item))\n if (keys.length === 0) {\n unmatchedCount += 1\n continue\n }\n for (const key of keys) counts.set(key, (counts.get(key) ?? 0) + 1)\n }\n\n const summaries: DerivedCategorySummary[] = [...counts]\n .filter(([, count]) => count > 0)\n .map(([key, count]) => ({key, count, label: options.describe(key, count).label}))\n summaries.sort(options.compare ?? ((left, right) =>\n right.count - left.count || left.label.localeCompare(right.label)\n || left.key.localeCompare(right.key)))\n\n const categories: Category<TItem>[] = summaries.map(({key, count}) => {\n const descriptor = options.describe(key, count)\n return freezeCategory({\n key,\n ...descriptor,\n generated: true,\n predicate: (item) => normalizedKeys(options.extractKeys(item)).includes(key),\n }, 'Derived category')\n })\n if (unmatchedCount > 0 && options.unmatched != null) {\n const {key, ...descriptor} = options.unmatched\n categories.push(freezeCategory({\n key,\n ...descriptor,\n generated: true,\n predicate: (item) => normalizedKeys(options.extractKeys(item)).length === 0,\n }, 'Derived unmatched category'))\n }\n return freezeCategories(categories, 'Derived categories')\n}\n\n/** Derive items rejected by none of the currently hidden category predicates. */\nexport function filterByHidden<TItem>(\n items$: ReadableEmitter<readonly TItem[]>,\n criteria: readonly GroupingCriterion<TItem>[],\n): DerivedEmitter<readonly TItem[]> {\n assertReadableEmitter(items$, 'filterByHidden items$')\n validateCriteria(criteria)\n const sources: ReadableEmitter<unknown>[] = [items$]\n for (const criterion of criteria) sources.push(criterion.categories$, criterion.hidden$)\n return new DerivedEmitter<readonly TItem[]>(\n sources,\n (values) => {\n const items = values[0] as readonly TItem[]\n return items.filter((item) => !criteria.some((_criterion, index) => {\n const categories = values[index * 2 + 1] as readonly Category<TItem>[]\n const hidden = values[index * 2 + 2] as ReadonlySet<string>\n return categories.some((category) =>\n hidden.has(category.key) && category.predicate(item))\n }))\n },\n {purpose: 'items filtered by hidden visualization categories'},\n )\n}\n\n/** Count matches against the unfiltered item source for one criterion. */\nexport function categoryCounts<TItem>(\n items$: ReadableEmitter<readonly TItem[]>,\n criterion: GroupingCriterion<TItem>,\n): DerivedEmitter<ReadonlyMap<string, number>> {\n assertReadableEmitter(items$, 'categoryCounts items$')\n if (!(criterion instanceof GroupingCriterion)) {\n throw new TypeError('categoryCounts criterion must be a GroupingCriterion')\n }\n return new DerivedEmitter<ReadonlyMap<string, number>>(\n [items$, criterion.categories$] as const,\n (values) => {\n const items = values[0] as readonly TItem[]\n const categories = values[1] as readonly Category<TItem>[]\n return new Map(categories.map((category) => [\n category.key,\n items.filter((item) => category.predicate(item)).length,\n ]))\n },\n {purpose: `${criterion.key} unfiltered category counts`},\n )\n}\n\nexport function setsEqual<TValue>(left: ReadonlySet<TValue>, right: ReadonlySet<TValue>): boolean {\n return left === right || (left.size === right.size && [...left].every((value) => right.has(value)))\n}\n\nclass VisibilityEmitter extends BaseEmitter<CategoryVisibility>\nimplements VisualizationValueEmitter<CategoryVisibility> {\n private readonly release: () => void\n\n constructor(\n private readonly source: Emitter<ReadonlySet<string>>,\n private readonly categoryKey: string,\n owner: unknown,\n ) {\n super(source.get().has(categoryKey) ? 'hidden' : 'visible', {\n owner,\n purpose: `${categoryKey} category visibility`,\n fetchState: source.getFetchState(),\n error: source.getError(),\n })\n this.release = source.subscribe((notification) => this.updateFromSource(notification), {\n emitCurrent: false,\n })\n }\n\n set(value: CategoryVisibility, eventOrCause?: unknown): boolean {\n if (value !== 'hidden' && value !== 'visible') {\n throw new TypeError('Category visibility must be hidden or visible')\n }\n const next = new Set(this.source.get())\n if (value === 'hidden') next.add(this.categoryKey)\n else next.delete(this.categoryKey)\n return this.source.set(next, eventOrCause ?? `${this.categoryKey} visibility changed`)\n }\n\n override dispose(): void {\n this.release()\n super.dispose()\n }\n\n private updateFromSource(notification: EmitterNotification<ReadonlySet<string>>): void {\n this.setSnapshot({\n value: notification.value.has(this.categoryKey) ? 'hidden' : 'visible',\n fetchState: notification.fetchState,\n error: notification.error,\n parentEvent: notification.event,\n cause: 'hidden category membership changed',\n })\n }\n}\n\nfunction normalizedKeys(value: string | readonly string[] | null | undefined): string[] {\n const values = value == null ? [] : typeof value === 'string' ? [value] : [...value]\n const keys = values.map((entry) => assertKey(entry, 'Extracted category key'))\n return [...new Set(keys)]\n}\n\nfunction freezeCategories<TItem>(\n categories: readonly Category<TItem>[],\n label: string,\n): readonly Category<TItem>[] {\n validateCategories(categories, label)\n return Object.freeze(categories.map((category) => freezeCategory(category, label)))\n}\n\nfunction freezeCategory<TItem>(category: Category<TItem>, label: string): Category<TItem> {\n assertObject(category, label)\n const frozen: Category<TItem> = {\n ...category,\n key: assertKey(category.key, `${label} key`),\n label: assertLabel(category.label, `${label} label`),\n colors: freezeColors(category.colors, `${label} colors`),\n }\n if (typeof category.predicate !== 'function') {\n throw new TypeError(`${label} predicate must be a function`)\n }\n if (category.colorKey !== undefined) assertKey(category.colorKey, `${label} colorKey`)\n return Object.freeze(frozen)\n}\n\nfunction validateCategories<TItem>(categories: readonly Category<TItem>[], label: string): void {\n if (!Array.isArray(categories)) throw new TypeError(`${label} must be an array`)\n const keys = new Set<string>()\n for (const category of categories) {\n assertObject(category, label)\n const key = assertKey(category.key, `${label} key`)\n if (keys.has(key)) throw new Error(`${label} contains duplicate key \"${key}\"`)\n keys.add(key)\n assertLabel(category.label, `${label} label`)\n freezeColors(category.colors as CategoryColors, `${label} colors`)\n if (typeof category.predicate !== 'function') {\n throw new TypeError(`${label} predicate must be a function`)\n }\n }\n}\n\nfunction validateCriteria<TItem>(criteria: readonly GroupingCriterion<TItem>[]): void {\n if (!Array.isArray(criteria)) throw new TypeError('Criteria must be an array')\n const keys = new Set<string>()\n for (const criterion of criteria) {\n if (!(criterion instanceof GroupingCriterion)) {\n throw new TypeError('Criteria must contain GroupingCriterion instances')\n }\n if (keys.has(criterion.key)) throw new Error(`Duplicate criterion key \"${criterion.key}\"`)\n keys.add(criterion.key)\n }\n}\n\nfunction freezeColors(colors: CategoryColors, label: string): CategoryColors {\n if (!Array.isArray(colors) || colors.length !== 3\n || colors.some((color) => typeof color !== 'string' || color.trim() === '')) {\n throw new TypeError(`${label} must contain three non-empty CSS color values`)\n }\n return Object.freeze([...colors]) as unknown as CategoryColors\n}\n\nfunction assertReadableEmitter(value: unknown, label: string): asserts value is ReadableEmitter<unknown> {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'get') !== 'function'\n || typeof Reflect.get(value, 'getFetchState') !== 'function'\n || typeof Reflect.get(value, 'getError') !== 'function'\n || typeof Reflect.get(value, 'subscribe') !== 'function') {\n throw new TypeError(`${label} must be a readable emitter`)\n }\n}\n\nfunction assertObject(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object`)\n }\n}\n\nfunction assertKey(value: unknown, label: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new TypeError(`${label} must be a non-empty string`)\n }\n return value\n}\n\nfunction assertLabel(value: unknown, label: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new TypeError(`${label} must be a non-empty string`)\n }\n return value\n}\n","import {\n BaseEmitter,\n DerivedEmitter,\n Emitter,\n FetchState,\n combineFetchStates,\n} from '@capillaryjs/capillary'\nimport type {\n EventBubble,\n FetchStateValue,\n ReadableEmitter,\n} from '@capillaryjs/capillary'\n\nimport type {Category, CategoryColors} from './grouping.js'\nimport {GroupingCriterion} from './grouping.js'\n\nexport type BlockOrientation = 'horizontal' | 'vertical'\n\nexport interface BlockPathSegment {\n readonly criterionKey: string\n readonly categoryKey: string\n}\n\nexport type BlockPath = readonly BlockPathSegment[]\n\nexport interface BlockSplit<TItem> {\n readonly key: string\n readonly label: string\n readonly categories: readonly Category<TItem>[]\n readonly allowResorting: boolean\n}\n\nexport interface BlockNode<TItem> {\n readonly key: string\n readonly path: BlockPath\n readonly criterionKey: string | null\n readonly criterionLabel: string | null\n readonly categoryKey: string | null\n readonly label: string\n readonly colors: CategoryColors | null\n readonly colorKey: string | null\n readonly count: number\n readonly share: number\n readonly totalShare: number\n readonly depth: number\n readonly items: readonly TItem[]\n readonly children: readonly BlockNode<TItem>[]\n readonly childOrientation: BlockOrientation\n readonly childrenSuppressed: boolean\n}\n\nexport interface BlockPartitionIssue<TItem> {\n readonly kind: 'unmatched' | 'multiple-matches'\n readonly criterionKey: string\n readonly criterionLabel: string\n readonly parentPath: BlockPath\n readonly item: TItem\n readonly itemIndex: number\n readonly matchedCategoryKeys: readonly string[]\n}\n\nexport interface BlockLayoutResult<TItem> {\n readonly valid: boolean\n readonly root: BlockNode<TItem>\n readonly issues: readonly BlockPartitionIssue<TItem>[]\n}\n\nexport interface BlockLayoutOptions {\n readonly rootLabel?: string\n readonly readabilityThreshold?: number\n}\n\n/** Build a true recursive partition. Invalid zero/multiple matches are reported. */\nexport function buildBlockLayout<TItem>(\n items: readonly TItem[],\n splits: readonly BlockSplit<TItem>[],\n options: BlockLayoutOptions = {},\n): BlockLayoutResult<TItem> {\n if (!Array.isArray(items)) throw new TypeError('Block layout items must be an array')\n if (!Array.isArray(splits)) throw new TypeError('Block layout splits must be an array')\n const readabilityThreshold = options.readabilityThreshold ?? 0.02\n if (!Number.isFinite(readabilityThreshold)\n || readabilityThreshold < 0\n || readabilityThreshold > 1) {\n throw new RangeError('Block readability threshold must be between zero and one')\n }\n const issues: BlockPartitionIssue<TItem>[] = []\n const rootItems = Object.freeze([...items])\n const root: BlockNode<TItem> = buildNode({\n items: rootItems,\n splits,\n splitIndex: 0,\n path: Object.freeze([]),\n criterion: null,\n category: null,\n parentCount: rootItems.length,\n totalShare: 1,\n readabilityThreshold,\n issues,\n rootLabel: options.rootLabel ?? 'All items',\n })\n return Object.freeze({valid: issues.length === 0, root, issues: Object.freeze(issues)})\n}\n\nexport function criterionSnapshot<TItem>(criterion: GroupingCriterion<TItem>): BlockSplit<TItem> {\n if (!(criterion instanceof GroupingCriterion)) {\n throw new TypeError('criterionSnapshot requires a GroupingCriterion')\n }\n return Object.freeze({\n key: criterion.key,\n label: criterion.label,\n categories: criterion.categories$.get(),\n allowResorting: criterion.allowResorting,\n })\n}\n\nexport function findBlock<TItem>(\n root: BlockNode<TItem>,\n path: BlockPath | null,\n): BlockNode<TItem> | null {\n if (path == null) return null\n let current = root\n for (const segment of path) {\n const child = current.children.find((candidate) =>\n candidate.criterionKey === segment.criterionKey\n && candidate.categoryKey === segment.categoryKey)\n if (child == null) return null\n current = child\n }\n return current\n}\n\n/** Reactive layout and rebuild-safe selected subset shared by graph and application. */\nexport class BlockSelectionModel<TItem> {\n readonly layout$: ReadableEmitter<BlockLayoutResult<TItem>, readonly unknown[]>\n readonly selectedPath$: Emitter<BlockPath | null>\n readonly selectedBlock$: ReadableEmitter<BlockNode<TItem> | null>\n readonly selectedItems$: ReadableEmitter<readonly TItem[]>\n private readonly layoutEmitter: ReactiveBlockLayout<TItem>\n private readonly selectedBlockEmitter: DerivedEmitter<\n BlockNode<TItem> | null,\n readonly [\n ReadableEmitter<BlockLayoutResult<TItem>, readonly unknown[]>,\n Emitter<BlockPath | null>,\n ]\n >\n private readonly selectedItemsEmitter: DerivedEmitter<\n readonly TItem[],\n readonly [ReadableEmitter<BlockNode<TItem> | null>]\n >\n private readonly releases: Array<() => void> = []\n private disposed = false\n\n constructor(\n items$: ReadableEmitter<readonly TItem[]>,\n splits$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>,\n readonly options: BlockLayoutOptions = {},\n ) {\n this.layoutEmitter = new ReactiveBlockLayout(items$, splits$, options)\n this.layout$ = this.layoutEmitter\n this.selectedPath$ = new Emitter<BlockPath | null>(null, {\n owner: this,\n purpose: 'selected block path',\n equals: blockPathsEqual,\n })\n this.selectedBlockEmitter = new DerivedEmitter<\n BlockNode<TItem> | null,\n readonly [\n ReadableEmitter<BlockLayoutResult<TItem>, readonly unknown[]>,\n Emitter<BlockPath | null>,\n ]\n >(\n [this.layout$, this.selectedPath$] as const,\n ([layout, path]) => findBlock(layout.root, path),\n {owner: this, purpose: 'selected block'},\n )\n this.selectedBlock$ = this.selectedBlockEmitter\n this.selectedItemsEmitter = new DerivedEmitter<\n readonly TItem[],\n readonly [ReadableEmitter<BlockNode<TItem> | null>]\n >(\n [this.selectedBlock$] as const,\n ([block]) => block?.items ?? Object.freeze([]),\n {owner: this, purpose: 'selected block items'},\n )\n this.selectedItems$ = this.selectedItemsEmitter\n this.releases.push(\n this.layout$.subscribe(() => this.reconcileSelection(), {emitCurrent: false}),\n this.selectedPath$.subscribe(() => this.reconcileSelection(), {emitCurrent: false}),\n )\n }\n\n select(path: BlockPath, eventOrCause?: unknown): boolean {\n this.assertActive()\n const frozen = freezePath(path)\n if (findBlock(this.layout$.get().root, frozen) == null) {\n throw new Error('Cannot select a path absent from the current block layout')\n }\n return this.selectedPath$.set(frozen, eventOrCause ?? 'block selected')\n }\n\n clear(eventOrCause?: unknown): boolean {\n this.assertActive()\n return this.selectedPath$.set(null, eventOrCause ?? 'block selection cleared')\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n for (const release of this.releases.splice(0)) release()\n this.selectedItemsEmitter.dispose()\n this.selectedBlockEmitter.dispose()\n this.selectedPath$.dispose()\n this.layoutEmitter.dispose()\n }\n\n private reconcileSelection(): void {\n const path = this.selectedPath$.get()\n if (path == null || findBlock(this.layout$.get().root, path) != null) return\n this.selectedPath$.set(null, 'block selection no longer exists')\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('Block selection model is disposed')\n }\n}\n\nexport function createBlockSelection<TItem>(\n items$: ReadableEmitter<readonly TItem[]>,\n splits$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>,\n options: BlockLayoutOptions = {},\n): BlockSelectionModel<TItem> {\n return new BlockSelectionModel(items$, splits$, options)\n}\n\nclass ReactiveBlockLayout<TItem>\nextends BaseEmitter<BlockLayoutResult<TItem>, readonly unknown[]> {\n private readonly releases: Array<() => void> = []\n private categoryReleases: Array<() => void> = []\n\n constructor(\n private readonly items$: ReadableEmitter<readonly TItem[]>,\n private readonly splits$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>,\n private readonly options: BlockLayoutOptions,\n ) {\n super(buildBlockLayout<TItem>([], [], options), {\n purpose: 'reactive block layout',\n fetchState: FetchState.Initial,\n })\n assertReadableEmitter(items$, 'Block selection items$')\n assertReadableEmitter(splits$, 'Block selection splits$')\n this.releases.push(\n items$.subscribe(({event}) => this.recompute(event), {emitCurrent: false}),\n splits$.subscribe(({event}) => {\n this.subscribeCategories()\n this.recompute(event)\n }, {emitCurrent: false}),\n )\n this.subscribeCategories()\n this.recompute(null)\n }\n\n override dispose(): void {\n for (const release of this.releases.splice(0)) release()\n this.releaseCategories()\n super.dispose()\n }\n\n private subscribeCategories(): void {\n this.releaseCategories()\n this.categoryReleases = this.splits$.get().map((criterion) =>\n criterion.categories$.subscribe(\n ({event}) => this.recompute(event),\n {emitCurrent: false},\n ))\n }\n\n private releaseCategories(): void {\n for (const release of this.categoryReleases.splice(0)) release()\n }\n\n private recompute(parentEvent: EventBubble<unknown> | null): void {\n const splits = this.splits$.get()\n const sources: ReadableEmitter<unknown, unknown>[] = [\n this.items$,\n this.splits$,\n ...splits.map(({categories$}) => categories$),\n ]\n const states = sources.map((source) => source.getFetchState())\n const sourceErrors = sources.map((source) => source.getError()).filter(nonNull)\n let value: BlockLayoutResult<TItem>\n let computeError: unknown = null\n try {\n value = buildBlockLayout(\n this.items$.get(),\n splits.map(criterionSnapshot),\n this.options,\n )\n } catch (error) {\n computeError = error\n value = buildBlockLayout<TItem>([], [], this.options)\n }\n const errors = computeError == null ? sourceErrors : [...sourceErrors, computeError]\n const fetchState: FetchStateValue = errors.length > 0\n ? FetchState.Error\n : combineFetchStates(states)\n this.setSnapshot({\n value,\n fetchState,\n error: errors.length === 0 ? null : Object.freeze(errors),\n parentEvent,\n cause: 'block layout source changed',\n })\n }\n}\n\ninterface BuildNodeArguments<TItem> {\n readonly items: readonly TItem[]\n readonly splits: readonly BlockSplit<TItem>[]\n readonly splitIndex: number\n readonly path: BlockPath\n readonly criterion: BlockSplit<TItem> | null\n readonly category: Category<TItem> | null\n readonly parentCount: number\n readonly totalShare: number\n readonly readabilityThreshold: number\n readonly issues: BlockPartitionIssue<TItem>[]\n readonly rootLabel: string\n}\n\nfunction buildNode<TItem>(arguments_: BuildNodeArguments<TItem>): BlockNode<TItem> {\n const {\n items,\n splits,\n splitIndex,\n path,\n criterion,\n category,\n parentCount,\n totalShare,\n readabilityThreshold,\n issues,\n rootLabel,\n } = arguments_\n const nextSplit = splits[splitIndex]\n const childrenSuppressed = nextSplit != null\n && path.length > 0\n && totalShare < readabilityThreshold\n const children = nextSplit == null || childrenSuppressed\n ? []\n : partitionChildren({\n items,\n splits,\n splitIndex,\n path,\n criterion: nextSplit,\n totalShare,\n readabilityThreshold,\n issues,\n rootLabel,\n })\n const share = parentCount === 0 ? 0 : items.length / parentCount\n return Object.freeze({\n key: pathKey(path),\n path,\n criterionKey: criterion?.key ?? null,\n criterionLabel: criterion?.label ?? null,\n categoryKey: category?.key ?? null,\n label: category?.label ?? rootLabel,\n colors: category?.colors ?? null,\n colorKey: category?.colorKey ?? null,\n count: items.length,\n share,\n totalShare,\n depth: path.length - 1,\n items,\n children: Object.freeze(children),\n childOrientation: path.length % 2 === 0 ? 'horizontal' : 'vertical',\n childrenSuppressed,\n })\n}\n\nfunction partitionChildren<TItem>(arguments_: {\n readonly items: readonly TItem[]\n readonly splits: readonly BlockSplit<TItem>[]\n readonly splitIndex: number\n readonly path: BlockPath\n readonly criterion: BlockSplit<TItem>\n readonly totalShare: number\n readonly readabilityThreshold: number\n readonly issues: BlockPartitionIssue<TItem>[]\n readonly rootLabel: string\n}): BlockNode<TItem>[] {\n const {items, criterion, path, issues} = arguments_\n const groups = new Map(criterion.categories.map((category) => [category.key, {\n category,\n items: [] as TItem[],\n }]))\n let valid = true\n items.forEach((item, itemIndex) => {\n const matches = criterion.categories.filter((category) => category.predicate(item))\n if (matches.length !== 1) {\n valid = false\n issues.push(Object.freeze({\n kind: matches.length === 0 ? 'unmatched' : 'multiple-matches',\n criterionKey: criterion.key,\n criterionLabel: criterion.label,\n parentPath: path,\n item,\n itemIndex,\n matchedCategoryKeys: Object.freeze(matches.map(({key}) => key)),\n }))\n return\n }\n groups.get(matches[0]!.key)!.items.push(item)\n })\n if (!valid) return []\n let populated = [...groups.values()].filter((group) => group.items.length > 0)\n if (criterion.allowResorting) {\n populated = populated.sort((left, right) =>\n right.items.length - left.items.length\n || left.category.label.localeCompare(right.category.label)\n || left.category.key.localeCompare(right.category.key))\n }\n return populated.map(({category, items: childItems}) => {\n const childPath = freezePath([...path, {\n criterionKey: criterion.key,\n categoryKey: category.key,\n }])\n const share = items.length === 0 ? 0 : childItems.length / items.length\n return buildNode({\n ...arguments_,\n items: Object.freeze(childItems),\n splitIndex: arguments_.splitIndex + 1,\n path: childPath,\n criterion,\n category,\n parentCount: items.length,\n totalShare: arguments_.totalShare * share,\n })\n })\n}\n\nfunction freezePath(path: BlockPath): BlockPath {\n if (!Array.isArray(path)) throw new TypeError('Block path must be an array')\n return Object.freeze(path.map((segment) => {\n if (segment == null || typeof segment !== 'object') {\n throw new TypeError('Block path segments must be objects')\n }\n if (typeof segment.criterionKey !== 'string' || segment.criterionKey === ''\n || typeof segment.categoryKey !== 'string' || segment.categoryKey === '') {\n throw new TypeError('Block path keys must be non-empty strings')\n }\n return Object.freeze({...segment})\n }))\n}\n\nfunction blockPathsEqual(left: BlockPath | null, right: BlockPath | null): boolean {\n return left === right || (left != null && right != null\n && left.length === right.length\n && left.every((segment, index) => {\n const other = right[index]\n return segment.criterionKey === other?.criterionKey\n && segment.categoryKey === other.categoryKey\n }))\n}\n\nfunction pathKey(path: BlockPath): string {\n return path.length === 0 ? 'root' : path.map(({criterionKey, categoryKey}) =>\n `${encodeURIComponent(criterionKey)}=${encodeURIComponent(categoryKey)}`).join('/')\n}\n\nfunction nonNull<TValue>(value: TValue | null): value is TValue {\n return value != null\n}\n\nfunction assertReadableEmitter(value: unknown, label: string): void {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'get') !== 'function'\n || typeof Reflect.get(value, 'getFetchState') !== 'function'\n || typeof Reflect.get(value, 'getError') !== 'function'\n || typeof Reflect.get(value, 'subscribe') !== 'function') {\n throw new TypeError(`${label} must be a readable emitter`)\n }\n}\n","const STYLE_ATTRIBUTE = 'data-cap-structural-styles'\nlet nextRegistryId = 1\n\ntype CSSFragment = RawCSSFragment | HostCSSFragment\n\ninterface RawCSSFragment {\n readonly kind: 'raw'\n readonly css: string\n}\n\ninterface HostCSSFragment {\n readonly kind: 'host'\n readonly css: string\n readonly hosts: Set<string>\n}\n\n/** Application-scoped structural-style collection and injection. */\nexport class StyleRegistry {\n readonly id: string\n private readonly cssFragments = new Map<string, CSSFragment>()\n\n constructor(id: string = `runtime-${nextRegistryId++}`) {\n if (typeof id !== 'string') throw new TypeError('StyleRegistry id must be a string')\n this.id = id\n }\n\n registerCSS(css: string): this {\n if (typeof css !== 'string') throw new TypeError('Component CSS must be a string')\n const normalized = css.trim()\n if (normalized.length > 0) {\n this.cssFragments.set(`raw:${normalized}`, {kind: 'raw', css: normalized})\n }\n return this\n }\n\n /** @internal Collect a host-relative component template without resolving it yet. */\n registerHostCSS(css: string, host: string): this {\n if (typeof css !== 'string') throw new TypeError('Component CSS must be a string')\n if (typeof host !== 'string' || host.trim().length === 0) {\n throw new TypeError('Component CSS host must be a non-empty selector')\n }\n const normalized = css.trim()\n if (normalized.length === 0) return this\n if (!normalized.includes('&')) return this.registerCSS(normalized)\n\n const key = `host:${normalized}`\n const existing = this.cssFragments.get(key)\n if (existing == null) {\n this.cssFragments.set(key, {\n kind: 'host',\n css: normalized,\n hosts: new Set([host.trim()]),\n })\n } else if (existing.kind === 'host') {\n existing.hosts.add(host.trim())\n }\n return this\n }\n\n generateCSS(): string {\n return [...this.cssFragments.values()]\n .map(fragment => fragment.kind === 'raw'\n ? fragment.css\n : resolveHostCSS(fragment.css, [...fragment.hosts]))\n .join('\\n\\n')\n }\n\n injectAll(targetDocument: Document = globalThis.document): HTMLStyleElement {\n if (targetDocument?.head == null) {\n throw new TypeError('StyleRegistry.injectAll requires a document with a head')\n }\n const selector = `style[${STYLE_ATTRIBUTE}=\"${escapeAttributeValue(this.id)}\"]`\n let style = targetDocument.head.querySelector<HTMLStyleElement>(selector)\n if (style == null) {\n style = targetDocument.createElement('style')\n style.setAttribute(STYLE_ATTRIBUTE, this.id)\n targetDocument.head.prepend(style)\n }\n const css = this.generateCSS()\n if (style.textContent !== css) style.textContent = css\n return style\n }\n\n reset(): void {\n this.cssFragments.clear()\n }\n}\n\n/** Create an isolated registry for a configured Capillary UI application runtime. */\nexport function createStyleRegistry(): StyleRegistry {\n return new StyleRegistry()\n}\n\n/** Backward-compatible structural styles for the default Capillary UI runtime. */\nexport const styleRegistry = new StyleRegistry('')\n\nfunction escapeAttributeValue(value: string): string {\n return value.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"')\n}\n\nfunction resolveHostCSS(css: string, hosts: readonly string[]): string {\n let output = ''\n let cursor = 0\n while (cursor < css.length) {\n const openBrace = findBrace(css, cursor)\n if (openBrace < 0) return output + css.slice(cursor)\n const closeBrace = findMatchingBrace(css, openBrace)\n if (closeBrace < 0) return output + css.slice(cursor)\n\n const header = css.slice(cursor, openBrace)\n const body = css.slice(openBrace + 1, closeBrace)\n const rule = header.trim()\n output += rule.startsWith('@')\n ? `${header}{${resolveHostCSS(body, hosts)}}`\n : `${expandHostSelectors(header, hosts)}{${body}}`\n cursor = closeBrace + 1\n }\n return output\n}\n\nfunction expandHostSelectors(header: string, hosts: readonly string[]): string {\n if (hosts.length === 1 || !header.includes('&')) {\n return hosts.length === 1 ? header.replaceAll('&', hosts[0]!) : header\n }\n const leading = header.match(/^\\s*/)?.[0] ?? ''\n const trailing = header.match(/\\s*$/)?.[0] ?? ''\n const selectors = splitSelectors(header.trim())\n const continuationIndent = leading.match(/(?:^|\\n)([ \\t]*)$/)?.[1] ?? ''\n return leading + selectors.flatMap(selector => selector.includes('&')\n ? hosts.map(host => selector.replaceAll('&', host))\n : [selector]).join(`,\\n${continuationIndent}`) + trailing\n}\n\nfunction splitSelectors(selectors: string): string[] {\n const result: string[] = []\n let start = 0\n let parentheses = 0\n let brackets = 0\n let quote: '\"' | \"'\" | null = null\n for (let index = 0; index < selectors.length; index += 1) {\n const character = selectors[index]!\n if (quote != null) {\n if (character === '\\\\') index += 1\n else if (character === quote) quote = null\n continue\n }\n if (character === '\"' || character === \"'\") {\n quote = character\n } else if (character === '(') {\n parentheses += 1\n } else if (character === ')') {\n parentheses -= 1\n } else if (character === '[') {\n brackets += 1\n } else if (character === ']') {\n brackets -= 1\n } else if (character === ',' && parentheses === 0 && brackets === 0) {\n result.push(selectors.slice(start, index).trim())\n start = index + 1\n }\n }\n result.push(selectors.slice(start).trim())\n return result.filter(Boolean)\n}\n\nfunction findBrace(css: string, from: number): number {\n for (let index = from; index < css.length; index += 1) {\n const character = css[index]!\n if (character === '\"' || character === \"'\") {\n index = skipQuote(css, index)\n } else if (character === '/' && css[index + 1] === '*') {\n index = skipComment(css, index)\n } else if (character === '{') {\n return index\n }\n }\n return -1\n}\n\nfunction findMatchingBrace(css: string, openBrace: number): number {\n let depth = 1\n for (let index = openBrace + 1; index < css.length; index += 1) {\n const character = css[index]!\n if (character === '\"' || character === \"'\") {\n index = skipQuote(css, index)\n } else if (character === '/' && css[index + 1] === '*') {\n index = skipComment(css, index)\n } else if (character === '{') {\n depth += 1\n } else if (character === '}' && --depth === 0) {\n return index\n }\n }\n return -1\n}\n\nfunction skipQuote(css: string, openQuote: number): number {\n const quote = css[openQuote]!\n for (let index = openQuote + 1; index < css.length; index += 1) {\n if (css[index] === '\\\\') index += 1\n else if (css[index] === quote) return index\n }\n return css.length\n}\n\nfunction skipComment(css: string, openComment: number): number {\n const closeComment = css.indexOf('*/', openComment + 2)\n return closeComment < 0 ? css.length : closeComment + 1\n}\n","declare const serviceType: unique symbol\ndeclare const serviceProviderType: unique symbol\n\n/** Typed identity for one application service contract. */\nexport interface ServiceKey<TService> {\n readonly name: string\n readonly [serviceType]: TService\n}\n\n/** Read-only service access exposed to service factories. */\nexport interface ServiceResolver {\n has(key: ServiceKey<unknown>): boolean\n require<TService>(key: ServiceKey<TService>): TService\n}\n\nexport type ServiceFactory<TService> = (services: ServiceResolver) => TService\n\n/** Immutable registration for a lazily created, scope-shared service. */\nexport interface ServiceProvider<TService> {\n readonly key: ServiceKey<TService>\n readonly create: ServiceFactory<TService>\n readonly [serviceProviderType]: true\n}\n\nconst serviceKeys = new WeakSet<object>()\nconst serviceProviders = new WeakSet<object>()\n\n/** Declare a typed service identity without selecting an implementation. */\nexport function defineService<TService>(name: string): ServiceKey<TService> {\n if (typeof name !== 'string' || name.trim() === '') {\n throw new TypeError('Service name must be a non-empty string')\n }\n const key = Object.freeze({name: name.trim()}) as ServiceKey<TService>\n serviceKeys.add(key)\n return key\n}\n\n/** Select the factory for a service in one application composition root. */\nexport function provideService<TService>(\n key: ServiceKey<TService>,\n create: ServiceFactory<TService>,\n): ServiceProvider<TService> {\n assertServiceKey(key)\n if (typeof create !== 'function') {\n throw new TypeError(`Service provider \"${key.name}\" requires a factory function`)\n }\n const provider = Object.freeze({key, create}) as ServiceProvider<TService>\n serviceProviders.add(provider)\n return provider\n}\n\n/**\n * Explicit application service scope.\n *\n * Providers are fixed at construction. Each service is created lazily at most\n * once, shared inside this scope, and disposed in reverse creation order.\n */\nexport class ServiceScope implements ServiceResolver {\n private readonly providers = new Map<ServiceKey<unknown>, ServiceProvider<unknown>>()\n private readonly instances = new Map<ServiceKey<unknown>, unknown>()\n private readonly creationOrder: ServiceKey<unknown>[] = []\n private readonly resolving: ServiceKey<unknown>[] = []\n private disposed = false\n\n constructor(providers: readonly ServiceProvider<unknown>[] = []) {\n if (!Array.isArray(providers)) {\n throw new TypeError('ServiceScope providers must be an array')\n }\n for (const provider of providers) {\n assertServiceProvider(provider)\n if (this.providers.has(provider.key)) {\n throw new Error(`Service \"${provider.key.name}\" is registered more than once`)\n }\n this.providers.set(provider.key, provider)\n }\n }\n\n get isDisposed(): boolean {\n return this.disposed\n }\n\n has(key: ServiceKey<unknown>): boolean {\n this.assertActive()\n assertServiceKey(key)\n return this.providers.has(key)\n }\n\n require<TService>(key: ServiceKey<TService>): TService {\n this.assertActive()\n assertServiceKey(key)\n if (this.instances.has(key)) return this.instances.get(key) as TService\n\n const provider = this.providers.get(key) as ServiceProvider<TService> | undefined\n if (provider == null) throw new Error(`Service \"${key.name}\" is not registered`)\n\n const cycleStart = this.resolving.indexOf(key)\n if (cycleStart >= 0) {\n const cycle = [...this.resolving.slice(cycleStart), key]\n .map((entry) => entry.name)\n .join(' -> ')\n throw new Error(`Circular service dependency: ${cycle}`)\n }\n\n this.resolving.push(key)\n try {\n const instance = provider.create(this)\n this.instances.set(key, instance)\n this.creationOrder.push(key)\n return instance\n } finally {\n this.resolving.pop()\n }\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n const errors: unknown[] = []\n for (const key of [...this.creationOrder].reverse()) {\n const instance = this.instances.get(key)\n try {\n const dispose = readDispose(instance)\n if (dispose != null) dispose.call(instance)\n } catch (error) {\n errors.push(error)\n }\n }\n this.instances.clear()\n this.creationOrder.length = 0\n this.resolving.length = 0\n if (errors.length === 1) throw errors[0]\n if (errors.length > 1) {\n throw new AggregateError(errors, 'Several services failed during disposal')\n }\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('ServiceScope has been disposed')\n }\n}\n\nexport function createServiceScope(\n providers: readonly ServiceProvider<unknown>[] = [],\n): ServiceScope {\n return new ServiceScope(providers)\n}\n\nfunction isServiceKey(value: unknown): value is ServiceKey<unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && serviceKeys.has(value as object)\n}\n\nfunction assertServiceKey(value: unknown): asserts value is ServiceKey<unknown> {\n if (!isServiceKey(value)) throw new TypeError('Expected a service key created by defineService()')\n}\n\nfunction assertServiceProvider(\n value: unknown,\n): asserts value is ServiceProvider<unknown> {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || !serviceProviders.has(value as object)) {\n throw new TypeError('Expected a service provider created by provideService()')\n }\n}\n\nfunction readDispose(value: unknown): (() => void) | null {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) return null\n const dispose = Reflect.get(value, 'dispose')\n return typeof dispose === 'function' ? dispose as () => void : null\n}\n","/**\n * Optional replacements for user-facing text authored by Capillary UI itself.\n *\n * Every property is optional so a caller can override only the messages it\n * needs and newer Capillary UI releases can add messages without requiring an\n * application catalog update.\n */\nexport interface CapillaryUiMessageOverrides {\n readonly breadcrumbLabel?: string\n readonly checkboxOptionLabel?: string\n readonly checkboxStateLabel?: (label: string, state: string) => string\n readonly colorOptionGrayLabel?: string\n readonly colorOptionGreenLabel?: string\n readonly colorOptionIceBlueLabel?: string\n readonly colorOptionOceanLabel?: string\n readonly colorOptionOrangeLabel?: string\n readonly colorOptionPurpleLabel?: string\n readonly colorOptionRedLabel?: string\n readonly colorOptionYellowLabel?: string\n readonly dataTableEmpty?: string\n readonly dataTableLoadError?: string\n readonly dataTableLoading?: string\n readonly dataTableRetry?: string\n readonly dialogCloseLabel?: string\n readonly dropdownLoadError?: string\n readonly dropdownPlaceholder?: string\n readonly filterModeDenyLabel?: string\n readonly filterModeNeutralLabel?: string\n readonly filterModePreferLabel?: string\n readonly filterModeRequireLabel?: string\n readonly filterPanelEmpty?: string\n readonly filterPanelLabel?: string\n readonly filterPanelLoadError?: string\n readonly filterPanelLoading?: string\n readonly listViewEmpty?: string\n readonly listViewLabel?: string\n readonly listViewLoadError?: string\n readonly listViewLoading?: string\n readonly progressInProgress?: string\n readonly radioOptionLabel?: string\n readonly splitViewSeparatorLabel?: string\n readonly tabLineLabel?: string\n readonly tableFilterColumnLabel?: (label: string) => string\n readonly tableSortColumnLabel?: (label: string) => string\n readonly themeOptionCapillaryLabel?: string\n readonly themeOptionMinimalLabel?: string\n readonly themeOptionShinyLabel?: string\n readonly toolbarLabel?: string\n readonly treeViewEmpty?: string\n readonly treeViewLoadError?: string\n readonly treeViewLoading?: string\n}\n\nexport type CapillaryUiMessage<TKey extends keyof CapillaryUiMessageOverrides> =\n Exclude<CapillaryUiMessageOverrides[TKey], undefined>\n\n/** Static localization selected before a Capillary UI runtime is created. */\nexport interface CapillaryUiLocalizationOptions {\n /** BCP 47 locale used by Capillary UI-owned `Intl` formatting. */\n readonly locale: string\n /** Partial replacements for Capillary UI-authored English messages. */\n readonly messages?: CapillaryUiMessageOverrides\n}\n\n/** Resolved immutable localization carried by one Capillary UI runtime. */\nexport interface CapillaryUiLocalization {\n /** Canonical configured locale, or `undefined` for the browser default. */\n readonly locale: string | undefined\n /** Resolve one Capillary UI message after per-key English fallback. */\n message<TKey extends keyof CapillaryUiMessageOverrides>(key: TKey): CapillaryUiMessage<TKey>\n}\n\ntype ResolvedCapillaryUiMessages = {\n readonly [TKey in keyof CapillaryUiMessageOverrides]-?: CapillaryUiMessage<TKey>\n}\n\nconst englishCapillaryUiMessages = Object.freeze({\n breadcrumbLabel: 'Breadcrumb',\n checkboxOptionLabel: 'Option',\n checkboxStateLabel: (label: string, state: string) => `${label}: ${state}`,\n colorOptionGrayLabel: 'Gray',\n colorOptionGreenLabel: 'Green',\n colorOptionIceBlueLabel: 'Ice blue',\n colorOptionOceanLabel: 'Ocean',\n colorOptionOrangeLabel: 'Orange',\n colorOptionPurpleLabel: 'Purple',\n colorOptionRedLabel: 'Red',\n colorOptionYellowLabel: 'Yellow',\n dataTableEmpty: 'No rows',\n dataTableLoadError: 'Unable to load rows',\n dataTableLoading: 'Loading rows…',\n dataTableRetry: 'Retry',\n dialogCloseLabel: 'Close',\n dropdownLoadError: 'Unable to load options',\n dropdownPlaceholder: 'Select…',\n filterModeDenyLabel: 'deny',\n filterModeNeutralLabel: 'neutral',\n filterModePreferLabel: 'prefer',\n filterModeRequireLabel: 'require',\n filterPanelEmpty: 'No filter options',\n filterPanelLabel: 'Filter options',\n filterPanelLoadError: 'Unable to load filter options',\n filterPanelLoading: 'Loading filter options…',\n listViewEmpty: 'No items',\n listViewLabel: 'Items',\n listViewLoadError: 'Unable to load items',\n listViewLoading: 'Loading items…',\n progressInProgress: 'In progress',\n radioOptionLabel: 'Option',\n splitViewSeparatorLabel: 'Resize panes',\n tabLineLabel: 'Sections',\n tableFilterColumnLabel: (label: string) => `Filter ${label}`,\n tableSortColumnLabel: (label: string) => `Sort ${label}`,\n themeOptionCapillaryLabel: 'Capillary',\n themeOptionMinimalLabel: 'Minimal',\n themeOptionShinyLabel: 'Shiny',\n toolbarLabel: 'Actions',\n treeViewEmpty: 'No tree items',\n treeViewLoadError: 'Unable to load tree items',\n treeViewLoading: 'Loading tree items…',\n} satisfies ResolvedCapillaryUiMessages)\n\nclass RuntimeLocalization implements CapillaryUiLocalization {\n readonly locale: string | undefined\n private readonly messages: ResolvedCapillaryUiMessages\n\n constructor(\n locale: string | undefined,\n messages: ResolvedCapillaryUiMessages,\n ) {\n this.locale = locale\n this.messages = messages\n Object.freeze(this)\n }\n\n message<TKey extends keyof CapillaryUiMessageOverrides>(key: TKey): CapillaryUiMessage<TKey> {\n return this.messages[key] as CapillaryUiMessage<TKey>\n }\n}\n\nconst defaultCapillaryUiLocalization: CapillaryUiLocalization = new RuntimeLocalization(\n undefined,\n englishCapillaryUiMessages,\n)\n\n/** @internal Normalize one runtime's static localization without retaining caller mutation. */\nexport function createRuntimeLocalization(\n options: CapillaryUiLocalizationOptions | undefined,\n): CapillaryUiLocalization {\n if (options == null) return defaultCapillaryUiLocalization\n if (typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('Capillary UI localization must be an object')\n }\n\n const locale = canonicalLocale(options.locale)\n const supplied = options.messages\n if (supplied != null && (typeof supplied !== 'object' || Array.isArray(supplied))) {\n throw new TypeError('Capillary UI localization messages must be an object')\n }\n\n const resolved = {...englishCapillaryUiMessages} as ResolvedCapillaryUiMessages\n if (supplied != null) {\n for (const key of Object.keys(englishCapillaryUiMessages) as (keyof CapillaryUiMessageOverrides)[]) {\n const value = supplied[key]\n if (value === undefined) continue\n const fallback = englishCapillaryUiMessages[key]\n if (typeof value !== typeof fallback) {\n throw new TypeError(`Capillary UI localization message \"${key}\" has the wrong type`)\n }\n Object.assign(resolved, {[key]: value})\n }\n }\n\n return new RuntimeLocalization(locale, Object.freeze(resolved))\n}\n\nfunction canonicalLocale(locale: unknown): string {\n if (typeof locale !== 'string' || locale.trim() === '') {\n throw new TypeError('Capillary UI localization locale must be a non-empty BCP 47 language tag')\n }\n try {\n return Intl.getCanonicalLocales(locale)[0]!\n } catch (error) {\n throw new RangeError(`Invalid Capillary UI localization locale: ${locale}`, {cause: error})\n }\n}\n","import type {\n Component,\n ComponentDependency,\n} from './Components/component.js'\nimport {\n createStyleRegistry,\n styleRegistry,\n} from './styling/styleRegistry.js'\nimport type {StyleRegistry} from './styling/styleRegistry.js'\nimport {ServiceScope, createServiceScope} from './services.js'\nimport type {BrowserRouter} from './routing/router.js'\nimport {createRuntimeLocalization} from './localization.js'\nimport type {CapillaryUiLocalization, CapillaryUiLocalizationOptions} from './localization.js'\nimport {defaultDiagnosticScope, Diagnostics} from '@capillaryjs/capillary'\nimport type {DiagnosticScope} from '@capillaryjs/capillary'\n\nconst RESERVED_CUSTOM_ELEMENT_NAMES = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n])\n\nexport interface CapillaryUiRuntimeOptions {\n /** Inherited by component and binding diagnostic identities. */\n diagnosticScope?: DiagnosticScope\n /** Service scope inherited by every component created or mounted here. */\n services?: ServiceScope\n /** Optional caller-owned browser router inherited by routed components. */\n router?: BrowserRouter\n /** Static Capillary UI message overrides and formatting locale for this runtime. */\n localization?: CapillaryUiLocalizationOptions\n}\n\n/** Application scope for structural styles, browser integrations, and localization. */\nexport class CapillaryUiRuntime {\n readonly styleRegistry: StyleRegistry\n readonly services: ServiceScope\n readonly router: BrowserRouter | null\n readonly localization: CapillaryUiLocalization\n readonly diagnosticScope: DiagnosticScope\n private readonly routedRoots = new WeakSet<Component>()\n\n constructor(\n options: CapillaryUiRuntimeOptions = {},\n registry: StyleRegistry = createStyleRegistry(),\n ) {\n if (options == null || typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('CapillaryUiRuntime options must be an object')\n }\n if (Object.hasOwn(options, 'elementNames')) {\n throw new TypeError('CapillaryUiRuntime no longer supports configurable element names')\n }\n this.styleRegistry = registry\n this.diagnosticScope = options.diagnosticScope ?? defaultDiagnosticScope\n this.localization = createRuntimeLocalization(options.localization)\n this.services = options.services ?? createServiceScope()\n if (!(this.services instanceof ServiceScope)) {\n throw new TypeError('Capillary UI services must be a ServiceScope')\n }\n this.router = options.router ?? null\n if (this.router != null\n && (typeof this.router !== 'object'\n || typeof this.router.openScope !== 'function'\n || typeof this.router.completeScope !== 'function')) {\n throw new TypeError('Capillary UI router must be a BrowserRouter')\n }\n }\n\n /** Resolve a fixed one-hyphen public host name for a built-in component. */\n resolveElementName(hostName: string): string {\n assertNamePart(hostName, 'Capillary UI component host name')\n const resolved = `cap-${hostName.replaceAll('-', '')}`\n assertCustomElementName(resolved)\n return resolved\n }\n\n resolveHostSelector(\n selector: string,\n hostName: string,\n ): string {\n if (typeof selector !== 'string') throw new TypeError('Host selector must be a string')\n return selector.replaceAll('&', this.resolveElementName(hostName))\n }\n\n resolveHostCSS(\n cssText: string,\n hostName: string,\n ): string {\n if (typeof cssText !== 'string') throw new TypeError('Host CSS must be a string')\n return cssText.replaceAll('&', this.resolveElementName(hostName))\n }\n\n create<TArgs extends unknown[], TComponent extends Component>(\n componentType: new(...args: TArgs) => TComponent,\n ...args: TArgs\n ): TComponent {\n const component = Diagnostics.withScope(this.diagnosticScope, () => new componentType(...args))\n component._setRuntime(this)\n return component\n }\n\n mount<TComponent extends Component>(\n component: TComponent,\n parent: ParentNode,\n before: Node | null = null,\n ): TComponent {\n component._setRuntime(this)\n let closeRouteScope: (() => void) | null = null\n if (this.router != null && !this.routedRoots.has(component)) {\n this.routedRoots.add(component)\n closeRouteScope = this.router.openScope(this.router.root, component)\n component.onCleanup(closeRouteScope)\n }\n try {\n component.mount(parent, before)\n if (this.router != null && closeRouteScope != null) {\n this.router.completeScope(this.router.root, component)\n }\n } catch (error) {\n closeRouteScope?.()\n throw error\n }\n return component\n }\n\n registerStyles(dependency: ComponentDependency): this {\n if (dependency == null || typeof dependency.registerStyles !== 'function') {\n throw new TypeError('registerStyles requires a Capillary UI component dependency')\n }\n dependency.registerStyles(this)\n return this\n }\n\n injectStyles(targetDocument: Document = globalThis.document): HTMLStyleElement {\n return this.styleRegistry.injectAll(targetDocument)\n }\n}\n\nexport function createCapillaryUiRuntime(options: CapillaryUiRuntimeOptions = {}): CapillaryUiRuntime {\n return new CapillaryUiRuntime(options)\n}\n\n/** Runtime used by Component.new(), direct mount(), and the legacy styleRegistry export. */\nexport const defaultCapillaryUiRuntime = new CapillaryUiRuntime({}, styleRegistry)\n\nfunction assertNamePart(value: unknown, label: string): asserts value is 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}\n\nfunction assertCustomElementName(value: unknown): asserts value is string {\n assertNamePart(value, 'Capillary UI element name')\n if (!value.includes('-') || RESERVED_CUSTOM_ELEMENT_NAMES.has(value)) {\n throw new TypeError(`Capillary UI element name must be a non-reserved name containing a hyphen: ${value}`)\n }\n}\n","import type {\n DiagnosticDescription,\n DiagnosticConsumerDetails,\n DiagnosticScope,\n FetchStateValue,\n ReadableEmitter,\n} from '@capillaryjs/capillary'\nimport {Diagnostics, diagnosticInfo, EventBubble} from '@capillaryjs/capillary'\n\nimport {CapillaryUiRuntime, defaultCapillaryUiRuntime} from '../runtime.js'\nimport type {ServiceKey} from '../services.js'\nimport type {ResolvedRoute} from '../routing/router.js'\nimport type {\n CapillaryUiLocalization,\n CapillaryUiMessage,\n CapillaryUiMessageOverrides,\n} from '../localization.js'\n\nexport const Fragment = Symbol.for('@capillaryjs/capillary-ui.Fragment')\n\nexport type Key = string | number\n\nexport interface ComponentProps {\n key?: Key | null\n children?: CapillaryUiChild | readonly CapillaryUiChild[]\n class?: string | null\n className?: string | null\n /** Opt this host into the theme-defined, non-nestable island treatment. */\n island?: boolean\n [name: string]: unknown\n}\n\n/** Semantic surface a component host contributes to its parent composition. */\nexport type CapillaryUiDataSurface = 'data' | null\n\nexport type Ref<TNode extends Node = Node> =\n | ((value: TNode | null) => void)\n | {current: TNode | null}\n\nexport type FunctionComponent<TProps extends ComponentProps = ComponentProps> = ((\n props: TProps,\n) => CapillaryUiChild) & {diagnosticLabel?: string}\n\nexport type ComponentConstructor<\n TProps extends ComponentProps = ComponentProps,\n TInstance extends Component<TProps> = Component<TProps>,\n> = new(props: TProps) => TInstance\n\ntype AnyComponentConstructor = new(props?: never) => Component\ntype ConcreteComponentConstructor = new(...args: never[]) => Component\n\nexport type VNodeType<TProps extends ComponentProps = ComponentProps> =\n | string\n | typeof Fragment\n | ComponentConstructor<TProps>\n | FunctionComponent<TProps>\n\nexport interface VNode<TProps extends ComponentProps = ComponentProps> {\n readonly type: string | typeof Fragment | Function\n readonly key: Key | null\n readonly props: TProps & {children: NormalizedChild[]}\n}\n\nexport type CapillaryUiChild =\n | string\n | number\n | boolean\n | null\n | undefined\n | VNode\n | Component\n | ReadableEmitter<CapillaryUiChild, unknown>\n | readonly CapillaryUiChild[]\n\ntype NormalizedChild = string | number | VNode | Component | ReadableEmitter<CapillaryUiChild, unknown>\n\ndeclare const liveBindingBrand: unique symbol\n\n/** Explicitly subscribe a DOM or component property to an emitter's current value. */\nexport interface LiveBinding<TValue> {\n readonly emitter: ReadableEmitter<TValue, unknown>\n readonly [liveBindingBrand]: true\n}\n\n/** Minimal writable Capillary contract used by native `bind:value` and `bind:checked`. */\nexport interface WritableEmitter<TValue, TError = unknown>\nextends ReadableEmitter<TValue, TError> {\n set(value: TValue, eventOrCause?: unknown): unknown\n}\n\nexport interface EmitterSnapshot<TValue, TError = unknown> {\n readonly value: TValue\n readonly fetchState: FetchStateValue\n readonly error: TError | null\n}\n\ndeclare const livePropContract: unique symbol\n\n/** Type-only declaration of the component props that accept `live()` bindings. */\nexport interface LivePropContract<TName extends string> {\n readonly [livePropContract]?: TName\n}\n\n/** Components opt in to every supported `live()` prop through LivePropContract. */\ntype DefaultLivePropName<_TProps extends ComponentProps> = never\n\ntype DeclaredLivePropName<TProps extends ComponentProps> =\n typeof livePropContract extends keyof TProps\n ? Extract<Exclude<TProps[typeof livePropContract], undefined>, keyof TProps>\n : DefaultLivePropName<TProps>\n\nexport type TemplateProps<TProps extends ComponentProps> = {\n [TName in keyof TProps as TName extends typeof livePropContract ? never : TName]:\n TName extends 'key' | 'children'\n ? TProps[TName]\n : TName extends DeclaredLivePropName<TProps>\n ? TProps[TName] | LiveBinding<Exclude<TProps[TName], undefined>>\n : TProps[TName]\n}\n\nexport interface ComponentDependency {\n registerStyles(runtime?: CapillaryUiRuntime, seen?: Set<ComponentDependency>): void\n}\n\ninterface Watchable {\n subscribe(\n listener: (notification: {event: EventBubble<unknown> | null}) => void,\n options?: {emitCurrent?: boolean; diagnosticTarget?: object},\n ): () => void\n}\n\nconst liveBindingValues = new WeakSet<object>()\n\nconst BOOLEAN_ATTRIBUTES = new Set([\n 'allowFullScreen',\n 'async',\n 'autoFocus',\n 'autoPlay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formNoValidate',\n 'hidden',\n 'inert',\n 'loop',\n 'multiple',\n 'muted',\n 'noModule',\n 'noValidate',\n 'open',\n 'playsInline',\n 'readOnly',\n 'required',\n 'reversed',\n 'selected',\n])\n\nconst PROPERTY_PROPS = new Set([\n 'checked',\n 'defaultChecked',\n 'defaultValue',\n 'disabled',\n 'indeterminate',\n 'multiple',\n 'muted',\n 'readOnly',\n 'required',\n 'selected',\n 'selectedIndex',\n 'tabIndex',\n 'value',\n])\n\nconst CAPILLARY_UI_RENDERER_ATTRIBUTE = 'data-cap'\n\n// Each consumer owns its writes; nested/excluded consumers suspend the outer count.\nlet rendererWrites: {count: number} | null = null\nfunction recordRendererWrite(): void { if (rendererWrites) rendererWrites.count += 1 }\n\n/** Mark an emitter as a one-way live value for a DOM or component property. */\nexport function live<TValue>(emitter: ReadableEmitter<TValue, unknown>): LiveBinding<TValue> {\n assertReadableEmitter(emitter, 'live')\n const binding = Object.freeze({emitter}) as LiveBinding<TValue>\n liveBindingValues.add(binding)\n return binding\n}\n\n/** Build a Capillary UI virtual node. */\nexport function h<TProps extends ComponentProps = ComponentProps>(\n type: VNodeType<TProps>,\n props: TemplateProps<TProps> | null = null,\n ...children: CapillaryUiChild[]\n): VNode<TProps> {\n const suppliedProps = props ?? {} as TemplateProps<TProps>\n if (typeof suppliedProps !== 'object' || Array.isArray(suppliedProps)) {\n throw new TypeError('VNode props must be an object or null')\n }\n const {\n children: propChildren,\n key = null,\n ...restProps\n } = suppliedProps\n return {\n type,\n key,\n props: {\n ...restProps,\n children: normalizeChildren([propChildren, children]),\n } as TProps & {children: NormalizedChild[]},\n }\n}\n\ntype LiveValue<TValue> = TValue | LiveBinding<Exclude<TValue, undefined>>\n\ntype AriaAttributes = {\n [TName in `aria-${string}`]?: LiveValue<string | number | boolean | null | undefined>\n}\n\ntype DataAttributes = {\n [TName in `data-${string}`]?: LiveValue<string | number | boolean | null | undefined>\n}\n\ninterface DOMEvents<TElement extends HTMLElement> {\n onClick?: ((event: MouseEvent & {currentTarget: TElement}) => void) | undefined\n onInput?: ((event: InputEvent & {currentTarget: TElement}) => void) | undefined\n onChange?: ((event: Event & {currentTarget: TElement}) => void) | undefined\n onKeyDown?: ((event: KeyboardEvent & {currentTarget: TElement}) => void) | undefined\n onKeyUp?: ((event: KeyboardEvent & {currentTarget: TElement}) => void) | undefined\n onFocus?: ((event: FocusEvent & {currentTarget: TElement}) => void) | undefined\n onBlur?: ((event: FocusEvent & {currentTarget: TElement}) => void) | undefined\n onPointerDown?: ((event: PointerEvent & {currentTarget: TElement}) => void) | undefined\n onPointerMove?: ((event: PointerEvent & {currentTarget: TElement}) => void) | undefined\n onPointerUp?: ((event: PointerEvent & {currentTarget: TElement}) => void) | undefined\n onPointerCancel?: ((event: PointerEvent & {currentTarget: TElement}) => void) | undefined\n}\n\ntype CapillaryUiDOMProps<TElement extends HTMLElement> =\nOmit<ComponentProps, 'class' | 'className'>\n& DOMEvents<TElement>\n& AriaAttributes\n& DataAttributes\n& {\n class?: LiveValue<string | undefined>\n className?: LiveValue<string | undefined>\n for?: string | undefined\n htmlFor?: string | undefined\n ref?: Ref<TElement> | undefined\n style?: LiveValue<string | Record<string, string | number | null | undefined> | undefined>\n}\n\ntype LiveDOMProperties<TElement extends HTMLElement> = {\n [TName in keyof Omit<TElement, keyof ComponentProps | 'style' | 'children'>]?:\n LiveValue<TElement[TName] | undefined>\n}\n\ntype NativeValueBinding<TElement extends HTMLElement> =\n TElement extends HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n ? {'bind:value'?: WritableEmitter<string> | undefined}\n : {}\n\ntype NativeCheckedBinding<TElement extends HTMLElement> =\n TElement extends HTMLInputElement\n ? {'bind:checked'?: WritableEmitter<boolean> | undefined}\n : {}\n\nexport interface CapillaryUiHostElementTagNameMap {\n 'cap-content': HTMLElement\n 'cap-checkshell': HTMLElement\n 'cap-selectshell': HTMLElement\n 'cap-expander': HTMLElement\n 'cap-label': HTMLElement\n 'cap-options': HTMLElement\n 'cap-error': HTMLElement\n 'cap-erroricon': HTMLElement\n 'cap-errortext': HTMLElement\n 'cap-toolbarcontent': HTMLElement\n 'cap-primary': HTMLElement\n 'cap-secondary': HTMLElement\n 'cap-separator': HTMLElement\n 'cap-progress': HTMLElement\n 'cap-inverse': HTMLElement\n 'cap-presets': HTMLElement\n 'cap-draghandle': HTMLElement\n 'cap-chart': HTMLElement\n 'cap-readout': HTMLElement\n 'cap-swatch': HTMLElement\n 'cap-summary': HTMLElement\n 'cap-scroller': HTMLElement\n 'cap-blocks': HTMLElement\n 'cap-blockskeleton': HTMLElement\n 'cap-blockskeletoncolumn': HTMLElement\n 'cap-blocklabel': HTMLElement\n 'cap-blockname': HTMLElement\n 'cap-blockgroup': HTMLElement\n 'cap-categoryhidecontent': HTMLElement\n 'cap-criteriongroups': HTMLElement\n 'cap-categorygroupcontent': HTMLElement\n 'cap-categories': HTMLElement\n 'cap-categoryoption': HTMLElement\n 'cap-categoryswatch': HTMLElement\n 'cap-infopanel': HTMLElement\n 'cap-datepicker': HTMLElement\n 'cap-timepicker': HTMLElement\n 'cap-datetimepicker': HTMLElement\n}\n\nexport type CapillaryUiElementTagNameMap = HTMLElementTagNameMap & CapillaryUiHostElementTagNameMap\n\nexport type CapillaryUiIntrinsicElements = {\n [TTag in keyof CapillaryUiElementTagNameMap]: CapillaryUiDOMProps<CapillaryUiElementTagNameMap[TTag]>\n & LiveDOMProperties<CapillaryUiElementTagNameMap[TTag]>\n & NativeValueBinding<CapillaryUiElementTagNameMap[TTag]>\n & NativeCheckedBinding<CapillaryUiElementTagNameMap[TTag]>\n}\n\n/** Classic JSX type namespace for consumers configured with `jsxFactory: \"h\"`. */\nexport namespace h {\n export namespace JSX {\n export type Element = VNode | Component\n export interface ElementClass extends Component {}\n export interface ElementAttributesProperty {\n props: {}\n }\n export interface ElementChildrenAttribute {\n children: {}\n }\n export interface IntrinsicAttributes {\n key?: Key\n }\n export type LibraryManagedAttributes<_TComponent, TProps extends ComponentProps> =\n TemplateProps<TProps>\n export type IntrinsicElements = CapillaryUiIntrinsicElements\n }\n}\n\nexport function css(strings: TemplateStringsArray, ...values: unknown[]): string {\n return strings.reduce((result, string, index) =>\n result + string + String(values[index] ?? ''), '')\n}\n\nexport class Component<TProps extends ComponentProps = ComponentProps> {\n static dependencies: ComponentDependency[] = []\n static requiredServices: readonly ServiceKey<unknown>[] = []\n /** Component `live()` bindings are opt-in; subclasses declare their allowlist. */\n static liveProps: readonly string[] | null = []\n static css = css`\n .cap-fill-horizontal,\n .cap-fill-vertical {\n box-sizing: border-box;\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 .cap-fill-horizontal {\n width: 100vw;\n max-width: 100vw;\n min-width: 0;\n overflow-x: auto;\n }\n\n .cap-fill-vertical {\n height: 100vh;\n max-height: 100vh;\n min-height: 0;\n overflow-y: auto;\n }\n\n .cap-layout-horizontal,\n .cap-layout-vertical {\n display: flex;\n align-items: stretch;\n min-inline-size: 0;\n min-block-size: 0;\n gap: calc(var(--_cap-island-flow, 0) * var(--island-gap, 0px));\n }\n\n .cap-layout-horizontal {\n flex-direction: row;\n }\n\n .cap-layout-vertical {\n flex-direction: column;\n }\n\n .cap-size-natural {\n flex: 0 0 auto;\n }\n\n .cap-size-flexible {\n flex: 1 1 0;\n min-inline-size: 0;\n min-block-size: 0;\n }\n\n .cap-scroll {\n /* Move the clip into the surrounding gutter without moving the\n * content. The inherited allowance is owned by the parent layout,\n * so local gaps and nested scrollports do not add extra spacing. */\n --_cap-scroll-gutter: calc(var(--_cap-island-flow, 0) * var(--_cap-island-gutter, 0px));\n margin: calc(-1 * var(--_cap-scroll-gutter));\n padding: var(--_cap-scroll-gutter);\n overflow: auto;\n min-inline-size: 0;\n min-block-size: 0;\n }\n\n /* The mode crosses wrappers; each layout resolves its own public gap.\n * Only the first enabled scope contributes a perimeter inset. */\n .cap-island-layout {\n --_cap-island-flow: 1;\n --_cap-island-margin: 0px;\n --_cap-island-separator-background: transparent;\n box-sizing: border-box;\n padding: var(--_cap-island-outer-inset, var(--island-inset, 0px));\n gap: calc(var(--_cap-island-flow, 0) * var(--island-gap, 0px));\n }\n\n .cap-island-layout > * {\n --_cap-island-outer-inset: 0px;\n }\n\n .cap-layout-horizontal > *,\n .cap-layout-vertical > *,\n .cap-island-layout > * {\n --_cap-island-gutter: calc(var(--_cap-island-flow, 0) * var(--island-gap, 0px) / 2);\n }\n\n .cap-island-layout.cap-scroll {\n padding: calc(var(--_cap-island-outer-inset, var(--island-inset, 0px))\n + var(--_cap-scroll-gutter));\n }\n\n .cap-island-layout-off {\n --_cap-island-flow: 0;\n --_cap-island-margin: initial;\n --_cap-island-separator-background: initial;\n }\n\n .cap-island-layout-off > *,\n .island > * {\n --_cap-island-outer-inset: initial;\n --_cap-island-gutter: 0px;\n }\n\n .colored {\n --colored-base-bg:\n linear-gradient(\n 15deg,\n var(--c1) 0%,\n var(--c2) 65%,\n var(--c2) 65%,\n var(--c3) 100%\n );\n\n background: var(--colored-base-bg);\n box-shadow: var(--colored-shadow);\n border-radius: var(--ui-border-radius);\n }\n\n .app-footer.island,\n .island {\n --_cap-island-flow: 0;\n --_cap-island-separator-background: initial;\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n margin: var(--_cap-island-margin, var(--island-margin));\n padding: var(--island-padding);\n background: var(--island-background);\n border: var(--island-border);\n border-radius: var(--island-radius);\n box-shadow: var(--island-shadow);\n }\n\n .cap-fill-horizontal.island,\n .cap-fill-horizontal .island {\n max-width: calc(100% - (2 * var(--_cap-island-margin, var(--island-margin))));\n overflow-x: auto;\n }\n\n .cap-fill-vertical.island,\n .cap-fill-vertical .island {\n max-height: calc(100% - (2 * var(--_cap-island-margin, var(--island-margin))));\n overflow-y: auto;\n }\n\n label[data-cap] {\n user-select: none;\n }\n `\n static hostName: string | null = null\n /** Override for a diagnostic-tool subtree; ordinary components inherit their owner/runtime. */\n static diagnosticScope: DiagnosticScope | null = null\n /** Optional stable display name for bundled application components. Built-ins use their host name. */\n static diagnosticLabel: string | null = null\n /** Optional host-level data surface marker for parent composition. */\n static dataSurface: CapillaryUiDataSurface = null\n\n static new<TConstructor extends ConcreteComponentConstructor>(\n this: TConstructor,\n ...args: ConstructorParameters<TConstructor>\n ): InstanceType<TConstructor> {\n const instance = new this(...args)\n if (!(instance instanceof Component)) {\n throw new TypeError('Component.new() requires a Component constructor')\n }\n return instance.mount() as InstanceType<TConstructor>\n }\n\n static registerStyles(\n this: ComponentDependency & {\n css?: string\n dependencies?: ComponentDependency[]\n hostName?: string | null\n },\n runtime: CapillaryUiRuntime = defaultCapillaryUiRuntime,\n seen: Set<ComponentDependency> = new Set(),\n ): void {\n if (seen.has(this)) return\n seen.add(this)\n\n const concreteHostName = this.hostName ?? null\n const styleChain = componentStyleChain(this)\n for (const owner of styleChain) {\n if (Object.hasOwn(owner, 'css') && owner.css) {\n if (concreteHostName == null) {\n runtime.styleRegistry.registerCSS(owner.css)\n } else {\n runtime.styleRegistry.registerHostCSS(\n owner.css,\n runtime.resolveElementName(concreteHostName),\n )\n }\n }\n }\n for (const owner of styleChain) {\n if (!Object.hasOwn(owner, 'dependencies')) continue\n for (const dependency of owner.dependencies ?? []) {\n dependency.registerStyles(runtime, seen)\n }\n }\n }\n\n props: TProps\n dom: ChildNode | null = null\n /** @internal */\n _rendered: RenderRecord | null = null\n /** @internal */\n readonly _childComponents = new Set<Component>()\n /** @internal Component ancestry used to enforce structural invariants. */\n _parentComponent: Component | null = null\n private initialized = false\n private mounted = false\n private destroyed = false\n private updating = false\n private updateRequested = false\n private readonly cleanupFunctions = new Set<() => void>()\n private readonly watched = new Map<Watchable, () => void>()\n private readonly renderReadSubscriptions = new Map<Watchable, () => void>()\n private collectingRenderReads: Set<Watchable> | null = null\n /** @internal */\n _runtime: CapillaryUiRuntime = defaultCapillaryUiRuntime\n /** @internal Route lineage inherited by nested routed components. */\n _routeContext: ResolvedRoute | null = null\n\n constructor(props: TProps = {} as TProps) {\n if (props == null || typeof props !== 'object' || Array.isArray(props)) {\n throw new TypeError(`${this.constructor.name} props must be an object`)\n }\n this.props = props\n }\n\n get diagnosticScope(): DiagnosticScope {\n return (this.constructor as typeof Component).diagnosticScope\n ?? this._parentComponent?.diagnosticScope ?? this._runtime.diagnosticScope\n }\n\n /** Stable instance label, captured when this component is first observed. */\n get diagnosticLabel(): string {\n const type = this.constructor as typeof Component\n return type.diagnosticLabel ?? type.hostName ?? type.name\n }\n\n [diagnosticInfo](): DiagnosticDescription {\n return {kind: 'component', label: componentDiagnosticLabel(this), scope: this.diagnosticScope,\n sources: [...this.watched.keys(), ...this.renderReadSubscriptions.keys()],\n targets: [...this._childComponents]}\n }\n\n /** One-time setup hook. Constructors must not subscribe or render. */\n initialize(): void {}\n\n render(): CapillaryUiChild {\n throw new Error(`${this.constructor.name} must implement render()`)\n }\n\n /** Render this component's configured custom host element. */\n protected host(props: ComponentProps | null = null, ...children: CapillaryUiChild[]): VNode {\n const componentType = this.constructor as typeof Component\n const hostName = componentType.hostName\n if (hostName == null) {\n throw new Error(`${this.constructor.name} does not declare a custom host name`)\n }\n const {\n class: classAlias,\n className: suppliedClassName,\n ...hostProps\n } = props ?? {}\n const componentClassName = suppliedClassName ?? classAlias\n const className = this.props.island === true\n ? mergeClassNames(componentClassName, 'island')\n : componentClassName\n return h(this._runtime.resolveElementName(hostName), {\n ...hostProps,\n ...(className == null ? {} : {className}),\n 'data-cap-component': hostName,\n ...(componentType.dataSurface == null\n ? {}\n : {'data-cap-surface': componentType.dataSurface}),\n }, ...children)\n }\n\n /** JSX component for this instance's runtime-configured custom host. */\n protected readonly Host: (props: ComponentProps) => VNode = ({\n children = [],\n ...props\n }) => this.host(props, children)\n\n /** @internal Assign an immutable application runtime before initialization or mounting. */\n _setRuntime(runtime: CapillaryUiRuntime): this {\n if (!(runtime instanceof CapillaryUiRuntime)) {\n throw new TypeError('Component runtime must be a CapillaryUiRuntime')\n }\n if (runtime === this._runtime) return this\n if (this.initialized || this.mounted || this._rendered != null) {\n throw new Error('Cannot change a component runtime after initialization')\n }\n this._runtime = runtime\n if (this._routeContext == null) this._routeContext = runtime.router?.root ?? null\n return this\n }\n\n /** @internal Assign contextual route lineage before initialization. */\n _setRouteContext(context: ResolvedRoute | null): this {\n if (this.initialized || this.mounted || this._rendered != null) {\n throw new Error('Cannot change a component route context after initialization')\n }\n this._routeContext = context\n return this\n }\n\n /** @internal Route lineage inherited by component children. */\n _routeContextForChildren(): ResolvedRoute | null {\n return this._routeContext\n }\n\n /** @internal Assign the renderer-owned component ancestry. */\n _setParentComponent(parent: Component): this {\n if (this._parentComponent != null && this._parentComponent !== parent) {\n throw new Error('A component instance cannot move between component owners')\n }\n this._parentComponent = parent\n this.validateIslandAncestry(this.props)\n return this\n }\n\n mount(parent: ParentNode | null = null, before: Node | null = null): this {\n if (this.destroyed) throw new Error('Cannot mount a destroyed component')\n this.validateIslandAncestry(this.props)\n let mountedNow = false\n if (!this.initialized) {\n this.validateRequiredServices()\n this.initialized = true\n Diagnostics.withScope(this.diagnosticScope, () => this.initialize())\n }\n if (!this.mounted) {\n this.mounted = true\n this.update()\n mountedNow = true\n }\n if (parent != null) {\n assertParentNode(parent)\n insertRecord(parent, this._rendered, before)\n }\n if (mountedNow) this.afterMount(this.dom)\n return this\n }\n\n attachTo(parent: ParentNode): this {\n this.mount(parent)\n return this\n }\n\n update(_event?: unknown, trigger: DiagnosticConsumerDetails['trigger'] = _event instanceof EventBubble ? 'dependency' : 'explicit'): this {\n if (this.destroyed) return this\n if (!this.mounted) return this.mount()\n if (this.updating) {\n this.updateRequested = true\n return this\n }\n\n this.updating = true\n const diagnosticEvent = Diagnostics.event(this, 'consumer', {\n parent: _event instanceof EventBubble ? _event : Diagnostics.currentEvent,\n cause: 'component render', outcome: 'started',\n consumer: {trigger},\n })\n const outerWrites = rendererWrites\n const writes = diagnosticEvent ? {count: 0} : null\n let renderPasses = 0\n rendererWrites = writes\n try {\n Diagnostics.withEvent(diagnosticEvent, () => {\n do {\n renderPasses += 1\n this.updateRequested = false\n const nextReads = new Set<Watchable>()\n this.collectingRenderReads = nextReads\n let nextVNode: NormalizedChild\n try {\n nextVNode = Diagnostics.withScope(this.diagnosticScope, () => normalizeRoot(this.render()))\n } finally {\n this.collectingRenderReads = null\n }\n this._rendered = patchRoot(this._rendered, nextVNode, this)\n this.dom = firstNode(this._rendered)\n this.reconcileRenderReads(nextReads)\n this.afterUpdate(this.dom)\n } while (this.updateRequested && !this.destroyed)\n })\n if (diagnosticEvent) Diagnostics.event(this, 'consumer', {\n parent: diagnosticEvent, cause: 'component rendered', outcome: 'succeeded',\n consumer: {trigger, domWrites: writes!.count, renderPasses},\n })\n } catch (error) {\n if (diagnosticEvent) Diagnostics.event(this, 'consumer', {\n parent: diagnosticEvent, cause: 'component render failed', outcome: 'failed', error,\n consumer: {trigger, domWrites: writes!.count, renderPasses},\n })\n throw error\n } finally {\n rendererWrites = outerWrites\n this.updating = false\n }\n return this\n }\n\n setProps(nextProps: TProps): this {\n if (nextProps == null || typeof nextProps !== 'object' || Array.isArray(nextProps)) {\n throw new TypeError(`${this.constructor.name} props must be an object`)\n }\n this.validateIslandAncestry(nextProps)\n this.props = nextProps\n if (this.mounted) this.update(undefined,\n Diagnostics.currentEvent?.diagnostic?.node.kind === 'binding' ? 'dependency' : 'parent')\n return this\n }\n\n afterMount(_dom: ChildNode | null): void {}\n afterUpdate(_dom: ChildNode | null): void {}\n\n watch(...observables: Watchable[]): this {\n for (const observable of observables) {\n if (observable == null || typeof observable.subscribe !== 'function') {\n throw new TypeError('watch requires emitter-like values')\n }\n if (this.watched.has(observable)) continue\n const unsubscribe = observable.subscribe(({event}) => {\n if (this.mounted && !this.destroyed) this.update(event)\n }, {emitCurrent: false, diagnosticTarget: this})\n this.watched.set(observable, unsubscribe)\n this.onCleanup(() => {\n unsubscribe()\n this.watched.delete(observable)\n })\n }\n return this\n }\n\n watchFutureValues(...observables: Watchable[]): this {\n return this.watch(...observables)\n }\n\n /** Read an emitter during render and rerender when that dependency changes. */\n read<TValue, TError>(emitter: ReadableEmitter<TValue, TError>): TValue {\n this.trackRenderRead(emitter)\n return emitter.get()\n }\n\n /** Read a Capillary value, fetch state, and error as one tracked render dependency. */\n snapshot<TValue, TError>(\n emitter: ReadableEmitter<TValue, TError>,\n ): EmitterSnapshot<TValue, TError> {\n this.trackRenderRead(emitter)\n return Object.freeze({\n value: emitter.get(),\n fetchState: emitter.getFetchState(),\n error: emitter.getError(),\n })\n }\n\n onCleanup(cleanup: () => void): () => void {\n if (typeof cleanup !== 'function') throw new TypeError('cleanup must be a function')\n if (this.destroyed) {\n cleanup()\n return () => {}\n }\n this.cleanupFunctions.add(cleanup)\n let active = true\n return () => {\n if (!active) return\n active = false\n this.cleanupFunctions.delete(cleanup)\n cleanup()\n }\n }\n\n /** Resolve one explicitly declared application service from this component's runtime. */\n protected requireService<TService>(key: ServiceKey<TService>): TService {\n if (!this.initialized) {\n throw new Error('Components may resolve services during initialize() or later')\n }\n const componentType = this.constructor as typeof Component\n if (!componentType.requiredServices.includes(key)) {\n throw new Error(\n `${componentType.name} must declare service \"${key.name}\" in requiredServices`,\n )\n }\n return this._runtime.services.require(key)\n }\n\n /** Read the immutable Capillary UI localization selected for this component's runtime. */\n protected get localization(): CapillaryUiLocalization {\n return this._runtime.localization\n }\n\n /** Resolve one Capillary UI-authored message with the runtime's English fallback. */\n protected capillaryUiMessage<TKey extends keyof CapillaryUiMessageOverrides>(\n key: TKey,\n ): CapillaryUiMessage<TKey> {\n return this.localization.message(key)\n }\n\n listen<TEvent extends Event = Event>(\n target: EventTarget,\n type: string,\n listener: (event: TEvent) => void,\n options?: boolean | AddEventListenerOptions,\n ): this {\n if (target == null || typeof target.addEventListener !== 'function') {\n throw new TypeError('listen target must be an EventTarget')\n }\n const subject = {}\n Diagnostics.configure(subject, {kind: 'interaction', label: `${componentDiagnosticLabel(this)}: ${type}`,\n scope: this.diagnosticScope})\n const eventListener: EventListener = (event) => runUiInteraction(subject, this.diagnosticScope,\n event, eventListener, type, () => listener(event as TEvent))\n target.addEventListener(type, eventListener, options)\n this.onCleanup(() => {\n target.removeEventListener(type, eventListener, options)\n Diagnostics.dispose(subject)\n })\n return this\n }\n\n /**\n * Like {@link listen}, but returns a function that detaches the listener.\n * Use for listeners that are only active some of the time — for example\n * an outside-click handler that exists only while a popup is open — so\n * they neither fire nor appear in the trace while inactive. The listener\n * runs through the same traced native-event coalescing as listen(), and\n * is removed on destroy if it is still attached.\n */\n protected listenWhile<TEvent extends Event = Event>(\n target: EventTarget,\n type: string,\n listener: (event: TEvent) => void,\n options?: boolean | AddEventListenerOptions,\n ): () => void {\n if (target == null || typeof target.addEventListener !== 'function') {\n throw new TypeError('listen target must be an EventTarget')\n }\n const subject = {}\n Diagnostics.configure(subject, {kind: 'interaction', label: `${componentDiagnosticLabel(this)}: ${type}`,\n scope: this.diagnosticScope})\n const eventListener: EventListener = (event) => runUiInteraction(subject, this.diagnosticScope,\n event, eventListener, type, () => listener(event as TEvent))\n let attached = false\n const detach = (): void => {\n if (!attached) return\n attached = false\n target.removeEventListener(type, eventListener, options)\n Diagnostics.dispose(subject)\n }\n // onCleanup returns a disposer that removes the registration *and*\n // runs detach. Returning it (rather than detach) means a manual detach\n // also drops the cleanupFunctions entry, so repeated attach/detach\n // cycles don't accumulate retained closures until destroy.\n const unregister = this.onCleanup(detach)\n if (!this.destroyed) {\n attached = true\n target.addEventListener(type, eventListener, options)\n }\n return unregister\n }\n\n registerChild<TComponent extends Component>(component: TComponent): TComponent {\n if (!(component instanceof Component)) {\n throw new TypeError('registerChild requires a Component')\n }\n this._childComponents.add(component)\n if (Diagnostics.active) Diagnostics.inspect(this)\n return component\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.mounted = false\n Diagnostics.dispose(this)\n\n for (const cleanup of [...this.cleanupFunctions]) cleanup()\n this.cleanupFunctions.clear()\n this.watched.clear()\n for (const unsubscribe of this.renderReadSubscriptions.values()) unsubscribe()\n this.renderReadSubscriptions.clear()\n this.collectingRenderReads = null\n\n if (this._rendered) disposeRecord(this._rendered, true)\n this._rendered = null\n this.dom = null\n this._childComponents.clear()\n this.onDestroy()\n }\n\n private validateRequiredServices(): void {\n const componentType = this.constructor as typeof Component\n for (const key of componentType.requiredServices) {\n if (!this._runtime.services.has(key)) {\n throw new Error(`${componentType.name} requires unregistered service \"${key.name}\"`)\n }\n }\n }\n\n private validateIslandAncestry(props: ComponentProps): void {\n if (!hasIslandTrait(props)) return\n if (this.hasIslandDescendant()) {\n throw new Error('An island component cannot contain another island')\n }\n let ancestor = this._parentComponent\n while (ancestor != null) {\n if (hasIslandTrait(ancestor.props)) {\n throw new Error('An island component cannot be nested inside another island')\n }\n ancestor = ancestor._parentComponent\n }\n }\n\n private hasIslandDescendant(): boolean {\n for (const child of this._childComponents) {\n if (hasIslandTrait(child.props) || child.hasIslandDescendant()) return true\n }\n return false\n }\n\n onDestroy(): void {}\n\n private trackRenderRead(emitter: ReadableEmitter<unknown, unknown>): void {\n assertReadableEmitter(emitter, 'Component.read')\n if (this.collectingRenderReads == null) {\n throw new Error('Component.read() and snapshot() may only be called during render()')\n }\n this.collectingRenderReads.add(emitter)\n }\n\n private reconcileRenderReads(nextReads: Set<Watchable>): void {\n for (const [emitter, unsubscribe] of this.renderReadSubscriptions) {\n if (nextReads.has(emitter)) continue\n unsubscribe()\n this.renderReadSubscriptions.delete(emitter)\n }\n for (const emitter of nextReads) {\n if (this.watched.has(emitter) || this.renderReadSubscriptions.has(emitter)) continue\n const unsubscribe = emitter.subscribe(({event}) => {\n if (this.mounted && !this.destroyed) this.update(event)\n }, {emitCurrent: false, diagnosticTarget: this})\n this.renderReadSubscriptions.set(emitter, unsubscribe)\n }\n }\n}\n\ninterface RecordBase {\n readonly kind: string\n key: Key | null\n owner: Component\n}\n\ninterface TextRecord extends RecordBase {\n readonly kind: 'text'\n value: string | number\n node: Text\n}\n\ninterface EmitterRecord extends RecordBase {\n readonly kind: 'emitter'\n source: ReadableEmitter<CapillaryUiChild, unknown>\n start: Comment\n end: Comment\n child: RenderRecord\n unsubscribe: () => void\n}\n\ninterface LivePropRecord {\n source: ReadableEmitter<unknown, unknown>\n value: unknown\n unsubscribe: () => void\n}\n\ninterface NativeBindingRecord extends LivePropRecord {\n eventName: 'input' | 'change'\n listener: EventListener\n}\n\ninterface ElementRecord extends RecordBase {\n readonly kind: 'element'\n type: string\n node: HTMLElement\n props: ComponentProps\n listeners: Map<string, EventListener>\n liveProps: Map<string, LivePropRecord>\n nativeBindings: Map<string, NativeBindingRecord>\n ref: Ref<HTMLElement> | null\n children: RenderRecord[]\n}\n\ninterface FragmentRecord extends RecordBase {\n readonly kind: 'fragment'\n type: typeof Fragment\n start: Comment\n end: Comment\n children: RenderRecord[]\n}\n\ninterface ComponentRecord extends RecordBase {\n readonly kind: 'component'\n type: Function\n instance: Component\n prebuilt: boolean\n props: ComponentProps\n liveProps: Map<string, LivePropRecord>\n}\n\ninterface FunctionRecord extends RecordBase {\n readonly kind: 'function'\n type: FunctionComponent\n props: ComponentProps\n sourceProps: ComponentProps\n liveProps: Map<string, LivePropRecord>\n child: RenderRecord\n diagnosticSubject: object | null\n}\n\ntype RenderRecord =\n | TextRecord\n | EmitterRecord\n | ElementRecord\n | FragmentRecord\n | ComponentRecord\n | FunctionRecord\n\nfunction normalizeRoot(value: CapillaryUiChild): NormalizedChild {\n if (Array.isArray(value)) return h(Fragment, null, value)\n if (value == null || typeof value === 'boolean') return h(Fragment)\n return value as NormalizedChild\n}\n\nfunction normalizeChildren(values: CapillaryUiChild | readonly CapillaryUiChild[]): NormalizedChild[] {\n const normalized: NormalizedChild[] = []\n const visit = (value: CapillaryUiChild): void => {\n if (Array.isArray(value)) {\n for (const child of value) visit(child)\n } else if (value != null && typeof value !== 'boolean') {\n normalized.push(value as NormalizedChild)\n }\n }\n visit(values)\n return normalized\n}\n\nfunction createRecord(value: NormalizedChild, owner: Component): RenderRecord {\n if (typeof value === 'string' || typeof value === 'number') {\n return {\n kind: 'text',\n key: null,\n value,\n node: document.createTextNode(String(value)),\n owner,\n }\n }\n\n if (isReadableEmitter(value)) {\n const start = document.createComment('cap-emitter-start')\n const end = document.createComment('cap-emitter-end')\n const current = value.get()\n if (Object.is(current, value)) {\n throw new TypeError('A Capillary UI emitter child cannot render itself')\n }\n const fragment = document.createDocumentFragment()\n fragment.append(start, end)\n recordRendererWrite(); recordRendererWrite()\n const child = createRecord(normalizeRoot(current), owner)\n insertRecord(fragment, child, end)\n const record: EmitterRecord = {\n kind: 'emitter',\n key: null,\n source: value,\n start,\n end,\n child,\n unsubscribe: () => {},\n owner,\n }\n record.unsubscribe = subscribeUi(value, record, owner, 'reactive child', (nextValue) => {\n if (Object.is(nextValue, value)) {\n throw new TypeError('A Capillary UI emitter child cannot render itself')\n }\n record.child = patchRoot(record.child, normalizeRoot(nextValue), owner)\n })\n return record\n }\n\n if (value instanceof Component) {\n value._setRuntime(owner._runtime)\n value._setRouteContext(owner._routeContextForChildren())\n value._setParentComponent(owner)\n value.mount()\n owner.registerChild(value)\n return {\n kind: 'component',\n key: readKey(value.props),\n type: value.constructor,\n instance: value,\n prebuilt: true,\n props: value.props,\n liveProps: new Map(),\n owner,\n }\n }\n\n if (!isVNode(value)) {\n throw new TypeError(`Invalid Capillary UI child: ${describeValue(value)}`)\n }\n\n const {type, key = null, props} = value\n if (type === Fragment) {\n const start = document.createComment('cap-fragment-start')\n const end = document.createComment('cap-fragment-end')\n const record: FragmentRecord = {\n kind: 'fragment',\n key,\n type,\n start,\n end,\n children: [],\n owner,\n }\n const fragment = document.createDocumentFragment()\n fragment.append(start, end)\n recordRendererWrite(); recordRendererWrite()\n record.children = patchChildren(\n fragment,\n [],\n props.children,\n owner,\n end,\n start,\n )\n return record\n }\n\n if (typeof type === 'string') {\n const node = document.createElement(type)\n const record: ElementRecord = {\n kind: 'element',\n key,\n type,\n node,\n props: {},\n listeners: new Map(),\n liveProps: new Map(),\n nativeBindings: new Map(),\n ref: null,\n children: [],\n owner,\n }\n patchElementProps(record, props)\n record.children = patchChildren(node, [], props.children, owner)\n return record\n }\n\n if (isComponentClass(type)) {\n const sourceProps = props as ComponentProps\n assertSupportedComponentLiveProps(type, sourceProps)\n const resolvedProps = resolveLivePropValues(sourceProps)\n const instance = Diagnostics.withScope((type as typeof Component).diagnosticScope ?? owner.diagnosticScope,\n () => new type(resolvedProps as never))\n instance._setRuntime(owner._runtime)\n instance._setRouteContext(owner._routeContextForChildren())\n instance._setParentComponent(owner)\n const record: ComponentRecord = {\n kind: 'component',\n key,\n type,\n instance,\n prebuilt: false,\n props: resolvedProps,\n liveProps: new Map(),\n owner,\n }\n subscribeComponentLiveProps(record, sourceProps)\n instance.mount()\n owner.registerChild(instance)\n return record\n }\n\n if (typeof type === 'function') {\n const functionType = type as FunctionComponent\n const sourceProps = props as ComponentProps\n const functionProps = resolveLivePropValues(sourceProps)\n const diagnosticSubject = functionType === Reflect.get(owner, 'Host') ? null : {}\n if (diagnosticSubject) Diagnostics.configure(diagnosticSubject, {kind: 'component',\n label: String(Reflect.get(functionType, 'diagnosticLabel') ?? functionType.name ?? 'Function component'),\n scope: owner.diagnosticScope, sources: [owner]})\n const child = renderFunction(diagnosticSubject, () => createRecord(normalizeRoot(functionType(functionProps)), owner))\n const record: FunctionRecord = {\n kind: 'function',\n key,\n type: functionType,\n props: functionProps,\n sourceProps,\n liveProps: new Map(),\n child,\n diagnosticSubject,\n owner,\n }\n subscribeFunctionLiveProps(record)\n return record\n }\n\n throw new TypeError(`Unsupported vnode type: ${describeValue(type)}`)\n}\n\nfunction patchRoot(\n previous: RenderRecord | null,\n value: NormalizedChild,\n owner: Component,\n): RenderRecord {\n if (previous == null) return createRecord(value, owner)\n if (isCompatible(previous, value)) return patchCompatible(previous, value, owner)\n\n const next = createRecord(value, owner)\n const anchor = firstNode(previous)\n const parent = anchor?.parentNode ?? null\n if (parent) insertRecord(parent, next, anchor)\n disposeRecord(previous, true)\n return next\n}\n\nfunction patchCompatible(\n record: RenderRecord,\n value: NormalizedChild,\n owner: Component,\n): RenderRecord {\n if (record.kind === 'text') {\n if (typeof value !== 'string' && typeof value !== 'number') return record\n if (!Object.is(record.value, value)) {\n record.value = value\n record.node.data = String(value)\n recordRendererWrite()\n }\n return record\n }\n\n if (record.kind === 'emitter') {\n if (!isReadableEmitter(value) || record.source !== value) return record\n return record\n }\n\n if (record.kind === 'component') {\n if (value instanceof Component) return record\n if (isVNode(value)) patchComponentLiveProps(record, value.props)\n return record\n }\n\n if (!isVNode(value)) return record\n\n if (record.kind === 'function') {\n patchFunctionLiveProps(record, value.props)\n return record\n }\n\n if (record.kind === 'fragment') {\n record.children = patchChildren(\n record.start.parentNode,\n record.children,\n value.props.children,\n owner,\n record.end,\n record.start,\n )\n return record\n }\n\n patchElementProps(record, value.props)\n record.children = patchChildren(\n record.node,\n record.children,\n value.props.children,\n owner,\n )\n return record\n}\n\nfunction resolveLivePropValues(sourceProps: ComponentProps): ComponentProps {\n return Object.fromEntries(Object.entries(sourceProps).map(([key, value]) => [\n key,\n isLiveBinding(value) ? value.emitter.get() : value,\n ]))\n}\n\nfunction subscribeComponentLiveProps(\n record: ComponentRecord,\n sourceProps: ComponentProps,\n): void {\n reconcileLiveProps(record.liveProps, sourceProps, record.instance, componentDiagnosticLabel(record.instance), (key, value) => {\n record.props = {...record.props, [key]: value}\n record.instance.setProps(record.props)\n })\n record.props = resolvedLiveProps(record.liveProps, sourceProps)\n record.instance.setProps(record.props)\n}\n\nfunction patchComponentLiveProps(record: ComponentRecord, sourceProps: ComponentProps): void {\n assertSupportedComponentLiveProps(record.type, sourceProps)\n subscribeComponentLiveProps(record, sourceProps)\n}\n\nfunction assertSupportedComponentLiveProps(\n componentType: Function,\n sourceProps: ComponentProps,\n): void {\n const declared = Reflect.get(componentType, 'liveProps') as unknown\n if (declared == null) return\n if (!Array.isArray(declared) || declared.some((name) => typeof name !== 'string')) {\n throw new TypeError(`${componentType.name || 'Component'}.liveProps must be an array`)\n }\n const supported = new Set<string>(declared)\n for (const [name, value] of Object.entries(sourceProps)) {\n if (isLiveBinding(value) && !supported.has(name)) {\n throw new TypeError(\n `${componentType.name || 'Component'} prop \"${name}\" does not support live()`,\n )\n }\n }\n}\n\nfunction subscribeFunctionLiveProps(record: FunctionRecord): void {\n reconcileLiveProps(record.liveProps, record.sourceProps, record.owner, record.type.diagnosticLabel ?? record.type.name, (key, value) => {\n record.props = {...record.props, [key]: value}\n rerenderFunctionRecord(record, 'dependency')\n })\n record.props = resolvedLiveProps(record.liveProps, record.sourceProps)\n}\n\nfunction patchFunctionLiveProps(record: FunctionRecord, sourceProps: ComponentProps): void {\n record.sourceProps = sourceProps\n reconcileLiveProps(record.liveProps, sourceProps, record.owner, record.type.diagnosticLabel ?? record.type.name, (key, value) => {\n record.props = {...record.props, [key]: value}\n rerenderFunctionRecord(record, 'dependency')\n })\n record.props = resolvedLiveProps(record.liveProps, sourceProps)\n rerenderFunctionRecord(record)\n}\n\nfunction rerenderFunctionRecord(record: FunctionRecord, trigger: DiagnosticConsumerDetails['trigger'] = 'parent'): void {\n renderFunction(record.diagnosticSubject, () => {\n const rendered = normalizeRoot(record.type(record.props))\n record.child = patchRoot(record.child, rendered, record.owner)\n }, trigger)\n}\n\nfunction renderFunction<T>(subject: object | null, render: () => T, trigger: DiagnosticConsumerDetails['trigger'] = 'parent'): T {\n if (!subject) return render()\n const event = Diagnostics.event(subject, 'consumer', {cause: 'function component render', outcome: 'started', consumer: {trigger}})\n const outerWrites = rendererWrites\n const writes = event ? {count: 0} : null\n rendererWrites = writes\n try {\n const result = event ? Diagnostics.withEvent(event, render) : render()\n if (event) Diagnostics.event(subject, 'consumer', {parent: event, cause: 'function component rendered', outcome: 'succeeded', consumer: {trigger, domWrites: writes!.count, renderPasses: 1}})\n return result\n } catch (error) {\n if (event) Diagnostics.event(subject, 'consumer', {parent: event, cause: 'function component failed', outcome: 'failed', error, consumer: {trigger, domWrites: writes!.count, renderPasses: 1}})\n throw error\n } finally { rendererWrites = outerWrites }\n}\n\nfunction reconcileLiveProps(\n subscriptions: Map<string, LivePropRecord>,\n sourceProps: ComponentProps,\n owner: Component,\n label: string,\n onValue: (key: string, value: unknown) => void,\n): void {\n for (const [key, existing] of subscriptions) {\n const next = sourceProps[key]\n if (isLiveBinding(next) && next.emitter === existing.source) continue\n existing.unsubscribe()\n subscriptions.delete(key)\n }\n\n for (const [key, value] of Object.entries(sourceProps)) {\n if (!isLiveBinding(value) || subscriptions.has(key)) continue\n const liveProp: LivePropRecord = {\n source: value.emitter,\n value: value.emitter.get(),\n unsubscribe: () => {},\n }\n liveProp.unsubscribe = subscribeUi(value.emitter, liveProp, owner, `${label}.${key}`, (nextValue) => {\n if (subscriptions.get(key) !== liveProp) return\n liveProp.value = nextValue\n onValue(key, nextValue)\n })\n subscriptions.set(key, liveProp)\n }\n}\n\nfunction resolvedLiveProps(\n subscriptions: Map<string, LivePropRecord>,\n sourceProps: ComponentProps,\n): ComponentProps {\n return Object.fromEntries(Object.entries(sourceProps).map(([key, value]) => [\n key,\n isLiveBinding(value) ? subscriptions.get(key)?.value ?? value.emitter.get() : value,\n ]))\n}\n\nfunction patchChildren(\n parent: ParentNode | null,\n previous: RenderRecord[],\n values: CapillaryUiChild | readonly CapillaryUiChild[],\n owner: Component,\n end: Node | null = null,\n start: Node | null = null,\n): RenderRecord[] {\n if (parent == null) throw new Error('Cannot patch a detached fragment range')\n const nextValues = normalizeChildren(values)\n const keyed = new Map<Key, RenderRecord>()\n const unkeyed: RenderRecord[] = []\n for (const record of previous) {\n if (record.key == null) unkeyed.push(record)\n else if (!keyed.has(record.key)) keyed.set(record.key, record)\n }\n\n const seenKeys = new Set<Key>()\n const retained = new Set<RenderRecord>()\n const nextRecords: RenderRecord[] = []\n let unkeyedIndex = 0\n\n for (const value of nextValues) {\n const key = valueKey(value)\n if (key != null) {\n if (seenKeys.has(key)) throw new Error(`Duplicate sibling key: ${String(key)}`)\n seenKeys.add(key)\n }\n const candidate = key == null\n ? unkeyed[unkeyedIndex++]\n : keyed.get(key)\n if (candidate && isCompatible(candidate, value)) {\n retained.add(candidate)\n nextRecords.push(patchCompatible(candidate, value, owner))\n } else {\n nextRecords.push(createRecord(value, owner))\n }\n }\n\n for (const record of previous) {\n if (!retained.has(record)) disposeRecord(record, true)\n }\n\n let cursor = start ? start.nextSibling : parent.firstChild\n for (const record of nextRecords) {\n for (const node of recordNodes(record)) {\n if (node === cursor) {\n cursor = cursor.nextSibling\n } else {\n parent.insertBefore(node, cursor ?? end)\n recordRendererWrite()\n cursor = node.nextSibling\n }\n }\n }\n\n return nextRecords\n}\n\nfunction patchElementProps(record: ElementRecord, nextProps: ComponentProps): void {\n const next = Object.fromEntries(Object.entries(nextProps).filter(([key]) =>\n key !== 'children' && normalizeAttributeName(key) !== CAPILLARY_UI_RENDERER_ATTRIBUTE,\n )) as ComponentProps\n const previous = record.props\n const keys = new Set([...Object.keys(previous), ...Object.keys(next)])\n\n for (const property of ['value', 'checked'] as const) {\n if (Object.hasOwn(next, property) && Object.hasOwn(next, `bind:${property}`)) {\n throw new Error(`${property} and bind:${property} cannot be used together`)\n }\n }\n\n for (const key of keys) {\n const previousValue = previous[key]\n const nextValue = next[key]\n if (isNativeBindingProp(key)) {\n patchNativeBinding(record, key, nextValue)\n } else if (key === 'ref') {\n if (previousValue !== nextValue) patchRef(record, nextValue)\n } else if (isEventProp(key)) {\n patchEvent(record, key, nextValue)\n } else if (isLiveBinding(nextValue)) {\n patchLiveElementProp(record, key, nextValue)\n } else {\n const previousLive = record.liveProps.get(key)\n if (previousLive) {\n previousLive.unsubscribe()\n record.liveProps.delete(key)\n }\n const previousResolved = previousLive?.value ?? previousValue\n if (!Object.is(previousResolved, nextValue)) {\n patchDOMProp(record.node, key, previousResolved, nextValue)\n }\n }\n }\n setAttribute(record.node, CAPILLARY_UI_RENDERER_ATTRIBUTE, '')\n record.props = {...next}\n}\n\nfunction patchLiveElementProp(\n record: ElementRecord,\n key: string,\n binding: LiveBinding<unknown>,\n): void {\n const existing = record.liveProps.get(key)\n if (existing?.source === binding.emitter) return\n\n existing?.unsubscribe()\n const value = binding.emitter.get()\n patchDOMProp(record.node, key, existing?.value ?? record.props[key], value)\n const liveProp: LivePropRecord = {\n source: binding.emitter,\n value,\n unsubscribe: () => {},\n }\n liveProp.unsubscribe = subscribeUi(binding.emitter, liveProp, record.owner, `${record.type}.${key}`, (nextValue) => {\n const previousValue = liveProp.value\n liveProp.value = nextValue\n if (!Object.is(previousValue, nextValue)) {\n patchDOMProp(record.node, key, previousValue, nextValue)\n }\n })\n record.liveProps.set(key, liveProp)\n}\n\nfunction patchNativeBinding(\n record: ElementRecord,\n key: 'bind:value' | 'bind:checked',\n next: unknown,\n): void {\n const property = key.slice(5) as 'value' | 'checked'\n const existing = record.nativeBindings.get(key)\n if (next == null) {\n if (existing) {\n existing.unsubscribe()\n record.node.removeEventListener(existing.eventName, existing.listener)\n record.nativeBindings.delete(key)\n patchDOMProp(record.node, property, existing.value, undefined)\n }\n return\n }\n assertWritableEmitter(next, key)\n if (existing?.source === next) return\n\n if (existing) {\n existing.unsubscribe()\n record.node.removeEventListener(existing.eventName, existing.listener)\n }\n assertNativeBindingTarget(record.node, property)\n const eventName = nativeBindingEvent(record.node, property)\n const value = next.get()\n patchDOMProp(record.node, property, existing?.value, value)\n const listener: EventListener = (event) => {\n runUiInteraction(interactionSubject(record, eventName), record.owner.diagnosticScope,\n event, listener, `${key} changed`, () => next.set(Reflect.get(record.node, property), `${key} changed`))\n }\n const binding: NativeBindingRecord = {\n source: next,\n value,\n eventName,\n listener,\n unsubscribe: () => {},\n }\n binding.unsubscribe = subscribeUi(next, binding, record.owner, `${record.type}.${key}`, (nextValue) => {\n const previousValue = binding.value\n binding.value = nextValue\n if (!Object.is(previousValue, nextValue)) {\n patchDOMProp(record.node, property, previousValue, nextValue)\n }\n })\n record.node.addEventListener(eventName, listener)\n record.nativeBindings.set(key, binding)\n}\n\nfunction patchEvent(record: ElementRecord, key: string, next: unknown): void {\n const eventName = key.slice(2).toLowerCase()\n const registered = record.listeners.get(key)\n const previous = registered ? originalListeners.get(registered) ?? registered : null\n if (registered && previous !== next) {\n record.node.removeEventListener(eventName, registered)\n record.listeners.delete(key)\n }\n if (next != null && typeof next !== 'function') {\n throw new TypeError(`${key} must be a function or null`)\n }\n if (typeof next === 'function' && previous !== next) {\n const listener: EventListener = (event) => runUiInteraction(interactionSubject(record, eventName),\n record.owner.diagnosticScope, event, listener, eventName, () => (next as EventListener).call(record.node, event))\n originalListeners.set(listener, next)\n record.node.addEventListener(eventName, listener)\n record.listeners.set(key, listener)\n }\n}\n\nconst interactions = new WeakMap<ElementRecord, Map<string, object>>()\nconst originalListeners = new WeakMap<EventListener, Function>()\nconst nativeInteractions = new WeakMap<Event, {event: EventBubble<unknown> | null; listeners: Set<object>}>()\n\nfunction runUiInteraction<T>(subject: object, scope: DiagnosticScope, native: Event, listener: object,\n cause: string, action: () => T): T {\n return Diagnostics.withScope(scope, () => {\n if (!Diagnostics.active) return action()\n let interaction = nativeInteractions.get(native)\n if (!interaction || interaction.listeners.has(listener)) {\n interaction = {event: Diagnostics.event(subject, 'interaction', {cause, outcome: 'started'}), listeners: new Set()}\n nativeInteractions.set(native, interaction)\n queueMicrotask(() => nativeInteractions.delete(native))\n }\n interaction.listeners.add(listener)\n return Diagnostics.withEvent(interaction.event, action)\n })\n}\n\nfunction interactionSubject(record: ElementRecord, type: string): object {\n let subjects = interactions.get(record)\n if (!subjects) { subjects = new Map(); interactions.set(record, subjects) }\n let subject = subjects.get(type)\n if (!subject) {\n subject = {}\n const name = record.node.getAttribute('aria-label') ?? record.node.getAttribute('name')\n ?? record.node.textContent?.trim().slice(0, 80) ?? ''\n Diagnostics.configure(subject, {kind: 'interaction',\n label: `${componentDiagnosticLabel(record.owner)}: ${record.type} ${name} ${type}`.trim(),\n scope: record.owner.diagnosticScope})\n subjects.set(type, subject)\n }\n return subject\n}\n\nfunction subscribeUi<T>(\n source: ReadableEmitter<T, unknown>, subject: object, owner: Component, label: string,\n onValue: (value: T) => void,\n): () => void {\n Diagnostics.configure(subject, {kind: 'binding', label: `${componentDiagnosticLabel(owner)}: ${label}`,\n scope: owner.diagnosticScope, sources: [source]})\n const unsubscribe = source.subscribe(({value, event}) => {\n const consumed = Diagnostics.event(subject, 'consumer', {parent: event,\n cause: 'binding update', value, outcome: 'started', consumer: {trigger: 'dependency'}})\n const outerWrites = rendererWrites\n const writes = consumed ? {count: 0} : null\n rendererWrites = writes\n try {\n Diagnostics.withEvent(consumed, () => onValue(value))\n if (consumed) Diagnostics.event(subject, 'consumer', {parent: consumed,\n cause: 'binding updated', value, outcome: 'succeeded', consumer: {trigger: 'dependency', domWrites: writes!.count}})\n } catch (error) {\n if (consumed) Diagnostics.event(subject, 'consumer', {parent: consumed,\n cause: 'binding update failed', outcome: 'failed', error, consumer: {trigger: 'dependency', domWrites: writes!.count}})\n throw error\n } finally { rendererWrites = outerWrites }\n }, {emitCurrent: false, diagnosticTarget: subject})\n return () => { unsubscribe(); Diagnostics.dispose(subject) }\n}\n\nfunction componentDiagnosticLabel(component: Component): string {\n return component.diagnosticLabel\n}\n\nfunction patchRef(record: ElementRecord, next: unknown): void {\n applyRef(record.ref, null)\n if (next != null && typeof next !== 'function' && typeof next !== 'object') {\n throw new TypeError('ref must be a function, object, or null')\n }\n record.ref = next as Ref<HTMLElement> | null\n applyRef(record.ref, record.node)\n}\n\nfunction patchDOMProp(\n node: HTMLElement,\n key: string,\n previous: unknown,\n next: unknown,\n): void {\n if (key === 'class' || key === 'className') {\n setAttribute(node, 'class', next)\n return\n }\n if (key === 'for' || key === 'htmlFor') {\n setAttribute(node, 'for', next)\n return\n }\n if (key === 'dataset') {\n patchDataset(node, previous, next)\n return\n }\n if (key === 'style') {\n patchStyle(node, previous, next)\n return\n }\n if (key === 'dangerouslySetInnerHTML') {\n throw new Error('dangerouslySetInnerHTML is not supported')\n }\n\n const property = normalizePropertyName(key)\n if (BOOLEAN_ATTRIBUTES.has(property)) {\n const enabled = Boolean(next)\n if (property in node && Reflect.get(node, property) !== enabled) {\n Reflect.set(node, property, enabled)\n recordRendererWrite()\n }\n setAttribute(node, normalizeAttributeName(key), enabled)\n return\n }\n // `<option value=\"\">` is semantically distinct from omitting `value`:\n // without the attribute, browsers use the option's label as its value.\n // Preserve an explicit empty sentinel for required selects.\n if (property === 'value' && node.localName === 'option') {\n setAttribute(node, normalizeAttributeName(key), next)\n return\n }\n if (PROPERTY_PROPS.has(property) && property in node) {\n const value = next ?? (property === 'value' ? '' : false)\n if (!Object.is(Reflect.get(node, property), value)) {\n Reflect.set(node, property, value)\n recordRendererWrite()\n }\n if (next == null) setAttribute(node, normalizeAttributeName(key), null)\n return\n }\n\n setAttribute(node, normalizeAttributeName(key), next)\n}\n\nfunction patchDataset(node: HTMLElement, previous: unknown, next: unknown): void {\n const oldValues = toPropertyRecord(previous, 'dataset')\n const newValues = toPropertyRecord(next, 'dataset')\n for (const key of new Set([...Object.keys(oldValues), ...Object.keys(newValues)])) {\n const value = newValues[key]\n if (node.dataset[key] === (value == null ? undefined : String(value))) continue\n if (value == null) delete node.dataset[key]\n else node.dataset[key] = String(value)\n recordRendererWrite()\n }\n}\n\nfunction patchStyle(node: HTMLElement, previous: unknown, next: unknown): void {\n if (typeof next === 'string') {\n if (node.style.cssText !== next) { node.style.cssText = next; recordRendererWrite() }\n return\n }\n const oldValues = typeof previous === 'string'\n ? {}\n : toPropertyRecord(previous, 'style')\n const newValues = toPropertyRecord(next, 'style')\n if (typeof previous === 'string' && node.style.cssText !== '') { node.style.cssText = ''; recordRendererWrite() }\n for (const key of new Set([...Object.keys(oldValues), ...Object.keys(newValues)])) {\n const value = newValues[key]\n if (key.startsWith('--')) {\n if (node.style.getPropertyValue(key) === (value == null ? '' : String(value))) continue\n if (value == null) node.style.removeProperty(key)\n else node.style.setProperty(key, String(value))\n } else {\n if (Reflect.get(node.style, key) === (value == null ? '' : String(value))) continue\n Reflect.set(node.style, key, value == null ? '' : String(value))\n }\n recordRendererWrite()\n }\n}\n\nfunction toPropertyRecord(value: unknown, label: string): Record<string, unknown> {\n if (value == null) return {}\n if (typeof value !== 'object' || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object or null`)\n }\n return value as Record<string, unknown>\n}\n\nfunction setAttribute(node: HTMLElement, name: string, value: unknown): void {\n const next = value == null || value === false ? null : value === true ? '' : String(value)\n if (node.getAttribute(name) === next) return\n if (next === null) node.removeAttribute(name)\n else node.setAttribute(name, next)\n recordRendererWrite()\n}\n\nfunction normalizePropertyName(key: string): string {\n if (key === 'readonly') return 'readOnly'\n if (key === 'autofocus') return 'autoFocus'\n return key\n}\n\nfunction normalizeAttributeName(key: string): string {\n if (key === 'className') return 'class'\n if (key === 'htmlFor') return 'for'\n if (key === 'minLength') return 'minlength'\n if (key === 'maxLength') return 'maxlength'\n if (key === 'autoComplete') return 'autocomplete'\n if (key === 'inputMode') return 'inputmode'\n if (/^aria[A-Z]/.test(key)) return camelToKebab(key)\n if (/^data[A-Z]/.test(key)) return camelToKebab(key)\n return key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)\n}\n\nfunction camelToKebab(value: string): string {\n return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)\n}\n\nfunction applyRef<TNode extends Node>(ref: Ref<TNode> | null, value: TNode | null): void {\n if (ref == null) return\n if (typeof ref === 'function') ref(value)\n else ref.current = value\n}\n\nfunction disposeRecord(record: RenderRecord, removeNodes: boolean): void {\n if (record.kind === 'emitter') {\n record.unsubscribe()\n disposeRecord(record.child, false)\n if (removeNodes) {\n for (const node of recordNodes(record)) removeRenderedNode(node)\n }\n return\n }\n if (record.kind === 'component') {\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n record.owner._childComponents.delete(record.instance)\n record.instance.destroy()\n return\n }\n if (record.kind === 'function') {\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n if (record.diagnosticSubject) Diagnostics.dispose(record.diagnosticSubject)\n disposeRecord(record.child, removeNodes)\n return\n }\n if (record.kind === 'element') {\n applyRef(record.ref, null)\n for (const [key, listener] of record.listeners) {\n record.node.removeEventListener(key.slice(2).toLowerCase(), listener)\n }\n record.listeners.clear()\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n for (const binding of record.nativeBindings.values()) {\n binding.unsubscribe()\n record.node.removeEventListener(binding.eventName, binding.listener)\n }\n record.nativeBindings.clear()\n for (const child of record.children) disposeRecord(child, false)\n if (removeNodes) removeRenderedNode(record.node)\n return\n }\n if (record.kind === 'fragment') {\n for (const child of record.children) disposeRecord(child, false)\n if (removeNodes) {\n for (const node of recordNodes(record)) removeRenderedNode(node)\n }\n return\n }\n if (removeNodes) removeRenderedNode(record.node)\n}\n\nfunction removeRenderedNode(node: ChildNode): void {\n if (node.parentNode) { node.remove(); recordRendererWrite() }\n}\n\nfunction insertRecord(parent: ParentNode, record: RenderRecord | null, before: Node | null = null): void {\n if (record == null) return\n for (const node of recordNodes(record)) {\n if (node.parentNode === parent && node.nextSibling === before) continue\n parent.insertBefore(node, before)\n recordRendererWrite()\n }\n}\n\nfunction recordNodes(record: RenderRecord | null): ChildNode[] {\n if (record == null) return []\n if (record.kind === 'text' || record.kind === 'element') return [record.node]\n if (record.kind === 'component') return recordNodes(record.instance._rendered)\n if (record.kind === 'function') return recordNodes(record.child)\n\n const nodes: ChildNode[] = []\n let node: ChildNode | null = record.start\n while (node) {\n nodes.push(node)\n if (node === record.end) break\n node = node.nextSibling\n }\n return nodes\n}\n\nfunction firstNode(record: RenderRecord | null): ChildNode | null {\n return recordNodes(record)[0] ?? null\n}\n\nfunction valueKey(value: NormalizedChild): Key | null {\n if (value instanceof Component) return readKey(value.props)\n return isVNode(value) ? value.key : null\n}\n\nfunction readKey(props: ComponentProps): Key | null {\n const key = props.key\n return typeof key === 'string' || typeof key === 'number' ? key : null\n}\n\nfunction isCompatible(record: RenderRecord, value: NormalizedChild): boolean {\n if (record.kind === 'text') {\n return typeof value === 'string' || typeof value === 'number'\n }\n if (record.kind === 'emitter') {\n return isReadableEmitter(value) && record.source === value\n }\n if (record.kind === 'component') {\n if (value instanceof Component) return record.instance === value\n return isVNode(value)\n && isComponentClass(value.type)\n && record.type === value.type\n && record.key === valueKey(value)\n }\n if (record.kind === 'function') {\n return isVNode(value)\n && record.type === value.type\n && record.key === valueKey(value)\n }\n if (record.kind === 'fragment') {\n return isVNode(value)\n && value.type === Fragment\n && record.key === valueKey(value)\n }\n return isVNode(value)\n && typeof value.type === 'string'\n && record.type === value.type\n && record.key === valueKey(value)\n}\n\nexport function isVNode(value: unknown): value is VNode {\n return value != null\n && typeof value === 'object'\n && Object.hasOwn(value, 'type')\n}\n\nfunction isComponentClass(value: unknown): value is AnyComponentConstructor {\n return typeof value === 'function'\n && (value === Component || value.prototype instanceof Component)\n}\n\nfunction isEventProp(key: string): boolean {\n return /^on[A-Z]/.test(key)\n}\n\nfunction isNativeBindingProp(key: string): key is 'bind:value' | 'bind:checked' {\n return key === 'bind:value' || key === 'bind:checked'\n}\n\nfunction isLiveBinding(value: unknown): value is LiveBinding<unknown> {\n return value != null\n && typeof value === 'object'\n && liveBindingValues.has(value)\n}\n\nfunction isReadableEmitter(value: unknown): value is ReadableEmitter<CapillaryUiChild, unknown> {\n if ((typeof value !== 'object' || value == null) && typeof value !== 'function') return false\n return typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction assertReadableEmitter(\n value: unknown,\n label: string,\n): asserts value is ReadableEmitter<unknown, unknown> {\n if (!isReadableEmitter(value)) throw new TypeError(`${label} requires a readable emitter`)\n}\n\nfunction assertWritableEmitter(\n value: unknown,\n label: string,\n): asserts value is WritableEmitter<unknown, unknown> {\n assertReadableEmitter(value, label)\n if (typeof Reflect.get(value, 'set') !== 'function') {\n throw new TypeError(`${label} requires a writable emitter`)\n }\n}\n\nfunction assertNativeBindingTarget(\n node: HTMLElement,\n property: 'value' | 'checked',\n): void {\n const tagName = node.localName\n const valid = property === 'checked'\n ? tagName === 'input'\n : tagName === 'input' || tagName === 'textarea' || tagName === 'select'\n if (!valid) throw new TypeError(`bind:${property} is not supported on ${tagName}`)\n}\n\nfunction nativeBindingEvent(\n node: HTMLElement,\n property: 'value' | 'checked',\n): 'input' | 'change' {\n return property === 'value' && node.localName !== 'select' ? 'input' : 'change'\n}\n\nfunction assertParentNode(value: unknown): asserts value is ParentNode {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'insertBefore') !== 'function') {\n throw new TypeError('Component parent must be a DOM ParentNode')\n }\n}\n\nfunction describeValue(value: unknown): string {\n try {\n return String(value)\n } catch {\n return Object.prototype.toString.call(value)\n }\n}\n\ninterface StyleOwner {\n css?: string\n dependencies?: ComponentDependency[]\n}\n\nfunction componentStyleChain(concrete: StyleOwner): StyleOwner[] {\n const chain: StyleOwner[] = []\n let owner: object | null = concrete\n while (owner != null && typeof owner === 'function') {\n chain.unshift(owner as unknown as StyleOwner)\n if (owner === Component) break\n owner = Object.getPrototypeOf(owner)\n }\n return chain\n}\n\nfunction mergeClassNames(...values: unknown[]): string {\n return [...new Set(values\n .flatMap((value) => typeof value === 'string' ? value.split(/\\s+/) : [])\n .filter(Boolean))]\n .join(' ')\n}\n\nfunction hasIslandTrait(props: ComponentProps): boolean {\n if (props.island === true) return true\n const className = props.className ?? props.class\n return typeof className === 'string' && className.split(/\\s+/).includes('island')\n}\n","import {\n Component,\n Fragment,\n h,\n} from './Components/component.js'\nimport type {\n ComponentProps,\n CapillaryUiIntrinsicElements,\n CapillaryUiChild,\n Key,\n TemplateProps,\n VNode,\n VNodeType,\n} from './Components/component.js'\n\nexport {Fragment}\n\nexport function jsx<TProps extends ComponentProps>(\n type: VNodeType<TProps>,\n props: TemplateProps<TProps> | null,\n key?: Key,\n): VNode<TProps> {\n const nextProps: TemplateProps<TProps> = props == null\n ? {} as TemplateProps<TProps>\n : {...props}\n if (key !== undefined) nextProps.key = key\n return h(type, nextProps)\n}\n\nexport const jsxs = jsx\nexport const jsxDEV = jsx\n\n/** Preserve an explicitly constructed component instance in a vnode tree. */\nexport function createPrebuiltElement<TComponent extends Component>(\n component: TComponent,\n): TComponent {\n if (!(component instanceof Component)) {\n throw new TypeError('createPrebuiltElement requires a Component instance')\n }\n return component\n}\n\nexport namespace JSX {\n export type Element = VNode | Component\n export interface ElementClass extends Component {}\n export interface ElementAttributesProperty {\n props: {}\n }\n export interface ElementChildrenAttribute {\n children: {}\n }\n export interface IntrinsicAttributes {\n key?: Key\n }\n export type LibraryManagedAttributes<_TComponent, TProps extends ComponentProps> =\n TemplateProps<TProps>\n export type IntrinsicElements = CapillaryUiIntrinsicElements\n}\n\n// Used by declaration consumers that construct children without JSX.\nexport type JSXChild = CapillaryUiChild\n","import {FetchState} from '@capillaryjs/capillary'\nimport {Button, Component, Placeholder, css} from '@capillaryjs/capillary-ui'\nimport type {ComponentProps, CapillaryUiChild} from '@capillaryjs/capillary-ui'\n\nimport type {BlockNode, BlockPath} from '../block.js'\nimport {BlockSelectionModel, findBlock} from '../block.js'\nimport {categoryColorVariables} from '../grouping.js'\n\nconst fallbackCategoryColors = [\n 'var(--colored-dark)',\n 'var(--colored-base)',\n 'var(--colored-light)',\n] as const\n\nexport interface BlockGraphProps<TItem> extends ComponentProps {\n readonly model: BlockSelectionModel<TItem>\n readonly label?: string\n readonly description?: string\n readonly emptyMessage?: string\n}\n\n/** Accessible nested proportional mosaic backed by an explicit selection model. */\nexport class BlockGraph<TItem = unknown> extends Component<BlockGraphProps<TItem>> {\n static override liveProps: readonly string[] = []\n render(): CapillaryUiChild {\n const {\n model,\n label = 'Block graph',\n description = 'Area is proportional to item count.',\n emptyMessage = 'No items are available.',\n } = this.props\n const layoutSnapshot = this.snapshot(model.layout$)\n const isLoading = layoutSnapshot.fetchState === FetchState.Initial\n || layoutSnapshot.fetchState === FetchState.Loading\n const selectedPath = this.read(model.selectedPath$)\n const layout = layoutSnapshot.value\n const selected = findBlock(layout.root, selectedPath)\n const nodes = layout.root.children.length === 0\n ? [layout.root]\n : layout.root.children\n const firstKey = nodes[0]?.key\n const Host = this.Host\n return <Host\n className={(this.props.className ?? this.props.class ?? '') || null}\n aria-label={label}\n aria-busy={isLoading ? 'true' : null}\n >\n <header>\n <cap-summary>\n <h2>{label}</h2>\n <p>{description} {isLoading ? null : `${layout.root.count} items.`}</p>\n {isLoading\n ? <Placeholder width={45} />\n : <output>\n <strong>Selection:</strong>{' '}\n {selected == null ? 'None' : selected.path.length === 0\n ? selected.label\n : selected.path.map((segment, index) => {\n const path = selected.path.slice(0, index + 1)\n return findBlock(layout.root, path)?.label ?? segment.categoryKey\n }).join(' → ')}\n </output>}\n </cap-summary>\n <Button\n label=\"Clear selection\"\n disabled={isLoading || selectedPath == null}\n onClick={() => model.clear()}\n />\n </header>\n {layoutSnapshot.fetchState === FetchState.Error\n ? <p role=\"alert\">The block graph could not be calculated.</p>\n : isLoading\n ? <>\n <p role=\"status\" aria-live=\"polite\">Loading block graph…</p>\n <cap-blockskeleton aria-hidden=\"true\">\n {[0, 1, 2].map((column) => <cap-blockskeletoncolumn key={column}>\n {[0, 1].map((row) => <Placeholder key={row} width={100} />)}\n </cap-blockskeletoncolumn>)}\n </cap-blockskeleton>\n </>\n : !layout.valid\n ? this.renderPartitionError(layout.issues)\n : layout.root.count === 0\n ? <p role=\"status\">{emptyMessage}</p>\n : <cap-scroller\n tabIndex={0}\n aria-label={`Scrollable ${label}`}\n ><cap-blocks\n role=\"tree\"\n aria-label={label}\n className={layout.root.childOrientation}\n onClick={(event: MouseEvent) => {\n if (event.target === event.currentTarget) model.clear()\n }}\n >{nodes.map((node) => this.renderBlock(\n node,\n selectedPath,\n selected?.key ?? firstKey ?? null,\n ))}</cap-blocks></cap-scroller>}\n </Host>\n }\n\n static override hostName = 'block-graph'\n static dataSurface = 'data' as const\n static override dependencies = [Button, Placeholder]\n\n static css = css`\n & {\n display: flex;\n min-width: 0;\n min-height: var(--viz-block-graph-min-height, 24rem);\n flex-direction: column;\n padding: var(--viz-space, 0.7rem);\n overflow: hidden;\n user-select: none;\n }\n\n & > header {\n display: flex;\n flex: 0 0 auto;\n flex-wrap: wrap;\n justify-content: space-between;\n gap: 0.5rem;\n margin-block-end: 0.6rem;\n }\n\n & h2,\n & p {\n margin: 0;\n }\n\n & header output {\n display: block;\n margin-block-start: 0.25rem;\n }\n\n & > cap-scroller {\n flex: 1;\n min-width: 0;\n min-height: 20rem;\n overflow: auto;\n }\n\n & > cap-blockskeleton {\n display: flex;\n flex: 1;\n gap: var(--viz-space, 0.7rem);\n min-block-size: 24rem;\n }\n\n & cap-blockskeletoncolumn {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--viz-space, 0.7rem);\n }\n\n & cap-blockskeletoncolumn:nth-child(2) {\n flex: 2;\n }\n\n & cap-blockskeletoncolumn > cap-placeholder {\n flex: 1;\n block-size: auto;\n }\n\n & cap-blockskeletoncolumn:nth-child(odd) > cap-placeholder:first-child {\n flex: 2;\n }\n\n & cap-blocks,\n & cap-blockgroup {\n display: flex;\n min-width: 0;\n min-height: 0;\n align-items: stretch;\n }\n\n & cap-blocks {\n width: 100%;\n min-width: 34rem;\n height: 100%;\n min-height: 24rem;\n }\n\n & .horizontal {\n flex-direction: row;\n }\n\n & .vertical {\n flex-direction: column;\n }\n\n & [role=\"treeitem\"] {\n position: relative;\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-basis: 0;\n flex-direction: column;\n overflow: hidden;\n border: var(--block-graph-block-border, 1px solid var(--c1, var(--colored-dark)));\n border-radius: var(--block-graph-block-radius, 0.25em);\n box-shadow: var(--block-graph-block-shadow, none);\n color: var(--colored-contrast);\n }\n\n & [role=\"treeitem\"] > cap-blocklabel {\n position: absolute;\n z-index: 1;\n inset-block-start: 0;\n inset-inline-start: 0;\n box-sizing: border-box;\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n gap: 0 0.35rem;\n width: 100%;\n padding: 0.25rem 0.4rem;\n overflow: hidden;\n text-align: start;\n border: 0;\n cursor: pointer;\n }\n\n & [role=\"treeitem\"][aria-selected=\"true\"] {\n z-index: 3;\n outline: 3px solid var(--viz-selection-color, var(--colored-contrast, Highlight));\n outline-offset: -3px;\n }\n\n & [role=\"treeitem\"]:focus-visible {\n z-index: 2;\n outline: 3px solid var(--viz-focus-color, Highlight);\n outline-offset: -3px;\n }\n\n & cap-blocklabel > cap-blockname {\n display: flex;\n flex: 1 1 auto;\n flex-flow: row nowrap;\n align-items: baseline;\n gap: 0.2rem;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n }\n\n & cap-blockname > small {\n flex: 0 1 auto;\n overflow: hidden;\n font-size: 0.68rem;\n opacity: 0.82;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n & cap-blockname > strong {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n & cap-blocklabel > data {\n flex: 0 0 auto;\n align-self: center;\n font-weight: 750;\n }\n\n & cap-blockgroup {\n position: relative;\n z-index: 1;\n box-sizing: border-box;\n flex: 1;\n padding: var(--viz-block-graph-child-inset, 1.6em);\n }\n\n & [role=\"treeitem\"]:hover:not(:has([role=\"treeitem\"]:hover)) {\n filter: saturate(1.35) brightness(1.15);\n }\n\n @media (forced-colors: active) {\n & [role=\"treeitem\"] {\n color: CanvasText;\n background: Canvas;\n border-color: CanvasText;\n forced-color-adjust: auto;\n }\n\n & [role=\"treeitem\"] > cap-blocklabel {\n color: ButtonText;\n background: ButtonFace;\n }\n }\n `\n\n private renderBlock(\n node: BlockNode<TItem>,\n selectedPath: BlockPath | null,\n tabbableKey: string | null,\n ): CapillaryUiChild {\n const selected = pathsEqual(node.path, selectedPath)\n const colors = node.colors\n const colorVariables = categoryColorVariables(colors ?? fallbackCategoryColors)\n return <article\n key={node.key}\n role=\"treeitem\"\n className=\"colored\"\n tabIndex={(selected || (selectedPath == null && node.key === tabbableKey)) ? 0 : -1}\n aria-level={Math.max(1, node.depth + 1)}\n aria-selected={selected ? 'true' : 'false'}\n aria-label={`${node.criterionLabel ?? 'Items'}: ${node.label}, ${node.count} ${node.count === 1 ? 'item' : 'items'}`}\n data-block-key={node.key}\n onClick={(event: MouseEvent) => {\n if ((event.target as Element).closest('[role=\"treeitem\"]') === event.currentTarget) {\n this.props.model.select(node.path)\n }\n }}\n onKeyDown={(event: KeyboardEvent) => this.blockKeyDown(event, node)}\n style={{\n flexGrow: node.count,\n ...colorVariables,\n ...(colors == null ? {} : {\n borderColor: colors[0],\n }),\n }}\n >\n <cap-blocklabel>\n <cap-blockname>\n <small>{node.criterionLabel ?? 'Items'}:</small>\n <strong>{node.label}</strong>\n </cap-blockname>\n <data value={String(node.count)}>{node.count}</data>\n </cap-blocklabel>\n {node.children.length === 0 ? null : <cap-blockgroup\n role=\"group\"\n className={node.childOrientation}\n >{node.children.map((child) => this.renderBlock(\n child,\n selectedPath,\n tabbableKey,\n ))}</cap-blockgroup>}\n </article>\n }\n\n private renderPartitionError(issues: readonly {kind: string; criterionLabel: string}[]): CapillaryUiChild {\n const first = issues[0]\n const detail = first == null\n ? 'The selected criteria do not form a complete partition.'\n : first.kind === 'unmatched'\n ? `${first.criterionLabel} has an item with no category.`\n : `${first.criterionLabel} has an item matching multiple categories.`\n return <div role=\"alert\">\n <strong>Invalid block partition</strong>\n <p>{detail} {issues.length} partition issue{issues.length === 1 ? '' : 's'} detected.</p>\n </div>\n }\n\n private blockKeyDown(event: KeyboardEvent, node: BlockNode<TItem>): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.props.model.select(node.path, 'block selected by keyboard')\n return\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n this.props.model.clear('block selection cleared by keyboard')\n return\n }\n const root = this.props.model.layout$.get().root\n const all = flattenBlocks(root.children.length === 0 ? [root] : root.children)\n const index = all.findIndex(({key}) => key === node.key)\n let target: BlockNode<TItem> | undefined\n if (event.key === 'ArrowDown') target = all[index + 1]\n else if (event.key === 'ArrowUp') target = all[index - 1]\n else if (event.key === 'Home') target = all[0]\n else if (event.key === 'End') target = all.at(-1)\n else if (event.key === 'ArrowRight') target = node.children[0] ?? all[index + 1]\n else if (event.key === 'ArrowLeft') {\n target = node.path.length <= 1\n ? all[index - 1]\n : findBlock(root, node.path.slice(0, -1)) ?? undefined\n } else return\n if (target == null) return\n event.preventDefault()\n this.focusBlock(target.key)\n }\n\n private focusBlock(key: string): void {\n if (!(this.dom instanceof Element)) return\n for (const element of this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')) {\n if (element.dataset.blockKey === key) {\n element.focus()\n return\n }\n }\n }\n}\n\nexport function flattenBlocks<TItem>(nodes: readonly BlockNode<TItem>[]): BlockNode<TItem>[] {\n return nodes.flatMap((node) => [node, ...flattenBlocks(node.children)])\n}\n\nfunction pathsEqual(left: BlockPath, right: BlockPath | null): boolean {\n return right != null\n && left.length === right.length\n && left.every((segment, index) => segment.criterionKey === right[index]?.criterionKey\n && segment.categoryKey === right[index]?.categoryKey)\n}\n","import {OptionGroup, OptionGroupHeaderEnd, css, readDeclarativeRegions} from '@capillaryjs/capillary-ui'\nimport type {CapillaryUiChild, OptionGroupBaseProps} from '@capillaryjs/capillary-ui'\n\nexport interface CollapsibleOptionGroupProps extends OptionGroupBaseProps {\n /** Start collapsed instead of expanded. */\n collapsed?: boolean\n}\n\n/** OptionGroup with an expand/collapse toggle button in the legend. */\nexport class CollapsibleOptionGroup<\n TProps extends CollapsibleOptionGroupProps = CollapsibleOptionGroupProps,\n> extends OptionGroup<TProps> {\n readonly contentId: string\n private collapsed: boolean\n\n constructor(props: TProps) {\n super(props)\n this.collapsed = props.collapsed ?? false\n this.contentId = `${this.groupId}-content`\n }\n\n override render(): CapillaryUiChild {\n if (this.props.headerEnd != null) {\n throw new Error(\n 'CollapsibleOptionGroup trailing header content must use a direct OptionGroupHeaderEnd child',\n )\n }\n const {content, regions} = readDeclarativeRegions(\n 'CollapsibleOptionGroup',\n this.props.children,\n {headerEnd: OptionGroupHeaderEnd},\n )\n return this.renderOptionGroup(content, regions.headerEnd ?? null)\n }\n\n private toggle(): void {\n this.collapsed = !this.collapsed\n this.update()\n }\n\n protected override 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={this.props.className ?? this.props.class ?? 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 <legend>\n <button\n type=\"button\"\n className=\"cap-collapse-toggle\"\n aria-expanded={!this.collapsed}\n aria-controls={this.contentId}\n onClick={() => this.toggle()}\n >\n {this.collapsed ? '▸' : '▾'}\n </button>\n {label != null ? <span>{label}</span> : null}\n {headerEnd}\n </legend>\n <div id={this.contentId} hidden={this.collapsed}>\n {content}\n </div>\n </fieldset>\n {this.renderOptionGroupError(error)}\n </Host>\n }\n\n static override hostName = 'collapsible-option-group'\n\n static override css = css`\n & > fieldset > legend > button.cap-collapse-toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.2em;\n height: 1.2em;\n padding: 0;\n border: 0;\n border-radius: var(--ui-border-radius);\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n flex: 0 0 auto;\n user-select: none;\n }\n\n & > fieldset > legend > button.cap-collapse-toggle:hover {\n background: var(--button-background-hover, rgba(0, 0, 0, 0.05));\n }\n\n & > fieldset > legend > button.cap-collapse-toggle:focus-visible {\n outline: 2px solid var(--focus-color, var(--ui-accent-color));\n outline-offset: 1px;\n }\n\n & > fieldset > div {\n display: contents;\n }\n\n & > fieldset > div[hidden] {\n display: none;\n }\n `\n}\n","import {FetchState} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\nimport {\n Checkbox,\n OptionsBox,\n css,\n} from '@capillaryjs/capillary-ui'\nimport type {CapillaryUiChild, GroupBoxBaseProps} from '@capillaryjs/capillary-ui'\n\nimport {CollapsibleOptionGroup} from './CollapsibleOptionGroup.js'\n\nimport type {CategoryVisibility} from '../grouping.js'\nimport {categoryColorVariables, GroupingCriterion} from '../grouping.js'\n\nconst visibilitySymbols = [\n ['☐', 'hidden'],\n ['✓', 'visible'],\n] as const\n\nexport interface CategoryHidePanelProps<TItem> extends GroupBoxBaseProps {\n readonly items$: ReadableEmitter<readonly TItem[]>\n readonly criteria: readonly GroupingCriterion<TItem>[]\n readonly label?: string\n readonly description?: string\n}\n\n/** Show/hide controls with live counts against the unfiltered item source. */\nexport class CategoryHidePanel<TItem = unknown>\nextends OptionsBox<CategoryHidePanelProps<TItem>> {\n static override liveProps: readonly string[] = []\n render(): CapillaryUiChild {\n const {\n criteria,\n label = 'Show or hide categories',\n description = '',\n } = this.props\n const itemSnapshot = this.snapshot(this.props.items$)\n const items = Array.isArray(itemSnapshot.value) ? itemSnapshot.value : []\n return this.renderGroupBox(label,\n <cap-categoryhidecontent>\n <p>{description}</p>\n {itemSnapshot.fetchState === FetchState.Error\n ? <p role=\"alert\">Category counts are unavailable.</p>\n : null}\n <cap-criteriongroups>{criteria.map((criterion) => {\n const categorySnapshot = this.snapshot(criterion.categories$)\n const categories = Array.isArray(categorySnapshot.value)\n ? categorySnapshot.value\n : []\n return <CollapsibleOptionGroup\n key={criterion.key}\n label={criterion.label}\n >\n {categorySnapshot.fetchState === FetchState.Error\n ? <p role=\"alert\">{criterion.label} categories are unavailable.</p>\n : null}\n {categorySnapshot.fetchState !== FetchState.Ready\n ? <p role=\"status\" aria-live=\"polite\">Loading {criterion.label}…</p>\n : null}\n <cap-categories>{categories.map((category) => {\n const count = countMatches(items, category.predicate)\n return <cap-categoryoption\n key={category.key}\n style={{...categoryColorVariables(category.colors)}}\n >\n <cap-categoryswatch aria-hidden=\"true\" />\n <Checkbox<CategoryVisibility>\n symbols={visibilitySymbols}\n label={`${category.label} (${count})`}\n valueEmitter={criterion.visibility(category.key)}\n />\n </cap-categoryoption>\n })}</cap-categories>\n </CollapsibleOptionGroup>\n })}</cap-criteriongroups>\n </cap-categoryhidecontent>,\n )\n }\n\n static override hostName = 'category-hide-panel'\n static dependencies = [Checkbox, CollapsibleOptionGroup]\n\n static css = css`\n & {\n flex: 0 0 auto;\n min-width: 0;\n user-select: none;\n }\n\n & > cap-content > cap-categoryhidecontent {\n display: flex;\n flex-flow: column nowrap;\n align-items: stretch;\n gap: var(--viz-space, 0.6rem);\n min-width: 0;\n }\n\n & > cap-content > cap-categoryhidecontent > p {\n margin: 0;\n color: var(--viz-muted-color, var(--ui-muted-text-color, currentColor));\n font-size: 0.875em;\n }\n\n & > cap-content > cap-categoryhidecontent > cap-criteriongroups {\n display: flex;\n flex-flow: column nowrap;\n gap: 1em;\n min-width: 0;\n }\n\n & cap-collapsible-option-group > fieldset > legend small {\n white-space: nowrap;\n }\n\n & cap-categories {\n display: flex;\n box-sizing: border-box;\n gap: .31em;\n min-width: 0;\n flex-flow: column;\n padding: 0;\n overflow: visible;\n }\n\n & cap-categoryoption {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n gap: 0.45rem;\n min-width: 0;\n\n }\n\n & cap-categoryswatch {\n display: block;\n width: 1rem;\n height: 1rem;\n border: 1px solid var(--c1);\n border-radius: 0.2rem;\n background: linear-gradient(15deg, var(--c1) 0%, var(--c2) 65%, var(--c2) 65%, var(--c3) 100%);\n }\n\n & cap-categoryoption:has(input:not(:checked)) > cap-categoryswatch {\n opacity: 0.22;\n }\n\n & cap-categoryoption > cap-checkbox,\n & cap-categoryoption > cap-checkbox > label {\n min-width: 0;\n width: 100%;\n height: unset;\n }\n\n & cap-categoryoption > cap-checkbox > label {\n justify-content: flex-start;\n text-align: start;\n white-space: nowrap;\n }\n `\n}\n\nfunction countMatches<TItem>(\n items: readonly TItem[],\n predicate: (item: TItem) => boolean,\n): number {\n let count = 0\n for (const item of items) {\n if (predicate(item)) count += 1\n }\n return count\n}\n","const DAY_MILLISECONDS = 86_400_000\nconst civilDatePattern = /^(\\d{4})-(\\d{2})-(\\d{2})$/\n\nexport type CivilDate = string\n\nexport function civilDateToDay(value: CivilDate): number {\n const match = civilDatePattern.exec(value)\n if (match == null) throw new TypeError(`Invalid civil date \"${value}\"; expected YYYY-MM-DD`)\n const year = Number(match[1])\n const month = Number(match[2])\n const date = Number(match[3])\n const milliseconds = Date.UTC(year, month - 1, date)\n const parsed = new Date(milliseconds)\n if (parsed.getUTCFullYear() !== year\n || parsed.getUTCMonth() !== month - 1\n || parsed.getUTCDate() !== date) {\n throw new TypeError(`Invalid civil date \"${value}\"`)\n }\n return Math.floor(milliseconds / DAY_MILLISECONDS)\n}\n\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)\n}\n\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\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.getUTCFullYear()).padStart(4, '0')}-${String(\n now.getUTCMonth() + 1,\n ).padStart(2, '0')}-${String(now.getUTCDate()).padStart(2, '0')}`\n}\n\nexport function compareCivilDates(left: CivilDate, right: CivilDate): number {\n return civilDateToDay(left) - civilDateToDay(right)\n}\n","import {\n civilDateToDay,\n dayToCivilDate,\n todayCivilDate,\n} from './dates.js'\nimport type {CivilDate} from './dates.js'\nimport type {HistoryShape} from './series.js'\n\nexport interface LineGraphRange {\n readonly minX?: CivilDate\n readonly maxX?: CivilDate\n readonly minY?: number\n}\n\nexport interface ChartPoint {\n readonly date: CivilDate\n readonly day: number\n readonly value: number\n readonly baseValue: number\n readonly displayValue: number\n readonly x: number\n readonly y: number\n readonly baseY: number\n}\n\nexport interface ChartSeries {\n readonly key: string\n readonly label: string\n readonly color: string\n readonly colorKey?: string\n readonly shape: HistoryShape\n readonly points: readonly ChartPoint[]\n}\n\nexport interface DateMark {\n readonly date: CivilDate\n readonly day: number\n readonly x: number\n}\n\nexport interface ValueTick {\n readonly value: number\n readonly y: number\n}\n\nexport interface LineChartModel {\n readonly minDate: CivilDate\n readonly maxDate: CivilDate\n readonly minDay: number\n readonly maxDay: number\n readonly minY: number\n readonly maxY: number\n readonly width: number\n readonly height: number\n readonly plotLeft: number\n readonly plotTop: number\n readonly plotWidth: number\n readonly plotHeight: number\n readonly stacked: boolean\n readonly series: readonly ChartSeries[]\n readonly dateMarks: readonly DateMark[]\n readonly valueTicks: readonly ValueTick[]\n}\n\nexport interface LineChartOptions {\n readonly stacked?: boolean\n readonly range?: LineGraphRange\n readonly width?: number\n readonly height?: number\n readonly maxDateMarks?: number\n readonly today?: CivilDate\n}\n\n/** Calculate normalized, optionally stacked chart coordinates without a DOM. */\nexport function buildLineChartModel(\n shapes: readonly HistoryShape[],\n options: LineChartOptions = {},\n): LineChartModel {\n validateShapes(shapes)\n const width = finiteDimension(options.width ?? 960, 'Chart width')\n const height = finiteDimension(options.height ?? 420, 'Chart height')\n const plotLeft = Math.min(72, width * 0.18)\n const plotTop = 24\n const plotWidth = Math.max(1, width - plotLeft - 24)\n const plotHeight = Math.max(1, height - plotTop - 58)\n const allDates = shapes.flatMap((shape) => Object.keys(shape.values))\n const today = options.today ?? todayCivilDate()\n const minDate = options.range?.minX ?? earliestDate(allDates) ?? today\n const maxDate = options.range?.maxX ?? today\n const minDay = civilDateToDay(minDate)\n const maxDay = civilDateToDay(maxDate)\n if (minDay > maxDay) throw new RangeError('Line graph minX must not be after maxX')\n const sampleDays = collectSampleDays(shapes, minDay, maxDay)\n const stacked = options.stacked ?? false\n const rawSeries = shapes.map((shape) => ({\n shape,\n values: sampleDays.map((day) => valueAtDay(shape, day)),\n }))\n let minimum = options.range?.minY ?? 0\n let maximum = minimum\n const accumulated = Array.from({length: sampleDays.length}, () => 0)\n const positioned = rawSeries.map(({shape, values}) => {\n const entries = values.map((value, index) => {\n const baseValue = stacked ? accumulated[index]! : 0\n const displayValue = baseValue + value\n if (stacked) accumulated[index] = displayValue\n minimum = Math.min(minimum, baseValue, displayValue)\n maximum = Math.max(maximum, baseValue, displayValue)\n return {value, baseValue, displayValue}\n })\n return {shape, entries}\n })\n const span = Math.max(1, maximum - minimum)\n const maxY = maximum + span * 0.05\n const minY = options.range?.minY ?? minimum\n const ySpan = Math.max(1, maxY - minY)\n const daySpan = Math.max(1, maxDay - minDay)\n const series: ChartSeries[] = positioned.map(({shape, entries}) => ({\n key: shape.key,\n label: shape.label,\n color: shape.color,\n ...(shape.colorKey === undefined ? {} : {colorKey: shape.colorKey}),\n shape,\n points: Object.freeze(entries.map((entry, index) => {\n const day = sampleDays[index]!\n return Object.freeze({\n date: dayToCivilDate(day),\n day,\n ...entry,\n x: plotLeft + (day - minDay) / daySpan * plotWidth,\n y: plotTop + (maxY - entry.displayValue) / ySpan * plotHeight,\n baseY: plotTop + (maxY - entry.baseValue) / ySpan * plotHeight,\n })\n })),\n }))\n return Object.freeze({\n minDate,\n maxDate,\n minDay,\n maxDay,\n minY,\n maxY,\n width,\n height,\n plotLeft,\n plotTop,\n plotWidth,\n plotHeight,\n stacked,\n series: Object.freeze(series),\n dateMarks: Object.freeze(buildDateMarks(minDay, maxDay, options.maxDateMarks ?? 8)\n .map((day) => ({\n date: dayToCivilDate(day),\n day,\n x: plotLeft + (day - minDay) / daySpan * plotWidth,\n }))),\n valueTicks: Object.freeze(buildIntegerTicks(minY, maxY).map((value) => ({\n value,\n y: plotTop + (maxY - value) / ySpan * plotHeight,\n }))),\n })\n}\n\nexport function valueAtDate(shape: HistoryShape, date: CivilDate): number {\n return valueAtDay(shape, civilDateToDay(date))\n}\n\nexport function linePath(points: readonly ChartPoint[], smooth: boolean): string {\n const first = points[0]\n if (first == null) return ''\n let path = `M ${format(first.x)} ${format(first.y)}`\n for (let index = 1; index < points.length; index += 1) {\n const previous = points[index - 1]!\n const current = points[index]!\n if (smooth) {\n const midpoint = (previous.x + current.x) / 2\n path += ` C ${format(midpoint)} ${format(previous.y)}, ${format(midpoint)} `\n + `${format(current.y)}, ${format(current.x)} ${format(current.y)}`\n } else {\n path += ` H ${format(current.x)} V ${format(current.y)}`\n }\n }\n return path\n}\n\nexport function areaPath(points: readonly ChartPoint[], smooth: boolean): string {\n if (points.length === 0) return ''\n const top = linePath(points, smooth)\n const reversed = [...points].reverse()\n let bottom = ''\n for (let index = 0; index < reversed.length; index += 1) {\n const point = reversed[index]!\n if (index === 0) bottom += ` L ${format(point.x)} ${format(point.baseY)}`\n else if (smooth) {\n const previous = reversed[index - 1]!\n const midpoint = (previous.x + point.x) / 2\n bottom += ` C ${format(midpoint)} ${format(previous.baseY)}, ${format(midpoint)} `\n + `${format(point.baseY)}, ${format(point.x)} ${format(point.baseY)}`\n } else {\n bottom += ` H ${format(point.x)} V ${format(point.baseY)}`\n }\n }\n return `${top}${bottom} Z`\n}\n\nexport function buildIntegerTicks(minimum: number, maximum: number, target = 6): number[] {\n if (!Number.isFinite(minimum) || !Number.isFinite(maximum) || minimum > maximum) {\n throw new RangeError('Tick range must contain finite ascending values')\n }\n if (!Number.isInteger(target) || target < 2) throw new RangeError('Tick target must be at least two')\n const span = Math.max(1, maximum - minimum)\n const rough = span / (target - 1)\n const magnitude = 10 ** Math.floor(Math.log10(rough))\n const normalized = rough / magnitude\n const nice = normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 5 ? 5 : 10\n const step = Math.max(1, nice * magnitude)\n const first = Math.ceil(minimum / step) * step\n const values: number[] = []\n for (let value = first; value <= maximum + step / 1000; value += step) {\n values.push(Number(value.toFixed(10)))\n }\n if (values.length === 0) values.push(Math.ceil(minimum))\n return values\n}\n\nfunction collectSampleDays(\n shapes: readonly HistoryShape[],\n minDay: number,\n maxDay: number,\n): number[] {\n const days = new Set<number>([minDay, maxDay])\n for (const shape of shapes) {\n for (const date of Object.keys(shape.values)) {\n const day = civilDateToDay(date)\n if (day >= minDay && day <= maxDay) days.add(day)\n }\n }\n return [...days].sort((left, right) => left - right)\n}\n\nfunction valueAtDay(shape: HistoryShape, day: number): number {\n const exact = shape.values[dayToCivilDate(day)]\n if (exact !== undefined) return exact\n if (shape.carryForward !== true) return 0\n let bestDay = Number.NEGATIVE_INFINITY\n let bestValue = 0\n for (const [date, value] of Object.entries(shape.values)) {\n const candidate = civilDateToDay(date)\n if (candidate <= day && candidate > bestDay) {\n bestDay = candidate\n bestValue = value\n }\n }\n return bestValue\n}\n\nfunction buildDateMarks(minDay: number, maxDay: number, maximum: number): number[] {\n if (!Number.isInteger(maximum) || maximum < 2) {\n throw new RangeError('Maximum date marks must be at least two')\n }\n const span = Math.max(0, maxDay - minDay)\n const rawStep = span <= 62 ? 7 : span <= 730 ? 30 : 365\n const step = Math.max(rawStep, Math.ceil(Math.max(1, span) / (maximum - 1)))\n const marks = [minDay]\n for (let day = minDay + step; day < maxDay; day += step) marks.push(day)\n if (maxDay !== minDay) marks.push(maxDay)\n return marks\n}\n\nfunction validateShapes(shapes: readonly HistoryShape[]): void {\n if (!Array.isArray(shapes)) throw new TypeError('History shapes must be an array')\n const keys = new Set<string>()\n for (const shape of shapes) {\n if (shape == null || typeof shape !== 'object') throw new TypeError('History shape must be an object')\n if (typeof shape.key !== 'string' || shape.key.trim() === '' || keys.has(shape.key)) {\n throw new Error('History shape keys must be non-empty and unique')\n }\n keys.add(shape.key)\n if (typeof shape.label !== 'string' || shape.label.trim() === '') {\n throw new TypeError('History shape label must be a non-empty string')\n }\n if (typeof shape.color !== 'string' || shape.color.trim() === '') {\n throw new TypeError('History shape color must be a non-empty CSS value')\n }\n for (const [date, value] of Object.entries(shape.values)) {\n civilDateToDay(date)\n if (!Number.isFinite(value)) throw new TypeError('History shape values must be finite')\n }\n }\n}\n\nfunction earliestDate(values: readonly string[]): CivilDate | undefined {\n return values.length === 0\n ? undefined\n : values.reduce((left, right) => civilDateToDay(left) <= civilDateToDay(right)\n ? left\n : right)\n}\n\nfunction finiteDimension(value: number, label: string): number {\n if (!Number.isFinite(value) || value <= 0) throw new RangeError(`${label} must be positive`)\n return value\n}\n\nfunction format(value: number): string {\n return Number(value.toFixed(3)).toString()\n}\n","import {Emitter, FetchState} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\nimport {Component, css} from '@capillaryjs/capillary-ui'\nimport type {ComponentProps, CapillaryUiChild} from '@capillaryjs/capillary-ui'\n\nimport {civilDateToDay, dayToCivilDate} from '../dates.js'\nimport type {CivilDate} from '../dates.js'\nimport {\n areaPath,\n buildLineChartModel,\n linePath,\n valueAtDate,\n} from '../lineChart.js'\nimport type {LineChartModel, LineGraphRange} from '../lineChart.js'\nimport type {HistoryShape} from '../series.js'\n\ntype Source<TValue> = TValue | ReadableEmitter<TValue>\n\nexport interface LineGraphProps extends ComponentProps {\n /** Snapshot data or a readable source that drives the graph. */\n readonly shapes$: Source<readonly HistoryShape[]>\n readonly stacked$: Source<boolean>\n readonly smooth$: Source<boolean>\n readonly range$: Source<LineGraphRange>\n readonly label?: string\n readonly emptyMessage?: string\n readonly formatDate?: (date: CivilDate) => string\n readonly formatValue?: (value: number) => string\n}\n\n/** Responsive SVG history line/area chart with pointer and keyboard readout. */\nexport class LineGraph extends Component<LineGraphProps> {\n static override liveProps: readonly string[] = []\n private readonly cursorDate$ = new Emitter<CivilDate | null>(null, {\n owner: this,\n purpose: 'line graph cursor date',\n })\n private readonly shapes$: ReadableEmitter<readonly HistoryShape[]>\n private readonly stacked$: ReadableEmitter<boolean>\n private readonly smooth$: ReadableEmitter<boolean>\n private readonly range$: ReadableEmitter<LineGraphRange>\n private readonly ownedSources: Emitter<unknown>[] = []\n private chartHost: HTMLElement | null = null\n private observedWidth = 960\n private currentModel: LineChartModel | null = null\n private resizeObserver: ResizeObserver | null = null\n\n constructor(props: LineGraphProps) {\n super(props)\n this.shapes$ = this.source(props.shapes$, 'line graph shapes')\n this.stacked$ = this.source(props.stacked$, 'line graph stacked state')\n this.smooth$ = this.source(props.smooth$, 'line graph smooth state')\n this.range$ = this.source(props.range$, 'line graph range')\n }\n\n render(): CapillaryUiChild {\n const shapes = this.snapshot(this.shapes$)\n const stacked = this.snapshot(this.stacked$)\n const smooth = this.snapshot(this.smooth$)\n const range = this.snapshot(this.range$)\n const cursorDate = this.read(this.cursorDate$)\n const label = this.props.label ?? 'History chart'\n const state = [shapes, stacked, smooth, range].some(({fetchState}) =>\n fetchState === FetchState.Error)\n ? FetchState.Error\n : [shapes, stacked, smooth, range].some(({fetchState}) =>\n fetchState !== FetchState.Ready)\n ? FetchState.Loading\n : FetchState.Ready\n let calculationError: unknown = null\n this.currentModel = null\n if (state === FetchState.Ready) {\n try {\n this.currentModel = buildLineChartModel(shapes.value, {\n stacked: stacked.value,\n range: range.value,\n width: Math.max(480, this.observedWidth),\n maxDateMarks: this.observedWidth < 640 ? 5 : 9,\n })\n } catch (error) {\n calculationError = error\n }\n }\n const model = this.currentModel\n const activeDate = model == null\n ? null\n : cursorDate ?? model.maxDate\n const formatDate = this.props.formatDate ?? ((date: CivilDate) => date)\n const formatValue = this.props.formatValue ?? ((value: number) => String(value))\n const Host = this.Host\n return <Host\n className={(this.props.className ?? this.props.class ?? '') || null}\n aria-label={label}\n aria-busy={state !== FetchState.Ready ? 'true' : null}\n >\n <header>\n <h2>{label}</h2>\n <p>{stacked.value ? 'Stacked area' : 'Individual line'} chart;{' '}\n {smooth.value ? 'smooth' : 'step'} rendering.</p>\n </header>\n {state === FetchState.Error || calculationError != null\n ? <p role=\"alert\">The history chart could not be calculated.</p>\n : state !== FetchState.Ready\n ? <p role=\"status\" aria-live=\"polite\">Loading history chart…</p>\n : shapes.value.length === 0\n ? <p role=\"status\">{this.props.emptyMessage ?? 'No history values are available.'}</p>\n : <cap-chart\n tabIndex={0}\n role=\"group\"\n aria-label={`${label}. Use Left and Right Arrow to move by day; hold Shift to move by week.`}\n onPointerMove={(event: PointerEvent) => this.pointerMove(event)}\n onKeyDown={(event: KeyboardEvent) => this.cursorKeyDown(event)}\n ref={(element: HTMLElement | null) => this.chartHost = element}\n />}\n {model == null || activeDate == null ? null : <cap-readout>\n <p aria-live=\"polite\"><strong>{formatDate(activeDate)}</strong></p>\n <ul>{model.series.map(({shape}) => <li key={shape.key}>\n <cap-swatch\n style={{'--colored-base': shape.color}}\n aria-hidden=\"true\"\n />\n <span>{shape.label}</span>\n <strong>{formatValue(valueAtDate(shape, activeDate))}</strong>\n </li>)}</ul>\n </cap-readout>}\n </Host>\n }\n\n afterMount(): void {\n this.observeSize()\n this.drawChart()\n }\n\n afterUpdate(): void {\n this.drawChart()\n }\n\n onDestroy(): void {\n this.resizeObserver?.disconnect()\n this.resizeObserver = null\n this.chartHost = null\n this.cursorDate$.dispose()\n for (const source of this.ownedSources) source.dispose()\n this.ownedSources.length = 0\n }\n\n static override hostName = 'line-graph'\n\n static css = css`\n & {\n display: flex;\n min-width: 0;\n min-height: var(--viz-line-graph-min-height, 24rem);\n flex-direction: column;\n padding: var(--viz-space, 0.7rem);\n user-select: none;\n }\n\n & h2,\n & p,\n & ul {\n margin: 0;\n }\n\n & > cap-chart {\n flex: 1;\n min-height: 20rem;\n margin-block: 0.6rem;\n overflow: auto;\n }\n\n & svg {\n display: block;\n width: 100%;\n min-width: 30rem;\n height: auto;\n }\n\n & .gridline {\n stroke: var(--viz-grid-color, var(--ui-border-color));\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n\n & .axismark {\n fill: var(--viz-color, var(--ui-text-color));\n font: 12px system-ui, sans-serif;\n }\n\n & .seriesline {\n fill: none;\n stroke-width: 3;\n stroke-linecap: round;\n stroke-linejoin: round;\n vector-effect: non-scaling-stroke;\n }\n\n & .seriesarea {\n opacity: var(--viz-area-opacity, 0.25);\n }\n\n & .cursor {\n stroke: var(--viz-cursor-color, var(--ui-text-color));\n stroke-width: 2;\n stroke-dasharray: 4 3;\n vector-effect: non-scaling-stroke;\n }\n\n & > cap-readout {\n padding-block-start: 0.4rem;\n border-block-start: 1px solid var(--viz-border-color, var(--ui-border-color));\n }\n\n & > cap-readout ul {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem 1rem;\n padding: 0;\n list-style: none;\n }\n\n & > cap-readout li {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n }\n\n & cap-swatch {\n display: block;\n width: 0.8rem;\n height: 0.8rem;\n border-radius: 50%;\n background: var(--colored-base);\n }\n\n @media (forced-colors: active) {\n & .seriesline,\n & .cursor,\n & .gridline {\n stroke: CanvasText;\n forced-color-adjust: auto;\n }\n\n & .seriesarea {\n fill: Canvas;\n stroke: CanvasText;\n }\n }\n `\n\n private observeSize(): void {\n if (this.chartHost == null || typeof globalThis.ResizeObserver !== 'function') return\n this.resizeObserver = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width\n if (width == null || width <= 0 || Math.abs(width - this.observedWidth) < 1) return\n this.observedWidth = width\n this.update()\n })\n this.resizeObserver.observe(this.chartHost)\n }\n\n private source<TValue>(\n input: Source<TValue>,\n purpose: string,\n ): ReadableEmitter<TValue> {\n if (isReadableEmitter<TValue>(input)) return input\n const source = new Emitter(input, {owner: this, purpose})\n this.ownedSources.push(source as Emitter<unknown>)\n return source\n }\n\n private pointerMove(event: PointerEvent): void {\n const model = this.currentModel\n const host = this.chartHost\n if (model == null || host == null) return\n const bounds = host.getBoundingClientRect()\n if (bounds.width <= 0) return\n const svgX = (event.clientX - bounds.left) / bounds.width * model.width\n const ratio = Math.max(0, Math.min(1, (svgX - model.plotLeft) / model.plotWidth))\n const day = Math.round(model.minDay + ratio * (model.maxDay - model.minDay))\n this.cursorDate$.set(dayToCivilDate(day), 'line graph pointer moved')\n }\n\n private cursorKeyDown(event: KeyboardEvent): void {\n const model = this.currentModel\n if (model == null) return\n let day = civilDateToDay(this.cursorDate$.get() ?? model.maxDate)\n if (event.key === 'ArrowLeft') day -= event.shiftKey ? 7 : 1\n else if (event.key === 'ArrowRight') day += event.shiftKey ? 7 : 1\n else if (event.key === 'Home') day = model.minDay\n else if (event.key === 'End') day = model.maxDay\n else if (event.key === 'Escape') {\n event.preventDefault()\n this.cursorDate$.set(null, 'line graph cursor cleared')\n return\n } else return\n event.preventDefault()\n const date = dayToCivilDate(Math.max(model.minDay, Math.min(model.maxDay, day)))\n this.cursorDate$.set(date, 'line graph cursor moved by keyboard')\n }\n\n private drawChart(): void {\n const host = this.chartHost\n const model = this.currentModel\n if (host == null || model == null) return\n const smooth = this.smooth$.get()\n const svg = createSvg('svg')\n svg.setAttribute('viewBox', `0 0 ${model.width} ${model.height}`)\n svg.setAttribute('role', 'img')\n svg.setAttribute('aria-label', this.props.label ?? 'History chart')\n\n for (const tick of model.valueTicks) {\n const line = createSvg('line')\n line.classList.add('gridline')\n setAttributes(line, {\n x1: model.plotLeft,\n x2: model.plotLeft + model.plotWidth,\n y1: tick.y,\n y2: tick.y,\n })\n svg.append(line)\n const label = createSvg('text')\n label.classList.add('axismark')\n setAttributes(label, {x: model.plotLeft - 8, y: tick.y + 4, 'text-anchor': 'end'})\n label.textContent = String(tick.value)\n svg.append(label)\n }\n for (const mark of model.dateMarks) {\n const line = createSvg('line')\n line.classList.add('gridline')\n setAttributes(line, {\n x1: mark.x,\n x2: mark.x,\n y1: model.plotTop,\n y2: model.plotTop + model.plotHeight,\n })\n svg.append(line)\n const label = createSvg('text')\n label.classList.add('axismark')\n setAttributes(label, {\n x: mark.x,\n y: model.plotTop + model.plotHeight + 22,\n 'text-anchor': 'middle',\n })\n label.textContent = mark.date\n svg.append(label)\n }\n for (const series of model.series) {\n if (model.stacked) {\n const area = createSvg('path')\n area.classList.add('seriesarea')\n area.setAttribute('fill', series.color)\n area.setAttribute('d', areaPath(series.points, smooth))\n svg.append(area)\n }\n const path = createSvg('path')\n path.classList.add('seriesline')\n path.setAttribute('stroke', series.color)\n path.setAttribute('d', linePath(series.points, smooth))\n svg.append(path)\n }\n const cursor = this.cursorDate$.get()\n if (cursor != null) {\n const day = civilDateToDay(cursor)\n const x = model.plotLeft\n + (day - model.minDay) / Math.max(1, model.maxDay - model.minDay)\n * model.plotWidth\n const line = createSvg('line')\n line.classList.add('cursor')\n setAttributes(line, {\n x1: x,\n x2: x,\n y1: model.plotTop,\n y2: model.plotTop + model.plotHeight,\n })\n svg.append(line)\n }\n host.replaceChildren(svg)\n }\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue> {\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\nconst SVG_NAMESPACE = 'http://www.w3.org/2000/svg'\n\nfunction createSvg<TName extends keyof SVGElementTagNameMap>(\n name: TName,\n): SVGElementTagNameMap[TName] {\n return document.createElementNS(SVG_NAMESPACE, name)\n}\n\nfunction setAttributes(element: Element, attributes: Readonly<Record<string, string | number>>): void {\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, String(value))\n }\n}\n","import {BaseEmitter, DerivedEmitter, Emitter} from '@capillaryjs/capillary'\nimport type {EmitterNotification, ReadableEmitter} from '@capillaryjs/capillary'\n\nimport type {CategoryVisibility, VisualizationValueEmitter} from './grouping.js'\nimport {GroupingCriterion} from './grouping.js'\n\nexport interface SplitPreset {\n readonly key: string\n readonly label: string\n readonly active: readonly string[]\n readonly inactive?: readonly string[]\n}\n\ninterface SplitState {\n readonly order: readonly string[]\n readonly active: ReadonlySet<string>\n}\n\n/** Ordered split selection shared by controls, presets, and block models. */\nexport class SplitSelectionModel<TItem> {\n readonly criteria: readonly GroupingCriterion<TItem>[]\n readonly presets: readonly SplitPreset[]\n readonly order$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>\n readonly activeSplits$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>\n readonly activePreset$: Emitter<string | null>\n private readonly byKey: ReadonlyMap<string, GroupingCriterion<TItem>>\n private readonly state$: Emitter<SplitState>\n private readonly orderEmitter: DerivedEmitter<\n readonly GroupingCriterion<TItem>[],\n readonly [Emitter<SplitState>]\n >\n private readonly activeSplitsEmitter: DerivedEmitter<\n readonly GroupingCriterion<TItem>[],\n readonly [Emitter<SplitState>]\n >\n private readonly activeEmitters = new Map<string, ActiveSplitEmitter<TItem>>()\n private disposed = false\n\n constructor(\n criteria: readonly GroupingCriterion<TItem>[],\n options: {\n readonly active?: readonly string[]\n readonly presets?: readonly SplitPreset[]\n } = {},\n ) {\n if (!Array.isArray(criteria) || criteria.some((item) => !(item instanceof GroupingCriterion))) {\n throw new TypeError('Split criteria must contain GroupingCriterion instances')\n }\n const byKey = new Map<string, GroupingCriterion<TItem>>(\n criteria.map((criterion) => [criterion.key, criterion]),\n )\n if (byKey.size !== criteria.length) throw new Error('Split criteria keys must be unique')\n this.criteria = Object.freeze([...criteria])\n this.byKey = byKey\n this.presets = freezePresets(options.presets ?? [], byKey)\n const order = this.criteria.map(({key}) => key)\n const active = options.active ?? order\n validateKnownUniqueKeys(active, byKey, 'Active split keys')\n this.state$ = new Emitter<SplitState>(freezeState(order, new Set(active)), {\n owner: this,\n purpose: 'split selection state',\n equals: splitStatesEqual,\n })\n this.orderEmitter = new DerivedEmitter<\n readonly GroupingCriterion<TItem>[],\n readonly [Emitter<SplitState>]\n >(\n [this.state$] as const,\n ([state]) => Object.freeze(\n state.order.map((key) => requiredCriterion(byKey, key)),\n ),\n {owner: this, purpose: 'ordered visualization criteria'},\n )\n this.order$ = this.orderEmitter\n this.activeSplitsEmitter = new DerivedEmitter<\n readonly GroupingCriterion<TItem>[],\n readonly [Emitter<SplitState>]\n >(\n [this.state$] as const,\n ([state]) => Object.freeze(state.order\n .filter((key) => state.active.has(key))\n .map((key) => requiredCriterion(byKey, key))),\n {owner: this, purpose: 'active ordered visualization splits'},\n )\n this.activeSplits$ = this.activeSplitsEmitter\n this.activePreset$ = new Emitter<string | null>(null, {\n owner: this,\n purpose: 'active visualization split preset',\n })\n }\n\n activeState(criterionKey: string): VisualizationValueEmitter<CategoryVisibility> {\n this.assertActive()\n const key = this.requireKey(criterionKey)\n let emitter = this.activeEmitters.get(key)\n if (emitter == null) {\n emitter = new ActiveSplitEmitter(this, key)\n this.activeEmitters.set(key, emitter)\n }\n return emitter\n }\n\n isActive(criterionKey: string): boolean {\n return this.state$.get().active.has(this.requireKey(criterionKey))\n }\n\n toggle(criterionKey: string, eventOrCause?: unknown): boolean {\n this.assertActive()\n const key = this.requireKey(criterionKey)\n const state = this.state$.get()\n const active = new Set(state.active)\n if (active.has(key)) active.delete(key)\n else active.add(key)\n this.activePreset$.set(null, 'split selection customized')\n return this.state$.set(\n freezeState(state.order, active),\n eventOrCause ?? `${key} split toggled`,\n )\n }\n\n move(criterionKey: string, targetIndex: number, eventOrCause?: unknown): boolean {\n this.assertActive()\n const key = this.requireKey(criterionKey)\n if (!Number.isInteger(targetIndex)) throw new TypeError('Split target index must be an integer')\n const state = this.state$.get()\n const from = state.order.indexOf(key)\n const to = Math.max(0, Math.min(targetIndex, state.order.length - 1))\n if (from === to) return false\n const order = [...state.order]\n order.splice(from, 1)\n order.splice(to, 0, key)\n this.activePreset$.set(null, 'split order customized')\n return this.state$.set(\n freezeState(order, state.active),\n eventOrCause ?? `${key} split moved`,\n )\n }\n\n moveBy(criterionKey: string, offset: number, eventOrCause?: unknown): boolean {\n if (!Number.isInteger(offset)) throw new TypeError('Split move offset must be an integer')\n const key = this.requireKey(criterionKey)\n return this.move(\n key,\n this.state$.get().order.indexOf(key) + offset,\n eventOrCause,\n )\n }\n\n setSplits(\n active: readonly string[],\n inactive?: readonly string[],\n eventOrCause?: unknown,\n ): boolean {\n this.assertActive()\n validateKnownUniqueKeys(active, this.byKey, 'Active split keys')\n const activeSet = new Set(active)\n const inactiveKeys = inactive ?? this.state$.get().order.filter((key) => !activeSet.has(key))\n validateKnownUniqueKeys(inactiveKeys, this.byKey, 'Inactive split keys')\n const combined = [...active, ...inactiveKeys]\n if (new Set(combined).size !== this.criteria.length\n || combined.length !== this.criteria.length) {\n throw new Error('Active and inactive split keys must cover every criterion exactly once')\n }\n this.activePreset$.set(null, 'split selection replaced')\n return this.state$.set(\n freezeState(combined, activeSet),\n eventOrCause ?? 'split selection replaced',\n )\n }\n\n applyPreset(presetKey: string): boolean {\n this.assertActive()\n const preset = this.presets.find(({key}) => key === presetKey)\n if (preset == null) throw new Error(`Unknown split preset \"${presetKey}\"`)\n const changed = this.setSplits(preset.active, preset.inactive, `${preset.key} preset applied`)\n this.activePreset$.set(preset.key, `${preset.key} preset applied`)\n return changed\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n for (const emitter of this.activeEmitters.values()) emitter.dispose()\n this.activeEmitters.clear()\n this.activePreset$.dispose()\n this.activeSplitsEmitter.dispose()\n this.orderEmitter.dispose()\n this.state$.dispose()\n }\n\n private requireKey(value: string): string {\n if (typeof value !== 'string' || !this.byKey.has(value)) {\n throw new Error(`Unknown criterion key \"${String(value)}\"`)\n }\n return value\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('Split selection model is disposed')\n }\n}\n\nexport function createSplitSelection<TItem>(\n criteria: readonly GroupingCriterion<TItem>[],\n options: {\n readonly active?: readonly string[]\n readonly presets?: readonly SplitPreset[]\n } = {},\n): SplitSelectionModel<TItem> {\n return new SplitSelectionModel(criteria, options)\n}\n\nclass ActiveSplitEmitter<TItem> extends BaseEmitter<CategoryVisibility>\nimplements VisualizationValueEmitter<CategoryVisibility> {\n private readonly release: () => void\n\n constructor(\n private readonly model: SplitSelectionModel<TItem>,\n private readonly criterionKey: string,\n ) {\n super(model.isActive(criterionKey) ? 'visible' : 'hidden', {\n owner: model,\n purpose: `${criterionKey} split enabled`,\n fetchState: model.activeSplits$.getFetchState(),\n error: model.activeSplits$.getError(),\n })\n this.release = model.activeSplits$.subscribe(\n (notification) => this.updateFromSource(notification),\n {emitCurrent: false},\n )\n }\n\n set(value: CategoryVisibility, eventOrCause?: unknown): boolean {\n if (value !== 'hidden' && value !== 'visible') {\n throw new TypeError('Split state must be hidden or visible')\n }\n if ((value === 'visible') === this.model.isActive(this.criterionKey)) return false\n return this.model.toggle(this.criterionKey, eventOrCause)\n }\n\n override dispose(): void {\n this.release()\n super.dispose()\n }\n\n private updateFromSource(\n notification: EmitterNotification<readonly GroupingCriterion<TItem>[]>,\n ): void {\n this.setSnapshot({\n value: notification.value.some(({key}) => key === this.criterionKey)\n ? 'visible'\n : 'hidden',\n fetchState: notification.fetchState,\n error: notification.error,\n parentEvent: notification.event,\n cause: 'active split membership changed',\n })\n }\n}\n\nfunction freezePresets<TItem>(\n presets: readonly SplitPreset[],\n criteria: ReadonlyMap<string, GroupingCriterion<TItem>>,\n): readonly SplitPreset[] {\n if (!Array.isArray(presets)) throw new TypeError('Split presets must be an array')\n const keys = new Set<string>()\n return Object.freeze(presets.map((preset) => {\n if (preset == null || typeof preset !== 'object' || Array.isArray(preset)) {\n throw new TypeError('Split preset must be an object')\n }\n if (typeof preset.key !== 'string' || preset.key.trim() === '' || keys.has(preset.key)) {\n throw new Error('Split preset keys must be non-empty and unique')\n }\n if (typeof preset.label !== 'string' || preset.label.trim() === '') {\n throw new TypeError('Split preset label must be a non-empty string')\n }\n keys.add(preset.key)\n validateKnownUniqueKeys(preset.active, criteria, `${preset.key} active keys`)\n const active = Object.freeze([...preset.active])\n const inactive = preset.inactive == null\n ? Object.freeze([...criteria.keys()].filter((key) => !active.includes(key)))\n : Object.freeze([...preset.inactive])\n validateKnownUniqueKeys(inactive, criteria, `${preset.key} inactive keys`)\n if (new Set([...active, ...inactive]).size !== criteria.size\n || active.length + inactive.length !== criteria.size) {\n throw new Error(`Split preset \"${preset.key}\" must cover every criterion exactly once`)\n }\n return Object.freeze({...preset, active, inactive})\n }))\n}\n\nfunction validateKnownUniqueKeys<TItem>(\n keys: readonly string[],\n criteria: ReadonlyMap<string, GroupingCriterion<TItem>>,\n label: string,\n): void {\n if (!Array.isArray(keys)) throw new TypeError(`${label} must be an array`)\n const unique = new Set(keys)\n if (unique.size !== keys.length) throw new Error(`${label} must be unique`)\n for (const key of keys) {\n if (!criteria.has(key)) throw new Error(`${label} contains unknown criterion \"${key}\"`)\n }\n}\n\nfunction requiredCriterion<TItem>(\n criteria: ReadonlyMap<string, GroupingCriterion<TItem>>,\n key: string,\n): GroupingCriterion<TItem> {\n const criterion = criteria.get(key)\n if (criterion == null) throw new Error(`Missing criterion \"${key}\"`)\n return criterion\n}\n\nfunction freezeState(order: readonly string[], active: ReadonlySet<string>): SplitState {\n return Object.freeze({order: Object.freeze([...order]), active: new Set(active)})\n}\n\nfunction splitStatesEqual(left: SplitState, right: SplitState): boolean {\n return left.order.length === right.order.length\n && left.order.every((key, index) => key === right.order[index])\n && left.active.size === right.active.size\n && [...left.active].every((key) => right.active.has(key))\n}\n","import {Button, Checkbox, Component, GroupBox, css} from '@capillaryjs/capillary-ui'\nimport type {ComponentProps, CapillaryUiChild} from '@capillaryjs/capillary-ui'\n\nimport type {CategoryVisibility} from '../grouping.js'\nimport {SplitSelectionModel} from '../splits.js'\n\nconst activeSymbols = [\n ['☐', 'hidden'],\n ['✓', 'visible'],\n] as const\n\nexport interface SplitSelectionPanelProps<TItem> extends ComponentProps {\n readonly model: SplitSelectionModel<TItem>\n readonly label?: string\n readonly description?: string\n readonly presetsLabel?: string\n}\n\n/** Ordered enablement, presets, pointer reordering, and keyboard reordering. */\nexport class SplitSelectionPanel<TItem = unknown>\nextends Component<SplitSelectionPanelProps<TItem>> {\n static override liveProps: readonly string[] = []\n private draggingKey: string | null = null\n private pendingDrag: {key: string; clientX: number; clientY: number} | null = null\n private suppressClick = false\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null\n private announcement = ''\n\n initialize(): void {\n this.listen<PointerEvent>(document, 'pointermove', (event) => this.pointerMove(event))\n this.listen<PointerEvent>(document, 'pointerup', () => this.stopDragging())\n this.listen<PointerEvent>(document, 'pointercancel', () => this.stopDragging())\n }\n\n render(): CapillaryUiChild {\n const {\n model,\n label = 'Select and order splits',\n description = '',\n presetsLabel = 'Split presets',\n } = this.props\n const order = this.read(model.order$)\n this.read(model.activeSplits$)\n const activePreset = this.read(model.activePreset$)\n const Host = this.Host\n return <Host>\n {model.presets.length === 0 ? null : <GroupBox header={presetsLabel}>\n <cap-presets>\n {model.presets.map((preset) => <Button\n key={preset.key}\n label={preset.label}\n pressed={activePreset === preset.key}\n onClick={() => {\n model.applyPreset(preset.key)\n this.announce(`${preset.label} split preset applied`)\n }}\n />)}\n </cap-presets>\n </GroupBox>}\n <GroupBox header={label}>\n <p>{description}</p>\n <ol>{order.map((criterion) => <li\n key={criterion.key}\n className={this.draggingKey === criterion.key ? 'dragging' : undefined}\n data-split-key={criterion.key}\n onPointerDown={(event: PointerEvent) => this.startDragging(criterion.key, event)}\n onClick={(event: MouseEvent) => this.suppressDraggedClick(event)}\n >\n <Checkbox<CategoryVisibility>\n symbols={activeSymbols}\n label={criterion.label}\n valueEmitter={model.activeState(criterion.key)}\n />\n <cap-draghandle\n role=\"button\"\n tabIndex={0}\n aria-label={`Reorder ${criterion.label}`}\n title=\"Drag to reorder; use Alt+Arrow keys from the keyboard\"\n onKeyDown={(event: KeyboardEvent) => {\n if (!event.altKey || (event.key !== 'ArrowUp' && event.key !== 'ArrowDown')) {\n return\n }\n event.preventDefault()\n const offset = event.key === 'ArrowUp' ? -1 : 1\n if (model.moveBy(criterion.key, offset, 'split reordered by keyboard')) {\n const position = model.order$.get().findIndex(({key}) =>\n key === criterion.key) + 1\n this.announce(`${criterion.label} moved to position ${position}`)\n queueMicrotask(() => this.focusHandle(criterion.key))\n }\n }}\n />\n </li>)}</ol>\n <p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {this.announcement}\n </p>\n </GroupBox>\n </Host>\n }\n\n static override hostName = 'split-selection-panel'\n static dependencies = [Button, Checkbox, GroupBox]\n\n static css = css`\n & {\n display: flex;\n flex-flow: column nowrap;\n gap: var(--viz-space, 0.6rem);\n min-width: 0;\n user-select: none;\n }\n\n & > cap-groupbox {\n min-width: 0;\n }\n\n & > cap-groupbox > cap-content {\n display: flex;\n flex-flow: column;\n padding: .25em;\n flex: 1 1 0;\n }\n\n & > cap-groupbox > cap-content > p,\n & > cap-groupbox > cap-content > ol {\n margin: 0;\n }\n\n & > cap-groupbox > cap-content > p:first-child {\n color: var(--viz-muted-color, var(--ui-muted-text-color, currentColor));\n font-size: 0.875em;\n }\n\n & > cap-groupbox > cap-content > cap-presets {\n display: flex;\n flex-flow: column nowrap;\n gap: 0.35rem;\n align-items: stretch;\n }\n\n & > cap-groupbox > cap-content > cap-presets > cap-button {\n display: flex;\n flex-flow: column;\n align-content: stretch;\n }\n\n & ol {\n display: flex;\n flex-flow: column nowrap;\n gap: .33rem;\n padding: 0;\n list-style: none;\n }\n\n & li {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n justify-content: space-between;\n gap: 0.35rem;\n min-width: 0;\n padding: .15rem .35rem;\n border-radius: var(--ui-border-radius);\n box-shadow: var(--box-shadow);\n }\n\n & li:has(input[type=\"checkbox\"]:not(:checked)) {\n color: var(--viz-muted-color, var(--ui-muted-text-color, currentColor));\n }\n\n & li.dragging {\n outline: 2px solid var(--focus-color, var(--ui-accent-color));\n }\n\n & cap-draghandle {\n display: block;\n width: 1.1rem;\n height: .9rem;\n min-height: .9rem;\n padding: 0;\n border: 0;\n border-radius: 0;\n color: inherit;\n background-color: transparent;\n background-image: radial-gradient(currentColor 0.75px, transparent 0.9px);\n background-position: center;\n background-size: 3px 3px;\n cursor: grab;\n touch-action: none;\n }\n\n & cap-draghandle:focus-visible {\n outline: 2px solid var(--focus-color, var(--ui-accent-color));\n outline-offset: 1px;\n }\n\n & li > :has(> [role=\"checkbox\"]),\n & [role=\"checkbox\"] {\n\n justify-content: center;\n align-items: center;\n justify-items: center;\n align-content: center;\n }\n\n & > cap-groupbox > cap-content > p[role=\"status\"][aria-live=\"polite\"][aria-atomic=\"true\"] {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `\n\n private pointerMove(event: PointerEvent): void {\n if (this.draggingKey == null && this.pendingDrag != null) {\n const {clientX, clientY, key} = this.pendingDrag\n if (Math.hypot(event.clientX - clientX, event.clientY - clientY) < 4) return\n this.draggingKey = key\n this.pendingDrag = null\n this.update()\n }\n if (this.draggingKey == null || typeof document.elementFromPoint !== 'function') return\n const target = document.elementFromPoint(event.clientX, event.clientY)\n ?.closest<HTMLElement>('[data-split-key]')\n if (target == null) return\n const targetKey = target.dataset.splitKey\n if (targetKey == null) return\n const targetIndex = this.props.model.order$.get().findIndex(({key}) => key === targetKey)\n if (targetIndex < 0 || !this.props.model.move(\n this.draggingKey,\n targetIndex,\n 'split reordered by pointer',\n )) return\n const criterion = this.props.model.criteria.find(({key}) => key === this.draggingKey)\n this.announce(`${criterion?.label ?? this.draggingKey} moved to position ${targetIndex + 1}`)\n }\n\n private stopDragging(): void {\n if (this.draggingKey == null && this.pendingDrag == null) return\n const key = this.draggingKey\n const dragged = key != null\n this.draggingKey = null\n this.pendingDrag = null\n if (!dragged) return\n this.suppressClick = true\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = setTimeout(() => {\n this.suppressClick = false\n this.suppressClickTimer = null\n }, 0)\n this.update()\n queueMicrotask(() => this.focusHandle(key))\n }\n\n private startDragging(key: string, event: PointerEvent): void {\n if (event.button !== 0) return\n this.pendingDrag = {key, clientX: event.clientX, clientY: event.clientY}\n }\n\n private suppressDraggedClick(event: MouseEvent): void {\n if (!this.suppressClick) return\n this.suppressClick = false\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = null\n event.preventDefault()\n event.stopPropagation()\n }\n\n private announce(message: string): void {\n this.announcement = message\n this.update()\n }\n\n private focusHandle(criterionKey: string): void {\n const handles = this.dom instanceof Element\n ? this.dom.querySelectorAll<HTMLElement>('[data-split-key] cap-draghandle')\n : []\n for (const handle of handles) {\n if (handle.closest<HTMLElement>('[data-split-key]')?.dataset.splitKey === criterionKey) {\n handle.focus()\n return\n }\n }\n }\n}\n","import type {Category} from './grouping.js'\nimport {\n addCivilDays,\n civilDateToDay,\n compareCivilDates,\n} from './dates.js'\nimport type {CivilDate} from './dates.js'\n\nexport interface HistoryShape {\n readonly key: string\n readonly label: string\n readonly color: string\n readonly colorKey?: string\n readonly values: Readonly<Record<CivilDate, number>>\n /** Carry the latest earlier value into dates with no explicit point. */\n readonly carryForward?: boolean\n}\n\nexport interface SeriesCategory {\n readonly key: string\n readonly label: string\n readonly color: string\n readonly colorKey?: string\n}\n\n/** Collect date/category deltas and build ordinary or cumulative history shapes. */\nexport class SeriesBuilder {\n private readonly categories: readonly SeriesCategory[]\n private readonly byKey: ReadonlyMap<string, SeriesCategory>\n private readonly deltas = new Map<string, Map<CivilDate, number>>()\n\n constructor(categories: readonly SeriesCategory[] | readonly Category<unknown>[]) {\n if (!Array.isArray(categories)) throw new TypeError('Series categories must be an array')\n const normalized = categories.map((category) => normalizeSeriesCategory(category))\n const byKey = new Map(normalized.map((category) => [category.key, category]))\n if (byKey.size !== normalized.length) throw new Error('Series category keys must be unique')\n this.categories = Object.freeze(normalized)\n this.byKey = byKey\n }\n\n addOne(date: CivilDate, categoryKey: string): this {\n return this.add(date, categoryKey, 1)\n }\n\n removeOne(date: CivilDate, categoryKey: string): this {\n return this.add(date, categoryKey, -1)\n }\n\n add(date: CivilDate, categoryKey: string, delta: number): this {\n civilDateToDay(date)\n if (!Number.isFinite(delta)) throw new TypeError('Series delta must be finite')\n if (!this.byKey.has(categoryKey)) {\n throw new Error(`Unknown series category \"${categoryKey}\"`)\n }\n const values = this.deltas.get(categoryKey) ?? new Map<CivilDate, number>()\n values.set(date, (values.get(date) ?? 0) + delta)\n this.deltas.set(categoryKey, values)\n return this\n }\n\n build(): readonly HistoryShape[] {\n const dates = this.allDates()\n return this.categories\n .map((category) => shapeFrom(category, Object.fromEntries(dates.map((date) => [\n date,\n this.deltas.get(category.key)?.get(date) ?? 0,\n ])), false))\n .filter((shape) => Object.values(shape.values).some((value) => value !== 0))\n }\n\n buildCumulative(): readonly HistoryShape[] {\n const dates = this.allDates()\n if (dates.length === 0) return Object.freeze([])\n const anchoredDates = [addCivilDays(dates[0]!, -1), ...dates]\n return this.categories.map((category) => {\n let value = 0\n const values: Record<CivilDate, number> = {[anchoredDates[0]!]: 0}\n for (const date of dates) {\n value += this.deltas.get(category.key)?.get(date) ?? 0\n values[date] = value\n }\n return shapeFrom(category, values, true)\n }).filter((shape) => Object.values(shape.values).some((value) => value !== 0))\n }\n\n private allDates(): CivilDate[] {\n return [...new Set([...this.deltas.values()].flatMap((values) => [...values.keys()]))]\n .sort(compareCivilDates)\n }\n}\n\nfunction normalizeSeriesCategory(\n category: SeriesCategory | Category<unknown>,\n): SeriesCategory {\n if (category == null || typeof category !== 'object') {\n throw new TypeError('Series category must be an object')\n }\n if (typeof category.key !== 'string' || category.key.trim() === '') {\n throw new TypeError('Series category key must be a non-empty string')\n }\n if (typeof category.label !== 'string' || category.label.trim() === '') {\n throw new TypeError('Series category label must be a non-empty string')\n }\n const color = 'color' in category ? category.color : category.colors[1]\n if (typeof color !== 'string' || color.trim() === '') {\n throw new TypeError('Series category color must be a non-empty CSS value')\n }\n const normalized: SeriesCategory = category.colorKey === undefined\n ? {key: category.key, label: category.label, color}\n : {key: category.key, label: category.label, color, colorKey: category.colorKey}\n return Object.freeze(normalized)\n}\n\nfunction shapeFrom(\n category: SeriesCategory,\n values: Record<CivilDate, number>,\n carryForward: boolean,\n): HistoryShape {\n return Object.freeze({\n ...category,\n values: Object.freeze(values),\n carryForward,\n })\n}\n"],"names":["categoryColorVariables","dark","base","light","isOwnColoredAlias","value","property","GroupingCriterion","options","__publicField","assertObject","assertKey","assertLabel","assertReadableEmitter","Emitter","setsEqual","DerivedEmitter","categories","hidden","key","categoryKey","emitter","VisibilityEmitter","visible","eventOrCause","currentKeys","next","_a","validateCategories","changed","category","staticCriterion","freezeCategories","categories$","derivedCriterion","items","deriveCategories","counts","unmatchedCount","item","keys","normalizedKeys","summaries","count","left","right","descriptor","freezeCategory","filterByHidden","items$","criteria","validateCriteria","sources","criterion","values","_criterion","index","categoryCounts","BaseEmitter","source","owner","notification","entry","label","frozen","freezeColors","colors","color","buildBlockLayout","splits","readabilityThreshold","issues","rootItems","root","buildNode","criterionSnapshot","findBlock","path","current","segment","child","candidate","BlockSelectionModel","splits$","ReactiveBlockLayout","blockPathsEqual","layout","block","freezePath","release","createBlockSelection","FetchState","event","parentEvent","states","sourceErrors","nonNull","computeError","error","errors","fetchState","combineFetchStates","arguments_","splitIndex","parentCount","totalShare","rootLabel","nextSplit","childrenSuppressed","children","partitionChildren","share","pathKey","groups","valid","itemIndex","matches","populated","group","childItems","childPath","other","criterionKey","STYLE_ATTRIBUTE","nextRegistryId","StyleRegistry","id","css","normalized","host","existing","fragment","resolveHostCSS","targetDocument","selector","escapeAttributeValue","style","createStyleRegistry","styleRegistry","hosts","output","cursor","openBrace","findBrace","closeBrace","findMatchingBrace","header","body","rule","expandHostSelectors","leading","trailing","_b","selectors","splitSelectors","continuationIndent","_c","result","start","parentheses","brackets","quote","character","from","skipQuote","skipComment","depth","openQuote","openComment","closeComment","serviceKeys","serviceProviders","ServiceScope","providers","provider","assertServiceProvider","assertServiceKey","cycleStart","cycle","instance","dispose","readDispose","createServiceScope","isServiceKey","englishCapillaryUiMessages","state","RuntimeLocalization","locale","messages","defaultCapillaryUiLocalization","createRuntimeLocalization","canonicalLocale","supplied","resolved","fallback","RESERVED_CUSTOM_ELEMENT_NAMES","CapillaryUiRuntime","registry","defaultDiagnosticScope","hostName","assertNamePart","assertCustomElementName","cssText","componentType","args","component","Diagnostics","parent","before","closeRouteScope","dependency","defaultCapillaryUiRuntime","Fragment","liveBindingValues","BOOLEAN_ATTRIBUTES","PROPERTY_PROPS","CAPILLARY_UI_RENDERER_ATTRIBUTE","rendererWrites","recordRendererWrite","h","type","props","suppliedProps","propChildren","restProps","normalizeChildren","strings","string","_Component","runtime","seen","concreteHostName","styleChain","componentStyleChain","diagnosticInfo","componentDiagnosticLabel","classAlias","suppliedClassName","hostProps","componentClassName","className","mergeClassNames","context","mountedNow","assertParentNode","insertRecord","_event","trigger","EventBubble","diagnosticEvent","outerWrites","writes","renderPasses","nextReads","nextVNode","normalizeRoot","patchRoot","firstNode","nextProps","_dom","observables","observable","unsubscribe","cleanup","active","target","listener","subject","eventListener","runUiInteraction","attached","detach","unregister","disposeRecord","hasIslandTrait","ancestor","Component","visit","createRecord","isReadableEmitter","end","record","subscribeUi","nextValue","readKey","isVNode","describeValue","patchChildren","node","patchElementProps","isComponentClass","sourceProps","assertSupportedComponentLiveProps","resolvedProps","resolveLivePropValues","subscribeComponentLiveProps","functionType","functionProps","diagnosticSubject","renderFunction","subscribeFunctionLiveProps","previous","isCompatible","patchCompatible","anchor","patchComponentLiveProps","patchFunctionLiveProps","isLiveBinding","reconcileLiveProps","resolvedLiveProps","declared","name","supported","rerenderFunctionRecord","rendered","render","subscriptions","onValue","liveProp","nextValues","keyed","unkeyed","seenKeys","retained","nextRecords","unkeyedIndex","valueKey","recordNodes","normalizeAttributeName","previousValue","isNativeBindingProp","patchNativeBinding","patchRef","isEventProp","patchEvent","patchLiveElementProp","previousLive","previousResolved","patchDOMProp","setAttribute","binding","assertWritableEmitter","assertNativeBindingTarget","eventName","nativeBindingEvent","interactionSubject","registered","originalListeners","interactions","nativeInteractions","scope","native","cause","action","interaction","subjects","consumed","applyRef","patchDataset","patchStyle","normalizePropertyName","enabled","oldValues","toPropertyRecord","newValues","camelToKebab","letter","ref","removeNodes","removeRenderedNode","nodes","tagName","concrete","chain","jsx","jsxs","fallbackCategoryColors","BlockGraph","model","description","emptyMessage","layoutSnapshot","isLoading","selectedPath","selected","firstKey","Host","Placeholder","Button","column","row","tabbableKey","pathsEqual","colorVariables","first","detail","all","flattenBlocks","element","CollapsibleOptionGroup","OptionGroup","content","regions","readDeclarativeRegions","OptionGroupHeaderEnd","headerEnd","ariaLabel","disabled","required","busy","visibilitySymbols","CategoryHidePanel","OptionsBox","itemSnapshot","categorySnapshot","countMatches","Checkbox","predicate","DAY_MILLISECONDS","civilDatePattern","civilDateToDay","match","year","month","date","milliseconds","parsed","dayToCivilDate","day","addCivilDays","days","todayCivilDate","now","compareCivilDates","buildLineChartModel","shapes","validateShapes","width","finiteDimension","height","plotLeft","plotTop","plotWidth","plotHeight","allDates","shape","today","minDate","earliestDate","maxDate","minDay","maxDay","sampleDays","collectSampleDays","stacked","rawSeries","valueAtDay","minimum","maximum","accumulated","positioned","entries","baseValue","displayValue","span","maxY","minY","_d","ySpan","daySpan","series","buildDateMarks","buildIntegerTicks","valueAtDate","linePath","points","smooth","format","midpoint","areaPath","top","reversed","bottom","point","rough","magnitude","nice","step","exact","bestDay","bestValue","rawStep","marks","LineGraph","range","cursorDate","calculationError","activeDate","formatDate","formatValue","input","purpose","bounds","svgX","ratio","svg","createSvg","tick","line","setAttributes","mark","area","x","SVG_NAMESPACE","attributes","SplitSelectionModel","byKey","freezePresets","order","validateKnownUniqueKeys","freezeState","splitStatesEqual","requiredCriterion","ActiveSplitEmitter","targetIndex","to","offset","inactive","activeSet","inactiveKeys","combined","presetKey","preset","createSplitSelection","presets","activeSymbols","SplitSelectionPanel","presetsLabel","activePreset","GroupBox","position","clientX","clientY","targetKey","dragged","message","handles","handle","SeriesBuilder","normalizeSeriesCategory","delta","dates","shapeFrom","anchoredDates","carryForward"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/grouping.ts","../src/block.ts","../../capillary-ui/src/styling/styleRegistry.ts","../../capillary-ui/src/services.ts","../../capillary-ui/src/localization.ts","../../capillary-ui/src/runtime.ts","../../capillary-ui/src/Components/component.ts","../../capillary-ui/src/jsx-runtime.ts","../src/components/BlockGraph.tsx","../src/components/CollapsibleOptionGroup.tsx","../src/components/CategoryHidePanel.tsx","../src/dates.ts","../src/lineChart.ts","../src/components/LineGraph.tsx","../src/splits.ts","../src/components/SplitSelectionPanel.tsx","../src/series.ts"],"sourcesContent":["import {BaseEmitter, DerivedEmitter, Emitter, WritableProjection} from '@capillaryjs/capillary'\nimport type {\n ReadableEmitter,\n} from '@capillaryjs/capillary'\n\nexport type CategoryColors = readonly [dark: string, base: string, light: string]\n\n/**\n * CSS inputs for category-aware visualization surfaces.\n *\n * The short `c1`/`c2`/`c3` names intentionally preserve the established graph\n * recipe: dark → base → light. The longer aliases keep ordinary Capillary UI traits\n * available to component structure and interaction treatment.\n */\nexport interface CategoryColorVariables {\n readonly '--c1': string\n readonly '--c2': string\n readonly '--c3': string\n readonly '--colored-dark'?: string\n readonly '--colored-base'?: string\n readonly '--colored-light'?: string\n}\n\nexport function categoryColorVariables(\n [dark, base, light]: CategoryColors,\n): CategoryColorVariables {\n // A category may deliberately inherit the theme's colored trait (for\n // example `var(--colored-base)`). Re-declaring that exact alias on the\n // element turns it into a self-reference and invalidates its background,\n // border, and foreground. Preserve the inherited token in that case.\n return {\n '--c1': dark,\n '--c2': base,\n '--c3': light,\n ...(isOwnColoredAlias(dark, '--colored-dark') ? {} : {'--colored-dark': dark}),\n ...(isOwnColoredAlias(base, '--colored-base') ? {} : {'--colored-base': base}),\n ...(isOwnColoredAlias(light, '--colored-light') ? {} : {'--colored-light': light}),\n }\n}\n\nfunction isOwnColoredAlias(value: string, property: '--colored-dark' | '--colored-base' | '--colored-light'): boolean {\n return value.trim().replaceAll(' ', '') === `var(${property})`\n}\nexport type CategoryVisibility = 'hidden' | 'visible'\n\nexport interface VisualizationValueEmitter<TValue> extends ReadableEmitter<TValue> {\n set(value: TValue, eventOrCause?: unknown): boolean\n}\n\nexport interface Category<TItem> {\n readonly key: string\n readonly label: string\n readonly predicate: (item: TItem) => boolean\n readonly colors: CategoryColors\n readonly colorKey?: string\n readonly hiddenByDefault?: boolean\n readonly generated?: boolean\n}\n\nexport interface CategoryDescriptor {\n readonly label: string\n readonly colors: CategoryColors\n readonly colorKey?: string\n readonly hiddenByDefault?: boolean\n}\n\nexport interface CriterionOptions<TItem> {\n readonly key: string\n readonly label: string\n readonly categories$: ReadableEmitter<readonly Category<TItem>[]>\n readonly allowResorting?: boolean\n readonly initialHiddenKeys?: ReadonlySet<string> | readonly string[]\n /** @internal The factory-created source released with the criterion. */\n readonly ownedCategories?: {dispose(): void}\n}\n\nexport interface StaticCriterionOptions<TItem>\nextends Omit<CriterionOptions<TItem>, 'categories$' | 'ownedCategories'> {\n readonly categories: readonly Category<TItem>[]\n}\n\nexport interface DerivedCategorySummary {\n readonly key: string\n readonly count: number\n readonly label: string\n}\n\nexport interface DerivedCriterionOptions<TItem>\nextends Omit<CriterionOptions<TItem>, 'categories$' | 'ownedCategories'> {\n readonly source$: ReadableEmitter<readonly TItem[]>\n readonly extractKeys: (item: TItem) => string | readonly string[] | null | undefined\n readonly describe: (key: string, count: number) => CategoryDescriptor\n readonly unmatched?: CategoryDescriptor & {readonly key: string}\n readonly compare?: (\n left: DerivedCategorySummary,\n right: DerivedCategorySummary,\n ) => number\n}\n\n/** One grouping dimension with reactive categories and stable-key visibility state. */\nexport class GroupingCriterion<TItem> {\n readonly key: string\n readonly label: string\n readonly categories$: ReadableEmitter<readonly Category<TItem>[]>\n readonly hidden$: Emitter<ReadonlySet<string>>\n readonly visibleCategories$: ReadableEmitter<readonly Category<TItem>[]>\n readonly allowResorting: boolean\n private readonly ownedCategories: {dispose(): void} | undefined\n private readonly visibleCategoriesEmitter: DerivedEmitter<\n readonly Category<TItem>[],\n readonly [\n ReadableEmitter<readonly Category<TItem>[]>,\n Emitter<ReadonlySet<string>>,\n ]\n >\n private readonly seenKeys = new Set<string>()\n private readonly visibilityEmitters = new Map<string, VisibilityEmitter>()\n private readonly releaseCategoryDefaults: () => void\n private disposed = false\n\n constructor(options: CriterionOptions<TItem>) {\n assertObject(options, 'Criterion options')\n this.key = assertKey(options.key, 'Criterion key')\n this.label = assertLabel(options.label, 'Criterion label')\n assertReadableEmitter(options.categories$, 'Criterion categories$')\n this.categories$ = options.categories$\n this.allowResorting = options.allowResorting ?? false\n this.ownedCategories = options.ownedCategories\n this.hidden$ = new Emitter<ReadonlySet<string>>(\n new Set(options.initialHiddenKeys ?? []),\n {owner: this, purpose: `${this.key} hidden categories`, equals: setsEqual},\n )\n this.visibleCategoriesEmitter = new DerivedEmitter<\n readonly Category<TItem>[],\n readonly [\n ReadableEmitter<readonly Category<TItem>[]>,\n Emitter<ReadonlySet<string>>,\n ]\n >(\n [this.categories$, this.hidden$] as const,\n ([categories, hidden]) => Object.freeze(\n categories.filter(({key}) => !hidden.has(key)),\n ),\n {owner: this, purpose: `${this.key} visible categories`},\n )\n this.visibleCategories$ = this.visibleCategoriesEmitter\n this.releaseCategoryDefaults = this.categories$.subscribe(({value}) => {\n if (!Array.isArray(value)) return\n this.applyFirstSeenDefaults(value)\n })\n }\n\n visibility(categoryKey: string): VisualizationValueEmitter<CategoryVisibility> {\n this.assertActive()\n const key = assertKey(categoryKey, 'Category key')\n let emitter = this.visibilityEmitters.get(key)\n if (emitter == null) {\n emitter = new VisibilityEmitter(this.hidden$, key, this)\n this.visibilityEmitters.set(key, emitter)\n }\n return emitter\n }\n\n setAllVisible(visible: boolean, eventOrCause?: unknown): boolean {\n this.assertActive()\n const currentKeys = new Set(this.categories$.get().map(({key}) => key))\n const next = new Set(this.hidden$.get())\n for (const key of currentKeys) {\n if (visible) next.delete(key)\n else next.add(key)\n }\n return this.hidden$.set(next, eventOrCause ?? `${this.key} category visibility changed`)\n }\n\n pruneHidden(eventOrCause?: unknown): boolean {\n this.assertActive()\n const currentKeys = new Set(this.categories$.get().map(({key}) => key))\n const next = new Set([...this.hidden$.get()].filter((key) => currentKeys.has(key)))\n return this.hidden$.set(next, eventOrCause ?? `${this.key} hidden categories pruned`)\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n this.releaseCategoryDefaults()\n for (const emitter of this.visibilityEmitters.values()) emitter.dispose()\n this.visibilityEmitters.clear()\n this.visibleCategoriesEmitter.dispose()\n this.hidden$.dispose()\n this.ownedCategories?.dispose()\n }\n\n private applyFirstSeenDefaults(categories: readonly Category<TItem>[]): void {\n validateCategories(categories, `${this.label} categories`)\n const next = new Set(this.hidden$.get())\n let changed = false\n for (const category of categories) {\n if (this.seenKeys.has(category.key)) continue\n this.seenKeys.add(category.key)\n if (category.hiddenByDefault === true && !next.has(category.key)) {\n next.add(category.key)\n changed = true\n }\n }\n if (changed) this.hidden$.set(next, `${this.key} first-seen defaults applied`)\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error(`Criterion \"${this.key}\" is disposed`)\n }\n}\n\nexport function staticCriterion<TItem>(\n options: StaticCriterionOptions<TItem>,\n): GroupingCriterion<TItem> {\n assertObject(options, 'Static criterion options')\n const categories = freezeCategories(options.categories, `${options.label} categories`)\n const categories$ = new Emitter<readonly Category<TItem>[]>(categories, {\n purpose: `${options.key} static categories`,\n })\n return new GroupingCriterion({...options, categories$, ownedCategories: categories$})\n}\n\nexport function derivedCriterion<TItem>(\n options: DerivedCriterionOptions<TItem>,\n): GroupingCriterion<TItem> {\n assertObject(options, 'Derived criterion options')\n assertReadableEmitter(options.source$, 'Derived criterion source$')\n if (typeof options.extractKeys !== 'function') {\n throw new TypeError('Derived criterion extractKeys must be a function')\n }\n if (typeof options.describe !== 'function') {\n throw new TypeError('Derived criterion describe must be a function')\n }\n const categories$ = new DerivedEmitter(\n [options.source$] as const,\n ([items]) => deriveCategories(items, options),\n {purpose: `${options.key} derived categories`},\n )\n return new GroupingCriterion({\n ...options,\n allowResorting: options.allowResorting ?? true,\n categories$,\n ownedCategories: categories$,\n })\n}\n\nexport function deriveCategories<TItem>(\n items: readonly TItem[],\n options: Pick<\n DerivedCriterionOptions<TItem>,\n 'extractKeys' | 'describe' | 'unmatched' | 'compare'\n >,\n): readonly Category<TItem>[] {\n if (!Array.isArray(items)) throw new TypeError('Derived category items must be an array')\n const counts = new Map<string, number>()\n let unmatchedCount = 0\n for (const item of items) {\n const keys = normalizedKeys(options.extractKeys(item))\n if (keys.length === 0) {\n unmatchedCount += 1\n continue\n }\n for (const key of keys) counts.set(key, (counts.get(key) ?? 0) + 1)\n }\n\n const summaries: DerivedCategorySummary[] = [...counts]\n .filter(([, count]) => count > 0)\n .map(([key, count]) => ({key, count, label: options.describe(key, count).label}))\n summaries.sort(options.compare ?? ((left, right) =>\n right.count - left.count || left.label.localeCompare(right.label)\n || left.key.localeCompare(right.key)))\n\n const categories: Category<TItem>[] = summaries.map(({key, count}) => {\n const descriptor = options.describe(key, count)\n return freezeCategory({\n key,\n ...descriptor,\n generated: true,\n predicate: (item) => normalizedKeys(options.extractKeys(item)).includes(key),\n }, 'Derived category')\n })\n if (unmatchedCount > 0 && options.unmatched != null) {\n const {key, ...descriptor} = options.unmatched\n categories.push(freezeCategory({\n key,\n ...descriptor,\n generated: true,\n predicate: (item) => normalizedKeys(options.extractKeys(item)).length === 0,\n }, 'Derived unmatched category'))\n }\n return freezeCategories(categories, 'Derived categories')\n}\n\n/** Derive items rejected by none of the currently hidden category predicates. */\nexport function filterByHidden<TItem>(\n items$: ReadableEmitter<readonly TItem[]>,\n criteria: readonly GroupingCriterion<TItem>[],\n): DerivedEmitter<readonly TItem[]> {\n assertReadableEmitter(items$, 'filterByHidden items$')\n validateCriteria(criteria)\n const sources: ReadableEmitter<unknown>[] = [items$]\n for (const criterion of criteria) sources.push(criterion.categories$, criterion.hidden$)\n return new DerivedEmitter<readonly TItem[]>(\n sources,\n (values) => {\n const items = values[0] as readonly TItem[]\n return items.filter((item) => !criteria.some((_criterion, index) => {\n const categories = values[index * 2 + 1] as readonly Category<TItem>[]\n const hidden = values[index * 2 + 2] as ReadonlySet<string>\n return categories.some((category) =>\n hidden.has(category.key) && category.predicate(item))\n }))\n },\n {purpose: 'items filtered by hidden visualization categories'},\n )\n}\n\n/** Count matches against the unfiltered item source for one criterion. */\nexport function categoryCounts<TItem>(\n items$: ReadableEmitter<readonly TItem[]>,\n criterion: GroupingCriterion<TItem>,\n): DerivedEmitter<ReadonlyMap<string, number>> {\n assertReadableEmitter(items$, 'categoryCounts items$')\n if (!(criterion instanceof GroupingCriterion)) {\n throw new TypeError('categoryCounts criterion must be a GroupingCriterion')\n }\n return new DerivedEmitter<ReadonlyMap<string, number>>(\n [items$, criterion.categories$] as const,\n (values) => {\n const items = values[0] as readonly TItem[]\n const categories = values[1] as readonly Category<TItem>[]\n return new Map(categories.map((category) => [\n category.key,\n items.filter((item) => category.predicate(item)).length,\n ]))\n },\n {purpose: `${criterion.key} unfiltered category counts`},\n )\n}\n\nexport function setsEqual<TValue>(left: ReadonlySet<TValue>, right: ReadonlySet<TValue>): boolean {\n return left === right || (left.size === right.size && [...left].every((value) => right.has(value)))\n}\n\nclass VisibilityEmitter extends WritableProjection<ReadonlySet<string>, CategoryVisibility>\nimplements VisualizationValueEmitter<CategoryVisibility> {\n constructor(\n source: Emitter<ReadonlySet<string>>,\n categoryKey: string,\n owner: unknown,\n ) {\n super(source, {\n owner,\n purpose: `${categoryKey} category visibility`,\n read: (hidden) => hidden.has(categoryKey) ? 'hidden' : 'visible',\n write: (hidden, value) => {\n if (value !== 'hidden' && value !== 'visible') {\n throw new TypeError('Category visibility must be hidden or visible')\n }\n const next = new Set(hidden)\n if (value === 'hidden') next.add(categoryKey)\n else next.delete(categoryKey)\n return next\n },\n })\n }\n\n override set(value: CategoryVisibility, eventOrCause?: unknown): boolean {\n return super.set(value, eventOrCause) as boolean\n }\n}\n\nfunction normalizedKeys(value: string | readonly string[] | null | undefined): string[] {\n const values = value == null ? [] : typeof value === 'string' ? [value] : [...value]\n const keys = values.map((entry) => assertKey(entry, 'Extracted category key'))\n return [...new Set(keys)]\n}\n\nfunction freezeCategories<TItem>(\n categories: readonly Category<TItem>[],\n label: string,\n): readonly Category<TItem>[] {\n validateCategories(categories, label)\n return Object.freeze(categories.map((category) => freezeCategory(category, label)))\n}\n\nfunction freezeCategory<TItem>(category: Category<TItem>, label: string): Category<TItem> {\n assertObject(category, label)\n const frozen: Category<TItem> = {\n ...category,\n key: assertKey(category.key, `${label} key`),\n label: assertLabel(category.label, `${label} label`),\n colors: freezeColors(category.colors, `${label} colors`),\n }\n if (typeof category.predicate !== 'function') {\n throw new TypeError(`${label} predicate must be a function`)\n }\n if (category.colorKey !== undefined) assertKey(category.colorKey, `${label} colorKey`)\n return Object.freeze(frozen)\n}\n\nfunction validateCategories<TItem>(categories: readonly Category<TItem>[], label: string): void {\n if (!Array.isArray(categories)) throw new TypeError(`${label} must be an array`)\n const keys = new Set<string>()\n for (const category of categories) {\n assertObject(category, label)\n const key = assertKey(category.key, `${label} key`)\n if (keys.has(key)) throw new Error(`${label} contains duplicate key \"${key}\"`)\n keys.add(key)\n assertLabel(category.label, `${label} label`)\n freezeColors(category.colors as CategoryColors, `${label} colors`)\n if (typeof category.predicate !== 'function') {\n throw new TypeError(`${label} predicate must be a function`)\n }\n }\n}\n\nfunction validateCriteria<TItem>(criteria: readonly GroupingCriterion<TItem>[]): void {\n if (!Array.isArray(criteria)) throw new TypeError('Criteria must be an array')\n const keys = new Set<string>()\n for (const criterion of criteria) {\n if (!(criterion instanceof GroupingCriterion)) {\n throw new TypeError('Criteria must contain GroupingCriterion instances')\n }\n if (keys.has(criterion.key)) throw new Error(`Duplicate criterion key \"${criterion.key}\"`)\n keys.add(criterion.key)\n }\n}\n\nfunction freezeColors(colors: CategoryColors, label: string): CategoryColors {\n if (!Array.isArray(colors) || colors.length !== 3\n || colors.some((color) => typeof color !== 'string' || color.trim() === '')) {\n throw new TypeError(`${label} must contain three non-empty CSS color values`)\n }\n return Object.freeze([...colors]) as unknown as CategoryColors\n}\n\nfunction assertReadableEmitter(value: unknown, label: string): asserts value is ReadableEmitter<unknown> {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'get') !== 'function'\n || typeof Reflect.get(value, 'getFetchState') !== 'function'\n || typeof Reflect.get(value, 'getError') !== 'function'\n || typeof Reflect.get(value, 'subscribe') !== 'function') {\n throw new TypeError(`${label} must be a readable emitter`)\n }\n}\n\nfunction assertObject(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object`)\n }\n}\n\nfunction assertKey(value: unknown, label: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new TypeError(`${label} must be a non-empty string`)\n }\n return value\n}\n\nfunction assertLabel(value: unknown, label: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new TypeError(`${label} must be a non-empty string`)\n }\n return value\n}\n","import {\n BaseEmitter,\n DerivedEmitter,\n Emitter,\n FetchState,\n combineFetchStates,\n} from '@capillaryjs/capillary'\nimport type {\n EventBubble,\n FetchStateValue,\n ReadableEmitter,\n} from '@capillaryjs/capillary'\n\nimport type {Category, CategoryColors} from './grouping.js'\nimport {GroupingCriterion} from './grouping.js'\n\nexport type BlockOrientation = 'horizontal' | 'vertical'\n\nexport interface BlockPathSegment {\n readonly criterionKey: string\n readonly categoryKey: string\n}\n\nexport type BlockPath = readonly BlockPathSegment[]\n\nexport interface BlockSplit<TItem> {\n readonly key: string\n readonly label: string\n readonly categories: readonly Category<TItem>[]\n readonly allowResorting: boolean\n}\n\nexport interface BlockNode<TItem> {\n readonly key: string\n readonly path: BlockPath\n readonly criterionKey: string | null\n readonly criterionLabel: string | null\n readonly categoryKey: string | null\n readonly label: string\n readonly colors: CategoryColors | null\n readonly colorKey: string | null\n readonly count: number\n readonly share: number\n readonly totalShare: number\n readonly depth: number\n readonly items: readonly TItem[]\n readonly children: readonly BlockNode<TItem>[]\n readonly childOrientation: BlockOrientation\n readonly childrenSuppressed: boolean\n}\n\nexport interface BlockPartitionIssue<TItem> {\n readonly kind: 'unmatched' | 'multiple-matches'\n readonly criterionKey: string\n readonly criterionLabel: string\n readonly parentPath: BlockPath\n readonly item: TItem\n readonly itemIndex: number\n readonly matchedCategoryKeys: readonly string[]\n}\n\nexport interface BlockLayoutResult<TItem> {\n readonly valid: boolean\n readonly root: BlockNode<TItem>\n readonly issues: readonly BlockPartitionIssue<TItem>[]\n}\n\nexport interface BlockLayoutOptions {\n readonly rootLabel?: string\n readonly readabilityThreshold?: number\n}\n\n/** Build a true recursive partition. Invalid zero/multiple matches are reported. */\nexport function buildBlockLayout<TItem>(\n items: readonly TItem[],\n splits: readonly BlockSplit<TItem>[],\n options: BlockLayoutOptions = {},\n): BlockLayoutResult<TItem> {\n if (!Array.isArray(items)) throw new TypeError('Block layout items must be an array')\n if (!Array.isArray(splits)) throw new TypeError('Block layout splits must be an array')\n const readabilityThreshold = options.readabilityThreshold ?? 0.02\n if (!Number.isFinite(readabilityThreshold)\n || readabilityThreshold < 0\n || readabilityThreshold > 1) {\n throw new RangeError('Block readability threshold must be between zero and one')\n }\n const issues: BlockPartitionIssue<TItem>[] = []\n const rootItems = Object.freeze([...items])\n const root: BlockNode<TItem> = buildNode({\n items: rootItems,\n splits,\n splitIndex: 0,\n path: Object.freeze([]),\n criterion: null,\n category: null,\n parentCount: rootItems.length,\n totalShare: 1,\n readabilityThreshold,\n issues,\n rootLabel: options.rootLabel ?? 'All items',\n })\n return Object.freeze({valid: issues.length === 0, root, issues: Object.freeze(issues)})\n}\n\nexport function criterionSnapshot<TItem>(criterion: GroupingCriterion<TItem>): BlockSplit<TItem> {\n if (!(criterion instanceof GroupingCriterion)) {\n throw new TypeError('criterionSnapshot requires a GroupingCriterion')\n }\n return Object.freeze({\n key: criterion.key,\n label: criterion.label,\n categories: criterion.categories$.get(),\n allowResorting: criterion.allowResorting,\n })\n}\n\nexport function findBlock<TItem>(\n root: BlockNode<TItem>,\n path: BlockPath | null,\n): BlockNode<TItem> | null {\n if (path == null) return null\n let current = root\n for (const segment of path) {\n const child = current.children.find((candidate) =>\n candidate.criterionKey === segment.criterionKey\n && candidate.categoryKey === segment.categoryKey)\n if (child == null) return null\n current = child\n }\n return current\n}\n\n/** Reactive layout and rebuild-safe selected subset shared by graph and application. */\nexport class BlockSelectionModel<TItem> {\n readonly layout$: ReadableEmitter<BlockLayoutResult<TItem>, readonly unknown[]>\n readonly selectedPath$: Emitter<BlockPath | null>\n readonly selectedBlock$: ReadableEmitter<BlockNode<TItem> | null>\n readonly selectedItems$: ReadableEmitter<readonly TItem[]>\n private readonly layoutEmitter: ReactiveBlockLayout<TItem>\n private readonly selectedBlockEmitter: DerivedEmitter<\n BlockNode<TItem> | null,\n readonly [\n ReadableEmitter<BlockLayoutResult<TItem>, readonly unknown[]>,\n Emitter<BlockPath | null>,\n ]\n >\n private readonly selectedItemsEmitter: DerivedEmitter<\n readonly TItem[],\n readonly [ReadableEmitter<BlockNode<TItem> | null>]\n >\n private readonly releases: Array<() => void> = []\n private disposed = false\n\n constructor(\n items$: ReadableEmitter<readonly TItem[]>,\n splits$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>,\n readonly options: BlockLayoutOptions = {},\n ) {\n this.layoutEmitter = new ReactiveBlockLayout(items$, splits$, options)\n this.layout$ = this.layoutEmitter\n this.selectedPath$ = new Emitter<BlockPath | null>(null, {\n owner: this,\n purpose: 'selected block path',\n equals: blockPathsEqual,\n })\n this.selectedBlockEmitter = new DerivedEmitter<\n BlockNode<TItem> | null,\n readonly [\n ReadableEmitter<BlockLayoutResult<TItem>, readonly unknown[]>,\n Emitter<BlockPath | null>,\n ]\n >(\n [this.layout$, this.selectedPath$] as const,\n ([layout, path]) => findBlock(layout.root, path),\n {owner: this, purpose: 'selected block'},\n )\n this.selectedBlock$ = this.selectedBlockEmitter\n this.selectedItemsEmitter = new DerivedEmitter<\n readonly TItem[],\n readonly [ReadableEmitter<BlockNode<TItem> | null>]\n >(\n [this.selectedBlock$] as const,\n ([block]) => block?.items ?? Object.freeze([]),\n {owner: this, purpose: 'selected block items'},\n )\n this.selectedItems$ = this.selectedItemsEmitter\n this.releases.push(\n this.layout$.subscribe(() => this.reconcileSelection(), {emitCurrent: false}),\n this.selectedPath$.subscribe(() => this.reconcileSelection(), {emitCurrent: false}),\n )\n }\n\n select(path: BlockPath, eventOrCause?: unknown): boolean {\n this.assertActive()\n const frozen = freezePath(path)\n if (findBlock(this.layout$.get().root, frozen) == null) {\n throw new Error('Cannot select a path absent from the current block layout')\n }\n return this.selectedPath$.set(frozen, eventOrCause ?? 'block selected')\n }\n\n clear(eventOrCause?: unknown): boolean {\n this.assertActive()\n return this.selectedPath$.set(null, eventOrCause ?? 'block selection cleared')\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n for (const release of this.releases.splice(0)) release()\n this.selectedItemsEmitter.dispose()\n this.selectedBlockEmitter.dispose()\n this.selectedPath$.dispose()\n this.layoutEmitter.dispose()\n }\n\n private reconcileSelection(): void {\n const path = this.selectedPath$.get()\n if (path == null || findBlock(this.layout$.get().root, path) != null) return\n this.selectedPath$.set(null, 'block selection no longer exists')\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('Block selection model is disposed')\n }\n}\n\nexport function createBlockSelection<TItem>(\n items$: ReadableEmitter<readonly TItem[]>,\n splits$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>,\n options: BlockLayoutOptions = {},\n): BlockSelectionModel<TItem> {\n return new BlockSelectionModel(items$, splits$, options)\n}\n\nclass ReactiveBlockLayout<TItem>\nextends BaseEmitter<BlockLayoutResult<TItem>, readonly unknown[]> {\n private readonly releases: Array<() => void> = []\n private categoryReleases: Array<() => void> = []\n\n constructor(\n private readonly items$: ReadableEmitter<readonly TItem[]>,\n private readonly splits$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>,\n private readonly options: BlockLayoutOptions,\n ) {\n super(buildBlockLayout<TItem>([], [], options), {\n purpose: 'reactive block layout',\n fetchState: FetchState.Initial,\n })\n assertReadableEmitter(items$, 'Block selection items$')\n assertReadableEmitter(splits$, 'Block selection splits$')\n this.releases.push(\n items$.subscribe(({event}) => this.recompute(event), {emitCurrent: false}),\n splits$.subscribe(({event}) => {\n this.subscribeCategories()\n this.recompute(event)\n }, {emitCurrent: false}),\n )\n this.subscribeCategories()\n this.recompute(null)\n }\n\n override dispose(): void {\n for (const release of this.releases.splice(0)) release()\n this.releaseCategories()\n super.dispose()\n }\n\n private subscribeCategories(): void {\n this.releaseCategories()\n this.categoryReleases = this.splits$.get().map((criterion) =>\n criterion.categories$.subscribe(\n ({event}) => this.recompute(event),\n {emitCurrent: false},\n ))\n }\n\n private releaseCategories(): void {\n for (const release of this.categoryReleases.splice(0)) release()\n }\n\n private recompute(parentEvent: EventBubble<unknown> | null): void {\n const splits = this.splits$.get()\n const sources: ReadableEmitter<unknown, unknown>[] = [\n this.items$,\n this.splits$,\n ...splits.map(({categories$}) => categories$),\n ]\n const states = sources.map((source) => source.getFetchState())\n const sourceErrors = sources.map((source) => source.getError()).filter(nonNull)\n let value: BlockLayoutResult<TItem>\n let computeError: unknown = null\n try {\n value = buildBlockLayout(\n this.items$.get(),\n splits.map(criterionSnapshot),\n this.options,\n )\n } catch (error) {\n computeError = error\n value = buildBlockLayout<TItem>([], [], this.options)\n }\n const errors = computeError == null ? sourceErrors : [...sourceErrors, computeError]\n const fetchState: FetchStateValue = errors.length > 0\n ? FetchState.Error\n : combineFetchStates(states)\n this.setSnapshot({\n value,\n fetchState,\n error: errors.length === 0 ? null : Object.freeze(errors),\n parentEvent,\n cause: 'block layout source changed',\n })\n }\n}\n\ninterface BuildNodeArguments<TItem> {\n readonly items: readonly TItem[]\n readonly splits: readonly BlockSplit<TItem>[]\n readonly splitIndex: number\n readonly path: BlockPath\n readonly criterion: BlockSplit<TItem> | null\n readonly category: Category<TItem> | null\n readonly parentCount: number\n readonly totalShare: number\n readonly readabilityThreshold: number\n readonly issues: BlockPartitionIssue<TItem>[]\n readonly rootLabel: string\n}\n\nfunction buildNode<TItem>(arguments_: BuildNodeArguments<TItem>): BlockNode<TItem> {\n const {\n items,\n splits,\n splitIndex,\n path,\n criterion,\n category,\n parentCount,\n totalShare,\n readabilityThreshold,\n issues,\n rootLabel,\n } = arguments_\n const nextSplit = splits[splitIndex]\n const childrenSuppressed = nextSplit != null\n && path.length > 0\n && totalShare < readabilityThreshold\n const children = nextSplit == null || childrenSuppressed\n ? []\n : partitionChildren({\n items,\n splits,\n splitIndex,\n path,\n criterion: nextSplit,\n totalShare,\n readabilityThreshold,\n issues,\n rootLabel,\n })\n const share = parentCount === 0 ? 0 : items.length / parentCount\n return Object.freeze({\n key: pathKey(path),\n path,\n criterionKey: criterion?.key ?? null,\n criterionLabel: criterion?.label ?? null,\n categoryKey: category?.key ?? null,\n label: category?.label ?? rootLabel,\n colors: category?.colors ?? null,\n colorKey: category?.colorKey ?? null,\n count: items.length,\n share,\n totalShare,\n depth: path.length - 1,\n items,\n children: Object.freeze(children),\n childOrientation: path.length % 2 === 0 ? 'horizontal' : 'vertical',\n childrenSuppressed,\n })\n}\n\nfunction partitionChildren<TItem>(arguments_: {\n readonly items: readonly TItem[]\n readonly splits: readonly BlockSplit<TItem>[]\n readonly splitIndex: number\n readonly path: BlockPath\n readonly criterion: BlockSplit<TItem>\n readonly totalShare: number\n readonly readabilityThreshold: number\n readonly issues: BlockPartitionIssue<TItem>[]\n readonly rootLabel: string\n}): BlockNode<TItem>[] {\n const {items, criterion, path, issues} = arguments_\n const groups = new Map(criterion.categories.map((category) => [category.key, {\n category,\n items: [] as TItem[],\n }]))\n let valid = true\n items.forEach((item, itemIndex) => {\n const matches = criterion.categories.filter((category) => category.predicate(item))\n if (matches.length !== 1) {\n valid = false\n issues.push(Object.freeze({\n kind: matches.length === 0 ? 'unmatched' : 'multiple-matches',\n criterionKey: criterion.key,\n criterionLabel: criterion.label,\n parentPath: path,\n item,\n itemIndex,\n matchedCategoryKeys: Object.freeze(matches.map(({key}) => key)),\n }))\n return\n }\n groups.get(matches[0]!.key)!.items.push(item)\n })\n if (!valid) return []\n let populated = [...groups.values()].filter((group) => group.items.length > 0)\n if (criterion.allowResorting) {\n populated = populated.sort((left, right) =>\n right.items.length - left.items.length\n || left.category.label.localeCompare(right.category.label)\n || left.category.key.localeCompare(right.category.key))\n }\n return populated.map(({category, items: childItems}) => {\n const childPath = freezePath([...path, {\n criterionKey: criterion.key,\n categoryKey: category.key,\n }])\n const share = items.length === 0 ? 0 : childItems.length / items.length\n return buildNode({\n ...arguments_,\n items: Object.freeze(childItems),\n splitIndex: arguments_.splitIndex + 1,\n path: childPath,\n criterion,\n category,\n parentCount: items.length,\n totalShare: arguments_.totalShare * share,\n })\n })\n}\n\nfunction freezePath(path: BlockPath): BlockPath {\n if (!Array.isArray(path)) throw new TypeError('Block path must be an array')\n return Object.freeze(path.map((segment) => {\n if (segment == null || typeof segment !== 'object') {\n throw new TypeError('Block path segments must be objects')\n }\n if (typeof segment.criterionKey !== 'string' || segment.criterionKey === ''\n || typeof segment.categoryKey !== 'string' || segment.categoryKey === '') {\n throw new TypeError('Block path keys must be non-empty strings')\n }\n return Object.freeze({...segment})\n }))\n}\n\nfunction blockPathsEqual(left: BlockPath | null, right: BlockPath | null): boolean {\n return left === right || (left != null && right != null\n && left.length === right.length\n && left.every((segment, index) => {\n const other = right[index]\n return segment.criterionKey === other?.criterionKey\n && segment.categoryKey === other.categoryKey\n }))\n}\n\nfunction pathKey(path: BlockPath): string {\n return path.length === 0 ? 'root' : path.map(({criterionKey, categoryKey}) =>\n `${encodeURIComponent(criterionKey)}=${encodeURIComponent(categoryKey)}`).join('/')\n}\n\nfunction nonNull<TValue>(value: TValue | null): value is TValue {\n return value != null\n}\n\nfunction assertReadableEmitter(value: unknown, label: string): void {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'get') !== 'function'\n || typeof Reflect.get(value, 'getFetchState') !== 'function'\n || typeof Reflect.get(value, 'getError') !== 'function'\n || typeof Reflect.get(value, 'subscribe') !== 'function') {\n throw new TypeError(`${label} must be a readable emitter`)\n }\n}\n","const STYLE_ATTRIBUTE = 'data-cap-structural-styles'\nlet nextRegistryId = 1\n\ntype CSSFragment = RawCSSFragment | HostCSSFragment\n\ninterface RawCSSFragment {\n readonly kind: 'raw'\n readonly css: string\n}\n\ninterface HostCSSFragment {\n readonly kind: 'host'\n readonly css: string\n readonly hosts: Set<string>\n}\n\n/** Application-scoped structural-style collection and injection. */\nexport class StyleRegistry {\n readonly id: string\n private readonly cssFragments = new Map<string, CSSFragment>()\n\n constructor(id: string = `runtime-${nextRegistryId++}`) {\n if (typeof id !== 'string') throw new TypeError('StyleRegistry id must be a string')\n this.id = id\n }\n\n registerCSS(css: string): this {\n if (typeof css !== 'string') throw new TypeError('Component CSS must be a string')\n const normalized = css.trim()\n if (normalized.length > 0) {\n this.cssFragments.set(`raw:${normalized}`, {kind: 'raw', css: normalized})\n }\n return this\n }\n\n /** @internal Collect a host-relative component template without resolving it yet. */\n registerHostCSS(css: string, host: string): this {\n if (typeof css !== 'string') throw new TypeError('Component CSS must be a string')\n if (typeof host !== 'string' || host.trim().length === 0) {\n throw new TypeError('Component CSS host must be a non-empty selector')\n }\n const normalized = css.trim()\n if (normalized.length === 0) return this\n if (!normalized.includes('&')) return this.registerCSS(normalized)\n\n const key = `host:${normalized}`\n const existing = this.cssFragments.get(key)\n if (existing == null) {\n this.cssFragments.set(key, {\n kind: 'host',\n css: normalized,\n hosts: new Set([host.trim()]),\n })\n } else if (existing.kind === 'host') {\n existing.hosts.add(host.trim())\n }\n return this\n }\n\n generateCSS(): string {\n return [...this.cssFragments.values()]\n .map(fragment => fragment.kind === 'raw'\n ? fragment.css\n : resolveHostCSS(fragment.css, [...fragment.hosts]))\n .join('\\n\\n')\n }\n\n injectAll(targetDocument: Document = globalThis.document): HTMLStyleElement {\n if (targetDocument?.head == null) {\n throw new TypeError('StyleRegistry.injectAll requires a document with a head')\n }\n const selector = `style[${STYLE_ATTRIBUTE}=\"${escapeAttributeValue(this.id)}\"]`\n let style = targetDocument.head.querySelector<HTMLStyleElement>(selector)\n if (style == null) {\n style = targetDocument.createElement('style')\n style.setAttribute(STYLE_ATTRIBUTE, this.id)\n targetDocument.head.prepend(style)\n }\n const css = this.generateCSS()\n if (style.textContent !== css) style.textContent = css\n return style\n }\n\n reset(): void {\n this.cssFragments.clear()\n }\n}\n\n/** Create an isolated registry for a configured Capillary UI application runtime. */\nexport function createStyleRegistry(): StyleRegistry {\n return new StyleRegistry()\n}\n\n/** Backward-compatible structural styles for the default Capillary UI runtime. */\nexport const styleRegistry = new StyleRegistry('')\n\nfunction escapeAttributeValue(value: string): string {\n return value.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"')\n}\n\nfunction resolveHostCSS(css: string, hosts: readonly string[]): string {\n let output = ''\n let cursor = 0\n while (cursor < css.length) {\n const openBrace = findBrace(css, cursor)\n if (openBrace < 0) return output + css.slice(cursor)\n const closeBrace = findMatchingBrace(css, openBrace)\n if (closeBrace < 0) return output + css.slice(cursor)\n\n const header = css.slice(cursor, openBrace)\n const body = css.slice(openBrace + 1, closeBrace)\n const rule = header.trim()\n output += rule.startsWith('@')\n ? `${header}{${resolveHostCSS(body, hosts)}}`\n : `${expandHostSelectors(header, hosts)}{${body}}`\n cursor = closeBrace + 1\n }\n return output\n}\n\nfunction expandHostSelectors(header: string, hosts: readonly string[]): string {\n if (hosts.length === 1 || !header.includes('&')) {\n return hosts.length === 1 ? header.replaceAll('&', hosts[0]!) : header\n }\n const leading = header.match(/^\\s*/)?.[0] ?? ''\n const trailing = header.match(/\\s*$/)?.[0] ?? ''\n const selectors = splitSelectors(header.trim())\n const continuationIndent = leading.match(/(?:^|\\n)([ \\t]*)$/)?.[1] ?? ''\n return leading + selectors.flatMap(selector => selector.includes('&')\n ? hosts.map(host => selector.replaceAll('&', host))\n : [selector]).join(`,\\n${continuationIndent}`) + trailing\n}\n\nfunction splitSelectors(selectors: string): string[] {\n const result: string[] = []\n let start = 0\n let parentheses = 0\n let brackets = 0\n let quote: '\"' | \"'\" | null = null\n for (let index = 0; index < selectors.length; index += 1) {\n const character = selectors[index]!\n if (quote != null) {\n if (character === '\\\\') index += 1\n else if (character === quote) quote = null\n continue\n }\n if (character === '\"' || character === \"'\") {\n quote = character\n } else if (character === '(') {\n parentheses += 1\n } else if (character === ')') {\n parentheses -= 1\n } else if (character === '[') {\n brackets += 1\n } else if (character === ']') {\n brackets -= 1\n } else if (character === ',' && parentheses === 0 && brackets === 0) {\n result.push(selectors.slice(start, index).trim())\n start = index + 1\n }\n }\n result.push(selectors.slice(start).trim())\n return result.filter(Boolean)\n}\n\nfunction findBrace(css: string, from: number): number {\n for (let index = from; index < css.length; index += 1) {\n const character = css[index]!\n if (character === '\"' || character === \"'\") {\n index = skipQuote(css, index)\n } else if (character === '/' && css[index + 1] === '*') {\n index = skipComment(css, index)\n } else if (character === '{') {\n return index\n }\n }\n return -1\n}\n\nfunction findMatchingBrace(css: string, openBrace: number): number {\n let depth = 1\n for (let index = openBrace + 1; index < css.length; index += 1) {\n const character = css[index]!\n if (character === '\"' || character === \"'\") {\n index = skipQuote(css, index)\n } else if (character === '/' && css[index + 1] === '*') {\n index = skipComment(css, index)\n } else if (character === '{') {\n depth += 1\n } else if (character === '}' && --depth === 0) {\n return index\n }\n }\n return -1\n}\n\nfunction skipQuote(css: string, openQuote: number): number {\n const quote = css[openQuote]!\n for (let index = openQuote + 1; index < css.length; index += 1) {\n if (css[index] === '\\\\') index += 1\n else if (css[index] === quote) return index\n }\n return css.length\n}\n\nfunction skipComment(css: string, openComment: number): number {\n const closeComment = css.indexOf('*/', openComment + 2)\n return closeComment < 0 ? css.length : closeComment + 1\n}\n","declare const serviceType: unique symbol\ndeclare const serviceProviderType: unique symbol\n\n/** Typed identity for one application service contract. */\nexport interface ServiceKey<TService> {\n readonly name: string\n readonly [serviceType]: TService\n}\n\n/** Read-only service access exposed to service factories. */\nexport interface ServiceResolver {\n has(key: ServiceKey<unknown>): boolean\n require<TService>(key: ServiceKey<TService>): TService\n}\n\nexport type ServiceFactory<TService> = (services: ServiceResolver) => TService\n\n/** Immutable registration for a lazily created, scope-shared service. */\nexport interface ServiceProvider<TService> {\n readonly key: ServiceKey<TService>\n readonly create: ServiceFactory<TService>\n readonly [serviceProviderType]: true\n}\n\nconst serviceKeys = new WeakSet<object>()\nconst serviceProviders = new WeakSet<object>()\n\n/** Declare a typed service identity without selecting an implementation. */\nexport function defineService<TService>(name: string): ServiceKey<TService> {\n if (typeof name !== 'string' || name.trim() === '') {\n throw new TypeError('Service name must be a non-empty string')\n }\n const key = Object.freeze({name: name.trim()}) as ServiceKey<TService>\n serviceKeys.add(key)\n return key\n}\n\n/** Select the factory for a service in one application composition root. */\nexport function provideService<TService>(\n key: ServiceKey<TService>,\n create: ServiceFactory<TService>,\n): ServiceProvider<TService> {\n assertServiceKey(key)\n if (typeof create !== 'function') {\n throw new TypeError(`Service provider \"${key.name}\" requires a factory function`)\n }\n const provider = Object.freeze({key, create}) as ServiceProvider<TService>\n serviceProviders.add(provider)\n return provider\n}\n\n/**\n * Explicit application service scope.\n *\n * Providers are fixed at construction. Each service is created lazily at most\n * once, shared inside this scope, and disposed in reverse creation order.\n */\nexport class ServiceScope implements ServiceResolver {\n private readonly providers = new Map<ServiceKey<unknown>, ServiceProvider<unknown>>()\n private readonly instances = new Map<ServiceKey<unknown>, unknown>()\n private readonly creationOrder: ServiceKey<unknown>[] = []\n private readonly resolving: ServiceKey<unknown>[] = []\n private disposed = false\n\n constructor(providers: readonly ServiceProvider<unknown>[] = []) {\n if (!Array.isArray(providers)) {\n throw new TypeError('ServiceScope providers must be an array')\n }\n for (const provider of providers) {\n assertServiceProvider(provider)\n if (this.providers.has(provider.key)) {\n throw new Error(`Service \"${provider.key.name}\" is registered more than once`)\n }\n this.providers.set(provider.key, provider)\n }\n }\n\n get isDisposed(): boolean {\n return this.disposed\n }\n\n has(key: ServiceKey<unknown>): boolean {\n this.assertActive()\n assertServiceKey(key)\n return this.providers.has(key)\n }\n\n require<TService>(key: ServiceKey<TService>): TService {\n this.assertActive()\n assertServiceKey(key)\n if (this.instances.has(key)) return this.instances.get(key) as TService\n\n const provider = this.providers.get(key) as ServiceProvider<TService> | undefined\n if (provider == null) throw new Error(`Service \"${key.name}\" is not registered`)\n\n const cycleStart = this.resolving.indexOf(key)\n if (cycleStart >= 0) {\n const cycle = [...this.resolving.slice(cycleStart), key]\n .map((entry) => entry.name)\n .join(' -> ')\n throw new Error(`Circular service dependency: ${cycle}`)\n }\n\n this.resolving.push(key)\n try {\n const instance = provider.create(this)\n this.instances.set(key, instance)\n this.creationOrder.push(key)\n return instance\n } finally {\n this.resolving.pop()\n }\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n const errors: unknown[] = []\n for (const key of [...this.creationOrder].reverse()) {\n const instance = this.instances.get(key)\n try {\n const dispose = readDispose(instance)\n if (dispose != null) dispose.call(instance)\n } catch (error) {\n errors.push(error)\n }\n }\n this.instances.clear()\n this.creationOrder.length = 0\n this.resolving.length = 0\n if (errors.length === 1) throw errors[0]\n if (errors.length > 1) {\n throw new AggregateError(errors, 'Several services failed during disposal')\n }\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('ServiceScope has been disposed')\n }\n}\n\nexport function createServiceScope(\n providers: readonly ServiceProvider<unknown>[] = [],\n): ServiceScope {\n return new ServiceScope(providers)\n}\n\nfunction isServiceKey(value: unknown): value is ServiceKey<unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && serviceKeys.has(value as object)\n}\n\nfunction assertServiceKey(value: unknown): asserts value is ServiceKey<unknown> {\n if (!isServiceKey(value)) throw new TypeError('Expected a service key created by defineService()')\n}\n\nfunction assertServiceProvider(\n value: unknown,\n): asserts value is ServiceProvider<unknown> {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || !serviceProviders.has(value as object)) {\n throw new TypeError('Expected a service provider created by provideService()')\n }\n}\n\nfunction readDispose(value: unknown): (() => void) | null {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) return null\n const dispose = Reflect.get(value, 'dispose')\n return typeof dispose === 'function' ? dispose as () => void : null\n}\n","/**\n * Optional replacements for user-facing text authored by Capillary UI itself.\n *\n * Every property is optional so a caller can override only the messages it\n * needs and newer Capillary UI releases can add messages without requiring an\n * application catalog update.\n */\nexport interface CapillaryUiMessageOverrides {\n readonly breadcrumbLabel?: string\n readonly checkboxOptionLabel?: string\n readonly checkboxStateLabel?: (label: string, state: string) => string\n readonly colorOptionGrayLabel?: string\n readonly colorOptionGreenLabel?: string\n readonly colorOptionIceBlueLabel?: string\n readonly colorOptionOceanLabel?: string\n readonly colorOptionOrangeLabel?: string\n readonly colorOptionPurpleLabel?: string\n readonly colorOptionRedLabel?: string\n readonly colorOptionYellowLabel?: string\n readonly dataTableEmpty?: string\n readonly dataTableLoadError?: string\n readonly dataTableLoading?: string\n readonly dataTableRetry?: string\n readonly dialogCloseLabel?: string\n readonly dropdownLoadError?: string\n readonly dropdownPlaceholder?: string\n readonly filterModeDenyLabel?: string\n readonly filterModeNeutralLabel?: string\n readonly filterModePreferLabel?: string\n readonly filterModeRequireLabel?: string\n readonly filterPanelEmpty?: string\n readonly filterPanelLabel?: string\n readonly filterPanelLoadError?: string\n readonly filterPanelLoading?: string\n readonly listViewEmpty?: string\n readonly listViewLabel?: string\n readonly listViewLoadError?: string\n readonly listViewLoading?: string\n readonly progressInProgress?: string\n readonly radioOptionLabel?: string\n readonly splitViewSeparatorLabel?: string\n readonly tabLineLabel?: string\n readonly tableFilterColumnLabel?: (label: string) => string\n readonly tableSortColumnLabel?: (label: string) => string\n readonly themeOptionCapillaryLabel?: string\n readonly themeOptionMinimalLabel?: string\n readonly themeOptionShinyLabel?: string\n readonly toolbarLabel?: string\n readonly treeViewEmpty?: string\n readonly treeViewLoadError?: string\n readonly treeViewLoading?: string\n}\n\nexport type CapillaryUiMessage<TKey extends keyof CapillaryUiMessageOverrides> =\n Exclude<CapillaryUiMessageOverrides[TKey], undefined>\n\n/** Static localization selected before a Capillary UI runtime is created. */\nexport interface CapillaryUiLocalizationOptions {\n /** BCP 47 locale used by Capillary UI-owned `Intl` formatting. */\n readonly locale: string\n /** Partial replacements for Capillary UI-authored English messages. */\n readonly messages?: CapillaryUiMessageOverrides\n}\n\n/** Resolved immutable localization carried by one Capillary UI runtime. */\nexport interface CapillaryUiLocalization {\n /** Canonical configured locale, or `undefined` for the browser default. */\n readonly locale: string | undefined\n /** Resolve one Capillary UI message after per-key English fallback. */\n message<TKey extends keyof CapillaryUiMessageOverrides>(key: TKey): CapillaryUiMessage<TKey>\n}\n\ntype ResolvedCapillaryUiMessages = {\n readonly [TKey in keyof CapillaryUiMessageOverrides]-?: CapillaryUiMessage<TKey>\n}\n\nconst englishCapillaryUiMessages = Object.freeze({\n breadcrumbLabel: 'Breadcrumb',\n checkboxOptionLabel: 'Option',\n checkboxStateLabel: (label: string, state: string) => `${label}: ${state}`,\n colorOptionGrayLabel: 'Gray',\n colorOptionGreenLabel: 'Green',\n colorOptionIceBlueLabel: 'Ice blue',\n colorOptionOceanLabel: 'Ocean',\n colorOptionOrangeLabel: 'Orange',\n colorOptionPurpleLabel: 'Purple',\n colorOptionRedLabel: 'Red',\n colorOptionYellowLabel: 'Yellow',\n dataTableEmpty: 'No rows',\n dataTableLoadError: 'Unable to load rows',\n dataTableLoading: 'Loading rows…',\n dataTableRetry: 'Retry',\n dialogCloseLabel: 'Close',\n dropdownLoadError: 'Unable to load options',\n dropdownPlaceholder: 'Select…',\n filterModeDenyLabel: 'deny',\n filterModeNeutralLabel: 'neutral',\n filterModePreferLabel: 'prefer',\n filterModeRequireLabel: 'require',\n filterPanelEmpty: 'No filter options',\n filterPanelLabel: 'Filter options',\n filterPanelLoadError: 'Unable to load filter options',\n filterPanelLoading: 'Loading filter options…',\n listViewEmpty: 'No items',\n listViewLabel: 'Items',\n listViewLoadError: 'Unable to load items',\n listViewLoading: 'Loading items…',\n progressInProgress: 'In progress',\n radioOptionLabel: 'Option',\n splitViewSeparatorLabel: 'Resize panes',\n tabLineLabel: 'Sections',\n tableFilterColumnLabel: (label: string) => `Filter ${label}`,\n tableSortColumnLabel: (label: string) => `Sort ${label}`,\n themeOptionCapillaryLabel: 'Capillary',\n themeOptionMinimalLabel: 'Minimal',\n themeOptionShinyLabel: 'Shiny',\n toolbarLabel: 'Actions',\n treeViewEmpty: 'No tree items',\n treeViewLoadError: 'Unable to load tree items',\n treeViewLoading: 'Loading tree items…',\n} satisfies ResolvedCapillaryUiMessages)\n\nclass RuntimeLocalization implements CapillaryUiLocalization {\n readonly locale: string | undefined\n private readonly messages: ResolvedCapillaryUiMessages\n\n constructor(\n locale: string | undefined,\n messages: ResolvedCapillaryUiMessages,\n ) {\n this.locale = locale\n this.messages = messages\n Object.freeze(this)\n }\n\n message<TKey extends keyof CapillaryUiMessageOverrides>(key: TKey): CapillaryUiMessage<TKey> {\n return this.messages[key] as CapillaryUiMessage<TKey>\n }\n}\n\nconst defaultCapillaryUiLocalization: CapillaryUiLocalization = new RuntimeLocalization(\n undefined,\n englishCapillaryUiMessages,\n)\n\n/** @internal Normalize one runtime's static localization without retaining caller mutation. */\nexport function createRuntimeLocalization(\n options: CapillaryUiLocalizationOptions | undefined,\n): CapillaryUiLocalization {\n if (options == null) return defaultCapillaryUiLocalization\n if (typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('Capillary UI localization must be an object')\n }\n\n const locale = canonicalLocale(options.locale)\n const supplied = options.messages\n if (supplied != null && (typeof supplied !== 'object' || Array.isArray(supplied))) {\n throw new TypeError('Capillary UI localization messages must be an object')\n }\n\n const resolved = {...englishCapillaryUiMessages} as ResolvedCapillaryUiMessages\n if (supplied != null) {\n for (const key of Object.keys(englishCapillaryUiMessages) as (keyof CapillaryUiMessageOverrides)[]) {\n const value = supplied[key]\n if (value === undefined) continue\n const fallback = englishCapillaryUiMessages[key]\n if (typeof value !== typeof fallback) {\n throw new TypeError(`Capillary UI localization message \"${key}\" has the wrong type`)\n }\n Object.assign(resolved, {[key]: value})\n }\n }\n\n return new RuntimeLocalization(locale, Object.freeze(resolved))\n}\n\nfunction canonicalLocale(locale: unknown): string {\n if (typeof locale !== 'string' || locale.trim() === '') {\n throw new TypeError('Capillary UI localization locale must be a non-empty BCP 47 language tag')\n }\n try {\n return Intl.getCanonicalLocales(locale)[0]!\n } catch (error) {\n throw new RangeError(`Invalid Capillary UI localization locale: ${locale}`, {cause: error})\n }\n}\n","import type {\n Component,\n ComponentDependency,\n} from './Components/component.js'\nimport {\n createStyleRegistry,\n styleRegistry,\n} from './styling/styleRegistry.js'\nimport type {StyleRegistry} from './styling/styleRegistry.js'\nimport {ServiceScope, createServiceScope} from './services.js'\nimport type {BrowserRouter} from './routing/router.js'\nimport {createRuntimeLocalization} from './localization.js'\nimport type {CapillaryUiLocalization, CapillaryUiLocalizationOptions} from './localization.js'\nimport {defaultDiagnosticScope, Diagnostics} from '@capillaryjs/capillary'\nimport type {DiagnosticScope} from '@capillaryjs/capillary'\n\nconst RESERVED_CUSTOM_ELEMENT_NAMES = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n])\n\nexport interface CapillaryUiRuntimeOptions {\n /** Inherited by component and binding diagnostic identities. */\n diagnosticScope?: DiagnosticScope\n /** Service scope inherited by every component created or mounted here. */\n services?: ServiceScope\n /** Optional caller-owned browser router inherited by routed components. */\n router?: BrowserRouter\n /** Static Capillary UI message overrides and formatting locale for this runtime. */\n localization?: CapillaryUiLocalizationOptions\n}\n\n/** Application scope for structural styles, browser integrations, and localization. */\nexport class CapillaryUiRuntime {\n readonly styleRegistry: StyleRegistry\n readonly services: ServiceScope\n readonly router: BrowserRouter | null\n readonly localization: CapillaryUiLocalization\n readonly diagnosticScope: DiagnosticScope\n private readonly routedRoots = new WeakSet<Component>()\n\n constructor(\n options: CapillaryUiRuntimeOptions = {},\n registry: StyleRegistry = createStyleRegistry(),\n ) {\n if (options == null || typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('CapillaryUiRuntime options must be an object')\n }\n if (Object.hasOwn(options, 'elementNames')) {\n throw new TypeError('CapillaryUiRuntime no longer supports configurable element names')\n }\n this.styleRegistry = registry\n this.diagnosticScope = options.diagnosticScope ?? defaultDiagnosticScope\n this.localization = createRuntimeLocalization(options.localization)\n this.services = options.services ?? createServiceScope()\n if (!(this.services instanceof ServiceScope)) {\n throw new TypeError('Capillary UI services must be a ServiceScope')\n }\n this.router = options.router ?? null\n if (this.router != null\n && (typeof this.router !== 'object'\n || typeof this.router.openScope !== 'function'\n || typeof this.router.completeScope !== 'function')) {\n throw new TypeError('Capillary UI router must be a BrowserRouter')\n }\n }\n\n /** Resolve a fixed one-hyphen public host name for a built-in component. */\n resolveElementName(hostName: string): string {\n assertNamePart(hostName, 'Capillary UI component host name')\n const resolved = `cap-${hostName.replaceAll('-', '')}`\n assertCustomElementName(resolved)\n return resolved\n }\n\n resolveHostSelector(\n selector: string,\n hostName: string,\n ): string {\n if (typeof selector !== 'string') throw new TypeError('Host selector must be a string')\n return selector.replaceAll('&', this.resolveElementName(hostName))\n }\n\n resolveHostCSS(\n cssText: string,\n hostName: string,\n ): string {\n if (typeof cssText !== 'string') throw new TypeError('Host CSS must be a string')\n return cssText.replaceAll('&', this.resolveElementName(hostName))\n }\n\n create<TArgs extends unknown[], TComponent extends Component>(\n componentType: new(...args: TArgs) => TComponent,\n ...args: TArgs\n ): TComponent {\n const component = Diagnostics.withScope(this.diagnosticScope, () => new componentType(...args))\n component._setRuntime(this)\n return component\n }\n\n mount<TComponent extends Component>(\n component: TComponent,\n parent: ParentNode,\n before: Node | null = null,\n ): TComponent {\n component._setRuntime(this)\n let closeRouteScope: (() => void) | null = null\n if (this.router != null && !this.routedRoots.has(component)) {\n this.routedRoots.add(component)\n closeRouteScope = this.router.openScope(this.router.root, component)\n component.onCleanup(closeRouteScope)\n }\n try {\n component.mount(parent, before)\n if (this.router != null && closeRouteScope != null) {\n this.router.completeScope(this.router.root, component)\n }\n } catch (error) {\n closeRouteScope?.()\n throw error\n }\n return component\n }\n\n registerStyles(dependency: ComponentDependency): this {\n if (dependency == null || typeof dependency.registerStyles !== 'function') {\n throw new TypeError('registerStyles requires a Capillary UI component dependency')\n }\n dependency.registerStyles(this)\n return this\n }\n\n injectStyles(targetDocument: Document = globalThis.document): HTMLStyleElement {\n return this.styleRegistry.injectAll(targetDocument)\n }\n}\n\nexport function createCapillaryUiRuntime(options: CapillaryUiRuntimeOptions = {}): CapillaryUiRuntime {\n return new CapillaryUiRuntime(options)\n}\n\n/** Runtime used by Component.new(), direct mount(), and the legacy styleRegistry export. */\nexport const defaultCapillaryUiRuntime = new CapillaryUiRuntime({}, styleRegistry)\n\nfunction assertNamePart(value: unknown, label: string): asserts value is 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}\n\nfunction assertCustomElementName(value: unknown): asserts value is string {\n assertNamePart(value, 'Capillary UI element name')\n if (!value.includes('-') || RESERVED_CUSTOM_ELEMENT_NAMES.has(value)) {\n throw new TypeError(`Capillary UI element name must be a non-reserved name containing a hyphen: ${value}`)\n }\n}\n","import type {\n DiagnosticDescription,\n DiagnosticConsumerDetails,\n DiagnosticScope,\n FetchStateValue,\n ReadableEmitter,\n WritableEmitter,\n} from '@capillaryjs/capillary'\nimport {Diagnostics, diagnosticInfo, EventBubble} from '@capillaryjs/capillary'\n\nimport {CapillaryUiRuntime, defaultCapillaryUiRuntime} from '../runtime.js'\nimport type {ServiceKey} from '../services.js'\nimport type {ResolvedRoute} from '../routing/router.js'\nimport type {\n CapillaryUiLocalization,\n CapillaryUiMessage,\n CapillaryUiMessageOverrides,\n} from '../localization.js'\n\nexport const Fragment = Symbol.for('@capillaryjs/capillary-ui.Fragment')\n\nexport type Key = string | number\n\nexport interface ComponentProps {\n key?: Key | null\n children?: CapillaryUiChild | readonly CapillaryUiChild[]\n class?: string | null\n className?: string | null\n /** Opt this host into the theme-defined, non-nestable island treatment. */\n island?: boolean\n [name: string]: unknown\n}\n\n/** Semantic surface a component host contributes to its parent composition. */\nexport type CapillaryUiDataSurface = 'data' | null\n\nexport type Ref<TNode extends Node = Node> =\n | ((value: TNode | null) => void)\n | {current: TNode | null}\n\nexport type FunctionComponent<TProps extends ComponentProps = ComponentProps> = ((\n props: TProps,\n) => CapillaryUiChild) & {diagnosticLabel?: string}\n\nexport type ComponentConstructor<\n TProps extends ComponentProps = ComponentProps,\n TInstance extends Component<TProps> = Component<TProps>,\n> = new(props: TProps) => TInstance\n\ntype AnyComponentConstructor = new(props?: never) => Component\ntype ConcreteComponentConstructor = new(...args: never[]) => Component\n\nexport type VNodeType<TProps extends ComponentProps = ComponentProps> =\n | string\n | typeof Fragment\n | ComponentConstructor<TProps>\n | FunctionComponent<TProps>\n\nexport interface VNode<TProps extends ComponentProps = ComponentProps> {\n readonly type: string | typeof Fragment | Function\n readonly key: Key | null\n readonly props: TProps & {children: NormalizedChild[]}\n}\n\nexport type CapillaryUiChild =\n | string\n | number\n | boolean\n | null\n | undefined\n | VNode\n | Component\n | ReadableEmitter<CapillaryUiChild, unknown>\n | readonly CapillaryUiChild[]\n\ntype NormalizedChild = string | number | VNode | Component | ReadableEmitter<CapillaryUiChild, unknown>\n\ndeclare const liveBindingBrand: unique symbol\n\n/** Explicitly subscribe a DOM or component property to an emitter's current value. */\nexport interface LiveBinding<TValue> {\n readonly emitter: ReadableEmitter<TValue, unknown>\n readonly [liveBindingBrand]: true\n}\n\n/** Re-exported core contract used by native `bind:value` and `bind:checked`. */\nexport type {WritableEmitter} from '@capillaryjs/capillary'\n\nexport interface EmitterSnapshot<TValue, TError = unknown> {\n readonly value: TValue\n readonly fetchState: FetchStateValue\n readonly error: TError | null\n}\n\ndeclare const livePropContract: unique symbol\n\n/** Type-only declaration of the component props that accept `live()` bindings. */\nexport interface LivePropContract<TName extends string> {\n readonly [livePropContract]?: TName\n}\n\n/** Components opt in to every supported `live()` prop through LivePropContract. */\ntype DefaultLivePropName<_TProps extends ComponentProps> = never\n\ntype DeclaredLivePropName<TProps extends ComponentProps> =\n typeof livePropContract extends keyof TProps\n ? Extract<Exclude<TProps[typeof livePropContract], undefined>, keyof TProps>\n : DefaultLivePropName<TProps>\n\nexport type TemplateProps<TProps extends ComponentProps> = {\n [TName in keyof TProps as TName extends typeof livePropContract ? never : TName]:\n TName extends 'key' | 'children'\n ? TProps[TName]\n : TName extends DeclaredLivePropName<TProps>\n ? TProps[TName] | LiveBinding<Exclude<TProps[TName], undefined>>\n : TProps[TName]\n}\n\nexport interface ComponentDependency {\n registerStyles(runtime?: CapillaryUiRuntime, seen?: Set<ComponentDependency>): void\n}\n\ninterface Watchable {\n subscribe(\n listener: (notification: {event: EventBubble<unknown> | null}) => void,\n options?: {emitCurrent?: boolean; diagnosticTarget?: object},\n ): () => void\n}\n\nconst liveBindingValues = new WeakSet<object>()\n\nconst BOOLEAN_ATTRIBUTES = new Set([\n 'allowFullScreen',\n 'async',\n 'autoFocus',\n 'autoPlay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formNoValidate',\n 'hidden',\n 'inert',\n 'loop',\n 'multiple',\n 'muted',\n 'noModule',\n 'noValidate',\n 'open',\n 'playsInline',\n 'readOnly',\n 'required',\n 'reversed',\n 'selected',\n])\n\nconst PROPERTY_PROPS = new Set([\n 'checked',\n 'defaultChecked',\n 'defaultValue',\n 'disabled',\n 'indeterminate',\n 'multiple',\n 'muted',\n 'readOnly',\n 'required',\n 'selected',\n 'selectedIndex',\n 'tabIndex',\n 'value',\n])\n\nconst CAPILLARY_UI_RENDERER_ATTRIBUTE = 'data-cap'\n\n// Each consumer owns its writes; nested/excluded consumers suspend the outer count.\nlet rendererWrites: {count: number} | null = null\nfunction recordRendererWrite(): void { if (rendererWrites) rendererWrites.count += 1 }\n\n/** Mark an emitter as a one-way live value for a DOM or component property. */\nexport function live<TValue>(emitter: ReadableEmitter<TValue, unknown>): LiveBinding<TValue> {\n assertReadableEmitter(emitter, 'live')\n const binding = Object.freeze({emitter}) as LiveBinding<TValue>\n liveBindingValues.add(binding)\n return binding\n}\n\n/** Build a Capillary UI virtual node. */\nexport function h<TProps extends ComponentProps = ComponentProps>(\n type: VNodeType<TProps>,\n props: TemplateProps<TProps> | null = null,\n ...children: CapillaryUiChild[]\n): VNode<TProps> {\n const suppliedProps = props ?? {} as TemplateProps<TProps>\n if (typeof suppliedProps !== 'object' || Array.isArray(suppliedProps)) {\n throw new TypeError('VNode props must be an object or null')\n }\n const {\n children: propChildren,\n key = null,\n ...restProps\n } = suppliedProps\n return {\n type,\n key,\n props: {\n ...restProps,\n children: normalizeChildren([propChildren, children]),\n } as TProps & {children: NormalizedChild[]},\n }\n}\n\ntype LiveValue<TValue> = TValue | LiveBinding<Exclude<TValue, undefined>>\n\ntype AriaAttributes = {\n [TName in `aria-${string}`]?: LiveValue<string | number | boolean | null | undefined>\n}\n\ntype DataAttributes = {\n [TName in `data-${string}`]?: LiveValue<string | number | boolean | null | undefined>\n}\n\ninterface DOMEvents<TElement extends HTMLElement> {\n onClick?: ((event: MouseEvent & {currentTarget: TElement}) => void) | undefined\n onInput?: ((event: InputEvent & {currentTarget: TElement}) => void) | undefined\n onChange?: ((event: Event & {currentTarget: TElement}) => void) | undefined\n onKeyDown?: ((event: KeyboardEvent & {currentTarget: TElement}) => void) | undefined\n onKeyUp?: ((event: KeyboardEvent & {currentTarget: TElement}) => void) | undefined\n onFocus?: ((event: FocusEvent & {currentTarget: TElement}) => void) | undefined\n onBlur?: ((event: FocusEvent & {currentTarget: TElement}) => void) | undefined\n onPointerDown?: ((event: PointerEvent & {currentTarget: TElement}) => void) | undefined\n onPointerMove?: ((event: PointerEvent & {currentTarget: TElement}) => void) | undefined\n onPointerUp?: ((event: PointerEvent & {currentTarget: TElement}) => void) | undefined\n onPointerCancel?: ((event: PointerEvent & {currentTarget: TElement}) => void) | undefined\n}\n\ntype CapillaryUiDOMProps<TElement extends HTMLElement> =\nOmit<ComponentProps, 'class' | 'className'>\n& DOMEvents<TElement>\n& AriaAttributes\n& DataAttributes\n& {\n class?: LiveValue<string | undefined>\n className?: LiveValue<string | undefined>\n for?: string | undefined\n htmlFor?: string | undefined\n ref?: Ref<TElement> | undefined\n style?: LiveValue<string | Record<string, string | number | null | undefined> | undefined>\n}\n\ntype LiveDOMProperties<TElement extends HTMLElement> = {\n [TName in keyof Omit<TElement, keyof ComponentProps | 'style' | 'children'>]?:\n LiveValue<TElement[TName] | undefined>\n}\n\ntype NativeValueBinding<TElement extends HTMLElement> =\n TElement extends HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n ? {'bind:value'?: WritableEmitter<string> | undefined}\n : {}\n\ntype NativeCheckedBinding<TElement extends HTMLElement> =\n TElement extends HTMLInputElement\n ? {'bind:checked'?: WritableEmitter<boolean> | undefined}\n : {}\n\nexport interface CapillaryUiHostElementTagNameMap {\n 'cap-content': HTMLElement\n 'cap-checkshell': HTMLElement\n 'cap-selectshell': HTMLElement\n 'cap-expander': HTMLElement\n 'cap-label': HTMLElement\n 'cap-options': HTMLElement\n 'cap-error': HTMLElement\n 'cap-erroricon': HTMLElement\n 'cap-errortext': HTMLElement\n 'cap-toolbarcontent': HTMLElement\n 'cap-primary': HTMLElement\n 'cap-secondary': HTMLElement\n 'cap-separator': HTMLElement\n 'cap-progress': HTMLElement\n 'cap-inverse': HTMLElement\n 'cap-presets': HTMLElement\n 'cap-draghandle': HTMLElement\n 'cap-chart': HTMLElement\n 'cap-readout': HTMLElement\n 'cap-swatch': HTMLElement\n 'cap-summary': HTMLElement\n 'cap-scroller': HTMLElement\n 'cap-blocks': HTMLElement\n 'cap-blockskeleton': HTMLElement\n 'cap-blockskeletoncolumn': HTMLElement\n 'cap-blocklabel': HTMLElement\n 'cap-blockname': HTMLElement\n 'cap-blockgroup': HTMLElement\n 'cap-categoryhidecontent': HTMLElement\n 'cap-criteriongroups': HTMLElement\n 'cap-categorygroupcontent': HTMLElement\n 'cap-categories': HTMLElement\n 'cap-categoryoption': HTMLElement\n 'cap-categoryswatch': HTMLElement\n 'cap-infopanel': HTMLElement\n 'cap-datepicker': HTMLElement\n 'cap-timepicker': HTMLElement\n 'cap-datetimepicker': HTMLElement\n}\n\nexport type CapillaryUiElementTagNameMap = HTMLElementTagNameMap & CapillaryUiHostElementTagNameMap\n\nexport type CapillaryUiIntrinsicElements = {\n [TTag in keyof CapillaryUiElementTagNameMap]: CapillaryUiDOMProps<CapillaryUiElementTagNameMap[TTag]>\n & LiveDOMProperties<CapillaryUiElementTagNameMap[TTag]>\n & NativeValueBinding<CapillaryUiElementTagNameMap[TTag]>\n & NativeCheckedBinding<CapillaryUiElementTagNameMap[TTag]>\n}\n\n/** Classic JSX type namespace for consumers configured with `jsxFactory: \"h\"`. */\nexport namespace h {\n export namespace JSX {\n export type Element = VNode | Component\n export interface ElementClass extends Component {}\n export interface ElementAttributesProperty {\n props: {}\n }\n export interface ElementChildrenAttribute {\n children: {}\n }\n export interface IntrinsicAttributes {\n key?: Key\n }\n export type LibraryManagedAttributes<_TComponent, TProps extends ComponentProps> =\n TemplateProps<TProps>\n export type IntrinsicElements = CapillaryUiIntrinsicElements\n }\n}\n\nexport function css(strings: TemplateStringsArray, ...values: unknown[]): string {\n return strings.reduce((result, string, index) =>\n result + string + String(values[index] ?? ''), '')\n}\n\nexport class Component<TProps extends ComponentProps = ComponentProps> {\n static dependencies: ComponentDependency[] = []\n static requiredServices: readonly ServiceKey<unknown>[] = []\n /** Component `live()` bindings are opt-in; subclasses declare their allowlist. */\n static liveProps: readonly string[] | null = []\n static css = css`\n .cap-fill-horizontal,\n .cap-fill-vertical {\n box-sizing: border-box;\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 .cap-fill-horizontal {\n width: 100vw;\n max-width: 100vw;\n min-width: 0;\n overflow-x: auto;\n }\n\n .cap-fill-vertical {\n height: 100vh;\n max-height: 100vh;\n min-height: 0;\n overflow-y: auto;\n }\n\n .cap-layout-horizontal,\n .cap-layout-vertical {\n display: flex;\n align-items: stretch;\n min-inline-size: 0;\n min-block-size: 0;\n gap: calc(var(--_cap-island-flow, 0) * var(--island-gap, 0px));\n }\n\n .cap-layout-horizontal {\n flex-direction: row;\n }\n\n .cap-layout-vertical {\n flex-direction: column;\n }\n\n .cap-size-natural {\n flex: 0 0 auto;\n }\n\n .cap-size-flexible {\n flex: 1 1 0;\n min-inline-size: 0;\n min-block-size: 0;\n }\n\n .cap-scroll {\n /* Move the clip into the surrounding gutter without moving the\n * content. The inherited allowance is owned by the parent layout,\n * so local gaps and nested scrollports do not add extra spacing. */\n --_cap-scroll-gutter: calc(var(--_cap-island-flow, 0) * var(--_cap-island-gutter, 0px));\n margin: calc(-1 * var(--_cap-scroll-gutter));\n padding: var(--_cap-scroll-gutter);\n overflow: auto;\n min-inline-size: 0;\n min-block-size: 0;\n }\n\n /* The mode crosses wrappers; each layout resolves its own public gap.\n * Only the first enabled scope contributes a perimeter inset. */\n .cap-island-layout {\n --_cap-island-flow: 1;\n --_cap-island-margin: 0px;\n --_cap-island-separator-background: transparent;\n box-sizing: border-box;\n padding: var(--_cap-island-outer-inset, var(--island-inset, 0px));\n gap: calc(var(--_cap-island-flow, 0) * var(--island-gap, 0px));\n }\n\n .cap-island-layout > * {\n --_cap-island-outer-inset: 0px;\n }\n\n .cap-layout-horizontal > *,\n .cap-layout-vertical > *,\n .cap-island-layout > * {\n --_cap-island-gutter: calc(var(--_cap-island-flow, 0) * var(--island-gap, 0px) / 2);\n }\n\n .cap-island-layout.cap-scroll {\n padding: calc(var(--_cap-island-outer-inset, var(--island-inset, 0px))\n + var(--_cap-scroll-gutter));\n }\n\n .cap-island-layout-off {\n --_cap-island-flow: 0;\n --_cap-island-margin: initial;\n --_cap-island-separator-background: initial;\n }\n\n .cap-island-layout-off > *,\n .island > * {\n --_cap-island-outer-inset: initial;\n --_cap-island-gutter: 0px;\n }\n\n .colored {\n --colored-base-bg:\n linear-gradient(\n 15deg,\n var(--c1) 0%,\n var(--c2) 65%,\n var(--c2) 65%,\n var(--c3) 100%\n );\n\n background: var(--colored-base-bg);\n box-shadow: var(--colored-shadow);\n border-radius: var(--ui-border-radius);\n }\n\n .app-footer.island,\n .island {\n --_cap-island-flow: 0;\n --_cap-island-separator-background: initial;\n box-sizing: border-box;\n min-width: 0;\n min-height: 0;\n margin: var(--_cap-island-margin, var(--island-margin));\n padding: var(--island-padding);\n background: var(--island-background);\n border: var(--island-border);\n border-radius: var(--island-radius);\n box-shadow: var(--island-shadow);\n }\n\n .cap-fill-horizontal.island,\n .cap-fill-horizontal .island {\n max-width: calc(100% - (2 * var(--_cap-island-margin, var(--island-margin))));\n overflow-x: auto;\n }\n\n .cap-fill-vertical.island,\n .cap-fill-vertical .island {\n max-height: calc(100% - (2 * var(--_cap-island-margin, var(--island-margin))));\n overflow-y: auto;\n }\n\n label[data-cap] {\n user-select: none;\n }\n `\n static hostName: string | null = null\n /** Override for a diagnostic-tool subtree; ordinary components inherit their owner/runtime. */\n static diagnosticScope: DiagnosticScope | null = null\n /** Optional stable display name for bundled application components. Built-ins use their host name. */\n static diagnosticLabel: string | null = null\n /** Optional host-level data surface marker for parent composition. */\n static dataSurface: CapillaryUiDataSurface = null\n\n static new<TConstructor extends ConcreteComponentConstructor>(\n this: TConstructor,\n ...args: ConstructorParameters<TConstructor>\n ): InstanceType<TConstructor> {\n const instance = new this(...args)\n if (!(instance instanceof Component)) {\n throw new TypeError('Component.new() requires a Component constructor')\n }\n return instance.mount() as InstanceType<TConstructor>\n }\n\n static registerStyles(\n this: ComponentDependency & {\n css?: string\n dependencies?: ComponentDependency[]\n hostName?: string | null\n },\n runtime: CapillaryUiRuntime = defaultCapillaryUiRuntime,\n seen: Set<ComponentDependency> = new Set(),\n ): void {\n if (seen.has(this)) return\n seen.add(this)\n\n const concreteHostName = this.hostName ?? null\n const styleChain = componentStyleChain(this)\n for (const owner of styleChain) {\n if (Object.hasOwn(owner, 'css') && owner.css) {\n if (concreteHostName == null) {\n runtime.styleRegistry.registerCSS(owner.css)\n } else {\n runtime.styleRegistry.registerHostCSS(\n owner.css,\n runtime.resolveElementName(concreteHostName),\n )\n }\n }\n }\n for (const owner of styleChain) {\n if (!Object.hasOwn(owner, 'dependencies')) continue\n for (const dependency of owner.dependencies ?? []) {\n dependency.registerStyles(runtime, seen)\n }\n }\n }\n\n props: TProps\n dom: ChildNode | null = null\n /** @internal */\n _rendered: RenderRecord | null = null\n /** @internal */\n readonly _childComponents = new Set<Component>()\n /** @internal Component ancestry used to enforce structural invariants. */\n _parentComponent: Component | null = null\n private initialized = false\n private mounted = false\n private destroyed = false\n private updating = false\n private updateRequested = false\n private readonly cleanupFunctions = new Set<() => void>()\n private readonly watched = new Map<Watchable, () => void>()\n private readonly renderReadSubscriptions = new Map<Watchable, () => void>()\n private collectingRenderReads: Set<Watchable> | null = null\n /** @internal */\n _runtime: CapillaryUiRuntime = defaultCapillaryUiRuntime\n /** @internal Route lineage inherited by nested routed components. */\n _routeContext: ResolvedRoute | null = null\n\n constructor(props: TProps = {} as TProps) {\n if (props == null || typeof props !== 'object' || Array.isArray(props)) {\n throw new TypeError(`${this.constructor.name} props must be an object`)\n }\n this.props = props\n }\n\n get diagnosticScope(): DiagnosticScope {\n return (this.constructor as typeof Component).diagnosticScope\n ?? this._parentComponent?.diagnosticScope ?? this._runtime.diagnosticScope\n }\n\n /** Stable instance label, captured when this component is first observed. */\n get diagnosticLabel(): string {\n const type = this.constructor as typeof Component\n return type.diagnosticLabel ?? type.hostName ?? type.name\n }\n\n [diagnosticInfo](): DiagnosticDescription {\n return {kind: 'component', label: componentDiagnosticLabel(this), scope: this.diagnosticScope,\n sources: [...this.watched.keys(), ...this.renderReadSubscriptions.keys()],\n targets: [...this._childComponents]}\n }\n\n /** One-time setup hook. Constructors must not subscribe or render. */\n initialize(): void {}\n\n render(): CapillaryUiChild {\n throw new Error(`${this.constructor.name} must implement render()`)\n }\n\n /** Render this component's configured custom host element. */\n protected host(props: ComponentProps | null = null, ...children: CapillaryUiChild[]): VNode {\n const componentType = this.constructor as typeof Component\n const hostName = componentType.hostName\n if (hostName == null) {\n throw new Error(`${this.constructor.name} does not declare a custom host name`)\n }\n const {\n class: classAlias,\n className: suppliedClassName,\n ...hostProps\n } = props ?? {}\n const componentClassName = suppliedClassName ?? classAlias\n const className = this.props.island === true\n ? mergeClassNames(componentClassName, 'island')\n : componentClassName\n return h(this._runtime.resolveElementName(hostName), {\n ...hostProps,\n ...(className == null ? {} : {className}),\n 'data-cap-component': hostName,\n ...(componentType.dataSurface == null\n ? {}\n : {'data-cap-surface': componentType.dataSurface}),\n }, ...children)\n }\n\n /** JSX component for this instance's runtime-configured custom host. */\n protected readonly Host: (props: ComponentProps) => VNode = ({\n children = [],\n ...props\n }) => this.host(props, children)\n\n /** @internal Assign an immutable application runtime before initialization or mounting. */\n _setRuntime(runtime: CapillaryUiRuntime): this {\n if (!(runtime instanceof CapillaryUiRuntime)) {\n throw new TypeError('Component runtime must be a CapillaryUiRuntime')\n }\n if (runtime === this._runtime) return this\n if (this.initialized || this.mounted || this._rendered != null) {\n throw new Error('Cannot change a component runtime after initialization')\n }\n this._runtime = runtime\n if (this._routeContext == null) this._routeContext = runtime.router?.root ?? null\n return this\n }\n\n /** @internal Assign contextual route lineage before initialization. */\n _setRouteContext(context: ResolvedRoute | null): this {\n if (this.initialized || this.mounted || this._rendered != null) {\n throw new Error('Cannot change a component route context after initialization')\n }\n this._routeContext = context\n return this\n }\n\n /** @internal Route lineage inherited by component children. */\n _routeContextForChildren(): ResolvedRoute | null {\n return this._routeContext\n }\n\n /** @internal Assign the renderer-owned component ancestry. */\n _setParentComponent(parent: Component): this {\n if (this._parentComponent != null && this._parentComponent !== parent) {\n throw new Error('A component instance cannot move between component owners')\n }\n this._parentComponent = parent\n this.validateIslandAncestry(this.props)\n return this\n }\n\n mount(parent: ParentNode | null = null, before: Node | null = null): this {\n if (this.destroyed) throw new Error('Cannot mount a destroyed component')\n this.validateIslandAncestry(this.props)\n let mountedNow = false\n if (!this.initialized) {\n this.validateRequiredServices()\n this.initialized = true\n Diagnostics.withScope(this.diagnosticScope, () => this.initialize())\n }\n if (!this.mounted) {\n this.mounted = true\n this.update()\n mountedNow = true\n }\n if (parent != null) {\n assertParentNode(parent)\n insertRecord(parent, this._rendered, before)\n }\n if (mountedNow) this.afterMount(this.dom)\n return this\n }\n\n attachTo(parent: ParentNode): this {\n this.mount(parent)\n return this\n }\n\n update(_event?: unknown, trigger: DiagnosticConsumerDetails['trigger'] = _event instanceof EventBubble ? 'dependency' : 'explicit'): this {\n if (this.destroyed) return this\n if (!this.mounted) return this.mount()\n if (this.updating) {\n this.updateRequested = true\n return this\n }\n\n this.updating = true\n const diagnosticEvent = Diagnostics.event(this, 'consumer', {\n parent: _event instanceof EventBubble ? _event : Diagnostics.currentEvent,\n cause: 'component render', outcome: 'started',\n consumer: {trigger},\n })\n const outerWrites = rendererWrites\n const writes = diagnosticEvent ? {count: 0} : null\n let renderPasses = 0\n rendererWrites = writes\n try {\n Diagnostics.withEvent(diagnosticEvent, () => {\n do {\n renderPasses += 1\n this.updateRequested = false\n const nextReads = new Set<Watchable>()\n this.collectingRenderReads = nextReads\n let nextVNode: NormalizedChild\n try {\n nextVNode = Diagnostics.withScope(this.diagnosticScope, () => normalizeRoot(this.render()))\n } finally {\n this.collectingRenderReads = null\n }\n this._rendered = patchRoot(this._rendered, nextVNode, this)\n this.dom = firstNode(this._rendered)\n this.reconcileRenderReads(nextReads)\n this.afterUpdate(this.dom)\n } while (this.updateRequested && !this.destroyed)\n })\n if (diagnosticEvent) Diagnostics.event(this, 'consumer', {\n parent: diagnosticEvent, cause: 'component rendered', outcome: 'succeeded',\n consumer: {trigger, domWrites: writes!.count, renderPasses},\n })\n } catch (error) {\n if (diagnosticEvent) Diagnostics.event(this, 'consumer', {\n parent: diagnosticEvent, cause: 'component render failed', outcome: 'failed', error,\n consumer: {trigger, domWrites: writes!.count, renderPasses},\n })\n throw error\n } finally {\n rendererWrites = outerWrites\n this.updating = false\n }\n return this\n }\n\n setProps(nextProps: TProps): this {\n if (nextProps == null || typeof nextProps !== 'object' || Array.isArray(nextProps)) {\n throw new TypeError(`${this.constructor.name} props must be an object`)\n }\n this.validateIslandAncestry(nextProps)\n this.props = nextProps\n if (this.mounted) this.update(undefined,\n Diagnostics.currentEvent?.diagnostic?.node.kind === 'binding' ? 'dependency' : 'parent')\n return this\n }\n\n afterMount(_dom: ChildNode | null): void {}\n afterUpdate(_dom: ChildNode | null): void {}\n\n watch(...observables: Watchable[]): this {\n for (const observable of observables) {\n if (observable == null || typeof observable.subscribe !== 'function') {\n throw new TypeError('watch requires emitter-like values')\n }\n if (this.watched.has(observable)) continue\n const unsubscribe = observable.subscribe(({event}) => {\n if (this.mounted && !this.destroyed) this.update(event)\n }, {emitCurrent: false, diagnosticTarget: this})\n this.watched.set(observable, unsubscribe)\n this.onCleanup(() => {\n unsubscribe()\n this.watched.delete(observable)\n })\n }\n return this\n }\n\n watchFutureValues(...observables: Watchable[]): this {\n return this.watch(...observables)\n }\n\n /** Read an emitter during render and rerender when that dependency changes. */\n read<TValue, TError>(emitter: ReadableEmitter<TValue, TError>): TValue {\n this.trackRenderRead(emitter)\n return emitter.get()\n }\n\n /** Read a Capillary value, fetch state, and error as one tracked render dependency. */\n snapshot<TValue, TError>(\n emitter: ReadableEmitter<TValue, TError>,\n ): EmitterSnapshot<TValue, TError> {\n this.trackRenderRead(emitter)\n return Object.freeze({\n value: emitter.get(),\n fetchState: emitter.getFetchState(),\n error: emitter.getError(),\n })\n }\n\n onCleanup(cleanup: () => void): () => void {\n if (typeof cleanup !== 'function') throw new TypeError('cleanup must be a function')\n if (this.destroyed) {\n cleanup()\n return () => {}\n }\n this.cleanupFunctions.add(cleanup)\n let active = true\n return () => {\n if (!active) return\n active = false\n this.cleanupFunctions.delete(cleanup)\n cleanup()\n }\n }\n\n /** Resolve one explicitly declared application service from this component's runtime. */\n protected requireService<TService>(key: ServiceKey<TService>): TService {\n if (!this.initialized) {\n throw new Error('Components may resolve services during initialize() or later')\n }\n const componentType = this.constructor as typeof Component\n if (!componentType.requiredServices.includes(key)) {\n throw new Error(\n `${componentType.name} must declare service \"${key.name}\" in requiredServices`,\n )\n }\n return this._runtime.services.require(key)\n }\n\n /** Read the immutable Capillary UI localization selected for this component's runtime. */\n protected get localization(): CapillaryUiLocalization {\n return this._runtime.localization\n }\n\n /** Resolve one Capillary UI-authored message with the runtime's English fallback. */\n protected capillaryUiMessage<TKey extends keyof CapillaryUiMessageOverrides>(\n key: TKey,\n ): CapillaryUiMessage<TKey> {\n return this.localization.message(key)\n }\n\n listen<TEvent extends Event = Event>(\n target: EventTarget,\n type: string,\n listener: (event: TEvent) => void,\n options?: boolean | AddEventListenerOptions,\n ): this {\n if (target == null || typeof target.addEventListener !== 'function') {\n throw new TypeError('listen target must be an EventTarget')\n }\n const subject = {}\n Diagnostics.configure(subject, {kind: 'interaction', label: `${componentDiagnosticLabel(this)}: ${type}`,\n scope: this.diagnosticScope})\n const eventListener: EventListener = (event) => runUiInteraction(subject, this.diagnosticScope,\n event, eventListener, type, () => listener(event as TEvent))\n target.addEventListener(type, eventListener, options)\n this.onCleanup(() => {\n target.removeEventListener(type, eventListener, options)\n Diagnostics.dispose(subject)\n })\n return this\n }\n\n /**\n * Like {@link listen}, but returns a function that detaches the listener.\n * Use for listeners that are only active some of the time — for example\n * an outside-click handler that exists only while a popup is open — so\n * they neither fire nor appear in the trace while inactive. The listener\n * runs through the same traced native-event coalescing as listen(), and\n * is removed on destroy if it is still attached.\n */\n protected listenWhile<TEvent extends Event = Event>(\n target: EventTarget,\n type: string,\n listener: (event: TEvent) => void,\n options?: boolean | AddEventListenerOptions,\n ): () => void {\n if (target == null || typeof target.addEventListener !== 'function') {\n throw new TypeError('listen target must be an EventTarget')\n }\n const subject = {}\n Diagnostics.configure(subject, {kind: 'interaction', label: `${componentDiagnosticLabel(this)}: ${type}`,\n scope: this.diagnosticScope})\n const eventListener: EventListener = (event) => runUiInteraction(subject, this.diagnosticScope,\n event, eventListener, type, () => listener(event as TEvent))\n let attached = false\n const detach = (): void => {\n if (!attached) return\n attached = false\n target.removeEventListener(type, eventListener, options)\n Diagnostics.dispose(subject)\n }\n // onCleanup returns a disposer that removes the registration *and*\n // runs detach. Returning it (rather than detach) means a manual detach\n // also drops the cleanupFunctions entry, so repeated attach/detach\n // cycles don't accumulate retained closures until destroy.\n const unregister = this.onCleanup(detach)\n if (!this.destroyed) {\n attached = true\n target.addEventListener(type, eventListener, options)\n }\n return unregister\n }\n\n registerChild<TComponent extends Component>(component: TComponent): TComponent {\n if (!(component instanceof Component)) {\n throw new TypeError('registerChild requires a Component')\n }\n this._childComponents.add(component)\n if (Diagnostics.active) Diagnostics.inspect(this)\n return component\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.mounted = false\n Diagnostics.dispose(this)\n\n for (const cleanup of [...this.cleanupFunctions]) cleanup()\n this.cleanupFunctions.clear()\n this.watched.clear()\n for (const unsubscribe of this.renderReadSubscriptions.values()) unsubscribe()\n this.renderReadSubscriptions.clear()\n this.collectingRenderReads = null\n\n if (this._rendered) disposeRecord(this._rendered, true)\n this._rendered = null\n this.dom = null\n this._childComponents.clear()\n this.onDestroy()\n }\n\n private validateRequiredServices(): void {\n const componentType = this.constructor as typeof Component\n for (const key of componentType.requiredServices) {\n if (!this._runtime.services.has(key)) {\n throw new Error(`${componentType.name} requires unregistered service \"${key.name}\"`)\n }\n }\n }\n\n private validateIslandAncestry(props: ComponentProps): void {\n if (!hasIslandTrait(props)) return\n if (this.hasIslandDescendant()) {\n throw new Error('An island component cannot contain another island')\n }\n let ancestor = this._parentComponent\n while (ancestor != null) {\n if (hasIslandTrait(ancestor.props)) {\n throw new Error('An island component cannot be nested inside another island')\n }\n ancestor = ancestor._parentComponent\n }\n }\n\n private hasIslandDescendant(): boolean {\n for (const child of this._childComponents) {\n if (hasIslandTrait(child.props) || child.hasIslandDescendant()) return true\n }\n return false\n }\n\n onDestroy(): void {}\n\n private trackRenderRead(emitter: ReadableEmitter<unknown, unknown>): void {\n assertReadableEmitter(emitter, 'Component.read')\n if (this.collectingRenderReads == null) {\n throw new Error('Component.read() and snapshot() may only be called during render()')\n }\n this.collectingRenderReads.add(emitter)\n }\n\n private reconcileRenderReads(nextReads: Set<Watchable>): void {\n for (const [emitter, unsubscribe] of this.renderReadSubscriptions) {\n if (nextReads.has(emitter)) continue\n unsubscribe()\n this.renderReadSubscriptions.delete(emitter)\n }\n for (const emitter of nextReads) {\n if (this.watched.has(emitter) || this.renderReadSubscriptions.has(emitter)) continue\n const unsubscribe = emitter.subscribe(({event}) => {\n if (this.mounted && !this.destroyed) this.update(event)\n }, {emitCurrent: false, diagnosticTarget: this})\n this.renderReadSubscriptions.set(emitter, unsubscribe)\n }\n }\n}\n\ninterface RecordBase {\n readonly kind: string\n key: Key | null\n owner: Component\n}\n\ninterface TextRecord extends RecordBase {\n readonly kind: 'text'\n value: string | number\n node: Text\n}\n\ninterface EmitterRecord extends RecordBase {\n readonly kind: 'emitter'\n source: ReadableEmitter<CapillaryUiChild, unknown>\n start: Comment\n end: Comment\n child: RenderRecord\n unsubscribe: () => void\n}\n\ninterface LivePropRecord {\n source: ReadableEmitter<unknown, unknown>\n value: unknown\n unsubscribe: () => void\n}\n\ninterface NativeBindingRecord extends LivePropRecord {\n eventName: 'input' | 'change'\n listener: EventListener\n}\n\ninterface ElementRecord extends RecordBase {\n readonly kind: 'element'\n type: string\n node: HTMLElement\n props: ComponentProps\n listeners: Map<string, EventListener>\n liveProps: Map<string, LivePropRecord>\n nativeBindings: Map<string, NativeBindingRecord>\n ref: Ref<HTMLElement> | null\n children: RenderRecord[]\n}\n\ninterface FragmentRecord extends RecordBase {\n readonly kind: 'fragment'\n type: typeof Fragment\n start: Comment\n end: Comment\n children: RenderRecord[]\n}\n\ninterface ComponentRecord extends RecordBase {\n readonly kind: 'component'\n type: Function\n instance: Component\n prebuilt: boolean\n props: ComponentProps\n liveProps: Map<string, LivePropRecord>\n}\n\ninterface FunctionRecord extends RecordBase {\n readonly kind: 'function'\n type: FunctionComponent\n props: ComponentProps\n sourceProps: ComponentProps\n liveProps: Map<string, LivePropRecord>\n child: RenderRecord\n diagnosticSubject: object | null\n}\n\ntype RenderRecord =\n | TextRecord\n | EmitterRecord\n | ElementRecord\n | FragmentRecord\n | ComponentRecord\n | FunctionRecord\n\nfunction normalizeRoot(value: CapillaryUiChild): NormalizedChild {\n if (Array.isArray(value)) return h(Fragment, null, value)\n if (value == null || typeof value === 'boolean') return h(Fragment)\n return value as NormalizedChild\n}\n\nfunction normalizeChildren(values: CapillaryUiChild | readonly CapillaryUiChild[]): NormalizedChild[] {\n const normalized: NormalizedChild[] = []\n const visit = (value: CapillaryUiChild): void => {\n if (Array.isArray(value)) {\n for (const child of value) visit(child)\n } else if (value != null && typeof value !== 'boolean') {\n normalized.push(value as NormalizedChild)\n }\n }\n visit(values)\n return normalized\n}\n\nfunction createRecord(value: NormalizedChild, owner: Component): RenderRecord {\n if (typeof value === 'string' || typeof value === 'number') {\n return {\n kind: 'text',\n key: null,\n value,\n node: document.createTextNode(String(value)),\n owner,\n }\n }\n\n if (isReadableEmitter(value)) {\n const start = document.createComment('cap-emitter-start')\n const end = document.createComment('cap-emitter-end')\n const current = value.get()\n if (Object.is(current, value)) {\n throw new TypeError('A Capillary UI emitter child cannot render itself')\n }\n const fragment = document.createDocumentFragment()\n fragment.append(start, end)\n recordRendererWrite(); recordRendererWrite()\n const child = createRecord(normalizeRoot(current), owner)\n insertRecord(fragment, child, end)\n const record: EmitterRecord = {\n kind: 'emitter',\n key: null,\n source: value,\n start,\n end,\n child,\n unsubscribe: () => {},\n owner,\n }\n record.unsubscribe = subscribeUi(value, record, owner, 'reactive child', (nextValue) => {\n if (Object.is(nextValue, value)) {\n throw new TypeError('A Capillary UI emitter child cannot render itself')\n }\n record.child = patchRoot(record.child, normalizeRoot(nextValue), owner)\n })\n return record\n }\n\n if (value instanceof Component) {\n value._setRuntime(owner._runtime)\n value._setRouteContext(owner._routeContextForChildren())\n value._setParentComponent(owner)\n value.mount()\n owner.registerChild(value)\n return {\n kind: 'component',\n key: readKey(value.props),\n type: value.constructor,\n instance: value,\n prebuilt: true,\n props: value.props,\n liveProps: new Map(),\n owner,\n }\n }\n\n if (!isVNode(value)) {\n throw new TypeError(`Invalid Capillary UI child: ${describeValue(value)}`)\n }\n\n const {type, key = null, props} = value\n if (type === Fragment) {\n const start = document.createComment('cap-fragment-start')\n const end = document.createComment('cap-fragment-end')\n const record: FragmentRecord = {\n kind: 'fragment',\n key,\n type,\n start,\n end,\n children: [],\n owner,\n }\n const fragment = document.createDocumentFragment()\n fragment.append(start, end)\n recordRendererWrite(); recordRendererWrite()\n record.children = patchChildren(\n fragment,\n [],\n props.children,\n owner,\n end,\n start,\n )\n return record\n }\n\n if (typeof type === 'string') {\n const node = document.createElement(type)\n const record: ElementRecord = {\n kind: 'element',\n key,\n type,\n node,\n props: {},\n listeners: new Map(),\n liveProps: new Map(),\n nativeBindings: new Map(),\n ref: null,\n children: [],\n owner,\n }\n patchElementProps(record, props)\n record.children = patchChildren(node, [], props.children, owner)\n return record\n }\n\n if (isComponentClass(type)) {\n const sourceProps = props as ComponentProps\n assertSupportedComponentLiveProps(type, sourceProps)\n const resolvedProps = resolveLivePropValues(sourceProps)\n const instance = Diagnostics.withScope((type as typeof Component).diagnosticScope ?? owner.diagnosticScope,\n () => new type(resolvedProps as never))\n instance._setRuntime(owner._runtime)\n instance._setRouteContext(owner._routeContextForChildren())\n instance._setParentComponent(owner)\n const record: ComponentRecord = {\n kind: 'component',\n key,\n type,\n instance,\n prebuilt: false,\n props: resolvedProps,\n liveProps: new Map(),\n owner,\n }\n subscribeComponentLiveProps(record, sourceProps)\n instance.mount()\n owner.registerChild(instance)\n return record\n }\n\n if (typeof type === 'function') {\n const functionType = type as FunctionComponent\n const sourceProps = props as ComponentProps\n const functionProps = resolveLivePropValues(sourceProps)\n const diagnosticSubject = functionType === Reflect.get(owner, 'Host') ? null : {}\n if (diagnosticSubject) Diagnostics.configure(diagnosticSubject, {kind: 'component',\n label: String(Reflect.get(functionType, 'diagnosticLabel') ?? functionType.name ?? 'Function component'),\n scope: owner.diagnosticScope, sources: [owner]})\n const child = renderFunction(diagnosticSubject, () => createRecord(normalizeRoot(functionType(functionProps)), owner))\n const record: FunctionRecord = {\n kind: 'function',\n key,\n type: functionType,\n props: functionProps,\n sourceProps,\n liveProps: new Map(),\n child,\n diagnosticSubject,\n owner,\n }\n subscribeFunctionLiveProps(record)\n return record\n }\n\n throw new TypeError(`Unsupported vnode type: ${describeValue(type)}`)\n}\n\nfunction patchRoot(\n previous: RenderRecord | null,\n value: NormalizedChild,\n owner: Component,\n): RenderRecord {\n if (previous == null) return createRecord(value, owner)\n if (isCompatible(previous, value)) return patchCompatible(previous, value, owner)\n\n const next = createRecord(value, owner)\n const anchor = firstNode(previous)\n const parent = anchor?.parentNode ?? null\n if (parent) insertRecord(parent, next, anchor)\n disposeRecord(previous, true)\n return next\n}\n\nfunction patchCompatible(\n record: RenderRecord,\n value: NormalizedChild,\n owner: Component,\n): RenderRecord {\n if (record.kind === 'text') {\n if (typeof value !== 'string' && typeof value !== 'number') return record\n if (!Object.is(record.value, value)) {\n record.value = value\n record.node.data = String(value)\n recordRendererWrite()\n }\n return record\n }\n\n if (record.kind === 'emitter') {\n if (!isReadableEmitter(value) || record.source !== value) return record\n return record\n }\n\n if (record.kind === 'component') {\n if (value instanceof Component) return record\n if (isVNode(value)) patchComponentLiveProps(record, value.props)\n return record\n }\n\n if (!isVNode(value)) return record\n\n if (record.kind === 'function') {\n patchFunctionLiveProps(record, value.props)\n return record\n }\n\n if (record.kind === 'fragment') {\n record.children = patchChildren(\n record.start.parentNode,\n record.children,\n value.props.children,\n owner,\n record.end,\n record.start,\n )\n return record\n }\n\n patchElementProps(record, value.props)\n record.children = patchChildren(\n record.node,\n record.children,\n value.props.children,\n owner,\n )\n return record\n}\n\nfunction resolveLivePropValues(sourceProps: ComponentProps): ComponentProps {\n return Object.fromEntries(Object.entries(sourceProps).map(([key, value]) => [\n key,\n isLiveBinding(value) ? value.emitter.get() : value,\n ]))\n}\n\nfunction subscribeComponentLiveProps(\n record: ComponentRecord,\n sourceProps: ComponentProps,\n): void {\n reconcileLiveProps(record.liveProps, sourceProps, record.instance, componentDiagnosticLabel(record.instance), (key, value) => {\n record.props = {...record.props, [key]: value}\n record.instance.setProps(record.props)\n })\n record.props = resolvedLiveProps(record.liveProps, sourceProps)\n record.instance.setProps(record.props)\n}\n\nfunction patchComponentLiveProps(record: ComponentRecord, sourceProps: ComponentProps): void {\n assertSupportedComponentLiveProps(record.type, sourceProps)\n subscribeComponentLiveProps(record, sourceProps)\n}\n\nfunction assertSupportedComponentLiveProps(\n componentType: Function,\n sourceProps: ComponentProps,\n): void {\n const declared = Reflect.get(componentType, 'liveProps') as unknown\n if (declared == null) return\n if (!Array.isArray(declared) || declared.some((name) => typeof name !== 'string')) {\n throw new TypeError(`${componentType.name || 'Component'}.liveProps must be an array`)\n }\n const supported = new Set<string>(declared)\n for (const [name, value] of Object.entries(sourceProps)) {\n if (isLiveBinding(value) && !supported.has(name)) {\n throw new TypeError(\n `${componentType.name || 'Component'} prop \"${name}\" does not support live()`,\n )\n }\n }\n}\n\nfunction subscribeFunctionLiveProps(record: FunctionRecord): void {\n reconcileLiveProps(record.liveProps, record.sourceProps, record.owner, record.type.diagnosticLabel ?? record.type.name, (key, value) => {\n record.props = {...record.props, [key]: value}\n rerenderFunctionRecord(record, 'dependency')\n })\n record.props = resolvedLiveProps(record.liveProps, record.sourceProps)\n}\n\nfunction patchFunctionLiveProps(record: FunctionRecord, sourceProps: ComponentProps): void {\n record.sourceProps = sourceProps\n reconcileLiveProps(record.liveProps, sourceProps, record.owner, record.type.diagnosticLabel ?? record.type.name, (key, value) => {\n record.props = {...record.props, [key]: value}\n rerenderFunctionRecord(record, 'dependency')\n })\n record.props = resolvedLiveProps(record.liveProps, sourceProps)\n rerenderFunctionRecord(record)\n}\n\nfunction rerenderFunctionRecord(record: FunctionRecord, trigger: DiagnosticConsumerDetails['trigger'] = 'parent'): void {\n renderFunction(record.diagnosticSubject, () => {\n const rendered = normalizeRoot(record.type(record.props))\n record.child = patchRoot(record.child, rendered, record.owner)\n }, trigger)\n}\n\nfunction renderFunction<T>(subject: object | null, render: () => T, trigger: DiagnosticConsumerDetails['trigger'] = 'parent'): T {\n if (!subject) return render()\n const event = Diagnostics.event(subject, 'consumer', {cause: 'function component render', outcome: 'started', consumer: {trigger}})\n const outerWrites = rendererWrites\n const writes = event ? {count: 0} : null\n rendererWrites = writes\n try {\n const result = event ? Diagnostics.withEvent(event, render) : render()\n if (event) Diagnostics.event(subject, 'consumer', {parent: event, cause: 'function component rendered', outcome: 'succeeded', consumer: {trigger, domWrites: writes!.count, renderPasses: 1}})\n return result\n } catch (error) {\n if (event) Diagnostics.event(subject, 'consumer', {parent: event, cause: 'function component failed', outcome: 'failed', error, consumer: {trigger, domWrites: writes!.count, renderPasses: 1}})\n throw error\n } finally { rendererWrites = outerWrites }\n}\n\nfunction reconcileLiveProps(\n subscriptions: Map<string, LivePropRecord>,\n sourceProps: ComponentProps,\n owner: Component,\n label: string,\n onValue: (key: string, value: unknown) => void,\n): void {\n for (const [key, existing] of subscriptions) {\n const next = sourceProps[key]\n if (isLiveBinding(next) && next.emitter === existing.source) continue\n existing.unsubscribe()\n subscriptions.delete(key)\n }\n\n for (const [key, value] of Object.entries(sourceProps)) {\n if (!isLiveBinding(value) || subscriptions.has(key)) continue\n const liveProp: LivePropRecord = {\n source: value.emitter,\n value: value.emitter.get(),\n unsubscribe: () => {},\n }\n liveProp.unsubscribe = subscribeUi(value.emitter, liveProp, owner, `${label}.${key}`, (nextValue) => {\n if (subscriptions.get(key) !== liveProp) return\n liveProp.value = nextValue\n onValue(key, nextValue)\n })\n subscriptions.set(key, liveProp)\n }\n}\n\nfunction resolvedLiveProps(\n subscriptions: Map<string, LivePropRecord>,\n sourceProps: ComponentProps,\n): ComponentProps {\n return Object.fromEntries(Object.entries(sourceProps).map(([key, value]) => [\n key,\n isLiveBinding(value) ? subscriptions.get(key)?.value ?? value.emitter.get() : value,\n ]))\n}\n\nfunction patchChildren(\n parent: ParentNode | null,\n previous: RenderRecord[],\n values: CapillaryUiChild | readonly CapillaryUiChild[],\n owner: Component,\n end: Node | null = null,\n start: Node | null = null,\n): RenderRecord[] {\n if (parent == null) throw new Error('Cannot patch a detached fragment range')\n const nextValues = normalizeChildren(values)\n const keyed = new Map<Key, RenderRecord>()\n const unkeyed: RenderRecord[] = []\n for (const record of previous) {\n if (record.key == null) unkeyed.push(record)\n else if (!keyed.has(record.key)) keyed.set(record.key, record)\n }\n\n const seenKeys = new Set<Key>()\n const retained = new Set<RenderRecord>()\n const nextRecords: RenderRecord[] = []\n let unkeyedIndex = 0\n\n for (const value of nextValues) {\n const key = valueKey(value)\n if (key != null) {\n if (seenKeys.has(key)) throw new Error(`Duplicate sibling key: ${String(key)}`)\n seenKeys.add(key)\n }\n const candidate = key == null\n ? unkeyed[unkeyedIndex++]\n : keyed.get(key)\n if (candidate && isCompatible(candidate, value)) {\n retained.add(candidate)\n nextRecords.push(patchCompatible(candidate, value, owner))\n } else {\n nextRecords.push(createRecord(value, owner))\n }\n }\n\n for (const record of previous) {\n if (!retained.has(record)) disposeRecord(record, true)\n }\n\n let cursor = start ? start.nextSibling : parent.firstChild\n for (const record of nextRecords) {\n for (const node of recordNodes(record)) {\n if (node === cursor) {\n cursor = cursor.nextSibling\n } else {\n parent.insertBefore(node, cursor ?? end)\n recordRendererWrite()\n cursor = node.nextSibling\n }\n }\n }\n\n return nextRecords\n}\n\nfunction patchElementProps(record: ElementRecord, nextProps: ComponentProps): void {\n const next = Object.fromEntries(Object.entries(nextProps).filter(([key]) =>\n key !== 'children' && normalizeAttributeName(key) !== CAPILLARY_UI_RENDERER_ATTRIBUTE,\n )) as ComponentProps\n const previous = record.props\n const keys = new Set([...Object.keys(previous), ...Object.keys(next)])\n\n for (const property of ['value', 'checked'] as const) {\n if (Object.hasOwn(next, property) && Object.hasOwn(next, `bind:${property}`)) {\n throw new Error(`${property} and bind:${property} cannot be used together`)\n }\n }\n\n for (const key of keys) {\n const previousValue = previous[key]\n const nextValue = next[key]\n if (isNativeBindingProp(key)) {\n patchNativeBinding(record, key, nextValue)\n } else if (key === 'ref') {\n if (previousValue !== nextValue) patchRef(record, nextValue)\n } else if (isEventProp(key)) {\n patchEvent(record, key, nextValue)\n } else if (isLiveBinding(nextValue)) {\n patchLiveElementProp(record, key, nextValue)\n } else {\n const previousLive = record.liveProps.get(key)\n if (previousLive) {\n previousLive.unsubscribe()\n record.liveProps.delete(key)\n }\n const previousResolved = previousLive?.value ?? previousValue\n if (!Object.is(previousResolved, nextValue)) {\n patchDOMProp(record.node, key, previousResolved, nextValue)\n }\n }\n }\n setAttribute(record.node, CAPILLARY_UI_RENDERER_ATTRIBUTE, '')\n record.props = {...next}\n}\n\nfunction patchLiveElementProp(\n record: ElementRecord,\n key: string,\n binding: LiveBinding<unknown>,\n): void {\n const existing = record.liveProps.get(key)\n if (existing?.source === binding.emitter) return\n\n existing?.unsubscribe()\n const value = binding.emitter.get()\n patchDOMProp(record.node, key, existing?.value ?? record.props[key], value)\n const liveProp: LivePropRecord = {\n source: binding.emitter,\n value,\n unsubscribe: () => {},\n }\n liveProp.unsubscribe = subscribeUi(binding.emitter, liveProp, record.owner, `${record.type}.${key}`, (nextValue) => {\n const previousValue = liveProp.value\n liveProp.value = nextValue\n if (!Object.is(previousValue, nextValue)) {\n patchDOMProp(record.node, key, previousValue, nextValue)\n }\n })\n record.liveProps.set(key, liveProp)\n}\n\nfunction patchNativeBinding(\n record: ElementRecord,\n key: 'bind:value' | 'bind:checked',\n next: unknown,\n): void {\n const property = key.slice(5) as 'value' | 'checked'\n const existing = record.nativeBindings.get(key)\n if (next == null) {\n if (existing) {\n existing.unsubscribe()\n record.node.removeEventListener(existing.eventName, existing.listener)\n record.nativeBindings.delete(key)\n patchDOMProp(record.node, property, existing.value, undefined)\n }\n return\n }\n assertWritableEmitter(next, key)\n if (existing?.source === next) return\n\n if (existing) {\n existing.unsubscribe()\n record.node.removeEventListener(existing.eventName, existing.listener)\n }\n assertNativeBindingTarget(record.node, property)\n const eventName = nativeBindingEvent(record.node, property)\n const value = next.get()\n patchDOMProp(record.node, property, existing?.value, value)\n const listener: EventListener = (event) => {\n runUiInteraction(interactionSubject(record, eventName), record.owner.diagnosticScope,\n event, listener, `${key} changed`, () => next.set(Reflect.get(record.node, property), `${key} changed`))\n }\n const binding: NativeBindingRecord = {\n source: next,\n value,\n eventName,\n listener,\n unsubscribe: () => {},\n }\n binding.unsubscribe = subscribeUi(next, binding, record.owner, `${record.type}.${key}`, (nextValue) => {\n const previousValue = binding.value\n binding.value = nextValue\n if (!Object.is(previousValue, nextValue)) {\n patchDOMProp(record.node, property, previousValue, nextValue)\n }\n })\n record.node.addEventListener(eventName, listener)\n record.nativeBindings.set(key, binding)\n}\n\nfunction patchEvent(record: ElementRecord, key: string, next: unknown): void {\n const eventName = key.slice(2).toLowerCase()\n const registered = record.listeners.get(key)\n const previous = registered ? originalListeners.get(registered) ?? registered : null\n if (registered && previous !== next) {\n record.node.removeEventListener(eventName, registered)\n record.listeners.delete(key)\n }\n if (next != null && typeof next !== 'function') {\n throw new TypeError(`${key} must be a function or null`)\n }\n if (typeof next === 'function' && previous !== next) {\n const listener: EventListener = (event) => runUiInteraction(interactionSubject(record, eventName),\n record.owner.diagnosticScope, event, listener, eventName, () => (next as EventListener).call(record.node, event))\n originalListeners.set(listener, next)\n record.node.addEventListener(eventName, listener)\n record.listeners.set(key, listener)\n }\n}\n\nconst interactions = new WeakMap<ElementRecord, Map<string, object>>()\nconst originalListeners = new WeakMap<EventListener, Function>()\nconst nativeInteractions = new WeakMap<Event, {event: EventBubble<unknown> | null; listeners: Set<object>}>()\n\nfunction runUiInteraction<T>(subject: object, scope: DiagnosticScope, native: Event, listener: object,\n cause: string, action: () => T): T {\n return Diagnostics.withScope(scope, () => {\n if (!Diagnostics.active) return action()\n let interaction = nativeInteractions.get(native)\n if (!interaction || interaction.listeners.has(listener)) {\n interaction = {event: Diagnostics.event(subject, 'interaction', {cause, outcome: 'started'}), listeners: new Set()}\n nativeInteractions.set(native, interaction)\n queueMicrotask(() => nativeInteractions.delete(native))\n }\n interaction.listeners.add(listener)\n return Diagnostics.withEvent(interaction.event, action)\n })\n}\n\nfunction interactionSubject(record: ElementRecord, type: string): object {\n let subjects = interactions.get(record)\n if (!subjects) { subjects = new Map(); interactions.set(record, subjects) }\n let subject = subjects.get(type)\n if (!subject) {\n subject = {}\n const name = record.node.getAttribute('aria-label') ?? record.node.getAttribute('name')\n ?? record.node.textContent?.trim().slice(0, 80) ?? ''\n Diagnostics.configure(subject, {kind: 'interaction',\n label: `${componentDiagnosticLabel(record.owner)}: ${record.type} ${name} ${type}`.trim(),\n scope: record.owner.diagnosticScope})\n subjects.set(type, subject)\n }\n return subject\n}\n\nfunction subscribeUi<T>(\n source: ReadableEmitter<T, unknown>, subject: object, owner: Component, label: string,\n onValue: (value: T) => void,\n): () => void {\n Diagnostics.configure(subject, {kind: 'binding', label: `${componentDiagnosticLabel(owner)}: ${label}`,\n scope: owner.diagnosticScope, sources: [source]})\n const unsubscribe = source.subscribe(({value, event}) => {\n const consumed = Diagnostics.event(subject, 'consumer', {parent: event,\n cause: 'binding update', value, outcome: 'started', consumer: {trigger: 'dependency'}})\n const outerWrites = rendererWrites\n const writes = consumed ? {count: 0} : null\n rendererWrites = writes\n try {\n Diagnostics.withEvent(consumed, () => onValue(value))\n if (consumed) Diagnostics.event(subject, 'consumer', {parent: consumed,\n cause: 'binding updated', value, outcome: 'succeeded', consumer: {trigger: 'dependency', domWrites: writes!.count}})\n } catch (error) {\n if (consumed) Diagnostics.event(subject, 'consumer', {parent: consumed,\n cause: 'binding update failed', outcome: 'failed', error, consumer: {trigger: 'dependency', domWrites: writes!.count}})\n throw error\n } finally { rendererWrites = outerWrites }\n }, {emitCurrent: false, diagnosticTarget: subject})\n return () => { unsubscribe(); Diagnostics.dispose(subject) }\n}\n\nfunction componentDiagnosticLabel(component: Component): string {\n return component.diagnosticLabel\n}\n\nfunction patchRef(record: ElementRecord, next: unknown): void {\n applyRef(record.ref, null)\n if (next != null && typeof next !== 'function' && typeof next !== 'object') {\n throw new TypeError('ref must be a function, object, or null')\n }\n record.ref = next as Ref<HTMLElement> | null\n applyRef(record.ref, record.node)\n}\n\nfunction patchDOMProp(\n node: HTMLElement,\n key: string,\n previous: unknown,\n next: unknown,\n): void {\n if (key === 'class' || key === 'className') {\n setAttribute(node, 'class', next)\n return\n }\n if (key === 'for' || key === 'htmlFor') {\n setAttribute(node, 'for', next)\n return\n }\n if (key === 'dataset') {\n patchDataset(node, previous, next)\n return\n }\n if (key === 'style') {\n patchStyle(node, previous, next)\n return\n }\n if (key === 'dangerouslySetInnerHTML') {\n throw new Error('dangerouslySetInnerHTML is not supported')\n }\n\n const property = normalizePropertyName(key)\n if (BOOLEAN_ATTRIBUTES.has(property)) {\n const enabled = Boolean(next)\n if (property in node && Reflect.get(node, property) !== enabled) {\n Reflect.set(node, property, enabled)\n recordRendererWrite()\n }\n setAttribute(node, normalizeAttributeName(key), enabled)\n return\n }\n // `<option value=\"\">` is semantically distinct from omitting `value`:\n // without the attribute, browsers use the option's label as its value.\n // Preserve an explicit empty sentinel for required selects.\n if (property === 'value' && node.localName === 'option') {\n setAttribute(node, normalizeAttributeName(key), next)\n return\n }\n if (PROPERTY_PROPS.has(property) && property in node) {\n const value = next ?? (property === 'value' ? '' : false)\n if (!Object.is(Reflect.get(node, property), value)) {\n Reflect.set(node, property, value)\n recordRendererWrite()\n }\n if (next == null) setAttribute(node, normalizeAttributeName(key), null)\n return\n }\n\n setAttribute(node, normalizeAttributeName(key), next)\n}\n\nfunction patchDataset(node: HTMLElement, previous: unknown, next: unknown): void {\n const oldValues = toPropertyRecord(previous, 'dataset')\n const newValues = toPropertyRecord(next, 'dataset')\n for (const key of new Set([...Object.keys(oldValues), ...Object.keys(newValues)])) {\n const value = newValues[key]\n if (node.dataset[key] === (value == null ? undefined : String(value))) continue\n if (value == null) delete node.dataset[key]\n else node.dataset[key] = String(value)\n recordRendererWrite()\n }\n}\n\nfunction patchStyle(node: HTMLElement, previous: unknown, next: unknown): void {\n if (typeof next === 'string') {\n if (node.style.cssText !== next) { node.style.cssText = next; recordRendererWrite() }\n return\n }\n const oldValues = typeof previous === 'string'\n ? {}\n : toPropertyRecord(previous, 'style')\n const newValues = toPropertyRecord(next, 'style')\n if (typeof previous === 'string' && node.style.cssText !== '') { node.style.cssText = ''; recordRendererWrite() }\n for (const key of new Set([...Object.keys(oldValues), ...Object.keys(newValues)])) {\n const value = newValues[key]\n if (key.startsWith('--')) {\n if (node.style.getPropertyValue(key) === (value == null ? '' : String(value))) continue\n if (value == null) node.style.removeProperty(key)\n else node.style.setProperty(key, String(value))\n } else {\n if (Reflect.get(node.style, key) === (value == null ? '' : String(value))) continue\n Reflect.set(node.style, key, value == null ? '' : String(value))\n }\n recordRendererWrite()\n }\n}\n\nfunction toPropertyRecord(value: unknown, label: string): Record<string, unknown> {\n if (value == null) return {}\n if (typeof value !== 'object' || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object or null`)\n }\n return value as Record<string, unknown>\n}\n\nfunction setAttribute(node: HTMLElement, name: string, value: unknown): void {\n const next = value == null || value === false ? null : value === true ? '' : String(value)\n if (node.getAttribute(name) === next) return\n if (next === null) node.removeAttribute(name)\n else node.setAttribute(name, next)\n recordRendererWrite()\n}\n\nfunction normalizePropertyName(key: string): string {\n if (key === 'readonly') return 'readOnly'\n if (key === 'autofocus') return 'autoFocus'\n return key\n}\n\nfunction normalizeAttributeName(key: string): string {\n if (key === 'className') return 'class'\n if (key === 'htmlFor') return 'for'\n if (key === 'minLength') return 'minlength'\n if (key === 'maxLength') return 'maxlength'\n if (key === 'autoComplete') return 'autocomplete'\n if (key === 'inputMode') return 'inputmode'\n if (/^aria[A-Z]/.test(key)) return camelToKebab(key)\n if (/^data[A-Z]/.test(key)) return camelToKebab(key)\n return key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)\n}\n\nfunction camelToKebab(value: string): string {\n return value.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)\n}\n\nfunction applyRef<TNode extends Node>(ref: Ref<TNode> | null, value: TNode | null): void {\n if (ref == null) return\n if (typeof ref === 'function') ref(value)\n else ref.current = value\n}\n\nfunction disposeRecord(record: RenderRecord, removeNodes: boolean): void {\n if (record.kind === 'emitter') {\n record.unsubscribe()\n disposeRecord(record.child, false)\n if (removeNodes) {\n for (const node of recordNodes(record)) removeRenderedNode(node)\n }\n return\n }\n if (record.kind === 'component') {\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n record.owner._childComponents.delete(record.instance)\n record.instance.destroy()\n return\n }\n if (record.kind === 'function') {\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n if (record.diagnosticSubject) Diagnostics.dispose(record.diagnosticSubject)\n disposeRecord(record.child, removeNodes)\n return\n }\n if (record.kind === 'element') {\n applyRef(record.ref, null)\n for (const [key, listener] of record.listeners) {\n record.node.removeEventListener(key.slice(2).toLowerCase(), listener)\n }\n record.listeners.clear()\n for (const binding of record.liveProps.values()) binding.unsubscribe()\n record.liveProps.clear()\n for (const binding of record.nativeBindings.values()) {\n binding.unsubscribe()\n record.node.removeEventListener(binding.eventName, binding.listener)\n }\n record.nativeBindings.clear()\n for (const child of record.children) disposeRecord(child, false)\n if (removeNodes) removeRenderedNode(record.node)\n return\n }\n if (record.kind === 'fragment') {\n for (const child of record.children) disposeRecord(child, false)\n if (removeNodes) {\n for (const node of recordNodes(record)) removeRenderedNode(node)\n }\n return\n }\n if (removeNodes) removeRenderedNode(record.node)\n}\n\nfunction removeRenderedNode(node: ChildNode): void {\n if (node.parentNode) { node.remove(); recordRendererWrite() }\n}\n\nfunction insertRecord(parent: ParentNode, record: RenderRecord | null, before: Node | null = null): void {\n if (record == null) return\n for (const node of recordNodes(record)) {\n if (node.parentNode === parent && node.nextSibling === before) continue\n parent.insertBefore(node, before)\n recordRendererWrite()\n }\n}\n\nfunction recordNodes(record: RenderRecord | null): ChildNode[] {\n if (record == null) return []\n if (record.kind === 'text' || record.kind === 'element') return [record.node]\n if (record.kind === 'component') return recordNodes(record.instance._rendered)\n if (record.kind === 'function') return recordNodes(record.child)\n\n const nodes: ChildNode[] = []\n let node: ChildNode | null = record.start\n while (node) {\n nodes.push(node)\n if (node === record.end) break\n node = node.nextSibling\n }\n return nodes\n}\n\nfunction firstNode(record: RenderRecord | null): ChildNode | null {\n return recordNodes(record)[0] ?? null\n}\n\nfunction valueKey(value: NormalizedChild): Key | null {\n if (value instanceof Component) return readKey(value.props)\n return isVNode(value) ? value.key : null\n}\n\nfunction readKey(props: ComponentProps): Key | null {\n const key = props.key\n return typeof key === 'string' || typeof key === 'number' ? key : null\n}\n\nfunction isCompatible(record: RenderRecord, value: NormalizedChild): boolean {\n if (record.kind === 'text') {\n return typeof value === 'string' || typeof value === 'number'\n }\n if (record.kind === 'emitter') {\n return isReadableEmitter(value) && record.source === value\n }\n if (record.kind === 'component') {\n if (value instanceof Component) return record.instance === value\n return isVNode(value)\n && isComponentClass(value.type)\n && record.type === value.type\n && record.key === valueKey(value)\n }\n if (record.kind === 'function') {\n return isVNode(value)\n && record.type === value.type\n && record.key === valueKey(value)\n }\n if (record.kind === 'fragment') {\n return isVNode(value)\n && value.type === Fragment\n && record.key === valueKey(value)\n }\n return isVNode(value)\n && typeof value.type === 'string'\n && record.type === value.type\n && record.key === valueKey(value)\n}\n\nexport function isVNode(value: unknown): value is VNode {\n return value != null\n && typeof value === 'object'\n && Object.hasOwn(value, 'type')\n}\n\nfunction isComponentClass(value: unknown): value is AnyComponentConstructor {\n return typeof value === 'function'\n && (value === Component || value.prototype instanceof Component)\n}\n\nfunction isEventProp(key: string): boolean {\n return /^on[A-Z]/.test(key)\n}\n\nfunction isNativeBindingProp(key: string): key is 'bind:value' | 'bind:checked' {\n return key === 'bind:value' || key === 'bind:checked'\n}\n\nfunction isLiveBinding(value: unknown): value is LiveBinding<unknown> {\n return value != null\n && typeof value === 'object'\n && liveBindingValues.has(value)\n}\n\nfunction isReadableEmitter(value: unknown): value is ReadableEmitter<CapillaryUiChild, unknown> {\n if ((typeof value !== 'object' || value == null) && typeof value !== 'function') return false\n return typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction assertReadableEmitter(\n value: unknown,\n label: string,\n): asserts value is ReadableEmitter<unknown, unknown> {\n if (!isReadableEmitter(value)) throw new TypeError(`${label} requires a readable emitter`)\n}\n\nfunction assertWritableEmitter(\n value: unknown,\n label: string,\n): asserts value is WritableEmitter<unknown, unknown> {\n assertReadableEmitter(value, label)\n if (typeof Reflect.get(value, 'set') !== 'function') {\n throw new TypeError(`${label} requires a writable emitter`)\n }\n}\n\nfunction assertNativeBindingTarget(\n node: HTMLElement,\n property: 'value' | 'checked',\n): void {\n const tagName = node.localName\n const valid = property === 'checked'\n ? tagName === 'input'\n : tagName === 'input' || tagName === 'textarea' || tagName === 'select'\n if (!valid) throw new TypeError(`bind:${property} is not supported on ${tagName}`)\n}\n\nfunction nativeBindingEvent(\n node: HTMLElement,\n property: 'value' | 'checked',\n): 'input' | 'change' {\n return property === 'value' && node.localName !== 'select' ? 'input' : 'change'\n}\n\nfunction assertParentNode(value: unknown): asserts value is ParentNode {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'insertBefore') !== 'function') {\n throw new TypeError('Component parent must be a DOM ParentNode')\n }\n}\n\nfunction describeValue(value: unknown): string {\n try {\n return String(value)\n } catch {\n return Object.prototype.toString.call(value)\n }\n}\n\ninterface StyleOwner {\n css?: string\n dependencies?: ComponentDependency[]\n}\n\nfunction componentStyleChain(concrete: StyleOwner): StyleOwner[] {\n const chain: StyleOwner[] = []\n let owner: object | null = concrete\n while (owner != null && typeof owner === 'function') {\n chain.unshift(owner as unknown as StyleOwner)\n if (owner === Component) break\n owner = Object.getPrototypeOf(owner)\n }\n return chain\n}\n\nfunction mergeClassNames(...values: unknown[]): string {\n return [...new Set(values\n .flatMap((value) => typeof value === 'string' ? value.split(/\\s+/) : [])\n .filter(Boolean))]\n .join(' ')\n}\n\nfunction hasIslandTrait(props: ComponentProps): boolean {\n if (props.island === true) return true\n const className = props.className ?? props.class\n return typeof className === 'string' && className.split(/\\s+/).includes('island')\n}\n","import {\n Component,\n Fragment,\n h,\n} from './Components/component.js'\nimport type {\n ComponentProps,\n CapillaryUiIntrinsicElements,\n CapillaryUiChild,\n Key,\n TemplateProps,\n VNode,\n VNodeType,\n} from './Components/component.js'\n\nexport {Fragment}\n\nexport function jsx<TProps extends ComponentProps>(\n type: VNodeType<TProps>,\n props: TemplateProps<TProps> | null,\n key?: Key,\n): VNode<TProps> {\n const nextProps: TemplateProps<TProps> = props == null\n ? {} as TemplateProps<TProps>\n : {...props}\n if (key !== undefined) nextProps.key = key\n return h(type, nextProps)\n}\n\nexport const jsxs = jsx\nexport const jsxDEV = jsx\n\n/** Preserve an explicitly constructed component instance in a vnode tree. */\nexport function createPrebuiltElement<TComponent extends Component>(\n component: TComponent,\n): TComponent {\n if (!(component instanceof Component)) {\n throw new TypeError('createPrebuiltElement requires a Component instance')\n }\n return component\n}\n\nexport namespace JSX {\n export type Element = VNode | Component\n export interface ElementClass extends Component {}\n export interface ElementAttributesProperty {\n props: {}\n }\n export interface ElementChildrenAttribute {\n children: {}\n }\n export interface IntrinsicAttributes {\n key?: Key\n }\n export type LibraryManagedAttributes<_TComponent, TProps extends ComponentProps> =\n TemplateProps<TProps>\n export type IntrinsicElements = CapillaryUiIntrinsicElements\n}\n\n// Used by declaration consumers that construct children without JSX.\nexport type JSXChild = CapillaryUiChild\n","import {FetchState} from '@capillaryjs/capillary'\nimport {Button, Component, Placeholder, css} from '@capillaryjs/capillary-ui'\nimport type {ComponentProps, CapillaryUiChild} from '@capillaryjs/capillary-ui'\n\nimport type {BlockNode, BlockPath} from '../block.js'\nimport {BlockSelectionModel, findBlock} from '../block.js'\nimport {categoryColorVariables} from '../grouping.js'\n\nconst fallbackCategoryColors = [\n 'var(--colored-dark)',\n 'var(--colored-base)',\n 'var(--colored-light)',\n] as const\n\nexport interface BlockGraphProps<TItem> extends ComponentProps {\n readonly model: BlockSelectionModel<TItem>\n readonly label?: string\n readonly description?: string\n readonly emptyMessage?: string\n /** Controls block-label writing direction; `auto` uses the block's measured aspect ratio. */\n readonly labelOrientation?: BlockLabelOrientation\n}\n\nexport type BlockLabelOrientation = 'auto' | 'horizontal' | 'vertical'\ntype ResolvedBlockLabelOrientation = Exclude<BlockLabelOrientation, 'auto'>\n\n/** Accessible nested proportional mosaic backed by an explicit selection model. */\nexport class BlockGraph<TItem = unknown> extends Component<BlockGraphProps<TItem>> {\n static override liveProps: readonly string[] = []\n private labelResizeObserver: ResizeObserver | null = null\n private readonly measuredLabelOrientations = new Map<string, ResolvedBlockLabelOrientation>()\n render(): CapillaryUiChild {\n const {\n model,\n label = 'Block graph',\n description = 'Area is proportional to item count.',\n emptyMessage = 'No items are available.',\n labelOrientation = 'auto',\n } = this.props\n assertBlockLabelOrientation(labelOrientation)\n const layoutSnapshot = this.snapshot(model.layout$)\n const isLoading = layoutSnapshot.fetchState === FetchState.Initial\n || layoutSnapshot.fetchState === FetchState.Loading\n const selectedPath = this.read(model.selectedPath$)\n const layout = layoutSnapshot.value\n const selected = findBlock(layout.root, selectedPath)\n const nodes = layout.root.children.length === 0\n ? [layout.root]\n : layout.root.children\n const firstKey = nodes[0]?.key\n const Host = this.Host\n return <Host\n className={(this.props.className ?? this.props.class ?? '') || null}\n aria-label={label}\n aria-busy={isLoading ? 'true' : null}\n >\n <header>\n <cap-summary>\n <h2>{label}</h2>\n <p>{description} {isLoading ? null : `${layout.root.count} items.`}</p>\n {isLoading\n ? <Placeholder width={45} />\n : <output>\n <strong>Selection:</strong>{' '}\n {selected == null ? 'None' : selected.path.length === 0\n ? selected.label\n : selected.path.map((segment, index) => {\n const path = selected.path.slice(0, index + 1)\n return findBlock(layout.root, path)?.label ?? segment.categoryKey\n }).join(' → ')}\n </output>}\n </cap-summary>\n <Button\n label=\"Clear selection\"\n disabled={isLoading || selectedPath == null}\n onClick={() => model.clear()}\n />\n </header>\n {layoutSnapshot.fetchState === FetchState.Error\n ? <p role=\"alert\">The block graph could not be calculated.</p>\n : isLoading\n ? <>\n <p role=\"status\" aria-live=\"polite\">Loading block graph…</p>\n <cap-blockskeleton aria-hidden=\"true\">\n {[0, 1, 2].map((column) => <cap-blockskeletoncolumn key={column}>\n {[0, 1].map((row) => <Placeholder key={row} width={100} />)}\n </cap-blockskeletoncolumn>)}\n </cap-blockskeleton>\n </>\n : !layout.valid\n ? this.renderPartitionError(layout.issues)\n : layout.root.count === 0\n ? <p role=\"status\">{emptyMessage}</p>\n : <cap-scroller\n tabIndex={0}\n aria-label={`Scrollable ${label}`}\n ><cap-blocks\n role=\"tree\"\n aria-label={label}\n className={layout.root.childOrientation}\n onClick={(event: MouseEvent) => {\n if (event.target === event.currentTarget) model.clear()\n }}\n >{nodes.map((node) => this.renderBlock(\n node,\n selectedPath,\n selected?.key ?? firstKey ?? null,\n ))}</cap-blocks></cap-scroller>}\n </Host>\n }\n\n static override hostName = 'block-graph'\n static dataSurface = 'data' as const\n static override dependencies = [Button, Placeholder]\n\n override afterMount(): void {\n this.reconcileLabelOrientation()\n }\n\n override afterUpdate(): void {\n this.reconcileLabelOrientation()\n }\n\n override onDestroy(): void {\n this.labelResizeObserver?.disconnect()\n this.labelResizeObserver = null\n this.measuredLabelOrientations.clear()\n }\n\n static css = css`\n & {\n display: flex;\n min-width: 0;\n min-height: var(--viz-block-graph-min-height, 24rem);\n flex-direction: column;\n padding: var(--viz-space, 0.7rem);\n overflow: hidden;\n user-select: none;\n }\n\n & > header {\n display: flex;\n flex: 0 0 auto;\n flex-wrap: wrap;\n justify-content: space-between;\n gap: 0.5rem;\n margin-block-end: 0.6rem;\n }\n\n & h2,\n & p {\n margin: 0;\n }\n\n & header output {\n display: block;\n margin-block-start: 0.25rem;\n }\n\n & > cap-scroller {\n flex: 1;\n min-width: 0;\n min-height: 20rem;\n overflow: auto;\n }\n\n & > cap-blockskeleton {\n display: flex;\n flex: 1;\n gap: var(--viz-space, 0.7rem);\n min-block-size: 24rem;\n }\n\n & cap-blockskeletoncolumn {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--viz-space, 0.7rem);\n }\n\n & cap-blockskeletoncolumn:nth-child(2) {\n flex: 2;\n }\n\n & cap-blockskeletoncolumn > cap-placeholder {\n flex: 1;\n block-size: auto;\n }\n\n & cap-blockskeletoncolumn:nth-child(odd) > cap-placeholder:first-child {\n flex: 2;\n }\n\n & cap-blocks,\n & cap-blockgroup {\n display: flex;\n min-width: 0;\n min-height: 0;\n align-items: stretch;\n }\n\n & cap-blocks {\n width: 100%;\n min-width: 34rem;\n height: 100%;\n min-height: 24rem;\n }\n\n & .horizontal {\n flex-direction: row;\n }\n\n & .vertical {\n flex-direction: column;\n }\n\n & [role=\"treeitem\"] {\n position: relative;\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-basis: 0;\n flex-direction: column;\n overflow: hidden;\n border: var(--block-graph-block-border, 1px solid var(--c1, var(--colored-dark)));\n border-radius: var(--block-graph-block-radius, 0.25em);\n box-shadow: var(--block-graph-block-shadow, none);\n color: var(--colored-contrast);\n }\n\n & [role=\"treeitem\"] > cap-blocklabel {\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n box-sizing: border-box;\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n gap: 0 0.35rem;\n width: 100%;\n padding: 0.25rem 0.4rem;\n overflow: hidden;\n text-align: start;\n border: 0;\n cursor: pointer;\n }\n\n & [role=\"treeitem\"] > cap-blocklabel[data-label-orientation=\"vertical\"] {\n z-index: 4;\n top: 0;\n left: 0;\n right: auto;\n bottom: auto;\n width: 1.6em;\n height: max-content;\n writing-mode: vertical-rl;\n transform: none;\n justify-content: flex-start;\n align-items: flex-end;\n padding: 0.2rem;\n }\n\n & [role=\"treeitem\"] > cap-blocklabel[data-label-orientation=\"horizontal\"] {\n writing-mode: horizontal-tb;\n transform: none;\n }\n\n & [role=\"treeitem\"][aria-selected=\"true\"] {\n z-index: 3;\n outline: 3px solid var(--viz-selection-color, var(--colored-contrast, Highlight));\n outline-offset: -3px;\n }\n\n & [role=\"treeitem\"]:focus-visible {\n z-index: 2;\n outline: 3px solid var(--viz-focus-color, Highlight);\n outline-offset: -3px;\n }\n\n & cap-blocklabel > cap-blockname {\n display: flex;\n flex: 1 1 auto;\n flex-flow: row nowrap;\n align-items: baseline;\n gap: 0.2rem;\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n }\n\n & cap-blockname > small {\n flex: 0 1 auto;\n overflow: hidden;\n font-size: 0.68rem;\n opacity: 0.82;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n & cap-blockname > strong {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n & cap-blockname > data {\n flex: 0 0 auto;\n font-weight: 750;\n }\n\n & [role=\"treeitem\"] > cap-blocklabel[data-label-orientation=\"vertical\"] > cap-blockname {\n transform: rotate(180deg);\n }\n\n & cap-blockgroup {\n position: relative;\n z-index: 1;\n box-sizing: border-box;\n flex: 1;\n padding: var(--viz-block-graph-child-inset, 1.6em);\n }\n\n & [role=\"treeitem\"]:hover:not(:has([role=\"treeitem\"]:hover)) {\n filter: saturate(1.35) brightness(1.15);\n }\n\n @media (forced-colors: active) {\n & [role=\"treeitem\"] {\n color: CanvasText;\n background: Canvas;\n border-color: CanvasText;\n forced-color-adjust: auto;\n }\n\n & [role=\"treeitem\"] > cap-blocklabel {\n color: ButtonText;\n background: ButtonFace;\n }\n }\n `\n\n private renderBlock(\n node: BlockNode<TItem>,\n selectedPath: BlockPath | null,\n tabbableKey: string | null,\n ): CapillaryUiChild {\n const selected = pathsEqual(node.path, selectedPath)\n const colors = node.colors\n const colorVariables = categoryColorVariables(colors ?? fallbackCategoryColors)\n return <article\n key={node.key}\n role=\"treeitem\"\n className=\"colored\"\n tabIndex={(selected || (selectedPath == null && node.key === tabbableKey)) ? 0 : -1}\n aria-level={Math.max(1, node.depth + 1)}\n aria-selected={selected ? 'true' : 'false'}\n aria-label={`${node.criterionLabel ?? 'Items'}: ${node.label}, ${node.count} ${node.count === 1 ? 'item' : 'items'}`}\n data-block-key={node.key}\n onClick={(event: MouseEvent) => {\n if ((event.target as Element).closest('[role=\"treeitem\"]') === event.currentTarget) {\n this.props.model.select(node.path)\n }\n }}\n onKeyDown={(event: KeyboardEvent) => this.blockKeyDown(event, node)}\n style={{\n flexGrow: node.count,\n ...colorVariables,\n ...(colors == null ? {} : {\n borderColor: colors[0],\n }),\n }}\n >\n <cap-blocklabel>\n <cap-blockname>\n <small>{node.criterionLabel ?? 'Items'}:</small>\n <strong>{node.label}</strong>\n <data value={String(node.count)}>({node.count})</data>\n </cap-blockname>\n </cap-blocklabel>\n {node.children.length === 0 ? null : <cap-blockgroup\n role=\"group\"\n className={node.childOrientation}\n >{node.children.map((child) => this.renderBlock(\n child,\n selectedPath,\n tabbableKey,\n ))}</cap-blockgroup>}\n </article>\n }\n\n private renderPartitionError(issues: readonly {kind: string; criterionLabel: string}[]): CapillaryUiChild {\n const first = issues[0]\n const detail = first == null\n ? 'The selected criteria do not form a complete partition.'\n : first.kind === 'unmatched'\n ? `${first.criterionLabel} has an item with no category.`\n : `${first.criterionLabel} has an item matching multiple categories.`\n return <div role=\"alert\">\n <strong>Invalid block partition</strong>\n <p>{detail} {issues.length} partition issue{issues.length === 1 ? '' : 's'} detected.</p>\n </div>\n }\n\n private reconcileLabelOrientation(): void {\n this.labelResizeObserver?.disconnect()\n this.labelResizeObserver = null\n if (!(this.dom instanceof Element)) return\n\n const orientation = this.props.labelOrientation ?? 'auto'\n assertBlockLabelOrientation(orientation)\n const blocks = [...this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')]\n const activeKeys = new Set(blocks.map((block) => block.dataset.blockKey).filter(\n (key): key is string => key != null,\n ))\n for (const key of this.measuredLabelOrientations.keys()) {\n if (!activeKeys.has(key)) this.measuredLabelOrientations.delete(key)\n }\n\n if (orientation !== 'auto') {\n for (const block of blocks) this.setLabelOrientation(block, orientation)\n return\n }\n\n for (const block of blocks) {\n this.setLabelOrientation(\n block,\n this.measuredLabelOrientations.get(block.dataset.blockKey ?? '') ?? 'horizontal',\n )\n }\n if (typeof globalThis.ResizeObserver !== 'function') return\n this.labelResizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const block = entry.target\n if (!(block instanceof HTMLElement)) continue\n const key = block.dataset.blockKey\n if (key == null) continue\n const next = this.resolveAutoLabelOrientation(block, entry.contentRect)\n this.measuredLabelOrientations.set(key, next)\n this.setLabelOrientation(block, next)\n }\n })\n for (const block of blocks) this.labelResizeObserver.observe(block)\n }\n\n private setLabelOrientation(\n block: HTMLElement,\n orientation: ResolvedBlockLabelOrientation,\n ): void {\n block.querySelector('cap-blocklabel')?.setAttribute('data-label-orientation', orientation)\n }\n\n private resolveAutoLabelOrientation(\n block: HTMLElement,\n bounds: {width: number; height: number},\n ): ResolvedBlockLabelOrientation {\n this.setLabelOrientation(block, 'horizontal')\n const horizontalWidth = this.measureHorizontalLabelWidth(block)\n if (horizontalWidth > 0 && bounds.width >= horizontalWidth) return 'horizontal'\n return bounds.height > bounds.width ? 'vertical' : 'horizontal'\n }\n\n private measureHorizontalLabelWidth(block: HTMLElement): number {\n const label = block.querySelector<HTMLElement>('cap-blocklabel')\n const body = block.ownerDocument?.body\n if (label == null || body == null) return 0\n const probe = label.cloneNode(true) as HTMLElement\n probe.style.cssText = [\n 'position:fixed',\n 'visibility:hidden',\n 'pointer-events:none',\n 'inset:auto',\n 'display:flex',\n 'width:max-content',\n 'max-width:none',\n 'height:auto',\n 'overflow:visible',\n 'white-space:nowrap',\n 'writing-mode:horizontal-tb',\n 'transform:none',\n ].join(';')\n for (const child of probe.querySelectorAll<HTMLElement>('cap-blockname, small, strong')) {\n child.style.overflow = 'visible'\n child.style.minWidth = 'auto'\n }\n const name = probe.querySelector<HTMLElement>('cap-blockname')\n if (name != null) name.style.flex = '0 0 auto'\n body.append(probe)\n const width = probe.getBoundingClientRect().width\n probe.remove()\n return width\n }\n\n private blockKeyDown(event: KeyboardEvent, node: BlockNode<TItem>): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.props.model.select(node.path, 'block selected by keyboard')\n return\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n this.props.model.clear('block selection cleared by keyboard')\n return\n }\n const root = this.props.model.layout$.get().root\n const all = flattenBlocks(root.children.length === 0 ? [root] : root.children)\n const index = all.findIndex(({key}) => key === node.key)\n let target: BlockNode<TItem> | undefined\n if (event.key === 'ArrowDown') target = all[index + 1]\n else if (event.key === 'ArrowUp') target = all[index - 1]\n else if (event.key === 'Home') target = all[0]\n else if (event.key === 'End') target = all.at(-1)\n else if (event.key === 'ArrowRight') target = node.children[0] ?? all[index + 1]\n else if (event.key === 'ArrowLeft') {\n target = node.path.length <= 1\n ? all[index - 1]\n : findBlock(root, node.path.slice(0, -1)) ?? undefined\n } else return\n if (target == null) return\n event.preventDefault()\n this.focusBlock(target.key)\n }\n\n private focusBlock(key: string): void {\n if (!(this.dom instanceof Element)) return\n for (const element of this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')) {\n if (element.dataset.blockKey === key) {\n element.focus()\n return\n }\n }\n }\n}\n\nfunction assertBlockLabelOrientation(value: string): asserts value is BlockLabelOrientation {\n if (value !== 'auto' && value !== 'horizontal' && value !== 'vertical') {\n throw new TypeError(`Unknown block label orientation: ${value}`)\n }\n}\n\nexport function flattenBlocks<TItem>(nodes: readonly BlockNode<TItem>[]): BlockNode<TItem>[] {\n return nodes.flatMap((node) => [node, ...flattenBlocks(node.children)])\n}\n\nfunction pathsEqual(left: BlockPath, right: BlockPath | null): boolean {\n return right != null\n && left.length === right.length\n && left.every((segment, index) => segment.criterionKey === right[index]?.criterionKey\n && segment.categoryKey === right[index]?.categoryKey)\n}\n","import {OptionGroup, OptionGroupHeaderEnd, css, readDeclarativeRegions} from '@capillaryjs/capillary-ui'\nimport type {CapillaryUiChild, OptionGroupBaseProps} from '@capillaryjs/capillary-ui'\n\nexport interface CollapsibleOptionGroupProps extends OptionGroupBaseProps {\n /** Start collapsed instead of expanded. */\n collapsed?: boolean\n}\n\n/** OptionGroup with an expand/collapse toggle button in the legend. */\nexport class CollapsibleOptionGroup<\n TProps extends CollapsibleOptionGroupProps = CollapsibleOptionGroupProps,\n> extends OptionGroup<TProps> {\n readonly contentId: string\n private collapsed: boolean\n\n constructor(props: TProps) {\n super(props)\n this.collapsed = props.collapsed ?? false\n this.contentId = `${this.groupId}-content`\n }\n\n override render(): CapillaryUiChild {\n if (this.props.headerEnd != null) {\n throw new Error(\n 'CollapsibleOptionGroup trailing header content must use a direct OptionGroupHeaderEnd child',\n )\n }\n const {content, regions} = readDeclarativeRegions(\n 'CollapsibleOptionGroup',\n this.props.children,\n {headerEnd: OptionGroupHeaderEnd},\n )\n return this.renderOptionGroup(content, regions.headerEnd ?? null)\n }\n\n private toggle(): void {\n this.collapsed = !this.collapsed\n this.update()\n }\n\n protected override 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={this.props.className ?? this.props.class ?? 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 <legend>\n <button\n type=\"button\"\n className=\"cap-collapse-toggle\"\n aria-expanded={!this.collapsed}\n aria-controls={this.contentId}\n onClick={() => this.toggle()}\n >\n {this.collapsed ? '▸' : '▾'}\n </button>\n {label != null ? <span>{label}</span> : null}\n {headerEnd}\n </legend>\n <div id={this.contentId} hidden={this.collapsed}>\n {content}\n </div>\n </fieldset>\n {this.renderOptionGroupError(error)}\n </Host>\n }\n\n static override hostName = 'collapsible-option-group'\n\n static override css = css`\n & > fieldset > legend > button.cap-collapse-toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.2em;\n height: 1.2em;\n padding: 0;\n border: 0;\n border-radius: var(--ui-border-radius);\n background: transparent;\n color: inherit;\n font: inherit;\n cursor: pointer;\n flex: 0 0 auto;\n user-select: none;\n }\n\n & > fieldset > legend > button.cap-collapse-toggle:hover {\n background: var(--button-background-hover, rgba(0, 0, 0, 0.05));\n }\n\n & > fieldset > legend > button.cap-collapse-toggle:focus-visible {\n outline: 2px solid var(--focus-color, var(--ui-accent-color));\n outline-offset: 1px;\n }\n\n & > fieldset > div {\n display: contents;\n }\n\n & > fieldset > div[hidden] {\n display: none;\n }\n `\n}\n","import {FetchState} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\nimport {\n Checkbox,\n OptionsBox,\n css,\n} from '@capillaryjs/capillary-ui'\nimport type {CapillaryUiChild, GroupBoxBaseProps} from '@capillaryjs/capillary-ui'\n\nimport {CollapsibleOptionGroup} from './CollapsibleOptionGroup.js'\n\nimport type {CategoryVisibility} from '../grouping.js'\nimport {categoryColorVariables, GroupingCriterion} from '../grouping.js'\n\nconst visibilitySymbols = [\n ['☐', 'hidden'],\n ['✓', 'visible'],\n] as const\n\nexport interface CategoryHidePanelProps<TItem> extends GroupBoxBaseProps {\n readonly items$: ReadableEmitter<readonly TItem[]>\n readonly criteria: readonly GroupingCriterion<TItem>[]\n readonly label?: string\n readonly description?: string\n}\n\n/** Show/hide controls with live counts against the unfiltered item source. */\nexport class CategoryHidePanel<TItem = unknown>\nextends OptionsBox<CategoryHidePanelProps<TItem>> {\n static override liveProps: readonly string[] = []\n render(): CapillaryUiChild {\n const {\n criteria,\n label = 'Show or hide categories',\n description = '',\n } = this.props\n const itemSnapshot = this.snapshot(this.props.items$)\n const items = Array.isArray(itemSnapshot.value) ? itemSnapshot.value : []\n return this.renderGroupBox(label,\n <cap-categoryhidecontent>\n <p>{description}</p>\n {itemSnapshot.fetchState === FetchState.Error\n ? <p role=\"alert\">Category counts are unavailable.</p>\n : null}\n <cap-criteriongroups>{criteria.map((criterion) => {\n const categorySnapshot = this.snapshot(criterion.categories$)\n const categories = Array.isArray(categorySnapshot.value)\n ? categorySnapshot.value\n : []\n return <CollapsibleOptionGroup\n key={criterion.key}\n label={criterion.label}\n >\n {categorySnapshot.fetchState === FetchState.Error\n ? <p role=\"alert\">{criterion.label} categories are unavailable.</p>\n : null}\n {categorySnapshot.fetchState !== FetchState.Ready\n ? <p role=\"status\" aria-live=\"polite\">Loading {criterion.label}…</p>\n : null}\n <cap-categories>{categories.map((category) => {\n const count = countMatches(items, category.predicate)\n return <cap-categoryoption\n key={category.key}\n style={{...categoryColorVariables(category.colors)}}\n >\n <cap-categoryswatch aria-hidden=\"true\" />\n <Checkbox<CategoryVisibility>\n symbols={visibilitySymbols}\n label={`${category.label} (${count})`}\n valueEmitter={criterion.visibility(category.key)}\n />\n </cap-categoryoption>\n })}</cap-categories>\n </CollapsibleOptionGroup>\n })}</cap-criteriongroups>\n </cap-categoryhidecontent>,\n )\n }\n\n static override hostName = 'category-hide-panel'\n static dependencies = [Checkbox, CollapsibleOptionGroup]\n\n static css = css`\n & {\n flex: 0 0 auto;\n min-width: 0;\n user-select: none;\n }\n\n & > cap-content > cap-categoryhidecontent {\n display: flex;\n flex-flow: column nowrap;\n align-items: stretch;\n gap: var(--viz-space, 0.6rem);\n min-width: 0;\n }\n\n & > cap-content > cap-categoryhidecontent > p {\n margin: 0;\n color: var(--viz-muted-color, var(--ui-muted-text-color, currentColor));\n font-size: 0.875em;\n }\n\n & > cap-content > cap-categoryhidecontent > cap-criteriongroups {\n display: flex;\n flex-flow: column nowrap;\n gap: 1em;\n min-width: 0;\n }\n\n & cap-collapsible-option-group > fieldset > legend small {\n white-space: nowrap;\n }\n\n & cap-categories {\n display: flex;\n box-sizing: border-box;\n gap: .31em;\n min-width: 0;\n flex-flow: column;\n padding: 0;\n overflow: visible;\n }\n\n & cap-categoryoption {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n gap: 0.45rem;\n min-width: 0;\n\n }\n\n & cap-categoryswatch {\n display: block;\n width: 1rem;\n height: 1rem;\n border: 1px solid var(--c1);\n border-radius: 0.2rem;\n background: linear-gradient(15deg, var(--c1) 0%, var(--c2) 65%, var(--c2) 65%, var(--c3) 100%);\n }\n\n & cap-categoryoption:has(input:not(:checked)) > cap-categoryswatch {\n opacity: 0.22;\n }\n\n & cap-categoryoption > cap-checkbox,\n & cap-categoryoption > cap-checkbox > label {\n min-width: 0;\n width: 100%;\n height: unset;\n }\n\n & cap-categoryoption > cap-checkbox > label {\n justify-content: flex-start;\n text-align: start;\n white-space: nowrap;\n }\n `\n}\n\nfunction countMatches<TItem>(\n items: readonly TItem[],\n predicate: (item: TItem) => boolean,\n): number {\n let count = 0\n for (const item of items) {\n if (predicate(item)) count += 1\n }\n return count\n}\n","const DAY_MILLISECONDS = 86_400_000\nconst civilDatePattern = /^(\\d{4})-(\\d{2})-(\\d{2})$/\n\nexport type CivilDate = string\n\nexport function civilDateToDay(value: CivilDate): number {\n const match = civilDatePattern.exec(value)\n if (match == null) throw new TypeError(`Invalid civil date \"${value}\"; expected YYYY-MM-DD`)\n const year = Number(match[1])\n const month = Number(match[2])\n const date = Number(match[3])\n const milliseconds = Date.UTC(year, month - 1, date)\n const parsed = new Date(milliseconds)\n if (parsed.getUTCFullYear() !== year\n || parsed.getUTCMonth() !== month - 1\n || parsed.getUTCDate() !== date) {\n throw new TypeError(`Invalid civil date \"${value}\"`)\n }\n return Math.floor(milliseconds / DAY_MILLISECONDS)\n}\n\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)\n}\n\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\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.getUTCFullYear()).padStart(4, '0')}-${String(\n now.getUTCMonth() + 1,\n ).padStart(2, '0')}-${String(now.getUTCDate()).padStart(2, '0')}`\n}\n\nexport function compareCivilDates(left: CivilDate, right: CivilDate): number {\n return civilDateToDay(left) - civilDateToDay(right)\n}\n","import {\n civilDateToDay,\n dayToCivilDate,\n todayCivilDate,\n} from './dates.js'\nimport type {CivilDate} from './dates.js'\nimport type {HistoryShape} from './series.js'\n\nexport interface LineGraphRange {\n readonly minX?: CivilDate\n readonly maxX?: CivilDate\n readonly minY?: number\n}\n\nexport interface ChartPoint {\n readonly date: CivilDate\n readonly day: number\n readonly value: number\n readonly baseValue: number\n readonly displayValue: number\n readonly x: number\n readonly y: number\n readonly baseY: number\n}\n\nexport interface ChartSeries {\n readonly key: string\n readonly label: string\n readonly color: string\n readonly colorKey?: string\n readonly shape: HistoryShape\n readonly points: readonly ChartPoint[]\n}\n\nexport interface DateMark {\n readonly date: CivilDate\n readonly day: number\n readonly x: number\n}\n\nexport interface ValueTick {\n readonly value: number\n readonly y: number\n}\n\nexport interface LineChartModel {\n readonly minDate: CivilDate\n readonly maxDate: CivilDate\n readonly minDay: number\n readonly maxDay: number\n readonly minY: number\n readonly maxY: number\n readonly width: number\n readonly height: number\n readonly plotLeft: number\n readonly plotTop: number\n readonly plotWidth: number\n readonly plotHeight: number\n readonly stacked: boolean\n readonly series: readonly ChartSeries[]\n readonly dateMarks: readonly DateMark[]\n readonly valueTicks: readonly ValueTick[]\n}\n\nexport interface LineChartOptions {\n readonly stacked?: boolean\n readonly range?: LineGraphRange\n readonly width?: number\n readonly height?: number\n readonly maxDateMarks?: number\n readonly today?: CivilDate\n}\n\n/** Calculate normalized, optionally stacked chart coordinates without a DOM. */\nexport function buildLineChartModel(\n shapes: readonly HistoryShape[],\n options: LineChartOptions = {},\n): LineChartModel {\n validateShapes(shapes)\n const width = finiteDimension(options.width ?? 960, 'Chart width')\n const height = finiteDimension(options.height ?? 420, 'Chart height')\n const plotLeft = Math.min(72, width * 0.18)\n const plotTop = 24\n const plotWidth = Math.max(1, width - plotLeft - 24)\n const plotHeight = Math.max(1, height - plotTop - 58)\n const allDates = shapes.flatMap((shape) => Object.keys(shape.values))\n const today = options.today ?? todayCivilDate()\n const minDate = options.range?.minX ?? earliestDate(allDates) ?? today\n const maxDate = options.range?.maxX ?? today\n const minDay = civilDateToDay(minDate)\n const maxDay = civilDateToDay(maxDate)\n if (minDay > maxDay) throw new RangeError('Line graph minX must not be after maxX')\n const sampleDays = collectSampleDays(shapes, minDay, maxDay)\n const stacked = options.stacked ?? false\n const rawSeries = shapes.map((shape) => ({\n shape,\n values: sampleDays.map((day) => valueAtDay(shape, day)),\n }))\n let minimum = options.range?.minY ?? 0\n let maximum = minimum\n const accumulated = Array.from({length: sampleDays.length}, () => 0)\n const positioned = rawSeries.map(({shape, values}) => {\n const entries = values.map((value, index) => {\n const baseValue = stacked ? accumulated[index]! : 0\n const displayValue = baseValue + value\n if (stacked) accumulated[index] = displayValue\n minimum = Math.min(minimum, baseValue, displayValue)\n maximum = Math.max(maximum, baseValue, displayValue)\n return {value, baseValue, displayValue}\n })\n return {shape, entries}\n })\n const span = Math.max(1, maximum - minimum)\n const maxY = maximum + span * 0.05\n const minY = options.range?.minY ?? minimum\n const ySpan = Math.max(1, maxY - minY)\n const daySpan = Math.max(1, maxDay - minDay)\n const series: ChartSeries[] = positioned.map(({shape, entries}) => ({\n key: shape.key,\n label: shape.label,\n color: shape.color,\n ...(shape.colorKey === undefined ? {} : {colorKey: shape.colorKey}),\n shape,\n points: Object.freeze(entries.map((entry, index) => {\n const day = sampleDays[index]!\n return Object.freeze({\n date: dayToCivilDate(day),\n day,\n ...entry,\n x: plotLeft + (day - minDay) / daySpan * plotWidth,\n y: plotTop + (maxY - entry.displayValue) / ySpan * plotHeight,\n baseY: plotTop + (maxY - entry.baseValue) / ySpan * plotHeight,\n })\n })),\n }))\n return Object.freeze({\n minDate,\n maxDate,\n minDay,\n maxDay,\n minY,\n maxY,\n width,\n height,\n plotLeft,\n plotTop,\n plotWidth,\n plotHeight,\n stacked,\n series: Object.freeze(series),\n dateMarks: Object.freeze(buildDateMarks(minDay, maxDay, options.maxDateMarks ?? 8)\n .map((day) => ({\n date: dayToCivilDate(day),\n day,\n x: plotLeft + (day - minDay) / daySpan * plotWidth,\n }))),\n valueTicks: Object.freeze(buildIntegerTicks(minY, maxY).map((value) => ({\n value,\n y: plotTop + (maxY - value) / ySpan * plotHeight,\n }))),\n })\n}\n\nexport function valueAtDate(shape: HistoryShape, date: CivilDate): number {\n return valueAtDay(shape, civilDateToDay(date))\n}\n\nexport function linePath(points: readonly ChartPoint[], smooth: boolean): string {\n const first = points[0]\n if (first == null) return ''\n let path = `M ${format(first.x)} ${format(first.y)}`\n for (let index = 1; index < points.length; index += 1) {\n const previous = points[index - 1]!\n const current = points[index]!\n if (smooth) {\n const midpoint = (previous.x + current.x) / 2\n path += ` C ${format(midpoint)} ${format(previous.y)}, ${format(midpoint)} `\n + `${format(current.y)}, ${format(current.x)} ${format(current.y)}`\n } else {\n path += ` H ${format(current.x)} V ${format(current.y)}`\n }\n }\n return path\n}\n\nexport function areaPath(points: readonly ChartPoint[], smooth: boolean): string {\n if (points.length === 0) return ''\n const top = linePath(points, smooth)\n const reversed = [...points].reverse()\n let bottom = ''\n for (let index = 0; index < reversed.length; index += 1) {\n const point = reversed[index]!\n if (index === 0) bottom += ` L ${format(point.x)} ${format(point.baseY)}`\n else if (smooth) {\n const previous = reversed[index - 1]!\n const midpoint = (previous.x + point.x) / 2\n bottom += ` C ${format(midpoint)} ${format(previous.baseY)}, ${format(midpoint)} `\n + `${format(point.baseY)}, ${format(point.x)} ${format(point.baseY)}`\n } else {\n bottom += ` H ${format(point.x)} V ${format(point.baseY)}`\n }\n }\n return `${top}${bottom} Z`\n}\n\nexport function buildIntegerTicks(minimum: number, maximum: number, target = 6): number[] {\n if (!Number.isFinite(minimum) || !Number.isFinite(maximum) || minimum > maximum) {\n throw new RangeError('Tick range must contain finite ascending values')\n }\n if (!Number.isInteger(target) || target < 2) throw new RangeError('Tick target must be at least two')\n const span = Math.max(1, maximum - minimum)\n const rough = span / (target - 1)\n const magnitude = 10 ** Math.floor(Math.log10(rough))\n const normalized = rough / magnitude\n const nice = normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 5 ? 5 : 10\n const step = Math.max(1, nice * magnitude)\n const first = Math.ceil(minimum / step) * step\n const values: number[] = []\n for (let value = first; value <= maximum + step / 1000; value += step) {\n values.push(Number(value.toFixed(10)))\n }\n if (values.length === 0) values.push(Math.ceil(minimum))\n return values\n}\n\nfunction collectSampleDays(\n shapes: readonly HistoryShape[],\n minDay: number,\n maxDay: number,\n): number[] {\n const days = new Set<number>([minDay, maxDay])\n for (const shape of shapes) {\n for (const date of Object.keys(shape.values)) {\n const day = civilDateToDay(date)\n if (day >= minDay && day <= maxDay) days.add(day)\n }\n }\n return [...days].sort((left, right) => left - right)\n}\n\nfunction valueAtDay(shape: HistoryShape, day: number): number {\n const exact = shape.values[dayToCivilDate(day)]\n if (exact !== undefined) return exact\n if (shape.carryForward !== true) return 0\n let bestDay = Number.NEGATIVE_INFINITY\n let bestValue = 0\n for (const [date, value] of Object.entries(shape.values)) {\n const candidate = civilDateToDay(date)\n if (candidate <= day && candidate > bestDay) {\n bestDay = candidate\n bestValue = value\n }\n }\n return bestValue\n}\n\nfunction buildDateMarks(minDay: number, maxDay: number, maximum: number): number[] {\n if (!Number.isInteger(maximum) || maximum < 2) {\n throw new RangeError('Maximum date marks must be at least two')\n }\n const span = Math.max(0, maxDay - minDay)\n const rawStep = span <= 62 ? 7 : span <= 730 ? 30 : 365\n const step = Math.max(rawStep, Math.ceil(Math.max(1, span) / (maximum - 1)))\n const marks = [minDay]\n for (let day = minDay + step; day < maxDay; day += step) marks.push(day)\n if (maxDay !== minDay) marks.push(maxDay)\n return marks\n}\n\nfunction validateShapes(shapes: readonly HistoryShape[]): void {\n if (!Array.isArray(shapes)) throw new TypeError('History shapes must be an array')\n const keys = new Set<string>()\n for (const shape of shapes) {\n if (shape == null || typeof shape !== 'object') throw new TypeError('History shape must be an object')\n if (typeof shape.key !== 'string' || shape.key.trim() === '' || keys.has(shape.key)) {\n throw new Error('History shape keys must be non-empty and unique')\n }\n keys.add(shape.key)\n if (typeof shape.label !== 'string' || shape.label.trim() === '') {\n throw new TypeError('History shape label must be a non-empty string')\n }\n if (typeof shape.color !== 'string' || shape.color.trim() === '') {\n throw new TypeError('History shape color must be a non-empty CSS value')\n }\n for (const [date, value] of Object.entries(shape.values)) {\n civilDateToDay(date)\n if (!Number.isFinite(value)) throw new TypeError('History shape values must be finite')\n }\n }\n}\n\nfunction earliestDate(values: readonly string[]): CivilDate | undefined {\n return values.length === 0\n ? undefined\n : values.reduce((left, right) => civilDateToDay(left) <= civilDateToDay(right)\n ? left\n : right)\n}\n\nfunction finiteDimension(value: number, label: string): number {\n if (!Number.isFinite(value) || value <= 0) throw new RangeError(`${label} must be positive`)\n return value\n}\n\nfunction format(value: number): string {\n return Number(value.toFixed(3)).toString()\n}\n","import {Emitter, FetchState} from '@capillaryjs/capillary'\nimport type {ReadableEmitter} from '@capillaryjs/capillary'\nimport {Component, css} from '@capillaryjs/capillary-ui'\nimport type {ComponentProps, CapillaryUiChild} from '@capillaryjs/capillary-ui'\n\nimport {civilDateToDay, dayToCivilDate} from '../dates.js'\nimport type {CivilDate} from '../dates.js'\nimport {\n areaPath,\n buildLineChartModel,\n linePath,\n valueAtDate,\n} from '../lineChart.js'\nimport type {LineChartModel, LineGraphRange} from '../lineChart.js'\nimport type {HistoryShape} from '../series.js'\n\ntype Source<TValue> = TValue | ReadableEmitter<TValue>\n\nexport interface LineGraphProps extends ComponentProps {\n /** Snapshot data or a readable source that drives the graph. */\n readonly shapes$: Source<readonly HistoryShape[]>\n readonly stacked$: Source<boolean>\n readonly smooth$: Source<boolean>\n readonly range$: Source<LineGraphRange>\n readonly label?: string\n readonly emptyMessage?: string\n readonly formatDate?: (date: CivilDate) => string\n readonly formatValue?: (value: number) => string\n}\n\n/** Responsive SVG history line/area chart with pointer and keyboard readout. */\nexport class LineGraph extends Component<LineGraphProps> {\n static override liveProps: readonly string[] = []\n private readonly cursorDate$ = new Emitter<CivilDate | null>(null, {\n owner: this,\n purpose: 'line graph cursor date',\n })\n private readonly shapes$: ReadableEmitter<readonly HistoryShape[]>\n private readonly stacked$: ReadableEmitter<boolean>\n private readonly smooth$: ReadableEmitter<boolean>\n private readonly range$: ReadableEmitter<LineGraphRange>\n private readonly ownedSources: Emitter<unknown>[] = []\n private chartHost: HTMLElement | null = null\n private observedWidth = 960\n private currentModel: LineChartModel | null = null\n private resizeObserver: ResizeObserver | null = null\n\n constructor(props: LineGraphProps) {\n super(props)\n this.shapes$ = this.source(props.shapes$, 'line graph shapes')\n this.stacked$ = this.source(props.stacked$, 'line graph stacked state')\n this.smooth$ = this.source(props.smooth$, 'line graph smooth state')\n this.range$ = this.source(props.range$, 'line graph range')\n }\n\n render(): CapillaryUiChild {\n const shapes = this.snapshot(this.shapes$)\n const stacked = this.snapshot(this.stacked$)\n const smooth = this.snapshot(this.smooth$)\n const range = this.snapshot(this.range$)\n const cursorDate = this.read(this.cursorDate$)\n const label = this.props.label ?? 'History chart'\n const state = [shapes, stacked, smooth, range].some(({fetchState}) =>\n fetchState === FetchState.Error)\n ? FetchState.Error\n : [shapes, stacked, smooth, range].some(({fetchState}) =>\n fetchState !== FetchState.Ready)\n ? FetchState.Loading\n : FetchState.Ready\n let calculationError: unknown = null\n this.currentModel = null\n if (state === FetchState.Ready) {\n try {\n this.currentModel = buildLineChartModel(shapes.value, {\n stacked: stacked.value,\n range: range.value,\n width: Math.max(480, this.observedWidth),\n maxDateMarks: this.observedWidth < 640 ? 5 : 9,\n })\n } catch (error) {\n calculationError = error\n }\n }\n const model = this.currentModel\n const activeDate = model == null\n ? null\n : cursorDate ?? model.maxDate\n const formatDate = this.props.formatDate ?? ((date: CivilDate) => date)\n const formatValue = this.props.formatValue ?? ((value: number) => String(value))\n const Host = this.Host\n return <Host\n className={(this.props.className ?? this.props.class ?? '') || null}\n aria-label={label}\n aria-busy={state !== FetchState.Ready ? 'true' : null}\n >\n <header>\n <h2>{label}</h2>\n <p>{stacked.value ? 'Stacked area' : 'Individual line'} chart;{' '}\n {smooth.value ? 'smooth' : 'step'} rendering.</p>\n </header>\n {state === FetchState.Error || calculationError != null\n ? <p role=\"alert\">The history chart could not be calculated.</p>\n : state !== FetchState.Ready\n ? <p role=\"status\" aria-live=\"polite\">Loading history chart…</p>\n : shapes.value.length === 0\n ? <p role=\"status\">{this.props.emptyMessage ?? 'No history values are available.'}</p>\n : <cap-chart\n tabIndex={0}\n role=\"group\"\n aria-label={`${label}. Use Left and Right Arrow to move by day; hold Shift to move by week.`}\n onPointerMove={(event: PointerEvent) => this.pointerMove(event)}\n onKeyDown={(event: KeyboardEvent) => this.cursorKeyDown(event)}\n ref={(element: HTMLElement | null) => this.chartHost = element}\n />}\n {model == null || activeDate == null ? null : <cap-readout>\n <p aria-live=\"polite\"><strong>{formatDate(activeDate)}</strong></p>\n <ul>{model.series.map(({shape}) => <li key={shape.key}>\n <cap-swatch\n style={{'--colored-base': shape.color}}\n aria-hidden=\"true\"\n />\n <span>{shape.label}</span>\n <strong>{formatValue(valueAtDate(shape, activeDate))}</strong>\n </li>)}</ul>\n </cap-readout>}\n </Host>\n }\n\n afterMount(): void {\n this.observeSize()\n this.drawChart()\n }\n\n afterUpdate(): void {\n this.drawChart()\n }\n\n onDestroy(): void {\n this.resizeObserver?.disconnect()\n this.resizeObserver = null\n this.chartHost = null\n this.cursorDate$.dispose()\n for (const source of this.ownedSources) source.dispose()\n this.ownedSources.length = 0\n }\n\n static override hostName = 'line-graph'\n\n static css = css`\n & {\n display: flex;\n min-width: 0;\n min-height: var(--viz-line-graph-min-height, 24rem);\n flex-direction: column;\n padding: var(--viz-space, 0.7rem);\n user-select: none;\n }\n\n & h2,\n & p,\n & ul {\n margin: 0;\n }\n\n & > cap-chart {\n flex: 1;\n min-height: 20rem;\n margin-block: 0.6rem;\n overflow: auto;\n }\n\n & svg {\n display: block;\n width: 100%;\n min-width: 30rem;\n height: auto;\n }\n\n & .gridline {\n stroke: var(--viz-grid-color, var(--ui-border-color));\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n }\n\n & .axismark {\n fill: var(--viz-color, var(--ui-text-color));\n font: 12px system-ui, sans-serif;\n }\n\n & .seriesline {\n fill: none;\n stroke-width: 3;\n stroke-linecap: round;\n stroke-linejoin: round;\n vector-effect: non-scaling-stroke;\n }\n\n & .seriesarea {\n opacity: var(--viz-area-opacity, 0.25);\n }\n\n & .cursor {\n stroke: var(--viz-cursor-color, var(--ui-text-color));\n stroke-width: 2;\n stroke-dasharray: 4 3;\n vector-effect: non-scaling-stroke;\n }\n\n & > cap-readout {\n padding-block-start: 0.4rem;\n border-block-start: 1px solid var(--viz-border-color, var(--ui-border-color));\n }\n\n & > cap-readout ul {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem 1rem;\n padding: 0;\n list-style: none;\n }\n\n & > cap-readout li {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n }\n\n & cap-swatch {\n display: block;\n width: 0.8rem;\n height: 0.8rem;\n border-radius: 50%;\n background: var(--colored-base);\n }\n\n @media (forced-colors: active) {\n & .seriesline,\n & .cursor,\n & .gridline {\n stroke: CanvasText;\n forced-color-adjust: auto;\n }\n\n & .seriesarea {\n fill: Canvas;\n stroke: CanvasText;\n }\n }\n `\n\n private observeSize(): void {\n if (this.chartHost == null || typeof globalThis.ResizeObserver !== 'function') return\n this.resizeObserver = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width\n if (width == null || width <= 0 || Math.abs(width - this.observedWidth) < 1) return\n this.observedWidth = width\n this.update()\n })\n this.resizeObserver.observe(this.chartHost)\n }\n\n private source<TValue>(\n input: Source<TValue>,\n purpose: string,\n ): ReadableEmitter<TValue> {\n if (isReadableEmitter<TValue>(input)) return input\n const source = new Emitter(input, {owner: this, purpose})\n this.ownedSources.push(source as Emitter<unknown>)\n return source\n }\n\n private pointerMove(event: PointerEvent): void {\n const model = this.currentModel\n const host = this.chartHost\n if (model == null || host == null) return\n const bounds = host.getBoundingClientRect()\n if (bounds.width <= 0) return\n const svgX = (event.clientX - bounds.left) / bounds.width * model.width\n const ratio = Math.max(0, Math.min(1, (svgX - model.plotLeft) / model.plotWidth))\n const day = Math.round(model.minDay + ratio * (model.maxDay - model.minDay))\n this.cursorDate$.set(dayToCivilDate(day), 'line graph pointer moved')\n }\n\n private cursorKeyDown(event: KeyboardEvent): void {\n const model = this.currentModel\n if (model == null) return\n let day = civilDateToDay(this.cursorDate$.get() ?? model.maxDate)\n if (event.key === 'ArrowLeft') day -= event.shiftKey ? 7 : 1\n else if (event.key === 'ArrowRight') day += event.shiftKey ? 7 : 1\n else if (event.key === 'Home') day = model.minDay\n else if (event.key === 'End') day = model.maxDay\n else if (event.key === 'Escape') {\n event.preventDefault()\n this.cursorDate$.set(null, 'line graph cursor cleared')\n return\n } else return\n event.preventDefault()\n const date = dayToCivilDate(Math.max(model.minDay, Math.min(model.maxDay, day)))\n this.cursorDate$.set(date, 'line graph cursor moved by keyboard')\n }\n\n private drawChart(): void {\n const host = this.chartHost\n const model = this.currentModel\n if (host == null || model == null) return\n const smooth = this.smooth$.get()\n const svg = createSvg('svg')\n svg.setAttribute('viewBox', `0 0 ${model.width} ${model.height}`)\n svg.setAttribute('role', 'img')\n svg.setAttribute('aria-label', this.props.label ?? 'History chart')\n\n for (const tick of model.valueTicks) {\n const line = createSvg('line')\n line.classList.add('gridline')\n setAttributes(line, {\n x1: model.plotLeft,\n x2: model.plotLeft + model.plotWidth,\n y1: tick.y,\n y2: tick.y,\n })\n svg.append(line)\n const label = createSvg('text')\n label.classList.add('axismark')\n setAttributes(label, {x: model.plotLeft - 8, y: tick.y + 4, 'text-anchor': 'end'})\n label.textContent = String(tick.value)\n svg.append(label)\n }\n for (const mark of model.dateMarks) {\n const line = createSvg('line')\n line.classList.add('gridline')\n setAttributes(line, {\n x1: mark.x,\n x2: mark.x,\n y1: model.plotTop,\n y2: model.plotTop + model.plotHeight,\n })\n svg.append(line)\n const label = createSvg('text')\n label.classList.add('axismark')\n setAttributes(label, {\n x: mark.x,\n y: model.plotTop + model.plotHeight + 22,\n 'text-anchor': 'middle',\n })\n label.textContent = mark.date\n svg.append(label)\n }\n for (const series of model.series) {\n if (model.stacked) {\n const area = createSvg('path')\n area.classList.add('seriesarea')\n area.setAttribute('fill', series.color)\n area.setAttribute('d', areaPath(series.points, smooth))\n svg.append(area)\n }\n const path = createSvg('path')\n path.classList.add('seriesline')\n path.setAttribute('stroke', series.color)\n path.setAttribute('d', linePath(series.points, smooth))\n svg.append(path)\n }\n const cursor = this.cursorDate$.get()\n if (cursor != null) {\n const day = civilDateToDay(cursor)\n const x = model.plotLeft\n + (day - model.minDay) / Math.max(1, model.maxDay - model.minDay)\n * model.plotWidth\n const line = createSvg('line')\n line.classList.add('cursor')\n setAttributes(line, {\n x1: x,\n x2: x,\n y1: model.plotTop,\n y2: model.plotTop + model.plotHeight,\n })\n svg.append(line)\n }\n host.replaceChildren(svg)\n }\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue> {\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\nconst SVG_NAMESPACE = 'http://www.w3.org/2000/svg'\n\nfunction createSvg<TName extends keyof SVGElementTagNameMap>(\n name: TName,\n): SVGElementTagNameMap[TName] {\n return document.createElementNS(SVG_NAMESPACE, name)\n}\n\nfunction setAttributes(element: Element, attributes: Readonly<Record<string, string | number>>): void {\n for (const [name, value] of Object.entries(attributes)) {\n element.setAttribute(name, String(value))\n }\n}\n","import {BaseEmitter, DerivedEmitter, Emitter} from '@capillaryjs/capillary'\nimport type {EmitterNotification, ReadableEmitter} from '@capillaryjs/capillary'\n\nimport type {CategoryVisibility, VisualizationValueEmitter} from './grouping.js'\nimport {GroupingCriterion} from './grouping.js'\n\nexport interface SplitPreset {\n readonly key: string\n readonly label: string\n readonly active: readonly string[]\n readonly inactive?: readonly string[]\n}\n\ninterface SplitState {\n readonly order: readonly string[]\n readonly active: ReadonlySet<string>\n}\n\n/** Ordered split selection shared by controls, presets, and block models. */\nexport class SplitSelectionModel<TItem> {\n readonly criteria: readonly GroupingCriterion<TItem>[]\n readonly presets: readonly SplitPreset[]\n readonly order$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>\n readonly activeSplits$: ReadableEmitter<readonly GroupingCriterion<TItem>[]>\n readonly activePreset$: Emitter<string | null>\n private readonly byKey: ReadonlyMap<string, GroupingCriterion<TItem>>\n private readonly state$: Emitter<SplitState>\n private readonly orderEmitter: DerivedEmitter<\n readonly GroupingCriterion<TItem>[],\n readonly [Emitter<SplitState>]\n >\n private readonly activeSplitsEmitter: DerivedEmitter<\n readonly GroupingCriterion<TItem>[],\n readonly [Emitter<SplitState>]\n >\n private readonly activeEmitters = new Map<string, ActiveSplitEmitter<TItem>>()\n private disposed = false\n\n constructor(\n criteria: readonly GroupingCriterion<TItem>[],\n options: {\n readonly active?: readonly string[]\n readonly presets?: readonly SplitPreset[]\n } = {},\n ) {\n if (!Array.isArray(criteria) || criteria.some((item) => !(item instanceof GroupingCriterion))) {\n throw new TypeError('Split criteria must contain GroupingCriterion instances')\n }\n const byKey = new Map<string, GroupingCriterion<TItem>>(\n criteria.map((criterion) => [criterion.key, criterion]),\n )\n if (byKey.size !== criteria.length) throw new Error('Split criteria keys must be unique')\n this.criteria = Object.freeze([...criteria])\n this.byKey = byKey\n this.presets = freezePresets(options.presets ?? [], byKey)\n const order = this.criteria.map(({key}) => key)\n const active = options.active ?? order\n validateKnownUniqueKeys(active, byKey, 'Active split keys')\n this.state$ = new Emitter<SplitState>(freezeState(order, new Set(active)), {\n owner: this,\n purpose: 'split selection state',\n equals: splitStatesEqual,\n })\n this.orderEmitter = new DerivedEmitter<\n readonly GroupingCriterion<TItem>[],\n readonly [Emitter<SplitState>]\n >(\n [this.state$] as const,\n ([state]) => Object.freeze(\n state.order.map((key) => requiredCriterion(byKey, key)),\n ),\n {owner: this, purpose: 'ordered visualization criteria'},\n )\n this.order$ = this.orderEmitter\n this.activeSplitsEmitter = new DerivedEmitter<\n readonly GroupingCriterion<TItem>[],\n readonly [Emitter<SplitState>]\n >(\n [this.state$] as const,\n ([state]) => Object.freeze(state.order\n .filter((key) => state.active.has(key))\n .map((key) => requiredCriterion(byKey, key))),\n {owner: this, purpose: 'active ordered visualization splits'},\n )\n this.activeSplits$ = this.activeSplitsEmitter\n this.activePreset$ = new Emitter<string | null>(null, {\n owner: this,\n purpose: 'active visualization split preset',\n })\n }\n\n activeState(criterionKey: string): VisualizationValueEmitter<CategoryVisibility> {\n this.assertActive()\n const key = this.requireKey(criterionKey)\n let emitter = this.activeEmitters.get(key)\n if (emitter == null) {\n emitter = new ActiveSplitEmitter(this, key)\n this.activeEmitters.set(key, emitter)\n }\n return emitter\n }\n\n isActive(criterionKey: string): boolean {\n return this.state$.get().active.has(this.requireKey(criterionKey))\n }\n\n toggle(criterionKey: string, eventOrCause?: unknown): boolean {\n this.assertActive()\n const key = this.requireKey(criterionKey)\n const state = this.state$.get()\n const active = new Set(state.active)\n if (active.has(key)) active.delete(key)\n else active.add(key)\n this.activePreset$.set(null, 'split selection customized')\n return this.state$.set(\n freezeState(state.order, active),\n eventOrCause ?? `${key} split toggled`,\n )\n }\n\n move(criterionKey: string, targetIndex: number, eventOrCause?: unknown): boolean {\n this.assertActive()\n const key = this.requireKey(criterionKey)\n if (!Number.isInteger(targetIndex)) throw new TypeError('Split target index must be an integer')\n const state = this.state$.get()\n const from = state.order.indexOf(key)\n const to = Math.max(0, Math.min(targetIndex, state.order.length - 1))\n if (from === to) return false\n const order = [...state.order]\n order.splice(from, 1)\n order.splice(to, 0, key)\n this.activePreset$.set(null, 'split order customized')\n return this.state$.set(\n freezeState(order, state.active),\n eventOrCause ?? `${key} split moved`,\n )\n }\n\n moveBy(criterionKey: string, offset: number, eventOrCause?: unknown): boolean {\n if (!Number.isInteger(offset)) throw new TypeError('Split move offset must be an integer')\n const key = this.requireKey(criterionKey)\n return this.move(\n key,\n this.state$.get().order.indexOf(key) + offset,\n eventOrCause,\n )\n }\n\n setSplits(\n active: readonly string[],\n inactive?: readonly string[],\n eventOrCause?: unknown,\n ): boolean {\n this.assertActive()\n validateKnownUniqueKeys(active, this.byKey, 'Active split keys')\n const activeSet = new Set(active)\n const inactiveKeys = inactive ?? this.state$.get().order.filter((key) => !activeSet.has(key))\n validateKnownUniqueKeys(inactiveKeys, this.byKey, 'Inactive split keys')\n const combined = [...active, ...inactiveKeys]\n if (new Set(combined).size !== this.criteria.length\n || combined.length !== this.criteria.length) {\n throw new Error('Active and inactive split keys must cover every criterion exactly once')\n }\n this.activePreset$.set(null, 'split selection replaced')\n return this.state$.set(\n freezeState(combined, activeSet),\n eventOrCause ?? 'split selection replaced',\n )\n }\n\n applyPreset(presetKey: string): boolean {\n this.assertActive()\n const preset = this.presets.find(({key}) => key === presetKey)\n if (preset == null) throw new Error(`Unknown split preset \"${presetKey}\"`)\n const changed = this.setSplits(preset.active, preset.inactive, `${preset.key} preset applied`)\n this.activePreset$.set(preset.key, `${preset.key} preset applied`)\n return changed\n }\n\n dispose(): void {\n if (this.disposed) return\n this.disposed = true\n for (const emitter of this.activeEmitters.values()) emitter.dispose()\n this.activeEmitters.clear()\n this.activePreset$.dispose()\n this.activeSplitsEmitter.dispose()\n this.orderEmitter.dispose()\n this.state$.dispose()\n }\n\n private requireKey(value: string): string {\n if (typeof value !== 'string' || !this.byKey.has(value)) {\n throw new Error(`Unknown criterion key \"${String(value)}\"`)\n }\n return value\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('Split selection model is disposed')\n }\n}\n\nexport function createSplitSelection<TItem>(\n criteria: readonly GroupingCriterion<TItem>[],\n options: {\n readonly active?: readonly string[]\n readonly presets?: readonly SplitPreset[]\n } = {},\n): SplitSelectionModel<TItem> {\n return new SplitSelectionModel(criteria, options)\n}\n\nclass ActiveSplitEmitter<TItem> extends BaseEmitter<CategoryVisibility>\nimplements VisualizationValueEmitter<CategoryVisibility> {\n private readonly release: () => void\n\n constructor(\n private readonly model: SplitSelectionModel<TItem>,\n private readonly criterionKey: string,\n ) {\n super(model.isActive(criterionKey) ? 'visible' : 'hidden', {\n owner: model,\n purpose: `${criterionKey} split enabled`,\n fetchState: model.activeSplits$.getFetchState(),\n error: model.activeSplits$.getError(),\n })\n this.release = model.activeSplits$.subscribe(\n (notification) => this.updateFromSource(notification),\n {emitCurrent: false},\n )\n }\n\n set(value: CategoryVisibility, eventOrCause?: unknown): boolean {\n if (value !== 'hidden' && value !== 'visible') {\n throw new TypeError('Split state must be hidden or visible')\n }\n if ((value === 'visible') === this.model.isActive(this.criterionKey)) return false\n return this.model.toggle(this.criterionKey, eventOrCause)\n }\n\n override dispose(): void {\n this.release()\n super.dispose()\n }\n\n private updateFromSource(\n notification: EmitterNotification<readonly GroupingCriterion<TItem>[]>,\n ): void {\n this.setSnapshot({\n value: notification.value.some(({key}) => key === this.criterionKey)\n ? 'visible'\n : 'hidden',\n fetchState: notification.fetchState,\n error: notification.error,\n parentEvent: notification.event,\n cause: 'active split membership changed',\n })\n }\n}\n\nfunction freezePresets<TItem>(\n presets: readonly SplitPreset[],\n criteria: ReadonlyMap<string, GroupingCriterion<TItem>>,\n): readonly SplitPreset[] {\n if (!Array.isArray(presets)) throw new TypeError('Split presets must be an array')\n const keys = new Set<string>()\n return Object.freeze(presets.map((preset) => {\n if (preset == null || typeof preset !== 'object' || Array.isArray(preset)) {\n throw new TypeError('Split preset must be an object')\n }\n if (typeof preset.key !== 'string' || preset.key.trim() === '' || keys.has(preset.key)) {\n throw new Error('Split preset keys must be non-empty and unique')\n }\n if (typeof preset.label !== 'string' || preset.label.trim() === '') {\n throw new TypeError('Split preset label must be a non-empty string')\n }\n keys.add(preset.key)\n validateKnownUniqueKeys(preset.active, criteria, `${preset.key} active keys`)\n const active = Object.freeze([...preset.active])\n const inactive = preset.inactive == null\n ? Object.freeze([...criteria.keys()].filter((key) => !active.includes(key)))\n : Object.freeze([...preset.inactive])\n validateKnownUniqueKeys(inactive, criteria, `${preset.key} inactive keys`)\n if (new Set([...active, ...inactive]).size !== criteria.size\n || active.length + inactive.length !== criteria.size) {\n throw new Error(`Split preset \"${preset.key}\" must cover every criterion exactly once`)\n }\n return Object.freeze({...preset, active, inactive})\n }))\n}\n\nfunction validateKnownUniqueKeys<TItem>(\n keys: readonly string[],\n criteria: ReadonlyMap<string, GroupingCriterion<TItem>>,\n label: string,\n): void {\n if (!Array.isArray(keys)) throw new TypeError(`${label} must be an array`)\n const unique = new Set(keys)\n if (unique.size !== keys.length) throw new Error(`${label} must be unique`)\n for (const key of keys) {\n if (!criteria.has(key)) throw new Error(`${label} contains unknown criterion \"${key}\"`)\n }\n}\n\nfunction requiredCriterion<TItem>(\n criteria: ReadonlyMap<string, GroupingCriterion<TItem>>,\n key: string,\n): GroupingCriterion<TItem> {\n const criterion = criteria.get(key)\n if (criterion == null) throw new Error(`Missing criterion \"${key}\"`)\n return criterion\n}\n\nfunction freezeState(order: readonly string[], active: ReadonlySet<string>): SplitState {\n return Object.freeze({order: Object.freeze([...order]), active: new Set(active)})\n}\n\nfunction splitStatesEqual(left: SplitState, right: SplitState): boolean {\n return left.order.length === right.order.length\n && left.order.every((key, index) => key === right.order[index])\n && left.active.size === right.active.size\n && [...left.active].every((key) => right.active.has(key))\n}\n","import {Button, Checkbox, Component, GroupBox, css} from '@capillaryjs/capillary-ui'\nimport type {ComponentProps, CapillaryUiChild} from '@capillaryjs/capillary-ui'\n\nimport type {CategoryVisibility} from '../grouping.js'\nimport {SplitSelectionModel} from '../splits.js'\n\nconst activeSymbols = [\n ['☐', 'hidden'],\n ['✓', 'visible'],\n] as const\n\nexport interface SplitSelectionPanelProps<TItem> extends ComponentProps {\n readonly model: SplitSelectionModel<TItem>\n readonly label?: string\n readonly description?: string\n readonly presetsLabel?: string\n}\n\n/** Ordered enablement, presets, pointer reordering, and keyboard reordering. */\nexport class SplitSelectionPanel<TItem = unknown>\nextends Component<SplitSelectionPanelProps<TItem>> {\n static override liveProps: readonly string[] = []\n private draggingKey: string | null = null\n private pendingDrag: {key: string; clientX: number; clientY: number} | null = null\n private suppressClick = false\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null\n private announcement = ''\n\n initialize(): void {\n this.listen<PointerEvent>(document, 'pointermove', (event) => this.pointerMove(event))\n this.listen<PointerEvent>(document, 'pointerup', () => this.stopDragging())\n this.listen<PointerEvent>(document, 'pointercancel', () => this.stopDragging())\n }\n\n render(): CapillaryUiChild {\n const {\n model,\n label = 'Select and order splits',\n description = '',\n presetsLabel = 'Split presets',\n } = this.props\n const order = this.read(model.order$)\n this.read(model.activeSplits$)\n const activePreset = this.read(model.activePreset$)\n const Host = this.Host\n return <Host>\n {model.presets.length === 0 ? null : <GroupBox header={presetsLabel}>\n <cap-presets>\n {model.presets.map((preset) => <Button\n key={preset.key}\n label={preset.label}\n pressed={activePreset === preset.key}\n onClick={() => {\n model.applyPreset(preset.key)\n this.announce(`${preset.label} split preset applied`)\n }}\n />)}\n </cap-presets>\n </GroupBox>}\n <GroupBox header={label}>\n <p>{description}</p>\n <ol>{order.map((criterion) => <li\n key={criterion.key}\n className={this.draggingKey === criterion.key ? 'dragging' : undefined}\n data-split-key={criterion.key}\n onPointerDown={(event: PointerEvent) => this.startDragging(criterion.key, event)}\n onClick={(event: MouseEvent) => this.suppressDraggedClick(event)}\n >\n <Checkbox<CategoryVisibility>\n symbols={activeSymbols}\n label={criterion.label}\n valueEmitter={model.activeState(criterion.key)}\n />\n <cap-draghandle\n role=\"button\"\n tabIndex={0}\n aria-label={`Reorder ${criterion.label}`}\n title=\"Drag to reorder; use Alt+Arrow keys from the keyboard\"\n onKeyDown={(event: KeyboardEvent) => {\n if (!event.altKey || (event.key !== 'ArrowUp' && event.key !== 'ArrowDown')) {\n return\n }\n event.preventDefault()\n const offset = event.key === 'ArrowUp' ? -1 : 1\n if (model.moveBy(criterion.key, offset, 'split reordered by keyboard')) {\n const position = model.order$.get().findIndex(({key}) =>\n key === criterion.key) + 1\n this.announce(`${criterion.label} moved to position ${position}`)\n queueMicrotask(() => this.focusHandle(criterion.key))\n }\n }}\n />\n </li>)}</ol>\n <p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {this.announcement}\n </p>\n </GroupBox>\n </Host>\n }\n\n static override hostName = 'split-selection-panel'\n static dependencies = [Button, Checkbox, GroupBox]\n\n static css = css`\n & {\n display: flex;\n flex-flow: column nowrap;\n gap: var(--viz-space, 0.6rem);\n min-width: 0;\n user-select: none;\n }\n\n & > cap-groupbox {\n min-width: 0;\n }\n\n & > cap-groupbox > cap-content {\n display: flex;\n flex-flow: column;\n padding: .25em;\n flex: 1 1 0;\n }\n\n & > cap-groupbox > cap-content > p,\n & > cap-groupbox > cap-content > ol {\n margin: 0;\n }\n\n & > cap-groupbox > cap-content > p:first-child {\n color: var(--viz-muted-color, var(--ui-muted-text-color, currentColor));\n font-size: 0.875em;\n }\n\n & > cap-groupbox > cap-content > cap-presets {\n display: flex;\n flex-flow: column nowrap;\n gap: 0.35rem;\n align-items: stretch;\n }\n\n & > cap-groupbox > cap-content > cap-presets > cap-button {\n display: flex;\n flex-flow: column;\n align-content: stretch;\n }\n\n & ol {\n display: flex;\n flex-flow: column nowrap;\n gap: .33rem;\n padding: 0;\n list-style: none;\n }\n\n & li {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n justify-content: space-between;\n gap: 0.35rem;\n min-width: 0;\n padding: .15rem .35rem;\n border-radius: var(--ui-border-radius);\n box-shadow: var(--box-shadow);\n }\n\n & li:has(input[type=\"checkbox\"]:not(:checked)) {\n color: var(--viz-muted-color, var(--ui-muted-text-color, currentColor));\n }\n\n & li.dragging {\n outline: 2px solid var(--focus-color, var(--ui-accent-color));\n }\n\n & cap-draghandle {\n display: block;\n width: 1.1rem;\n height: .9rem;\n min-height: .9rem;\n padding: 0;\n border: 0;\n border-radius: 0;\n color: inherit;\n background-color: transparent;\n background-image: radial-gradient(currentColor 0.75px, transparent 0.9px);\n background-position: center;\n background-size: 3px 3px;\n cursor: grab;\n touch-action: none;\n }\n\n & cap-draghandle:focus-visible {\n outline: 2px solid var(--focus-color, var(--ui-accent-color));\n outline-offset: 1px;\n }\n\n & li > :has(> [role=\"checkbox\"]),\n & [role=\"checkbox\"] {\n\n justify-content: center;\n align-items: center;\n justify-items: center;\n align-content: center;\n }\n\n & > cap-groupbox > cap-content > p[role=\"status\"][aria-live=\"polite\"][aria-atomic=\"true\"] {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n `\n\n private pointerMove(event: PointerEvent): void {\n if (this.draggingKey == null && this.pendingDrag != null) {\n const {clientX, clientY, key} = this.pendingDrag\n if (Math.hypot(event.clientX - clientX, event.clientY - clientY) < 4) return\n this.draggingKey = key\n this.pendingDrag = null\n this.update()\n }\n if (this.draggingKey == null || typeof document.elementFromPoint !== 'function') return\n const target = document.elementFromPoint(event.clientX, event.clientY)\n ?.closest<HTMLElement>('[data-split-key]')\n if (target == null) return\n const targetKey = target.dataset.splitKey\n if (targetKey == null) return\n const targetIndex = this.props.model.order$.get().findIndex(({key}) => key === targetKey)\n if (targetIndex < 0 || !this.props.model.move(\n this.draggingKey,\n targetIndex,\n 'split reordered by pointer',\n )) return\n const criterion = this.props.model.criteria.find(({key}) => key === this.draggingKey)\n this.announce(`${criterion?.label ?? this.draggingKey} moved to position ${targetIndex + 1}`)\n }\n\n private stopDragging(): void {\n if (this.draggingKey == null && this.pendingDrag == null) return\n const key = this.draggingKey\n const dragged = key != null\n this.draggingKey = null\n this.pendingDrag = null\n if (!dragged) return\n this.suppressClick = true\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = setTimeout(() => {\n this.suppressClick = false\n this.suppressClickTimer = null\n }, 0)\n this.update()\n queueMicrotask(() => this.focusHandle(key))\n }\n\n private startDragging(key: string, event: PointerEvent): void {\n if (event.button !== 0) return\n this.pendingDrag = {key, clientX: event.clientX, clientY: event.clientY}\n }\n\n private suppressDraggedClick(event: MouseEvent): void {\n if (!this.suppressClick) return\n this.suppressClick = false\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = null\n event.preventDefault()\n event.stopPropagation()\n }\n\n private announce(message: string): void {\n this.announcement = message\n this.update()\n }\n\n private focusHandle(criterionKey: string): void {\n const handles = this.dom instanceof Element\n ? this.dom.querySelectorAll<HTMLElement>('[data-split-key] cap-draghandle')\n : []\n for (const handle of handles) {\n if (handle.closest<HTMLElement>('[data-split-key]')?.dataset.splitKey === criterionKey) {\n handle.focus()\n return\n }\n }\n }\n}\n","import type {Category} from './grouping.js'\nimport {\n addCivilDays,\n civilDateToDay,\n compareCivilDates,\n} from './dates.js'\nimport type {CivilDate} from './dates.js'\n\nexport interface HistoryShape {\n readonly key: string\n readonly label: string\n readonly color: string\n readonly colorKey?: string\n readonly values: Readonly<Record<CivilDate, number>>\n /** Carry the latest earlier value into dates with no explicit point. */\n readonly carryForward?: boolean\n}\n\nexport interface SeriesCategory {\n readonly key: string\n readonly label: string\n readonly color: string\n readonly colorKey?: string\n}\n\n/** Collect date/category deltas and build ordinary or cumulative history shapes. */\nexport class SeriesBuilder {\n private readonly categories: readonly SeriesCategory[]\n private readonly byKey: ReadonlyMap<string, SeriesCategory>\n private readonly deltas = new Map<string, Map<CivilDate, number>>()\n\n constructor(categories: readonly SeriesCategory[] | readonly Category<unknown>[]) {\n if (!Array.isArray(categories)) throw new TypeError('Series categories must be an array')\n const normalized = categories.map((category) => normalizeSeriesCategory(category))\n const byKey = new Map(normalized.map((category) => [category.key, category]))\n if (byKey.size !== normalized.length) throw new Error('Series category keys must be unique')\n this.categories = Object.freeze(normalized)\n this.byKey = byKey\n }\n\n addOne(date: CivilDate, categoryKey: string): this {\n return this.add(date, categoryKey, 1)\n }\n\n removeOne(date: CivilDate, categoryKey: string): this {\n return this.add(date, categoryKey, -1)\n }\n\n add(date: CivilDate, categoryKey: string, delta: number): this {\n civilDateToDay(date)\n if (!Number.isFinite(delta)) throw new TypeError('Series delta must be finite')\n if (!this.byKey.has(categoryKey)) {\n throw new Error(`Unknown series category \"${categoryKey}\"`)\n }\n const values = this.deltas.get(categoryKey) ?? new Map<CivilDate, number>()\n values.set(date, (values.get(date) ?? 0) + delta)\n this.deltas.set(categoryKey, values)\n return this\n }\n\n build(): readonly HistoryShape[] {\n const dates = this.allDates()\n return this.categories\n .map((category) => shapeFrom(category, Object.fromEntries(dates.map((date) => [\n date,\n this.deltas.get(category.key)?.get(date) ?? 0,\n ])), false))\n .filter((shape) => Object.values(shape.values).some((value) => value !== 0))\n }\n\n buildCumulative(): readonly HistoryShape[] {\n const dates = this.allDates()\n if (dates.length === 0) return Object.freeze([])\n const anchoredDates = [addCivilDays(dates[0]!, -1), ...dates]\n return this.categories.map((category) => {\n let value = 0\n const values: Record<CivilDate, number> = {[anchoredDates[0]!]: 0}\n for (const date of dates) {\n value += this.deltas.get(category.key)?.get(date) ?? 0\n values[date] = value\n }\n return shapeFrom(category, values, true)\n }).filter((shape) => Object.values(shape.values).some((value) => value !== 0))\n }\n\n private allDates(): CivilDate[] {\n return [...new Set([...this.deltas.values()].flatMap((values) => [...values.keys()]))]\n .sort(compareCivilDates)\n }\n}\n\nfunction normalizeSeriesCategory(\n category: SeriesCategory | Category<unknown>,\n): SeriesCategory {\n if (category == null || typeof category !== 'object') {\n throw new TypeError('Series category must be an object')\n }\n if (typeof category.key !== 'string' || category.key.trim() === '') {\n throw new TypeError('Series category key must be a non-empty string')\n }\n if (typeof category.label !== 'string' || category.label.trim() === '') {\n throw new TypeError('Series category label must be a non-empty string')\n }\n const color = 'color' in category ? category.color : category.colors[1]\n if (typeof color !== 'string' || color.trim() === '') {\n throw new TypeError('Series category color must be a non-empty CSS value')\n }\n const normalized: SeriesCategory = category.colorKey === undefined\n ? {key: category.key, label: category.label, color}\n : {key: category.key, label: category.label, color, colorKey: category.colorKey}\n return Object.freeze(normalized)\n}\n\nfunction shapeFrom(\n category: SeriesCategory,\n values: Record<CivilDate, number>,\n carryForward: boolean,\n): HistoryShape {\n return Object.freeze({\n ...category,\n values: Object.freeze(values),\n carryForward,\n })\n}\n"],"names":["categoryColorVariables","dark","base","light","isOwnColoredAlias","value","property","GroupingCriterion","options","__publicField","assertObject","assertKey","assertLabel","assertReadableEmitter","Emitter","setsEqual","DerivedEmitter","categories","hidden","key","categoryKey","emitter","VisibilityEmitter","visible","eventOrCause","currentKeys","next","_a","validateCategories","changed","category","staticCriterion","freezeCategories","categories$","derivedCriterion","items","deriveCategories","counts","unmatchedCount","item","keys","normalizedKeys","summaries","count","left","right","descriptor","freezeCategory","filterByHidden","items$","criteria","validateCriteria","sources","criterion","values","_criterion","index","categoryCounts","WritableProjection","source","owner","entry","label","frozen","freezeColors","colors","color","buildBlockLayout","splits","readabilityThreshold","issues","rootItems","root","buildNode","criterionSnapshot","findBlock","path","current","segment","child","candidate","BlockSelectionModel","splits$","ReactiveBlockLayout","blockPathsEqual","layout","block","freezePath","release","createBlockSelection","BaseEmitter","FetchState","event","parentEvent","states","sourceErrors","nonNull","computeError","error","errors","fetchState","combineFetchStates","arguments_","splitIndex","parentCount","totalShare","rootLabel","nextSplit","childrenSuppressed","children","partitionChildren","share","pathKey","groups","valid","itemIndex","matches","populated","group","childItems","childPath","other","criterionKey","STYLE_ATTRIBUTE","nextRegistryId","StyleRegistry","id","css","normalized","host","existing","fragment","resolveHostCSS","targetDocument","selector","escapeAttributeValue","style","createStyleRegistry","styleRegistry","hosts","output","cursor","openBrace","findBrace","closeBrace","findMatchingBrace","header","body","rule","expandHostSelectors","leading","trailing","_b","selectors","splitSelectors","continuationIndent","_c","result","start","parentheses","brackets","quote","character","from","skipQuote","skipComment","depth","openQuote","openComment","closeComment","serviceKeys","serviceProviders","ServiceScope","providers","provider","assertServiceProvider","assertServiceKey","cycleStart","cycle","instance","dispose","readDispose","createServiceScope","isServiceKey","englishCapillaryUiMessages","state","RuntimeLocalization","locale","messages","defaultCapillaryUiLocalization","createRuntimeLocalization","canonicalLocale","supplied","resolved","fallback","RESERVED_CUSTOM_ELEMENT_NAMES","CapillaryUiRuntime","registry","defaultDiagnosticScope","hostName","assertNamePart","assertCustomElementName","cssText","componentType","args","component","Diagnostics","parent","before","closeRouteScope","dependency","defaultCapillaryUiRuntime","Fragment","liveBindingValues","BOOLEAN_ATTRIBUTES","PROPERTY_PROPS","CAPILLARY_UI_RENDERER_ATTRIBUTE","rendererWrites","recordRendererWrite","h","type","props","suppliedProps","propChildren","restProps","normalizeChildren","strings","string","_Component","runtime","seen","concreteHostName","styleChain","componentStyleChain","diagnosticInfo","componentDiagnosticLabel","classAlias","suppliedClassName","hostProps","componentClassName","className","mergeClassNames","context","mountedNow","assertParentNode","insertRecord","_event","trigger","EventBubble","diagnosticEvent","outerWrites","writes","renderPasses","nextReads","nextVNode","normalizeRoot","patchRoot","firstNode","nextProps","_dom","observables","observable","unsubscribe","cleanup","active","target","listener","subject","eventListener","runUiInteraction","attached","detach","unregister","disposeRecord","hasIslandTrait","ancestor","Component","visit","createRecord","isReadableEmitter","end","record","subscribeUi","nextValue","readKey","isVNode","describeValue","patchChildren","node","patchElementProps","isComponentClass","sourceProps","assertSupportedComponentLiveProps","resolvedProps","resolveLivePropValues","subscribeComponentLiveProps","functionType","functionProps","diagnosticSubject","renderFunction","subscribeFunctionLiveProps","previous","isCompatible","patchCompatible","anchor","patchComponentLiveProps","patchFunctionLiveProps","isLiveBinding","reconcileLiveProps","resolvedLiveProps","declared","name","supported","rerenderFunctionRecord","rendered","render","subscriptions","onValue","liveProp","nextValues","keyed","unkeyed","seenKeys","retained","nextRecords","unkeyedIndex","valueKey","recordNodes","normalizeAttributeName","previousValue","isNativeBindingProp","patchNativeBinding","patchRef","isEventProp","patchEvent","patchLiveElementProp","previousLive","previousResolved","patchDOMProp","setAttribute","binding","assertWritableEmitter","assertNativeBindingTarget","eventName","nativeBindingEvent","interactionSubject","registered","originalListeners","interactions","nativeInteractions","scope","native","cause","action","interaction","subjects","consumed","applyRef","patchDataset","patchStyle","normalizePropertyName","enabled","oldValues","toPropertyRecord","newValues","camelToKebab","letter","ref","removeNodes","removeRenderedNode","nodes","tagName","concrete","chain","jsx","jsxs","fallbackCategoryColors","BlockGraph","model","description","emptyMessage","labelOrientation","assertBlockLabelOrientation","layoutSnapshot","isLoading","selectedPath","selected","firstKey","Host","Placeholder","Button","column","row","tabbableKey","pathsEqual","colorVariables","first","detail","orientation","blocks","activeKeys","entries","bounds","horizontalWidth","probe","width","all","flattenBlocks","element","CollapsibleOptionGroup","OptionGroup","content","regions","readDeclarativeRegions","OptionGroupHeaderEnd","headerEnd","ariaLabel","disabled","required","busy","visibilitySymbols","CategoryHidePanel","OptionsBox","itemSnapshot","categorySnapshot","countMatches","Checkbox","predicate","DAY_MILLISECONDS","civilDatePattern","civilDateToDay","match","year","month","date","milliseconds","parsed","dayToCivilDate","day","addCivilDays","days","todayCivilDate","now","compareCivilDates","buildLineChartModel","shapes","validateShapes","finiteDimension","height","plotLeft","plotTop","plotWidth","plotHeight","allDates","shape","today","minDate","earliestDate","maxDate","minDay","maxDay","sampleDays","collectSampleDays","stacked","rawSeries","valueAtDay","minimum","maximum","accumulated","positioned","baseValue","displayValue","span","maxY","minY","_d","ySpan","daySpan","series","buildDateMarks","buildIntegerTicks","valueAtDate","linePath","points","smooth","format","midpoint","areaPath","top","reversed","bottom","point","rough","magnitude","nice","step","exact","bestDay","bestValue","rawStep","marks","LineGraph","range","cursorDate","calculationError","activeDate","formatDate","formatValue","input","purpose","svgX","ratio","svg","createSvg","tick","line","setAttributes","mark","area","x","SVG_NAMESPACE","attributes","SplitSelectionModel","byKey","freezePresets","order","validateKnownUniqueKeys","freezeState","splitStatesEqual","requiredCriterion","ActiveSplitEmitter","targetIndex","to","offset","inactive","activeSet","inactiveKeys","combined","presetKey","preset","createSplitSelection","notification","presets","activeSymbols","SplitSelectionPanel","presetsLabel","activePreset","GroupBox","position","clientX","clientY","targetKey","dragged","message","handles","handle","SeriesBuilder","normalizeSeriesCategory","delta","dates","shapeFrom","anchoredDates","carryForward"],"mappings":"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"}