@vireo-ai/trellis-ui 0.1.62 → 0.1.63

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 (64) hide show
  1. package/package.json +2 -1
  2. package/packages/client/skills/compose-trellis-ui/SKILL.md +84 -0
  3. package/packages/client/skills/compose-trellis-ui/references/project-ui.md +40 -0
  4. package/packages/client/src/styles/generated/theme-fonts.css +1 -1
  5. package/packages/client/src/styles/generated/theme-palette.css +1 -1
  6. package/packages/client/src/styles/generated/theme-runtime.css +34 -28
  7. package/packages/client/src/styles/theme-support.css +7 -0
  8. package/packages/client/types/components/import-flow/contract.d.ts +1 -0
  9. package/packages/client/types/core.d.ts +1 -1
  10. package/packages/client/types/runtime/index.d.ts +1 -1
  11. package/packages/client/types/runtime/theme.d.ts +6 -4
  12. package/packages/client/types/runtime/ui.d.ts +2 -0
  13. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/build-metadata.json +13 -13
  14. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable-CgP1efhO.js +2 -0
  15. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/{sortable-Do3a0LA9.js.map → sortable-CgP1efhO.js.map} +1 -1
  16. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable.js +2 -2
  17. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-Bm1phXnj.js → capability-sortable-CpUAUTdh.js} +2 -2
  18. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/{capability-sortable-Bm1phXnj.js.map → capability-sortable-CpUAUTdh.js.map} +1 -1
  19. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-CVVSxrtG.js +4 -0
  20. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-CVVSxrtG.js.map +1 -0
  21. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/{data-grid-Dm3rQfQ_.js → data-grid-Cr9kEoo9.js} +2 -2
  22. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/{data-grid-Dm3rQfQ_.js.map → data-grid-Cr9kEoo9.js.map} +1 -1
  23. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/components/data-grid.js +2 -2
  24. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core-CbDVD_pk.js +2 -0
  25. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core-CbDVD_pk.js.map +1 -0
  26. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core.js +2 -2
  27. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/logical-entry-manifest.json +10 -8
  28. package/packages/theme-engine/README.md +28 -0
  29. package/packages/theme-engine/dist/trellis.js +69 -6
  30. package/packages/theme-engine/generated/knobs/v1/color-alpha.json +1 -1
  31. package/packages/theme-engine/generated/knobs/v1/color-foundations.json +1 -1
  32. package/packages/theme-engine/generated/knobs/v1/color-ink.json +1 -1
  33. package/packages/theme-engine/generated/knobs/v1/color-lighting.json +1 -1
  34. package/packages/theme-engine/generated/knobs/v1/color-normalization.json +1 -1
  35. package/packages/theme-engine/generated/knobs/v1/color-ramps.json +1 -1
  36. package/packages/theme-engine/generated/knobs/v1/composition.json +1 -1
  37. package/packages/theme-engine/generated/knobs/v1/depth.json +1 -1
  38. package/packages/theme-engine/generated/knobs/v1/edges.json +1 -1
  39. package/packages/theme-engine/generated/knobs/v1/index.json +177 -3
  40. package/packages/theme-engine/generated/knobs/v1/manifest.json +18 -3
  41. package/packages/theme-engine/generated/knobs/v1/radii.json +1 -1
  42. package/packages/theme-engine/generated/knobs/v1/semantic-actions.json +1 -1
  43. package/packages/theme-engine/generated/knobs/v1/semantic-disabled.json +1 -1
  44. package/packages/theme-engine/generated/knobs/v1/semantic-disclosure.json +1 -1
  45. package/packages/theme-engine/generated/knobs/v1/semantic-intents.json +1 -1
  46. package/packages/theme-engine/generated/knobs/v1/semantic-scrim.json +1 -1
  47. package/packages/theme-engine/generated/knobs/v1/semantic-selection.json +1 -1
  48. package/packages/theme-engine/generated/knobs/v1/semantic-structure.json +1 -1
  49. package/packages/theme-engine/generated/knobs/v1/semantic-text-selection.json +372 -0
  50. package/packages/theme-engine/generated/knobs/v1/sizing-anatomy.json +1 -1
  51. package/packages/theme-engine/generated/knobs/v1/sizing-controls.json +1 -1
  52. package/packages/theme-engine/generated/knobs/v1/sizing-measures.json +1 -1
  53. package/packages/theme-engine/generated/knobs/v1/spacing.json +1 -1
  54. package/packages/theme-engine/generated/knobs/v1/substrates.json +1 -1
  55. package/packages/theme-engine/generated/knobs/v1/surfaces.json +1 -1
  56. package/packages/theme-engine/generated/knobs/v1/typography-anatomy.json +1 -1
  57. package/packages/theme-engine/generated/knobs/v1/typography-fonts.json +1 -1
  58. package/packages/theme-engine/generated/knobs/v1/typography-scale.json +1 -1
  59. package/packages/theme-engine/generated/schemas/theme-config-v1.json +51 -0
  60. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/capabilities/sortable-Do3a0LA9.js +0 -2
  61. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-CZ7fEQL2.js +0 -4
  62. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/chunks/ui-CZ7fEQL2.js.map +0 -1
  63. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core-CX4J7tsN.js +0 -2
  64. package/packages/server/trellis_ui/static/trellis_ui/assets/js/esm/core-CX4J7tsN.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid-Dm3rQfQ_.js","names":[],"sources":["../../../../../../../../client/src/components/data-grid/contract.ts","../../../../../../../../client/src/components/data-grid/model.ts","../../../../../../../../client/src/components/data-grid/index.ts","../../../../../../../../client/src/components/data-grid/entry.generated.ts"],"sourcesContent":["import {layoutBleed} from '../layout';\nimport {bool, json, number, oneOf, string, type SchemaToProps} from '../../runtime';\nimport {INTERACTION_TREATMENTS, SELECTION_COLORS} from '../common';\n\nconst DATA_GRID_SELECTIONS = ['none', 'single', 'multiple'] as const;\nconst DATA_GRID_DENSITIES = ['compact', 'default', 'comfortable'] as const;\nconst DATA_GRID_BORDERS = ['none', 'row', 'grid'] as const;\nconst DATA_GRID_RESIZE_MODES = ['onChange', 'onEnd'] as const;\nconst DATA_GRID_PINS = ['', 'left', 'right'] as const;\nconst DATA_GRID_SORTS = ['none', 'ascending', 'descending', 'other'] as const;\nconst DATA_GRID_ALIGNS = ['start', 'center', 'end'] as const;\n\ntype DataGridSelectionValue =\n | {mode: 'ids'; ids: string[]}\n | {mode: 'query'; token: string; total: number; except: string[]};\n\nconst dataGridSchema = {\n ...layoutBleed.schema,\n fetchUrl: string,\n cursor: bool,\n query: json<unknown>(null),\n totalRows: number.min(0).default(0),\n rowHeight: number.min(Number.EPSILON).default(36),\n bufferSize: number.min(1).default(50),\n overscan: number.min(0).default(0),\n initialIndex: number.min(0).default(0),\n startParam: string.default('start'),\n countParam: string.default('count'),\n totalParam: string.default('total'),\n totalHeader: string.default('X-Trellis-Total-Items'),\n assetsHeader: string.default('X-Trellis-Assets'),\n metaSelector: string.default('template[data-ui-virtualizer-meta]'),\n selection: oneOf(DATA_GRID_SELECTIONS, 'none'),\n selectionValue: json<DataGridSelectionValue>({mode: 'ids', ids: []}),\n selectOnRowClick: bool,\n rowKey: string.default('id'),\n stickyHeader: bool.default(true),\n resizableColumns: bool.default(true),\n reorderableColumns: bool.default(true),\n sortableColumns: bool.default(true),\n minColumnWidth: number.min(0).default(60),\n defaultColumnWidth: number.min(Number.EPSILON).default(180),\n maxColumnWidth: json<number | null>(null),\n resizeMode: oneOf(DATA_GRID_RESIZE_MODES, 'onChange'),\n color: oneOf(SELECTION_COLORS, 'neutral'),\n interaction: oneOf(INTERACTION_TREATMENTS, 'edge'),\n dragPreviewPosition: string.trim.default('preserve'),\n density: oneOf(DATA_GRID_DENSITIES, 'default'),\n border: oneOf(DATA_GRID_BORDERS, 'row'),\n empty: string.default('No rows found.'),\n class: string,\n controlsClass: string,\n viewportClass: string,\n headerClass: string,\n rowClass: string,\n cellClass: string,\n footerClass: string,\n emptyClass: string,\n};\n\nconst dataGridColumnSchema = {\n key: string,\n label: string,\n width: number.min(Number.EPSILON).default(180),\n minWidth: number.min(0).default(60),\n maxWidth: json<number | null>(null),\n hidden: bool,\n pinned: oneOf(DATA_GRID_PINS, ''),\n sortable: bool,\n sort: oneOf(DATA_GRID_SORTS, 'none'),\n resizable: bool.default(true),\n reorderable: bool.default(true),\n align: oneOf(DATA_GRID_ALIGNS, 'start'),\n class: string,\n headerClass: string,\n labelClass: string,\n resizeHandleClass: string,\n};\n\nconst dataGridRowsSchema = {\n rows: json<unknown[]>([]),\n columns: json<Array<Record<string, unknown>>>([]),\n startIndex: number.min(0).default(0),\n rowKey: string.default('id'),\n rowComponent: string.default('ui.data-grid.row'),\n cellComponent: string.default('ui.data-grid.cell'),\n class: string,\n};\nconst dataGridRowSchema = {key: string, index: number.min(0).default(0), class: string};\nconst dataGridCellSchema = {column: string, index: number.min(1).default(1), align: oneOf(DATA_GRID_ALIGNS, 'start'), class: string};\nconst dataGridEmptySchema = {class: string};\n\ntype DataGridProps = SchemaToProps<typeof dataGridSchema>;\ntype DataGridColumnProps = SchemaToProps<typeof dataGridColumnSchema>;\ntype DataGridRowsProps = SchemaToProps<typeof dataGridRowsSchema>;\ntype DataGridSelection = typeof DATA_GRID_SELECTIONS[number];\ntype DataGridPin = Exclude<typeof DATA_GRID_PINS[number], ''> | null;\ntype DataGridSort = typeof DATA_GRID_SORTS[number];\ntype DataGridAlign = typeof DATA_GRID_ALIGNS[number];\n\nexport {\n DATA_GRID_ALIGNS,\n DATA_GRID_BORDERS,\n DATA_GRID_DENSITIES,\n DATA_GRID_PINS,\n DATA_GRID_RESIZE_MODES,\n DATA_GRID_SELECTIONS,\n DATA_GRID_SORTS,\n dataGridCellSchema,\n dataGridColumnSchema,\n dataGridEmptySchema,\n dataGridRowSchema,\n dataGridRowsSchema,\n dataGridSchema,\n};\nexport type {\n DataGridAlign,\n DataGridColumnProps,\n DataGridPin,\n DataGridProps,\n DataGridRowsProps,\n DataGridSelection,\n DataGridSelectionValue,\n DataGridSort,\n};\n","import type {DataGridAlign, DataGridPin, DataGridSelection, DataGridSelectionValue, DataGridSort} from './contract';\n\ntype DataGridColumn = {\n key: string;\n label: string;\n width: number;\n minWidth: number;\n maxWidth: number | null;\n hidden: boolean;\n pinned: DataGridPin;\n sortable: boolean;\n sort: DataGridSort;\n resizable: boolean;\n reorderable: boolean;\n align: DataGridAlign;\n cellClass: string;\n element: HTMLElement;\n};\n\ntype DataGridColumnDefaults = {\n width: number;\n minWidth: number;\n maxWidth: number | null;\n resizable: boolean;\n reorderable: boolean;\n};\n\ntype DataGridColumnSnapshot = Omit<DataGridColumn, 'element'>;\n\ntype DataGridPinnedOffsets = {left: Map<string, number>; right: Map<string, number>};\ntype SelectionChange = {selection: DataGridSelectionValue; added: string[]; removed: string[]};\n\nconst numberAttribute = (element: HTMLElement, name: string, fallback: number): number => {\n const raw = element.getAttribute(name);\n if (raw === null || raw.trim() === '') return fallback;\n const value = Number(raw);\n return Number.isFinite(value) ? value : fallback;\n};\n\nconst optionalNumberAttribute = (element: HTMLElement, name: string, fallback: number | null): number | null => {\n const raw = element.getAttribute(name);\n if (raw === null || raw.trim() === '') return fallback;\n const value = Number(raw);\n return Number.isFinite(value) && value > 0 ? value : null;\n};\n\nconst boolAttribute = (element: HTMLElement, name: string, fallback: boolean): boolean => {\n if (!element.hasAttribute(name)) return fallback;\n const raw = element.getAttribute(name) ?? '';\n return raw === '' || ['true', '1', 'yes', 'on'].includes(raw.toLowerCase());\n};\n\nconst normalizeDataGridColumns = (\n elements: readonly HTMLElement[],\n defaults: DataGridColumnDefaults,\n): DataGridColumn[] => {\n const seen = new Set<string>();\n return elements.flatMap((element) => {\n const key = (element.dataset.column ?? '').trim();\n if (!key) throw new Error('Data Grid columns require a non-empty key.');\n if (element.hasAttribute('data-hidden')) return [];\n if (seen.has(key)) throw new Error(`Data Grid column key \"${key}\" is duplicated.`);\n seen.add(key);\n const minWidth = Math.max(0, numberAttribute(element, 'data-min-width', defaults.minWidth));\n const maxWidth = optionalNumberAttribute(element, 'data-max-width', defaults.maxWidth);\n const unclamped = numberAttribute(element, 'data-width', defaults.width);\n const width = Math.min(maxWidth ?? Number.POSITIVE_INFINITY, Math.max(minWidth, unclamped));\n const pinned = element.dataset.pinned === 'left' || element.dataset.pinned === 'right'\n ? element.dataset.pinned\n : null;\n const sort = ['ascending', 'descending', 'other'].includes(element.dataset.sort ?? '')\n ? element.dataset.sort as DataGridSort\n : 'none';\n const align = ['center', 'end'].includes(element.dataset.align ?? '')\n ? element.dataset.align as DataGridAlign\n : 'start';\n return [{\n key,\n label: element.dataset.label ?? element.textContent?.trim() ?? key,\n width,\n minWidth,\n maxWidth,\n hidden: false,\n pinned,\n sortable: boolAttribute(element, 'data-sortable', false),\n sort,\n resizable: boolAttribute(element, 'data-resizable', defaults.resizable),\n reorderable: boolAttribute(element, 'data-reorderable', defaults.reorderable),\n align,\n cellClass: element.dataset.cellClass ?? '',\n element,\n }];\n });\n};\n\nconst columnTemplate = (columns: readonly DataGridColumn[]): string => (\n columns.map(({width}) => `${width}px`).join(' ')\n);\n\nconst dataGridColumnSnapshots = (columns: readonly DataGridColumn[]): DataGridColumnSnapshot[] => (\n columns.map(({element: _element, ...column}) => column)\n);\n\nconst pinnedOffsets = (columns: readonly DataGridColumn[]): DataGridPinnedOffsets => {\n const left = new Map<string, number>();\n const right = new Map<string, number>();\n let offset = 0;\n columns.forEach((column) => {\n if (column.pinned !== 'left') return;\n left.set(column.key, offset);\n offset += column.width;\n });\n offset = 0;\n [...columns].reverse().forEach((column) => {\n if (column.pinned !== 'right') return;\n right.set(column.key, offset);\n offset += column.width;\n });\n return {left, right};\n};\n\nconst cssEscape = (value: string): string => (\n globalThis.CSS?.escape ? globalThis.CSS.escape(value) : value.replace(/[^a-zA-Z0-9_-]/g, (character) => `\\\\${character}`)\n);\n\nconst dataGridLayoutCss = (scope: string, columns: readonly DataGridColumn[]): string => {\n const offsets = pinnedOffsets(columns);\n const pinnedPlane = 'z-index:2;background-color:var(--ui-surface-color);';\n return columns.map((column, index) => {\n const owner = `[data-ui-data-grid-scope=\"${cssEscape(scope)}\"]`;\n const columnSelector = `[data-column=\"${cssEscape(column.key)}\"]`;\n const selector = `${owner} [data-ui-data-grid-column-header]${columnSelector},${owner} [data-ui-data-grid-cell]${columnSelector}`;\n const pin = column.pinned === 'left'\n ? `position:sticky;left:${offsets.left.get(column.key) ?? 0}px;${pinnedPlane}`\n : column.pinned === 'right'\n ? `position:sticky;right:${offsets.right.get(column.key) ?? 0}px;${pinnedPlane}`\n : '';\n return `${selector}{grid-column:${index + 1};${pin}}`;\n }).join('');\n};\n\nconst normalizeSelection = (value: unknown, mode: DataGridSelection): DataGridSelectionValue => {\n if (mode === 'multiple' && typeof value === 'object' && value !== null && (value as {mode?: unknown}).mode === 'query') {\n const query = value as Partial<Extract<DataGridSelectionValue, {mode: 'query'}>>;\n if (typeof query.token === 'string' && Number.isFinite(query.total)) return {\n mode: 'query',\n token: query.token,\n total: Math.max(0, Math.floor(query.total ?? 0)),\n except: [...new Set(Array.isArray(query.except) ? query.except.filter((key): key is string => typeof key === 'string') : [])],\n };\n }\n const ids = typeof value === 'object' && value !== null && (value as {mode?: unknown}).mode === 'ids'\n && Array.isArray((value as {ids?: unknown}).ids)\n ? (value as {ids: unknown[]}).ids.filter((key): key is string => typeof key === 'string')\n : [];\n const unique = [...new Set(ids)];\n return {mode: 'ids', ids: mode === 'single' ? unique.slice(0, 1) : mode === 'none' ? [] : unique};\n};\n\nconst isRowSelected = (selection: DataGridSelectionValue, key: string): boolean => (\n selection.mode === 'query' ? !selection.except.includes(key) : selection.ids.includes(key)\n);\n\nconst toggleSelection = (\n current: DataGridSelectionValue,\n key: string,\n mode: DataGridSelection,\n selected?: boolean,\n): SelectionChange => {\n const normalized = normalizeSelection(current, mode);\n if (mode === 'none') return {selection: normalized, added: [], removed: []};\n const wasSelected = isRowSelected(normalized, key);\n const nextSelected = selected ?? !wasSelected;\n if (wasSelected === nextSelected) return {selection: normalized, added: [], removed: []};\n if (normalized.mode === 'query') {\n const except = nextSelected\n ? normalized.except.filter((value) => value !== key)\n : [...normalized.except, key];\n return {selection: {...normalized, except}, added: nextSelected ? [key] : [], removed: nextSelected ? [] : [key]};\n }\n const ids = mode === 'single' && nextSelected\n ? [key]\n : nextSelected\n ? [...normalized.ids, key]\n : normalized.ids.filter((value) => value !== key);\n return {selection: {mode: 'ids', ids}, added: nextSelected ? [key] : [], removed: nextSelected ? [] : [key]};\n};\n\nconst reorderColumns = (columns: readonly DataGridColumn[], key: string, toIndex: number): DataGridColumn[] | null => {\n const from = columns.findIndex((column) => column.key === key);\n if (from < 0 || !columns[from]?.reorderable) return null;\n const region = columns[from]?.pinned ?? null;\n const regionIndexes = columns.flatMap((column, index) => column.pinned === region ? [index] : []);\n if (!regionIndexes.includes(toIndex)) return null;\n const next = [...columns];\n const [column] = next.splice(from, 1);\n if (!column) return null;\n next.splice(toIndex, 0, column);\n return next;\n};\n\nexport {\n columnTemplate,\n dataGridColumnSnapshots,\n dataGridLayoutCss,\n isRowSelected,\n normalizeDataGridColumns,\n normalizeSelection,\n pinnedOffsets,\n reorderColumns,\n toggleSelection,\n};\nexport type {DataGridColumn, DataGridColumnDefaults, DataGridColumnSnapshot, DataGridPinnedOffsets, SelectionChange};\n","import {createLayoutTask} from '@client/runtime/layout-task';\nimport type Alpine from 'alpinejs';\n\nimport {\n createResizable,\n createVirtualWindowController,\n defineAlpineData,\n defineProps,\n fixedAxisWindowAdapter,\n parseVirtualizerFragmentResponse,\n registerDomInvalidationOwner,\n reflectSchemaProp,\n replaceFragmentChildren,\n type FixedAxisWindow,\n type PropState,\n type ResizeEvent,\n type TrellisAlpineComponent,\n type VirtualScrollAlign,\n type VirtualWindowRequest,\n} from '@client/runtime';\nimport {cleanupManagerFor} from '@client/runtime/alpine-data';\nimport {CleanupManager} from '@client/runtime/cleanup-manager';\nimport {\n UiVirtualizer,\n type CursorVirtualizerOptions,\n type UiVirtualizerApi,\n type VirtualizerData,\n} from '../../runtime/virtualizer';\nimport {serverCursorOptions} from '../../runtime/cursor-data-source';\nimport {cloneSerializable, isSerializableEqual} from '../../utils';\nimport {dataGridSchema, type DataGridSelectionValue} from './contract';\nimport {\n columnTemplate,\n dataGridColumnSnapshots,\n dataGridLayoutCss,\n isRowSelected,\n normalizeDataGridColumns,\n normalizeSelection,\n reorderColumns,\n toggleSelection,\n type DataGridColumn,\n type DataGridColumnSnapshot,\n} from './model';\n\n/** Options for resetting an indexed or cursor-backed Data Grid. @public */\ninterface DataGridResetOptions {\n /** Scroll offset restored after the first page loads. */\n scrollTop?: number;\n}\n\n/** Options for replacing an indexed Data Grid endpoint. @public */\ninterface DataGridSetUrlOptions {\n /** Whether to discard loaded rows and reload immediately. */\n reset?: boolean;\n}\n\n/** Public Alpine API for `ui.data-grid`. @public */\ninterface UiDataGridApi {\n /** Whether the active cursor data source supports server-side index seeking. */\n readonly supportsSeek: boolean;\n /** Discard loaded rows and request the current indexed range or first cursor page again. */\n reload(options?: DataGridResetOptions): void;\n /** Return the grid to its initial indexed range or first cursor page. */\n reset(options?: DataGridResetOptions): void;\n /** Scroll to a row and seek through the server when its cursor page is not loaded. */\n scrollToIndex(index: number, align?: VirtualScrollAlign): void;\n /** Replace the indexed endpoint, optionally resetting loaded rows. */\n setUrl(url: string, options?: DataGridSetUrlOptions): void;\n /** Reflect the authoritative total-row attribute without requesting or replacing rows. */\n setTotalRows(count: number): void;\n /** Reflect the authoritative query attribute; meaningful cursor-query changes reset to the first page. */\n setQuery<Query>(query: Query): void;\n /** Activate cursor mode; a rendered query attribute takes precedence over the option query. */\n useCursor<Query, Content>(options: CursorVirtualizerOptions<Query, Content>): void;\n /** Resize a column to a pixel width. */\n resizeColumn(key: string, width: number): void;\n /** Move a column to a new zero-based position. */\n reorderColumn(key: string, toIndex: number): void;\n /** Add a row key to the explicit selection. */\n selectRow(key: string): void;\n /** Remove a row key from the explicit selection. */\n deselectRow(key: string): void;\n /** Toggle a row key in the current selection. */\n toggleRow(key: string): void;\n /** Replace the complete row selection value. */\n setSelection(value: DataGridSelectionValue): void;\n /** Select all rows represented by a server-owned query token. */\n selectQuery(token: string, total: number, except?: string[]): void;\n /** Clear explicit and query-backed row selection. */\n clearSelection(): void;\n}\n\ntype DataGridData = UiDataGridApi & {\n props: PropState<typeof dataGridSchema>;\n init(): void;\n destroy(): void;\n};\n\ntype BlockRecord = {key: string; element: HTMLElement};\ntype CursorDelegate = TrellisAlpineComponent<VirtualizerData<unknown>> & UiVirtualizerApi<unknown>;\n\nconst integer = (value: number, minimum = 0): number => (\n Math.max(minimum, Math.floor(Number.isFinite(value) ? value : minimum))\n);\n\nconst interactiveSelector = 'a,button,input,select,textarea,[contenteditable],[role=\"button\"],[role=\"link\"]';\n\nconst UiDataGrid = (AlpineInstance: Alpine.Alpine): TrellisAlpineComponent<DataGridData> => {\n let root: HTMLElement | null = null;\n let viewport: HTMLElement | null = null;\n let table: HTMLElement | null = null;\n let body: HTMLElement | null = null;\n let spacer: HTMLElement | null = null;\n let styleElement: HTMLStyleElement | null = null;\n let columns: DataGridColumn[] = [];\n let blocks: BlockRecord[] = [];\n let totalRows = 0;\n let selection: DataGridSelectionValue = {mode: 'ids', ids: []};\n let currentWindowKey = '';\n let latestScrollTop: number | null = null;\n let destroyed = false;\n let listenerAborter: AbortController | null = null;\n let suppressPropChange = false;\n let cursorDelegate: CursorDelegate | null = null;\n let cursorOptionQuery: unknown = null;\n let appliedCursorQuery: unknown = null;\n let previousColumnSnapshots: DataGridColumnSnapshot[] = [];\n let columnObserver: MutationObserver | null = null;\n let headerSizeObserver: ResizeObserver | null = null;\n let observedHeaderWidth: number | null = null;\n let unregisterColumnInvalidation: (() => void) | null = null;\n let declarativeFlushQueued = false;\n let forceColumnRefresh = false;\n let cleanup: CleanupManager;\n let resizeCleanup: CleanupManager | null = null;\n const requestAborters = new Map<string, AbortController>();\n const appliedRowClasses = new WeakMap<HTMLElement, string[]>();\n const appliedCellClasses = new WeakMap<HTMLElement, string[]>();\n const controller = createVirtualWindowController(fixedAxisWindowAdapter);\n\n const dispatch = (name: string, detail: Record<string, unknown>): void => {\n root?.dispatchEvent(new CustomEvent(name, {bubbles: true, composed: true, detail}));\n };\n const syncOwnedClasses = (element: HTMLElement, value: string, owned: WeakMap<HTMLElement, string[]>): void => {\n const previous = owned.get(element) ?? [];\n if (previous.length) element.classList.remove(...previous);\n const names = [...new Set(value.split(/\\s+/).filter(Boolean))];\n if (names.length) element.classList.add(...names);\n owned.set(element, names);\n };\n const columnDefaults = () => ({\n width: component.props.defaultColumnWidth,\n minWidth: component.props.minColumnWidth,\n maxWidth: component.props.maxColumnWidth,\n resizable: component.props.resizableColumns,\n reorderable: component.props.reorderableColumns,\n });\n const declaredColumns = (): DataGridColumn[] => normalizeDataGridColumns(\n Array.from(root?.querySelectorAll<HTMLElement>('[data-ui-data-grid-column-header]') ?? []),\n columnDefaults(),\n );\n const rows = (): HTMLElement[] => Array.from(root?.querySelectorAll<HTMLElement>('[data-ui-data-grid-row]') ?? []);\n const bodyWidthTask = createLayoutTask({\n measure: () => observedHeaderWidth ?? root?.querySelector<HTMLElement>('[data-ui-data-grid-header-row]')?.getBoundingClientRect().width ?? null,\n apply: (width) => {\n if (!body || width === null) return;\n const value = `${width}px`;\n if (body.style.width !== value) body.style.width = value;\n },\n });\n let scrollTarget: {index: number; align: VirtualScrollAlign; offset: number | null} | {offset: number} | null = null;\n const scrollToTask = createLayoutTask({\n measure: () => viewport && !cursorDelegate ? {\n target: scrollTarget,\n height: scrollTarget && 'index' in scrollTarget ? viewport.clientHeight : 0,\n offset: scrollTarget?.offset ?? viewport.scrollTop,\n } : null,\n apply: (measurement) => {\n if (!viewport || !measurement || cursorDelegate) return;\n scrollTarget = null;\n const next = measurement.target && 'index' in measurement.target ? fixedAxisWindowAdapter.scrollTo({\n total: totalRows, itemSize: component.props.rowHeight, viewportSize: measurement.height,\n scrollOffset: measurement.offset, buffer: component.props.bufferSize,\n }, {axis: 'y', index: measurement.target.index, align: measurement.target.align}) : Math.max(0, measurement.offset);\n if (measurement.target) viewport.scrollTop = next;\n reconcile(next);\n },\n });\n const reflectMountedSelection = (): void => {\n rows().forEach((row) => {\n const key = row.dataset.rowKey ?? '';\n const selected = component.props.selection !== 'none' && key !== '' && isRowSelected(selection, key);\n row.toggleAttribute('data-selected', selected);\n if (component.props.selection === 'none') row.removeAttribute('aria-selected');\n else row.setAttribute('aria-selected', String(selected));\n });\n };\n const syncColumnGeometry = (): void => {\n if (!root || !styleElement) return;\n root.style.setProperty('--ui-data-grid-template', columnTemplate(columns));\n const scope = root.dataset.uiDataGridScope ?? '';\n styleElement.textContent = dataGridLayoutCss(scope, columns);\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n if (headerRow) { observedHeaderWidth = null; bodyWidthTask.schedule(); }\n };\n const reconcileColumnStructure = (): void => {\n if (!root) return;\n const columnsByKey = new Map(columns.map((column, index) => [column.key, {column, index}]));\n table?.setAttribute('aria-colcount', String(columns.length));\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n const indicator = headerRow?.querySelector<HTMLElement>('[data-ui-data-grid-column-indicator]');\n if (indicator) headerRow?.append(indicator);\n const mountedRows = rows();\n mountedRows.forEach((row) => {\n const cells = Array.from(row.children).filter((element): element is HTMLElement => (\n element instanceof HTMLElement && element.hasAttribute('data-ui-data-grid-cell')\n ));\n const cellsByKey = new Map(cells.flatMap((element) => (\n element instanceof HTMLElement && element.hasAttribute('data-ui-data-grid-cell')\n ? [[element.dataset.column ?? '', element] as const]\n : []\n )));\n columns.forEach(({key}) => {\n const cell = cellsByKey.get(key);\n if (!cell) return;\n cell.hidden = false;\n row.append(cell);\n });\n cells.forEach((cell) => {\n if (columnsByKey.has(cell.dataset.column ?? '')) return;\n cell.hidden = true;\n cell.removeAttribute('aria-colindex');\n cell.removeAttribute('data-pinned');\n row.append(cell);\n });\n });\n columns.forEach((column, index) => {\n column.element.setAttribute('aria-colindex', String(index + 1));\n if (column.pinned) column.element.dataset.pinned = column.pinned;\n else column.element.removeAttribute('data-pinned');\n if (column.sortable) column.element.setAttribute('aria-sort', column.sort);\n else column.element.removeAttribute('aria-sort');\n column.element.dataset.disabled = String(!column.reorderable || !component.props.reorderableColumns);\n const ownedLabel = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-label-owned]');\n if (ownedLabel) ownedLabel.textContent = column.label;\n const previewLabel = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-preview-label]');\n if (previewLabel) previewLabel.textContent = column.label;\n const sortIndicator = column.element.querySelector<HTMLElement>('[data-ui-data-grid-sort-indicator]');\n if (sortIndicator) {\n sortIndicator.textContent = column.sort === 'ascending' ? '↑' : column.sort === 'descending' ? '↓' : '';\n }\n column.element.querySelector<HTMLElement>('[data-ui-data-grid-resize-handle]')\n ?.setAttribute('aria-label', `Resize ${column.label || column.key} column`);\n });\n mountedRows.forEach((row) => syncOwnedClasses(row, component.props.rowClass, appliedRowClasses));\n root.querySelectorAll<HTMLElement>('[data-ui-data-grid-cell]').forEach((cell) => {\n const entry = columnsByKey.get(cell.dataset.column ?? '');\n if (!entry) return;\n cell.setAttribute('aria-colindex', String(entry.index + 1));\n cell.dataset.align = entry.column.align;\n syncOwnedClasses(cell, `${component.props.cellClass} ${entry.column.cellClass}`, appliedCellClasses);\n if (entry.column.pinned) cell.dataset.pinned = entry.column.pinned;\n else cell.removeAttribute('data-pinned');\n });\n };\n const columnChangeDetail = (\n previous: readonly DataGridColumnSnapshot[],\n next: readonly DataGridColumnSnapshot[],\n ): Record<string, unknown> => {\n const previousByKey = new Map(previous.map((column) => [column.key, column]));\n const nextByKey = new Map(next.map((column) => [column.key, column]));\n const added = next.filter(({key}) => !previousByKey.has(key)).map(({key}) => key);\n const removed = previous.filter(({key}) => !nextByKey.has(key)).map(({key}) => key);\n const changed = next.flatMap((column) => {\n const before = previousByKey.get(column.key);\n if (!before) return [];\n const fields = Object.keys(column).filter((field) => (\n field !== 'key'\n && !isSerializableEqual(before[field as keyof DataGridColumnSnapshot], column[field as keyof DataGridColumnSnapshot])\n ));\n return fields.length ? [{key: column.key, fields}] : [];\n });\n return {previous, columns: next, added, removed, changed};\n };\n const flushDeclarativeState = (): void => {\n declarativeFlushQueued = false;\n if (!root || destroyed) return;\n\n const nextColumns = declaredColumns();\n const nextSnapshots = dataGridColumnSnapshots(nextColumns);\n const semanticColumnChange = !isSerializableEqual(previousColumnSnapshots, nextSnapshots);\n const elementChange = columns.length !== nextColumns.length\n || columns.some((column, index) => column.element !== nextColumns[index]?.element);\n const resizeBoundaryChange = elementChange || columns.some((column, index) => {\n const next = nextColumns[index];\n return !next\n || column.key !== next.key\n || column.resizable !== next.resizable\n || column.minWidth !== next.minWidth\n || column.maxWidth !== next.maxWidth;\n });\n if (semanticColumnChange || elementChange || forceColumnRefresh) {\n const previous = previousColumnSnapshots;\n columns = nextColumns;\n previousColumnSnapshots = nextSnapshots;\n const refreshResizeHandles = resizeBoundaryChange || forceColumnRefresh;\n forceColumnRefresh = false;\n reconcileColumnStructure();\n syncColumnGeometry();\n if (refreshResizeHandles) registerResizeHandles();\n if (semanticColumnChange) {\n dispatch('ui:data-grid-columns-change', columnChangeDetail(previous, nextSnapshots));\n }\n }\n\n if (component.props.totalRows !== totalRows) {\n updateTotal(component.props.totalRows);\n if (cursorDelegate) root.dataset.totalItems = String(totalRows);\n }\n\n if (cursorDelegate) {\n const nextQuery = root.hasAttribute('data-query') ? component.props.query : cursorOptionQuery;\n if (!isSerializableEqual(appliedCursorQuery, nextQuery)) {\n appliedCursorQuery = cloneSerializable(nextQuery);\n cursorDelegate.setQuery(nextQuery);\n }\n }\n };\n const scheduleDeclarativeState = (): void => {\n if (declarativeFlushQueued) return;\n declarativeFlushQueued = true;\n queueMicrotask(flushDeclarativeState);\n };\n const syncState = (): void => {\n if (!root || !spacer) return;\n if (!cursorDelegate) {\n root.toggleAttribute('data-loading', requestAborters.size > 0);\n root.toggleAttribute('data-empty', totalRows === 0);\n }\n root.dataset.selection = component.props.selection;\n table?.setAttribute('aria-rowcount', String(totalRows + 1));\n root.style.setProperty('--ui-data-grid-row-height', `${component.props.rowHeight}px`);\n root.style.setProperty('--ui-data-grid-total-height', `${Math.max(totalRows * component.props.rowHeight, component.props.rowHeight)}px`);\n if (!cursorDelegate || totalRows > 0) spacer.style.height = `var(--ui-data-grid-total-height)`;\n reflectMountedSelection();\n };\n const updateTotal = (next: number): void => {\n const normalized = integer(next);\n if (normalized === totalRows) return;\n totalRows = normalized;\n syncState();\n dispatch('ui:data-grid-total-change', {totalRows});\n };\n const blockWindow = (start: number): FixedAxisWindow => fixedAxisWindowAdapter.compute({axes: {y: {\n total: totalRows,\n itemSize: component.props.rowHeight,\n viewportSize: component.props.bufferSize * component.props.rowHeight,\n scrollOffset: start * component.props.rowHeight,\n buffer: 0,\n }}});\n const desiredWindows = (scrollTop: number): FixedAxisWindow[] => {\n if (totalRows === 0) return [];\n const size = integer(component.props.bufferSize, 1);\n const index = Math.min(totalRows - 1, Math.floor(Math.max(0, scrollTop) / component.props.rowHeight));\n const center = Math.floor(index / size) * size;\n const last = Math.floor((totalRows - 1) / size) * size;\n const starts = [center - size, center, center + size].map((start) => Math.min(last, Math.max(0, start)));\n if (center === 0 && last > size) starts.splice(0, 3, 0, size, Math.min(last, size * 2));\n else if (center === last && last > size) starts.splice(0, 3, Math.max(0, last - (size * 2)), last - size, last);\n return [...new Set(starts)].map(blockWindow);\n };\n const requestUrl = (window: FixedAxisWindow): string => {\n const axis = window.axes.y;\n if (!axis) throw new Error('Data Grid requires a vertical virtual window.');\n const url = new URL(component.props.fetchUrl, document.baseURI);\n url.searchParams.set(component.props.startParam, String(axis.start));\n url.searchParams.set(component.props.countParam, String(axis.count));\n url.searchParams.set(component.props.totalParam, String(axis.total));\n return /^[a-z][a-z\\d+.-]*:/i.test(component.props.fetchUrl) || component.props.fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n };\n const settle = (blockKey: string, aborter: AbortController): void => {\n if (requestAborters.get(blockKey) !== aborter) return;\n requestAborters.delete(blockKey);\n syncState();\n if (requestAborters.size > 0 || latestScrollTop === null || destroyed) return;\n const scrollTop = latestScrollTop;\n latestScrollTop = null;\n reconcile(scrollTop);\n };\n const load = async (\n block: BlockRecord,\n window: FixedAxisWindow,\n request: VirtualWindowRequest<FixedAxisWindow>,\n ): Promise<void> => {\n const axis = window.axes.y;\n if (!axis) return;\n const aborter = new AbortController();\n requestAborters.set(block.key, aborter);\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:data-grid-load-start', {window});\n try {\n const requestId = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${request.requestGeneration}`;\n const response = await fetch(requestUrl(window), {method: 'GET', headers: {\n Accept: 'text/html',\n 'X-Trellis-Virtualizer': 'true',\n 'X-Trellis-Request-ID': requestId,\n }, signal: aborter.signal});\n if (!response.ok && response.status !== 204) {\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:data-grid-error', {window, status: response.status});\n return;\n }\n const payload = await parseVirtualizerFragmentResponse(response, component.props);\n if (controller.pending(block.key) !== request || destroyed) return;\n const replaced = await replaceFragmentChildren(AlpineInstance, block.element, payload.html, {\n assets: payload.assets,\n shouldReplace: () => controller.pending(block.key) === request && !destroyed,\n });\n if (!replaced) return;\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n if (!controller.commit(request, window)) return;\n block.element.style.height = `${axis.count * component.props.rowHeight}px`;\n block.element.style.transform = `translateY(${axis.translateOffset}px)`;\n reconcileColumnStructure();\n reflectMountedSelection();\n dispatch('ui:data-grid-load', {window, start: axis.start, count: axis.count, end: axis.start + axis.count});\n } catch (error) {\n if (aborter.signal.aborted) return;\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:data-grid-error', {window, status: 0, error});\n } finally {\n settle(block.key, aborter);\n }\n };\n const reconcile = (scrollTop: number): void => {\n if (cursorDelegate || component.props.cursor) return;\n if (requestAborters.size > 0) {\n latestScrollTop = scrollTop;\n return;\n }\n const desired = desiredWindows(scrollTop);\n const logicalIndex = Math.min(Math.max(0, totalRows - 1), Math.floor(Math.max(0, scrollTop) / component.props.rowHeight));\n const center = desired.find((window) => {\n const axis = window.axes.y;\n return axis && logicalIndex >= axis.start && logicalIndex < axis.start + axis.count;\n }) ?? desired[0];\n if (center && currentWindowKey !== center.key) {\n currentWindowKey = center.key;\n const axis = center.axes.y!;\n dispatch('ui:data-grid-range', {start: axis.start, count: axis.count, end: axis.start + axis.count, window: center});\n }\n if (desired.length === 0) {\n blocks.forEach((block) => void replaceFragmentChildren(AlpineInstance, block.element, ''));\n return;\n }\n const preserved = new Set<BlockRecord>();\n desired.forEach((window) => {\n const existing = blocks.find((block) => controller.mounted(block.key)?.key === window.key);\n if (existing) preserved.add(existing);\n });\n const available = blocks.filter((block) => !preserved.has(block));\n desired.forEach((window) => {\n if (blocks.some((block) => controller.mounted(block.key)?.key === window.key)) return;\n const block = available.shift();\n if (!block) return;\n const request = controller.begin(block.key, window);\n if (request) void load(block, window, request);\n });\n };\n const invalidate = (): void => {\n requestAborters.forEach((aborter) => aborter.abort());\n requestAborters.clear();\n latestScrollTop = null;\n currentWindowKey = '';\n controller.invalidate();\n blocks.forEach((block) => {\n block.element.style.height = '';\n block.element.style.transform = '';\n void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n syncState();\n };\n const setSelection = (value: DataGridSelectionValue, detail?: {added: string[]; removed: string[]}): void => {\n selection = normalizeSelection(value, component.props.selection);\n suppressPropChange = true;\n component.props.selectionValue = selection;\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'selectionValue', value: selection});\n suppressPropChange = false;\n reflectMountedSelection();\n dispatch('ui:data-grid-selection-change', {selection, added: detail?.added ?? [], removed: detail?.removed ?? []});\n };\n const changeRow = (key: string, selected?: boolean): void => {\n const change = toggleSelection(selection, String(key), component.props.selection, selected);\n if (change.added.length === 0 && change.removed.length === 0) return;\n setSelection(change.selection, change);\n };\n const updateColumnWidth = (column: DataGridColumn, width: number, phase: ResizeEvent['phase']): void => {\n column.width = Math.min(column.maxWidth ?? Number.POSITIVE_INFINITY, Math.max(column.minWidth, width));\n column.element.dataset.width = String(column.width);\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n syncColumnGeometry();\n dispatch('ui:data-grid-column-resize', {column: column.key, width: column.width, phase});\n };\n const registerResizeHandles = (): void => {\n resizeCleanup?.run();\n resizeCleanup = new CleanupManager();\n cleanup.addChild(resizeCleanup);\n columns.forEach((column) => {\n const handle = column.element.querySelector<HTMLElement>('[data-ui-data-grid-resize-handle]');\n if (!handle) return;\n const enabled = column.resizable && component.props.resizableColumns;\n handle.hidden = !column.resizable;\n if (enabled) handle.removeAttribute('aria-disabled');\n else handle.setAttribute('aria-disabled', 'true');\n handle.tabIndex = enabled ? 0 : -1;\n if (!enabled) return;\n const onResize = (event: ResizeEvent): void => updateColumnWidth(column, event.previewWidth, event.phase);\n resizeCleanup?.add(createResizable({\n element: column.element,\n handle,\n axis: 'x',\n min: column.minWidth,\n max: column.maxWidth,\n mode: component.props.resizeMode,\n disabled: () => !component.props.resizableColumns || !column.resizable,\n onStart: onResize,\n onResize,\n onEnd: onResize,\n onCancel: onResize,\n }));\n });\n };\n\n const component: TrellisAlpineComponent<DataGridData> = {\n get supportsSeek(): boolean { return cursorDelegate?.supportsSeek ?? false; },\n props: null as unknown as PropState<typeof dataGridSchema>,\n init(): void {\n cleanup = cleanupManagerFor(this);\n root = this.$el;\n destroyed = false;\n const scope = globalThis.crypto?.randomUUID?.() ?? `grid-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n root.dataset.uiDataGridScope = scope;\n root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]')?.setAttribute('data-sortable-scope', scope);\n this.props = defineProps({el: root, schema: dataGridSchema, onChange: (_state, changes) => {\n if (suppressPropChange) return;\n const keys = changes.map(({key}) => key);\n if (keys.includes('selectionValue') || keys.includes('selection')) {\n selection = normalizeSelection(this.props.selectionValue, this.props.selection);\n reflectMountedSelection();\n }\n if (keys.some((key) => [\n 'resizableColumns', 'reorderableColumns', 'minColumnWidth', 'defaultColumnWidth', 'maxColumnWidth',\n ].includes(key))) forceColumnRefresh = true;\n if (keys.some((key) => [\n 'query', 'totalRows', 'resizableColumns', 'reorderableColumns', 'minColumnWidth',\n 'defaultColumnWidth', 'maxColumnWidth',\n ].includes(key))) scheduleDeclarativeState();\n if (keys.some((key) => ['fetchUrl', 'rowHeight', 'bufferSize'].includes(key))) this.reload();\n }});\n totalRows = integer(this.props.totalRows);\n selection = normalizeSelection(this.props.selectionValue, this.props.selection);\n viewport = root.querySelector<HTMLElement>('[data-ui-data-grid-viewport]')\n ?? root.querySelector<HTMLElement>('[data-ui-scroll-area-viewport]');\n table = root.querySelector<HTMLElement>('[data-ui-data-grid-inner]');\n body = root.querySelector<HTMLElement>('[data-ui-data-grid-body]');\n spacer = root.querySelector<HTMLElement>('[data-ui-data-grid-spacer]');\n styleElement = root.querySelector<HTMLStyleElement>('style[data-ui-data-grid-layout]');\n blocks = Array.from(root.querySelectorAll<HTMLElement>('[data-ui-data-grid-block]')).slice(0, 3)\n .map((element, index) => ({element, key: `block-${index + 1}`}));\n if (!viewport || !table || !body || !spacer || !styleElement || blocks.length !== 3) {\n throw new Error('Data Grid requires one viewport, table owner, body, spacer, layout style, and three row blocks.');\n }\n viewport.setAttribute('data-ui-data-grid-viewport', '');\n columns = declaredColumns();\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n reconcileColumnStructure();\n syncColumnGeometry();\n registerResizeHandles();\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n if (headerRow) {\n if (typeof ResizeObserver !== 'undefined') {\n headerSizeObserver = new ResizeObserver((entries) => {\n const entry = entries.find(({target}) => target === headerRow);\n if (!entry) return;\n observedHeaderWidth = entry.borderBoxSize[0]?.inlineSize ?? entry.contentRect.width;\n bodyWidthTask.schedule();\n });\n headerSizeObserver.observe(headerRow, {box: 'border-box'});\n }\n columnObserver = new MutationObserver(scheduleDeclarativeState);\n columnObserver.observe(headerRow, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\n 'data-column', 'data-label', 'data-width', 'data-min-width', 'data-max-width', 'data-hidden',\n 'data-pinned', 'data-sortable', 'data-sort', 'data-resizable', 'data-reorderable', 'data-align',\n 'data-cell-class', 'hidden',\n ],\n });\n }\n unregisterColumnInvalidation = registerDomInvalidationOwner(root, {invalidateDom: scheduleDeclarativeState});\n listenerAborter = new AbortController();\n viewport.addEventListener('scroll', () => scrollToTask.schedule(), {passive: true, signal: listenerAborter.signal});\n root.addEventListener('click', (event) => {\n const target = event.target as HTMLElement;\n const sortButton = target.closest<HTMLElement>('[data-ui-data-grid-sort-button]');\n if (sortButton && this.props.sortableColumns) {\n const header = sortButton.closest<HTMLElement>('[data-ui-data-grid-column-header]');\n const column = columns.find(({key}) => key === header?.dataset.column);\n if (column?.sortable) {\n const direction = column.sort === 'ascending' ? 'descending' : 'ascending';\n dispatch('ui:data-grid-sort', {column: column.key, direction, additive: event.shiftKey});\n }\n return;\n }\n const row = target.closest<HTMLElement>('[data-ui-data-grid-row]');\n if (!row || !root?.contains(row)) return;\n const key = row.dataset.rowKey ?? '';\n if (this.props.selectOnRowClick && !target.closest(interactiveSelector)) changeRow(key);\n dispatch('ui:data-grid-row-activate', {rowKey: key, row});\n }, {signal: listenerAborter.signal});\n root.addEventListener('dblclick', (event) => {\n const cell = (event.target as HTMLElement).closest<HTMLElement>('[data-ui-data-grid-cell]');\n const row = cell?.closest<HTMLElement>('[data-ui-data-grid-row]');\n if (cell && row) dispatch('ui:data-grid-cell-activate', {\n rowKey: row.dataset.rowKey ?? '', column: cell.dataset.column ?? '', cell,\n });\n }, {signal: listenerAborter.signal});\n root.addEventListener('ui:sortable-drop', ((event: CustomEvent) => {\n const source = event.detail?.source;\n if (source?.type !== 'data-grid-column') return;\n const to = Number(event.detail?.index ?? event.detail?.anchor?.index);\n if (Number.isInteger(to)) this.reorderColumn(String(source.id), to);\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-total-change', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n updateTotal(Number(event.detail?.totalItems ?? 0));\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-load-start', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n dispatch('ui:data-grid-load-start', {mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-load', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n reconcileColumnStructure();\n reflectMountedSelection();\n dispatch('ui:data-grid-load', {...event.detail, mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-error', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n dispatch('ui:data-grid-error', {...event.detail, mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n viewport.style.overscrollBehavior = 'contain';\n viewport.style.overflowAnchor = 'none';\n syncState();\n if (this.props.cursor) this.useCursor(serverCursorOptions(() => {\n if (!root) throw new Error('Data Grid is not mounted.');\n return root;\n }));\n else {\n scrollTarget = {index: this.props.initialIndex, align: 'start', offset: 0};\n scrollToTask.schedule();\n }\n },\n destroy(): void {\n destroyed = true;\n listenerAborter?.abort();\n listenerAborter = null;\n columnObserver?.disconnect();\n columnObserver = null;\n headerSizeObserver?.disconnect();\n headerSizeObserver = null;\n bodyWidthTask.cancel();\n scrollToTask.cancel();\n scrollTarget = null;\n unregisterColumnInvalidation?.();\n unregisterColumnInvalidation = null;\n resizeCleanup = null;\n cursorDelegate?.destroy();\n cursorDelegate = null;\n invalidate();\n this.props.disconnect();\n root = null;\n viewport = null;\n table = null;\n body = null;\n spacer = null;\n styleElement = null;\n columns = [];\n previousColumnSnapshots = [];\n blocks = [];\n },\n scrollToIndex(index, align = 'start'): void {\n if (cursorDelegate) {\n cursorDelegate.scrollToIndex(index, align);\n return;\n }\n if (!viewport) return;\n scrollTarget = {index, align, offset: null};\n scrollToTask.schedule();\n },\n setTotalRows(count): void {\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'totalRows', value: integer(count)});\n },\n setQuery(query): void {\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'query', value: query});\n },\n useCursor(options): void {\n if (!root || !viewport || !spacer) return;\n cursorDelegate?.destroy();\n cursorDelegate = null;\n invalidate();\n root.dataset.totalItems = String(totalRows);\n root.dataset.itemSize = String(this.props.rowHeight);\n spacer.setAttribute('data-ui-virtualizer-spacer', '');\n blocks.forEach(({element}) => element.setAttribute('data-ui-virtualizer-block', ''));\n cursorOptionQuery = options.query;\n const initialQuery = root.hasAttribute('data-query') ? this.props.query : cursorOptionQuery;\n appliedCursorQuery = cloneSerializable(initialQuery);\n const delegate = UiVirtualizer<unknown, unknown>(AlpineInstance, {\n cursor: {...options, query: initialQuery} as unknown as CursorVirtualizerOptions<unknown, unknown>,\n }) as CursorDelegate;\n cursorDelegate = delegate;\n Object.assign(delegate, {$el: root});\n delegate.init();\n },\n setUrl(url, options = {}): void {\n suppressPropChange = true;\n this.props.fetchUrl = String(url);\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'fetchUrl', value: String(url)});\n suppressPropChange = false;\n if (options.reset ?? true) this.reset();\n else this.reload();\n },\n reset(options = {}): void {\n if (cursorDelegate) {\n cursorDelegate.reset({scrollTop: options.scrollTop ?? 0});\n return;\n }\n this.reload({scrollTop: options.scrollTop ?? 0});\n },\n reload(options = {}): void {\n if (cursorDelegate) {\n cursorDelegate.reload(options);\n return;\n }\n invalidate();\n scrollTarget = options.scrollTop === undefined ? null : {offset: Math.max(0, options.scrollTop)};\n scrollToTask.schedule();\n },\n resizeColumn(key, width): void {\n const column = columns.find((candidate) => candidate.key === key);\n if (column) updateColumnWidth(column, Number(width), 'end');\n },\n reorderColumn(key, toIndex): void {\n const from = columns.findIndex((column) => column.key === key);\n const next = reorderColumns(columns, key, integer(toIndex));\n if (!next) return;\n columns = next;\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n const headerRow = root?.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n const indicator = headerRow?.querySelector<HTMLElement>('[data-ui-data-grid-column-indicator]') ?? null;\n columns.forEach((column) => headerRow?.insertBefore(column.element, indicator));\n reconcileColumnStructure();\n syncColumnGeometry();\n dispatch('ui:data-grid-column-reorder', {column: key, from, to: integer(toIndex), columns: columns.map(({key: columnKey}) => columnKey)});\n },\n selectRow(key): void { changeRow(String(key), true); },\n deselectRow(key): void { changeRow(String(key), false); },\n toggleRow(key): void { changeRow(String(key)); },\n setSelection(value): void { setSelection(value); },\n selectQuery(token, total, except = []): void {\n setSelection({mode: 'query', token: String(token), total: integer(total), except: except.map(String)});\n },\n clearSelection(): void { setSelection({mode: 'ids', ids: []}); },\n };\n return component;\n};\n\nconst registerDataGrid = (AlpineInstance: Alpine.Alpine): void => {\n defineAlpineData('UiDataGrid', () => UiDataGrid(AlpineInstance))(AlpineInstance);\n};\n\nexport {registerDataGrid, UiDataGrid};\nexport type {DataGridData, DataGridResetOptions, DataGridSetUrlOptions, UiDataGridApi};\n","// Generated by scripts/generate_component_entries.mjs from packages/client/component-entries.json.\n// Do not edit by hand.\nimport type {Alpine as AlpineType} from 'alpinejs';\nimport {registerResizableCapability} from '../../capabilities/resizable';\nimport {registerSortableCapability} from '../../capabilities/sortable';\nimport {registerDataGrid as registerComponent} from './index';\n\nconst registered = new WeakSet<AlpineType>();\n\nconst registerDataGrid = (AlpineInstance: AlpineType): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n registerResizableCapability(AlpineInstance);\n registerSortableCapability(AlpineInstance);\n registerComponent(AlpineInstance);\n};\n\nexport {registerDataGrid};\nexport default registerDataGrid;\nexport * from './index';\n"],"mappings":"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"}
