@squirkle-ui/datagrid 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +14 -2
- package/dist/styles.css +168 -0
- package/dist/types/GridFilter.vue.d.ts +2649 -0
- package/dist/types/SqDataGrid.vue.d.ts +5880 -0
- package/dist/types/engine.d.ts +53 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/types.d.ts +118 -0
- package/dist/vue2/index.cjs +1842 -0
- package/dist/vue2/index.cjs.map +1 -0
- package/dist/vue2/index.mjs +1842 -0
- package/dist/vue2/index.mjs.map +1 -0
- package/dist/vue3/index.cjs +2690 -0
- package/dist/vue3/index.cjs.map +1 -0
- package/dist/vue3/index.mjs +2690 -0
- package/dist/vue3/index.mjs.map +1 -0
- package/dist/vue3/styles.css +168 -0
- package/package.json +61 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/GridFilter.vue","../../src/engine.ts","../../src/SqDataGrid.vue","../../src/index.ts"],"sourcesContent":["<template>\n <div class=\"sq-grid-filter\" @click.stop>\n <template v-if=\"kind === 'set'\">\n <SqTextField v-model=\"search\" :placeholder=\"messages.search\" density=\"compact\" prepend-inner-icon=\"search\" hide-details clearable />\n <label class=\"sq-grid-filter__all\">\n <SqCheckbox :model-value=\"allChecked\" :indeterminate=\"someChecked\" :label=\"messages.selectAll\" @update:modelValue=\"toggleAll\" />\n </label>\n <SqVirtualScroll :items=\"shownValues\" :item-height=\"32\" :height=\"Math.min(shownValues.length * 32, 224) || 32\">\n <template #default=\"{ item }\">\n <SqCheckbox :model-value=\"isChecked(item)\" :label=\"label(item)\" @update:modelValue=\"toggleValue(item)\" />\n </template>\n </SqVirtualScroll>\n </template>\n <template v-else>\n <SqSelect :model-value=\"draft.op\" :items=\"ops\" density=\"compact\" hide-details @update:modelValue=\"set('op', $event)\" />\n <SqTextField\n v-if=\"needsValue\"\n :model-value=\"draftValue\"\n :type=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'text'\"\n :placeholder=\"kind === 'text' ? messages.search : 'Value'\"\n density=\"compact\"\n hide-details\n clearable\n @update:modelValue=\"set('value', $event)\"\n />\n <SqTextField\n v-if=\"draft.op === 'between'\"\n :model-value=\"draftValueTo\"\n :type=\"kind === 'number' ? 'number' : 'date'\"\n placeholder=\"To\"\n density=\"compact\"\n hide-details\n @update:modelValue=\"set('valueTo', $event)\"\n />\n </template>\n <div class=\"sq-grid-filter__actions\">\n <SqBtn size=\"small\" variant=\"text\" color=\"surface\" @click=\"$emit('update:modelValue', undefined)\">{{ messages.clear }}</SqBtn>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, type PropType } from 'vue'\nimport { SqBtn, SqCheckbox, SqSelect, SqTextField, SqVirtualScroll, config } from '@squirkle-ui/ui'\nimport type { CellValue, FilterCondition, FilterKind } from './types'\n\nconst TEXT_OPS = [\n { title: 'Contains', value: 'contains' }, { title: 'Does not contain', value: 'notContains' }, { title: 'Equals', value: 'equals' },\n { title: 'Not equal', value: 'notEqual' }, { title: 'Starts with', value: 'startsWith' }, { title: 'Ends with', value: 'endsWith' },\n { title: 'Blank', value: 'blank' }, { title: 'Not blank', value: 'notBlank' },\n]\nconst NUM_OPS = [\n { title: 'Equals', value: 'equals' }, { title: 'Not equal', value: 'notEqual' }, { title: 'Greater than', value: 'gt' }, { title: '≥', value: 'gte' },\n { title: 'Less than', value: 'lt' }, { title: '≤', value: 'lte' }, { title: 'Between', value: 'between' }, { title: 'Blank', value: 'blank' }, { title: 'Not blank', value: 'notBlank' },\n]\n\n/** Filter editor shown in the column menu (internal to SqDataGrid). */\nexport default defineComponent({\n name: 'SqGridFilter',\n components: { SqBtn, SqCheckbox, SqSelect, SqTextField, SqVirtualScroll },\n props: {\n kind: { type: String as PropType<FilterKind>, required: true },\n modelValue: { type: Object as PropType<FilterCondition>, default: undefined },\n /** Distinct values for the set filter. */\n values: { type: Array as PropType<CellValue[]>, default: () => [] },\n formatter: { type: Function as PropType<(v: CellValue) => string>, default: undefined },\n },\n emits: ['update:modelValue'],\n setup(props, { emit }) {\n const search = ref('')\n const ops = computed(() => (props.kind === 'text' ? TEXT_OPS : NUM_OPS))\n const draft = computed<FilterCondition>(() => props.modelValue ?? { kind: props.kind, op: props.kind === 'text' ? 'contains' : 'equals' })\n const draftValue = computed(() => draft.value.value as string | number | undefined)\n const draftValueTo = computed(() => draft.value.valueTo as string | number | undefined)\n const needsValue = computed(() => draft.value.op !== 'blank' && draft.value.op !== 'notBlank')\n const set = (key: 'op' | 'value' | 'valueTo', v: unknown) => emit('update:modelValue', { ...draft.value, kind: props.kind, [key]: v })\n\n const label = (v: CellValue) => (v == null || v === '' ? '(Blanks)' : props.formatter ? props.formatter(v) : String(v))\n const shownValues = computed(() => {\n const q = search.value.trim().toLowerCase()\n return q ? props.values.filter((v) => label(v).toLowerCase().includes(q)) : props.values\n })\n const checkedSet = computed(() => new Set((props.modelValue?.values ?? props.values).map(String)))\n const isChecked = (v: CellValue) => checkedSet.value.has(String(v))\n const allChecked = computed(() => !props.modelValue?.values || props.modelValue.values.length === props.values.length)\n const someChecked = computed(() => !!props.modelValue?.values && props.modelValue.values.length > 0 && !allChecked.value)\n const toggleValue = (v: CellValue) => {\n const cur = props.modelValue?.values ?? props.values\n const next = isChecked(v) ? cur.filter((x) => String(x) !== String(v)) : [...cur, v]\n emit('update:modelValue', next.length === props.values.length ? undefined : { kind: 'set', values: next })\n }\n const toggleAll = () => emit('update:modelValue', allChecked.value ? { kind: 'set', values: [] } : undefined)\n return { search, ops, draft, draftValue, draftValueTo, needsValue, set, label, shownValues, isChecked, allChecked, someChecked, toggleValue, toggleAll, messages: computed(() => config.locale.messages) }\n },\n})\n</script>\n\n<style>\n.sq-grid-filter { display: flex; flex-direction: column; gap: var(--sq-space-2); width: 240px; padding: var(--sq-space-2); }\n.sq-grid-filter__all { border-bottom: 1px solid var(--sq-border); padding-bottom: 2px; }\n.sq-grid-filter__actions { display: flex; justify-content: flex-end; }\n.sq-grid-filter .sq-checkbox { min-height: 32px; font-size: var(--sq-text-sm); width: 100%; }\n</style>\n","/**\n * Pure, framework-free data pipeline for SqDataGrid:\n * rows → quick filter → column filters → sort → group / tree (+ aggregation) → flatten (+ detail rows)\n * Every stage is a separate function so the Vue layer can cache each one in its own computed.\n */\nimport { compareValues, getByPath, toDate } from '@squirkle-ui/core'\nimport type { AggFunc, CellValue, ColumnDef, DisplayRow, FilterCondition, FilterModel, RowData, SortItem } from './types'\n\nexport const colIdOf = <T extends RowData>(c: ColumnDef<T>) => c.colId ?? c.field ?? c.headerName ?? ''\n\nexport function makeGetter<T extends RowData>(col: ColumnDef<T>): (row: T) => CellValue {\n if (col.valueGetter) return col.valueGetter\n const f = col.field\n if (!f) return () => undefined\n if (!f.includes('.')) return (row) => (row as RowData)[f]\n return (row) => getByPath(row, f)\n}\n\nexport function filterKindOf<T extends RowData>(col: ColumnDef<T>): FilterCondition['kind'] {\n if (typeof col.filter === 'string') return col.filter\n return col.type === 'number' ? 'number' : col.type === 'date' ? 'date' : col.type === 'boolean' ? 'set' : 'text'\n}\n\nconst isBlank = (v: CellValue) => v == null || v === ''\n\nexport function matchCondition(value: CellValue, c: FilterCondition): boolean {\n if (c.kind === 'set') {\n if (!c.values) return true\n return c.values.some((x) => x === value || (isBlank(x) && isBlank(value)) || String(x) === String(value))\n }\n const op = c.op ?? (c.kind === 'text' ? 'contains' : 'equals')\n if (op === 'blank') return isBlank(value)\n if (op === 'notBlank') return !isBlank(value)\n if (c.value == null || c.value === '') return true\n if (c.kind === 'text') {\n const v = String(value ?? '').toLowerCase()\n const q = String(c.value).toLowerCase()\n switch (op) {\n case 'contains': return v.includes(q)\n case 'notContains': return !v.includes(q)\n case 'equals': return v === q\n case 'notEqual': return v !== q\n case 'startsWith': return v.startsWith(q)\n case 'endsWith': return v.endsWith(q)\n default: return true\n }\n }\n const toNum = (x: CellValue) => (c.kind === 'date' ? toDate(x as string)?.getTime() ?? NaN : Number(x))\n const v = toNum(value)\n const a = toNum(c.value)\n if (isNaN(v)) return false\n switch (op) {\n case 'equals': return c.kind === 'date' ? Math.floor(v / 864e5) === Math.floor(a / 864e5) : v === a\n case 'notEqual': return v !== a\n case 'gt': return v > a\n case 'gte': return v >= a\n case 'lt': return v < a\n case 'lte': return v <= a\n case 'between': return v >= a && v <= toNum(c.valueTo)\n default: return true\n }\n}\n\nexport function filterRows<T extends RowData>(rows: T[], columns: ColumnDef<T>[], model: FilterModel, quick: string): number[] {\n const active = Object.entries(model).filter(([, c]) => c && (c.kind === 'set' ? !!c.values : c.op === 'blank' || c.op === 'notBlank' || (c.value != null && c.value !== '')))\n const byId = new Map(columns.map((c) => [colIdOf(c), c]))\n const checks = active.map(([id, cond]) => ({ get: makeGetter(byId.get(id) ?? { field: id }), cond }))\n const q = quick.trim().toLowerCase()\n // Quick filter matches raw primitive values (formatting every cell of 100k rows is far too slow).\n const quickGetters = q ? columns.filter((c) => !c.hide).map((c) => makeGetter(c)) : []\n const out: number[] = []\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n let ok = true\n for (const { get, cond } of checks) {\n if (!matchCondition(get(row), cond)) { ok = false; break }\n }\n if (ok && q) {\n ok = false\n for (const get of quickGetters) {\n const v = get(row)\n if (v == null || typeof v === 'object') continue\n if (String(v).toLowerCase().includes(q)) { ok = true; break }\n }\n }\n if (ok) out.push(i)\n }\n return out\n}\n\n/** Sorts row indices; keys are extracted once per row (decorate-sort-undecorate). */\nexport function sortIndices<T extends RowData>(rows: T[], indices: number[], columns: ColumnDef<T>[], sort: SortItem[]): number[] {\n if (!sort.length) return indices\n const byId = new Map(columns.map((c) => [colIdOf(c), c]))\n const specs = sort.map((s) => {\n const col = byId.get(s.colId) ?? ({ field: s.colId } as ColumnDef<T>)\n const get = makeGetter(col)\n const keys = new Array<CellValue>(rows.length)\n for (const i of indices) keys[i] = get(rows[i])\n return { keys, dir: s.sort === 'desc' ? -1 : 1, cmp: col.comparator, date: col.type === 'date' }\n })\n for (const s of specs) if (s.date) for (const i of indices) s.keys[i] = toDate(s.keys[i] as string)?.getTime() ?? null\n return indices.slice().sort((a, b) => {\n for (const s of specs) {\n const ka = s.keys[a]\n const kb = s.keys[b]\n // Blanks stay at the bottom in both directions.\n const blankA = ka == null || ka === ''\n const blankB = kb == null || kb === ''\n if (blankA !== blankB) return blankA ? 1 : -1\n const r = s.cmp ? s.cmp(ka, kb, rows[a], rows[b]) : compareValues(ka, kb)\n if (r) return r * s.dir\n }\n return a - b\n })\n}\n\nexport function aggregate(values: CellValue[], fn: AggFunc): CellValue {\n if (typeof fn === 'function') return fn(values)\n const nums = values.filter((v) => v != null && v !== '').map(Number).filter((n) => !isNaN(n))\n switch (fn) {\n case 'sum': return nums.reduce((a, b) => a + b, 0)\n case 'avg': return nums.length ? nums.reduce((a, b) => a + b, 0) / nums.length : null\n case 'min': return nums.length ? Math.min(...nums) : null\n case 'max': return nums.length ? Math.max(...nums) : null\n case 'count': return values.length\n case 'first': return values[0]\n case 'last': return values[values.length - 1]\n }\n}\n\nexport interface GroupNode {\n key: CellValue\n colId: string\n id: string\n level: number\n children: GroupNode[]\n /** Leaf source indices (in sorted order). */\n leaves: number[]\n agg: Record<string, CellValue>\n}\n\nfunction computeAgg<T extends RowData>(rows: T[], leaves: number[], aggCols: { id: string; get: (r: T) => CellValue; fn: AggFunc }[]) {\n const agg: Record<string, CellValue> = {}\n for (const a of aggCols) agg[a.id] = aggregate(leaves.map((i) => a.get(rows[i])), a.fn)\n return agg\n}\n\n/** Groups sorted indices by one or more columns. Group order follows the first occurrence in sorted data. */\nexport function groupRows<T extends RowData>(rows: T[], indices: number[], columns: ColumnDef<T>[], groupBy: string[]): GroupNode[] {\n const byId = new Map(columns.map((c) => [colIdOf(c), c]))\n const aggCols = columns.filter((c) => c.aggFunc).map((c) => ({ id: colIdOf(c), get: makeGetter(c), fn: c.aggFunc! }))\n const build = (idx: number[], level: number, parentId: string): GroupNode[] => {\n const colId = groupBy[level]\n const get = makeGetter(byId.get(colId) ?? ({ field: colId } as ColumnDef<T>))\n const buckets = new Map<string, { key: CellValue; leaves: number[] }>()\n for (const i of idx) {\n const key = get(rows[i])\n const k = String(key ?? '')\n let b = buckets.get(k)\n if (!b) buckets.set(k, (b = { key, leaves: [] }))\n b.leaves.push(i)\n }\n return Array.from(buckets.values()).map((b) => {\n const id = `${parentId}/${colId}:${String(b.key ?? '')}`\n return {\n key: b.key,\n colId,\n id,\n level,\n leaves: b.leaves,\n children: level + 1 < groupBy.length ? build(b.leaves, level + 1, id) : [],\n agg: computeAgg(rows, b.leaves, aggCols),\n }\n })\n }\n return groupBy.length ? build(indices, 0, 'g') : []\n}\n\n/** Builds a tree from `getDataPath(row)` (e.g. ['Org', 'Team', 'Alice']); missing parents become filler groups. */\nexport function treeRows<T extends RowData>(rows: T[], indices: number[], columns: ColumnDef<T>[], getDataPath: (row: T) => string[]): GroupNode[] {\n const aggCols = columns.filter((c) => c.aggFunc).map((c) => ({ id: colIdOf(c), get: makeGetter(c), fn: c.aggFunc! }))\n const root: GroupNode = { key: null, colId: '__tree', id: 't', level: -1, children: [], leaves: [], agg: {} }\n const nodes = new Map<string, GroupNode & { self?: number }>()\n for (const i of indices) {\n const path = getDataPath(rows[i])\n let parent = root\n let id = 't'\n path.forEach((part, depth) => {\n id += `/${part}`\n let node = nodes.get(id)\n if (!node) {\n node = { key: part, colId: '__tree', id, level: depth, children: [], leaves: [], agg: {} }\n nodes.set(id, node)\n parent.children.push(node)\n }\n if (depth === path.length - 1) node.self = i\n node.leaves.push(i)\n parent = node\n })\n }\n for (const n of nodes.values()) if (n.children.length) n.agg = computeAgg(rows, n.leaves, aggCols)\n return root.children\n}\n\nexport interface FlattenOptions {\n expanded: Set<string>\n /** Open every group regardless of `expanded` (until the user collapses one). */\n expandAll?: boolean\n collapsed?: Set<string>\n rowId: (row: RowData, index: number) => string\n detailOpen?: Set<string>\n tree?: boolean\n}\n\n/** Turns groups (or plain indices) into the displayed row list. */\nexport function flatten<T extends RowData>(rows: T[], indices: number[], groups: GroupNode[] | null, opts: FlattenOptions): DisplayRow<T>[] {\n const out: DisplayRow<T>[] = []\n const pushData = (i: number, level: number) => {\n const id = opts.rowId(rows[i], i)\n out.push({ kind: 'data', id, data: rows[i], level, sourceIndex: i })\n if (opts.detailOpen?.has(id)) out.push({ kind: 'detail', id: `${id}__detail`, data: rows[i], level, sourceIndex: i })\n }\n if (!groups) {\n for (const i of indices) pushData(i, 0)\n return out\n }\n const isOpen = (id: string) => (opts.expandAll ? !opts.collapsed?.has(id) : opts.expanded.has(id))\n const walk = (nodes: GroupNode[]) => {\n for (const g of nodes) {\n const self = (g as GroupNode & { self?: number }).self\n if (opts.tree && !g.children.length && self != null) {\n pushData(self, g.level)\n continue\n }\n const expanded = isOpen(g.id)\n const leafIds = g.leaves.map((i) => opts.rowId(rows[i], i))\n out.push({\n kind: 'group',\n id: g.id,\n data: opts.tree && self != null ? rows[self] : null,\n level: g.level,\n sourceIndex: self,\n group: { key: g.key, colId: g.colId, count: opts.tree ? g.leaves.length - (self != null ? 1 : 0) : g.leaves.length, expanded, agg: g.agg, leafIds },\n })\n if (!expanded) continue\n if (g.children.length) walk(g.children)\n else for (const i of g.leaves) pushData(i, g.level + 1)\n }\n }\n walk(groups)\n return out\n}\n\nexport function allGroupIds(groups: GroupNode[]): string[] {\n const ids: string[] = []\n const walk = (n: GroupNode[]) => n.forEach((g) => { if (g.children.length || g.colId !== '__tree') ids.push(g.id); walk(g.children) })\n walk(groups)\n return ids\n}\n\n/** Row offsets for virtualization with mixed row heights (data/group vs. detail). */\nexport function rowLayout(rows: DisplayRow[], rowHeight: number, detailHeight: number) {\n const offsets = new Float64Array(rows.length + 1)\n for (let i = 0; i < rows.length; i++) offsets[i + 1] = offsets[i] + (rows[i].kind === 'detail' ? detailHeight : rowHeight)\n const indexAt = (y: number) => {\n let lo = 0\n let hi = rows.length - 1\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1\n if (offsets[mid] <= y) lo = mid\n else hi = mid - 1\n }\n return Math.max(0, lo)\n }\n return { offsets, total: offsets[rows.length], indexAt }\n}\n\n/**\n * Pivot: one output row per combination of `groupBy` values, one column per pivot value × value column.\n * Returns plain rows plus generated column defs, so the result renders like any other data.\n */\nexport function pivotRows<T extends RowData>(rows: T[], indices: number[], columns: ColumnDef<T>[], groupBy: string[], pivotCol: string) {\n const byId = new Map(columns.map((c) => [colIdOf(c), c]))\n const valueCols = columns.filter((c) => c.aggFunc)\n const pGet = makeGetter(byId.get(pivotCol) ?? ({ field: pivotCol } as ColumnDef<T>))\n const gGets = groupBy.map((id) => makeGetter(byId.get(id) ?? ({ field: id } as ColumnDef<T>)))\n const pivotKeys: string[] = []\n const seen = new Set<string>()\n const buckets = new Map<string, { keys: CellValue[]; cells: Map<string, number[]> }>()\n for (const i of indices) {\n const pk = String(pGet(rows[i]) ?? '')\n if (!seen.has(pk)) { seen.add(pk); pivotKeys.push(pk) }\n const keys = gGets.map((g) => g(rows[i]))\n const k = keys.map(String).join('\\u0001')\n let b = buckets.get(k)\n if (!b) buckets.set(k, (b = { keys, cells: new Map() }))\n let cell = b.cells.get(pk)\n if (!cell) b.cells.set(pk, (cell = []))\n cell.push(i)\n }\n pivotKeys.sort((a, b) => compareValues(a, b))\n const outRows: RowData[] = []\n for (const b of buckets.values()) {\n const r: RowData = {}\n groupBy.forEach((id, k) => (r[id] = b.keys[k]))\n for (const pk of pivotKeys)\n for (const vc of valueCols) {\n const leaves = b.cells.get(pk) ?? []\n const get = makeGetter(vc)\n r[`${pk}__${colIdOf(vc)}`] = leaves.length ? aggregate(leaves.map((i) => get(rows[i])), vc.aggFunc!) : null\n }\n outRows.push(r)\n }\n const outCols: ColumnDef[] = [\n ...groupBy.map((id) => ({ ...(byId.get(id) as ColumnDef), colId: id, field: id, pinned: 'left' as const, rowGroup: false, valueGetter: undefined })),\n ...pivotKeys.flatMap((pk) =>\n valueCols.map((vc) => ({\n colId: `${pk}__${colIdOf(vc)}`,\n field: `${pk}__${colIdOf(vc)}`,\n headerName: valueCols.length > 1 ? `${vc.headerName ?? colIdOf(vc)}` : pk,\n group: valueCols.length > 1 ? pk : undefined,\n type: 'number' as const,\n align: 'right' as const,\n aggFunc: vc.aggFunc,\n valueFormatter: vc.valueFormatter as ColumnDef['valueFormatter'],\n width: 120,\n })),\n ),\n ]\n return { rows: outRows, columns: outCols }\n}\n\n/** RFC 4180 CSV. */\nexport function toCsv(header: string[], body: string[][], sep = ','): string {\n const esc = (s: string) => (/[\",\\n\\r]/.test(s) || s.includes(sep) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s)\n return [header, ...body].map((r) => r.map(esc).join(sep)).join('\\r\\n')\n}\n\n/** Parses tab-separated clipboard text into a 2D array. */\nexport const parseTsv = (text: string) => text.replace(/\\r?\\n$/, '').split(/\\r?\\n/).map((l) => l.split('\\t'))\n","<template>\n <div\n class=\"sq-datagrid sq-surface\"\n :class=\"{ 'sq-datagrid--striped': striped, 'sq-datagrid--column-lines': columnLines, 'sq-datagrid--scrolled-x': scrollLeft > 0 }\"\n :style=\"rootStyle\"\n tabindex=\"0\"\n role=\"grid\"\n :aria-rowcount=\"rowCount\"\n :aria-colcount=\"flatCols.length\"\n @keydown=\"onKeydown\"\n @paste=\"onPaste\"\n >\n <SqShape clip />\n\n <div v-if=\"toolbar || has('toolbar')\" class=\"sq-datagrid__toolbar\">\n <slot name=\"toolbar\" :api=\"api\" />\n <SqTextField v-if=\"toolbar\" :model-value=\"quick\" class=\"sq-datagrid__quick\" :placeholder=\"messages.search\" prepend-inner-icon=\"search\" density=\"compact\" hide-details clearable @update:modelValue=\"quick = $event || ''\" />\n <span class=\"sq-spacer\"></span>\n <SqMenu v-if=\"toolbar\" :close-on-content-click=\"false\" location=\"bottom end\">\n <template #activator><SqBtn prepend-icon=\"columns\" variant=\"text\" color=\"surface\" size=\"small\">Columns</SqBtn></template>\n <div class=\"sq-datagrid__chooser\">\n <SqCheckbox v-for=\"c in chooserCols\" :key=\"c.id\" :model-value=\"!c.hidden\" :label=\"c.title\" @update:modelValue=\"setHidden(c.id, !$event)\" />\n </div>\n </SqMenu>\n <SqBtn v-if=\"toolbar\" prepend-icon=\"download\" variant=\"text\" color=\"surface\" size=\"small\" @click=\"exportCsv()\">CSV</SqBtn>\n </div>\n\n <div v-if=\"groupPanel && !treeData && !isServer\" class=\"sq-datagrid__group-panel\" @dragover.prevent @drop=\"onGroupDrop\">\n <SqIcon icon=\"menu\" size=\"16px\" />\n <span v-if=\"!groupBy.length\" class=\"sq-datagrid__group-hint\">Drag a column header here to group rows</span>\n <SqChip v-for=\"id in groupBy\" :key=\"id\" size=\"small\" variant=\"tonal\" color=\"primary\" closable @click:close=\"removeGroup(id)\">{{ titleOf(id) }}</SqChip>\n </div>\n\n <div ref=\"viewport\" class=\"sq-datagrid__viewport\" :style=\"{ height: toUnit(height) }\" @scroll.passive=\"onScroll\">\n <div class=\"sq-datagrid__canvas\" :style=\"{ width: totalWidth + 'px' }\">\n <!-- header (sticky) -->\n <div class=\"sq-datagrid__head\" role=\"rowgroup\">\n <div v-if=\"hasHeaderGroups\" class=\"sq-datagrid__header-row sq-datagrid__header-row--groups\" :style=\"{ height: headerHeight + 'px' }\">\n <div v-for=\"g in headerGroups\" :key=\"g.key\" class=\"sq-datagrid__header-group\" :class=\"g.cls\" :style=\"g.style\">{{ g.label }}</div>\n </div>\n <div class=\"sq-datagrid__header-row\" role=\"row\" :style=\"{ height: headerHeight + 'px' }\">\n <div\n v-for=\"rc in renderCols\"\n :key=\"rc.key\"\n class=\"sq-datagrid__hcell\"\n :class=\"headerCellClass(rc)\"\n :style=\"rc.style\"\n role=\"columnheader\"\n :aria-sort=\"rc.col ? ariaSort(rc.id) : undefined\"\n :draggable=\"!!rc.col && !rc.auto && !rc.col.lockPosition\"\n @click=\"rc.col && onHeaderClick($event, rc)\"\n @dragstart=\"onDragStart($event, rc)\"\n @dragover.prevent=\"onDragOver($event, rc)\"\n @drop.prevent=\"onDrop(rc)\"\n @dragend=\"dragColId = null\"\n >\n <template v-if=\"rc.col\">\n <span v-if=\"rc.id === '__select'\" class=\"sq-datagrid__check\" @click.stop><SqCheckbox :model-value=\"allSelected\" :indeterminate=\"someSelected\" aria-label=\"Select all rows\" @update:modelValue=\"toggleAll\" /></span>\n <template v-else>\n <span class=\"sq-datagrid__htitle\"><slot :name=\"`header-${rc.id}`\" :column=\"rc.col\">{{ rc.title }}</slot></span>\n <span v-if=\"sortIndex(rc.id) >= 0\" class=\"sq-datagrid__sort\">\n <SqIcon :icon=\"sortDir(rc.id) === 'asc' ? 'arrowUp' : 'arrowDown'\" size=\"14px\" />\n <sup v-if=\"sortModelList.length > 1\">{{ sortIndex(rc.id) + 1 }}</sup>\n </span>\n <SqIcon v-if=\"filterModelObj[rc.id]\" icon=\"filter\" size=\"14px\" class=\"sq-datagrid__filtered\" />\n <button v-if=\"!rc.col.suppressMenu && !rc.auto\" type=\"button\" class=\"sq-datagrid__menu-btn\" tabindex=\"-1\" aria-label=\"Column menu\" @click.stop=\"openMenu($event, rc.id)\"><SqIcon icon=\"more\" size=\"16px\" /></button>\n </template>\n <span v-if=\"rc.col.resizable !== false\" class=\"sq-datagrid__resizer\" @pointerdown.stop.prevent=\"startResize($event, rc)\" @dblclick.stop=\"autoSize([rc.id])\" @click.stop></span>\n </template>\n </div>\n </div>\n <div v-if=\"floatingFilters\" class=\"sq-datagrid__header-row sq-datagrid__header-row--filters\" :style=\"{ height: filterRowHeight + 'px' }\">\n <div v-for=\"rc in renderCols\" :key=\"rc.key\" class=\"sq-datagrid__hcell sq-datagrid__fcell\" :class=\"headerCellClass(rc)\" :style=\"rc.style\">\n <input\n v-if=\"rc.col && !rc.auto && rc.col.filter !== false && filterKind(rc.col) !== 'set'\"\n class=\"sq-datagrid__ffilter sq-squircle\"\n :type=\"filterKind(rc.col) === 'number' ? 'number' : filterKind(rc.col) === 'date' ? 'date' : 'text'\"\n :value=\"floatingValue(rc.id)\"\n :placeholder=\"filterKind(rc.col) === 'text' ? '…' : '='\"\n :aria-label=\"`Filter ${rc.title}`\"\n @input=\"onFloatingInput($event, rc)\"\n />\n </div>\n </div>\n <div v-for=\"(pr, pi) in pinnedTopRows\" :key=\"'pt' + pi\" class=\"sq-datagrid__row sq-datagrid__row--pinned\" :style=\"{ height: rowHeight + 'px' }\">\n <div v-for=\"rc in renderCols\" :key=\"rc.key\" class=\"sq-datagrid__cell\" :class=\"cellAlignClass(rc)\" :style=\"rc.style\">\n <template v-if=\"rc.col && !rc.auto\"><slot :name=\"`cell-${rc.id}`\" v-bind=\"cellParams(pr, rc, -1)\">{{ formatCell(rc, pr) }}</slot></template>\n </div>\n </div>\n </div>\n\n <!-- body -->\n <div class=\"sq-datagrid__body\" role=\"rowgroup\" :style=\"{ height: layout.total + 'px' }\">\n <div\n v-for=\"vr in visibleRows\"\n :key=\"vr.row.id\"\n class=\"sq-datagrid__row\"\n :class=\"rowClass(vr)\"\n :style=\"{ transform: `translateY(${vr.top}px)`, height: vr.height + 'px' }\"\n role=\"row\"\n :aria-rowindex=\"vr.index + 1\"\n :aria-selected=\"vr.row.kind === 'data' && rowSelection ? (selectedSet.has(vr.row.id) ? 'true' : 'false') : undefined\"\n @click=\"onRowClick($event, vr)\"\n @dblclick=\"$emit('row-dblclick', { row: vr.row.data, event: $event })\"\n >\n <div v-if=\"vr.row.kind === 'detail'\" class=\"sq-datagrid__detail\" :style=\"{ width: vpWidth + 'px' }\">\n <slot name=\"detail\" :row=\"vr.row.data\" />\n </div>\n <template v-else>\n <div\n v-for=\"rc in renderCols\"\n :key=\"rc.key\"\n class=\"sq-datagrid__cell\"\n :class=\"cellClass(vr, rc)\"\n :style=\"cellStyle(vr, rc)\"\n role=\"gridcell\"\n @mousedown=\"onCellMousedown($event, vr, rc)\"\n @mouseenter=\"onCellEnter(vr, rc)\"\n @dblclick.stop=\"onCellDblclick(vr, rc)\"\n @contextmenu.prevent=\"openContext($event, vr, rc)\"\n >\n <template v-if=\"!rc.col\"></template>\n <span v-else-if=\"vr.row.kind === 'loading'\" class=\"sq-datagrid__skeleton sq-skeleton-shimmer\"></span>\n <span v-else-if=\"rc.id === '__select'\" class=\"sq-datagrid__check\" @click.stop @mousedown.stop><SqCheckbox :model-value=\"isRowChecked(vr.row)\" :indeterminate=\"isRowPartial(vr.row)\" aria-label=\"Select row\" @update:modelValue=\"toggleRowCheck(vr.row)\" /></span>\n <span v-else-if=\"rc.id === '__group'\" class=\"sq-datagrid__group-cell\" :style=\"{ paddingInlineStart: vr.row.level * 18 + 'px' }\">\n <button v-if=\"vr.row.kind === 'group'\" type=\"button\" class=\"sq-datagrid__expander\" :class=\"{ 'sq-datagrid__expander--open': vr.row.group?.expanded }\" tabindex=\"-1\" @click.stop=\"toggleGroup(vr.row)\"><SqIcon icon=\"chevronRight\" size=\"18px\" /></button>\n <button v-else-if=\"masterDetail && !treeData\" type=\"button\" class=\"sq-datagrid__expander\" :class=\"{ 'sq-datagrid__expander--open': detailOpen.has(vr.row.id) }\" tabindex=\"-1\" @click.stop=\"toggleDetail(vr.row.id)\"><SqIcon icon=\"chevronRight\" size=\"18px\" /></button>\n <span v-else class=\"sq-datagrid__expander-spacer\"></span>\n <span class=\"sq-datagrid__group-key\"><slot name=\"group\" :row=\"vr.row\">{{ groupLabel(vr.row) }}</slot></span>\n <span v-if=\"vr.row.kind === 'group' && vr.row.group?.count\" class=\"sq-datagrid__group-count\">{{ vr.row.group?.count }}</span>\n </span>\n <span v-else-if=\"vr.row.kind === 'group'\" class=\"sq-datagrid__agg\">{{ groupAggText(vr.row, rc) }}</span>\n <span v-else-if=\"isEditing(vr, rc)\" class=\"sq-datagrid__editor-wrap\" @mousedown.stop>\n <select v-if=\"editorKind(rc) === 'select'\" class=\"sq-datagrid__editor\" :value=\"String(editing?.value ?? '')\" @change=\"onEditorInput\" @keydown.stop=\"onEditorKey\" @blur=\"commitEdit\">\n <option v-for=\"opt in rc.col.cellEditorParams?.values ?? []\" :key=\"String(opt)\" :value=\"String(opt)\">{{ opt }}</option>\n </select>\n <input v-else class=\"sq-datagrid__editor\" :type=\"editorKind(rc)\" :value=\"editing?.value ?? ''\" @input=\"onEditorInput\" @keydown.stop=\"onEditorKey\" @blur=\"commitEdit\" />\n </span>\n <template v-else>\n <slot :name=\"`cell-${rc.id}`\" v-bind=\"cellParams(vr.row.data, rc, vr.index)\">\n <slot name=\"cell\" v-bind=\"cellParams(vr.row.data, rc, vr.index)\">\n <span v-if=\"rc.col.type === 'boolean'\" class=\"sq-datagrid__bool\" :class=\"{ 'sq-datagrid__bool--on': !!cellValue(rc, vr.row.data) }\"><SqIcon :icon=\"cellValue(rc, vr.row.data) ? 'check' : 'minus'\" size=\"16px\" /></span>\n <span v-else class=\"sq-datagrid__text\">{{ formatCell(rc, vr.row.data) }}</span>\n </slot>\n </slot>\n </template>\n </div>\n </template>\n </div>\n </div>\n\n <!-- pinned bottom / totals (sticky) -->\n <div v-if=\"bottomRows.length\" class=\"sq-datagrid__foot\">\n <div v-for=\"(pr, pi) in bottomRows\" :key=\"'pb' + pi\" class=\"sq-datagrid__row sq-datagrid__row--pinned\" :style=\"{ height: rowHeight + 'px' }\">\n <div v-for=\"rc in renderCols\" :key=\"rc.key\" class=\"sq-datagrid__cell\" :class=\"cellAlignClass(rc)\" :style=\"rc.style\">\n <template v-if=\"rc.id === '__group'\"><strong>Total</strong></template>\n <template v-else-if=\"rc.col && !rc.auto\"><slot :name=\"`cell-${rc.id}`\" v-bind=\"cellParams(pr, rc, -1)\">{{ formatCell(rc, pr) }}</slot></template>\n </div>\n </div>\n </div>\n </div>\n\n <div v-if=\"showLoading\" class=\"sq-datagrid__overlay\"><slot name=\"loading\"><SqProgressCircular indeterminate :size=\"28\" :width=\"3\" /></slot></div>\n <div v-else-if=\"!rowCount\" class=\"sq-datagrid__overlay sq-datagrid__overlay--empty\"><slot name=\"no-rows\"><SqEmptyState :title=\"messages.noData\" icon=\"search\" /></slot></div>\n </div>\n\n <div v-if=\"statusBar || pagination\" class=\"sq-datagrid__footer\">\n <div v-if=\"statusBar\" class=\"sq-datagrid__status\">\n <span>{{ statusText }}</span>\n <span v-if=\"selectedIds.length\">· {{ selectedIds.length }} selected</span>\n <span v-if=\"rangeStats\" class=\"sq-datagrid__range-stats\">Count {{ rangeStats.count }} · Sum {{ fmtNum(rangeStats.sum) }} · Avg {{ fmtNum(rangeStats.avg) }} · Min {{ fmtNum(rangeStats.min) }} · Max {{ fmtNum(rangeStats.max) }}</span>\n </div>\n <span class=\"sq-spacer\"></span>\n <template v-if=\"pagination && !isServer\">\n <span class=\"sq-datagrid__page-size\">{{ messages.rowsPerPage }}\n <select class=\"sq-datagrid__page-select sq-squircle\" :value=\"pageSizeState\" @change=\"onPageSize\"><option v-for=\"s in pageSizes\" :key=\"s\" :value=\"s\">{{ s }}</option></select>\n </span>\n <span class=\"sq-datagrid__page-range\">{{ pageRangeText }}</span>\n <SqPagination v-model=\"page\" :length=\"pageCount\" :total-visible=\"5\" size=\"x-small\" />\n </template>\n </div>\n\n <SqMenu v-model=\"menuOpen\" :activator=\"menuAnchor || undefined\" :close-on-content-click=\"false\" location=\"bottom end\" :max-height=\"480\">\n <div v-if=\"menuCol\" class=\"sq-datagrid__menu\">\n <template v-if=\"menuMode === 'column'\">\n <SqListItem v-if=\"menuCol.col.sortable !== false\" title=\"Sort ascending\" prepend-icon=\"arrowUp\" link @click=\"setSort(menuCol.id, 'asc')\" />\n <SqListItem v-if=\"menuCol.col.sortable !== false\" title=\"Sort descending\" prepend-icon=\"arrowDown\" link @click=\"setSort(menuCol.id, 'desc')\" />\n <SqListItem v-if=\"sortIndex(menuCol.id) >= 0\" title=\"Clear sort\" prepend-icon=\"sort\" link @click=\"setSort(menuCol.id, null)\" />\n <SqDivider />\n <SqListItem :title=\"menuCol.pinned === 'left' ? 'Unpin' : 'Pin left'\" prepend-icon=\"pin\" link @click=\"setPinned(menuCol.id, menuCol.pinned === 'left' ? null : 'left')\" />\n <SqListItem v-if=\"menuCol.pinned !== 'right'\" title=\"Pin right\" prepend-icon=\"pin\" link @click=\"setPinned(menuCol.id, 'right')\" />\n <SqListItem title=\"Autosize column\" prepend-icon=\"columns\" link @click=\"autoSize([menuCol.id])\" />\n <SqListItem title=\"Autosize all columns\" prepend-icon=\"columns\" link @click=\"autoSize()\" />\n <SqListItem v-if=\"!treeData && !isServer\" :title=\"groupBy.includes(menuCol.id) ? `Ungroup by ${menuCol.title}` : `Group by ${menuCol.title}`\" prepend-icon=\"menu\" link @click=\"toggleGroupBy(menuCol.id)\" />\n <SqListItem title=\"Hide column\" prepend-icon=\"eyeOff\" link @click=\"setHidden(menuCol.id, true); menuOpen = false\" />\n <template v-if=\"menuCol.col.filter !== false\">\n <SqDivider>Filter</SqDivider>\n <SqGridFilter :kind=\"filterKind(menuCol.col)\" :model-value=\"filterModelObj[menuCol.id]\" :values=\"distinctValues(menuCol.id)\" :formatter=\"menuFormatter\" @update:modelValue=\"setFilter(menuCol.id, $event)\" />\n </template>\n </template>\n <template v-else>\n <SqListItem title=\"Copy\" prepend-icon=\"copy\" link @click=\"copy(false); menuOpen = false\" />\n <SqListItem title=\"Copy with headers\" prepend-icon=\"copy\" link @click=\"copy(true); menuOpen = false\" />\n <SqListItem v-if=\"canUndo\" title=\"Undo\" prepend-icon=\"refresh\" link @click=\"undo(); menuOpen = false\" />\n <SqDivider />\n <SqListItem title=\"Export CSV\" prepend-icon=\"download\" link @click=\"exportCsv(); menuOpen = false\" />\n <SqListItem v-if=\"selectedIds.length\" title=\"Export selected rows\" prepend-icon=\"download\" link @click=\"exportCsv({ onlySelected: true }); menuOpen = false\" />\n <template v-if=\"hasGroups\">\n <SqDivider />\n <SqListItem title=\"Expand all\" prepend-icon=\"plus\" link @click=\"expandAll(); menuOpen = false\" />\n <SqListItem title=\"Collapse all\" prepend-icon=\"minus\" link @click=\"collapseAll(); menuOpen = false\" />\n </template>\n </template>\n </div>\n </SqMenu>\n <div ref=\"ctxAnchor\" class=\"sq-datagrid__ctx-anchor\" :style=\"{ left: ctxPos.x + 'px', top: ctxPos.y + 'px' }\"></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, nextTick, onBeforeUnmount, onMounted, ref, toRaw, watch, type PropType } from 'vue'\nimport { clamp, downloadText, formatDate, getByPath, toUnit } from '@squirkle-ui/core'\nimport {\n SqBtn, SqCheckbox, SqChip, SqDivider, SqEmptyState, SqIcon, SqListItem, SqMenu, SqPagination, SqProgressCircular, SqShape, SqTextField,\n config, useProxiedModel,\n} from '@squirkle-ui/ui'\nimport SqGridFilter from './GridFilter.vue'\nimport {\n aggregate, allGroupIds, colIdOf, filterKindOf, filterRows, flatten, groupRows, makeGetter, parseTsv, pivotRows, rowLayout, sortIndices, toCsv, treeRows,\n} from './engine'\nimport type { CellRange, CellValue, ColumnDef, Datasource, DisplayRow, FilterCondition, FilterModel, RowData, SortItem } from './types'\n\ninterface RCol {\n key: string\n id: string\n col: ColumnDef | null\n title: string\n width: number\n pinned: 'left' | 'right' | null\n auto?: boolean\n flatIndex: number\n style: Record<string, string>\n edgeLeft?: boolean\n edgeRight?: boolean\n}\ninterface VRow { index: number; top: number; height: number; row: DisplayRow }\ninterface Change { row: RowData; col: ColumnDef; oldValue: CellValue; newValue: CellValue }\n\nconst SELECT_COL: ColumnDef = { colId: '__select', headerName: '', width: 48, resizable: false, sortable: false, filter: false, suppressMenu: true, lockPosition: true }\n\nfunction setByPath(obj: RowData, path: string, value: CellValue) {\n const keys = path.split('.')\n let cur: RowData = obj\n for (let i = 0; i < keys.length - 1; i++) cur = (cur[keys[i]] ??= {}) as RowData\n cur[keys[keys.length - 1]] = value\n}\n\n/**\n * Enterprise-style data grid: row + column virtualization, multi-sort, column/quick/set filters, row grouping with\n * aggregation, tree data, pivot, master/detail, pinned rows/columns, resizing, drag reorder, cell editing with undo,\n * range selection + clipboard, CSV export, pagination and an infinite server-side row model.\n */\nexport default defineComponent({\n name: 'SqDataGrid',\n components: { SqShape, SqBtn, SqCheckbox, SqChip, SqDivider, SqEmptyState, SqIcon, SqListItem, SqMenu, SqPagination, SqProgressCircular, SqTextField, SqGridFilter },\n props: {\n rows: { type: Array as PropType<RowData[]>, default: () => [] },\n columns: { type: Array as PropType<ColumnDef[]>, default: () => [] },\n defaultColDef: { type: Object as PropType<Partial<ColumnDef>>, default: () => ({}) },\n /** Field name or function producing a stable row id. */\n rowId: { type: [String, Function] as PropType<string | ((row: RowData, index: number) => string | number)>, default: 'id' },\n height: { type: [Number, String], default: 520 },\n rowHeight: { type: Number, default: 40 },\n headerHeight: { type: Number, default: 42 },\n detailHeight: { type: Number, default: 220 },\n rowSelection: { type: String as PropType<'single' | 'multiple' | null>, default: null },\n /** Auto checkbox column when rowSelection = multiple. */\n selectionColumn: { type: Boolean, default: true },\n selected: { type: Array as PropType<string[]>, default: undefined },\n sortModel: { type: Array as PropType<SortItem[]>, default: undefined },\n filterModel: { type: Object as PropType<FilterModel>, default: undefined },\n quickFilter: { type: String, default: undefined },\n groupBy: { type: Array as PropType<string[]>, default: undefined },\n /** Levels expanded by default; -1 = all. */\n groupDefaultExpanded: { type: Number, default: 0 },\n groupColumn: { type: Object as PropType<Partial<ColumnDef>>, default: () => ({}) },\n treeData: Boolean,\n getDataPath: { type: Function as PropType<(row: RowData) => string[]>, default: undefined },\n pivotMode: Boolean,\n pivotColumn: { type: String, default: undefined },\n masterDetail: Boolean,\n pinnedTopRows: { type: Array as PropType<RowData[]>, default: () => [] },\n pinnedBottomRows: { type: Array as PropType<RowData[]>, default: () => [] },\n /** Bottom row with column aggFunc totals over the filtered rows. */\n totalsRow: Boolean,\n pagination: Boolean,\n pageSize: { type: Number, default: 50 },\n pageSizes: { type: Array as PropType<number[]>, default: () => [25, 50, 100, 500] },\n /** Infinite / server-side row model. Sorting & filtering are delegated to getRows. */\n datasource: { type: Object as PropType<Datasource>, default: undefined },\n blockSize: { type: Number, default: 100 },\n loading: Boolean,\n toolbar: Boolean,\n groupPanel: Boolean,\n floatingFilters: Boolean,\n statusBar: { type: Boolean, default: true },\n striped: Boolean,\n columnLines: Boolean,\n rowClassName: { type: Function as PropType<(row: RowData) => string | undefined>, default: undefined },\n locale: { type: String, default: undefined },\n },\n emits: ['update:selected', 'update:sortModel', 'update:filterModel', 'update:quickFilter', 'update:groupBy', 'row-click', 'row-dblclick', 'cell-click', 'cell-value-changed', 'column-state-change', 'selection-change'],\n setup(props, { emit, slots }) {\n const viewport = ref<HTMLElement | null>(null)\n const ctxAnchor = ref<HTMLElement | null>(null)\n const scrollTop = ref(0)\n const scrollLeft = ref(0)\n const vpWidth = ref(800)\n const vpHeight = ref(400)\n const dataVersion = ref(0)\n const loc = computed(() => props.locale ?? config.locale.code)\n const isServer = computed(() => !!props.datasource)\n\n // ---------- models ----------\n const sortModelRef = useProxiedModel<SortItem[]>(props, emit, 'sortModel', () => [])\n const filterModelRef = useProxiedModel<FilterModel>(props, emit, 'filterModel', () => ({}))\n const quick = useProxiedModel<string>(props, emit, 'quickFilter', () => '')\n const groupByRef = useProxiedModel<string[]>(props, emit, 'groupBy', () => props.columns.filter((c) => c.rowGroup).map(colIdOf))\n const selectedRef = useProxiedModel<string[]>(props, emit, 'selected', () => [])\n const sortModelList = computed(() => sortModelRef.value ?? [])\n const filterModelObj = computed(() => filterModelRef.value ?? {})\n const groupBy = computed(() => groupByRef.value ?? [])\n const selectedIds = computed(() => selectedRef.value ?? [])\n const selectedSet = computed(() => new Set(selectedIds.value))\n\n // ---------- columns ----------\n const colOrder = ref<string[]>([])\n const colWidth = ref<Record<string, number>>({})\n const colHidden = ref<Record<string, boolean>>({})\n const colPinned = ref<Record<string, 'left' | 'right' | null>>({})\n const baseCols = computed(() => props.columns.map((c) => ({ ...props.defaultColDef, ...c }) as ColumnDef))\n watch(baseCols, (cols) => {\n const ids = cols.map(colIdOf)\n colOrder.value = [...colOrder.value.filter((id) => ids.includes(id)), ...ids.filter((id) => !colOrder.value.includes(id))]\n }, { immediate: true })\n\n const rowIdOf = (row: RowData, i: number) => String(typeof props.rowId === 'function' ? props.rowId(row, i) : (row?.[props.rowId] ?? i))\n\n // ---------- client pipeline ----------\n const raw = computed(() => {\n void dataVersion.value\n return toRaw(props.rows) as RowData[]\n })\n // Debounced copy of the quick filter so typing stays responsive on large data sets.\n const quickApplied = ref(quick.value ?? '')\n let quickApplyTimer: ReturnType<typeof setTimeout> | undefined\n watch(quick, (q) => { clearTimeout(quickApplyTimer); quickApplyTimer = setTimeout(() => (quickApplied.value = q ?? ''), raw.value.length > 20000 ? 160 : 0) })\n const filteredIdx = computed(() => (isServer.value ? [] : filterRows(raw.value, baseCols.value, filterModelObj.value, quickApplied.value)))\n const sortedIdx = computed(() => sortIndices(raw.value, filteredIdx.value, baseCols.value, sortModelList.value))\n const pivot = computed(() => (props.pivotMode && props.pivotColumn && !isServer.value ? pivotRows(raw.value, sortedIdx.value, baseCols.value, groupBy.value, props.pivotColumn) : null))\n const viewRows = computed(() => (pivot.value ? pivot.value.rows : raw.value))\n const viewIdx = computed(() => (pivot.value ? pivot.value.rows.map((_, i) => i) : sortedIdx.value))\n const viewCols = computed(() => (pivot.value ? pivot.value.columns.map((c) => ({ ...props.defaultColDef, ...c }) as ColumnDef) : baseCols.value))\n const groups = computed(() => {\n if (isServer.value || pivot.value) return null\n if (props.treeData && props.getDataPath) return treeRows(viewRows.value, viewIdx.value, viewCols.value, props.getDataPath)\n return groupBy.value.length ? groupRows(viewRows.value, viewIdx.value, viewCols.value, groupBy.value) : null\n })\n const hasGroups = computed(() => !!groups.value)\n const expanded = ref(new Set<string>())\n const collapsed = ref(new Set<string>())\n const expandAllFlag = ref(props.groupDefaultExpanded === -1)\n const detailOpen = ref(new Set<string>())\n watch(groups, (g) => {\n if (!g || props.groupDefaultExpanded <= 0) return\n const ids = new Set(expanded.value)\n const walk = (nodes: typeof g, lvl: number) => nodes.forEach((n) => { if (lvl < props.groupDefaultExpanded) { ids.add(n.id); walk(n.children, lvl + 1) } })\n walk(g, 0)\n expanded.value = ids\n }, { immediate: true })\n\n const display = computed<DisplayRow[]>(() =>\n flatten(viewRows.value, viewIdx.value, groups.value, {\n expanded: expanded.value,\n expandAll: expandAllFlag.value,\n collapsed: collapsed.value,\n rowId: rowIdOf,\n detailOpen: props.masterDetail ? detailOpen.value : undefined,\n tree: props.treeData,\n }),\n )\n\n // pagination\n const page = ref(1)\n const pageSizeState = ref(props.pageSize)\n const pageCount = computed(() => Math.max(1, Math.ceil(display.value.length / pageSizeState.value)))\n watch([pageCount, filteredIdx], () => (page.value = Math.min(page.value, pageCount.value)))\n const paged = computed(() => (props.pagination ? display.value.slice((page.value - 1) * pageSizeState.value, page.value * pageSizeState.value) : display.value))\n const onPageSize = (e: Event) => { pageSizeState.value = Number((e.target as HTMLSelectElement).value); page.value = 1 }\n const pageRangeText = computed(() => {\n const n = display.value.length\n const a = n ? (page.value - 1) * pageSizeState.value + 1 : 0\n return config.locale.messages.pageRange.replace('{0}', String(a)).replace('{1}', String(Math.min(n, page.value * pageSizeState.value))).replace('{2}', String(n))\n })\n\n // ---------- server (infinite) row model ----------\n const blocks = new Map<number, RowData[] | 'loading'>()\n const blockVersion = ref(0)\n const serverCount = ref(0)\n const serverLoading = ref(false)\n let epoch = 0\n const loadBlock = async (b: number) => {\n if (!props.datasource || blocks.has(b)) return\n blocks.set(b, 'loading')\n const my = epoch\n serverLoading.value = true\n try {\n const res = await props.datasource.getRows({ startRow: b * props.blockSize, endRow: (b + 1) * props.blockSize, sortModel: sortModelList.value, filterModel: filterModelObj.value, quickFilter: quick.value ?? '' })\n if (my !== epoch) return\n blocks.set(b, res.rows)\n if (res.lastRow != null) serverCount.value = res.lastRow\n else if (res.rows.length < props.blockSize) serverCount.value = b * props.blockSize + res.rows.length\n else serverCount.value = Math.max(serverCount.value, (b + 2) * props.blockSize)\n } catch {\n if (my === epoch) blocks.delete(b)\n } finally {\n if (my === epoch) { serverLoading.value = [...blocks.values()].some((v) => v === 'loading'); blockVersion.value++ }\n }\n }\n const purge = () => {\n epoch++\n blocks.clear()\n serverCount.value = 0\n blockVersion.value++\n if (viewport.value) viewport.value.scrollTop = 0\n loadBlock(0)\n }\n let quickTimer: ReturnType<typeof setTimeout> | undefined\n watch([sortModelList, filterModelObj], () => isServer.value && purge(), { deep: true })\n watch(quick, () => { if (!isServer.value) return; clearTimeout(quickTimer); quickTimer = setTimeout(purge, 250) })\n // First block loads on mount (not during server rendering); later datasource swaps purge immediately.\n watch(() => props.datasource, (ds) => ds && purge())\n onMounted(() => props.datasource && purge())\n\n const rowCount = computed(() => (isServer.value ? serverCount.value : paged.value.length))\n const rowAt = (i: number): DisplayRow => {\n if (!isServer.value) return paged.value[i]\n void blockVersion.value\n const b = Math.floor(i / props.blockSize)\n const data = blocks.get(b)\n if (Array.isArray(data)) {\n const row = data[i - b * props.blockSize]\n if (row) return { kind: 'data', id: rowIdOf(row, i), data: row, level: 0, sourceIndex: i }\n }\n return { kind: 'loading', id: `__loading_${i}`, data: null, level: 0 }\n }\n\n // ---------- column layout ----------\n const titleOf = (id: string) => {\n const c = viewCols.value.find((x) => colIdOf(x) === id) ?? baseCols.value.find((x) => colIdOf(x) === id)\n return c?.headerName ?? (c?.field ? c.field.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, (s) => s.toUpperCase()) : id)\n }\n const groupColDef = computed<ColumnDef>(() => ({ colId: '__group', headerName: props.treeData ? 'Name' : 'Group', width: 240, sortable: false, filter: false, suppressMenu: true, lockPosition: true, ...props.groupColumn }))\n const orderedCols = computed(() => {\n const cols = viewCols.value\n const byId = new Map(cols.map((c) => [colIdOf(c), c]))\n const ordered = pivot.value ? cols : [...colOrder.value.map((id) => byId.get(id)).filter(Boolean) as ColumnDef[], ...cols.filter((c) => !colOrder.value.includes(colIdOf(c)))]\n const auto: ColumnDef[] = []\n if (props.rowSelection === 'multiple' && props.selectionColumn) auto.push(SELECT_COL)\n if (groups.value || (props.masterDetail && !props.treeData)) auto.push(groupColDef.value)\n return { auto, ordered }\n })\n const visibleCols = computed(() => {\n const { auto, ordered } = orderedCols.value\n const list = [\n ...auto.map((c) => ({ id: colIdOf(c), col: c, auto: true })),\n ...ordered.filter((c) => !(colHidden.value[colIdOf(c)] ?? c.hide)).map((c) => ({ id: colIdOf(c), col: c, auto: false })),\n ]\n const resolved = list.map((x) => ({\n ...x,\n pinned: x.auto ? ('left' as const) : colPinned.value[x.id] !== undefined ? colPinned.value[x.id] : x.col.pinned ?? null,\n width: colWidth.value[x.id] ?? x.col.width ?? (x.col.flex ? 0 : 150),\n title: x.id === '__group' ? (x.col.headerName as string) : titleOf(x.id),\n }))\n // pinned-left auto columns only when something else is pinned left, else keep them first in the centre\n const anyLeft = resolved.some((r) => !r.auto && r.pinned === 'left')\n if (!anyLeft) resolved.forEach((r) => { if (r.auto) r.pinned = null })\n // flex distribution\n const fixed = resolved.reduce((s, r) => s + (r.col.flex && colWidth.value[r.id] == null ? 0 : r.width), 0)\n const flexCols = resolved.filter((r) => r.col.flex && colWidth.value[r.id] == null)\n const totalFlex = flexCols.reduce((s, r) => s + (r.col.flex ?? 0), 0)\n const avail = Math.max(0, vpWidth.value - fixed - 2)\n for (const r of flexCols) r.width = clamp(Math.floor((avail * (r.col.flex ?? 1)) / totalFlex), r.col.minWidth ?? 80, r.col.maxWidth ?? 4000)\n const left = resolved.filter((r) => r.pinned === 'left')\n const right = resolved.filter((r) => r.pinned === 'right')\n const center = resolved.filter((r) => !r.pinned)\n return { left, center, right }\n })\n const flatCols = computed(() => [...visibleCols.value.left, ...visibleCols.value.center, ...visibleCols.value.right])\n const flatIndex = computed(() => new Map(flatCols.value.map((c, i) => [c.id, i])))\n const leftWidth = computed(() => visibleCols.value.left.reduce((s, c) => s + c.width, 0))\n const rightWidth = computed(() => visibleCols.value.right.reduce((s, c) => s + c.width, 0))\n const centerOffsets = computed(() => {\n const o = [0]\n for (const c of visibleCols.value.center) o.push(o[o.length - 1] + c.width)\n return o\n })\n const totalWidth = computed(() => leftWidth.value + rightWidth.value + centerOffsets.value[centerOffsets.value.length - 1])\n\n const renderCols = computed<RCol[]>(() => {\n const { left, center, right } = visibleCols.value\n const out: RCol[] = []\n let acc = 0\n left.forEach((c, i) => {\n out.push({ key: c.id, id: c.id, col: c.col, title: c.title, width: c.width, pinned: 'left', auto: c.auto, flatIndex: flatIndex.value.get(c.id)!, edgeLeft: i === left.length - 1, style: { width: `${c.width}px`, left: `${acc}px` } })\n acc += c.width\n })\n // centre column virtualization\n const offs = centerOffsets.value\n const viewW = Math.max(0, vpWidth.value - leftWidth.value - rightWidth.value)\n let start = 0\n while (start < center.length && offs[start + 1] < scrollLeft.value) start++\n let end = start\n while (end < center.length && offs[end] < scrollLeft.value + viewW) end++\n start = Math.max(0, start - 2)\n end = Math.min(center.length, end + 2)\n if (offs[start] > 0) out.push({ key: '__padL', id: '__padL', col: null, title: '', width: offs[start], pinned: null, flatIndex: -1, style: { width: `${offs[start]}px` } })\n for (let i = start; i < end; i++) {\n const c = center[i]\n out.push({ key: c.id, id: c.id, col: c.col, title: c.title, width: c.width, pinned: null, auto: c.auto, flatIndex: flatIndex.value.get(c.id)!, style: { width: `${c.width}px` } })\n }\n const padR = offs[center.length] - offs[end]\n if (padR > 0) out.push({ key: '__padR', id: '__padR', col: null, title: '', width: padR, pinned: null, flatIndex: -1, style: { width: `${padR}px` } })\n let racc = 0\n for (let i = right.length - 1; i >= 0; i--) {\n const c = right[i]\n out.push({ key: c.id, id: c.id, col: c.col, title: c.title, width: c.width, pinned: 'right', auto: c.auto, flatIndex: flatIndex.value.get(c.id)!, edgeRight: i === 0, style: { width: `${c.width}px`, right: `${racc}px` } })\n racc += c.width\n }\n // right pinned were pushed in reverse; restore visual order\n const rightPart = out.splice(out.length - right.length, right.length).reverse()\n return [...out, ...rightPart]\n })\n\n const hasHeaderGroups = computed(() => flatCols.value.some((c) => c.col.group))\n const headerGroups = computed(() => {\n type HG = { key: string; label: string; pin: 'left' | 'right' | null; width: number; style: Record<string, string>; cls: Record<string, boolean> }\n const out: HG[] = []\n for (const rc of renderCols.value) {\n const label = rc.col?.group ?? ''\n const last = out[out.length - 1]\n if (last && label && rc.col && last.label === label && last.pin === rc.pinned) {\n last.width += rc.width\n last.style.width = `${last.width}px`\n continue\n }\n const style: Record<string, string> = { width: `${rc.width}px` }\n if (rc.pinned === 'left') style.left = rc.style.left\n if (rc.pinned === 'right') style.right = rc.style.right\n out.push({\n key: `${rc.key}-g`, label: rc.col ? label : '', pin: rc.pinned, width: rc.width, style,\n cls: { 'sq-datagrid__hcell--pinned-left': rc.pinned === 'left', 'sq-datagrid__hcell--pinned-right': rc.pinned === 'right', 'sq-datagrid__header-group--empty': !label },\n })\n }\n // a right-pinned group's sticky offset is its rightmost member's offset\n return out\n })\n\n // ---------- row virtualization ----------\n const filterRowHeight = 38\n const headBlock = computed(() => props.headerHeight * (hasHeaderGroups.value ? 2 : 1) + (props.floatingFilters ? filterRowHeight : 0) + props.pinnedTopRows.length * props.rowHeight)\n const layout = computed(() => {\n if (isServer.value) {\n const n = serverCount.value\n return { offsets: null as Float64Array | null, total: n * props.rowHeight, indexAt: (y: number) => Math.floor(y / props.rowHeight) }\n }\n return rowLayout(paged.value, props.rowHeight, props.detailHeight)\n })\n const range = computed(() => {\n const n = rowCount.value\n if (!n) return { start: 0, end: -1 }\n const top = Math.max(0, scrollTop.value)\n const start = Math.max(0, layout.value.indexAt(top) - 6)\n const end = Math.min(n - 1, layout.value.indexAt(top + vpHeight.value) + 6)\n return { start, end }\n })\n const visibleRows = computed<VRow[]>(() => {\n const out: VRow[] = []\n const { start, end } = range.value\n const offs = layout.value.offsets\n for (let i = start; i <= end; i++) {\n const row = rowAt(i)\n if (!row) continue\n const top = offs ? offs[i] : i * props.rowHeight\n const height = offs ? offs[i + 1] - offs[i] : props.rowHeight\n out.push({ index: i, top, height, row })\n }\n return out\n })\n watch(range, (r) => {\n if (!isServer.value || r.end < 0) return\n for (let b = Math.floor(r.start / props.blockSize); b <= Math.floor(r.end / props.blockSize); b++) loadBlock(b)\n })\n\n // Scroll events already fire at most once per frame and Vue batches the re-render, so no rAF throttle\n // (rAF also stalls in background tabs, which would leave stale rows).\n const onScroll = () => {\n const el = viewport.value\n if (!el) return\n scrollTop.value = el.scrollTop\n scrollLeft.value = el.scrollLeft\n }\n let ro: ResizeObserver | undefined\n onMounted(() => {\n const el = viewport.value!\n const measure = () => { vpWidth.value = el.clientWidth; vpHeight.value = el.clientHeight }\n measure()\n if (typeof ResizeObserver !== 'undefined') { ro = new ResizeObserver(measure); ro.observe(el) }\n })\n onBeforeUnmount(() => { ro?.disconnect(); clearTimeout(quickTimer); clearTimeout(quickApplyTimer); window.removeEventListener('pointermove', onResizeMove); window.removeEventListener('pointerup', onResizeEnd); window.removeEventListener('mouseup', endSelect) })\n\n // ---------- values & formatting ----------\n const getters = new WeakMap<ColumnDef, (row: RowData) => CellValue>()\n const cellValue = (rc: { col: ColumnDef | null }, row: RowData | null) => {\n if (!rc.col || !row) return undefined\n let g = getters.get(rc.col)\n if (!g) getters.set(rc.col, (g = makeGetter(rc.col)))\n return g(row)\n }\n let numFmt: Intl.NumberFormat | null = null\n let numFmtLocale = ''\n const fmtNum = (v: number) => {\n if (numFmtLocale !== loc.value) { numFmt = new Intl.NumberFormat(loc.value, { maximumFractionDigits: 2 }); numFmtLocale = loc.value }\n return numFmt!.format(v)\n }\n const formatValue = (col: ColumnDef, v: CellValue, row: RowData | null) => {\n if (col.valueFormatter) return col.valueFormatter(v, row as RowData)\n if (v == null || v === '') return ''\n if (col.type === 'number' && typeof v === 'number') return fmtNum(v)\n if (col.type === 'date') return formatDate(v as string, loc.value)\n return String(v)\n }\n const formatCell = (rc: RCol, row: RowData | null) => (rc.col ? formatValue(rc.col, cellValue(rc, row), row) : '')\n const cellParams = (row: RowData | null, rc: RCol, rowIndex: number) => ({ value: cellValue(rc, row), formatted: formatCell(rc, row), row, column: rc.col, rowIndex })\n const groupLabel = (row: DisplayRow) => {\n if (row.kind === 'group') {\n const g = row.group!\n if (g.colId === '__tree') return String(g.key ?? '')\n const col = viewCols.value.find((c) => colIdOf(c) === g.colId)\n return col ? formatValue(col, g.key, null) || '(Blank)' : String(g.key ?? '')\n }\n if (props.treeData && props.getDataPath && row.data) {\n const p = props.getDataPath(row.data)\n return p[p.length - 1]\n }\n return ''\n }\n const groupAggText = (row: DisplayRow, rc: RCol) => {\n if (!rc.col) return ''\n const v = row.group?.agg[rc.id]\n if (v === undefined) return row.data && props.treeData ? formatCell(rc, row.data) : ''\n return formatValue(rc.col, v, null)\n }\n const filterKind = (col: ColumnDef) => filterKindOf(col)\n const distinctValues = (id: string) => {\n const col = baseCols.value.find((c) => colIdOf(c) === id)\n if (!col) return []\n const get = makeGetter(col)\n const set = new Set<CellValue>()\n for (const r of raw.value) {\n set.add(get(r))\n if (set.size > 5000) break\n }\n return Array.from(set).sort((a, b) => String(a ?? '').localeCompare(String(b ?? ''), undefined, { numeric: true }))\n }\n\n // ---------- sorting / filtering / grouping ----------\n const sortIndex = (id: string) => sortModelList.value.findIndex((s) => s.colId === id)\n const sortDir = (id: string) => sortModelList.value.find((s) => s.colId === id)?.sort\n const ariaSort = (id: string) => (sortDir(id) === 'asc' ? 'ascending' : sortDir(id) === 'desc' ? 'descending' : 'none')\n const setSort = (id: string, dir: 'asc' | 'desc' | null, multi = false) => {\n const rest = multi ? sortModelList.value.filter((s) => s.colId !== id) : []\n sortModelRef.value = dir ? [...rest, { colId: id, sort: dir }] : rest\n }\n let resized = false\n const onHeaderClick = (e: MouseEvent, rc: RCol) => {\n if (resized) return void (resized = false)\n if (!rc.col || rc.auto || rc.col.sortable === false) return\n const cur = sortDir(rc.id)\n const next = cur === 'asc' ? 'desc' : cur === 'desc' ? null : 'asc'\n if (e.shiftKey) {\n const list = sortModelList.value.slice()\n const i = list.findIndex((s) => s.colId === rc.id)\n if (next && i >= 0) list[i] = { colId: rc.id, sort: next }\n else if (next) list.push({ colId: rc.id, sort: next })\n else list.splice(i, 1)\n sortModelRef.value = list\n } else setSort(rc.id, next)\n }\n const setFilter = (id: string, cond: FilterCondition | undefined) => {\n const next = { ...filterModelObj.value }\n if (cond) next[id] = cond\n else delete next[id]\n filterModelRef.value = next\n }\n const floatingValue = (id: string) => {\n const f = filterModelObj.value[id]\n return f && f.kind !== 'set' ? (f.value as string) ?? '' : ''\n }\n let floatTimer: ReturnType<typeof setTimeout> | undefined\n const onFloatingInput = (e: Event, rc: RCol) => {\n const value = (e.target as HTMLInputElement).value\n const kind = filterKind(rc.col!)\n clearTimeout(floatTimer)\n floatTimer = setTimeout(() => setFilter(rc.id, value === '' ? undefined : { kind, op: kind === 'text' ? 'contains' : 'equals', value: kind === 'number' ? Number(value) : value }), 180)\n }\n const toggleGroupBy = (id: string) => (groupByRef.value = groupBy.value.includes(id) ? groupBy.value.filter((x) => x !== id) : [...groupBy.value, id])\n const removeGroup = (id: string) => (groupByRef.value = groupBy.value.filter((x) => x !== id))\n const toggleGroup = (row: DisplayRow) => {\n if (expandAllFlag.value) {\n const s = new Set(collapsed.value)\n s.has(row.id) ? s.delete(row.id) : s.add(row.id)\n collapsed.value = s\n } else {\n const s = new Set(expanded.value)\n s.has(row.id) ? s.delete(row.id) : s.add(row.id)\n expanded.value = s\n }\n }\n const expandAll = () => { expandAllFlag.value = true; collapsed.value = new Set() }\n const collapseAll = () => { expandAllFlag.value = false; expanded.value = new Set() }\n const toggleDetail = (id: string) => {\n const s = new Set(detailOpen.value)\n s.has(id) ? s.delete(id) : s.add(id)\n detailOpen.value = s\n }\n\n // ---------- column state ops ----------\n const emitColumnState = () => emit('column-state-change', flatCols.value.filter((c) => !c.auto).map((c) => ({ colId: c.id, width: c.width, hide: false, pinned: c.pinned })))\n const setHidden = (id: string, hide: boolean) => { colHidden.value = { ...colHidden.value, [id]: hide }; emitColumnState() }\n const setPinned = (id: string, pin: 'left' | 'right' | null) => { colPinned.value = { ...colPinned.value, [id]: pin }; emitColumnState() }\n const chooserCols = computed(() => orderedCols.value.ordered.map((c) => ({ id: colIdOf(c), title: titleOf(colIdOf(c)), hidden: colHidden.value[colIdOf(c)] ?? !!c.hide })))\n\n let resizeState: { id: string; startX: number; startW: number; min: number; max: number } | null = null\n const onResizeMove = (e: PointerEvent) => {\n if (!resizeState) return\n const w = clamp(resizeState.startW + e.clientX - resizeState.startX, resizeState.min, resizeState.max)\n colWidth.value = { ...colWidth.value, [resizeState.id]: Math.round(w) }\n }\n const onResizeEnd = () => {\n if (resizeState) { resized = true; setTimeout(() => (resized = false), 0); emitColumnState() }\n resizeState = null\n window.removeEventListener('pointermove', onResizeMove)\n window.removeEventListener('pointerup', onResizeEnd)\n }\n const startResize = (e: PointerEvent, rc: RCol) => {\n resizeState = { id: rc.id, startX: e.clientX, startW: rc.width, min: rc.col?.minWidth ?? 48, max: rc.col?.maxWidth ?? 2000 }\n window.addEventListener('pointermove', onResizeMove)\n window.addEventListener('pointerup', onResizeEnd)\n }\n let canvas: HTMLCanvasElement | null = null\n const autoSize = (ids?: string[]) => {\n canvas ??= document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx || !viewport.value) return\n const cs = getComputedStyle(viewport.value)\n ctx.font = `${cs.fontWeight} ${cs.fontSize} ${cs.fontFamily}`\n const sample = isServer.value ? [] : paged.value.filter((r) => r.kind === 'data').slice(0, 300)\n const next = { ...colWidth.value }\n for (const c of flatCols.value) {\n if (c.auto || (ids && !ids.includes(c.id))) continue\n let w = ctx.measureText(c.title).width + 64\n for (const r of sample) w = Math.max(w, ctx.measureText(formatValue(c.col, cellValue(c, r.data), r.data)).width + 32)\n next[c.id] = Math.ceil(clamp(w, c.col.minWidth ?? 48, c.col.maxWidth ?? 600))\n }\n colWidth.value = next\n emitColumnState()\n }\n const dragColId = ref<string | null>(null)\n const dropTarget = ref<{ id: string; before: boolean } | null>(null)\n const onDragStart = (e: DragEvent, rc: RCol) => {\n if (!rc.col || rc.auto || rc.col.lockPosition) return e.preventDefault()\n dragColId.value = rc.id\n e.dataTransfer?.setData('text/plain', rc.id)\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move'\n }\n const onDragOver = (e: DragEvent, rc: RCol) => {\n if (!dragColId.value || !rc.col || rc.auto) return\n dropTarget.value = { id: rc.id, before: e.offsetX < rc.width / 2 }\n }\n const onDrop = (rc: RCol) => {\n const from = dragColId.value\n const target = dropTarget.value\n dragColId.value = null\n dropTarget.value = null\n if (!from || !target || from === target.id || !rc.col || rc.auto) return\n const order = colOrder.value.filter((id) => id !== from)\n const i = order.indexOf(target.id)\n order.splice(target.before ? i : i + 1, 0, from)\n colOrder.value = order\n const pin = visibleCols.value.left.some((c) => c.id === target.id) ? 'left' : visibleCols.value.right.some((c) => c.id === target.id) ? 'right' : null\n colPinned.value = { ...colPinned.value, [from]: pin }\n emitColumnState()\n }\n const onGroupDrop = () => {\n const id = dragColId.value\n dragColId.value = null\n if (id && !groupBy.value.includes(id)) groupByRef.value = [...groupBy.value, id]\n }\n\n // ---------- selection ----------\n const dataIdsInView = () => (isServer.value ? [] : viewIdx.value.map((i) => rowIdOf(viewRows.value[i], i)))\n const setSelected = (ids: string[]) => {\n selectedRef.value = ids\n emit('selection-change', ids)\n }\n const allSelected = computed(() => {\n const ids = filteredIdx.value\n return ids.length > 0 && selectedIds.value.length >= ids.length && ids.every((i) => selectedSet.value.has(rowIdOf(raw.value[i], i)))\n })\n const someSelected = computed(() => !allSelected.value && selectedIds.value.length > 0)\n const toggleAll = () => setSelected(allSelected.value ? [] : dataIdsInView())\n const isRowChecked = (row: DisplayRow) => (row.kind === 'group' ? row.group!.leafIds.every((id) => selectedSet.value.has(id)) : selectedSet.value.has(row.id))\n const isRowPartial = (row: DisplayRow) => row.kind === 'group' && !isRowChecked(row) && row.group!.leafIds.some((id) => selectedSet.value.has(id))\n const toggleRowCheck = (row: DisplayRow) => {\n const ids = row.kind === 'group' ? row.group!.leafIds : [row.id]\n const on = isRowChecked(row)\n const s = new Set(selectedIds.value)\n ids.forEach((id) => (on ? s.delete(id) : s.add(id)))\n setSelected(Array.from(s))\n }\n let lastClicked = -1\n const onRowClick = (e: MouseEvent, vr: VRow) => {\n if (vr.row.kind !== 'data') return\n emit('row-click', { row: vr.row.data, event: e })\n if (!props.rowSelection) return\n if (props.rowSelection === 'single') setSelected(selectedSet.value.has(vr.row.id) && (e.ctrlKey || e.metaKey) ? [] : [vr.row.id])\n else if (e.shiftKey && lastClicked >= 0) {\n const [a, b] = [Math.min(lastClicked, vr.index), Math.max(lastClicked, vr.index)]\n const ids = new Set(selectedIds.value)\n for (let i = a; i <= b; i++) { const r = rowAt(i); if (r?.kind === 'data') ids.add(r.id) }\n setSelected(Array.from(ids))\n } else if (e.ctrlKey || e.metaKey) toggleRowCheck(vr.row)\n else if (!props.selectionColumn) setSelected([vr.row.id])\n lastClicked = vr.index\n }\n\n // ---------- focus, range, editing ----------\n const focus = ref<{ row: number; col: number } | null>(null)\n const cellRange = ref<CellRange | null>(null)\n let anchor: { row: number; col: number } | null = null\n let selecting = false\n const endSelect = () => { selecting = false; window.removeEventListener('mouseup', endSelect) }\n const setRange = (a: { row: number; col: number }, b: { row: number; col: number }) =>\n (cellRange.value = { startRow: Math.min(a.row, b.row), endRow: Math.max(a.row, b.row), startCol: Math.min(a.col, b.col), endCol: Math.max(a.col, b.col) })\n const inRange = (row: number, col: number) => {\n const r = cellRange.value\n return !!r && (r.startRow !== r.endRow || r.startCol !== r.endCol) && row >= r.startRow && row <= r.endRow && col >= r.startCol && col <= r.endCol\n }\n const onCellMousedown = (e: MouseEvent, vr: VRow, rc: RCol) => {\n if (!rc.col || e.button !== 0) return\n const pos = { row: vr.index, col: rc.flatIndex }\n if (editing.value && !isEditing(vr, rc)) commitEdit()\n if (e.shiftKey && focus.value) setRange(focus.value, pos)\n else { focus.value = pos; anchor = pos; setRange(pos, pos) }\n selecting = true\n window.addEventListener('mouseup', endSelect)\n emit('cell-click', { row: vr.row.data, colId: rc.id, value: cellValue(rc, vr.row.data), event: e })\n }\n const onCellEnter = (vr: VRow, rc: RCol) => { if (selecting && anchor && rc.col) setRange(anchor, { row: vr.index, col: rc.flatIndex }) }\n\n const editing = ref<{ row: number; colId: string; value: CellValue } | null>(null)\n const isEditable = (col: ColumnDef, row: RowData | null) => !!row && (typeof col.editable === 'function' ? col.editable(row) : !!col.editable)\n const isEditing = (vr: VRow, rc: RCol) => !!editing.value && editing.value.row === vr.index && editing.value.colId === rc.id\n const editorKind = (rc: RCol) => rc.col?.cellEditor ?? (rc.col?.type === 'number' ? 'number' : rc.col?.type === 'date' ? 'date' : 'text')\n const undoStack: Change[][] = []\n const redoStack: Change[][] = []\n const canUndo = ref(false)\n const applyChanges = (changes: Change[], dir: 'new' | 'old') => {\n for (const c of changes) {\n const v = dir === 'new' ? c.newValue : c.oldValue\n if (c.col.valueSetter) c.col.valueSetter(c.row, v)\n else if (c.col.field) setByPath(c.row, c.col.field, v)\n emit('cell-value-changed', { row: c.row, colId: colIdOf(c.col), oldValue: dir === 'new' ? c.oldValue : c.newValue, newValue: v })\n }\n dataVersion.value++\n }\n const record = (changes: Change[]) => {\n if (!changes.length) return\n applyChanges(changes, 'new')\n undoStack.push(changes)\n if (undoStack.length > 100) undoStack.shift()\n redoStack.length = 0\n canUndo.value = true\n }\n const undo = () => { const c = undoStack.pop(); if (c) { applyChanges(c, 'old'); redoStack.push(c) } canUndo.value = undoStack.length > 0 }\n const redo = () => { const c = redoStack.pop(); if (c) { applyChanges(c, 'new'); undoStack.push(c) } canUndo.value = undoStack.length > 0 }\n const parseFor = (col: ColumnDef, text: string, row: RowData): CellValue => {\n if (col.valueParser) return col.valueParser(text, row)\n if (col.type === 'number') return text === '' ? null : Number(text.replace(/[^\\d.-]/g, ''))\n if (col.type === 'boolean') return /^(true|1|yes|✓)$/i.test(text)\n return text\n }\n const startEdit = (rowIndex: number, flatCol: number, initial?: string) => {\n const c = flatCols.value[flatCol]\n const r = rowAt(rowIndex)\n if (!c || !r || r.kind !== 'data' || !isEditable(c.col, r.data)) return\n if (c.col.type === 'boolean') return record([{ row: r.data!, col: c.col, oldValue: cellValue(c, r.data), newValue: !cellValue(c, r.data) }])\n editing.value = { row: rowIndex, colId: c.id, value: initial ?? (cellValue(c, r.data) as CellValue) }\n nextTick(() => {\n const el = viewport.value?.querySelector<HTMLInputElement>('.sq-datagrid__editor')\n el?.focus()\n if (initial === undefined) el?.select?.()\n })\n }\n const onEditorInput = (e: Event) => editing.value && (editing.value = { ...editing.value, value: (e.target as HTMLInputElement).value })\n const commitEdit = () => {\n const ed = editing.value\n if (!ed) return\n editing.value = null\n const r = rowAt(ed.row)\n const c = flatCols.value.find((x) => x.id === ed.colId)\n if (!r?.data || !c) return\n const newValue = parseFor(c.col, String(ed.value ?? ''), r.data)\n const oldValue = cellValue(c, r.data)\n if (newValue !== oldValue) record([{ row: r.data, col: c.col, oldValue, newValue }])\n }\n const cancelEdit = () => { editing.value = null; rootEl()?.focus() }\n const onEditorKey = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === 'Tab') { e.preventDefault(); commitEdit(); rootEl()?.focus(); moveFocus(e.key === 'Enter' ? (e.shiftKey ? -1 : 1) : 0, e.key === 'Tab' ? (e.shiftKey ? -1 : 1) : 0, false) }\n else if (e.key === 'Escape') cancelEdit()\n }\n const onCellDblclick = (vr: VRow, rc: RCol) => rc.col && startEdit(vr.index, rc.flatIndex)\n\n const rootEl = () => viewport.value?.parentElement as HTMLElement | null\n const ensureVisible = (row: number, col: number) => {\n const el = viewport.value\n if (!el) return\n const offs = layout.value.offsets\n const top = offs ? offs[row] : row * props.rowHeight\n const h = offs ? offs[row + 1] - offs[row] : props.rowHeight\n const bodyTop = el.scrollTop\n const visibleH = el.clientHeight - headBlock.value\n if (top < bodyTop) el.scrollTop = top\n else if (top + h > bodyTop + visibleH) el.scrollTop = top + h - visibleH\n const c = flatCols.value[col]\n if (c && !c.pinned) {\n const ci = visibleCols.value.center.indexOf(c as (typeof visibleCols.value.center)[number])\n const x = centerOffsets.value[ci]\n const viewW = el.clientWidth - leftWidth.value - rightWidth.value\n if (x < el.scrollLeft) el.scrollLeft = x\n else if (x + c.width > el.scrollLeft + viewW) el.scrollLeft = x + c.width - viewW\n }\n }\n const moveFocus = (dr: number, dc: number, extend: boolean) => {\n const f = focus.value ?? { row: 0, col: 0 }\n const next = { row: clamp(f.row + dr, 0, Math.max(0, rowCount.value - 1)), col: clamp(f.col + dc, 0, Math.max(0, flatCols.value.length - 1)) }\n focus.value = next\n if (extend && anchor) setRange(anchor, next)\n else { anchor = next; setRange(next, next) }\n ensureVisible(next.row, next.col)\n }\n const rangeCells = () => {\n const r = cellRange.value ?? (focus.value ? { startRow: focus.value.row, endRow: focus.value.row, startCol: focus.value.col, endCol: focus.value.col } : null)\n return r\n }\n const copy = async (withHeaders = false) => {\n const r = rangeCells()\n let lines: string[][] = []\n let header: string[] = []\n if (props.rowSelection && selectedIds.value.length && (!r || (r.startRow === r.endRow && r.startCol === r.endCol))) {\n const cols = flatCols.value.filter((c) => !c.auto)\n header = cols.map((c) => c.title)\n const sel = selectedSet.value\n lines = viewIdx.value.filter((i) => sel.has(rowIdOf(viewRows.value[i], i))).map((i) => cols.map((c) => String(cellValue(c, viewRows.value[i]) ?? '')))\n } else if (r) {\n const cols = flatCols.value.slice(r.startCol, r.endCol + 1).filter((c) => !c.auto)\n header = cols.map((c) => c.title)\n for (let i = r.startRow; i <= r.endRow; i++) {\n const row = rowAt(i)\n if (row?.kind === 'data') lines.push(cols.map((c) => String(cellValue(c, row.data) ?? '')))\n }\n }\n const text = [...(withHeaders ? [header] : []), ...lines].map((l) => l.join('\\t')).join('\\n')\n try { await navigator.clipboard.writeText(text) } catch { /* clipboard unavailable (insecure context) */ }\n return text\n }\n const onPaste = (e: ClipboardEvent) => {\n if (editing.value || !focus.value) return\n const text = e.clipboardData?.getData('text/plain')\n if (!text) return\n e.preventDefault()\n const grid = parseTsv(text)\n const changes: Change[] = []\n grid.forEach((line, dr) => line.forEach((cellText, dc) => {\n const row = rowAt(focus.value!.row + dr)\n const c = flatCols.value[focus.value!.col + dc]\n if (row?.kind === 'data' && c && !c.auto && isEditable(c.col, row.data)) changes.push({ row: row.data!, col: c.col, oldValue: cellValue(c, row.data), newValue: parseFor(c.col, cellText, row.data!) })\n }))\n record(changes)\n }\n const clearRange = () => {\n const r = rangeCells()\n if (!r) return\n const changes: Change[] = []\n for (let i = r.startRow; i <= r.endRow; i++)\n for (let j = r.startCol; j <= r.endCol; j++) {\n const row = rowAt(i)\n const c = flatCols.value[j]\n if (row?.kind === 'data' && c && !c.auto && isEditable(c.col, row.data)) changes.push({ row: row.data!, col: c.col, oldValue: cellValue(c, row.data), newValue: c.col.type === 'number' ? null : '' })\n }\n record(changes)\n }\n const onKeydown = (e: KeyboardEvent) => {\n if (editing.value || (e.target as HTMLElement).closest('input, select, textarea, .sq-datagrid__toolbar')) return\n const mod = e.ctrlKey || e.metaKey\n const page = Math.max(1, Math.floor((vpHeight.value - headBlock.value) / props.rowHeight) - 1)\n const map: Record<string, [number, number]> = { ArrowUp: [-1, 0], ArrowDown: [1, 0], ArrowLeft: [0, -1], ArrowRight: [0, 1], PageUp: [-page, 0], PageDown: [page, 0] }\n if (map[e.key]) { e.preventDefault(); moveFocus(map[e.key][0], map[e.key][1], e.shiftKey) }\n else if (e.key === 'Home') { e.preventDefault(); moveFocus(mod ? -rowCount.value : 0, -flatCols.value.length, e.shiftKey) }\n else if (e.key === 'End') { e.preventDefault(); moveFocus(mod ? rowCount.value : 0, flatCols.value.length, e.shiftKey) }\n else if (e.key === 'Tab' && focus.value) { e.preventDefault(); moveFocus(0, e.shiftKey ? -1 : 1, false) }\n else if ((e.key === 'Enter' || e.key === 'F2') && focus.value) { e.preventDefault(); const r = rowAt(focus.value.row); r?.kind === 'group' ? toggleGroup(r) : startEdit(focus.value.row, focus.value.col) }\n else if (e.key === ' ' && focus.value && props.rowSelection) { e.preventDefault(); const r = rowAt(focus.value.row); if (r && r.kind !== 'loading' && r.kind !== 'detail') toggleRowCheck(r) }\n else if (mod && e.key.toLowerCase() === 'c') { e.preventDefault(); copy(e.shiftKey) }\n else if (mod && e.key.toLowerCase() === 'a') { e.preventDefault(); if (props.rowSelection === 'multiple') setSelected(dataIdsInView()); else cellRange.value = { startRow: 0, endRow: rowCount.value - 1, startCol: 0, endCol: flatCols.value.length - 1 } }\n else if (mod && e.key.toLowerCase() === 'z') { e.preventDefault(); e.shiftKey ? redo() : undo() }\n else if (mod && e.key.toLowerCase() === 'y') { e.preventDefault(); redo() }\n else if (e.key === 'Delete' || e.key === 'Backspace') { e.preventDefault(); clearRange() }\n else if (e.key.length === 1 && !mod && focus.value) startEdit(focus.value.row, focus.value.col, e.key)\n }\n\n // ---------- menus ----------\n const menuOpen = ref(false)\n const menuAnchor = ref<HTMLElement | null>(null)\n const menuColId = ref<string | null>(null)\n const menuMode = ref<'column' | 'context'>('column')\n const ctxPos = ref({ x: 0, y: 0 })\n const menuCol = computed(() => (menuColId.value ? flatCols.value.find((c) => c.id === menuColId.value) ?? null : null))\n const menuFormatter = (v: CellValue) => (menuCol.value ? formatValue(menuCol.value.col, v, null) : String(v ?? ''))\n const openMenu = (e: MouseEvent, id: string) => {\n menuMode.value = 'column'\n menuColId.value = id\n menuAnchor.value = e.currentTarget as HTMLElement\n menuOpen.value = true\n }\n const openContext = (e: MouseEvent, vr: VRow, rc: RCol) => {\n if (!rc.col) return\n if (!inRange(vr.index, rc.flatIndex)) { const p = { row: vr.index, col: rc.flatIndex }; focus.value = p; anchor = p; setRange(p, p) }\n const rect = rootEl()!.getBoundingClientRect()\n ctxPos.value = { x: e.clientX - rect.left, y: e.clientY - rect.top }\n menuMode.value = 'context'\n menuColId.value = rc.id\n menuAnchor.value = ctxAnchor.value\n menuOpen.value = true\n }\n\n // ---------- export ----------\n const exportCsv = (opts: { fileName?: string; onlySelected?: boolean; separator?: string } = {}) => {\n const cols = flatCols.value.filter((c) => !c.auto)\n const sel = selectedSet.value\n const idx = isServer.value ? [] : viewIdx.value.filter((i) => !opts.onlySelected || sel.has(rowIdOf(viewRows.value[i], i)))\n const body = idx.map((i) => cols.map((c) => formatValue(c.col, cellValue(c, viewRows.value[i]), viewRows.value[i])))\n const csv = toCsv(cols.map((c) => c.title), body, opts.separator)\n downloadText(opts.fileName ?? 'export.csv', '' + csv, 'text/csv;charset=utf-8')\n return csv\n }\n\n // ---------- totals / status ----------\n const bottomRows = computed(() => {\n const extra: RowData[] = []\n if (props.totalsRow && !isServer.value) {\n const r: RowData = {}\n for (const c of viewCols.value) if (c.aggFunc) {\n const get = makeGetter(c)\n const v = aggregate(viewIdx.value.map((i) => get(viewRows.value[i])), c.aggFunc)\n if (c.field) setByPath(r, c.field, v)\n else r[colIdOf(c)] = v\n }\n extra.push(r)\n }\n return [...props.pinnedBottomRows, ...extra]\n })\n const statusText = computed(() => {\n if (isServer.value) return `${serverCount.value.toLocaleString(loc.value)} rows`\n const total = raw.value.length\n const shown = filteredIdx.value.length\n return shown === total ? `${total.toLocaleString(loc.value)} rows` : `${shown.toLocaleString(loc.value)} of ${total.toLocaleString(loc.value)} rows`\n })\n const rangeStats = computed(() => {\n const r = cellRange.value\n if (!r || (r.startRow === r.endRow && r.startCol === r.endCol)) return null\n const nums: number[] = []\n let count = 0\n const maxCells = 200_000\n for (let i = r.startRow; i <= r.endRow && count < maxCells; i++) {\n const row = rowAt(i)\n if (row?.kind !== 'data') continue\n for (let j = r.startCol; j <= r.endCol; j++) {\n const c = flatCols.value[j]\n if (!c || c.auto) continue\n const v = cellValue(c, row.data)\n if (v != null && v !== '') count++\n if (typeof v === 'number') nums.push(v)\n }\n }\n if (!nums.length) return { count, sum: 0, avg: 0, min: 0, max: 0 }\n const sum = nums.reduce((a, b) => a + b, 0)\n return { count, sum, avg: sum / nums.length, min: Math.min(...nums), max: Math.max(...nums) }\n })\n\n // ---------- classes ----------\n const headerCellClass = (rc: RCol) => ({\n 'sq-datagrid__hcell--pinned-left': rc.pinned === 'left',\n 'sq-datagrid__hcell--pinned-right': rc.pinned === 'right',\n 'sq-datagrid__hcell--edge-left': rc.edgeLeft,\n 'sq-datagrid__hcell--edge-right': rc.edgeRight,\n 'sq-datagrid__hcell--sortable': !!rc.col && !rc.auto && rc.col.sortable !== false,\n 'sq-datagrid__hcell--spacer': !rc.col,\n 'sq-datagrid__hcell--drop-before': dropTarget.value?.id === rc.id && dropTarget.value.before,\n 'sq-datagrid__hcell--drop-after': dropTarget.value?.id === rc.id && !dropTarget.value.before,\n [`sq-datagrid__align-${rc.col?.align ?? (rc.col?.type === 'number' ? 'right' : 'left')}`]: true,\n [rc.col?.headerClass ?? '']: !!rc.col?.headerClass,\n })\n const cellAlignClass = (rc: RCol) => ({\n 'sq-datagrid__cell--pinned-left': rc.pinned === 'left',\n 'sq-datagrid__cell--pinned-right': rc.pinned === 'right',\n 'sq-datagrid__cell--edge-left': !!rc.edgeLeft,\n 'sq-datagrid__cell--edge-right': !!rc.edgeRight,\n [`sq-datagrid__align-${rc.col?.align ?? (rc.col?.type === 'number' ? 'right' : rc.col?.type === 'boolean' ? 'center' : 'left')}`]: !!rc.col,\n })\n const cellClass = (vr: VRow, rc: RCol) => {\n const base: Record<string, boolean> = cellAlignClass(rc)\n if (!rc.col) return base\n base['sq-datagrid__cell--focused'] = !!focus.value && focus.value.row === vr.index && focus.value.col === rc.flatIndex\n base['sq-datagrid__cell--range'] = inRange(vr.index, rc.flatIndex)\n base['sq-datagrid__cell--editable'] = vr.row.kind === 'data' && isEditable(rc.col, vr.row.data)\n if (rc.col.cellClass && vr.row.kind === 'data') {\n const extra = typeof rc.col.cellClass === 'function' ? rc.col.cellClass({ value: cellValue(rc, vr.row.data), row: vr.row.data!, column: rc.col, rowIndex: vr.index }) : rc.col.cellClass\n if (extra) base[extra] = true\n }\n return base\n }\n const cellStyle = (vr: VRow, rc: RCol) => {\n if (!rc.col?.cellStyle || vr.row.kind !== 'data') return rc.style\n const extra = typeof rc.col.cellStyle === 'function' ? rc.col.cellStyle({ value: cellValue(rc, vr.row.data), row: vr.row.data!, column: rc.col, rowIndex: vr.index }) : rc.col.cellStyle\n return extra ? { ...rc.style, ...extra } : rc.style\n }\n const rowClass = (vr: VRow) => {\n const c: Record<string, boolean> = {\n 'sq-datagrid__row--group': vr.row.kind === 'group',\n 'sq-datagrid__row--detail': vr.row.kind === 'detail',\n 'sq-datagrid__row--selected': vr.row.kind === 'data' && selectedSet.value.has(vr.row.id),\n 'sq-datagrid__row--odd': vr.index % 2 === 1,\n }\n if (props.rowClassName && vr.row.data && vr.row.kind === 'data') { const x = props.rowClassName(vr.row.data); if (x) c[x] = true }\n return c\n }\n const showLoading = computed(() => props.loading || (isServer.value && serverLoading.value && serverCount.value === 0))\n const rootStyle = { '--sq-r': 'var(--sq-radius-xl)', '--sq-bg': 'var(--sq-surface)', '--sq-bd': 'var(--sq-border)', '--sq-bw': '1px', '--sq-grid-row-h': `${props.rowHeight}px` }\n\n const api = {\n getSelectedRows: () => (isServer.value ? [] : viewIdx.value.map((i) => viewRows.value[i]).filter((r, k) => selectedSet.value.has(rowIdOf(r, viewIdx.value[k])))),\n getDisplayedRows: () => display.value,\n selectAll: () => setSelected(dataIdsInView()),\n deselectAll: () => setSelected([]),\n exportCsv,\n copy,\n undo,\n redo,\n expandAll,\n collapseAll,\n autoSize,\n refresh: () => (isServer.value ? purge() : dataVersion.value++),\n ensureIndexVisible: (i: number) => ensureVisible(i, focus.value?.col ?? 0),\n getColumnState: () => flatCols.value.filter((c) => !c.auto).map((c) => ({ colId: c.id, width: c.width, hide: false, pinned: c.pinned })),\n setColumnState: (state: { colId: string; width?: number; hide?: boolean; pinned?: 'left' | 'right' | null }[]) => {\n colOrder.value = [...state.map((s) => s.colId), ...colOrder.value.filter((id) => !state.some((s) => s.colId === id))]\n colWidth.value = { ...colWidth.value, ...Object.fromEntries(state.filter((s) => s.width).map((s) => [s.colId, s.width!])) }\n colHidden.value = { ...colHidden.value, ...Object.fromEntries(state.filter((s) => s.hide !== undefined).map((s) => [s.colId, s.hide!])) }\n colPinned.value = { ...colPinned.value, ...Object.fromEntries(state.filter((s) => s.pinned !== undefined).map((s) => [s.colId, s.pinned!])) }\n },\n }\n\n return {\n ...api, api, viewport, ctxAnchor, scrollLeft, vpWidth, isServer, quick, groupBy, selectedIds, selectedSet, sortModelList, filterModelObj,\n renderCols, flatCols, totalWidth, hasHeaderGroups, headerGroups, layout, visibleRows, rowCount, filterRowHeight, page, pageSizeState, pageCount, onPageSize, pageRangeText,\n hasGroups, detailOpen, onScroll, cellValue, formatValue, formatCell, cellParams, groupLabel, groupAggText, filterKind, distinctValues, sortIndex, sortDir, ariaSort, setSort,\n onHeaderClick, setFilter, floatingValue, onFloatingInput, toggleGroupBy, removeGroup, toggleGroup, toggleDetail, setHidden, setPinned, chooserCols, startResize,\n dragColId, onDragStart, onDragOver, onDrop, onGroupDrop, allSelected, someSelected, toggleAll, isRowChecked, isRowPartial, toggleRowCheck, onRowClick,\n onCellMousedown, onCellEnter, editing, isEditing, editorKind, onEditorInput, commitEdit, onEditorKey, onCellDblclick, canUndo, onKeydown, onPaste,\n menuOpen, menuAnchor, menuMode, menuCol, menuFormatter, openMenu, openContext, ctxPos, bottomRows, statusText, rangeStats, fmtNum, headerCellClass, cellAlignClass, cellClass, cellStyle,\n rowClass, showLoading, rootStyle, titleOf, toUnit, getByPath, has: (n: string) => !!slots[n], messages: computed(() => config.locale.messages),\n }\n },\n})\n</script>\n\n<style>\n.sq-datagrid { display: flex; flex-direction: column; overflow: hidden; color: var(--sq-on-surface); font-size: var(--sq-text-sm); outline: none; min-width: 0; }\n.sq-datagrid:focus-visible { box-shadow: var(--sq-focus-ring); }\n.sq-datagrid__toolbar { display: flex; align-items: center; gap: var(--sq-space-2); padding: var(--sq-space-2) var(--sq-space-3); border-bottom: 1px solid var(--sq-border); }\n.sq-datagrid__quick { max-width: 280px; }\n.sq-datagrid__chooser { display: flex; flex-direction: column; padding: var(--sq-space-1) var(--sq-space-3); max-height: 340px; overflow: auto; }\n.sq-datagrid__group-panel { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sq-space-2); min-height: 42px; padding: var(--sq-space-1) var(--sq-space-3); border-bottom: 1px dashed var(--sq-border); color: var(--sq-muted); background: color-mix(in srgb, var(--sq-surface-variant) 50%, transparent); }\n.sq-datagrid__group-hint { font-size: var(--sq-text-xs); }\n.sq-datagrid__viewport { position: relative; overflow: auto; overscroll-behavior: contain; flex: 1 1 auto; }\n.sq-datagrid__canvas { position: relative; min-width: 100%; }\n.sq-datagrid__head { position: sticky; top: 0; z-index: 4; background: var(--sq-surface-variant); }\n.sq-datagrid__foot { position: sticky; bottom: 0; z-index: 4; background: var(--sq-surface-variant); border-top: 1px solid var(--sq-border-strong); }\n.sq-datagrid__header-row { display: flex; border-bottom: 1px solid var(--sq-border); }\n.sq-datagrid__hcell, .sq-datagrid__header-group {\n position: relative; display: flex; align-items: center; gap: 4px; flex: none; padding: 0 var(--sq-space-3);\n font-size: var(--sq-text-xs); font-weight: var(--sq-weight-semibold); color: var(--sq-on-surface-variant); user-select: none; background: var(--sq-surface-variant); min-width: 0;\n}\n.sq-datagrid__header-group { justify-content: center; border-inline-end: 1px solid var(--sq-border); letter-spacing: 0.02em; }\n.sq-datagrid__header-group--empty { border-inline-end-color: transparent; }\n.sq-datagrid__hcell--sortable { cursor: pointer; }\n.sq-datagrid__hcell--sortable:hover { color: var(--sq-on-surface); }\n.sq-datagrid__htitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.sq-datagrid__align-right { justify-content: flex-end; text-align: right; }\n.sq-datagrid__align-center { justify-content: center; text-align: center; }\n.sq-datagrid__hcell.sq-datagrid__align-right { flex-direction: row-reverse; }\n.sq-datagrid__sort { display: inline-flex; align-items: center; color: var(--sq-primary); }\n.sq-datagrid__sort sup { font-size: 9px; }\n.sq-datagrid__filtered { color: var(--sq-primary); }\n.sq-datagrid__menu-btn { display: flex; margin-inline-start: auto; padding: 2px; border: 0; background: none; color: inherit; border-radius: var(--sq-radius-xs); cursor: pointer; opacity: 0; transition: opacity var(--sq-duration-fast); }\n.sq-datagrid__align-right .sq-datagrid__menu-btn { margin-inline-start: 0; margin-inline-end: auto; }\n.sq-datagrid__hcell:hover .sq-datagrid__menu-btn, .sq-datagrid__menu-btn:focus-visible { opacity: 1; }\n.sq-datagrid__menu-btn:hover { background: color-mix(in srgb, var(--sq-on-surface) 10%, transparent); }\n.sq-datagrid__resizer { position: absolute; top: 20%; bottom: 20%; right: 0; width: 7px; cursor: col-resize; border-right: 2px solid transparent; z-index: 1; }\n.sq-datagrid__hcell:hover .sq-datagrid__resizer { border-right-color: var(--sq-border-strong); }\n.sq-datagrid__resizer:hover { border-right-color: var(--sq-primary) !important; }\n.sq-datagrid__hcell--drop-before { box-shadow: inset 3px 0 0 var(--sq-primary); }\n.sq-datagrid__hcell--drop-after { box-shadow: inset -3px 0 0 var(--sq-primary); }\n.sq-datagrid__fcell { padding: 0 6px; }\n.sq-datagrid__ffilter { --sq-r: var(--sq-radius-xs); width: 100%; height: 28px; padding: 0 8px; border: 1px solid var(--sq-border); background: var(--sq-surface); color: var(--sq-on-surface); font: inherit; font-size: var(--sq-text-xs); outline: none; }\n.sq-datagrid__ffilter:focus { border-color: var(--sq-primary); }\n.sq-datagrid__body { position: relative; }\n.sq-datagrid__row { position: absolute; top: 0; left: 0; display: flex; min-width: 100%; border-bottom: 1px solid var(--sq-border); background: var(--sq-surface); contain: layout style; }\n.sq-datagrid__row--pinned { position: relative; background: var(--sq-surface-variant); font-weight: var(--sq-weight-medium); }\n.sq-datagrid--striped .sq-datagrid__row--odd { background: color-mix(in srgb, var(--sq-surface-variant) 45%, var(--sq-surface)); }\n.sq-datagrid__row:hover { --sq-row-hover: color-mix(in srgb, var(--sq-primary) 5%, var(--sq-surface)); background: var(--sq-row-hover); }\n.sq-datagrid__row--selected, .sq-datagrid__row--selected:hover { background: color-mix(in srgb, var(--sq-primary) 11%, var(--sq-surface)) !important; }\n.sq-datagrid__row--group { font-weight: var(--sq-weight-semibold); background: color-mix(in srgb, var(--sq-surface-variant) 60%, var(--sq-surface)); }\n.sq-datagrid__cell { position: relative; display: flex; align-items: center; flex: none; min-width: 0; padding: 0 var(--sq-space-3); white-space: nowrap; overflow: hidden; background: inherit; outline: none; }\n.sq-datagrid--column-lines .sq-datagrid__cell, .sq-datagrid--column-lines .sq-datagrid__hcell { border-inline-end: 1px solid var(--sq-border); }\n.sq-datagrid__cell--pinned-left, .sq-datagrid__hcell--pinned-left { position: sticky; z-index: 2; }\n.sq-datagrid__cell--pinned-right, .sq-datagrid__hcell--pinned-right { position: sticky; z-index: 2; }\n.sq-datagrid--scrolled-x .sq-datagrid__cell--edge-left, .sq-datagrid--scrolled-x .sq-datagrid__hcell--edge-left { box-shadow: 6px 0 8px -6px rgb(16 18 35 / 0.25); }\n.sq-datagrid__cell--edge-right, .sq-datagrid__hcell--edge-right { box-shadow: -6px 0 8px -6px rgb(16 18 35 / 0.25); }\n.sq-datagrid__cell--range { background: color-mix(in srgb, var(--sq-primary) 14%, var(--sq-surface)) !important; }\n.sq-datagrid__cell--focused { box-shadow: inset 0 0 0 2px var(--sq-primary) !important; border-radius: var(--sq-radius-xs); }\n.sq-datagrid__text { overflow: hidden; text-overflow: ellipsis; }\n.sq-datagrid__bool { display: inline-flex; color: var(--sq-border-strong); }\n.sq-datagrid__bool--on { color: var(--sq-success); }\n.sq-datagrid__check { min-height: 0 !important; }\n.sq-datagrid__group-cell { display: flex; align-items: center; gap: 4px; min-width: 0; }\n.sq-datagrid__expander { display: flex; padding: 1px; border: 0; background: none; color: var(--sq-muted); border-radius: var(--sq-radius-xs); cursor: pointer; transition: transform var(--sq-duration) var(--sq-ease); }\n.sq-datagrid__expander:hover { background: color-mix(in srgb, var(--sq-on-surface) 8%, transparent); color: var(--sq-on-surface); }\n.sq-datagrid__expander--open { transform: rotate(90deg); }\n.sq-datagrid__expander-spacer { width: 20px; flex: none; }\n.sq-datagrid__group-key { overflow: hidden; text-overflow: ellipsis; }\n.sq-datagrid__group-count { padding: 0 7px; border-radius: var(--sq-radius-pill); background: color-mix(in srgb, var(--sq-primary) 14%, transparent); color: var(--sq-primary); font-size: var(--sq-text-2xs); font-weight: var(--sq-weight-bold); }\n.sq-datagrid__agg { color: var(--sq-on-surface-variant); font-variant-numeric: tabular-nums; }\n.sq-datagrid__align-right .sq-datagrid__text { font-variant-numeric: tabular-nums; }\n.sq-datagrid__editor-wrap { position: absolute; inset: 2px; display: flex; }\n.sq-datagrid__editor { width: 100%; height: 100%; padding: 0 8px; border: 2px solid var(--sq-primary); border-radius: var(--sq-radius-xs); background: var(--sq-surface); color: var(--sq-on-surface); font: inherit; outline: none; }\n.sq-datagrid__skeleton { position: relative; display: block; width: 70%; height: 10px; border-radius: var(--sq-radius-xs); }\n.sq-datagrid__detail { position: sticky; left: 0; height: 100%; padding: var(--sq-space-3) var(--sq-space-4); overflow: auto; background: color-mix(in srgb, var(--sq-surface-variant) 40%, var(--sq-surface)); }\n.sq-datagrid__overlay { position: absolute; inset: 0; z-index: 5; display: flex; align-items: center; justify-content: center; background: color-mix(in srgb, var(--sq-surface) 55%, transparent); pointer-events: none; }\n.sq-datagrid__overlay--empty { background: none; }\n.sq-datagrid__footer { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sq-space-3); min-height: 40px; padding: 4px var(--sq-space-3); border-top: 1px solid var(--sq-border); color: var(--sq-muted); font-size: var(--sq-text-xs); }\n.sq-datagrid__status { display: flex; gap: var(--sq-space-2); flex-wrap: wrap; }\n.sq-datagrid__range-stats { color: var(--sq-on-surface-variant); font-variant-numeric: tabular-nums; }\n.sq-datagrid__page-size { display: inline-flex; align-items: center; gap: 6px; }\n.sq-datagrid__page-select { --sq-r: var(--sq-radius-xs); height: 26px; padding: 0 6px; border: 1px solid var(--sq-border); background: var(--sq-surface); color: var(--sq-on-surface); font: inherit; }\n.sq-datagrid__menu { min-width: 220px; padding: 2px 0; }\n.sq-datagrid__menu .sq-list-item { min-height: 34px; padding-block: 4px; font-size: var(--sq-text-sm); }\n.sq-datagrid__ctx-anchor { position: absolute; width: 1px; height: 1px; pointer-events: none; }\n</style>\n","import SqDataGrid from './SqDataGrid.vue'\n\nexport { SqDataGrid }\nexport const componentNames = ['SqDataGrid'] as const\nexport * from './types'\nexport * from './engine'\nexport default SqDataGrid\n"],"names":["_hoisted_1","_hoisted_2","_createElementBlock","_withModifiers","_openBlock","_Fragment","_createVNode","_createElementVNode","_withCtx","_createBlock","_createCommentVNode","_createTextVNode","_toDisplayString","v","page","_normalizeClass","_normalizeStyle","_renderSlot","_renderList","_mergeProps"],"mappings":"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"}
|