@sylwellsoftware/fray 0.1.0-alpha.1 → 0.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.
Files changed (75) hide show
  1. package/README.md +324 -21
  2. package/colors/README.md +15 -0
  3. package/colors/gray/colors.css +29 -0
  4. package/colors/green/colors.css +29 -0
  5. package/colors/iceblue/colors.css +29 -0
  6. package/colors/ocean/colors.css +29 -0
  7. package/colors/orange/colors.css +29 -0
  8. package/colors/purple/colors.css +29 -0
  9. package/colors/red/colors.css +29 -0
  10. package/colors/yellow/colors.css +29 -0
  11. package/dist/Components/Placeholder.d.ts +1 -1
  12. package/dist/Components/Placeholder.d.ts.map +1 -1
  13. package/dist/Components/controlUtils.d.ts.map +1 -1
  14. package/dist/Components/data/filterState.d.ts +38 -0
  15. package/dist/Components/data/filterState.d.ts.map +1 -0
  16. package/dist/Components/data/listview/listview.d.ts +16 -5
  17. package/dist/Components/data/listview/listview.d.ts.map +1 -1
  18. package/dist/Components/data/selectionhandler.d.ts +24 -5
  19. package/dist/Components/data/selectionhandler.d.ts.map +1 -1
  20. package/dist/Components/data/table/DataTable.d.ts +36 -30
  21. package/dist/Components/data/table/DataTable.d.ts.map +1 -1
  22. package/dist/Components/data/table/FilterPanel.d.ts +8 -1
  23. package/dist/Components/data/table/FilterPanel.d.ts.map +1 -1
  24. package/dist/Components/data/table/TableHeaderCell.d.ts.map +1 -1
  25. package/dist/Components/data/table/tableDataSource.d.ts +49 -0
  26. package/dist/Components/data/table/tableDataSource.d.ts.map +1 -0
  27. package/dist/Components/data/table/tableQuery.d.ts +6 -2
  28. package/dist/Components/data/table/tableQuery.d.ts.map +1 -1
  29. package/dist/Components/data/treeview/treeModel.d.ts +23 -0
  30. package/dist/Components/data/treeview/treeModel.d.ts.map +1 -0
  31. package/dist/Components/data/treeview/treeview.d.ts +1 -1
  32. package/dist/Components/data/treeview/treeview.d.ts.map +1 -1
  33. package/dist/Components/dialog/dialog.d.ts +1 -1
  34. package/dist/Components/dialog/dialog.d.ts.map +1 -1
  35. package/dist/Components/layout/panel.d.ts.map +1 -1
  36. package/dist/Components/layout/tabpanel/tabline.d.ts.map +1 -1
  37. package/dist/Components/lineinputs/checkbox/Checkbox.d.ts +1 -1
  38. package/dist/Components/lineinputs/checkbox/Checkbox.d.ts.map +1 -1
  39. package/dist/Components/lineinputs/checkbox/QuadCheckbox.d.ts +2 -2
  40. package/dist/Components/lineinputs/checkbox/QuadCheckbox.d.ts.map +1 -1
  41. package/dist/Components/lineinputs/checkbox/TriCheckbox.d.ts +2 -2
  42. package/dist/Components/lineinputs/checkbox/TriCheckbox.d.ts.map +1 -1
  43. package/dist/Components/lineinputs/toggle.d.ts.map +1 -1
  44. package/dist/Components/status/progressBar.d.ts.map +1 -1
  45. package/dist/Components/theme/stylesheetPicker.d.ts +40 -0
  46. package/dist/Components/theme/stylesheetPicker.d.ts.map +1 -0
  47. package/dist/index.d.ts +16 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +2807 -559
  50. package/dist/index.js.map +1 -1
  51. package/dist/{jsx-dev-runtime-CarwHDyL.js → jsx-dev-runtime-DukiDpV9.js} +202 -214
  52. package/dist/jsx-dev-runtime-DukiDpV9.js.map +1 -0
  53. package/dist/jsx-dev-runtime.js +1 -1
  54. package/dist/jsx-runtime.js +1 -1
  55. package/dist/styling/baseStyleDefinitions.d.ts +3 -0
  56. package/dist/styling/baseStyleDefinitions.d.ts.map +1 -1
  57. package/dist/styling/styleRegistry.d.ts.map +1 -1
  58. package/dist/styling/theme.d.ts +27 -0
  59. package/dist/styling/theme.d.ts.map +1 -0
  60. package/dist/util/filterMode.d.ts +6 -4
  61. package/dist/util/filterMode.d.ts.map +1 -1
  62. package/package.json +14 -11
  63. package/styles/structural.css +922 -0
  64. package/themes/README.md +84 -30
  65. package/themes/java/theme.css +140 -0
  66. package/themes/minimal/theme.css +128 -0
  67. package/themes/shiny/theme.css +314 -0
  68. package/EXPERIMENTAL.md +0 -75
  69. package/dist/button-BRDkmR1C.js +0 -203
  70. package/dist/button-BRDkmR1C.js.map +0 -1
  71. package/dist/experimental.d.ts +0 -16
  72. package/dist/experimental.d.ts.map +0 -1
  73. package/dist/experimental.js +0 -1361
  74. package/dist/experimental.js.map +0 -1
  75. package/dist/jsx-dev-runtime-CarwHDyL.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"experimental.js","sources":["../src/Components/Placeholder.tsx","../src/Components/data/selectionhandler.ts","../src/Components/data/listview/listview.tsx","../src/Components/data/table/FilterPanel.tsx","../src/Components/data/table/TableHeaderCell.tsx","../src/Components/data/table/TableHeader.tsx","../src/Components/data/table/tableQuery.ts","../src/Components/data/table/DataTable.tsx","../src/Components/data/treeview/treeitem.tsx","../src/Components/data/treeview/treeview.tsx","../src/Components/dialog/dialog.tsx"],"sourcesContent":["import {Component, css} from './component.js'\nimport type {ComponentProps} from './component.js'\n\nexport interface PlaceholderProps extends ComponentProps {\n width?: number | string\n}\n\n/** Deterministic loading placeholder for experimental data components. */\nexport class Placeholder extends Component<PlaceholderProps> {\n render() {\n const width = normalizeWidth(this.props.width ?? 65)\n const Host = this.Host\n return <Host style={{width: `${width}%`}} aria-hidden=\"true\" />\n }\n\n static override hostName = 'placeholder'\n static override standaloneHostName = 'loading-placeholder'\n\n static baseStyles = [\n ['&::after', ['after', 'working']],\n ]\n\n static css = css`\n & {\n display: block;\n min-width: 3rem;\n height: 1em;\n overflow: hidden;\n background: currentColor;\n border-radius: var(--ui-border-radius);\n opacity: 0.18;\n position: relative;\n }\n\n @keyframes fray-placeholder-progress {\n from { background-position: 0 0; }\n to { background-position: 2rem 0; }\n }\n `\n}\n\nfunction normalizeWidth(width: number | string): number {\n const numeric = Number(width)\n if (!Number.isFinite(numeric)) throw new TypeError('Placeholder width must be numeric')\n return Math.min(100, Math.max(10, numeric))\n}\n","import {Emitter} from '@sylwellsoftware/glue'\n\nimport type {ValueEmitter} from '../controlUtils.js'\n\nexport type ItemKeyGetter<TItem> = (item: TItem, index: number) => unknown\n\nexport interface SelectionHandlerConfig<TItem> {\n getItems: () => readonly TItem[]\n getKey?: ItemKeyGetter<TItem>\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n owner?: unknown\n multiSelect?: boolean\n}\n\ntype SelectionEvent = MouseEvent | KeyboardEvent\n\n/**\n * DOM selection behavior backed by an explicit row-data provider.\n *\n * Construction is side-effect free. Row listeners are installed by\n * `rowsUpdated()` and are always released before the next row set is wired.\n */\nexport class BaseSelectionHandler<TItem = unknown> {\n readonly getItems: () => readonly TItem[]\n readonly getKey: ItemKeyGetter<TItem>\n readonly selectedItemsEmitter: ValueEmitter<TItem[]>\n readonly selectedItems$: ValueEmitter<TItem[]>\n readonly ownsSelectedItemsEmitter: boolean\n protected rows: HTMLElement[] = []\n private readonly rowCleanups: Array<() => void> = []\n protected activeIndex = 0\n protected anchorIndex: number | null = null\n private dragStartIndex: number | null = null\n private dragOriginEvent: MouseEvent | null = null\n private dragMoved = false\n private dragCleanup: (() => void) | null = null\n private suppressNextClick = false\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null\n private destroyed = false\n private readonly ownedSelectedItemsEmitter: Emitter<TItem[]> | null\n\n constructor({\n getItems,\n getKey = defaultItemKey,\n selectedItemsEmitter,\n owner = null,\n }: SelectionHandlerConfig<TItem>) {\n if (typeof getItems !== 'function') {\n throw new TypeError('Selection handler getItems must be a function')\n }\n if (typeof getKey !== 'function') {\n throw new TypeError('Selection handler getKey must be a function')\n }\n this.getItems = getItems\n this.getKey = getKey\n this.ownedSelectedItemsEmitter = selectedItemsEmitter == null\n ? new Emitter<TItem[]>([], {owner, purpose: 'selected items'})\n : null\n this.selectedItemsEmitter = selectedItemsEmitter\n ?? this.ownedSelectedItemsEmitter!\n this.selectedItems$ = this.selectedItemsEmitter\n this.ownsSelectedItemsEmitter = this.ownedSelectedItemsEmitter != null\n }\n\n rowsUpdated(rows: Iterable<HTMLElement> | ArrayLike<HTMLElement> | null): void {\n if (this.destroyed) return\n this.releaseRows()\n this.rows = Array.from(rows ?? [])\n this.rows.forEach((row, index) => this.wireRow(row, index))\n this.activeIndex = clampIndex(this.activeIndex, this.rows.length)\n this.reconcileSelectedItems()\n this.syncRows()\n }\n\n private wireRow(row: HTMLElement, index: number): void {\n const onClick = (event: MouseEvent): void => this.handleClick(index, event)\n const onKeyDown = (event: KeyboardEvent): void => this.handleKeyDown(index, event)\n const onMouseDown = (event: MouseEvent): void => this.handleMouseDown(index, event, row)\n const onMouseEnter = (event: MouseEvent): void => this.handleMouseEnter(index, event)\n row.addEventListener('click', onClick)\n row.addEventListener('keydown', onKeyDown)\n row.addEventListener('mousedown', onMouseDown)\n row.addEventListener('mouseenter', onMouseEnter)\n this.rowCleanups.push(() => {\n row.removeEventListener('click', onClick)\n row.removeEventListener('keydown', onKeyDown)\n row.removeEventListener('mousedown', onMouseDown)\n row.removeEventListener('mouseenter', onMouseEnter)\n })\n }\n\n private handleClick(index: number, event: MouseEvent): void {\n event.preventDefault()\n if (this.suppressNextClick) {\n this.clearClickSuppression()\n return\n }\n this.activeIndex = index\n this.selectIndex(index, event)\n this.rows[index]?.focus()\n }\n\n private handleMouseDown(index: number, event: MouseEvent, row: HTMLElement): void {\n if (event.button !== 0 || !this.supportsDragSelection()) return\n this.finishDrag(false)\n this.clearClickSuppression()\n this.dragStartIndex = index\n this.dragOriginEvent = event\n this.dragMoved = false\n const ownerDocument = row.ownerDocument\n const onMouseUp = (): void => this.finishDrag(this.dragMoved)\n ownerDocument.addEventListener('mouseup', onMouseUp)\n this.dragCleanup = () => ownerDocument.removeEventListener('mouseup', onMouseUp)\n }\n\n private handleMouseEnter(index: number, event: MouseEvent): void {\n if (this.dragStartIndex == null) return\n if (index === this.dragStartIndex && !this.dragMoved) return\n if (index === this.activeIndex && this.dragMoved) return\n event.preventDefault()\n this.dragMoved = true\n this.activeIndex = index\n this.selectDragRange(this.dragStartIndex, index, this.dragOriginEvent ?? event)\n this.rows[index]?.focus()\n }\n\n private handleKeyDown(index: number, event: KeyboardEvent): void {\n const lastIndex = this.rows.length - 1\n let nextIndex: number\n if (event.key === 'ArrowDown') nextIndex = Math.min(index + 1, lastIndex)\n else if (event.key === 'ArrowUp') nextIndex = Math.max(index - 1, 0)\n else if (event.key === 'Home') nextIndex = 0\n else if (event.key === 'End') nextIndex = lastIndex\n else if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n this.activeIndex = index\n this.selectIndex(index, event)\n return\n } else return\n\n event.preventDefault()\n this.activeIndex = nextIndex\n this.onKeyboardMove(nextIndex, event)\n this.syncRows()\n this.rows[nextIndex]?.focus()\n }\n\n protected onKeyboardMove(index: number, event: KeyboardEvent): void {\n this.selectIndex(index, event)\n }\n\n protected supportsDragSelection(): boolean {\n return false\n }\n\n protected selectDragRange(\n _startIndex: number,\n _endIndex: number,\n _event: MouseEvent,\n ): void {}\n\n protected selectIndex(_index: number, _event: SelectionEvent): void {}\n\n protected setSelectedItems(items: TItem[], cause = 'selection changed'): void {\n this.selectedItemsEmitter.set(items, cause)\n this.syncRows()\n }\n\n getSelectedItems(): TItem[] {\n return this.selectedItemsEmitter.get() ?? []\n }\n\n getSelectedItemsEmitter(): ValueEmitter<TItem[]> {\n return this.selectedItemsEmitter\n }\n\n private reconcileSelectedItems(): void {\n const selected = this.getSelectedItems()\n if (selected.length === 0) return\n const selectedKeys = new Set(selected.map((item, index) => this.getKey(item, index)))\n const current = this.getItems().filter((item, index) =>\n selectedKeys.has(this.getKey(item, index)))\n if (current.length !== selected.length\n || current.some((item, index) => !Object.is(item, selected[index]))) {\n this.selectedItemsEmitter.set([...current], 'selection reconciled with rows')\n }\n }\n\n private syncRows(): void {\n const selectedKeys = new Set(this.getSelectedItems().map((item, index) =>\n this.getKey(item, index)))\n const items = this.getItems()\n this.rows.forEach((row, index) => {\n const item = items[index]\n const selected = item !== undefined\n && selectedKeys.has(this.getKey(item, index))\n row.classList.toggle('selected', selected)\n row.setAttribute('aria-selected', String(selected))\n row.tabIndex = index === this.activeIndex ? 0 : -1\n })\n }\n\n private releaseRows(): void {\n for (const cleanup of this.rowCleanups.splice(0)) cleanup()\n this.rows = []\n }\n\n private finishDrag(suppressClick: boolean): void {\n this.dragCleanup?.()\n this.dragCleanup = null\n this.dragStartIndex = null\n this.dragOriginEvent = null\n this.dragMoved = false\n if (!suppressClick) return\n this.suppressNextClick = true\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = setTimeout(() => this.clearClickSuppression(), 0)\n }\n\n private clearClickSuppression(): void {\n this.suppressNextClick = false\n if (this.suppressClickTimer != null) clearTimeout(this.suppressClickTimer)\n this.suppressClickTimer = null\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.finishDrag(false)\n this.clearClickSuppression()\n this.releaseRows()\n this.ownedSelectedItemsEmitter?.dispose()\n }\n}\n\nexport class SingleSelectionHandler<TItem = unknown> extends BaseSelectionHandler<TItem> {\n protected selectIndex(index: number): void {\n const item = this.getItems()[index]\n if (item === undefined) return\n this.anchorIndex = index\n this.setSelectedItems([item], 'single selection changed')\n }\n}\n\nexport class MultiSelectionHandler<TItem = unknown> extends BaseSelectionHandler<TItem> {\n protected selectIndex(index: number, event: SelectionEvent): void {\n const items = this.getItems()\n const item = items[index]\n if (item === undefined) return\n\n if (event.shiftKey && this.anchorIndex != null) {\n const first = Math.min(this.anchorIndex, index)\n const last = Math.max(this.anchorIndex, index)\n const range = items.slice(first, last + 1)\n const next = isCommandPressed(event)\n ? mergeByKey(this.getSelectedItems(), range, this.getKey)\n : [...range]\n this.setSelectedItems(next, 'range selection changed')\n return\n }\n\n if (isCommandPressed(event) || ('key' in event && event.key === ' ')) {\n const selected = this.getSelectedItems()\n const key = this.getKey(item, index)\n const exists = selected.some((candidate, candidateIndex) =>\n Object.is(this.getKey(candidate, candidateIndex), key))\n const next = exists\n ? selected.filter((candidate, candidateIndex) =>\n !Object.is(this.getKey(candidate, candidateIndex), key))\n : [...selected, item]\n this.anchorIndex = index\n this.setSelectedItems(next, 'multi selection toggled')\n return\n }\n\n this.anchorIndex = index\n this.setSelectedItems([item], 'multi selection changed')\n }\n\n protected onKeyboardMove(index: number, event: KeyboardEvent): void {\n if (event.shiftKey) this.selectIndex(index, event)\n }\n\n protected supportsDragSelection(): boolean {\n return true\n }\n\n protected selectDragRange(\n startIndex: number,\n endIndex: number,\n event: MouseEvent,\n ): void {\n const items = this.getItems()\n const first = Math.min(startIndex, endIndex)\n const last = Math.max(startIndex, endIndex)\n const range = items.slice(first, last + 1)\n const next = isCommandPressed(event)\n ? mergeByKey(this.getSelectedItems(), range, this.getKey)\n : [...range]\n this.anchorIndex = startIndex\n this.setSelectedItems(next, 'drag selection changed')\n }\n}\n\nexport function createSelectionHandler<TItem>(\n config: SelectionHandlerConfig<TItem>,\n): BaseSelectionHandler<TItem> {\n return config.multiSelect\n ? new MultiSelectionHandler(config)\n : new SingleSelectionHandler(config)\n}\n\nexport function defaultItemKey<TItem>(item: TItem, index: number): unknown {\n if (item != null && typeof item === 'object') {\n const id = Reflect.get(item, 'id')\n if (id != null) return id\n }\n if (typeof item === 'string' || typeof item === 'number') return item\n throw new TypeError(\n `Selection item at index ${index} needs an id or an explicit itemKey/rowKey`,\n )\n}\n\nfunction isCommandPressed(event: MouseEvent | KeyboardEvent): boolean {\n return Boolean(event.ctrlKey || event.metaKey)\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) return 0\n return Math.min(Math.max(index, 0), length - 1)\n}\n\nfunction mergeByKey<TItem>(\n left: readonly TItem[],\n right: readonly TItem[],\n getKey: ItemKeyGetter<TItem>,\n): TItem[] {\n const result = [...left]\n const keys = new Set(left.map((item, index) => getKey(item, index)))\n for (const item of right) {\n const key = getKey(item, result.length)\n if (!keys.has(key)) {\n keys.add(key)\n result.push(item)\n }\n }\n return result\n}\n","import {Emitter, FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {\n createSelectionHandler,\n defaultItemKey,\n} from '../selectionhandler.js'\nimport type {\n BaseSelectionHandler,\n ItemKeyGetter,\n} from '../selectionhandler.js'\n\nexport interface ListViewProps<TItem = unknown> extends ComponentProps {\n items?: readonly TItem[] | ReadableEmitter<readonly TItem[], unknown>\n selectedItemsEmitter?: ValueEmitter<TItem[]>\n itemKey?: string | ItemKeyGetter<TItem>\n multiSelect?: boolean\n label?: string\n placeholderCount?: number\n renderItem?: (item: TItem, index: number) => FrayChild\n}\n\n/** Experimental accessible listbox with stable-key selection. */\nexport class ListView<TItem = unknown> extends Component<ListViewProps<TItem>> {\n readonly itemsEmitter: ReadableEmitter<readonly TItem[], unknown>\n readonly items$: ReadableEmitter<readonly TItem[], unknown>\n readonly selectedItemsEmitter: ValueEmitter<TItem[]>\n readonly selectedItems$: ValueEmitter<TItem[]>\n readonly getItemKey: ItemKeyGetter<TItem>\n readonly selectionHandler: BaseSelectionHandler<TItem>\n private readonly ownedItemsEmitter: Emitter<readonly TItem[]> | null\n private readonly ownedSelectedItemsEmitter: Emitter<TItem[]> | null\n\n constructor(props: ListViewProps<TItem> = {}) {\n super(props)\n if (isReadableEmitter<readonly TItem[]>(props.items)) {\n this.itemsEmitter = props.items\n this.ownedItemsEmitter = null\n } else {\n this.ownedItemsEmitter = new Emitter<readonly TItem[]>(props.items ?? [], {\n owner: this,\n purpose: 'list items',\n })\n this.itemsEmitter = this.ownedItemsEmitter\n }\n this.items$ = this.itemsEmitter\n this.ownedSelectedItemsEmitter = props.selectedItemsEmitter == null\n ? new Emitter<TItem[]>([], {owner: this, purpose: 'selected list items'})\n : null\n this.selectedItemsEmitter = props.selectedItemsEmitter\n ?? this.ownedSelectedItemsEmitter!\n this.selectedItems$ = this.selectedItemsEmitter\n this.getItemKey = normalizeKeyGetter(props.itemKey)\n this.selectionHandler = createSelectionHandler({\n owner: this,\n multiSelect: props.multiSelect ?? false,\n selectedItemsEmitter: this.selectedItemsEmitter,\n getItems: () => this.itemsEmitter.get(),\n getKey: this.getItemKey,\n })\n }\n\n initialize(): void {\n this.watch(this.itemsEmitter, this.selectedItemsEmitter)\n }\n\n render(): FrayChild {\n const rows = this.itemsEmitter.get()\n if (!Array.isArray(rows)) throw new TypeError('ListView items must be an array')\n const status = this.itemsEmitter.getFetchState()\n const error = this.itemsEmitter.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const selectedKeys = new Set(this.selectedItemsEmitter.get()\n .map((item, index) => this.getItemKey(item, index)))\n\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n >\n {status === FetchState.Error\n ? <p role=\"alert\" data-part=\"error\">\n {errorMessage(error, 'Unable to load items')}\n </p>\n : null}\n {isLoading && rows.length === 0\n ? <div role=\"status\" data-part=\"loading\">\n <span>Loading items…</span>\n {Array.from({length: this.props.placeholderCount ?? 5}, (_, index) =>\n <div key={`placeholder-${index}`} data-part=\"placeholder-row\">\n <Placeholder width={45 + index * 7} />\n </div>)}\n </div>\n : null}\n {status === FetchState.Ready && rows.length === 0\n ? <p role=\"status\" data-part=\"empty\">No items</p>\n : null}\n {rows.length > 0\n ? <div\n role=\"listbox\"\n data-part=\"list\"\n aria-label={this.props.label ?? 'Items'}\n aria-busy={isLoading ? 'true' : null}\n aria-multiselectable={this.props.multiSelect ? 'true' : null}\n >{rows.map((item, index) => {\n const key = this.getItemKey(item, index)\n const selected = selectedKeys.has(key)\n const content = this.props.renderItem\n ? this.props.renderItem(item, index)\n : defaultItemLabel(item)\n return <div\n key={String(key)}\n role=\"option\"\n data-part=\"row\"\n data-fray-selectable-row=\"\"\n data-index={index}\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >{content}</div>\n })}</div>\n : null}\n </Host>\n }\n\n afterUpdate(dom: ChildNode | null): void {\n const rows = dom instanceof Element\n ? dom.querySelectorAll<HTMLElement>('[data-fray-selectable-row]')\n : []\n this.selectionHandler.rowsUpdated(rows)\n }\n\n getSelectedItems(): TItem[] {\n return this.selectionHandler.getSelectedItems()\n }\n\n getSelectedItemsEmitter(): ValueEmitter<TItem[]> {\n return this.selectedItemsEmitter\n }\n\n onDestroy(): void {\n this.selectionHandler.destroy()\n this.ownedItemsEmitter?.dispose()\n this.ownedSelectedItemsEmitter?.dispose()\n }\n\n static dependencies = [Placeholder]\n\n static override hostName = 'list-view'\n static override standaloneHostName = 'list-view'\n\n static baseStyles = [\n ['&', 'inputlike'],\n ['& > [data-part=\"list\"] > [data-part=\"row\"]', 'inputline'],\n ]\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n min-height: 0;\n }\n\n & > [data-part=\"list\"],\n & > [data-part=\"loading\"] {\n display: flex;\n flex-direction: column;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"] {\n cursor: default;\n user-select: none;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"]:hover,\n & > [data-part=\"list\"] > [data-part=\"row\"]:focus-visible {\n background: var(--button-background-hover);\n outline: 2px solid var(--ui-accent-color);\n outline-offset: -2px;\n }\n\n & > [data-part=\"list\"] > [data-part=\"row\"][aria-selected=\"true\"] {\n color: var(--toggle-selected-text);\n background: var(--toggle-selected-bg);\n }\n\n & > [data-part=\"empty\"],\n & > [data-part=\"error\"] {\n margin: 0;\n padding: var(--ui-padding);\n }\n\n & > [data-part=\"error\"] {\n color: var(--error-color);\n }\n `\n}\n\nfunction normalizeKeyGetter<TItem>(\n itemKey: ListViewProps<TItem>['itemKey'],\n): ItemKeyGetter<TItem> {\n if (itemKey == null) return defaultItemKey\n if (typeof itemKey === 'function') return itemKey\n if (typeof itemKey === 'string' && itemKey.length > 0) {\n return (item, index) => {\n if (item == null || (typeof item !== 'object' && typeof item !== 'function')) {\n throw new TypeError(`ListView item at index ${index} lacks ${itemKey}`)\n }\n const key = Reflect.get(item, itemKey)\n if (key == null) {\n throw new TypeError(`ListView item at index ${index} lacks ${itemKey}`)\n }\n return key\n }\n }\n throw new TypeError('ListView itemKey must be a function or property name')\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction defaultItemLabel(item: unknown): FrayChild {\n if (item != null && (typeof item === 'object' || typeof item === 'function')) {\n const label = Reflect.get(item, 'label')\n if (isRenderablePrimitive(label)) return label\n }\n return String(item)\n}\n\nfunction isRenderablePrimitive(value: unknown): value is string | number | null | undefined {\n return value == null || typeof value === 'string' || typeof value === 'number'\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {FetchState} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css} from '../../component.js'\nimport type {ComponentConstructor, ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport {Checkbox} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {\n CheckboxProps,\n CheckboxSymbol,\n} from '../../lineinputs/checkbox/Checkbox.js'\nimport {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport type FilterValue = string | number\n\nexport interface FilterOption {\n value: FilterValue\n label?: FrayChild\n}\n\nexport type FilterOptionInput = FilterValue | FilterOption\nexport type FilterOptions = readonly FilterOptionInput[]\nexport type FilterOptionsSource = FilterOptions | ReadableEmitter<FilterOptions, unknown>\nexport type FilterSelection = ReadonlyMap<FilterValue, FilterModeValue>\n\nexport interface FilterPanelProps extends ComponentProps {\n options?: FilterOptionsSource\n filters?: FilterSelection | readonly (readonly [FilterValue, FilterModeValue])[]\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n label?: string\n onChange?: (filters: Map<FilterValue, FilterModeValue>, event: Event | null) => void\n}\n\n/** Experimental filter choices. Option data is always supplied by the caller. */\nexport class FilterPanel extends Component<FilterPanelProps> {\n readonly optionsEmitter: ReadableEmitter<FilterOptions, unknown> | null\n\n constructor(props: FilterPanelProps = {}) {\n super(props)\n this.optionsEmitter = isEmitterLike<FilterOptions>(props.options) ? props.options : null\n }\n\n initialize(): void {\n if (this.optionsEmitter) this.watch(this.optionsEmitter)\n }\n\n render(): FrayChild {\n const values = this.optionsEmitter?.get()\n ?? (Array.isArray(this.props.options) ? this.props.options : [])\n if (!Array.isArray(values)) {\n throw new TypeError('FilterPanel options must be an array or emitter of arrays')\n }\n const fetchState = this.optionsEmitter?.getFetchState() ?? FetchState.Ready\n const error = this.optionsEmitter?.getError()\n const filters = normalizeFilters(this.props.filters)\n const filterModes = this.props.filterModes ?? Checkbox.symbols\n const defaultSemanticState = this.props.defaultSemanticState ?? FilterMode.Neutral\n const Host = this.Host\n\n if (fetchState === FetchState.Error) {\n return <Host\n className={componentClass(this.props) || null}\n role=\"alert\"\n data-state=\"error\"\n >{errorMessage(error, 'Unable to load filter options')}</Host>\n }\n if ((fetchState === FetchState.Initial || fetchState === FetchState.Loading)\n && values.length === 0) {\n return <Host\n className={componentClass(this.props) || null}\n role=\"status\"\n data-state=\"loading\"\n >Loading filter options…</Host>\n }\n\n return <Host\n className={componentClass(this.props) || null}\n role=\"group\"\n aria-label={this.props.label ?? 'Filter options'}\n >\n {values.length === 0\n ? <span>No filter options</span>\n : values.map((option) => {\n const value = optionValue(option)\n const label = optionLabel(option)\n const state = filters.get(value) ?? defaultSemanticState\n return <FilterModeCheckbox\n key={`${String(value)}:${String(state)}`}\n label={label}\n defaultValue={state}\n symbols={filterModes}\n onChange={(nextState, event) => {\n event?.stopPropagation()\n const next = new Map(filters)\n if (nextState === FilterMode.Neutral) next.delete(value)\n else next.set(value, nextState)\n this.props.onChange?.(next, event)\n }}\n />\n })}\n </Host>\n }\n\n static dependencies = [Checkbox]\n\n static override hostName = 'filter-panel'\n static override standaloneHostName = 'filter-panel'\n\n static css = css`\n & {\n position: absolute;\n z-index: 1000;\n inset-block-start: 100%;\n inset-inline-end: 0;\n display: flex;\n min-width: 12rem;\n padding: var(--ui-padding);\n flex-flow: column nowrap;\n align-items: stretch;\n color: var(--panel-color);\n background: var(--panel-bg);\n border: var(--panel-border);\n border-radius: var(--panel-radius);\n box-shadow: var(--panel-shadow);\n }\n `\n}\n\n// Passing a generic class as a runtime vnode erases its state parameter. The\n// concrete props below restore the FilterMode relationship checked by tsc.\nconst FilterModeCheckbox = Checkbox as unknown as ComponentConstructor<\n CheckboxProps<FilterModeValue>\n>\n\nfunction normalizeFilters(\n filters: FilterPanelProps['filters'],\n): Map<FilterValue, FilterModeValue> {\n if (filters == null) return new Map<FilterValue, FilterModeValue>()\n if (filters instanceof Map) return new Map(filters)\n if (Array.isArray(filters)) return new Map(filters)\n throw new TypeError('FilterPanel filters must be a Map or tuple array')\n}\n\nfunction optionValue(option: FilterOptionInput): FilterValue {\n if (typeof option === 'string' || typeof option === 'number') return option\n if (option != null && typeof option === 'object') {\n const value = Reflect.get(option, 'value')\n if (typeof value === 'string' || typeof value === 'number') return value\n }\n throw new TypeError('Filter options must be strings, numbers, or value/label objects')\n}\n\nfunction optionLabel(option: FilterOptionInput): FrayChild {\n if (option != null && typeof option === 'object') {\n const label = Reflect.get(option, 'label')\n if (label != null) return isFrayLabel(label) ? label : String(label)\n }\n return String(optionValue(option))\n}\n\nfunction isFrayLabel(value: unknown): value is string | number {\n return typeof value === 'string' || typeof value === 'number'\n}\n\nfunction isEmitterLike<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {FilterPanel} from './FilterPanel.js'\nimport type {\n FilterOptionsSource,\n FilterSelection,\n FilterValue,\n} from './FilterPanel.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport type TableRow = Record<string, unknown>\n\nexport interface TableColumnBase {\n field: string\n label?: FrayChild\n sortable?: boolean\n filterOptions?: FilterOptionsSource\n}\n\nexport interface TableColumn<TRow extends TableRow = TableRow> extends TableColumnBase {\n field: Extract<keyof TRow, string>\n render?: (row: TRow, index: number) => FrayChild\n}\n\nexport interface TableHeaderCellProps extends ComponentProps, TableColumnBase {\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\nexport class TableHeaderCell extends Component<TableHeaderCellProps> {\n private filterVisible = false\n\n initialize(): void {\n this.watch(this.props.sortEmitter, this.props.filtersEmitter)\n if (this.props.filterOptions != null) {\n this.listen<MouseEvent>(document, 'click', this.onGlobalClick)\n }\n }\n\n toggleSort(): void {\n if (!this.props.sortable) return\n const current = this.props.sortEmitter.get()\n let next: TableSort | null\n if (current?.field !== this.props.field) {\n next = {field: this.props.field, direction: 'asc'}\n } else if (current.direction === 'asc') {\n next = {field: this.props.field, direction: 'desc'}\n } else next = null\n this.props.sortEmitter.set(next, 'table sort changed')\n }\n\n toggleFilterPanel(event: MouseEvent): void {\n event.stopPropagation()\n this.filterVisible = !this.filterVisible\n this.update()\n }\n\n updateFilters(next: FilterSelection, event: Event | null): void {\n const filters: TableFilters = {...this.props.filtersEmitter.get()}\n if (next.size === 0) delete filters[this.props.field]\n else filters[this.props.field] = [...next.entries()]\n this.props.filtersEmitter.set(filters, 'table filters changed')\n this.props.onFilterChange?.(filters, event)\n }\n\n render(): FrayChild {\n const currentSort = this.props.sortEmitter.get()\n const direction = currentSort?.field === this.props.field\n ? currentSort.direction\n : null\n const filters = new Map<FilterValue, FilterModeValue>(\n (this.props.filtersEmitter.get()[this.props.field] ?? [])\n .filter(isFilterSelectionEntry),\n )\n const label = this.props.label ?? String(this.props.field)\n const filterLabel = `Filter ${String(label)}`\n\n let panel: FrayChild = null\n if (this.filterVisible && this.props.filterOptions != null) {\n panel = <FilterPanel\n key=\"filter-panel\"\n label={filterLabel}\n options={this.props.filterOptions}\n filters={filters}\n onChange={(next, event) => this.updateFilters(next, event)}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n />\n }\n\n return <th\n scope=\"col\"\n data-fray-component=\"table-header-cell\"\n aria-sort={direction === 'asc'\n ? 'ascending'\n : direction === 'desc' ? 'descending' : 'none'}\n >\n {this.props.sortable\n ? <button\n type=\"button\"\n data-part=\"sort\"\n onClick={() => this.toggleSort()}\n >\n {label}\n {direction === 'asc' ? ' ▲' : direction === 'desc' ? ' ▼' : ''}\n </button>\n : <span data-part=\"label\">{label}</span>}\n {this.props.filterOptions == null\n ? null\n : <button\n type=\"button\"\n data-part=\"filter-toggle\"\n aria-label={filterLabel}\n aria-expanded={String(this.filterVisible)}\n onClick={(event: MouseEvent) => this.toggleFilterPanel(event)}\n >Filter</button>}\n {panel}\n </th>\n }\n\n private readonly onGlobalClick = (event: MouseEvent): void => {\n if (this.filterVisible\n && this.dom instanceof Node\n && event.target instanceof Node\n && !this.dom.contains(event.target)) {\n this.filterVisible = false\n this.update()\n }\n }\n\n static dependencies = [FilterPanel]\n\n static baseStyles = [\n ['th[data-fray-component=\"table-header-cell\"]', 'noselect'],\n ['th[data-fray-component=\"table-header-cell\"] > [data-part=\"sort\"]', ['uiline', 'button']],\n ['th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"]', ['uiline', 'button']],\n ]\n\n static css = css`\n th[data-fray-component=\"table-header-cell\"] {\n position: relative;\n text-align: start;\n }\n\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"sort\"],\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"] {\n width: auto;\n font-family: inherit;\n }\n\n th[data-fray-component=\"table-header-cell\"] > [data-part=\"filter-toggle\"] {\n margin-inline-start: var(--ui-padding-h);\n font-size: 0.75em;\n }\n `\n}\n\nfunction isFilterSelectionEntry(\n entry: readonly [unknown, FilterModeValue],\n): entry is readonly [FilterValue, FilterModeValue] {\n return typeof entry[0] === 'string' || typeof entry[0] === 'number'\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {TableHeaderCell} from './TableHeaderCell.js'\nimport type {\n TableColumn,\n TableRow,\n} from './TableHeaderCell.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport interface TableHeaderProps<TRow extends TableRow = TableRow> extends ComponentProps {\n columns: readonly TableColumn<TRow>[]\n sortEmitter: ValueEmitter<TableSort | null>\n filtersEmitter: ValueEmitter<TableFilters>\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\nexport class TableHeader<TRow extends TableRow = TableRow>\n extends Component<TableHeaderProps<TRow>> {\n render(): FrayChild {\n return <thead data-fray-component=\"table-header\">\n <tr>\n {this.props.columns.map((column) => <TableHeaderCell\n key={String(column.field)}\n field={column.field}\n sortEmitter={this.props.sortEmitter}\n filtersEmitter={this.props.filtersEmitter}\n {...(column.label == null ? {} : {label: column.label})}\n {...(column.sortable == null ? {} : {sortable: column.sortable})}\n {...(column.filterOptions == null\n ? {}\n : {filterOptions: column.filterOptions})}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n {...(this.props.onFilterChange == null\n ? {}\n : {onFilterChange: this.props.onFilterChange})}\n />)}\n </tr>\n </thead>\n }\n\n static dependencies = [TableHeaderCell]\n}\n","import type {UrlLike} from '@sylwellsoftware/glue'\n\nimport {FilterMode} from '../../../util/filterMode.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\n\nexport interface TableSort {\n field: string\n direction: 'asc' | 'desc'\n}\n\nexport type TableFilterEntry<TValue = unknown> = readonly [\n value: TValue,\n mode: FilterModeValue,\n]\n\nexport type TableFilters = Record<string, readonly TableFilterEntry[]>\n\nexport interface TableQueryState {\n sort?: TableSort | null\n filters?: TableFilters\n}\n\n/**\n * Serialize Fray's experimental remote-table wire format.\n *\n * - `sort=field:asc|desc`\n * - repeated `filter=field:mode:JSON(value)` entries\n */\nexport function serializeTableQuery<TUrl extends UrlLike>(\n url: TUrl,\n {sort = null, filters = {}}: TableQueryState = {},\n): TUrl {\n assertUrlLike(url)\n if (sort != null) {\n assertSort(sort)\n url.searchParams.set('sort', `${sort.field}:${sort.direction}`)\n }\n for (const [field, entries] of Object.entries(filters)) {\n for (const [value, mode] of entries) {\n if (!isFilterMode(mode)) {\n throw new TypeError(`Unknown filter mode for ${field}: ${String(mode)}`)\n }\n url.searchParams.append(\n 'filter',\n `${field}:${mode}:${JSON.stringify(value)}`,\n )\n }\n }\n return url\n}\n\nexport function applyLocalTableState<TRow>(\n rows: readonly TRow[],\n sort: TableSort | null,\n filters: TableFilters,\n): TRow[] {\n if (!Array.isArray(rows)) throw new TypeError('Local table data must be an array')\n const filtered = rows.filter((row) => matchesFilters(row, filters))\n if (sort == null) return filtered\n assertSort(sort)\n const direction = sort.direction === 'asc' ? 1 : -1\n return [...filtered].sort((left, right) =>\n compareValues(readField(left, sort.field), readField(right, sort.field)) * direction)\n}\n\nfunction matchesFilters<TRow>(row: TRow, filters: TableFilters): boolean {\n for (const [field, entries] of Object.entries(filters)) {\n const value = readField(row, field)\n const denied = entries.filter(([, mode]) => mode === FilterMode.Deny)\n if (denied.some(([candidate]) => Object.is(candidate, value))) return false\n\n const required = entries.filter(([, mode]) => mode === FilterMode.Require)\n if (required.length > 0\n && !required.some(([candidate]) => Object.is(candidate, value))) return false\n\n const preferred = entries.filter(([, mode]) => mode === FilterMode.Prefer)\n if (preferred.length > 0\n && !preferred.some(([candidate]) => Object.is(candidate, value))) return false\n }\n return true\n}\n\nexport function assertSort(sort: unknown): asserts sort is TableSort {\n if (sort == null\n || typeof sort !== 'object'\n || typeof Reflect.get(sort, 'field') !== 'string'\n || !isSortDirection(Reflect.get(sort, 'direction'))) {\n throw new TypeError('Table sort must contain a field and asc/desc direction')\n }\n}\n\nfunction isSortDirection(value: unknown): value is TableSort['direction'] {\n return value === 'asc' || value === 'desc'\n}\n\nfunction isFilterMode(value: unknown): value is FilterModeValue {\n return Object.values(FilterMode).some((mode) => mode === value)\n}\n\nfunction compareValues(left: unknown, right: unknown): number {\n if (Object.is(left, right)) return 0\n if (left == null) return -1\n if (right == null) return 1\n if (typeof left === 'number' && typeof right === 'number') return left - right\n return String(left).localeCompare(String(right))\n}\n\nfunction readField(value: unknown, field: string): unknown {\n if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {\n return undefined\n }\n return Reflect.get(value, field)\n}\n\nfunction assertUrlLike(value: unknown): asserts value is UrlLike {\n if (value == null\n || (typeof value !== 'object' && typeof value !== 'function')\n || typeof Reflect.get(value, 'toString') !== 'function') {\n throw new TypeError('Table serializer requires a URL')\n }\n const searchParams = Reflect.get(value, 'searchParams')\n if (searchParams == null\n || typeof Reflect.get(searchParams, 'set') !== 'function'\n || typeof Reflect.get(searchParams, 'append') !== 'function') {\n throw new TypeError('Table serializer requires URL search parameters')\n }\n}\n","import {\n DerivedEmitter,\n Emitter,\n FetchState,\n LiveQuery,\n QueryArg,\n RestQueryHandler,\n} from '@sylwellsoftware/glue'\nimport type {\n FetchLike,\n QueryHandlerLike,\n QuerySerializer,\n ReadableEmitter,\n} from '@sylwellsoftware/glue'\n\nimport {Placeholder} from '../../Placeholder.js'\nimport {Component, css} from '../../component.js'\nimport type {ComponentProps, FrayChild} from '../../component.js'\nimport {componentClass} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport type {CheckboxSymbol} from '../../lineinputs/checkbox/Checkbox.js'\nimport type {FilterModeValue} from '../../../util/filterMode.js'\nimport {\n createSelectionHandler,\n defaultItemKey,\n} from '../selectionhandler.js'\nimport type {\n BaseSelectionHandler,\n ItemKeyGetter,\n} from '../selectionhandler.js'\nimport {TableHeader} from './TableHeader.js'\nimport type {TableColumn, TableRow} from './TableHeaderCell.js'\nimport {applyLocalTableState, serializeTableQuery} from './tableQuery.js'\nimport type {TableFilters, TableSort} from './tableQuery.js'\n\nexport type TableQueryArguments = {\n sort: TableSort | null\n filters: TableFilters\n}\n\nexport type TableQueryInput<TRow extends TableRow = TableRow> = ReadableEmitter<\n readonly TRow[] | undefined,\n unknown\n> & {\n retry?: (cause?: unknown) => unknown\n dispose?: () => void\n}\n\nexport interface DataTableProps<TRow extends TableRow = TableRow> extends ComponentProps {\n mode: 'local' | 'remote'\n columns: readonly TableColumn<TRow>[]\n data?: readonly TRow[] | ReadableEmitter<readonly TRow[], unknown>\n query?: TableQueryInput<TRow>\n queryHandler?: QueryHandlerLike<TableQueryArguments, readonly TRow[]>\n queryUrl?: string\n baseUrl?: string\n fetch?: FetchLike<readonly TRow[]>\n serializeQuery?: QuerySerializer<TableQueryArguments>\n selectedItemsEmitter?: ValueEmitter<TRow[]>\n rowKey?: Extract<keyof TRow, string> | ItemKeyGetter<TRow>\n multiSelect?: boolean\n caption?: FrayChild\n emptyMessage?: FrayChild\n placeholderCount?: number\n filterModes?: readonly CheckboxSymbol<FilterModeValue>[]\n defaultSemanticState?: FilterModeValue\n onFilterChange?: (filters: TableFilters, event: Event | null) => void\n}\n\n/** Experimental table with explicit local and remote data modes. */\nexport class DataTable<TRow extends TableRow = TableRow>\n extends Component<DataTableProps<TRow>> {\n readonly columns: readonly TableColumn<TRow>[]\n readonly rowKey: ItemKeyGetter<TRow>\n readonly sortEmitter: Emitter<TableSort | null>\n readonly filtersEmitter: Emitter<TableFilters>\n readonly selectedItemsEmitter: ValueEmitter<TRow[]>\n readonly selectionHandler: BaseSelectionHandler<TRow>\n query: TableQueryInput<TRow> | null = null\n private dataSource: ReadableEmitter<readonly TRow[], unknown> | null = null\n private readonly ownedSelectedItemsEmitter: Emitter<TRow[]> | null\n private ownedDataSource: Emitter<readonly TRow[]> | null = null\n private ownsQuery = false\n private readonly queryArgs: Array<QueryArg<TableSort | null> | QueryArg<TableFilters>> = []\n\n constructor(props: DataTableProps<TRow>) {\n super(props)\n if (props.mode !== 'local' && props.mode !== 'remote') {\n throw new TypeError('DataTable mode must be local or remote')\n }\n this.columns = normalizeColumns(props.columns)\n this.rowKey = normalizeRowKey(props.rowKey)\n this.sortEmitter = new Emitter<TableSort | null>(null, {\n owner: this,\n purpose: 'table sort',\n })\n this.filtersEmitter = new Emitter<TableFilters>({}, {\n owner: this,\n purpose: 'table filters',\n })\n this.ownedSelectedItemsEmitter = props.selectedItemsEmitter == null\n ? new Emitter<TRow[]>([], {owner: this, purpose: 'selected table rows'})\n : null\n this.selectedItemsEmitter = props.selectedItemsEmitter\n ?? this.ownedSelectedItemsEmitter!\n this.selectionHandler = createSelectionHandler({\n owner: this,\n multiSelect: props.multiSelect ?? false,\n selectedItemsEmitter: this.selectedItemsEmitter,\n getItems: () => this.query?.get() ?? [],\n getKey: this.rowKey,\n })\n }\n\n initialize(): void {\n this.query = this.props.mode === 'local'\n ? this.createLocalQuery()\n : this.createRemoteQuery()\n this.watch(this.query, this.selectedItemsEmitter)\n }\n\n private createLocalQuery(): TableQueryInput<TRow> {\n const suppliedData = this.props.data ?? []\n let source: ReadableEmitter<readonly TRow[], unknown>\n if (isReadableEmitter<readonly TRow[]>(suppliedData)) {\n source = suppliedData\n } else {\n this.ownedDataSource = new Emitter<readonly TRow[]>(suppliedData, {\n owner: this,\n purpose: 'local table data',\n })\n source = this.ownedDataSource\n }\n this.dataSource = source\n this.ownsQuery = true\n return new DerivedEmitter(\n [source, this.sortEmitter, this.filtersEmitter] as const,\n ([rows, sort, filters]) => applyLocalTableState(rows, sort, filters),\n {owner: this, purpose: 'local table view'},\n )\n }\n\n private createRemoteQuery(): TableQueryInput<TRow> {\n if (this.props.query != null) {\n assertTableQuery(this.props.query)\n return this.props.query\n }\n\n const handler = this.props.queryHandler ?? this.createRestHandler()\n if (handler == null || typeof handler.fetch !== 'function') {\n throw new TypeError('Remote DataTable requires query, queryHandler, or queryUrl')\n }\n const sort = new QueryArg<TableSort | null>('sort', this.sortEmitter, {\n owner: this,\n purpose: 'remote table sort argument',\n })\n const filters = new QueryArg<TableFilters>('filters', this.filtersEmitter, {\n owner: this,\n purpose: 'remote table filters argument',\n })\n this.queryArgs.push(sort, filters)\n this.ownsQuery = true\n const args = {sort, filters}\n return new LiveQuery<readonly TRow[], typeof args>({\n handler,\n args,\n owner: this,\n purpose: 'remote table query',\n keepPreviousValue: true,\n })\n }\n\n private createRestHandler(): RestQueryHandler<\n TableQueryArguments,\n readonly TRow[]\n > | null {\n if (this.props.queryUrl == null) return null\n const options: {\n url: string\n baseUrl?: string\n fetch?: FetchLike<readonly TRow[]>\n serialize: QuerySerializer<TableQueryArguments>\n } = {\n url: this.props.queryUrl,\n serialize: this.props.serializeQuery ?? serializeTableQuery,\n }\n if (this.props.baseUrl != null) options.baseUrl = this.props.baseUrl\n if (this.props.fetch != null) options.fetch = this.props.fetch\n return new RestQueryHandler<TableQueryArguments, readonly TRow[]>(options)\n }\n\n render(): FrayChild {\n const rows = this.query?.get() ?? []\n if (!Array.isArray(rows)) throw new TypeError('DataTable query value must be an array')\n const status = this.query?.getFetchState() ?? FetchState.Initial\n const error = this.query?.getError()\n const isLoading = status === FetchState.Initial || status === FetchState.Loading\n const selectedKeys = new Set(\n this.selectedItemsEmitter.get().map((item, index) => this.rowKey(item, index)),\n )\n const Host = this.Host\n return <Host\n className={componentClass(this.props) || null}\n data-loading={isLoading ? '' : null}\n data-error={status === FetchState.Error ? '' : null}\n >\n {isLoading ? <p role=\"status\" data-part=\"status\">Loading rows…</p> : null}\n {status === FetchState.Error ? <div data-part=\"error\" role=\"alert\">\n <span>{errorMessage(error, 'Unable to load rows')}</span>\n {typeof this.query?.retry === 'function'\n ? <button\n type=\"button\"\n onClick={() => this.query?.retry?.('table retry')}\n >Retry</button>\n : null}\n </div> : null}\n <table data-part=\"table\" aria-busy={isLoading ? 'true' : null}>\n {this.props.caption == null ? null : <caption>{this.props.caption}</caption>}\n <TableHeader\n key=\"header\"\n columns={this.columns}\n sortEmitter={this.sortEmitter}\n filtersEmitter={this.filtersEmitter}\n {...(this.props.filterModes == null\n ? {}\n : {filterModes: this.props.filterModes})}\n {...(this.props.defaultSemanticState == null\n ? {}\n : {defaultSemanticState: this.props.defaultSemanticState})}\n {...(this.props.onFilterChange == null\n ? {}\n : {onFilterChange: this.props.onFilterChange})}\n />\n <tbody>\n {rows.length > 0\n ? rows.map((row, index) =>\n this.renderRow(row, index, selectedKeys))\n : isLoading\n ? this.renderPlaceholders()\n : status === FetchState.Error\n ? null\n : <tr key=\"empty\">\n <td colSpan={this.columns.length}>\n {this.props.emptyMessage ?? 'No rows'}\n </td>\n </tr>}\n </tbody>\n </table>\n </Host>\n }\n\n private renderRow(\n row: TRow,\n index: number,\n selectedKeys: ReadonlySet<unknown>,\n ): FrayChild {\n const key = this.rowKey(row, index)\n const selected = selectedKeys.has(key)\n return <tr\n key={String(key)}\n data-fray-selectable-row=\"\"\n data-index={index}\n aria-selected={String(selected)}\n tabIndex={index === 0 ? 0 : -1}\n >\n {this.columns.map((column) => <td key={String(column.field)}>\n {column.render\n ? column.render(row, index)\n : renderCellValue(row[column.field])}\n </td>)}\n </tr>\n }\n\n private renderPlaceholders(): FrayChild[] {\n const count = this.props.placeholderCount ?? 5\n return Array.from({length: count}, (_, rowIndex) =>\n <tr key={`placeholder-${rowIndex}`}>\n {this.columns.map((column, columnIndex) =>\n <td key={String(column.field)}>\n <Placeholder\n width={45 + ((rowIndex + columnIndex) % 6) * 8}\n />\n </td>)}\n </tr>)\n }\n\n afterUpdate(dom: ChildNode | null): void {\n const rows = dom instanceof Element\n ? dom.querySelectorAll<HTMLElement>('tbody [data-fray-selectable-row]')\n : []\n this.selectionHandler.rowsUpdated(rows)\n }\n\n getSelectedRows(): TRow[] {\n return this.selectionHandler.getSelectedItems()\n }\n\n getSelectedRowsEmitter(): ValueEmitter<TRow[]> {\n return this.selectedItemsEmitter\n }\n\n onDestroy(): void {\n this.selectionHandler.destroy()\n if (this.ownsQuery) this.query?.dispose?.()\n for (const argument of this.queryArgs) argument.dispose()\n this.ownedDataSource?.dispose()\n this.ownedSelectedItemsEmitter?.dispose()\n this.sortEmitter.dispose()\n this.filtersEmitter.dispose()\n }\n\n static dependencies = [Placeholder, TableHeader]\n\n static override hostName = 'data-table'\n static override standaloneHostName = 'data-table'\n\n static css = css`\n & {\n overflow: auto;\n color: var(--ui-text-color);\n }\n\n & > table {\n width: 100%;\n border-collapse: collapse;\n }\n\n & th,\n & td {\n padding: var(--ui-padding-v) var(--ui-padding-h);\n text-align: start;\n }\n\n & tbody tr[data-fray-selectable-row] {\n cursor: default;\n user-select: none;\n }\n\n & tbody tr[data-fray-selectable-row]:focus-visible {\n outline: 2px solid var(--ui-accent-color);\n outline-offset: -2px;\n }\n\n & tbody tr[data-fray-selectable-row][aria-selected=\"true\"] {\n color: var(--toggle-selected-text);\n background: var(--toggle-selected-bg);\n }\n\n & > [data-part=\"error\"] {\n color: var(--error-color);\n }\n `\n}\n\nfunction normalizeColumns<TRow extends TableRow>(\n columns: unknown,\n): readonly TableColumn<TRow>[] {\n if (!Array.isArray(columns) || columns.length === 0) {\n throw new TypeError('DataTable columns must be a non-empty array')\n }\n const fields = new Set<string>()\n return columns.map((column: unknown) => {\n if (column == null || typeof column !== 'object') {\n throw new TypeError('Every DataTable column requires a field')\n }\n const field = Reflect.get(column, 'field')\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError('Every DataTable column requires a field')\n }\n if (fields.has(field)) throw new Error(`Duplicate DataTable column: ${field}`)\n fields.add(field)\n const render = Reflect.get(column, 'render')\n if (render != null && typeof render !== 'function') {\n throw new TypeError(`DataTable column ${field} render must be a function`)\n }\n // Runtime validation above proves the structural column boundary; the\n // row-specific callback relationship is checked at the public API.\n return column as TableColumn<TRow>\n })\n}\n\nfunction normalizeRowKey<TRow extends TableRow>(\n rowKey: DataTableProps<TRow>['rowKey'],\n): ItemKeyGetter<TRow> {\n if (rowKey == null) return defaultItemKey\n if (typeof rowKey === 'function') return rowKey\n if (typeof rowKey === 'string' && rowKey.length > 0) {\n return (row, index) => {\n const key = row[rowKey]\n if (key == null) {\n throw new TypeError(`DataTable row at index ${index} lacks ${rowKey}`)\n }\n return key\n }\n }\n throw new TypeError('DataTable rowKey must be a function or property name')\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n && typeof Reflect.get(value, 'getFetchState') === 'function'\n && typeof Reflect.get(value, 'getError') === 'function'\n}\n\nfunction assertTableQuery<TRow extends TableRow>(\n value: unknown,\n): asserts value is TableQueryInput<TRow> {\n if (!isReadableEmitter<readonly TRow[] | undefined>(value)) {\n throw new TypeError('DataTable query must be an emitter')\n }\n}\n\nfunction renderCellValue(value: unknown): FrayChild {\n if (value == null || typeof value === 'string' || typeof value === 'number') return value\n return String(value)\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) return error.message\n return error == null ? fallback : String(error)\n}\n","import {Component} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\n\nexport interface TreeNode<TValue = unknown> {\n id: Key\n label: FrayChild\n textValue?: string\n value?: TValue\n children?: readonly TreeNode<TValue>[]\n}\n\nexport interface TreeItemProps<TValue = unknown> extends ComponentProps {\n id: Key\n label: FrayChild\n textValue?: string\n value?: TValue\n}\n\n/** Declarative tree-node marker consumed by TreeView. */\nexport class TreeItem<TValue = unknown> extends Component<TreeItemProps<TValue>> {\n render(): FrayChild {\n return this.props.children ?? []\n }\n}\n","import {Emitter} from '@sylwellsoftware/glue'\nimport type {ReadableEmitter} from '@sylwellsoftware/glue'\n\nimport {Component, css, isVNode} from '../../component.js'\nimport type {ComponentProps, FrayChild, Key} from '../../component.js'\nimport {componentClass, invoke} from '../../controlUtils.js'\nimport type {ValueEmitter} from '../../controlUtils.js'\nimport {TreeItem} from './treeitem.js'\nimport type {TreeItemProps, TreeNode} from './treeitem.js'\n\nexport interface TreeViewProps<TValue = unknown> extends ComponentProps {\n nodes?: readonly TreeNode<TValue>[] | ReadableEmitter<readonly TreeNode<TValue>[], unknown>\n label: string\n selectedKeyEmitter?: ValueEmitter<Key | null>\n expandedKeysEmitter?: ValueEmitter<Key[]>\n renderItem?: (node: TreeNode<TValue>, depth: number) => FrayChild\n onSelect?: (node: TreeNode<TValue>, event: Event) => void\n}\n\ninterface VisibleNode<TValue> {\n node: TreeNode<TValue>\n depth: number\n parentId: Key | null\n position: number\n setSize: number\n}\n\n/** Experimental single-select ARIA tree with controlled expansion and selection. */\nexport class TreeView<TValue = unknown> extends Component<TreeViewProps<TValue>> {\n readonly nodesEmitter: ReadableEmitter<readonly TreeNode<TValue>[], unknown>\n readonly selectedKeyEmitter: ValueEmitter<Key | null>\n readonly expandedKeysEmitter: ValueEmitter<Key[]>\n private readonly ownedNodesEmitter: Emitter<readonly TreeNode<TValue>[]> | null\n private readonly ownedSelectedEmitter: Emitter<Key | null> | null\n private readonly ownedExpandedEmitter: Emitter<Key[]> | null\n private focusedKey: Key | null = null\n private typeahead = ''\n private typeaheadTimer: ReturnType<typeof setTimeout> | null = null\n\n constructor(props: TreeViewProps<TValue>) {\n super(props)\n if (isReadableEmitter<readonly TreeNode<TValue>[]>(props.nodes)) {\n this.nodesEmitter = props.nodes\n this.ownedNodesEmitter = null\n } else {\n const nodes = props.nodes ?? extractDeclarativeNodes<TValue>(props.children)\n this.ownedNodesEmitter = new Emitter(nodes, {\n owner: this,\n purpose: 'tree nodes',\n })\n this.nodesEmitter = this.ownedNodesEmitter\n }\n this.ownedSelectedEmitter = props.selectedKeyEmitter == null\n ? new Emitter<Key | null>(null, {owner: this, purpose: 'selected tree key'})\n : null\n this.selectedKeyEmitter = props.selectedKeyEmitter ?? this.ownedSelectedEmitter!\n this.ownedExpandedEmitter = props.expandedKeysEmitter == null\n ? new Emitter<Key[]>([], {owner: this, purpose: 'expanded tree keys'})\n : null\n this.expandedKeysEmitter = props.expandedKeysEmitter ?? this.ownedExpandedEmitter!\n }\n\n initialize(): void {\n this.reconcile(this.nodesEmitter.get())\n this.watch(this.nodesEmitter, this.selectedKeyEmitter, this.expandedKeysEmitter)\n this.onCleanup(this.nodesEmitter.subscribe(({value}) => this.reconcile(value), {\n emitCurrent: false,\n }))\n }\n\n render(): FrayChild {\n const nodes = this.nodesEmitter.get()\n assertTreeNodes(nodes)\n const expanded = new Set(this.expandedKeysEmitter.get())\n const visible = flattenVisible(nodes, expanded)\n const selected = this.selectedKeyEmitter.get()\n const active = visible.find(({node}) => Object.is(node.id, this.focusedKey))\n ?? visible.find(({node}) => Object.is(node.id, selected))\n ?? visible[0]\n ?? null\n this.focusedKey = active?.node.id ?? null\n\n const Host = this.Host\n return <Host className={componentClass(this.props) || null}>\n {visible.length === 0\n ? <p role=\"status\" data-part=\"empty\">No tree items</p>\n : <div role=\"tree\" aria-label={this.props.label} data-part=\"tree\">\n {visible.map((item, index) => {\n const {node, depth, position, setSize} = item\n const hasChildren = (node.children?.length ?? 0) > 0\n const isExpanded = hasChildren && expanded.has(node.id)\n const isSelected = Object.is(node.id, selected)\n const label = this.props.renderItem?.(node, depth) ?? node.label\n return <div\n key={node.id}\n role=\"treeitem\"\n data-part=\"item\"\n data-index={index}\n data-depth={depth}\n aria-level={depth + 1}\n aria-posinset={position}\n aria-setsize={setSize}\n aria-expanded={hasChildren ? String(isExpanded) : null}\n aria-selected={String(isSelected)}\n tabIndex={Object.is(node.id, active?.node.id) ? 0 : -1}\n style={{'--tree-depth': depth}}\n onClick={(event: MouseEvent) => {\n this.focusedKey = node.id\n if (isExpanderTarget(event.target) && hasChildren) {\n this.toggleExpanded(node.id)\n this.focusRow(node.id)\n return\n }\n this.selectNode(node, event)\n }}\n onFocus={() => this.focusedKey = node.id}\n onKeyDown={(event: KeyboardEvent) =>\n this.handleKeyDown(event, index, visible)}\n >\n <span\n data-part=\"expander\"\n data-expandable={hasChildren ? '' : null}\n aria-hidden=\"true\"\n >{hasChildren ? (isExpanded ? '▾' : '▸') : '•'}</span>\n <span data-part=\"label\">{label}</span>\n </div>\n })}\n </div>}\n </Host>\n }\n\n onDestroy(): void {\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.ownedNodesEmitter?.dispose()\n this.ownedSelectedEmitter?.dispose()\n this.ownedExpandedEmitter?.dispose()\n }\n\n static dependencies = [TreeItem]\n\n static override hostName = 'tree-view'\n static override standaloneHostName = 'tree-view'\n\n static css = css`\n & {\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n }\n\n & > [data-part=\"tree\"] {\n display: grid;\n align-content: start;\n }\n\n & [data-part=\"item\"] {\n display: flex;\n align-items: flex-start;\n gap: 0.35rem;\n min-width: 0;\n padding: 0.38rem 0.5rem;\n padding-inline-start: calc(0.5rem + var(--tree-depth) * 1.1rem);\n cursor: default;\n user-select: none;\n }\n\n & [data-part=\"item\"]:hover {\n background: var(--button-background-hover);\n }\n\n & [data-part=\"item\"]:focus-visible {\n outline: 2px solid var(--ui-accent-color);\n outline-offset: -2px;\n }\n\n & [data-part=\"item\"][aria-selected=\"true\"] {\n color: var(--toggle-selected-text);\n background: var(--toggle-selected-bg);\n }\n\n & [data-part=\"expander\"] {\n flex: 0 0 1rem;\n text-align: center;\n }\n\n & [data-part=\"expander\"][data-expandable] {\n cursor: pointer;\n }\n\n & [data-part=\"label\"] {\n min-width: 0;\n overflow-wrap: anywhere;\n }\n\n & > [data-part=\"empty\"] {\n margin: 0;\n padding: var(--ui-padding, 0.75rem);\n }\n\n @media (forced-colors: active) {\n & [data-part=\"item\"][aria-selected=\"true\"] {\n outline: 2px solid Highlight;\n forced-color-adjust: auto;\n }\n }\n `\n\n private reconcile(nodes: readonly TreeNode<TValue>[]): void {\n assertTreeNodes(nodes)\n const allKeys = new Set(flattenAll(nodes).map(({node}) => node.id))\n const selected = this.selectedKeyEmitter.get()\n if (this.ownedSelectedEmitter != null && selected != null && !allKeys.has(selected)) {\n this.selectedKeyEmitter.set(null, 'selected tree item removed')\n }\n const expanded = this.expandedKeysEmitter.get()\n const retained = expanded.filter((key) => allKeys.has(key))\n if (this.ownedExpandedEmitter != null && !sameKeys(expanded, retained)) {\n this.expandedKeysEmitter.set(retained, 'removed tree expansions reconciled')\n }\n if (this.focusedKey != null && !allKeys.has(this.focusedKey)) this.focusedKey = null\n }\n\n private selectNode(node: TreeNode<TValue>, event: Event): void {\n this.selectedKeyEmitter.set(node.id, 'tree item selected')\n invoke(this.props.onSelect, node, event)\n this.focusRow(node.id)\n }\n\n private toggleExpanded(key: Key): void {\n const expanded = this.expandedKeysEmitter.get()\n const contains = expanded.some((candidate) => Object.is(candidate, key))\n this.expandedKeysEmitter.set(\n contains\n ? expanded.filter((candidate) => !Object.is(candidate, key))\n : [...expanded, key],\n contains ? 'tree item collapsed' : 'tree item expanded',\n )\n }\n\n private handleKeyDown(\n event: KeyboardEvent,\n index: number,\n visible: readonly VisibleNode<TValue>[],\n ): void {\n const current = visible[index]\n if (current == null) return\n if (event.key === 'ArrowDown') return this.move(event, visible[index + 1]?.node.id)\n if (event.key === 'ArrowUp') return this.move(event, visible[index - 1]?.node.id)\n if (event.key === 'Home') return this.move(event, visible[0]?.node.id)\n if (event.key === 'End') return this.move(event, visible.at(-1)?.node.id)\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n const children = current.node.children ?? []\n if (children.length === 0) return\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (!expanded) this.toggleExpanded(current.node.id)\n else this.focusRow(children[0]!.id)\n return\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n const expanded = this.expandedKeysEmitter.get().some((key) =>\n Object.is(key, current.node.id))\n if (expanded) this.toggleExpanded(current.node.id)\n else if (current.parentId != null) this.focusRow(current.parentId)\n return\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n this.selectNode(current.node, event)\n return\n }\n if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {\n this.handleTypeahead(event, visible, index)\n }\n }\n\n private move(event: KeyboardEvent, key: Key | undefined): void {\n if (key === undefined) return\n event.preventDefault()\n this.focusRow(key)\n }\n\n private focusRow(key: Key): void {\n this.focusedKey = key\n const rows = this.dom instanceof Element\n ? [...this.dom.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')]\n : []\n for (const row of rows) {\n const index = Number(row.dataset.index)\n const visible = flattenVisible(\n this.nodesEmitter.get(),\n new Set(this.expandedKeysEmitter.get()),\n )\n const matches = Object.is(visible[index]?.node.id, key)\n row.tabIndex = matches ? 0 : -1\n if (matches) row.focus()\n }\n }\n\n private handleTypeahead(\n event: KeyboardEvent,\n visible: readonly VisibleNode<TValue>[],\n index: number,\n ): void {\n event.preventDefault()\n if (this.typeaheadTimer != null) clearTimeout(this.typeaheadTimer)\n this.typeahead += event.key.toLocaleLowerCase()\n this.typeaheadTimer = setTimeout(() => {\n this.typeahead = ''\n this.typeaheadTimer = null\n }, 650)\n const candidates = [...visible.slice(index + 1), ...visible.slice(0, index + 1)]\n const match = candidates.find(({node}) => textValue(node)\n .toLocaleLowerCase()\n .startsWith(this.typeahead))\n if (match != null) this.focusRow(match.node.id)\n }\n}\n\nfunction extractDeclarativeNodes<TValue>(children: ComponentProps['children']): TreeNode<TValue>[] {\n const values = Array.isArray(children) ? children : children == null ? [] : [children]\n return values.filter((child) => isVNode(child) && child.type === TreeItem).map((child) => {\n if (!isVNode(child)) throw new TypeError('TreeView children must be TreeItem nodes')\n const props = child.props as unknown as TreeItemProps<TValue>\n return {\n id: props.id,\n label: props.label,\n ...(props.textValue == null ? {} : {textValue: props.textValue}),\n ...(props.value === undefined ? {} : {value: props.value}),\n children: extractDeclarativeNodes<TValue>(props.children),\n }\n })\n}\n\nfunction flattenVisible<TValue>(\n nodes: readonly TreeNode<TValue>[],\n expanded: ReadonlySet<Key>,\n): VisibleNode<TValue>[] {\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n if ((node.children?.length ?? 0) > 0 && expanded.has(node.id)) {\n visit(node.children ?? [], depth + 1, node.id)\n }\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction flattenAll<TValue>(nodes: readonly TreeNode<TValue>[]): VisibleNode<TValue>[] {\n const allKeys = new Set<Key>()\n const result: VisibleNode<TValue>[] = []\n const visit = (items: readonly TreeNode<TValue>[], depth: number, parentId: Key | null) => {\n items.forEach((node, index) => {\n if (allKeys.has(node.id)) throw new Error(`Duplicate tree item id: ${String(node.id)}`)\n allKeys.add(node.id)\n result.push({node, depth, parentId, position: index + 1, setSize: items.length})\n visit(node.children ?? [], depth + 1, node.id)\n })\n }\n visit(nodes, 0, null)\n return result\n}\n\nfunction assertTreeNodes<TValue>(value: unknown): asserts value is readonly TreeNode<TValue>[] {\n if (!Array.isArray(value)) throw new TypeError('TreeView nodes must be an array')\n for (const {node} of flattenAll(value as readonly TreeNode<TValue>[])) {\n if (node == null || typeof node !== 'object' || node.id == null) {\n throw new TypeError('Each tree node requires an id')\n }\n if (!Array.isArray(node.children ?? [])) {\n throw new TypeError(`Tree node ${String(node.id)} children must be an array`)\n }\n }\n}\n\nfunction textValue<TValue>(node: TreeNode<TValue>): string {\n if (node.textValue != null) return node.textValue\n if (typeof node.label === 'string' || typeof node.label === 'number') return String(node.label)\n return String(node.id)\n}\n\nfunction sameKeys(left: readonly Key[], right: readonly Key[]): boolean {\n return left.length === right.length\n && left.every((value, index) => Object.is(value, right[index]))\n}\n\nfunction isReadableEmitter<TValue>(value: unknown): value is ReadableEmitter<TValue, unknown> {\n return value != null\n && (typeof value === 'object' || typeof value === 'function')\n && typeof Reflect.get(value, 'get') === 'function'\n && typeof Reflect.get(value, 'subscribe') === 'function'\n}\n\nfunction isExpanderTarget(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest('[data-part=\"expander\"]') != null\n}\n","import {Button} from '../menu/button.js'\nimport {Component, css} from '../component.js'\nimport type {ComponentProps, FrayChild, Ref} from '../component.js'\nimport {\n componentClass,\n controlId,\n createValueEmitter,\n invoke,\n} from '../controlUtils.js'\nimport type {ValueControlProps, ValueEmitter} from '../controlUtils.js'\n\nexport interface DialogProps extends ValueControlProps<boolean> {\n id?: string | number | null\n title: FrayChild\n description?: FrayChild\n actions?: FrayChild\n closeLabel?: string\n showCloseButton?: boolean\n initialFocusRef?: Ref<HTMLElement>\n onClose?: () => void\n}\n\n/** Experimental controlled modal built on the native dialog element. */\nexport class Dialog extends Component<DialogProps> {\n readonly openEmitter: ValueEmitter<boolean>\n readonly dialogId: string\n readonly titleId: string\n readonly descriptionId: string\n private dialogElement: HTMLDialogElement | null = null\n private restoreFocusTo: HTMLElement | null = null\n private synchronizedOpen = false\n\n constructor(props: DialogProps) {\n super(props)\n this.openEmitter = createValueEmitter(this, props, false, 'dialog open state')\n this.dialogId = controlId('dialog', props.id)\n this.titleId = `${this.dialogId}-title`\n this.descriptionId = `${this.dialogId}-description`\n }\n\n initialize(): void {\n this.watch(this.openEmitter)\n }\n\n render(): FrayChild {\n const {\n title,\n description,\n actions,\n closeLabel = 'Close',\n showCloseButton = true,\n children = [],\n } = this.props\n return <dialog\n id={this.dialogId}\n className={componentClass(this.props) || undefined}\n data-fray-component=\"dialog\"\n aria-labelledby={this.titleId}\n aria-describedby={description == null ? null : this.descriptionId}\n aria-modal=\"true\"\n ref={(element: HTMLDialogElement | null) => this.dialogElement = element}\n >\n <header data-part=\"header\">\n <h2 id={this.titleId}>{title}</h2>\n </header>\n {description == null ? null : <p id={this.descriptionId} data-part=\"description\">\n {description}\n </p>}\n <div data-part=\"content\">{children}</div>\n {actions == null && !showCloseButton ? null : <footer data-part=\"actions\">\n {actions}\n {showCloseButton ? <Button\n label={closeLabel}\n onClick={() => this.requestClose()}\n /> : null}\n </footer>}\n </dialog>\n }\n\n afterMount(): void {\n const dialog = this.dialogElement\n if (dialog == null) return\n this.listen(dialog, 'cancel', (event: Event) => {\n event.preventDefault()\n this.requestClose()\n })\n this.listen(dialog, 'close', () => {\n if (this.openEmitter.get()) this.openEmitter.set(false, 'native dialog closed')\n this.finishClose()\n })\n this.syncOpenState()\n }\n\n afterUpdate(): void {\n this.syncOpenState()\n }\n\n close(): void {\n this.requestClose()\n }\n\n onDestroy(): void {\n const dialog = this.dialogElement\n if (dialog?.open === true && typeof dialog.close === 'function') dialog.close()\n this.finishClose()\n this.dialogElement = null\n }\n\n static dependencies = [Button]\n\n static css = css`\n dialog[data-fray-component=\"dialog\"] {\n width: min(38rem, calc(100vw - 2rem));\n max-height: min(42rem, calc(100dvh - 2rem));\n padding: 0;\n color: var(--ui-text-color);\n background: var(--panel-bg);\n border: 1px solid var(--ui-border-color);\n border-radius: var(--panel-radius, var(--ui-border-radius));\n box-shadow: 0 1.25rem 4rem rgb(0 0 0 / 35%);\n }\n\n dialog[data-fray-component=\"dialog\"]::backdrop {\n background: rgb(0 0 0 / 55%);\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part] {\n padding: var(--panel-padding, 0.75rem);\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"header\"] {\n border-block-end: 1px solid var(--ui-border-color);\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"header\"] h2,\n dialog[data-fray-component=\"dialog\"] > [data-part=\"description\"] {\n margin: 0;\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"content\"] {\n overflow: auto;\n }\n\n dialog[data-fray-component=\"dialog\"] > [data-part=\"actions\"] {\n display: flex;\n justify-content: flex-end;\n gap: var(--spacing-small, 0.5rem);\n border-block-start: 1px solid var(--ui-border-color);\n }\n\n @media (prefers-reduced-motion: no-preference) {\n dialog[data-fray-component=\"dialog\"][open] {\n animation: fray-dialog-enter 120ms ease-out;\n }\n }\n\n @keyframes fray-dialog-enter {\n from {\n transform: translateY(0.4rem);\n }\n }\n\n @media (forced-colors: active) {\n dialog[data-fray-component=\"dialog\"] {\n border: 2px solid CanvasText;\n }\n }\n `\n\n private requestClose(): void {\n if (!this.openEmitter.get()) return\n this.openEmitter.set(false, 'dialog close requested')\n }\n\n private syncOpenState(): void {\n const dialog = this.dialogElement\n if (dialog == null) return\n const shouldOpen = this.openEmitter.get()\n if (shouldOpen && !this.synchronizedOpen) {\n const active = document.activeElement\n this.restoreFocusTo = active instanceof HTMLElement ? active : null\n showModal(dialog)\n this.synchronizedOpen = true\n focusInitial(dialog, this.props.initialFocusRef)\n return\n }\n if (!shouldOpen && this.synchronizedOpen) {\n if (dialog.open && typeof dialog.close === 'function') dialog.close()\n else dialog.removeAttribute('open')\n this.finishClose()\n }\n }\n\n private finishClose(): void {\n if (!this.synchronizedOpen && this.restoreFocusTo == null) return\n this.synchronizedOpen = false\n const restore = this.restoreFocusTo\n this.restoreFocusTo = null\n if (restore?.isConnected === true) restore.focus()\n invoke(this.props.onClose)\n }\n}\n\nfunction showModal(dialog: HTMLDialogElement): void {\n if (dialog.open) return\n if (typeof dialog.showModal === 'function') {\n dialog.showModal()\n return\n }\n dialog.setAttribute('open', '')\n}\n\nfunction focusInitial(dialog: HTMLDialogElement, ref: Ref<HTMLElement> | undefined): void {\n const referenced = ref == null\n ? null\n : typeof ref === 'function' ? null : ref.current\n const target = referenced ?? dialog.querySelector<HTMLElement>(\n '[autofocus], button, input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )\n target?.focus()\n}\n"],"names":["Placeholder","Component","width","normalizeWidth","Host","jsx","__publicField","css","numeric","BaseSelectionHandler","getItems","getKey","defaultItemKey","selectedItemsEmitter","owner","Emitter","rows","row","index","clampIndex","onClick","event","onKeyDown","onMouseDown","onMouseEnter","_a","ownerDocument","onMouseUp","lastIndex","nextIndex","_startIndex","_endIndex","_event","_index","items","cause","selected","selectedKeys","item","current","cleanup","suppressClick","SingleSelectionHandler","MultiSelectionHandler","first","last","range","next","isCommandPressed","mergeByKey","key","candidate","candidateIndex","startIndex","endIndex","createSelectionHandler","config","id","length","left","right","result","keys","ListView","props","isReadableEmitter","normalizeKeyGetter","status","error","isLoading","FetchState","jsxs","componentClass","errorMessage","_","content","defaultItemLabel","dom","_b","itemKey","value","label","isRenderablePrimitive","fallback","FilterPanel","isEmitterLike","values","fetchState","_c","filters","normalizeFilters","filterModes","Checkbox","defaultSemanticState","FilterMode","option","optionValue","optionLabel","state","FilterModeCheckbox","nextState","isFrayLabel","TableHeaderCell","currentSort","direction","isFilterSelectionEntry","filterLabel","panel","entry","TableHeader","column","serializeTableQuery","url","sort","assertUrlLike","assertSort","field","entries","mode","isFilterMode","applyLocalTableState","filtered","matchesFilters","compareValues","readField","required","preferred","isSortDirection","searchParams","DataTable","normalizeColumns","normalizeRowKey","suppliedData","source","DerivedEmitter","assertTableQuery","handler","QueryArg","args","LiveQuery","options","RestQueryHandler","_d","renderCellValue","count","rowIndex","columnIndex","argument","columns","fields","render","rowKey","TreeItem","TreeView","nodes","extractDeclarativeNodes","assertTreeNodes","expanded","visible","flattenVisible","active","node","depth","position","setSize","hasChildren","isExpanded","isSelected","isExpanderTarget","allKeys","flattenAll","retained","sameKeys","invoke","contains","children","matches","match","textValue","child","isVNode","visit","parentId","target","Dialog","createValueEmitter","controlId","title","description","actions","closeLabel","showCloseButton","element","Button","dialog","shouldOpen","showModal","focusInitial","restore","ref"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsx-dev-runtime-CarwHDyL.js","sources":["../src/styling/baseStyleDefinitions.ts","../src/styling/styleRegistry.ts","../src/runtime.ts","../src/Components/component.ts","../src/jsx-runtime.ts"],"sourcesContent":["export type CSSDeclarations = Record<string, string>\nexport type CSSVariantMap = Record<string, CSSDeclarations>\nexport type BaseStyleDefinition = Record<string, string | CSSVariantMap>\n\nexport const baseStyleDefinitions = {\n after: {\n content: '\"\"',\n display: 'block',\n position: 'absolute',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n 'pointer-events': 'none',\n },\n\n inputline: {\n display: 'flex',\n 'flex-flow': 'row nowrap',\n position: 'relative',\n 'line-height': '1.25',\n 'font-size': 'var(--ui-font-size)',\n 'min-height': 'calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding))',\n color: 'var(--ui-text-color)',\n 'border-radius': 'var(--ui-border-radius)',\n 'box-sizing': 'border-box',\n },\n\n input: {\n background: 'var(--ui-input-bg)',\n padding: 'var(--ui-padding-v) var(--ui-padding-h)',\n 'pointer-events': 'all',\n border: 'var(--ui-input-border)',\n width: 'var(--input-width)',\n 'box-shadow': 'var(--input-shadow)',\n 'box-sizing': 'border-box',\n 'white-space': 'nowrap',\n variants: {\n ':focus-visible': {\n outline: '2px solid transparent',\n 'outline-offset': '1px',\n 'border-color': 'var(--ui-accent-color)',\n 'box-shadow': '0 0 0 1px var(--ui-accent-color-highlight)',\n },\n ':disabled': {\n background: 'var(--ui-input-bg-disabled)',\n 'border-color': 'var(--ui-input-border-disabled)',\n color: 'var(--ui-input-text-color-disabled)',\n cursor: 'not-allowed',\n },\n },\n },\n\n inputlike: {\n background: 'var(--ui-input-bg)',\n padding: 'var(--ui-padding-v) var(--ui-padding-h)',\n 'pointer-events': 'all',\n border: 'var(--ui-input-border)',\n 'box-shadow': 'var(--input-shadow)',\n 'box-sizing': 'border-box',\n 'white-space': 'nowrap',\n 'border-radius': 'var(--ui-border-radius)',\n },\n\n labeledinput: {\n display: 'flex',\n 'flex-flow': 'row nowrap',\n 'align-items': 'center',\n gap: '.5em',\n },\n\n label: {\n color: 'var(--ui-text-color)',\n 'font-size': 'var(--ui-font-size)',\n },\n\n disabled: {\n 'border-color': 'var(--ui-input-border-disabled)',\n color: 'var(--ui-input-text-color-disabled)',\n },\n\n error: {\n color: 'var(--error-color)',\n },\n\n working: {\n display: 'inline',\n position: 'absolute',\n 'z-index': '1',\n margin: 'auto',\n animation: 'fray-placeholder-progress 0.8s linear infinite',\n 'background-repeat': 'repeat',\n 'background-size': '2rem 2rem',\n 'background-image': 'linear-gradient(-45deg, #0001 25%, #fff1 25%, #fff1 50%, #0001 50%, #0001 75%, #fff1 75%, #fff1)',\n border: '0 solid transparent',\n 'border-radius': 'inherit',\n 'box-sizing': 'border-box',\n },\n\n panel: {\n background: 'var(--panel-bg)',\n border: 'var(--panel-border)',\n 'border-radius': 'var(--panel-radius)',\n 'box-shadow': 'var(--panel-shadow)',\n color: 'var(--panel-color)',\n },\n\n sectionheader: {\n 'box-shadow': 'var(--sectionheader-shadow)',\n background: 'var(--sectionheader-bg)',\n color: 'var(--sectionheader-color)',\n },\n\n uiline: {\n 'box-sizing': 'border-box',\n 'line-height': '1.25',\n 'font-size': 'var(--ui-font-size)',\n 'min-height': 'calc(var(--ui-font-size) + var(--ui-padding) + var(--ui-padding))',\n color: 'var(--ui-text-color)',\n padding: 'var(--ui-padding-v) var(--ui-padding-h)',\n 'border-radius': 'var(--ui-border-radius)',\n cursor: 'pointer',\n 'user-select': 'none',\n },\n\n noselect: {\n 'user-select': 'var(--noselect-user-select)',\n 'cursor': 'var(--noselect-cursor)',\n },\n\n button: {\n 'box-sizing': 'border-box',\n background: 'var(--button-background)',\n border: 'var(--button-border)',\n 'box-shadow': 'var(--button-shadow)',\n color: 'var(--button-color)',\n cursor: 'default',\n 'user-select': 'none',\n variants: {\n ':hover': {\n background: 'var(--button-background-hover)',\n 'box-shadow': 'var(--button-shadow)',\n },\n ':focus-visible': {\n outline: '2px solid transparent',\n 'outline-offset': '1px',\n border: '1px solid var(--ui-accent-color)',\n 'box-shadow': '0 0 0 1px var(--ui-accent-color-highlight)',\n },\n ':disabled': {\n background: 'var(--button-background-disabled)',\n border: 'var(--button-border-disabled)',\n color: 'var(--ui-input-text-color-disabled)',\n cursor: 'not-allowed',\n 'pointer-events': 'none',\n },\n },\n },\n\n toolbar: {\n background: 'var(--toolbar-bg)',\n border: 'var(--toolbar-border)',\n 'border-radius': 'var(--toolbar-radius)',\n 'box-shadow': 'var(--toolbar-shadow)',\n color: 'var(--toolbar-color)',\n },\n\n} satisfies Record<string, BaseStyleDefinition>\n\nexport type BaseStyleName = keyof typeof baseStyleDefinitions\n","import {\n baseStyleDefinitions,\n} from './baseStyleDefinitions.js'\nimport type {\n BaseStyleDefinition,\n BaseStyleName,\n CSSDeclarations,\n CSSVariantMap,\n} from './baseStyleDefinitions.js'\n\nconst STYLE_ATTRIBUTE = 'data-fray-structural-styles'\nlet nextRegistryId = 1\n\n/** Application-scoped structural-style collection and injection. */\nexport class StyleRegistry {\n readonly id: string\n private readonly cssFragments = new Set<string>()\n private readonly baseStyleMap = new Map<BaseStyleName, Set<string>>()\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 if (css.trim().length > 0) this.cssFragments.add(css.trim())\n return this\n }\n\n registerBaseStyle(selector: string, styleNames: string | readonly string[]): this {\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n throw new TypeError('Base style selector must be a non-empty string')\n }\n const names = typeof styleNames === 'string' ? [styleNames] : styleNames\n if (!Array.isArray(names)) {\n throw new TypeError('Base style names must be a string or array')\n }\n\n for (const name of names) {\n if (!Object.hasOwn(baseStyleDefinitions, name)) {\n throw new Error(`Unknown Fray base style: ${String(name)}`)\n }\n const styleName = name as BaseStyleName\n const selectors = this.baseStyleMap.get(styleName) ?? new Set<string>()\n selectors.add(selector.trim())\n this.baseStyleMap.set(styleName, selectors)\n }\n return this\n }\n\n generateRootCSS(): string {\n return `:root {\n --base-font-size: 14px;\n --ui-font-size: var(--base-font-size);\n --ui-padding: 0.375rem;\n --ui-padding-h: 0.375rem;\n --ui-padding-v: 0;\n --ui-border-radius: 0.25rem;\n --input-width: 15rem;\n --spacing-small: 0.5rem;\n --spacing-medium: 1rem;\n --panel-padding: 0.75rem;\n --noselect-user-select: none;\n --noselect-cursor: default;\n}\n\n*, *::before, *::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n scroll-behavior: auto !important;\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n@media (forced-colors: active) {\n :focus-visible {\n outline: 2px solid Highlight !important;\n outline-offset: 2px !important;\n }\n}`\n }\n\n generateBaseStyleCSS(): string {\n let generated = ''\n for (const [name, selectors] of this.baseStyleMap) {\n const {properties, variants} = splitDefinition(baseStyleDefinitions[name])\n const selectorList = [...selectors]\n generated += renderRule(name, selectorList, properties)\n for (const [variant, variantProperties] of Object.entries(variants)) {\n generated += renderRule(\n `${name}${variant}`,\n selectorList.map((selector) => appendVariant(selector, variant)),\n variantProperties,\n )\n }\n }\n return generated.trim()\n }\n\n generateCSS(): string {\n return [\n this.generateRootCSS(),\n this.generateBaseStyleCSS(),\n [...this.cssFragments].join('\\n\\n'),\n ].filter(Boolean).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 this.baseStyleMap.clear()\n }\n}\n\n/** Create an isolated registry for a configured Fray application runtime. */\nexport function createStyleRegistry(): StyleRegistry {\n return new StyleRegistry()\n}\n\n/** Backward-compatible structural styles for the default Fray runtime. */\nexport const styleRegistry = new StyleRegistry('')\n\nfunction splitDefinition(definition: BaseStyleDefinition): {\n properties: CSSDeclarations\n variants: CSSVariantMap\n} {\n const properties: CSSDeclarations = {}\n let variants: CSSVariantMap = {}\n for (const [property, value] of Object.entries(definition)) {\n if (property === 'variants') {\n if (typeof value !== 'object') {\n throw new TypeError('Base style variants must be declaration maps')\n }\n variants = value\n } else if (typeof value === 'string') {\n properties[property] = value\n } else {\n throw new TypeError(`Base style property ${property} must be a string`)\n }\n }\n return {properties, variants}\n}\n\nfunction renderRule(\n label: string,\n selectors: string[],\n properties: CSSDeclarations,\n): string {\n if (selectors.length === 0 || Object.keys(properties).length === 0) return ''\n const declarations = Object.entries(properties)\n .map(([property, value]) => ` ${property}: ${value};`)\n .join('\\n')\n return `/* ${label} */\\n${selectors.join(',\\n')} {\\n${declarations}\\n}\\n\\n`\n}\n\nfunction appendVariant(selector: string, variant: string): string {\n const pseudoElement = selector.indexOf('::')\n if (pseudoElement < 0) return `${selector}${variant}`\n return `${selector.slice(0, pseudoElement)}${variant}${selector.slice(pseudoElement)}`\n}\n\nfunction escapeAttributeValue(value: string): string {\n return value.replaceAll('\\\\', '\\\\\\\\').replaceAll('\"', '\\\\\"')\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'\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 FrayElementNameOptions {\n /** Namespace prepended to component host names. Defaults to `fray`. */\n prefix?: string | null\n /** Complete standards-valid tag names keyed by stable component host name. */\n overrides?: Readonly<Record<string, string>>\n}\n\nexport interface FrayRuntimeOptions {\n elementNames?: FrayElementNameOptions\n}\n\n/** Immutable application scope for element naming and structural styles. */\nexport class FrayRuntime {\n readonly elementPrefix: string | null\n readonly elementNameOverrides: Readonly<Record<string, string>>\n readonly styleRegistry: StyleRegistry\n\n constructor(\n options: FrayRuntimeOptions = {},\n registry: StyleRegistry = createStyleRegistry(),\n ) {\n if (options == null || typeof options !== 'object' || Array.isArray(options)) {\n throw new TypeError('FrayRuntime options must be an object')\n }\n const elementNames = options.elementNames ?? {}\n if (elementNames == null\n || typeof elementNames !== 'object'\n || Array.isArray(elementNames)) {\n throw new TypeError('Fray elementNames must be an object')\n }\n const prefix = elementNames.prefix === undefined ? 'fray' : elementNames.prefix\n if (prefix !== null) assertNamePart(prefix, 'Fray element prefix')\n\n const overrides = elementNames.overrides ?? {}\n if (overrides == null || typeof overrides !== 'object' || Array.isArray(overrides)) {\n throw new TypeError('Fray element-name overrides must be an object')\n }\n for (const [componentName, tagName] of Object.entries(overrides)) {\n assertNamePart(componentName, 'Fray component host name')\n assertCustomElementName(tagName)\n }\n\n this.elementPrefix = prefix\n this.elementNameOverrides = Object.freeze({...overrides})\n this.styleRegistry = registry\n }\n\n resolveElementName(hostName: string, standaloneHostName: string | null = null): string {\n assertNamePart(hostName, 'Fray component host name')\n const override = this.elementNameOverrides[hostName]\n const resolved = override\n ?? (this.elementPrefix == null\n ? standaloneHostName ?? hostName\n : `${this.elementPrefix}-${hostName}`)\n assertCustomElementName(resolved)\n return resolved\n }\n\n resolveHostSelector(\n selector: string,\n hostName: string,\n standaloneHostName: string | null = null,\n ): string {\n if (typeof selector !== 'string') throw new TypeError('Host selector must be a string')\n return selector.replaceAll('&', this.resolveElementName(hostName, standaloneHostName))\n }\n\n resolveHostCSS(\n cssText: string,\n hostName: string,\n standaloneHostName: string | null = null,\n ): string {\n if (typeof cssText !== 'string') throw new TypeError('Host CSS must be a string')\n return cssText.replaceAll('&', this.resolveElementName(hostName, standaloneHostName))\n }\n\n create<TArgs extends unknown[], TComponent extends Component>(\n componentType: new(...args: TArgs) => TComponent,\n ...args: TArgs\n ): TComponent {\n const component = 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 component.mount(parent, before)\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 Fray 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 createFrayRuntime(options: FrayRuntimeOptions = {}): FrayRuntime {\n return new FrayRuntime(options)\n}\n\n/** Runtime used by Component.new(), direct mount(), and the legacy styleRegistry export. */\nexport const defaultFrayRuntime = new FrayRuntime({}, 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, 'Fray element name')\n if (!value.includes('-') || RESERVED_CUSTOM_ELEMENT_NAMES.has(value)) {\n throw new TypeError(`Fray element name must be a non-reserved name containing a hyphen: ${value}`)\n }\n}\n","import type {\n EventBubble,\n FetchStateValue,\n ReadableEmitter,\n} from '@sylwellsoftware/glue'\n\nimport {FrayRuntime, defaultFrayRuntime} from '../runtime.js'\n\nexport const Fragment = Symbol.for('@sylwellsoftware/fray.Fragment')\n\nexport type Key = string | number\n\nexport interface ComponentProps {\n key?: Key | null\n children?: FrayChild | readonly FrayChild[]\n class?: string | null\n className?: string | null\n [name: string]: unknown\n}\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) => FrayChild\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 FrayChild =\n | string\n | number\n | boolean\n | null\n | undefined\n | VNode\n | Component\n | ReadableEmitter<FrayChild, unknown>\n | readonly FrayChild[]\n\ntype NormalizedChild = string | number | VNode | Component | ReadableEmitter<FrayChild, 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 Glue 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\nexport type TemplateProps<TProps extends ComponentProps> = {\n [TName in keyof TProps]: TName extends 'key' | 'children'\n ? TProps[TName]\n : TProps[TName] | LiveBinding<Exclude<TProps[TName], undefined>>\n}\n\nexport type BaseStyleNames = string | readonly string[]\nexport type BaseStyles =\n | Readonly<Record<string, BaseStyleNames>>\n | ReadonlyArray<readonly [string, BaseStyleNames]>\n\nexport interface ComponentDependency {\n registerStyles(runtime?: FrayRuntime, seen?: Set<ComponentDependency>): void\n}\n\ninterface Watchable {\n subscribe(\n listener: (notification: {event: EventBubble<unknown> | null}) => void,\n options?: {emitCurrent?: boolean},\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\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 Fray virtual node. */\nexport function h<TProps extends ComponentProps = ComponentProps>(\n type: VNodeType<TProps>,\n props: TemplateProps<TProps> | null = null,\n ...children: FrayChild[]\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}\n\ntype FrayDOMProps<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 type FrayIntrinsicElements = {\n [TTag in keyof HTMLElementTagNameMap]: FrayDOMProps<HTMLElementTagNameMap[TTag]>\n & LiveDOMProperties<HTMLElementTagNameMap[TTag]>\n & NativeValueBinding<HTMLElementTagNameMap[TTag]>\n & NativeCheckedBinding<HTMLElementTagNameMap[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 = FrayIntrinsicElements\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 css = ''\n static hostName: string | null = null\n static standaloneHostName: string | null = 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 get baseStyles(): unknown {\n return {}\n }\n\n static registerStyles(\n this: ComponentDependency & {\n css?: string\n baseStyles?: unknown\n dependencies?: ComponentDependency[]\n hostName?: string | null\n standaloneHostName?: string | null\n },\n runtime: FrayRuntime = defaultFrayRuntime,\n seen: Set<ComponentDependency> = new Set(),\n ): void {\n if (seen.has(this)) return\n seen.add(this)\n\n const hostName = this.hostName ?? null\n const standaloneHostName = this.standaloneHostName ?? null\n if (this.css) {\n runtime.styleRegistry.registerCSS(hostName == null\n ? this.css\n : runtime.resolveHostCSS(this.css, hostName, standaloneHostName))\n }\n const baseStyles = normalizeBaseStyles(this.baseStyles)\n for (const [selector, styleNames] of baseStyles) {\n runtime.styleRegistry.registerBaseStyle(hostName == null\n ? selector\n : runtime.resolveHostSelector(selector, hostName, standaloneHostName), styleNames)\n }\n for (const dependency of this.dependencies ?? []) {\n dependency.registerStyles(runtime, seen)\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 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: FrayRuntime = defaultFrayRuntime\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 /** One-time setup hook. Constructors must not subscribe or render. */\n initialize(): void {}\n\n render(): FrayChild {\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: FrayChild[]): 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 return h(this._runtime.resolveElementName(\n hostName,\n componentType.standaloneHostName,\n ), {\n ...props,\n 'data-fray-component': hostName,\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: FrayRuntime): this {\n if (!(runtime instanceof FrayRuntime)) {\n throw new TypeError('Component runtime must be a FrayRuntime')\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 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 let mountedNow = false\n if (!this.initialized) {\n this.initialized = true\n 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): 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 try {\n do {\n this.updateRequested = false\n const nextReads = new Set<Watchable>()\n this.collectingRenderReads = nextReads\n let nextVNode: NormalizedChild\n try {\n nextVNode = 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 } finally {\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.props = nextProps\n if (this.mounted) this.update()\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})\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 Glue 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 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 eventListener = listener as EventListener\n target.addEventListener(type, eventListener, options)\n this.onCleanup(() => target.removeEventListener(type, eventListener, options))\n return this\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 return component\n }\n\n destroy(): void {\n if (this.destroyed) return\n this.destroyed = true\n this.mounted = false\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 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})\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<FrayChild, 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}\n\ntype RenderRecord =\n | TextRecord\n | EmitterRecord\n | ElementRecord\n | FragmentRecord\n | ComponentRecord\n | FunctionRecord\n\nfunction normalizeRoot(value: FrayChild): 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: FrayChild | readonly FrayChild[]): NormalizedChild[] {\n const normalized: NormalizedChild[] = []\n const visit = (value: FrayChild): 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('fray-emitter-start')\n const end = document.createComment('fray-emitter-end')\n const current = value.get()\n if (Object.is(current, value)) {\n throw new TypeError('A Fray emitter child cannot render itself')\n }\n const fragment = document.createDocumentFragment()\n fragment.append(start, end)\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 = value.subscribe(({value: nextValue}) => {\n if (Object.is(nextValue, value)) {\n throw new TypeError('A Fray emitter child cannot render itself')\n }\n record.child = patchRoot(record.child, normalizeRoot(nextValue), owner)\n }, {emitCurrent: false})\n return record\n }\n\n if (value instanceof Component) {\n value._setRuntime(owner._runtime)\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 Fray child: ${describeValue(value)}`)\n }\n\n const {type, key = null, props} = value\n if (type === Fragment) {\n const start = document.createComment('fray-fragment-start')\n const end = document.createComment('fray-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 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 const resolvedProps = resolveLivePropValues(sourceProps)\n const instance = new type(resolvedProps as never)\n instance._setRuntime(owner._runtime)\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 rendered = normalizeRoot(functionType(functionProps))\n const record: FunctionRecord = {\n kind: 'function',\n key,\n type: functionType,\n props: functionProps,\n sourceProps,\n liveProps: new Map(),\n child: createRecord(rendered, owner),\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 }\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, (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 subscribeComponentLiveProps(record, sourceProps)\n}\n\nfunction subscribeFunctionLiveProps(record: FunctionRecord): void {\n reconcileLiveProps(record.liveProps, record.sourceProps, (key, value) => {\n record.props = {...record.props, [key]: value}\n rerenderFunctionRecord(record)\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, (key, value) => {\n record.props = {...record.props, [key]: value}\n rerenderFunctionRecord(record)\n })\n record.props = resolvedLiveProps(record.liveProps, sourceProps)\n rerenderFunctionRecord(record)\n}\n\nfunction rerenderFunctionRecord(record: FunctionRecord): void {\n const rendered = normalizeRoot(record.type(record.props))\n record.child = patchRoot(record.child, rendered, record.owner)\n}\n\nfunction reconcileLiveProps(\n subscriptions: Map<string, LivePropRecord>,\n sourceProps: ComponentProps,\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 = value.emitter.subscribe(({value: nextValue}) => {\n if (subscriptions.get(key) !== liveProp) return\n liveProp.value = nextValue\n onValue(key, nextValue)\n }, {emitCurrent: false})\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: FrayChild | readonly FrayChild[],\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 cursor = node.nextSibling\n }\n }\n }\n\n return nextRecords\n}\n\nfunction patchElementProps(record: ElementRecord, nextProps: ComponentProps): void {\n const {children: _nextChildren, ...next} = nextProps\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 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 = binding.emitter.subscribe(({value: 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 }, {emitCurrent: false})\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 = () => {\n 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 = next.subscribe(({value: 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 }, {emitCurrent: false})\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 if (registered && registered !== 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' && registered !== next) {\n const listener = next as EventListener\n record.node.addEventListener(eventName, listener)\n record.listeners.set(key, listener)\n }\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.set(node, property, enabled)\n node.toggleAttribute(normalizeAttributeName(key), enabled)\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)) Reflect.set(node, property, value)\n if (next == null) node.removeAttribute(normalizeAttributeName(key))\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 (value == null) delete node.dataset[key]\n else node.dataset[key] = String(value)\n }\n}\n\nfunction patchStyle(node: HTMLElement, previous: unknown, next: unknown): void {\n if (typeof next === 'string') {\n node.style.cssText = next\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 = ''\n for (const key of new Set([...Object.keys(oldValues), ...Object.keys(newValues)])) {\n const value = newValues[key]\n if (key.startsWith('--')) {\n if (value == null) node.style.removeProperty(key)\n else node.style.setProperty(key, String(value))\n } else {\n Reflect.set(node.style, key, value == null ? '' : String(value))\n }\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 if (value == null || value === false) node.removeAttribute(name)\n else if (value === true) node.setAttribute(name, '')\n else node.setAttribute(name, String(value))\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 (/^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)) node.remove()\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 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) record.node.remove()\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)) node.remove()\n }\n return\n }\n if (removeNodes) record.node.remove()\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)) parent.insertBefore(node, before)\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<FrayChild, 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\nfunction normalizeBaseStyles(value: unknown): Array<[string, BaseStyleNames]> {\n if (value == null) return []\n if (Array.isArray(value)) {\n return value.map((entry) => {\n if (!Array.isArray(entry) || entry.length < 2 || typeof entry[0] !== 'string') {\n throw new TypeError('Component baseStyles entries must be selector/style tuples')\n }\n const names = entry[1]\n if (typeof names !== 'string'\n && (!Array.isArray(names) || names.some((name) => typeof name !== 'string'))) {\n throw new TypeError('Component base style names must be strings')\n }\n return [entry[0], names as BaseStyleNames]\n })\n }\n if (typeof value !== 'object') {\n throw new TypeError('Component baseStyles must be an object or tuple array')\n }\n return Object.entries(value).map(([selector, names]) => [\n selector,\n names as BaseStyleNames,\n ])\n}\n","import {\n Component,\n Fragment,\n h,\n} from './Components/component.js'\nimport type {\n ComponentProps,\n FrayIntrinsicElements,\n FrayChild,\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 = FrayIntrinsicElements\n}\n\n// Used by declaration consumers that construct children without JSX.\nexport type JSXChild = FrayChild\n"],"names":["baseStyleDefinitions","STYLE_ATTRIBUTE","nextRegistryId","StyleRegistry","id","__publicField","css","selector","styleNames","names","name","styleName","selectors","generated","properties","variants","splitDefinition","selectorList","renderRule","variant","variantProperties","appendVariant","targetDocument","escapeAttributeValue","style","createStyleRegistry","styleRegistry","definition","property","value","label","declarations","pseudoElement","RESERVED_CUSTOM_ELEMENT_NAMES","FrayRuntime","options","registry","elementNames","prefix","assertNamePart","overrides","componentName","tagName","assertCustomElementName","hostName","standaloneHostName","resolved","cssText","componentType","args","component","parent","before","dependency","createFrayRuntime","defaultFrayRuntime","Fragment","liveBindingValues","BOOLEAN_ATTRIBUTES","PROPERTY_PROPS","live","emitter","assertReadableEmitter","binding","h","type","props","children","suppliedProps","propChildren","key","restProps","normalizeChildren","strings","values","result","string","index","_Component","instance","runtime","seen","baseStyles","normalizeBaseStyles","mountedNow","assertParentNode","insertRecord","_event","nextReads","nextVNode","normalizeRoot","patchRoot","firstNode","nextProps","_dom","observables","observable","unsubscribe","event","cleanup","active","target","listener","eventListener","disposeRecord","Component","normalized","visit","child","createRecord","owner","isReadableEmitter","start","end","current","fragment","record","nextValue","readKey","isVNode","describeValue","patchChildren","node","patchElementProps","isComponentClass","sourceProps","resolvedProps","resolveLivePropValues","subscribeComponentLiveProps","functionType","functionProps","rendered","subscribeFunctionLiveProps","previous","isCompatible","patchCompatible","next","anchor","patchComponentLiveProps","patchFunctionLiveProps","isLiveBinding","reconcileLiveProps","resolvedLiveProps","rerenderFunctionRecord","subscriptions","onValue","existing","liveProp","_a","nextValues","keyed","unkeyed","seenKeys","retained","nextRecords","unkeyedIndex","valueKey","candidate","cursor","recordNodes","_nextChildren","keys","previousValue","isNativeBindingProp","patchNativeBinding","patchRef","isEventProp","patchEvent","patchLiveElementProp","previousLive","previousResolved","patchDOMProp","assertWritableEmitter","assertNativeBindingTarget","eventName","nativeBindingEvent","registered","applyRef","setAttribute","patchDataset","patchStyle","normalizePropertyName","enabled","normalizeAttributeName","oldValues","toPropertyRecord","newValues","camelToKebab","letter","ref","removeNodes","nodes","entry","jsx","jsxs","jsxDEV","createPrebuiltElement"],"mappings":"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"}