1
+ {"version":3,"file":"data-grid-Cr9kEoo9.js","names":[],"sources":["../../../../../../../../client/src/components/data-grid/contract.ts","../../../../../../../../client/src/components/data-grid/model.ts","../../../../../../../../client/src/components/data-grid/index.ts","../../../../../../../../client/src/components/data-grid/entry.generated.ts"],"sourcesContent":["import {layoutBleed} from '../layout';\nimport {bool, json, number, oneOf, string, type SchemaToProps} from '../../runtime';\nimport {INTERACTION_TREATMENTS, SELECTION_COLORS} from '../common';\n\nconst DATA_GRID_SELECTIONS = ['none', 'single', 'multiple'] as const;\nconst DATA_GRID_DENSITIES = ['compact', 'default', 'comfortable'] as const;\nconst DATA_GRID_BORDERS = ['none', 'row', 'grid'] as const;\nconst DATA_GRID_RESIZE_MODES = ['onChange', 'onEnd'] as const;\nconst DATA_GRID_PINS = ['', 'left', 'right'] as const;\nconst DATA_GRID_SORTS = ['none', 'ascending', 'descending', 'other'] as const;\nconst DATA_GRID_ALIGNS = ['start', 'center', 'end'] as const;\n\ntype DataGridSelectionValue =\n | {mode: 'ids'; ids: string[]}\n | {mode: 'query'; token: string; total: number; except: string[]};\n\nconst dataGridSchema = {\n ...layoutBleed.schema,\n fetchUrl: string,\n cursor: bool,\n query: json<unknown>(null),\n totalRows: number.min(0).default(0),\n rowHeight: number.min(Number.EPSILON).default(36),\n bufferSize: number.min(1).default(50),\n overscan: number.min(0).default(0),\n initialIndex: number.min(0).default(0),\n startParam: string.default('start'),\n countParam: string.default('count'),\n totalParam: string.default('total'),\n totalHeader: string.default('X-Trellis-Total-Items'),\n assetsHeader: string.default('X-Trellis-Assets'),\n metaSelector: string.default('template[data-ui-virtualizer-meta]'),\n selection: oneOf(DATA_GRID_SELECTIONS, 'none'),\n selectionValue: json<DataGridSelectionValue>({mode: 'ids', ids: []}),\n selectOnRowClick: bool,\n rowKey: string.default('id'),\n stickyHeader: bool.default(true),\n resizableColumns: bool.default(true),\n reorderableColumns: bool.default(true),\n sortableColumns: bool.default(true),\n minColumnWidth: number.min(0).default(60),\n defaultColumnWidth: number.min(Number.EPSILON).default(180),\n maxColumnWidth: json<number | null>(null),\n resizeMode: oneOf(DATA_GRID_RESIZE_MODES, 'onChange'),\n color: oneOf(SELECTION_COLORS, 'neutral'),\n interaction: oneOf(INTERACTION_TREATMENTS, 'edge'),\n dragPreviewPosition: string.trim.default('preserve'),\n density: oneOf(DATA_GRID_DENSITIES, 'default'),\n border: oneOf(DATA_GRID_BORDERS, 'row'),\n empty: string.default('No rows found.'),\n class: string,\n controlsClass: string,\n viewportClass: string,\n headerClass: string,\n rowClass: string,\n cellClass: string,\n footerClass: string,\n emptyClass: string,\n};\n\nconst dataGridColumnSchema = {\n key: string,\n label: string,\n width: number.min(Number.EPSILON).default(180),\n minWidth: number.min(0).default(60),\n maxWidth: json<number | null>(null),\n hidden: bool,\n pinned: oneOf(DATA_GRID_PINS, ''),\n sortable: bool,\n sort: oneOf(DATA_GRID_SORTS, 'none'),\n resizable: bool.default(true),\n reorderable: bool.default(true),\n align: oneOf(DATA_GRID_ALIGNS, 'start'),\n class: string,\n headerClass: string,\n labelClass: string,\n resizeHandleClass: string,\n};\n\nconst dataGridRowsSchema = {\n rows: json<unknown[]>([]),\n columns: json<Array<Record<string, unknown>>>([]),\n startIndex: number.min(0).default(0),\n rowKey: string.default('id'),\n rowComponent: string.default('ui.data-grid.row'),\n cellComponent: string.default('ui.data-grid.cell'),\n class: string,\n};\nconst dataGridRowSchema = {key: string, index: number.min(0).default(0), class: string};\nconst dataGridCellSchema = {column: string, index: number.min(1).default(1), align: oneOf(DATA_GRID_ALIGNS, 'start'), class: string};\nconst dataGridEmptySchema = {class: string};\n\ntype DataGridProps = SchemaToProps<typeof dataGridSchema>;\ntype DataGridColumnProps = SchemaToProps<typeof dataGridColumnSchema>;\ntype DataGridRowsProps = SchemaToProps<typeof dataGridRowsSchema>;\ntype DataGridSelection = typeof DATA_GRID_SELECTIONS[number];\ntype DataGridPin = Exclude<typeof DATA_GRID_PINS[number], ''> | null;\ntype DataGridSort = typeof DATA_GRID_SORTS[number];\ntype DataGridAlign = typeof DATA_GRID_ALIGNS[number];\n\nexport {\n DATA_GRID_ALIGNS,\n DATA_GRID_BORDERS,\n DATA_GRID_DENSITIES,\n DATA_GRID_PINS,\n DATA_GRID_RESIZE_MODES,\n DATA_GRID_SELECTIONS,\n DATA_GRID_SORTS,\n dataGridCellSchema,\n dataGridColumnSchema,\n dataGridEmptySchema,\n dataGridRowSchema,\n dataGridRowsSchema,\n dataGridSchema,\n};\nexport type {\n DataGridAlign,\n DataGridColumnProps,\n DataGridPin,\n DataGridProps,\n DataGridRowsProps,\n DataGridSelection,\n DataGridSelectionValue,\n DataGridSort,\n};\n","import type {DataGridAlign, DataGridPin, DataGridSelection, DataGridSelectionValue, DataGridSort} from './contract';\n\ntype DataGridColumn = {\n key: string;\n label: string;\n width: number;\n minWidth: number;\n maxWidth: number | null;\n hidden: boolean;\n pinned: DataGridPin;\n sortable: boolean;\n sort: DataGridSort;\n resizable: boolean;\n reorderable: boolean;\n align: DataGridAlign;\n cellClass: string;\n element: HTMLElement;\n};\n\ntype DataGridColumnDefaults = {\n width: number;\n minWidth: number;\n maxWidth: number | null;\n resizable: boolean;\n reorderable: boolean;\n};\n\ntype DataGridColumnSnapshot = Omit<DataGridColumn, 'element'>;\n\ntype DataGridPinnedOffsets = {left: Map<string, number>; right: Map<string, number>};\ntype SelectionChange = {selection: DataGridSelectionValue; added: string[]; removed: string[]};\n\nconst numberAttribute = (element: HTMLElement, name: string, fallback: number): number => {\n const raw = element.getAttribute(name);\n if (raw === null || raw.trim() === '') return fallback;\n const value = Number(raw);\n return Number.isFinite(value) ? value : fallback;\n};\n\nconst optionalNumberAttribute = (element: HTMLElement, name: string, fallback: number | null): number | null => {\n const raw = element.getAttribute(name);\n if (raw === null || raw.trim() === '') return fallback;\n const value = Number(raw);\n return Number.isFinite(value) && value > 0 ? value : null;\n};\n\nconst boolAttribute = (element: HTMLElement, name: string, fallback: boolean): boolean => {\n if (!element.hasAttribute(name)) return fallback;\n const raw = element.getAttribute(name) ?? '';\n return raw === '' || ['true', '1', 'yes', 'on'].includes(raw.toLowerCase());\n};\n\nconst normalizeDataGridColumns = (\n elements: readonly HTMLElement[],\n defaults: DataGridColumnDefaults,\n): DataGridColumn[] => {\n const seen = new Set<string>();\n return elements.flatMap((element) => {\n const key = (element.dataset.column ?? '').trim();\n if (!key) throw new Error('Data Grid columns require a non-empty key.');\n if (element.hasAttribute('data-hidden')) return [];\n if (seen.has(key)) throw new Error(`Data Grid column key \"${key}\" is duplicated.`);\n seen.add(key);\n const minWidth = Math.max(0, numberAttribute(element, 'data-min-width', defaults.minWidth));\n const maxWidth = optionalNumberAttribute(element, 'data-max-width', defaults.maxWidth);\n const unclamped = numberAttribute(element, 'data-width', defaults.width);\n const width = Math.min(maxWidth ?? Number.POSITIVE_INFINITY, Math.max(minWidth, unclamped));\n const pinned = element.dataset.pinned === 'left' || element.dataset.pinned === 'right'\n ? element.dataset.pinned\n : null;\n const sort = ['ascending', 'descending', 'other'].includes(element.dataset.sort ?? '')\n ? element.dataset.sort as DataGridSort\n : 'none';\n const align = ['center', 'end'].includes(element.dataset.align ?? '')\n ? element.dataset.align as DataGridAlign\n : 'start';\n return [{\n key,\n label: element.dataset.label ?? element.textContent?.trim() ?? key,\n width,\n minWidth,\n maxWidth,\n hidden: false,\n pinned,\n sortable: boolAttribute(element, 'data-sortable', false),\n sort,\n resizable: boolAttribute(element, 'data-resizable', defaults.resizable),\n reorderable: boolAttribute(element, 'data-reorderable', defaults.reorderable),\n align,\n cellClass: element.dataset.cellClass ?? '',\n element,\n }];\n });\n};\n\nconst columnTemplate = (columns: readonly DataGridColumn[]): string => (\n columns.map(({width}) => `${width}px`).join(' ')\n);\n\nconst dataGridColumnSnapshots = (columns: readonly DataGridColumn[]): DataGridColumnSnapshot[] => (\n columns.map(({element: _element, ...column}) => column)\n);\n\nconst pinnedOffsets = (columns: readonly DataGridColumn[]): DataGridPinnedOffsets => {\n const left = new Map<string, number>();\n const right = new Map<string, number>();\n let offset = 0;\n columns.forEach((column) => {\n if (column.pinned !== 'left') return;\n left.set(column.key, offset);\n offset += column.width;\n });\n offset = 0;\n [...columns].reverse().forEach((column) => {\n if (column.pinned !== 'right') return;\n right.set(column.key, offset);\n offset += column.width;\n });\n return {left, right};\n};\n\nconst cssEscape = (value: string): string => (\n globalThis.CSS?.escape ? globalThis.CSS.escape(value) : value.replace(/[^a-zA-Z0-9_-]/g, (character) => `\\\\${character}`)\n);\n\nconst dataGridLayoutCss = (scope: string, columns: readonly DataGridColumn[]): string => {\n const offsets = pinnedOffsets(columns);\n const pinnedPlane = 'z-index:2;background-color:var(--ui-surface-color);';\n return columns.map((column, index) => {\n const owner = `[data-ui-data-grid-scope=\"${cssEscape(scope)}\"]`;\n const columnSelector = `[data-column=\"${cssEscape(column.key)}\"]`;\n const selector = `${owner} [data-ui-data-grid-column-header]${columnSelector},${owner} [data-ui-data-grid-cell]${columnSelector}`;\n const pin = column.pinned === 'left'\n ? `position:sticky;left:${offsets.left.get(column.key) ?? 0}px;${pinnedPlane}`\n : column.pinned === 'right'\n ? `position:sticky;right:${offsets.right.get(column.key) ?? 0}px;${pinnedPlane}`\n : '';\n return `${selector}{grid-column:${index + 1};${pin}}`;\n }).join('');\n};\n\nconst normalizeSelection = (value: unknown, mode: DataGridSelection): DataGridSelectionValue => {\n if (mode === 'multiple' && typeof value === 'object' && value !== null && (value as {mode?: unknown}).mode === 'query') {\n const query = value as Partial<Extract<DataGridSelectionValue, {mode: 'query'}>>;\n if (typeof query.token === 'string' && Number.isFinite(query.total)) return {\n mode: 'query',\n token: query.token,\n total: Math.max(0, Math.floor(query.total ?? 0)),\n except: [...new Set(Array.isArray(query.except) ? query.except.filter((key): key is string => typeof key === 'string') : [])],\n };\n }\n const ids = typeof value === 'object' && value !== null && (value as {mode?: unknown}).mode === 'ids'\n && Array.isArray((value as {ids?: unknown}).ids)\n ? (value as {ids: unknown[]}).ids.filter((key): key is string => typeof key === 'string')\n : [];\n const unique = [...new Set(ids)];\n return {mode: 'ids', ids: mode === 'single' ? unique.slice(0, 1) : mode === 'none' ? [] : unique};\n};\n\nconst isRowSelected = (selection: DataGridSelectionValue, key: string): boolean => (\n selection.mode === 'query' ? !selection.except.includes(key) : selection.ids.includes(key)\n);\n\nconst toggleSelection = (\n current: DataGridSelectionValue,\n key: string,\n mode: DataGridSelection,\n selected?: boolean,\n): SelectionChange => {\n const normalized = normalizeSelection(current, mode);\n if (mode === 'none') return {selection: normalized, added: [], removed: []};\n const wasSelected = isRowSelected(normalized, key);\n const nextSelected = selected ?? !wasSelected;\n if (wasSelected === nextSelected) return {selection: normalized, added: [], removed: []};\n if (normalized.mode === 'query') {\n const except = nextSelected\n ? normalized.except.filter((value) => value !== key)\n : [...normalized.except, key];\n return {selection: {...normalized, except}, added: nextSelected ? [key] : [], removed: nextSelected ? [] : [key]};\n }\n const ids = mode === 'single' && nextSelected\n ? [key]\n : nextSelected\n ? [...normalized.ids, key]\n : normalized.ids.filter((value) => value !== key);\n return {selection: {mode: 'ids', ids}, added: nextSelected ? [key] : [], removed: nextSelected ? [] : [key]};\n};\n\nconst reorderColumns = (columns: readonly DataGridColumn[], key: string, toIndex: number): DataGridColumn[] | null => {\n const from = columns.findIndex((column) => column.key === key);\n if (from < 0 || !columns[from]?.reorderable) return null;\n const region = columns[from]?.pinned ?? null;\n const regionIndexes = columns.flatMap((column, index) => column.pinned === region ? [index] : []);\n if (!regionIndexes.includes(toIndex)) return null;\n const next = [...columns];\n const [column] = next.splice(from, 1);\n if (!column) return null;\n next.splice(toIndex, 0, column);\n return next;\n};\n\nexport {\n columnTemplate,\n dataGridColumnSnapshots,\n dataGridLayoutCss,\n isRowSelected,\n normalizeDataGridColumns,\n normalizeSelection,\n pinnedOffsets,\n reorderColumns,\n toggleSelection,\n};\nexport type {DataGridColumn, DataGridColumnDefaults, DataGridColumnSnapshot, DataGridPinnedOffsets, SelectionChange};\n","import {createLayoutTask} from '@client/runtime/layout-task';\nimport type Alpine from 'alpinejs';\n\nimport {\n createResizable,\n createVirtualWindowController,\n defineAlpineData,\n defineProps,\n fixedAxisWindowAdapter,\n parseVirtualizerFragmentResponse,\n registerDomInvalidationOwner,\n reflectSchemaProp,\n replaceFragmentChildren,\n type FixedAxisWindow,\n type PropState,\n type ResizeEvent,\n type TrellisAlpineComponent,\n type VirtualScrollAlign,\n type VirtualWindowRequest,\n} from '@client/runtime';\nimport {cleanupManagerFor} from '@client/runtime/alpine-data';\nimport {CleanupManager} from '@client/runtime/cleanup-manager';\nimport {\n UiVirtualizer,\n type CursorVirtualizerOptions,\n type UiVirtualizerApi,\n type VirtualizerData,\n} from '../../runtime/virtualizer';\nimport {serverCursorOptions} from '../../runtime/cursor-data-source';\nimport {cloneSerializable, isSerializableEqual} from '../../utils';\nimport {dataGridSchema, type DataGridSelectionValue} from './contract';\nimport {\n columnTemplate,\n dataGridColumnSnapshots,\n dataGridLayoutCss,\n isRowSelected,\n normalizeDataGridColumns,\n normalizeSelection,\n reorderColumns,\n toggleSelection,\n type DataGridColumn,\n type DataGridColumnSnapshot,\n} from './model';\n\n/** Options for resetting an indexed or cursor-backed Data Grid. @public */\ninterface DataGridResetOptions {\n /** Scroll offset restored after the first page loads. */\n scrollTop?: number;\n}\n\n/** Options for replacing an indexed Data Grid endpoint. @public */\ninterface DataGridSetUrlOptions {\n /** Whether to discard loaded rows and reload immediately. */\n reset?: boolean;\n}\n\n/** Public Alpine API for `ui.data-grid`. @public */\ninterface UiDataGridApi {\n /** Whether the active cursor data source supports server-side index seeking. */\n readonly supportsSeek: boolean;\n /** Discard loaded rows and request the current indexed range or first cursor page again. */\n reload(options?: DataGridResetOptions): void;\n /** Return the grid to its initial indexed range or first cursor page. */\n reset(options?: DataGridResetOptions): void;\n /** Scroll to a row and seek through the server when its cursor page is not loaded. */\n scrollToIndex(index: number, align?: VirtualScrollAlign): void;\n /** Replace the indexed endpoint, optionally resetting loaded rows. */\n setUrl(url: string, options?: DataGridSetUrlOptions): void;\n /** Reflect the authoritative total-row attribute without requesting or replacing rows. */\n setTotalRows(count: number): void;\n /** Reflect the authoritative query attribute; meaningful cursor-query changes reset to the first page. */\n setQuery<Query>(query: Query): void;\n /** Activate cursor mode; a rendered query attribute takes precedence over the option query. */\n useCursor<Query, Content>(options: CursorVirtualizerOptions<Query, Content>): void;\n /** Resize a column to a pixel width. */\n resizeColumn(key: string, width: number): void;\n /** Move a column to a new zero-based position. */\n reorderColumn(key: string, toIndex: number): void;\n /** Add a row key to the explicit selection. */\n selectRow(key: string): void;\n /** Remove a row key from the explicit selection. */\n deselectRow(key: string): void;\n /** Toggle a row key in the current selection. */\n toggleRow(key: string): void;\n /** Replace the complete row selection value. */\n setSelection(value: DataGridSelectionValue): void;\n /** Select all rows represented by a server-owned query token. */\n selectQuery(token: string, total: number, except?: string[]): void;\n /** Clear explicit and query-backed row selection. */\n clearSelection(): void;\n}\n\ntype DataGridData = UiDataGridApi & {\n props: PropState<typeof dataGridSchema>;\n init(): void;\n destroy(): void;\n};\n\ntype BlockRecord = {key: string; element: HTMLElement};\ntype CursorDelegate = TrellisAlpineComponent<VirtualizerData<unknown>> & UiVirtualizerApi<unknown>;\n\nconst integer = (value: number, minimum = 0): number => (\n Math.max(minimum, Math.floor(Number.isFinite(value) ? value : minimum))\n);\n\nconst interactiveSelector = 'a,button,input,select,textarea,[contenteditable],[role=\"button\"],[role=\"link\"]';\n\nconst UiDataGrid = (AlpineInstance: Alpine.Alpine): TrellisAlpineComponent<DataGridData> => {\n let root: HTMLElement | null = null;\n let viewport: HTMLElement | null = null;\n let table: HTMLElement | null = null;\n let body: HTMLElement | null = null;\n let spacer: HTMLElement | null = null;\n let styleElement: HTMLStyleElement | null = null;\n let columns: DataGridColumn[] = [];\n let blocks: BlockRecord[] = [];\n let totalRows = 0;\n let selection: DataGridSelectionValue = {mode: 'ids', ids: []};\n let currentWindowKey = '';\n let latestScrollTop: number | null = null;\n let destroyed = false;\n let listenerAborter: AbortController | null = null;\n let suppressPropChange = false;\n let cursorDelegate: CursorDelegate | null = null;\n let cursorOptionQuery: unknown = null;\n let appliedCursorQuery: unknown = null;\n let previousColumnSnapshots: DataGridColumnSnapshot[] = [];\n let columnObserver: MutationObserver | null = null;\n let headerSizeObserver: ResizeObserver | null = null;\n let observedHeaderWidth: number | null = null;\n let unregisterColumnInvalidation: (() => void) | null = null;\n let declarativeFlushQueued = false;\n let forceColumnRefresh = false;\n let cleanup: CleanupManager;\n let resizeCleanup: CleanupManager | null = null;\n const requestAborters = new Map<string, AbortController>();\n const appliedRowClasses = new WeakMap<HTMLElement, string[]>();\n const appliedCellClasses = new WeakMap<HTMLElement, string[]>();\n const controller = createVirtualWindowController(fixedAxisWindowAdapter);\n\n const dispatch = (name: string, detail: Record<string, unknown>): void => {\n root?.dispatchEvent(new CustomEvent(name, {bubbles: true, composed: true, detail}));\n };\n const syncOwnedClasses = (element: HTMLElement, value: string, owned: WeakMap<HTMLElement, string[]>): void => {\n const previous = owned.get(element) ?? [];\n if (previous.length) element.classList.remove(...previous);\n const names = [...new Set(value.split(/\\s+/).filter(Boolean))];\n if (names.length) element.classList.add(...names);\n owned.set(element, names);\n };\n const columnDefaults = () => ({\n width: component.props.defaultColumnWidth,\n minWidth: component.props.minColumnWidth,\n maxWidth: component.props.maxColumnWidth,\n resizable: component.props.resizableColumns,\n reorderable: component.props.reorderableColumns,\n });\n const declaredColumns = (): DataGridColumn[] => normalizeDataGridColumns(\n Array.from(root?.querySelectorAll<HTMLElement>('[data-ui-data-grid-column-header]') ?? []),\n columnDefaults(),\n );\n const rows = (): HTMLElement[] => Array.from(root?.querySelectorAll<HTMLElement>('[data-ui-data-grid-row]') ?? []);\n const bodyWidthTask = createLayoutTask({\n measure: () => observedHeaderWidth ?? root?.querySelector<HTMLElement>('[data-ui-data-grid-header-row]')?.getBoundingClientRect().width ?? null,\n apply: (width) => {\n if (!body || width === null) return;\n const value = `${width}px`;\n if (body.style.width !== value) body.style.width = value;\n },\n });\n let scrollTarget: {index: number; align: VirtualScrollAlign; offset: number | null} | {offset: number} | null = null;\n const scrollToTask = createLayoutTask({\n measure: () => viewport && !cursorDelegate ? {\n target: scrollTarget,\n height: scrollTarget && 'index' in scrollTarget ? viewport.clientHeight : 0,\n offset: scrollTarget?.offset ?? viewport.scrollTop,\n } : null,\n apply: (measurement) => {\n if (!viewport || !measurement || cursorDelegate) return;\n scrollTarget = null;\n const next = measurement.target && 'index' in measurement.target ? fixedAxisWindowAdapter.scrollTo({\n total: totalRows, itemSize: component.props.rowHeight, viewportSize: measurement.height,\n scrollOffset: measurement.offset, buffer: component.props.bufferSize,\n }, {axis: 'y', index: measurement.target.index, align: measurement.target.align}) : Math.max(0, measurement.offset);\n if (measurement.target) viewport.scrollTop = next;\n reconcile(next);\n },\n });\n const reflectMountedSelection = (): void => {\n rows().forEach((row) => {\n const key = row.dataset.rowKey ?? '';\n const selected = component.props.selection !== 'none' && key !== '' && isRowSelected(selection, key);\n row.toggleAttribute('data-selected', selected);\n if (component.props.selection === 'none') row.removeAttribute('aria-selected');\n else row.setAttribute('aria-selected', String(selected));\n });\n };\n const syncColumnGeometry = (): void => {\n if (!root || !styleElement) return;\n root.style.setProperty('--ui-data-grid-template', columnTemplate(columns));\n const scope = root.dataset.uiDataGridScope ?? '';\n styleElement.textContent = dataGridLayoutCss(scope, columns);\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n if (headerRow) { observedHeaderWidth = null; bodyWidthTask.schedule(); }\n };\n const reconcileColumnStructure = (): void => {\n if (!root) return;\n const columnsByKey = new Map(columns.map((column, index) => [column.key, {column, index}]));\n table?.setAttribute('aria-colcount', String(columns.length));\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n const indicator = headerRow?.querySelector<HTMLElement>('[data-ui-data-grid-column-indicator]');\n if (indicator) headerRow?.append(indicator);\n const mountedRows = rows();\n mountedRows.forEach((row) => {\n const cells = Array.from(row.children).filter((element): element is HTMLElement => (\n element instanceof HTMLElement && element.hasAttribute('data-ui-data-grid-cell')\n ));\n const cellsByKey = new Map(cells.flatMap((element) => (\n element instanceof HTMLElement && element.hasAttribute('data-ui-data-grid-cell')\n ? [[element.dataset.column ?? '', element] as const]\n : []\n )));\n columns.forEach(({key}) => {\n const cell = cellsByKey.get(key);\n if (!cell) return;\n cell.hidden = false;\n row.append(cell);\n });\n cells.forEach((cell) => {\n if (columnsByKey.has(cell.dataset.column ?? '')) return;\n cell.hidden = true;\n cell.removeAttribute('aria-colindex');\n cell.removeAttribute('data-pinned');\n row.append(cell);\n });\n });\n columns.forEach((column, index) => {\n column.element.setAttribute('aria-colindex', String(index + 1));\n if (column.pinned) column.element.dataset.pinned = column.pinned;\n else column.element.removeAttribute('data-pinned');\n if (column.sortable) column.element.setAttribute('aria-sort', column.sort);\n else column.element.removeAttribute('aria-sort');\n column.element.dataset.disabled = String(!column.reorderable || !component.props.reorderableColumns);\n const ownedLabel = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-label-owned]');\n if (ownedLabel) ownedLabel.textContent = column.label;\n const previewLabel = column.element.querySelector<HTMLElement>('[data-ui-data-grid-column-preview-label]');\n if (previewLabel) previewLabel.textContent = column.label;\n const sortIndicator = column.element.querySelector<HTMLElement>('[data-ui-data-grid-sort-indicator]');\n if (sortIndicator) {\n sortIndicator.textContent = column.sort === 'ascending' ? '↑' : column.sort === 'descending' ? '↓' : '';\n }\n column.element.querySelector<HTMLElement>('[data-ui-data-grid-resize-handle]')\n ?.setAttribute('aria-label', `Resize ${column.label || column.key} column`);\n });\n mountedRows.forEach((row) => syncOwnedClasses(row, component.props.rowClass, appliedRowClasses));\n root.querySelectorAll<HTMLElement>('[data-ui-data-grid-cell]').forEach((cell) => {\n const entry = columnsByKey.get(cell.dataset.column ?? '');\n if (!entry) return;\n cell.setAttribute('aria-colindex', String(entry.index + 1));\n cell.dataset.align = entry.column.align;\n syncOwnedClasses(cell, `${component.props.cellClass} ${entry.column.cellClass}`, appliedCellClasses);\n if (entry.column.pinned) cell.dataset.pinned = entry.column.pinned;\n else cell.removeAttribute('data-pinned');\n });\n };\n const columnChangeDetail = (\n previous: readonly DataGridColumnSnapshot[],\n next: readonly DataGridColumnSnapshot[],\n ): Record<string, unknown> => {\n const previousByKey = new Map(previous.map((column) => [column.key, column]));\n const nextByKey = new Map(next.map((column) => [column.key, column]));\n const added = next.filter(({key}) => !previousByKey.has(key)).map(({key}) => key);\n const removed = previous.filter(({key}) => !nextByKey.has(key)).map(({key}) => key);\n const changed = next.flatMap((column) => {\n const before = previousByKey.get(column.key);\n if (!before) return [];\n const fields = Object.keys(column).filter((field) => (\n field !== 'key'\n && !isSerializableEqual(before[field as keyof DataGridColumnSnapshot], column[field as keyof DataGridColumnSnapshot])\n ));\n return fields.length ? [{key: column.key, fields}] : [];\n });\n return {previous, columns: next, added, removed, changed};\n };\n const flushDeclarativeState = (): void => {\n declarativeFlushQueued = false;\n if (!root || destroyed) return;\n\n const nextColumns = declaredColumns();\n const nextSnapshots = dataGridColumnSnapshots(nextColumns);\n const semanticColumnChange = !isSerializableEqual(previousColumnSnapshots, nextSnapshots);\n const elementChange = columns.length !== nextColumns.length\n || columns.some((column, index) => column.element !== nextColumns[index]?.element);\n const resizeBoundaryChange = elementChange || columns.some((column, index) => {\n const next = nextColumns[index];\n return !next\n || column.key !== next.key\n || column.resizable !== next.resizable\n || column.minWidth !== next.minWidth\n || column.maxWidth !== next.maxWidth;\n });\n if (semanticColumnChange || elementChange || forceColumnRefresh) {\n const previous = previousColumnSnapshots;\n columns = nextColumns;\n previousColumnSnapshots = nextSnapshots;\n const refreshResizeHandles = resizeBoundaryChange || forceColumnRefresh;\n forceColumnRefresh = false;\n reconcileColumnStructure();\n syncColumnGeometry();\n if (refreshResizeHandles) registerResizeHandles();\n if (semanticColumnChange) {\n dispatch('ui:data-grid-columns-change', columnChangeDetail(previous, nextSnapshots));\n }\n }\n\n if (component.props.totalRows !== totalRows) {\n updateTotal(component.props.totalRows);\n if (cursorDelegate) root.dataset.totalItems = String(totalRows);\n }\n\n if (cursorDelegate) {\n const nextQuery = root.hasAttribute('data-query') ? component.props.query : cursorOptionQuery;\n if (!isSerializableEqual(appliedCursorQuery, nextQuery)) {\n appliedCursorQuery = cloneSerializable(nextQuery);\n cursorDelegate.setQuery(nextQuery);\n }\n }\n };\n const scheduleDeclarativeState = (): void => {\n if (declarativeFlushQueued) return;\n declarativeFlushQueued = true;\n queueMicrotask(flushDeclarativeState);\n };\n const syncState = (): void => {\n if (!root || !spacer) return;\n if (!cursorDelegate) {\n root.toggleAttribute('data-loading', requestAborters.size > 0);\n root.toggleAttribute('data-empty', totalRows === 0);\n }\n root.dataset.selection = component.props.selection;\n table?.setAttribute('aria-rowcount', String(totalRows + 1));\n root.style.setProperty('--ui-data-grid-row-height', `${component.props.rowHeight}px`);\n root.style.setProperty('--ui-data-grid-total-height', `${Math.max(totalRows * component.props.rowHeight, component.props.rowHeight)}px`);\n if (!cursorDelegate || totalRows > 0) spacer.style.height = `var(--ui-data-grid-total-height)`;\n reflectMountedSelection();\n };\n const updateTotal = (next: number): void => {\n const normalized = integer(next);\n if (normalized === totalRows) return;\n totalRows = normalized;\n syncState();\n dispatch('ui:data-grid-total-change', {totalRows});\n };\n const blockWindow = (start: number): FixedAxisWindow => fixedAxisWindowAdapter.compute({axes: {y: {\n total: totalRows,\n itemSize: component.props.rowHeight,\n viewportSize: component.props.bufferSize * component.props.rowHeight,\n scrollOffset: start * component.props.rowHeight,\n buffer: 0,\n }}});\n const desiredWindows = (scrollTop: number): FixedAxisWindow[] => {\n if (totalRows === 0) return [];\n const size = integer(component.props.bufferSize, 1);\n const index = Math.min(totalRows - 1, Math.floor(Math.max(0, scrollTop) / component.props.rowHeight));\n const center = Math.floor(index / size) * size;\n const last = Math.floor((totalRows - 1) / size) * size;\n const starts = [center - size, center, center + size].map((start) => Math.min(last, Math.max(0, start)));\n if (center === 0 && last > size) starts.splice(0, 3, 0, size, Math.min(last, size * 2));\n else if (center === last && last > size) starts.splice(0, 3, Math.max(0, last - (size * 2)), last - size, last);\n return [...new Set(starts)].map(blockWindow);\n };\n const requestUrl = (window: FixedAxisWindow): string => {\n const axis = window.axes.y;\n if (!axis) throw new Error('Data Grid requires a vertical virtual window.');\n const url = new URL(component.props.fetchUrl, document.baseURI);\n url.searchParams.set(component.props.startParam, String(axis.start));\n url.searchParams.set(component.props.countParam, String(axis.count));\n url.searchParams.set(component.props.totalParam, String(axis.total));\n return /^[a-z][a-z\\d+.-]*:/i.test(component.props.fetchUrl) || component.props.fetchUrl.startsWith('//')\n ? url.href\n : `${url.pathname}${url.search}${url.hash}`;\n };\n const settle = (blockKey: string, aborter: AbortController): void => {\n if (requestAborters.get(blockKey) !== aborter) return;\n requestAborters.delete(blockKey);\n syncState();\n if (requestAborters.size > 0 || latestScrollTop === null || destroyed) return;\n const scrollTop = latestScrollTop;\n latestScrollTop = null;\n reconcile(scrollTop);\n };\n const load = async (\n block: BlockRecord,\n window: FixedAxisWindow,\n request: VirtualWindowRequest<FixedAxisWindow>,\n ): Promise<void> => {\n const axis = window.axes.y;\n if (!axis) return;\n const aborter = new AbortController();\n requestAborters.set(block.key, aborter);\n syncState();\n root?.removeAttribute('data-error');\n dispatch('ui:data-grid-load-start', {window});\n try {\n const requestId = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${request.requestGeneration}`;\n const response = await fetch(requestUrl(window), {method: 'GET', headers: {\n Accept: 'text/html',\n 'X-Trellis-Virtualizer': 'true',\n 'X-Trellis-Request-ID': requestId,\n }, signal: aborter.signal});\n if (!response.ok && response.status !== 204) {\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:data-grid-error', {window, status: response.status});\n return;\n }\n const payload = await parseVirtualizerFragmentResponse(response, component.props);\n if (controller.pending(block.key) !== request || destroyed) return;\n const replaced = await replaceFragmentChildren(AlpineInstance, block.element, payload.html, {\n assets: payload.assets,\n shouldReplace: () => controller.pending(block.key) === request && !destroyed,\n });\n if (!replaced) return;\n if (payload.totalItems !== null) updateTotal(payload.totalItems);\n if (!controller.commit(request, window)) return;\n block.element.style.height = `${axis.count * component.props.rowHeight}px`;\n block.element.style.transform = `translateY(${axis.translateOffset}px)`;\n reconcileColumnStructure();\n reflectMountedSelection();\n dispatch('ui:data-grid-load', {window, start: axis.start, count: axis.count, end: axis.start + axis.count});\n } catch (error) {\n if (aborter.signal.aborted) return;\n controller.fail(request);\n root?.setAttribute('data-error', '');\n dispatch('ui:data-grid-error', {window, status: 0, error});\n } finally {\n settle(block.key, aborter);\n }\n };\n const reconcile = (scrollTop: number): void => {\n if (cursorDelegate || component.props.cursor) return;\n if (requestAborters.size > 0) {\n latestScrollTop = scrollTop;\n return;\n }\n const desired = desiredWindows(scrollTop);\n const logicalIndex = Math.min(Math.max(0, totalRows - 1), Math.floor(Math.max(0, scrollTop) / component.props.rowHeight));\n const center = desired.find((window) => {\n const axis = window.axes.y;\n return axis && logicalIndex >= axis.start && logicalIndex < axis.start + axis.count;\n }) ?? desired[0];\n if (center && currentWindowKey !== center.key) {\n currentWindowKey = center.key;\n const axis = center.axes.y!;\n dispatch('ui:data-grid-range', {start: axis.start, count: axis.count, end: axis.start + axis.count, window: center});\n }\n if (desired.length === 0) {\n blocks.forEach((block) => void replaceFragmentChildren(AlpineInstance, block.element, ''));\n return;\n }\n const preserved = new Set<BlockRecord>();\n desired.forEach((window) => {\n const existing = blocks.find((block) => controller.mounted(block.key)?.key === window.key);\n if (existing) preserved.add(existing);\n });\n const available = blocks.filter((block) => !preserved.has(block));\n desired.forEach((window) => {\n if (blocks.some((block) => controller.mounted(block.key)?.key === window.key)) return;\n const block = available.shift();\n if (!block) return;\n const request = controller.begin(block.key, window);\n if (request) void load(block, window, request);\n });\n };\n const invalidate = (): void => {\n requestAborters.forEach((aborter) => aborter.abort());\n requestAborters.clear();\n latestScrollTop = null;\n currentWindowKey = '';\n controller.invalidate();\n blocks.forEach((block) => {\n block.element.style.height = '';\n block.element.style.transform = '';\n void replaceFragmentChildren(AlpineInstance, block.element, '');\n });\n syncState();\n };\n const setSelection = (value: DataGridSelectionValue, detail?: {added: string[]; removed: string[]}): void => {\n selection = normalizeSelection(value, component.props.selection);\n suppressPropChange = true;\n component.props.selectionValue = selection;\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'selectionValue', value: selection});\n suppressPropChange = false;\n reflectMountedSelection();\n dispatch('ui:data-grid-selection-change', {selection, added: detail?.added ?? [], removed: detail?.removed ?? []});\n };\n const changeRow = (key: string, selected?: boolean): void => {\n const change = toggleSelection(selection, String(key), component.props.selection, selected);\n if (change.added.length === 0 && change.removed.length === 0) return;\n setSelection(change.selection, change);\n };\n const updateColumnWidth = (column: DataGridColumn, width: number, phase: ResizeEvent['phase']): void => {\n column.width = Math.min(column.maxWidth ?? Number.POSITIVE_INFINITY, Math.max(column.minWidth, width));\n column.element.dataset.width = String(column.width);\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n syncColumnGeometry();\n dispatch('ui:data-grid-column-resize', {column: column.key, width: column.width, phase});\n };\n const registerResizeHandles = (): void => {\n resizeCleanup?.run();\n resizeCleanup = new CleanupManager();\n cleanup.addChild(resizeCleanup);\n columns.forEach((column) => {\n const handle = column.element.querySelector<HTMLElement>('[data-ui-data-grid-resize-handle]');\n if (!handle) return;\n const enabled = column.resizable && component.props.resizableColumns;\n handle.hidden = !column.resizable;\n if (enabled) handle.removeAttribute('aria-disabled');\n else handle.setAttribute('aria-disabled', 'true');\n handle.tabIndex = enabled ? 0 : -1;\n if (!enabled) return;\n const onResize = (event: ResizeEvent): void => updateColumnWidth(column, event.previewWidth, event.phase);\n resizeCleanup?.add(createResizable({\n element: column.element,\n handle,\n axis: 'x',\n min: column.minWidth,\n max: column.maxWidth,\n mode: component.props.resizeMode,\n disabled: () => !component.props.resizableColumns || !column.resizable,\n onStart: onResize,\n onResize,\n onEnd: onResize,\n onCancel: onResize,\n }));\n });\n };\n\n const component: TrellisAlpineComponent<DataGridData> = {\n get supportsSeek(): boolean { return cursorDelegate?.supportsSeek ?? false; },\n props: null as unknown as PropState<typeof dataGridSchema>,\n init(): void {\n cleanup = cleanupManagerFor(this);\n root = this.$el;\n destroyed = false;\n const scope = globalThis.crypto?.randomUUID?.() ?? `grid-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n root.dataset.uiDataGridScope = scope;\n root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]')?.setAttribute('data-sortable-scope', scope);\n this.props = defineProps({el: root, schema: dataGridSchema, onChange: (_state, changes) => {\n if (suppressPropChange) return;\n const keys = changes.map(({key}) => key);\n if (keys.includes('selectionValue') || keys.includes('selection')) {\n selection = normalizeSelection(this.props.selectionValue, this.props.selection);\n reflectMountedSelection();\n }\n if (keys.some((key) => [\n 'resizableColumns', 'reorderableColumns', 'minColumnWidth', 'defaultColumnWidth', 'maxColumnWidth',\n ].includes(key))) forceColumnRefresh = true;\n if (keys.some((key) => [\n 'query', 'totalRows', 'resizableColumns', 'reorderableColumns', 'minColumnWidth',\n 'defaultColumnWidth', 'maxColumnWidth',\n ].includes(key))) scheduleDeclarativeState();\n if (keys.some((key) => ['fetchUrl', 'rowHeight', 'bufferSize'].includes(key))) this.reload();\n }});\n totalRows = integer(this.props.totalRows);\n selection = normalizeSelection(this.props.selectionValue, this.props.selection);\n viewport = root.querySelector<HTMLElement>('[data-ui-data-grid-viewport]')\n ?? root.querySelector<HTMLElement>('[data-ui-scroll-area-viewport]');\n table = root.querySelector<HTMLElement>('[data-ui-data-grid-inner]');\n body = root.querySelector<HTMLElement>('[data-ui-data-grid-body]');\n spacer = root.querySelector<HTMLElement>('[data-ui-data-grid-spacer]');\n styleElement = root.querySelector<HTMLStyleElement>('style[data-ui-data-grid-layout]');\n blocks = Array.from(root.querySelectorAll<HTMLElement>('[data-ui-data-grid-block]')).slice(0, 3)\n .map((element, index) => ({element, key: `block-${index + 1}`}));\n if (!viewport || !table || !body || !spacer || !styleElement || blocks.length !== 3) {\n throw new Error('Data Grid requires one viewport, table owner, body, spacer, layout style, and three row blocks.');\n }\n viewport.setAttribute('data-ui-data-grid-viewport', '');\n columns = declaredColumns();\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n reconcileColumnStructure();\n syncColumnGeometry();\n registerResizeHandles();\n const headerRow = root.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n if (headerRow) {\n if (typeof ResizeObserver !== 'undefined') {\n headerSizeObserver = new ResizeObserver((entries) => {\n const entry = entries.find(({target}) => target === headerRow);\n if (!entry) return;\n observedHeaderWidth = entry.borderBoxSize[0]?.inlineSize ?? entry.contentRect.width;\n bodyWidthTask.schedule();\n });\n headerSizeObserver.observe(headerRow, {box: 'border-box'});\n }\n columnObserver = new MutationObserver(scheduleDeclarativeState);\n columnObserver.observe(headerRow, {\n attributes: true,\n childList: true,\n subtree: true,\n attributeFilter: [\n 'data-column', 'data-label', 'data-width', 'data-min-width', 'data-max-width', 'data-hidden',\n 'data-pinned', 'data-sortable', 'data-sort', 'data-resizable', 'data-reorderable', 'data-align',\n 'data-cell-class', 'hidden',\n ],\n });\n }\n unregisterColumnInvalidation = registerDomInvalidationOwner(root, {invalidateDom: scheduleDeclarativeState});\n listenerAborter = new AbortController();\n viewport.addEventListener('scroll', () => scrollToTask.schedule(), {passive: true, signal: listenerAborter.signal});\n root.addEventListener('click', (event) => {\n const target = event.target as HTMLElement;\n const sortButton = target.closest<HTMLElement>('[data-ui-data-grid-sort-button]');\n if (sortButton && this.props.sortableColumns) {\n const header = sortButton.closest<HTMLElement>('[data-ui-data-grid-column-header]');\n const column = columns.find(({key}) => key === header?.dataset.column);\n if (column?.sortable) {\n const direction = column.sort === 'ascending' ? 'descending' : 'ascending';\n dispatch('ui:data-grid-sort', {column: column.key, direction, additive: event.shiftKey});\n }\n return;\n }\n const row = target.closest<HTMLElement>('[data-ui-data-grid-row]');\n if (!row || !root?.contains(row)) return;\n const key = row.dataset.rowKey ?? '';\n if (this.props.selectOnRowClick && !target.closest(interactiveSelector)) changeRow(key);\n dispatch('ui:data-grid-row-activate', {rowKey: key, row});\n }, {signal: listenerAborter.signal});\n root.addEventListener('dblclick', (event) => {\n const cell = (event.target as HTMLElement).closest<HTMLElement>('[data-ui-data-grid-cell]');\n const row = cell?.closest<HTMLElement>('[data-ui-data-grid-row]');\n if (cell && row) dispatch('ui:data-grid-cell-activate', {\n rowKey: row.dataset.rowKey ?? '', column: cell.dataset.column ?? '', cell,\n });\n }, {signal: listenerAborter.signal});\n root.addEventListener('ui:sortable-drop', ((event: CustomEvent) => {\n const source = event.detail?.source;\n if (source?.type !== 'data-grid-column') return;\n const to = Number(event.detail?.index ?? event.detail?.anchor?.index);\n if (Number.isInteger(to)) this.reorderColumn(String(source.id), to);\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-total-change', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n updateTotal(Number(event.detail?.totalItems ?? 0));\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-load-start', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n dispatch('ui:data-grid-load-start', {mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-load', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n reconcileColumnStructure();\n reflectMountedSelection();\n dispatch('ui:data-grid-load', {...event.detail, mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n root.addEventListener('ui:virtualizer-error', ((event: CustomEvent) => {\n if (!cursorDelegate || event.target !== root) return;\n dispatch('ui:data-grid-error', {...event.detail, mode: 'cursor'});\n }) as EventListener, {signal: listenerAborter.signal});\n viewport.style.overscrollBehavior = 'contain';\n viewport.style.overflowAnchor = 'none';\n syncState();\n if (this.props.cursor) this.useCursor(serverCursorOptions(() => {\n if (!root) throw new Error('Data Grid is not mounted.');\n return root;\n }));\n else {\n scrollTarget = {index: this.props.initialIndex, align: 'start', offset: 0};\n scrollToTask.schedule();\n }\n },\n destroy(): void {\n destroyed = true;\n listenerAborter?.abort();\n listenerAborter = null;\n columnObserver?.disconnect();\n columnObserver = null;\n headerSizeObserver?.disconnect();\n headerSizeObserver = null;\n bodyWidthTask.cancel();\n scrollToTask.cancel();\n scrollTarget = null;\n unregisterColumnInvalidation?.();\n unregisterColumnInvalidation = null;\n resizeCleanup = null;\n cursorDelegate?.destroy();\n cursorDelegate = null;\n invalidate();\n this.props.disconnect();\n root = null;\n viewport = null;\n table = null;\n body = null;\n spacer = null;\n styleElement = null;\n columns = [];\n previousColumnSnapshots = [];\n blocks = [];\n },\n scrollToIndex(index, align = 'start'): void {\n if (cursorDelegate) {\n cursorDelegate.scrollToIndex(index, align);\n return;\n }\n if (!viewport) return;\n scrollTarget = {index, align, offset: null};\n scrollToTask.schedule();\n },\n setTotalRows(count): void {\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'totalRows', value: integer(count)});\n },\n setQuery(query): void {\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'query', value: query});\n },\n useCursor(options): void {\n if (!root || !viewport || !spacer) return;\n cursorDelegate?.destroy();\n cursorDelegate = null;\n invalidate();\n root.dataset.totalItems = String(totalRows);\n root.dataset.itemSize = String(this.props.rowHeight);\n spacer.setAttribute('data-ui-virtualizer-spacer', '');\n blocks.forEach(({element}) => element.setAttribute('data-ui-virtualizer-block', ''));\n cursorOptionQuery = options.query;\n const initialQuery = root.hasAttribute('data-query') ? this.props.query : cursorOptionQuery;\n appliedCursorQuery = cloneSerializable(initialQuery);\n const delegate = UiVirtualizer<unknown, unknown>(AlpineInstance, {\n cursor: {...options, query: initialQuery} as unknown as CursorVirtualizerOptions<unknown, unknown>,\n }) as CursorDelegate;\n cursorDelegate = delegate;\n Object.assign(delegate, {$el: root});\n delegate.init();\n },\n setUrl(url, options = {}): void {\n suppressPropChange = true;\n this.props.fetchUrl = String(url);\n if (root) reflectSchemaProp({el: root, schema: dataGridSchema, key: 'fetchUrl', value: String(url)});\n suppressPropChange = false;\n if (options.reset ?? true) this.reset();\n else this.reload();\n },\n reset(options = {}): void {\n if (cursorDelegate) {\n cursorDelegate.reset({scrollTop: options.scrollTop ?? 0});\n return;\n }\n this.reload({scrollTop: options.scrollTop ?? 0});\n },\n reload(options = {}): void {\n if (cursorDelegate) {\n cursorDelegate.reload(options);\n return;\n }\n invalidate();\n scrollTarget = options.scrollTop === undefined ? null : {offset: Math.max(0, options.scrollTop)};\n scrollToTask.schedule();\n },\n resizeColumn(key, width): void {\n const column = columns.find((candidate) => candidate.key === key);\n if (column) updateColumnWidth(column, Number(width), 'end');\n },\n reorderColumn(key, toIndex): void {\n const from = columns.findIndex((column) => column.key === key);\n const next = reorderColumns(columns, key, integer(toIndex));\n if (!next) return;\n columns = next;\n previousColumnSnapshots = dataGridColumnSnapshots(columns);\n const headerRow = root?.querySelector<HTMLElement>('[data-ui-data-grid-header-row]');\n const indicator = headerRow?.querySelector<HTMLElement>('[data-ui-data-grid-column-indicator]') ?? null;\n columns.forEach((column) => headerRow?.insertBefore(column.element, indicator));\n reconcileColumnStructure();\n syncColumnGeometry();\n dispatch('ui:data-grid-column-reorder', {column: key, from, to: integer(toIndex), columns: columns.map(({key: columnKey}) => columnKey)});\n },\n selectRow(key): void { changeRow(String(key), true); },\n deselectRow(key): void { changeRow(String(key), false); },\n toggleRow(key): void { changeRow(String(key)); },\n setSelection(value): void { setSelection(value); },\n selectQuery(token, total, except = []): void {\n setSelection({mode: 'query', token: String(token), total: integer(total), except: except.map(String)});\n },\n clearSelection(): void { setSelection({mode: 'ids', ids: []}); },\n };\n return component;\n};\n\nconst registerDataGrid = (AlpineInstance: Alpine.Alpine): void => {\n defineAlpineData('UiDataGrid', () => UiDataGrid(AlpineInstance))(AlpineInstance);\n};\n\nexport {registerDataGrid, UiDataGrid};\nexport type {DataGridData, DataGridResetOptions, DataGridSetUrlOptions, UiDataGridApi};\n","// Generated by scripts/generate_component_entries.mjs from packages/client/component-entries.json.\n// Do not edit by hand.\nimport type {Alpine as AlpineType} from 'alpinejs';\nimport {registerResizableCapability} from '../../capabilities/resizable';\nimport {registerSortableCapability} from '../../capabilities/sortable';\nimport {registerDataGrid as registerComponent} from './index';\n\nconst registered = new WeakSet<AlpineType>();\n\nconst registerDataGrid = (AlpineInstance: AlpineType): void => {\n if (registered.has(AlpineInstance)) return;\n registered.add(AlpineInstance);\n registerResizableCapability(AlpineInstance);\n registerSortableCapability(AlpineInstance);\n registerComponent(AlpineInstance);\n};\n\nexport {registerDataGrid};\nexport default registerDataGrid;\nexport * from './index';\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export * from "./data-grid-Dm3rQfQ_.js";
2
- export {default} from "./data-grid-Dm3rQfQ_.js";
1
+ export * from "./data-grid-Cr9kEoo9.js";
2
+ export {default} from "./data-grid-Cr9kEoo9.js";
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./chunks/object-SRW-YaCA.js";import{t}from"./chunks/warn-BbGtqbh1.js";import{K as n,t as r}from"./chunks/properties-D8pFWF8g.js";import{c as i,l as a,o,s}from"./chunks/fragment-DVphuQVV.js";import{n as c}from"./chunks/dom-invalidation-Dw6clnS4.js";import{a as l,c as u,d,f,l as p,n as m,o as h,s as g}from"./chunks/codecs-CQ7olTJL.js";import{a as _,i as v,n as y,r as b,t as x}from"./chunks/machine-Do4tL7nc.js";import{a as S,c as C,i as w,l as ee,o as te,r as T,s as E,t as D}from"./chunks/ui-CVVSxrtG.js";import{n as O}from"./chunks/alpine-data-Dvc_bXq6.js";import{n as k,t as ne}from"./chunks/styles-CX2j92ex.js";import{t as re}from"./chunks/merge-bindings-BtqW3UgP.js";var ie=e=>{let t=typeof e==`number`?{value:e}:e;if(!t||typeof t!=`object`||typeof t.value!=`number`||!Number.isFinite(t.value))throw TypeError(`x-ui-animate:number requires a finite number or {value, format?, locales?}.`);return{value:t.value,formatter:new Intl.NumberFormat(t.locales,t.format??{maximumFractionDigits:0})}},ae=e=>{e.directive(`ui-animate`,e.skipDuringClone((e,{value:o,expression:l},u)=>{if(o&&o!==`number`&&o!==`paused`){t(`Unknown x-ui-animate binding: ${o}`,e);return}let d=u.evaluateLater(l),f=new AbortController,p=!1,m=``,h,g,_,v,y,b,x=c=>{if(!f.signal.aborted)try{if(o===`paused`){s(e,!!c);return}if(o===`number`){let t=ie(c);_=t.formatter,h||(h=n(t.value),b=h.on(`change`,t=>{e.textContent=_.format(t)})),e.textContent=_.format(h.get()),p&&t.value!==g&&(v?.stop(),y?.dispose(),y=i(e,a(e),f.signal,`presence`),v=y.animate(h,t.value)),g=t.value,p=!0;return}if(!c||typeof c!=`object`||Array.isArray(c))throw TypeError(`x-ui-animate requires a Motion keyframes object.`);let t=Object.fromEntries(Object.entries(c).map(([e,t])=>[e,Array.isArray(t)?[...t]:t])),l=JSON.stringify(t);if(p&&l===m)return;v=r(e,t,{signal:f.signal,transition:p?a(e)??{}:{duration:0}}),m=l,p=!0}catch(n){t(n instanceof Error?n.message:String(n),e)}},S=()=>{d(x)};u.effect(S);let C=c(e,{invalidateDom:S});u.cleanup(()=>{C(),f.abort(),v?.stop(),y?.dispose(),b?.(),h?.destroy(),o===`paused`&&s(e,!1)})}))},oe=`[x-ui-request], [x-ui-request\\.navigate]`,se=new Set([`data`,`extra`,`headers`,`history`,`method`]),ce=[`altKey`,`ctrlKey`,`metaKey`,`shiftKey`],A=new WeakSet,j=(n,{expression:r},i)=>{if(!r?.trim())return{};let a=i.Alpine.evaluate(n,r);return e(a)?(Object.keys(a).forEach(e=>{se.has(e)||t(`x-ui-request: unknown option key`,e)}),a):(t(`x-ui-request: expression must evaluate to an object`),null)},le=e=>e.submitter instanceof HTMLElement?e.submitter:null,ue=(e,t,n)=>t.defaultPrevented||(n?.getAttribute(`formmethod`)||e.getAttribute(`method`))?.toLowerCase()===`dialog`||e.getAttribute(`target`)||n?.getAttribute(`formtarget`)?!1:!e.noValidate&&!e.checkValidity()?(e.reportValidity(),!1):!0,de=e=>e.hash!==``&&e.origin===window.location.origin&&e.pathname===window.location.pathname&&e.search===window.location.search,fe=(e,t,n)=>{if(t.defaultPrevented||t.button!==0||n&&ce.some(e=>t[e])||e.hasAttribute(`download`)||e.getAttribute(`target`))return null;let r=new URL(e.href,document.baseURI);return r.origin===window.location.origin?de(r)?n?{destination:r,type:`native-fragment`}:null:{destination:r,type:`enhance`}:null},pe=(e,n,r,i,a)=>{let o=o=>{if(A.delete(n))return;let s=le(o);if(!ue(n,o,s))return;let c=j(n,r,i);if(c){if(o.preventDefault(),a.navigate){w(e,n.action,n,{...c,source:n,submitter:s});return}C(e,void 0,{...c,source:n,submitter:s}).then(e=>{e.type===`unavailable`&&(A.add(n),n.requestSubmit(s??void 0))}).catch(e=>t(`x-ui-request: request failed`,e))}};n.addEventListener(`submit`,o),i.cleanup?.(()=>n.removeEventListener(`submit`,o))},me=(e,n,r,i,a)=>{let o=o=>{let s=fe(n,o,a.navigate);if(!s)return;if(s.type===`native-fragment`){S(s.destination);return}let c=j(n,r,i);if(c){if(o.preventDefault(),a.navigate){w(e,s.destination,n,c);return}C(e,n.href,{...c,method:c.method??`GET`,source:n}).then(e=>{e.type===`unavailable`&&window.location.assign(n.href)}).catch(e=>t(`x-ui-request: request failed`,e))}};n.addEventListener(`click`,o),i.cleanup?.(()=>n.removeEventListener(`click`,o))},he=e=>{e.addRootSelector(()=>oe),E(e),te(e),e.directive(`ui-request`,(n,{expression:r,modifiers:i},a)=>{let o={expression:r};if(n instanceof HTMLFormElement){pe(e,n,o,a,{navigate:i.includes(`navigate`)});return}if(n instanceof HTMLAnchorElement){me(e,n,o,a,{navigate:i.includes(`navigate`)});return}t(`x-ui-request: directive only supports forms and anchors`,n)})},M=(e,t)=>{let n=!0,r=!1,i,a,o=new Promise(e=>{a=e});return e(e=>{if(n){r=!0,i=e;return}a(e)},{scope:{$transition:t}}),n=!1,r?i:o},N=e=>{e.directive(`ui-transition`,e.skipDuringClone((n,{value:r,expression:i},a)=>{if(!r){t(`x-ui-transition requires a transition name`,n);return}let o=b(e,n);if(!o){t(`x-ui-transition:${r} requires an owning Trellis machine`,n);return}let s=i?.trim()?a.evaluateLater(i):null,c=o.onTransition(r,e=>s?M(s,e):void 0,n);a.cleanup(c)}))},P=()=>{},F,I=class{startComment;endComment;constructor(e,t){this.startComment=e,this.endComment=t}get children(){let e=[],t=this.startComment.nextSibling;for(;t&&t!==this.endComment;)t instanceof Element&&e.push(t),t=t.nextSibling;return e}get firstChild(){let e=this.startComment.nextSibling;return e===this.endComment?null:e}appendChild(e){return this.endComment.before(e),e}insertBefore(e,t){return(t??this.endComment).before(e),e}nextNode(e){let t=e.nextSibling;return t===this.endComment?null:t}},L=(e,t)=>e instanceof I?e.nextNode(t):t.nextSibling,R=e=>{let t=document.createElement(`template`);t.innerHTML=e;let n=t.content.firstElementChild;if(!n)throw Error(`Morph HTML must contain a root element.`);return n},ge=(e,t)=>{t.namespaceURI?e.setAttributeNodeNS(t.cloneNode()):t.name.includes(`@`)?e.setAttributeNode(t.cloneNode()):e.setAttribute(t.name,t.value)},z=(e,t)=>{let n=!1;return e(t,()=>{n=!0}),n},B=e=>e?.nodeType===Node.COMMENT_NODE&&e.textContent===`[if BLOCK]><![endif]`,V=e=>e?.nodeType===Node.COMMENT_NODE&&e.textContent===`[if ENDBLOCK]><![endif]`,H=(e,t)=>{let n=0,r=t;for(;r=L(e,r);)if(B(r))n+=1;else if(V(r)&&n>0)--n;else if(V(r))return r;throw Error(`Unclosed conditional morph block.`)},U=e=>{let t=e;if(e._x_lastRenderedEl)t=e._x_lastRenderedEl;else if(e._x_currentIfEl)t=U(e._x_currentIfEl).end;else if(e._x_lookup?.size){let n=new Set(e._x_lookup.values()),r=e.nextSibling;for(;r&&n.has(r);)t=U(r).end,r=t.nextSibling}return{start:e,end:t}},W=(e,t)=>L(e,t.end),G=(e,t)=>{if(e.nodeType!==t.nodeType||e.nodeName!==t.nodeName)return!1;if(e.nodeType===Node.TEXT_NODE||e.nodeType===Node.COMMENT_NODE)return e.nodeValue===t.nodeValue;if(e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement){let n=e,r=t;if(n._x_teleport){let e=r._x_teleport??t.content.firstElementChild;return!!(e&&G(n._x_teleport,e))}return e.isEqualNode(t)}if(e instanceof Element&&t instanceof Element){if(e.attributes.length!==t.attributes.length)return!1;for(let{name:n,value:r}of e.attributes)if(t.getAttribute(n)!==r)return!1}let n=e.firstChild,r=t.firstChild;for(;n&&r;){if(!G(n,r))return!1;n=U(n).end.nextSibling,r=r.nextSibling}return n===null&&r===null},_e=(e,t,n)=>{if(t.start===n||W(e,t)===n)return;let r=t.start;for(;r;){let i=r.nextSibling;if(e.insertBefore(r,n),r===t.end)break;r=i}},ve=(e,t)=>{let n=t?._x_bindings?.id;n&&e instanceof Element&&(e.setAttribute(`id`,n),e.id=n)},ye=(e,t,n)=>{let r=new WeakMap,i=e.map(n).filter(Boolean),a=t.map(n).filter(Boolean);if(!(i.length>=2&&i.length===a.length&&new Set(i).size===i.length&&i.some((e,t)=>e!==a[t])&&i.every(e=>a.includes(e))))return r;let o=e=>{let t=new Map,n=e=>{e.id&&t.set(e.id,(t.get(e.id)??0)+1)};for(let t of e)n(t),t.querySelectorAll(`[id]`).forEach(n);return t},s=o(e),c=o(t),l=new Map;for(let[e,t]of s)t===1&&c.get(e)===1&&l.set(e,Symbol(e));let u=e=>{if(!n(e))for(let t of e.querySelectorAll(`[id]`)){let n=l.get(t.id);if(n){r.set(e,n);return}}};return e.forEach(u),t.forEach(u),r},K=(e={})=>{let t={key:e.key??(e=>e.getAttribute(`key`)),lookahead:e.lookahead??!1,updating:e.updating??P,updated:e.updated??P,removing:e.removing??P,removed:e.removed??P,remove:e.remove??(e=>{e.parentNode?.removeChild(e)}),adding:e.adding??P,added:e.added??P,skipUntilCondition:null},n=e=>e instanceof Element?t.key(e):null,r=(e,t)=>e.nodeType!==t.nodeType||e.nodeName!==t.nodeName||n(e)!==n(t)||e instanceof Element&&t instanceof Element&&e.getAttribute(`x-data`)!==t.getAttribute(`x-data`),i=(e,n,r)=>{if(z(t.adding,n))return{inserted:!1,node:null};let i=n.cloneNode(!0);return e.insertBefore(i,r),t.added(i),{inserted:!0,node:i}},a=e=>!z(t.removing,e)&&(t.remove(e),t.removed(e),!0),o=e=>!z(t.removing,e.start)&&(t.remove(e.start),t.removed(e.start),!0),s=(e,n)=>{if(z(t.removing,e))return!1;let r=n.cloneNode(!0);return!z(t.adding,r)&&(e.parentNode?.insertBefore(r,e),t.remove(e),t.removed(e),t.added(r),!0)},c=(e,t)=>{if(e._x_transitioning||e._x_isShown&&!t._x_isShown||!e._x_isShown&&t._x_isShown)return!1;let n=!1,r=Array.from(e.attributes);for(let i=r.length-1;i>=0;--i){let a=r[i].name;t.hasAttribute(a)||(a===`open`&&e instanceof HTMLDialogElement&&e.open?e.close():e.removeAttribute(a),n=!0)}let i=Array.from(t.attributes);for(let t=i.length-1;t>=0;--t){let r=i[t],{name:a,value:o}=r;e.getAttribute(a)!==o&&(ge(e,r),n=!0)}return n},l,u=(e,n,i)=>{if(e instanceof Element&&e.hasAttribute(`data-ui-ignore-morph`))return!1;if(r(e,n))return s(e,n);if(i===`before-descendant-hook`&&e.nodeType!==Node.COMMENT_NODE&&G(e,n))return!1;let a=!1,o=!1,u=!1;if(t.updating(e,n,()=>{a=!0},()=>{u=!0},()=>{o=!0},e=>{t.skipUntilCondition=e}),u||G(e,n))return!1;let f=!1;return e.nodeType===Node.ELEMENT_NODE&&F&&(F.cloneNode(e,n),e._x_teleport&&n._x_teleport&&(f=d(e._x_teleport,n._x_teleport)||f)),n.nodeType===Node.TEXT_NODE||n.nodeType===Node.COMMENT_NODE?e.nodeValue!==n.nodeValue&&(e.nodeValue=n.nodeValue,t.updated(e,n),!0):(a||(f=c(e,n)||f),o||(f=l(e,n)||f),f&&t.updated(e,n),f)},d=(e,t)=>u(e,t,`before-descendant-hook`);return l=(e,r)=>{let s=Array.from(e.children),c=ye(s,Array.from(r.children),n),u=e=>e?n(e)||c.get(e):null,f=new Map;for(let e of s){let t=u(e);t&&f.set(t,e)}let p=!1,m=e.firstChild,h=r.firstChild;incoming:for(;h;){if(ve(h,m),t.skipUntilCondition){let n=!m||t.skipUntilCondition(m),i=t.skipUntilCondition(h);if(n&&i)t.skipUntilCondition=null;else{!n&&m&&(m=W(e,U(m))),i||(h=L(r,h));continue}}if(!m){p=i(e,h,null).inserted||p,h=L(r,h);continue}if(B(m)&&B(h)){let t=H(e,m),n=H(r,h);p=l(new I(m,t),new I(h,n))||p,m=L(e,t),h=L(r,n);continue}{if(t.lookahead&&m instanceof Element&&!m.isEqualNode(h)){let t=L(r,h);for(;t;){if(t instanceof Element&&m.isEqualNode(t)){let t=i(e,h,m);if(!t.inserted){h=L(r,h);continue incoming}m=t.node,p=!0;break}t=L(r,t)}}let n=u(h),a=u(m);if(n!==a){let t=n?f.get(n):void 0;if(t)_e(e,U(t),m),m=t,p=!0;else if(n||a){let t=i(e,h,m);if(!t.inserted){h=L(r,h);continue}m=t.node,p=!0}}let o=W(e,U(m));p=d(m,h)||p,m=o}h=L(r,h)}for(;m;){let t=U(m),n=W(e,t);p=(t.end===t.start?a(m):o(t))||p,m=n}return p},{patchChildren:l,patchRoot:(e,t)=>u(e,t,`after-root-hook`)}},be=(e,t,n={})=>{let r=typeof t==`string`?R(t):t,i=e;return F?.closestDataStack&&!i._x_dataStack&&(r._x_dataStack=F.closestDataStack(i),r._x_dataStack&&F.cloneNode(i,r)),K(n).patchRoot(i,r),e},xe=(e,t,n,r={})=>{let i=e.parentNode,a=typeof n==`string`?(()=>{let e=document.createElement(`div`);return e.insertAdjacentHTML(`beforeend`,n),e})():n,o=document.createComment(`[morph-start]`),s=document.createComment(`[morph-end]`);a.insertBefore(o,a.firstChild),a.appendChild(s),F?.closestDataStack&&(a._x_dataStack=F.closestDataStack(i),a._x_dataStack&&F.cloneNode(i,a)),K(r).patchChildren(new I(e,t),new I(o,s))},Se=e=>{let t=e;F=t,t.morph=be,t.morphBetween=xe},q=`Are you sure?`,Ce=null,J=new WeakSet,we=e=>e instanceof HTMLButtonElement||e instanceof HTMLInputElement,Te=({form:e,submitter:t})=>{let n=t?.dataset.uiConfirm;if(n!==void 0)return n||q;let r=e.dataset.uiConfirm;return r===void 0?null:r||q},Ee=({form:e,submitter:t})=>{window.setTimeout(()=>{if(!(!e.isConnected||t&&t.form!==e)){J.add(e);try{e.requestSubmit(t??void 0)}finally{J.delete(e)}}},0)},Y=e=>{let t=e.target;if(!(t instanceof HTMLFormElement))return;if(J.has(t)){J.delete(t);return}let n=we(e.submitter)?e.submitter:null,r=Te({form:t,submitter:n});if(r===null)return;e.preventDefault();let i=!1,a=()=>{i||(i=!0,Ee({form:t,submitter:n}))},o=()=>{i=!0},s=new CustomEvent(`ui:confirm`,{bubbles:!0,cancelable:!0,detail:{form:t,message:r,submitter:n,triggeringEvent:e,proceed:a,cancel:o}});t.dispatchEvent(s),!s.defaultPrevented&&(window.confirm(r)?a():o())},X=({root:e=document}={})=>{Ce||=(e.addEventListener(`submit`,Y,{capture:!0}),()=>e.removeEventListener(`submit`,Y,{capture:!0}))},De=e=>e.replace(/([A-Z])/g,`_$1`).toLowerCase(),Oe=({manifest:e})=>{if(`propSchema`in e)throw Error(`Manual manifests cannot supply propSchema.`);return Object.freeze(e)},Z=({schema:e,details:t})=>{let n={};return Object.entries(e).forEach(([e,r])=>{let i=t[e]??{},a=r.meta,o=i.name??De(e);if(o in n)throw Error(`Schema property ${e} resolves to duplicate manifest property ${o}.`);let s={type:a.type,default:a.default};a.values&&(s.values=a.values),i.description&&(s.description=i.description),i.initialOnly&&(s.initialOnly=!0),n[o]=s}),n},ke=({schema:e,details:t,templateProps:n={},templatePropsPosition:r=`after`,manifest:i})=>{let a=Z({schema:e,details:t});Object.keys(n).forEach(e=>{if(e in a)throw Error(`Template prop ${e} collides with schema property ${e}.`)});let o=r===`before`?{...n,...a}:{...a,...n},{name:s,title:c,description:l,meta:u,...d}=i,f={name:s,title:c,description:l,...u?{meta:u}:{},propSchema:e,props:o,...d};return Object.freeze(f)},Q=new WeakSet,$=e=>{Q.has(e)||(Q.add(e),d(e.reactive),e.plugin(Se),o(async()=>{await e.nextTick()}),D(e),ae(e),N(e),X(),he(e),ee(e))};export{m as bool,$ as coreRuntime,$ as default,y as createAlpineMachine,x as createMachine,v as createTransitionCoordinator,l as decodeProps,O as defineAlpineData,_ as defineHook,Oe as defineManifest,h as defineProps,ke as defineSchemaManifest,ne as defineStyles,g as json,re as mergeBindings,u as number,p as oneOf,Z as propsFromSchema,N as registerTransitionDirective,k as resolveStyle,f as string,T as ui};
2
+ //# sourceMappingURL=core-CbDVD_pk.js.map