@vueye-table/headless 3.0.0-alpha.4 → 3.0.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/shared.ts","../src/controls.ts","../src/table.ts","../src/grid.ts"],"sourcesContent":["import type { TableColumn, TableRow } from \"@vueye-table/core\";\nimport type { PropType } from \"vue\";\n\n/** The element a component renders. Every headless component accepts `as`. */\nexport const asProp = (tag: string) =>\n ({\n type: String,\n default: tag,\n }) as const;\n\n/** Columns of any row type; callbacks on a column make `TableColumn<unknown>` too narrow. */\nexport type AnyTableColumn = TableColumn<any>;\n\nexport const columnProp = {\n type: Object as PropType<AnyTableColumn>,\n required: true,\n} as const;\n\nexport const rowProp = {\n type: Object as PropType<TableRow<unknown>>,\n required: true,\n} as const;\n\n/** `data-*` attributes take strings; `undefined` leaves the attribute off. */\nexport function flag(value: boolean): \"\" | undefined {\n return value ? \"\" : undefined;\n}\n","import type { PageItem, SelectionCoverage, TableColumn } from \"@vueye-table/core\";\nimport { injectDataTable } from \"@vueye-table/vue\";\nimport { defineComponent, h, onScopeDispose, type PropType, type SlotsType, type VNode } from \"vue\";\n\nimport { asProp, flag, rowProp } from \"./shared\";\n\nfunction checkbox(props: {\n readonly checked: boolean;\n readonly indeterminate: boolean;\n readonly label: string;\n readonly disabled: boolean;\n readonly onChange: () => void;\n}) {\n return h(\"input\", {\n type: \"checkbox\",\n checked: props.checked,\n indeterminate: props.indeterminate,\n disabled: props.disabled,\n \"aria-label\": props.label,\n \"data-state\": props.indeterminate ? \"indeterminate\" : props.checked ? \"checked\" : \"unchecked\",\n onChange: props.onChange,\n });\n}\n\n/**\n * Selects or clears every row in the table's select-all scope. It shows the indeterminate state\n * when only some are selected. The slot receives the state to draw a custom control.\n */\nexport const DataTableSelectAll = defineComponent({\n name: \"DataTableSelectAll\",\n slots: Object as SlotsType<{\n default?: (props: { state: SelectionCoverage; toggle: () => void }) => VNode[];\n }>,\n props: { label: { type: String, default: \"Select all rows\" } },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableSelectAll>\");\n return () => {\n const state = table.allSelection;\n const toggle = (): void => table.toggleAll();\n return (\n slots.default?.({ state, toggle }) ??\n checkbox({\n checked: state === \"all\",\n indeterminate: state === \"some\",\n label: props.label,\n disabled: table.selectionMode !== \"multiple\" || table.rows.length === 0,\n onChange: toggle,\n })\n );\n };\n },\n});\n\n/** Selects or clears one row. */\nexport const DataTableSelectRow = defineComponent({\n name: \"DataTableSelectRow\",\n slots: Object as SlotsType<{\n default?: (props: { selected: boolean; toggle: () => void }) => VNode[];\n }>,\n props: { row: rowProp, label: { type: String, default: \"Select row\" } },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableSelectRow>\");\n return () => {\n const selected = table.isSelected(props.row.key);\n const toggle = (): void => table.toggleRow(props.row.key);\n return (\n slots.default?.({ selected, toggle }) ??\n checkbox({\n checked: selected,\n indeterminate: false,\n label: props.label,\n disabled: table.selectionMode === \"none\",\n onChange: toggle,\n })\n );\n };\n },\n});\n\n/**\n * A search box bound to the table's free-text search. `debounce` waits that many milliseconds\n * after the last keystroke before searching.\n */\nexport const DataTableSearch = defineComponent({\n name: \"DataTableSearch\",\n props: {\n debounce: { type: Number, default: 0 },\n label: { type: String, default: \"Search\" },\n placeholder: { type: String as PropType<string | undefined>, default: undefined },\n },\n setup(props) {\n const table = injectDataTable(\"<DataTableSearch>\");\n let timer: ReturnType<typeof setTimeout> | undefined;\n onScopeDispose(() => clearTimeout(timer));\n return () =>\n h(\"input\", {\n type: \"search\",\n value: table.state.search,\n placeholder: props.placeholder,\n \"aria-label\": props.label,\n onInput: (event: Event) => {\n const { value } = event.target as HTMLInputElement;\n clearTimeout(timer);\n if (props.debounce > 0) {\n timer = setTimeout(() => table.search(value), props.debounce);\n } else {\n table.search(value);\n }\n },\n });\n },\n});\n\n/**\n * Page navigation. The slot receives everything needed to draw custom controls; without one it\n * renders previous, numbered, and next buttons with `aria-current` on the current page.\n */\nexport const DataTablePagination = defineComponent({\n name: \"DataTablePagination\",\n slots: Object as SlotsType<{\n default?: (props: {\n page: number;\n pageCount: number;\n items: readonly PageItem[];\n canPrevious: boolean;\n canNext: boolean;\n goToPage: (page: number) => void;\n next: () => void;\n previous: () => void;\n }) => VNode[];\n }>,\n props: {\n as: asProp(\"nav\"),\n label: { type: String, default: \"Pagination\" },\n },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTablePagination>\");\n return () => {\n const slotProps = {\n page: table.page,\n pageCount: table.pageCount,\n items: table.pageItems,\n canPrevious: table.canPreviousPage,\n canNext: table.canNextPage,\n goToPage: table.goToPage,\n next: table.nextPage,\n previous: table.previousPage,\n };\n const button = (\n label: string,\n content: string,\n disabled: boolean,\n onClick: () => void,\n current = false,\n ) =>\n h(\n \"button\",\n {\n type: \"button\",\n disabled,\n \"aria-label\": label,\n \"aria-current\": current ? \"page\" : undefined,\n \"data-current\": flag(current),\n onClick,\n },\n content,\n );\n return h(\n props.as,\n { \"aria-label\": props.label },\n slots.default?.(slotProps) ?? [\n button(\"Previous page\", \"‹\", !table.canPreviousPage, table.previousPage),\n ...table.pageItems.map((item) =>\n item.type === \"gap\"\n ? h(\"span\", { key: item.key, \"aria-hidden\": \"true\", \"data-gap\": \"\" }, \"…\")\n : button(\n `Page ${item.page}`,\n String(item.page),\n false,\n () => table.goToPage(item.page),\n item.current,\n ),\n ),\n button(\"Next page\", \"›\", !table.canNextPage, table.nextPage),\n ],\n );\n };\n },\n});\n\n/** A page size picker. */\nexport const DataTablePageSize = defineComponent({\n name: \"DataTablePageSize\",\n props: {\n options: { type: Array as PropType<readonly number[]>, default: () => [5, 10, 20, 50] },\n label: { type: String, default: \"Rows per page\" },\n },\n setup(props) {\n const table = injectDataTable(\"<DataTablePageSize>\");\n return () => {\n const sizes = props.options.includes(table.pageSize)\n ? props.options\n : [...props.options, table.pageSize].toSorted((left, right) => left - right);\n return h(\n \"select\",\n {\n value: table.pageSize,\n \"aria-label\": props.label,\n onChange: (event: Event) =>\n table.setPageSize(Number((event.target as HTMLSelectElement).value)),\n },\n sizes.map((size) =>\n h(\"option\", { key: size, value: size, selected: size === table.pageSize }, String(size)),\n ),\n );\n };\n },\n});\n\n/** A checkbox per column that shows or hides it. The slot receives the columns and `toggle`. */\nexport const DataTableColumnVisibility = defineComponent({\n name: \"DataTableColumnVisibility\",\n slots: Object as SlotsType<{\n default?: (props: {\n columns: readonly { column: TableColumn<unknown>; visible: boolean }[];\n toggle: (columnId: string, visible?: boolean) => void;\n }) => VNode[];\n }>,\n props: { as: asProp(\"fieldset\"), legend: { type: String, default: \"Columns\" } },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableColumnVisibility>\");\n return () => {\n const hidden = new Set(table.state.hiddenColumns);\n const columns = table.allColumns.map((column) => ({\n column,\n visible: !hidden.has(column.id),\n }));\n return h(\n props.as,\n slots.default?.({ columns, toggle: table.toggleColumn }) ?? [\n props.as === \"fieldset\" ? h(\"legend\", props.legend) : null,\n ...columns.map(({ column, visible }) =>\n h(\"label\", { key: column.id, \"data-column\": column.id }, [\n h(\"input\", {\n type: \"checkbox\",\n checked: visible,\n disabled: visible && table.columns.length === 1,\n onChange: () => table.toggleColumn(column.id),\n }),\n column.header,\n ]),\n ),\n ],\n );\n };\n },\n});\n\n/**\n * A polite live region describing what is shown, such as \"1–10 of 57 rows\". Screen readers\n * announce it after a search, filter, or page change.\n */\nexport const DataTableStatus = defineComponent({\n name: \"DataTableStatus\",\n slots: Object as SlotsType<{\n default?: (props: {\n start: number;\n end: number;\n rowCount: number;\n totalRowCount: number;\n selectedCount: number;\n }) => VNode[];\n }>,\n props: { as: asProp(\"p\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableStatus>\");\n return () => {\n const slotProps = {\n start: table.pageStart,\n end: table.pageEnd,\n rowCount: table.rowCount,\n totalRowCount: table.totalRowCount,\n selectedCount: table.selectedCount,\n };\n const text =\n table.rowCount === 0\n ? \"No rows\"\n : `${table.pageStart}–${table.pageEnd} of ${table.rowCount} rows` +\n (table.selectedCount > 0 ? `, ${table.selectedCount} selected` : \"\");\n return h(\n props.as,\n { role: \"status\", \"aria-live\": \"polite\" },\n slots.default?.(slotProps) ?? text,\n );\n };\n },\n});\n","import type { SortInfo, TableColumn, TableRow } from \"@vueye-table/core\";\nimport {\n injectDataTable,\n provideDataTable,\n type AnyDataTableBinding,\n type DataTableBinding,\n} from \"@vueye-table/vue\";\nimport { defineComponent, h, type PropType, type SlotsType, type VNode } from \"vue\";\n\nimport { asProp, columnProp, flag, rowProp } from \"./shared\";\n\n/**\n * Provides a table to the components inside it and renders the table element. Without a default\n * slot it renders a complete header and body.\n */\nexport const DataTableRoot = defineComponent({\n name: \"DataTableRoot\",\n slots: Object as SlotsType<{\n default?: (props: { table: DataTableBinding<unknown> }) => VNode[];\n }>,\n props: {\n table: { type: Object as PropType<AnyDataTableBinding>, required: true },\n as: asProp(\"table\"),\n },\n setup(props, { slots }) {\n provideDataTable(props.table);\n return () =>\n h(\n props.as,\n {\n \"aria-rowcount\": props.table.rowCount + 1,\n \"aria-colcount\": props.table.columns.length,\n \"data-empty\": flag(props.table.rowCount === 0),\n },\n slots.default?.({ table: props.table }) ?? [h(DataTableHeader), h(DataTableBody)],\n );\n },\n});\n\nexport const DataTableCaption = defineComponent({\n name: \"DataTableCaption\",\n slots: Object as SlotsType<{ default?: () => VNode[] }>,\n props: { as: asProp(\"caption\") },\n setup(props, { slots }) {\n return () => h(props.as, slots.default?.());\n },\n});\n\n/** The header section. Without a slot it renders one header cell per visible column. */\nexport const DataTableHeader = defineComponent({\n name: \"DataTableHeader\",\n slots: Object as SlotsType<{\n default?: (props: { columns: readonly TableColumn<unknown>[] }) => VNode[];\n }>,\n props: { as: asProp(\"thead\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableHeader>\");\n return () =>\n h(\n props.as,\n slots.default?.({ columns: table.columns }) ??\n h(DataTableHeaderRow, () =>\n table.columns.map((column) => h(DataTableHeaderCell, { key: column.id, column })),\n ),\n );\n },\n});\n\nexport const DataTableHeaderRow = defineComponent({\n name: \"DataTableHeaderRow\",\n slots: Object as SlotsType<{ default?: () => VNode[] }>,\n props: { as: asProp(\"tr\") },\n setup(props, { slots }) {\n return () => h(props.as, { \"aria-rowindex\": 1 }, slots.default?.());\n },\n});\n\n/**\n * A column header with `aria-sort`. Without a slot it shows the header text inside a sort button\n * for sortable columns.\n */\nexport const DataTableHeaderCell = defineComponent({\n name: \"DataTableHeaderCell\",\n slots: Object as SlotsType<{\n default?: (props: {\n column: TableColumn<unknown>;\n sort: SortInfo | undefined;\n toggleSort: (multi?: boolean) => void;\n }) => VNode[];\n }>,\n props: { column: columnProp, as: asProp(\"th\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableHeaderCell>\");\n return () => {\n const { column } = props;\n const sort = table.getSort(column.id);\n const ariaSort = sort\n ? sort.direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : column.sortable\n ? \"none\"\n : undefined;\n const content =\n slots.default?.({\n column,\n sort,\n toggleSort: (multi = false) => table.toggleSort(column.id, { multi }),\n }) ??\n (column.sortable ? h(DataTableSortButton, { column }, () => column.header) : column.header);\n return h(\n props.as,\n {\n scope: \"col\",\n \"aria-sort\": ariaSort,\n \"data-column\": column.id,\n \"data-align\": column.align,\n \"data-sortable\": flag(column.sortable),\n \"data-sort\": sort?.direction,\n style: columnStyle(column),\n },\n content,\n );\n };\n },\n});\n\nexport function columnStyle(column: TableColumn<unknown>): Record<string, string> | undefined {\n const style: Record<string, string> = {};\n if (column.width !== undefined) {\n style[\"width\"] = `${column.width}px`;\n }\n if (column.minWidth !== undefined) {\n style[\"minWidth\"] = `${column.minWidth}px`;\n }\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\n/**\n * Toggles a column's sort. Shift-click adds the column to the existing sort instead of replacing\n * it. The slot receives the current sort so it can draw an indicator.\n */\nexport const DataTableSortButton = defineComponent({\n name: \"DataTableSortButton\",\n slots: Object as SlotsType<{\n default?: (props: { sort: SortInfo | undefined }) => VNode[];\n indicator?: (props: { sort: SortInfo | undefined }) => VNode[];\n }>,\n props: { column: columnProp, as: asProp(\"button\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableSortButton>\");\n return () => {\n const sort = table.getSort(props.column.id);\n const next = !sort ? \"ascending\" : sort.direction === \"asc\" ? \"descending\" : \"unsorted\";\n return h(\n props.as,\n {\n type: props.as === \"button\" ? \"button\" : undefined,\n \"data-sort\": sort?.direction,\n \"aria-label\": `${props.column.header}, sort ${next}`,\n onClick: (event: MouseEvent) =>\n table.toggleSort(props.column.id, { multi: event.shiftKey }),\n },\n [slots.default?.({ sort }) ?? props.column.header, slots.indicator?.({ sort })],\n );\n };\n },\n});\n\n/**\n * The body section. Without a slot it renders a row per row on the page, and the `empty` slot in\n * a full-width row when there are none.\n */\nexport const DataTableBody = defineComponent({\n name: \"DataTableBody\",\n slots: Object as SlotsType<{\n default?: (props: { rows: readonly TableRow<unknown>[] }) => VNode[];\n empty?: () => VNode[];\n }>,\n props: { as: asProp(\"tbody\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableBody>\");\n return () => {\n let content: VNode[] | VNode | undefined = slots.default?.({ rows: table.rows });\n if (!content) {\n content =\n table.rows.length === 0 && slots.empty\n ? h(\"tr\", { \"data-empty\": \"\" }, [\n h(\"td\", { colspan: Math.max(1, table.columns.length) }, slots.empty()),\n ])\n : table.rows.map((row) => h(DataTableRow, { key: row.key, row }));\n }\n return h(props.as, content);\n };\n },\n});\n\n/** A body row; `aria-selected` and `data-selected` follow the selection. */\nexport const DataTableRow = defineComponent({\n name: \"DataTableRow\",\n slots: Object as SlotsType<{\n default?: (props: {\n row: TableRow<unknown>;\n selected: boolean;\n columns: readonly TableColumn<unknown>[];\n }) => VNode[];\n }>,\n props: { row: rowProp, as: asProp(\"tr\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableRow>\");\n return () => {\n const { row } = props;\n const selected = table.isSelected(row.key);\n const position = table.rows.indexOf(row);\n return h(\n props.as,\n {\n \"aria-rowindex\": position === -1 ? undefined : table.pageStart + position + 1,\n \"aria-selected\": table.selectionMode === \"none\" ? undefined : String(selected),\n \"data-selected\": flag(selected),\n \"data-key\": String(row.key),\n },\n slots.default?.({ row, selected, columns: table.columns }) ??\n table.columns.map((column) => h(DataTableCell, { key: column.id, row, column })),\n );\n };\n },\n});\n\n/** A body cell. The slot receives the raw value and the formatted text. */\nexport const DataTableCell = defineComponent({\n name: \"DataTableCell\",\n slots: Object as SlotsType<{\n default?: (props: {\n row: TableRow<unknown>;\n column: TableColumn<unknown>;\n value: unknown;\n display: string;\n }) => VNode[];\n }>,\n props: { row: rowProp, column: columnProp, as: asProp(\"td\") },\n setup(props, { slots }) {\n return () => {\n const { row, column } = props;\n const value = row.getValue(column.id);\n const display = row.getDisplay(column.id);\n return h(\n props.as,\n { \"data-column\": column.id, \"data-align\": column.align },\n slots.default?.({ row, column, value, display }) ?? display,\n );\n };\n },\n});\n\n/** Renders its slot only when no row passes the search and filters. */\nexport const DataTableEmpty = defineComponent({\n name: \"DataTableEmpty\",\n slots: Object as SlotsType<{ default?: () => VNode[] }>,\n props: { as: asProp(\"div\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableEmpty>\");\n return () => (table.rowCount === 0 ? h(props.as, { role: \"status\" }, slots.default?.()) : null);\n },\n});\n","import type { GridDirection, TableColumn, TableRow } from \"@vueye-table/core\";\nimport {\n injectDataGrid,\n injectDataTable,\n provideDataGrid,\n provideDataTable,\n useDataGrid,\n type DataGridBinding,\n type AnyDataTableBinding,\n type DataTableBinding,\n} from \"@vueye-table/vue\";\nimport {\n defineComponent,\n h,\n inject,\n nextTick,\n onMounted,\n provide,\n ref,\n useId,\n watch,\n type InjectionKey,\n type PropType,\n type SlotsType,\n type VNode,\n type VNodeChild,\n} from \"vue\";\n\nimport { asProp, columnProp, flag, rowProp } from \"./shared\";\nimport { columnStyle, DataTableHeader } from \"./table\";\n\ninterface GridContext {\n readonly id: string;\n /** Return keyboard focus to the grid, after an edit ends from the keyboard. */\n focus(): void;\n}\n\nconst gridContextKey: InjectionKey<GridContext> = Symbol(\"vueye-table-grid-context\");\n\nfunction useGrid(consumer: string): { grid: DataGridBinding<unknown>; context: GridContext } {\n const grid = injectDataGrid();\n const context = inject(gridContextKey, undefined);\n if (!grid || !context) {\n throw new Error(`${consumer} must be rendered inside <DataGridRoot>.`);\n }\n return { grid, context };\n}\n\nexport function cellId(gridId: string, row: number, column: number): string {\n return `${gridId}-r${row}-c${column}`;\n}\n\n/**\n * A spreadsheet grid over a table. The grid element keeps keyboard focus and points at the active\n * cell with `aria-activedescendant`; arrows, Tab, Home, End, Enter, F2, Delete, Escape, typing,\n * undo, redo, and clipboard copy, cut, and paste all work on the selected range.\n */\nexport const DataGridRoot = defineComponent({\n name: \"DataGridRoot\",\n slots: Object as SlotsType<{\n default?: (props: {\n table: DataTableBinding<unknown>;\n grid: DataGridBinding<unknown>;\n }) => VNode[];\n }>,\n props: {\n table: { type: Object as PropType<AnyDataTableBinding>, required: true },\n as: asProp(\"table\"),\n label: { type: String as PropType<string | undefined>, default: undefined },\n },\n setup(props, { slots, expose }) {\n provideDataTable(props.table);\n const grid = useDataGrid(props.table);\n provideDataGrid(grid);\n const element = ref<HTMLElement>();\n const id = `vt-grid-${useId()}`;\n const focus = (): void => {\n void nextTick(() => element.value?.focus());\n };\n provide(gridContextKey, { id, focus });\n expose({ grid, focus });\n\n const onKeydown = (event: KeyboardEvent): void => {\n if (event.target !== element.value) {\n return;\n }\n if (grid.handleKey(event)) {\n event.preventDefault();\n }\n };\n const onCopy = (event: ClipboardEvent, cut = false): void => {\n if (grid.editor || !grid.range || !event.clipboardData) {\n return;\n }\n event.clipboardData.setData(\"text/plain\", grid.copy());\n event.preventDefault();\n if (cut) {\n grid.clear();\n }\n };\n const onPaste = (event: ClipboardEvent): void => {\n const text = event.clipboardData?.getData(\"text/plain\");\n if (grid.editor || text === undefined || text === \"\") {\n return;\n }\n event.preventDefault();\n grid.paste(text);\n };\n\n return () => {\n const focusPosition = grid.selection?.focus;\n return h(\n props.as,\n {\n ref: element,\n id,\n role: \"grid\",\n tabindex: 0,\n \"aria-label\": props.label,\n \"aria-multiselectable\": \"true\",\n \"aria-rowcount\": props.table.rows.length + 1,\n \"aria-colcount\": props.table.columns.length,\n \"aria-activedescendant\":\n focusPosition && !grid.editor\n ? cellId(id, focusPosition.row, focusPosition.column)\n : undefined,\n onKeydown,\n onCopy: (event: ClipboardEvent) => onCopy(event),\n onCut: (event: ClipboardEvent) => onCopy(event, true),\n onPaste,\n },\n slots.default?.({ table: props.table, grid }) ?? [h(DataTableHeader), h(DataGridBody)],\n );\n };\n },\n});\n\n/** Slot props of a grid cell's content, while it is not being edited. */\nexport interface GridCellSlotProps {\n readonly row: TableRow<unknown>;\n readonly column: TableColumn<unknown>;\n readonly value: unknown;\n readonly display: string;\n readonly editable: boolean;\n}\n\n/**\n * The grid body: a row of cells per row on the page. The `cell` slot draws the content of every\n * cell that is not being edited; the `rowHeader` slot adds a leading cell to each row.\n */\nexport const DataGridBody = defineComponent({\n name: \"DataGridBody\",\n slots: Object as SlotsType<{\n default?: (props: { rows: readonly TableRow<unknown>[] }) => VNode[];\n rowHeader?: (props: { row: TableRow<unknown>; index: number }) => VNode[];\n cell?: (props: GridCellSlotProps) => VNodeChild;\n }>,\n props: { as: asProp(\"tbody\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataGridBody>\");\n return () =>\n h(\n props.as,\n slots.default?.({ rows: table.rows }) ??\n table.rows.map((row, rowIndex) =>\n h(\n \"tr\",\n {\n key: row.key,\n role: \"row\",\n \"aria-rowindex\": rowIndex + 2,\n \"data-key\": String(row.key),\n },\n [\n slots.rowHeader?.({ row, index: rowIndex }),\n ...table.columns.map((column, columnIndex) =>\n h(\n DataGridCell,\n { key: column.id, row, column, rowIndex, columnIndex },\n slots.cell\n ? { default: (cellProps: GridCellSlotProps) => slots.cell?.(cellProps) }\n : undefined,\n ),\n ),\n ],\n ),\n ),\n );\n },\n});\n\n/** The text box shown in a cell while it is edited. */\nconst DataGridEditor = defineComponent({\n name: \"DataGridEditor\",\n props: { label: { type: String, required: true } },\n setup(props) {\n const { grid, context } = useGrid(\"<DataGridEditor>\");\n const input = ref<HTMLInputElement>();\n onMounted(() => {\n const element = input.value;\n if (element) {\n element.focus();\n element.setSelectionRange(element.value.length, element.value.length);\n }\n });\n const finish = (then?: \"up\" | \"down\" | \"left\" | \"right\"): void => {\n grid.commitEdit(then);\n context.focus();\n };\n return () =>\n h(\"input\", {\n ref: input,\n value: grid.editor?.draft ?? \"\",\n \"aria-label\": props.label,\n \"data-editor\": \"\",\n onInput: (event: Event) => grid.updateDraft((event.target as HTMLInputElement).value),\n onBlur: () => {\n if (grid.editor) {\n grid.commitEdit();\n }\n },\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finish(event.shiftKey ? \"up\" : \"down\");\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n finish(event.shiftKey ? \"left\" : \"right\");\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n grid.cancelEdit();\n context.focus();\n }\n },\n });\n },\n});\n\n/**\n * A grid cell. A click selects it, Shift-click or dragging extends the range, and a double click\n * edits it. The `editor` slot replaces the default text box.\n */\nexport const DataGridCell = defineComponent({\n name: \"DataGridCell\",\n slots: Object as SlotsType<{\n default?: (props: GridCellSlotProps) => VNodeChild;\n editor?: (props: {\n draft: string;\n update: (draft: string) => void;\n commit: (then?: GridDirection) => unknown;\n cancel: () => void;\n }) => VNode[];\n }>,\n props: {\n row: rowProp,\n column: columnProp,\n as: asProp(\"td\"),\n /** The row's position on the page. Found by searching the rows when left out. */\n rowIndex: { type: Number as PropType<number | undefined>, default: undefined },\n /** The column's position among the visible columns. Found by searching when left out. */\n columnIndex: { type: Number as PropType<number | undefined>, default: undefined },\n },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataGridCell>\");\n const { grid, context } = useGrid(\"<DataGridCell>\");\n const element = ref<HTMLElement>();\n const position = () => ({\n row: props.rowIndex ?? table.rows.indexOf(props.row),\n column: props.columnIndex ?? table.columns.indexOf(props.column),\n });\n\n watch(\n () => grid.isFocused(position()),\n (focused) => {\n if (focused) {\n element.value?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n }\n },\n );\n\n return () => {\n const at = position();\n const { row, column } = props;\n const editing = grid.isEditing(at);\n const editable = column.isEditable(row.original);\n const value = row.getValue(column.id);\n const display = row.getDisplay(column.id);\n let content;\n if (editing) {\n content =\n slots.editor?.({\n draft: grid.editor?.draft ?? \"\",\n update: (draft: string) => grid.updateDraft(draft),\n commit: (then?: GridDirection) => grid.commitEdit(then),\n cancel: () => grid.cancelEdit(),\n }) ?? h(DataGridEditor, { label: `Edit ${column.header}` });\n } else {\n content = slots.default?.({ row, column, value, display, editable }) ?? display;\n }\n return h(\n props.as,\n {\n ref: element,\n id: cellId(context.id, at.row, at.column),\n role: \"gridcell\",\n \"aria-selected\": String(grid.isSelected(at)),\n \"aria-readonly\": editable ? undefined : \"true\",\n \"aria-colindex\": at.column + 1,\n \"data-column\": column.id,\n \"data-align\": column.align,\n \"data-focused\": flag(grid.isFocused(at)),\n \"data-selected\": flag(grid.isSelected(at)),\n \"data-editing\": flag(editing),\n \"data-readonly\": flag(!editable),\n style: columnStyle(column),\n onMousedown: (event: MouseEvent) => {\n if (editing || event.button !== 0) {\n return;\n }\n grid.focusCell(at, { extend: event.shiftKey });\n context.focus();\n },\n onMouseenter: (event: MouseEvent) => {\n if (event.buttons === 1 && !grid.editor) {\n grid.focusCell(at, { extend: true });\n }\n },\n onDblclick: () => {\n grid.focusCell(at);\n grid.startEdit();\n },\n },\n content,\n );\n };\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/shared.ts","../src/controls.ts","../src/virtual.ts","../src/table.ts","../src/grid.ts"],"sourcesContent":["import type { TableColumn, TableRow } from \"@vueye-table/core\";\nimport type { PropType } from \"vue\";\n\n/** The element a component renders. Every headless component accepts `as`. */\nexport const asProp = (tag: string) =>\n ({\n type: String,\n default: tag,\n }) as const;\n\n/** Columns of any row type; callbacks on a column make `TableColumn<unknown>` too narrow. */\nexport type AnyTableColumn = TableColumn<any>;\n\nexport const columnProp = {\n type: Object as PropType<AnyTableColumn>,\n required: true,\n} as const;\n\nexport const rowProp = {\n type: Object as PropType<TableRow<unknown>>,\n required: true,\n} as const;\n\n/** `data-*` attributes take strings; `undefined` leaves the attribute off. */\nexport function flag(value: boolean): \"\" | undefined {\n return value ? \"\" : undefined;\n}\n","import type { PageItem, SelectionCoverage, TableColumn } from \"@vueye-table/core\";\nimport { injectDataTable } from \"@vueye-table/vue\";\nimport { defineComponent, h, onScopeDispose, type PropType, type SlotsType, type VNode } from \"vue\";\n\nimport { asProp, flag, rowProp } from \"./shared\";\n\nfunction checkbox(props: {\n readonly checked: boolean;\n readonly indeterminate: boolean;\n readonly label: string;\n readonly disabled: boolean;\n readonly onChange: () => void;\n}) {\n return h(\"input\", {\n type: \"checkbox\",\n checked: props.checked,\n indeterminate: props.indeterminate,\n disabled: props.disabled,\n \"aria-label\": props.label,\n \"data-state\": props.indeterminate ? \"indeterminate\" : props.checked ? \"checked\" : \"unchecked\",\n onChange: props.onChange,\n });\n}\n\n/**\n * Selects or clears every row in the table's select-all scope. It shows the indeterminate state\n * when only some are selected. The slot receives the state to draw a custom control.\n */\nexport const DataTableSelectAll = defineComponent({\n name: \"DataTableSelectAll\",\n slots: Object as SlotsType<{\n default?: (props: { state: SelectionCoverage; toggle: () => void }) => VNode[];\n }>,\n props: { label: { type: String, default: \"Select all rows\" } },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableSelectAll>\");\n return () => {\n const state = table.allSelection;\n const toggle = (): void => table.toggleAll();\n return (\n slots.default?.({ state, toggle }) ??\n checkbox({\n checked: state === \"all\",\n indeterminate: state === \"some\",\n label: props.label,\n disabled: table.selectionMode !== \"multiple\" || table.rows.length === 0,\n onChange: toggle,\n })\n );\n };\n },\n});\n\n/** Selects or clears one row. */\nexport const DataTableSelectRow = defineComponent({\n name: \"DataTableSelectRow\",\n slots: Object as SlotsType<{\n default?: (props: { selected: boolean; toggle: () => void }) => VNode[];\n }>,\n props: { row: rowProp, label: { type: String, default: \"Select row\" } },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableSelectRow>\");\n return () => {\n const selected = table.isSelected(props.row.key);\n const toggle = (): void => table.toggleRow(props.row.key);\n return (\n slots.default?.({ selected, toggle }) ??\n checkbox({\n checked: selected,\n indeterminate: false,\n label: props.label,\n disabled: table.selectionMode === \"none\",\n onChange: toggle,\n })\n );\n };\n },\n});\n\n/**\n * A search box bound to the table's free-text search. `debounce` waits that many milliseconds\n * after the last keystroke before searching.\n */\nexport const DataTableSearch = defineComponent({\n name: \"DataTableSearch\",\n props: {\n debounce: { type: Number, default: 0 },\n label: { type: String, default: \"Search\" },\n placeholder: { type: String as PropType<string | undefined>, default: undefined },\n },\n setup(props) {\n const table = injectDataTable(\"<DataTableSearch>\");\n let timer: ReturnType<typeof setTimeout> | undefined;\n onScopeDispose(() => clearTimeout(timer));\n return () =>\n h(\"input\", {\n type: \"search\",\n value: table.state.search,\n placeholder: props.placeholder,\n \"aria-label\": props.label,\n onInput: (event: Event) => {\n const { value } = event.target as HTMLInputElement;\n clearTimeout(timer);\n if (props.debounce > 0) {\n timer = setTimeout(() => table.search(value), props.debounce);\n } else {\n table.search(value);\n }\n },\n });\n },\n});\n\n/**\n * Page navigation. The slot receives everything needed to draw custom controls; without one it\n * renders previous, numbered, and next buttons with `aria-current` on the current page.\n */\nexport const DataTablePagination = defineComponent({\n name: \"DataTablePagination\",\n slots: Object as SlotsType<{\n default?: (props: {\n page: number;\n pageCount: number;\n items: readonly PageItem[];\n canPrevious: boolean;\n canNext: boolean;\n goToPage: (page: number) => void;\n next: () => void;\n previous: () => void;\n }) => VNode[];\n }>,\n props: {\n as: asProp(\"nav\"),\n label: { type: String, default: \"Pagination\" },\n },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTablePagination>\");\n return () => {\n const slotProps = {\n page: table.page,\n pageCount: table.pageCount,\n items: table.pageItems,\n canPrevious: table.canPreviousPage,\n canNext: table.canNextPage,\n goToPage: table.goToPage,\n next: table.nextPage,\n previous: table.previousPage,\n };\n const button = (\n label: string,\n content: string,\n disabled: boolean,\n onClick: () => void,\n current = false,\n ) =>\n h(\n \"button\",\n {\n type: \"button\",\n disabled,\n \"aria-label\": label,\n \"aria-current\": current ? \"page\" : undefined,\n \"data-current\": flag(current),\n onClick,\n },\n content,\n );\n return h(\n props.as,\n { \"aria-label\": props.label },\n slots.default?.(slotProps) ?? [\n button(\"Previous page\", \"‹\", !table.canPreviousPage, table.previousPage),\n ...table.pageItems.map((item) =>\n item.type === \"gap\"\n ? h(\"span\", { key: item.key, \"aria-hidden\": \"true\", \"data-gap\": \"\" }, \"…\")\n : button(\n `Page ${item.page}`,\n String(item.page),\n false,\n () => table.goToPage(item.page),\n item.current,\n ),\n ),\n button(\"Next page\", \"›\", !table.canNextPage, table.nextPage),\n ],\n );\n };\n },\n});\n\n/** A page size picker. */\nexport const DataTablePageSize = defineComponent({\n name: \"DataTablePageSize\",\n props: {\n options: { type: Array as PropType<readonly number[]>, default: () => [5, 10, 20, 50] },\n label: { type: String, default: \"Rows per page\" },\n },\n setup(props) {\n const table = injectDataTable(\"<DataTablePageSize>\");\n return () => {\n const sizes = props.options.includes(table.pageSize)\n ? props.options\n : [...props.options, table.pageSize].toSorted((left, right) => left - right);\n return h(\n \"select\",\n {\n value: table.pageSize,\n \"aria-label\": props.label,\n onChange: (event: Event) =>\n table.setPageSize(Number((event.target as HTMLSelectElement).value)),\n },\n sizes.map((size) =>\n h(\"option\", { key: size, value: size, selected: size === table.pageSize }, String(size)),\n ),\n );\n };\n },\n});\n\n/** A checkbox per column that shows or hides it. The slot receives the columns and `toggle`. */\nexport const DataTableColumnVisibility = defineComponent({\n name: \"DataTableColumnVisibility\",\n slots: Object as SlotsType<{\n default?: (props: {\n columns: readonly { column: TableColumn<unknown>; visible: boolean }[];\n toggle: (columnId: string, visible?: boolean) => void;\n }) => VNode[];\n }>,\n props: { as: asProp(\"fieldset\"), legend: { type: String, default: \"Columns\" } },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableColumnVisibility>\");\n return () => {\n const hidden = new Set(table.state.hiddenColumns);\n const columns = table.allColumns.map((column) => ({\n column,\n visible: !hidden.has(column.id),\n }));\n return h(\n props.as,\n slots.default?.({ columns, toggle: table.toggleColumn }) ?? [\n props.as === \"fieldset\" ? h(\"legend\", props.legend) : null,\n ...columns.map(({ column, visible }) =>\n h(\"label\", { key: column.id, \"data-column\": column.id }, [\n h(\"input\", {\n type: \"checkbox\",\n checked: visible,\n disabled: visible && table.columns.length === 1,\n onChange: () => table.toggleColumn(column.id),\n }),\n column.header,\n ]),\n ),\n ],\n );\n };\n },\n});\n\n/**\n * A polite live region describing what is shown, such as \"1–10 of 57 rows\". Screen readers\n * announce it after a search, filter, or page change.\n */\nexport const DataTableStatus = defineComponent({\n name: \"DataTableStatus\",\n slots: Object as SlotsType<{\n default?: (props: {\n start: number;\n end: number;\n rowCount: number;\n totalRowCount: number;\n selectedCount: number;\n }) => VNode[];\n }>,\n props: { as: asProp(\"p\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableStatus>\");\n return () => {\n const slotProps = {\n start: table.pageStart,\n end: table.pageEnd,\n rowCount: table.rowCount,\n totalRowCount: table.totalRowCount,\n selectedCount: table.selectedCount,\n };\n const text =\n table.rowCount === 0\n ? \"No rows\"\n : `${table.pageStart}–${table.pageEnd} of ${table.rowCount} rows` +\n (table.selectedCount > 0 ? `, ${table.selectedCount} selected` : \"\");\n return h(\n props.as,\n { role: \"status\", \"aria-live\": \"polite\" },\n slots.default?.(slotProps) ?? text,\n );\n };\n },\n});\n","import type { TableColumn, TableRow } from \"@vueye-table/core\";\nimport {\n useVirtualColumns,\n useVirtualRows,\n type AnyDataTableBinding,\n type DataGridBinding,\n type VirtualBinding,\n type VirtualColumnItem,\n type VirtualRowItem,\n} from \"@vueye-table/vue\";\nimport {\n computed,\n defineComponent,\n h,\n inject,\n provide,\n shallowRef,\n type InjectionKey,\n type PropType,\n type ShallowRef,\n type SlotsType,\n type VNode,\n type VNodeChild,\n} from \"vue\";\n\nimport { asProp } from \"./shared\";\n\nexport interface ComponentVirtualOptions {\n readonly rowHeight?: number | ((index: number) => number) | undefined;\n readonly overscan?: number | undefined;\n readonly initialCount?: number | undefined;\n readonly columnWidth?: number | undefined;\n readonly columnOverscan?: number | undefined;\n readonly initialColumnCount?: number | undefined;\n}\n\n/** Shared opt-in renderer props. Options are applied when the virtual renderer is created. */\nexport const virtualProps = {\n virtual: {\n type: [Boolean, Object] as PropType<boolean | ComponentVirtualOptions>,\n default: false,\n },\n height: { type: String as PropType<string | undefined>, default: undefined },\n rowHeight: { type: Number, default: 40 },\n overscan: { type: Number, default: 5 },\n virtualColumns: { type: Boolean, default: false },\n columnWidth: { type: Number, default: 120 },\n} as const;\n\nexport function virtualOptions(props: {\n readonly virtual: boolean | ComponentVirtualOptions;\n readonly rowHeight: number;\n readonly overscan: number;\n readonly columnWidth: number;\n}): ComponentVirtualOptions {\n return {\n rowHeight: props.rowHeight,\n overscan: props.overscan,\n columnWidth: props.columnWidth,\n ...(typeof props.virtual === \"object\" ? props.virtual : {}),\n };\n}\n\nconst viewportKey: InjectionKey<ShallowRef<HTMLElement | null | undefined>> = Symbol(\"vt-viewport\");\nexport interface ComponentVirtualBinding {\n readonly rows: VirtualBinding<VirtualRowItem<unknown>>;\n readonly columns: VirtualBinding<VirtualColumnItem<unknown>> | undefined;\n readonly rowItems: readonly VirtualRowItem<unknown>[];\n readonly columnItems: readonly VirtualColumnItem<unknown>[] | undefined;\n readonly gutter: number;\n}\nconst virtualKey: InjectionKey<ComponentVirtualBinding> = Symbol(\"vt-virtual-renderer\");\nexport function injectVirtual(): ComponentVirtualBinding | undefined {\n return inject(virtualKey, undefined);\n}\n\n/** A scroll container for a headless table/grid. It supplies its element without global reads. */\nexport const DataTableViewport = defineComponent({\n name: \"DataTableViewport\",\n slots: Object as SlotsType<{ default?: () => VNode[] }>,\n props: { as: asProp(\"div\"), height: { type: String, default: \"24rem\" } },\n setup(props, { slots, expose }) {\n const element = shallowRef<HTMLElement | null>(null);\n provide(viewportKey, element);\n expose({ element });\n return () =>\n h(\n props.as,\n {\n ref: element,\n \"data-virtual-viewport\": \"\",\n style: { height: props.height, overflow: \"auto\", overflowAnchor: \"none\" },\n },\n slots.default?.(),\n );\n },\n});\n\nexport function createComponentVirtual(\n table: AnyDataTableBinding,\n options: ComponentVirtualOptions,\n tableElement: () => HTMLElement | null | undefined,\n grid?: DataGridBinding<unknown>,\n virtualColumns = false,\n gutter = 0,\n): ComponentVirtualBinding {\n const scrollElement = inject(viewportKey, shallowRef<HTMLElement | null>(null));\n const rows = useVirtualRows(table, {\n scrollElement,\n estimateRowHeight: options.rowHeight,\n overscan: options.overscan,\n initialCount: options.initialCount,\n grid,\n scrollMargin: () => tableElement()?.querySelector(\"thead\")?.getBoundingClientRect().height ?? 0,\n });\n const columns =\n grid && virtualColumns\n ? useVirtualColumns(grid, {\n scrollElement,\n estimateColumnWidth: (index) => table.columns[index]?.width ?? options.columnWidth ?? 120,\n overscan: options.columnOverscan ?? 1,\n initialCount: options.initialColumnCount ?? 5,\n scrollMargin: gutter,\n })\n : undefined;\n const pinnedRows = computed(() => {\n const result = [...rows.items];\n const positions = new Set([grid?.selection?.focus.row, grid?.editor?.position.row]);\n for (const position of positions) {\n if (\n position === undefined ||\n result.some(\n (item) => item.renderItem.kind === \"row\" && item.renderItem.rowIndex === position,\n )\n )\n continue;\n const direct = table.renderItems[position];\n const index =\n direct?.kind === \"row\" && direct.rowIndex === position\n ? position\n : table.renderItems.findIndex(\n (item) => item.kind === \"row\" && item.rowIndex === position,\n );\n const item = rows.getItem(index);\n if (item) result.push(item);\n }\n return result.sort((a, b) => a.index - b.index);\n });\n const pinnedColumns = computed(() => {\n if (!columns) return undefined;\n const result = [...columns.items];\n const positions = new Set([grid?.selection?.focus.column, grid?.editor?.position.column]);\n for (const position of positions) {\n if (position === undefined || result.some((item) => item.index === position)) continue;\n const item = columns.getItem(position);\n if (item) result.push(item);\n }\n return result.sort((a, b) => a.index - b.index);\n });\n const binding: ComponentVirtualBinding = {\n rows,\n columns,\n gutter,\n get rowItems() {\n return pinnedRows.value;\n },\n get columnItems() {\n return pinnedColumns.value;\n },\n };\n provide(virtualKey, binding);\n return binding;\n}\n\n/** Create composables only for an enabled renderer, preserving the ordinary component path. */\nexport const VirtualContent = defineComponent({\n name: \"DataTableVirtualContent\",\n props: {\n table: { type: Object as PropType<AnyDataTableBinding>, required: true },\n options: { type: Object as PropType<ComponentVirtualOptions>, required: true },\n tableElement: {\n type: Function as PropType<() => HTMLElement | null | undefined>,\n required: true,\n },\n grid: { type: Object as PropType<DataGridBinding<unknown>>, default: undefined },\n virtualColumns: { type: Boolean, default: false },\n gutter: { type: Number, default: 0 },\n render: {\n type: Function as PropType<(binding: ComponentVirtualBinding) => VNode>,\n required: true,\n },\n },\n setup(props) {\n const binding = createComponentVirtual(\n props.table,\n props.options,\n props.tableElement,\n props.grid,\n props.virtualColumns,\n props.gutter,\n );\n return () => props.render(binding);\n },\n});\n\nexport function rowSpacer(size: number, colspan: number, key: string): VNode | null {\n return size > 0\n ? h(\n \"tr\",\n {\n key,\n \"aria-hidden\": \"true\",\n role: \"presentation\",\n \"data-virtual-spacer\": \"\",\n style: { height: `${size}px` },\n },\n [\n h(\"td\", {\n colspan: Math.max(1, colspan),\n style: { height: `${size}px`, padding: \"0\", border: \"0\", lineHeight: \"0\" },\n }),\n ],\n )\n : null;\n}\nexport function columnSpacer(size: number, tag: \"th\" | \"td\", key: string): VNode | null {\n return size > 0\n ? h(tag, {\n key,\n \"aria-hidden\": \"true\",\n role: \"presentation\",\n \"data-virtual-spacer\": \"\",\n style: { width: `${size}px`, minWidth: `${size}px`, padding: \"0\", border: \"0\" },\n })\n : null;\n}\nexport function renderColumns(\n tableColumns: readonly TableColumn<unknown>[],\n binding: ComponentVirtualBinding | undefined,\n render: (column: TableColumn<unknown>, index: number) => VNodeChild,\n tag: \"th\" | \"td\",\n): VNodeChild[] {\n if (!binding?.columns || !binding.columnItems) return tableColumns.map(render);\n const result: VNodeChild[] = [];\n let end = 0;\n for (const item of binding.columnItems) {\n result.push(\n columnSpacer(item.start - end, tag, `gap-${item.index}`),\n render(item.column, item.index),\n );\n end = item.start + item.size;\n }\n result.push(columnSpacer(binding.columns.totalSize - end, tag, \"gap-end\"));\n return result;\n}\nexport function renderRows(\n binding: ComponentVirtualBinding,\n colspan: number,\n render: (item: VirtualRowItem<unknown>) => VNodeChild,\n): VNodeChild[] {\n const result: VNodeChild[] = [];\n let end = 0;\n for (const item of binding.rowItems) {\n result.push(rowSpacer(item.start - end, colspan, `gap-${item.index}`), render(item));\n end = item.start + item.size;\n }\n result.push(rowSpacer(binding.rows.totalSize - end, colspan, \"gap-end\"));\n return result;\n}\nexport function virtualColgroup(\n tableColumns: readonly TableColumn<unknown>[],\n binding: ComponentVirtualBinding,\n): VNode | null {\n if (!binding.columns || !binding.columnItems) return null;\n const cols: VNodeChild[] = binding.gutter\n ? [h(\"col\", { style: { width: `${binding.gutter}px` } })]\n : [];\n let end = 0;\n for (const item of binding.columnItems) {\n if (item.start > end) cols.push(h(\"col\", { style: { width: `${item.start - end}px` } }));\n cols.push(h(\"col\", { style: { width: `${item.size}px` } }));\n end = item.start + item.size;\n }\n if (binding.columns.totalSize > end)\n cols.push(h(\"col\", { style: { width: `${binding.columns.totalSize - end}px` } }));\n void tableColumns;\n return h(\"colgroup\", cols);\n}\nexport function virtualRow(\n binding: ComponentVirtualBinding,\n row: TableRow<unknown>,\n): VirtualRowItem<unknown> | undefined {\n return binding.rowItems.find(\n (item) => item.renderItem.kind === \"row\" && item.renderItem.row.key === row.key,\n );\n}\n","import type { SortInfo, TableColumn, TableRow } from \"@vueye-table/core\";\nimport {\n injectDataTable,\n provideDataTable,\n type AnyDataTableBinding,\n type DataTableBinding,\n} from \"@vueye-table/vue\";\nimport {\n defineComponent,\n Fragment,\n h,\n shallowRef,\n type PropType,\n type ShallowRef,\n type SlotsType,\n type VNode,\n type ComponentPublicInstance,\n} from \"vue\";\n\nimport { asProp, columnProp, flag, rowProp } from \"./shared\";\nimport {\n createComponentVirtual,\n injectVirtual,\n renderColumns,\n renderRows,\n rowSpacer,\n virtualProps,\n virtualOptions,\n virtualRow,\n VirtualContent,\n type ComponentVirtualBinding,\n} from \"./virtual\";\n\n/**\n * Provides a table to the components inside it and renders the table element. Without a default\n * slot it renders a complete header and body.\n */\nexport const DataTableRoot = defineComponent({\n name: \"DataTableRoot\",\n slots: Object as SlotsType<{\n default?: (props: { table: DataTableBinding<unknown> }) => VNode[];\n }>,\n props: {\n table: { type: Object as PropType<AnyDataTableBinding>, required: true },\n as: asProp(\"table\"),\n ...virtualProps,\n },\n setup(props, { slots }) {\n provideDataTable(props.table);\n const element = shallowRef<HTMLElement>();\n const render = (virtual?: ComponentVirtualBinding) =>\n h(\n props.as,\n {\n \"aria-rowcount\": props.table.rowCount + 1,\n \"aria-colcount\": props.table.columns.length,\n \"data-empty\": flag(props.table.rowCount === 0),\n ...(virtual ? { ref: element, \"data-virtual\": \"\" } : {}),\n },\n slots.default?.({ table: props.table }) ?? [h(DataTableHeader), h(DataTableBody)],\n );\n return () =>\n props.virtual\n ? h(VirtualContent, {\n table: props.table,\n options: virtualOptions(props),\n tableElement: () => element.value,\n render,\n })\n : render();\n },\n});\n\nexport const DataTableCaption = defineComponent({\n name: \"DataTableCaption\",\n slots: Object as SlotsType<{ default?: () => VNode[] }>,\n props: { as: asProp(\"caption\") },\n setup(props, { slots }) {\n return () => h(props.as, slots.default?.());\n },\n});\n\n/** The header section. Without a slot it renders one header cell per visible column. */\nexport const DataTableHeader = defineComponent({\n name: \"DataTableHeader\",\n slots: Object as SlotsType<{\n default?: (props: { columns: readonly TableColumn<unknown>[] }) => VNode[];\n }>,\n props: { as: asProp(\"thead\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableHeader>\");\n const virtual = injectVirtual();\n return () =>\n h(\n props.as,\n slots.default?.({ columns: table.columns }) ??\n h(DataTableHeaderRow, () =>\n virtual?.columns\n ? h(DataTableVirtualColumns, null, {\n default: ({ column }: { column: TableColumn<unknown> }) => [\n h(DataTableHeaderCell, { key: column.id, column }),\n ],\n })\n : table.columns.map((column) => h(DataTableHeaderCell, { key: column.id, column })),\n ),\n );\n },\n});\n\nexport const DataTableHeaderRow = defineComponent({\n name: \"DataTableHeaderRow\",\n slots: Object as SlotsType<{ default?: () => VNode[] }>,\n props: { as: asProp(\"tr\") },\n setup(props, { slots }) {\n return () => h(props.as, { \"aria-rowindex\": 1 }, slots.default?.());\n },\n});\n\n/** Shared header/body column slice, with native spacer cells for omitted columns. */\nexport const DataTableVirtualColumns = defineComponent({\n name: \"DataTableVirtualColumns\",\n slots: Object as SlotsType<{\n default?: (props: { column: TableColumn<unknown>; index: number }) => VNode[];\n }>,\n props: { as: { type: String as PropType<\"th\" | \"td\">, default: \"th\" } },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableVirtualColumns>\");\n const virtual = injectVirtual();\n return () =>\n h(\n Fragment,\n renderColumns(\n table.columns,\n virtual,\n (column, index) => slots.default?.({ column, index }),\n props.as,\n ),\n );\n },\n});\n\n/**\n * A column header with `aria-sort`. Without a slot it shows the header text inside a sort button\n * for sortable columns.\n */\nexport const DataTableHeaderCell = defineComponent({\n name: \"DataTableHeaderCell\",\n slots: Object as SlotsType<{\n default?: (props: {\n column: TableColumn<unknown>;\n sort: SortInfo | undefined;\n toggleSort: (multi?: boolean) => void;\n }) => VNode[];\n }>,\n props: { column: columnProp, as: asProp(\"th\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableHeaderCell>\");\n const virtual = injectVirtual();\n return () => {\n const { column } = props;\n const sort = table.getSort(column.id);\n const ariaSort = sort\n ? sort.direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : column.sortable\n ? \"none\"\n : undefined;\n const content =\n slots.default?.({\n column,\n sort,\n toggleSort: (multi = false) => table.toggleSort(column.id, { multi }),\n }) ??\n (column.sortable ? h(DataTableSortButton, { column }, () => column.header) : column.header);\n return h(\n props.as,\n {\n scope: \"col\",\n \"aria-sort\": ariaSort,\n \"data-column\": column.id,\n \"data-align\": column.align,\n \"data-sortable\": flag(column.sortable),\n \"data-sort\": sort?.direction,\n style: columnStyle(column),\n ...(virtual?.columns ? { \"aria-colindex\": table.columns.indexOf(column) + 1 } : {}),\n },\n content,\n );\n };\n },\n});\n\nexport function columnStyle(column: TableColumn<unknown>): Record<string, string> | undefined {\n const style: Record<string, string> = {};\n if (column.width !== undefined) {\n style[\"width\"] = `${column.width}px`;\n }\n if (column.minWidth !== undefined) {\n style[\"minWidth\"] = `${column.minWidth}px`;\n }\n return Object.keys(style).length > 0 ? style : undefined;\n}\n\n/**\n * Toggles a column's sort. Shift-click adds the column to the existing sort instead of replacing\n * it. The slot receives the current sort so it can draw an indicator.\n */\nexport const DataTableSortButton = defineComponent({\n name: \"DataTableSortButton\",\n slots: Object as SlotsType<{\n default?: (props: { sort: SortInfo | undefined }) => VNode[];\n indicator?: (props: { sort: SortInfo | undefined }) => VNode[];\n }>,\n props: { column: columnProp, as: asProp(\"button\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableSortButton>\");\n return () => {\n const sort = table.getSort(props.column.id);\n const next = !sort ? \"ascending\" : sort.direction === \"asc\" ? \"descending\" : \"unsorted\";\n return h(\n props.as,\n {\n type: props.as === \"button\" ? \"button\" : undefined,\n \"data-sort\": sort?.direction,\n \"aria-label\": `${props.column.header}, sort ${next}`,\n onClick: (event: MouseEvent) =>\n table.toggleSort(props.column.id, { multi: event.shiftKey }),\n },\n [slots.default?.({ sort }) ?? props.column.header, slots.indicator?.({ sort })],\n );\n };\n },\n});\n\n/**\n * The body section. Without a slot it renders a row per row on the page, and the `empty` slot in\n * a full-width row when there are none.\n */\nexport const DataTableBody = defineComponent({\n name: \"DataTableBody\",\n slots: Object as SlotsType<{\n default?: (props: { rows: readonly TableRow<unknown>[] }) => VNode[];\n empty?: () => VNode[];\n detail?: (props: { row: TableRow<unknown>; rowIndex: number }) => VNode[];\n }>,\n props: {\n as: asProp(\"tbody\"),\n ...virtualProps,\n colspan: { type: Number as PropType<number | undefined>, default: undefined },\n },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableBody>\");\n const virtual = injectVirtual();\n return () => {\n if (props.virtual && !virtual) return h(VirtualDataTableBody, props, slots);\n if (virtual) return renderTableBody(table, virtual, props.as, props.colspan, slots);\n let content: VNode[] | VNode | undefined = slots.default?.({ rows: table.rows });\n if (!content) {\n content =\n table.rows.length === 0 && slots.empty\n ? h(\"tr\", { \"data-empty\": \"\" }, [\n h(\"td\", { colspan: Math.max(1, table.columns.length) }, slots.empty()),\n ])\n : table.rows.map((row) => h(DataTableRow, { key: row.key, row }));\n }\n return h(props.as, content);\n };\n },\n});\n\ntype TableBodySlots = {\n default?: (props: { rows: readonly TableRow<unknown>[] }) => VNode[];\n empty?: () => VNode[];\n detail?: (props: { row: TableRow<unknown>; rowIndex: number }) => VNode[];\n};\nfunction renderTableBody(\n table: DataTableBinding<unknown>,\n virtual: ComponentVirtualBinding,\n as: string,\n colspan: number | undefined,\n slots: TableBodySlots,\n element?: ShallowRef<HTMLElement | undefined>,\n): VNode {\n const width = colspan ?? table.columns.length;\n const attrs = element ? { ref: element } : {};\n const content = slots.default?.({\n rows: virtual.rowItems\n .filter((item) => item.renderItem.kind === \"row\")\n .map((item) => item.renderItem.row),\n });\n if (table.rows.length === 0 && slots.empty)\n return h(\n as,\n attrs,\n h(\"tr\", { \"data-empty\": \"\" }, [h(\"td\", { colspan: Math.max(1, width) }, slots.empty())]),\n );\n if (content)\n return h(as, attrs, [\n rowSpacer(virtual.rows.paddingStart, width, \"gap-start\"),\n ...content,\n rowSpacer(virtual.rows.paddingEnd, width, \"gap-end\"),\n ]);\n return h(\n as,\n attrs,\n renderRows(virtual, width, (item) =>\n item.renderItem.kind === \"row\"\n ? h(DataTableRow, {\n key: item.key,\n row: item.renderItem.row,\n rowIndex: item.renderItem.rowIndex,\n })\n : h(\n \"tr\",\n {\n key: item.key,\n \"data-detail\": \"\",\n ref: (target) => virtual.rows.measureElement(target, item.key),\n },\n [h(\"td\", { colspan: Math.max(1, width) }, slots.detail?.(item.renderItem))],\n ),\n ),\n );\n}\nconst VirtualDataTableBody = defineComponent({\n name: \"DataTableVirtualBody\",\n props: {\n as: asProp(\"tbody\"),\n ...virtualProps,\n colspan: { type: Number as PropType<number | undefined>, default: undefined },\n },\n slots: Object as SlotsType<TableBodySlots>,\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableBody>\");\n const element = shallowRef<HTMLElement>();\n const virtual = createComponentVirtual(table, virtualOptions(props), () =>\n element.value?.closest(\"table\"),\n );\n return () => renderTableBody(table, virtual, props.as, props.colspan, slots, element);\n },\n});\n\n/** A body row; `aria-selected` and `data-selected` follow the selection. */\nexport const DataTableRow = defineComponent({\n name: \"DataTableRow\",\n slots: Object as SlotsType<{\n default?: (props: {\n row: TableRow<unknown>;\n selected: boolean;\n columns: readonly TableColumn<unknown>[];\n }) => VNode[];\n }>,\n props: {\n row: rowProp,\n as: asProp(\"tr\"),\n rowIndex: { type: Number as PropType<number | undefined>, default: undefined },\n },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableRow>\");\n const virtual = injectVirtual();\n return () => {\n const { row } = props;\n const selected = table.isSelected(row.key);\n const item = virtual ? virtualRow(virtual, row) : undefined;\n const position = props.rowIndex ?? item?.renderItem.rowIndex ?? table.rows.indexOf(row);\n return h(\n props.as,\n {\n \"aria-rowindex\": position === -1 ? undefined : table.pageStart + position + 1,\n \"aria-selected\": table.selectionMode === \"none\" ? undefined : String(selected),\n \"data-selected\": flag(selected),\n \"data-key\": String(row.key),\n ...(virtual && item\n ? {\n ref: (element: Element | ComponentPublicInstance | null) =>\n virtual.rows.measureElement(element, item.key),\n \"data-virtual-row\": \"\",\n }\n : {}),\n },\n slots.default?.({ row, selected, columns: table.columns }) ??\n table.columns.map((column) => h(DataTableCell, { key: column.id, row, column })),\n );\n };\n },\n});\n\n/** A body cell. The slot receives the raw value and the formatted text. */\nexport const DataTableCell = defineComponent({\n name: \"DataTableCell\",\n slots: Object as SlotsType<{\n default?: (props: {\n row: TableRow<unknown>;\n column: TableColumn<unknown>;\n value: unknown;\n display: string;\n }) => VNode[];\n }>,\n props: { row: rowProp, column: columnProp, as: asProp(\"td\") },\n setup(props, { slots }) {\n return () => {\n const { row, column } = props;\n const value = row.getValue(column.id);\n const display = row.getDisplay(column.id);\n return h(\n props.as,\n { \"data-column\": column.id, \"data-align\": column.align },\n slots.default?.({ row, column, value, display }) ?? display,\n );\n };\n },\n});\n\n/** Renders its slot only when no row passes the search and filters. */\nexport const DataTableEmpty = defineComponent({\n name: \"DataTableEmpty\",\n slots: Object as SlotsType<{ default?: () => VNode[] }>,\n props: { as: asProp(\"div\") },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataTableEmpty>\");\n return () => (table.rowCount === 0 ? h(props.as, { role: \"status\" }, slots.default?.()) : null);\n },\n});\n","import type { GridDirection, TableColumn, TableRow } from \"@vueye-table/core\";\nimport {\n injectDataGrid,\n injectDataTable,\n provideDataGrid,\n provideDataTable,\n useDataGrid,\n type DataGridBinding,\n type AnyDataTableBinding,\n type DataTableBinding,\n} from \"@vueye-table/vue\";\nimport {\n defineComponent,\n h,\n inject,\n nextTick,\n onMounted,\n provide,\n ref,\n useId,\n watch,\n type InjectionKey,\n type PropType,\n type SlotsType,\n type VNode,\n type VNodeChild,\n} from \"vue\";\n\nimport { asProp, columnProp, flag, rowProp } from \"./shared\";\nimport { columnStyle, DataTableHeader } from \"./table\";\nimport {\n injectVirtual,\n renderColumns,\n renderRows,\n virtualColgroup,\n virtualOptions,\n virtualProps,\n VirtualContent,\n type ComponentVirtualBinding,\n} from \"./virtual\";\n\ninterface GridContext {\n readonly id: string;\n /** Return keyboard focus to the grid, after an edit ends from the keyboard. */\n focus(): void;\n}\n\nconst gridContextKey: InjectionKey<GridContext> = Symbol(\"vueye-table-grid-context\");\n\nfunction useGrid(consumer: string): { grid: DataGridBinding<unknown>; context: GridContext } {\n const grid = injectDataGrid();\n const context = inject(gridContextKey, undefined);\n if (!grid || !context) {\n throw new Error(`${consumer} must be rendered inside <DataGridRoot>.`);\n }\n return { grid, context };\n}\n\nexport function cellId(gridId: string, row: number, column: number): string {\n return `${gridId}-r${row}-c${column}`;\n}\n\n/**\n * A spreadsheet grid over a table. The grid element keeps keyboard focus and points at the active\n * cell with `aria-activedescendant`; arrows, Tab, Home, End, Enter, F2, Delete, Escape, typing,\n * undo, redo, and clipboard copy, cut, and paste all work on the selected range.\n */\nexport const DataGridRoot = defineComponent({\n name: \"DataGridRoot\",\n slots: Object as SlotsType<{\n default?: (props: {\n table: DataTableBinding<unknown>;\n grid: DataGridBinding<unknown>;\n }) => VNode[];\n }>,\n props: {\n table: { type: Object as PropType<AnyDataTableBinding>, required: true },\n as: asProp(\"table\"),\n label: { type: String as PropType<string | undefined>, default: undefined },\n ...virtualProps,\n /** Width reserved before data columns, for a row-number/header column. */\n gutter: { type: Number, default: 0 },\n },\n setup(props, { slots, expose }) {\n provideDataTable(props.table);\n const grid = useDataGrid(props.table);\n provideDataGrid(grid);\n const element = ref<HTMLElement>();\n const id = `vt-grid-${useId()}`;\n const focus = (): void => {\n void nextTick(() => element.value?.focus());\n };\n provide(gridContextKey, { id, focus });\n expose({ grid, focus });\n let virtual: ComponentVirtualBinding | undefined;\n\n const onKeydown = (event: KeyboardEvent): void => {\n if (event.target !== element.value) {\n return;\n }\n if (\n virtual &&\n !grid.editor &&\n (event.ctrlKey || event.metaKey) &&\n (event.key === \"Home\" || event.key === \"End\")\n ) {\n grid.focusCell(\n event.key === \"Home\"\n ? { row: 0, column: 0 }\n : { row: props.table.rows.length - 1, column: props.table.columns.length - 1 },\n { extend: event.shiftKey },\n );\n event.preventDefault();\n return;\n }\n if (virtual && !grid.editor && (event.key === \"PageUp\" || event.key === \"PageDown\")) {\n const current = grid.selection?.focus ?? { row: 0, column: 0 };\n const item = virtual.rowItems.find((entry) => entry.renderItem.rowIndex === current.row);\n const step = Math.max(\n 1,\n Math.floor(virtual.rows.viewportSize / (item?.size ?? props.rowHeight)),\n );\n grid.focusCell(\n { row: current.row + (event.key === \"PageDown\" ? step : -step), column: current.column },\n { extend: event.shiftKey },\n );\n event.preventDefault();\n return;\n }\n if (grid.handleKey(event)) {\n event.preventDefault();\n }\n };\n const onCopy = (event: ClipboardEvent, cut = false): void => {\n if (grid.editor || !grid.range || !event.clipboardData) {\n return;\n }\n event.clipboardData.setData(\"text/plain\", grid.copy());\n event.preventDefault();\n if (cut) {\n grid.clear();\n }\n };\n const onPaste = (event: ClipboardEvent): void => {\n const text = event.clipboardData?.getData(\"text/plain\");\n if (grid.editor || text === undefined || text === \"\") {\n return;\n }\n event.preventDefault();\n grid.paste(text);\n };\n\n const render = (binding?: ComponentVirtualBinding): VNode => {\n virtual = binding;\n const focusPosition = grid.selection?.focus;\n return h(\n props.as,\n {\n ref: element,\n id,\n role: \"grid\",\n tabindex: 0,\n \"aria-label\": props.label,\n \"aria-multiselectable\": \"true\",\n \"aria-rowcount\": (binding ? props.table.rowCount : props.table.rows.length) + 1,\n \"aria-colcount\": props.table.columns.length,\n \"aria-activedescendant\":\n focusPosition && !grid.editor\n ? cellId(id, focusPosition.row, focusPosition.column)\n : undefined,\n onKeydown,\n onCopy: (event: ClipboardEvent) => onCopy(event),\n onCut: (event: ClipboardEvent) => onCopy(event, true),\n onPaste,\n ...(binding\n ? {\n \"data-virtual\": \"\",\n style: binding.columns\n ? {\n tableLayout: \"fixed\",\n width: `${binding.columns.totalSize + binding.gutter}px`,\n }\n : undefined,\n }\n : {}),\n },\n binding\n ? [\n virtualColgroup(props.table.columns, binding),\n slots.default?.({ table: props.table, grid }) ?? [\n h(DataTableHeader),\n h(DataGridBody),\n ],\n ]\n : (slots.default?.({ table: props.table, grid }) ?? [\n h(DataTableHeader),\n h(DataGridBody),\n ]),\n );\n };\n return () =>\n props.virtual\n ? h(VirtualContent, {\n table: props.table,\n grid,\n options: virtualOptions(props),\n virtualColumns: props.virtualColumns,\n gutter: props.gutter,\n tableElement: () => element.value,\n render,\n })\n : render();\n },\n});\n\n/** Slot props of a grid cell's content, while it is not being edited. */\nexport interface GridCellSlotProps {\n readonly row: TableRow<unknown>;\n readonly column: TableColumn<unknown>;\n readonly value: unknown;\n readonly display: string;\n readonly editable: boolean;\n}\n\n/**\n * The grid body: a row of cells per row on the page. The `cell` slot draws the content of every\n * cell that is not being edited; the `rowHeader` slot adds a leading cell to each row.\n */\nexport const DataGridBody = defineComponent({\n name: \"DataGridBody\",\n slots: Object as SlotsType<{\n default?: (props: { rows: readonly TableRow<unknown>[] }) => VNode[];\n rowHeader?: (props: { row: TableRow<unknown>; index: number }) => VNode[];\n cell?: (props: GridCellSlotProps) => VNodeChild;\n }>,\n props: { as: asProp(\"tbody\"), ...virtualProps, colspan: { type: Number, default: undefined } },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataGridBody>\");\n const { grid } = useGrid(\"<DataGridBody>\");\n const virtual = injectVirtual();\n const element = ref<HTMLElement>();\n const render = (binding?: ComponentVirtualBinding): VNode => {\n if (binding && slots.default)\n return h(\n props.as,\n { ref: element },\n slots.default({\n rows: binding.rowItems\n .filter((item) => item.renderItem.kind === \"row\")\n .map((item) => item.renderItem.row),\n }),\n );\n if (binding)\n return h(\n props.as,\n { ref: element },\n renderRows(\n binding,\n props.colspan ?? table.columns.length + (slots.rowHeader ? 1 : 0),\n (item) => {\n if (item.renderItem.kind !== \"row\")\n return h(\n \"tr\",\n {\n key: item.key,\n \"aria-hidden\": \"true\",\n \"data-detail\": \"\",\n style: { height: `${item.size}px` },\n },\n [\n h(\"td\", {\n colspan: Math.max(1, table.columns.length),\n style: { padding: \"0\" },\n }),\n ],\n );\n const { row, rowIndex } = item.renderItem;\n const columns = renderColumns(\n table.columns,\n binding,\n (column, columnIndex) =>\n h(\n DataGridCell,\n { key: column.id, row, column, rowIndex, columnIndex },\n slots.cell\n ? { default: (cellProps: GridCellSlotProps) => slots.cell?.(cellProps) }\n : undefined,\n ),\n \"td\",\n );\n return h(\n \"tr\",\n {\n key: item.key,\n role: \"row\",\n \"aria-rowindex\": table.pageStart + rowIndex + 1,\n \"data-key\": String(row.key),\n \"data-virtual-row\": \"\",\n ref: (target) => binding.rows.measureElement(target, item.key),\n },\n [slots.rowHeader?.({ row, index: rowIndex }), ...columns],\n );\n },\n ),\n );\n return h(\n props.as,\n slots.default?.({ rows: table.rows }) ??\n table.rows.map((row, rowIndex) =>\n h(\n \"tr\",\n {\n key: row.key,\n role: \"row\",\n \"aria-rowindex\": rowIndex + 2,\n \"data-key\": String(row.key),\n },\n [\n slots.rowHeader?.({ row, index: rowIndex }),\n ...table.columns.map((column, columnIndex) =>\n h(\n DataGridCell,\n { key: column.id, row, column, rowIndex, columnIndex },\n slots.cell\n ? { default: (cellProps: GridCellSlotProps) => slots.cell?.(cellProps) }\n : undefined,\n ),\n ),\n ],\n ),\n ),\n );\n };\n return () =>\n props.virtual && !virtual\n ? h(VirtualContent, {\n table,\n grid,\n options: virtualOptions(props),\n tableElement: () => element.value?.closest(\"table\"),\n render,\n })\n : render(virtual);\n },\n});\n\n/** The text box shown in a cell while it is edited. */\nconst DataGridEditor = defineComponent({\n name: \"DataGridEditor\",\n props: { label: { type: String, required: true } },\n setup(props) {\n const { grid, context } = useGrid(\"<DataGridEditor>\");\n const input = ref<HTMLInputElement>();\n onMounted(() => {\n const element = input.value;\n if (element) {\n element.focus();\n element.setSelectionRange(element.value.length, element.value.length);\n }\n });\n const finish = (then?: \"up\" | \"down\" | \"left\" | \"right\"): void => {\n grid.commitEdit(then);\n context.focus();\n };\n return () =>\n h(\"input\", {\n ref: input,\n value: grid.editor?.draft ?? \"\",\n \"aria-label\": props.label,\n \"data-editor\": \"\",\n onInput: (event: Event) => grid.updateDraft((event.target as HTMLInputElement).value),\n onBlur: () => {\n if (grid.editor) {\n grid.commitEdit();\n }\n },\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n finish(event.shiftKey ? \"up\" : \"down\");\n } else if (event.key === \"Tab\") {\n event.preventDefault();\n finish(event.shiftKey ? \"left\" : \"right\");\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n grid.cancelEdit();\n context.focus();\n }\n },\n });\n },\n});\n\n/**\n * A grid cell. A click selects it, Shift-click or dragging extends the range, and a double click\n * edits it. The `editor` slot replaces the default text box.\n */\nexport const DataGridCell = defineComponent({\n name: \"DataGridCell\",\n slots: Object as SlotsType<{\n default?: (props: GridCellSlotProps) => VNodeChild;\n editor?: (props: {\n draft: string;\n update: (draft: string) => void;\n commit: (then?: GridDirection) => unknown;\n cancel: () => void;\n }) => VNode[];\n }>,\n props: {\n row: rowProp,\n column: columnProp,\n as: asProp(\"td\"),\n /** The row's position on the page. Found by searching the rows when left out. */\n rowIndex: { type: Number as PropType<number | undefined>, default: undefined },\n /** The column's position among the visible columns. Found by searching when left out. */\n columnIndex: { type: Number as PropType<number | undefined>, default: undefined },\n },\n setup(props, { slots }) {\n const table = injectDataTable(\"<DataGridCell>\");\n const { grid, context } = useGrid(\"<DataGridCell>\");\n const virtual = injectVirtual();\n const element = ref<HTMLElement>();\n const position = () => ({\n row: props.rowIndex ?? table.rows.indexOf(props.row),\n column: props.columnIndex ?? table.columns.indexOf(props.column),\n });\n\n watch(\n () => grid.isFocused(position()),\n (focused) => {\n if (focused && !virtual) {\n element.value?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n }\n },\n );\n\n return () => {\n const at = position();\n const { row, column } = props;\n const editing = grid.isEditing(at);\n const editable = column.isEditable(row.original);\n const value = row.getValue(column.id);\n const display = row.getDisplay(column.id);\n let content;\n if (editing) {\n content =\n slots.editor?.({\n draft: grid.editor?.draft ?? \"\",\n update: (draft: string) => grid.updateDraft(draft),\n commit: (then?: GridDirection) => grid.commitEdit(then),\n cancel: () => grid.cancelEdit(),\n }) ?? h(DataGridEditor, { label: `Edit ${column.header}` });\n } else {\n content = slots.default?.({ row, column, value, display, editable }) ?? display;\n }\n return h(\n props.as,\n {\n ref: element,\n id: cellId(context.id, at.row, at.column),\n role: \"gridcell\",\n \"aria-selected\": String(grid.isSelected(at)),\n \"aria-readonly\": editable ? undefined : \"true\",\n \"aria-colindex\": at.column + 1,\n \"data-column\": column.id,\n \"data-align\": column.align,\n \"data-focused\": flag(grid.isFocused(at)),\n \"data-selected\": flag(grid.isSelected(at)),\n \"data-editing\": flag(editing),\n \"data-readonly\": flag(!editable),\n style: columnStyle(column),\n onMousedown: (event: MouseEvent) => {\n if (editing || event.button !== 0) {\n return;\n }\n grid.focusCell(at, { extend: event.shiftKey });\n context.focus();\n },\n onMouseenter: (event: MouseEvent) => {\n if (event.buttons === 1 && !grid.editor) {\n grid.focusCell(at, { extend: true });\n }\n },\n onDblclick: () => {\n grid.focusCell(at);\n grid.startEdit();\n },\n },\n content,\n );\n };\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vueye-table/headless",
3
- "version": "3.0.0-alpha.4",
3
+ "version": "3.0.0-alpha.5",
4
4
  "description": "Unstyled, accessible Vue components for vueye-table: tables, controls, and spreadsheet grids.",
5
5
  "keywords": [
6
6
  "data-table",
@@ -38,8 +38,8 @@
38
38
  "provenance": true
39
39
  },
40
40
  "dependencies": {
41
- "@vueye-table/vue": "3.0.0-alpha.4",
42
- "@vueye-table/core": "3.0.0-alpha.4"
41
+ "@vueye-table/core": "3.0.0-alpha.5",
42
+ "@vueye-table/vue": "3.0.0-alpha.5"
43
43
  },
44
44
  "devDependencies": {
45
45
  "vue": "3.5.43",