@pythia-software/query-table-ui 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/renderers.ts","../src/DataTable.tsx","../src/FilterValuePresentation.tsx","../src/CellMenu.tsx","../src/SelectColumnEditor.tsx","../src/previewOrdering.ts","../src/QueryBuilder.tsx","../src/FieldPicker.tsx","../src/SavedQueriesModal.tsx","../src/MetricsPanel.tsx","../src/SelectionToolbar.tsx"],"sourcesContent":["// renderers.ts — the cell render registry.\n//\n// This is how the table stays \"gold standard but customizable\" (the core ask).\n// The package ships ONLY truly-generic renderers. Domain-specific cells are\n// registered by the consuming app — they must NOT live in a generic package.\n// A FieldDef.render is either a key resolved\n// against `{ ...defaultRenderers, ...consumerRenderers }` or an inline function.\n\nimport type { ReactNode } from \"react\";\nimport { createElement } from \"react\";\nimport type { FieldDef, QueryState } from \"@pythia-software/query-table-core\";\n\nexport interface CellContext<Row = any, V = unknown> {\n value: V;\n row: Row;\n field: FieldDef<Row, V>;\n /** Current query — lets renderers reflect active state (e.g. highlight matches). */\n query: QueryState;\n}\n\nexport type CellRenderer<Row = any, V = unknown> = (ctx: CellContext<Row, V>) => ReactNode;\n\nexport type RenderRegistry<Row = any> = Record<string, CellRenderer<Row>>;\n\n/** The em-dash shown for empty / null values, so every renderer agrees. */\nconst EMPTY = \"—\";\n\nconst muted = (text: string): ReactNode => createElement(\"span\", { className: \"qt-muted\" }, text);\n\nfunction isEmpty(v: unknown): boolean {\n return v == null || v === \"\" || (Array.isArray(v) && v.length === 0);\n}\n\nconst SAFE_LINK_PROTOCOLS: ReadonlySet<string> = new Set([\"http:\", \"https:\", \"mailto:\", \"tel:\"]);\n\n/** Resolve a user-controlled link against a harmless HTTPS base and allow only\n * navigation protocols. This catches obfuscated forms such as `java\\nscript:`\n * that simple prefix checks miss while preserving relative and fragment URLs. */\nexport function safeLinkHref(value: unknown): string | null {\n if (isEmpty(value)) return null;\n const href = String(value).trim();\n if (!href) return null;\n try {\n const parsed = new URL(href, \"https://query-table.invalid/\");\n return SAFE_LINK_PROTOCOLS.has(parsed.protocol) ? href : null;\n } catch {\n return null;\n }\n}\n\n/** Generic, domain-free renderers shipped with the package. Keys are stable and\n * referenced from FieldDef.render. Consumers spread these and add their own. */\nexport const defaultRenderers: RenderRegistry = {\n // String(value), em-dash for null/empty\n text({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n return String(value);\n },\n\n // single-line ellipsis (CSS does the truncation; title carries the full text)\n truncate({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n const s = String(value);\n return createElement(\"span\", { className: \"qt-truncate\", title: s }, s);\n },\n\n // locale-grouped number\n number({ value }) {\n if (value == null || value === \"\") return muted(EMPTY);\n const n = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(n)) return muted(EMPTY);\n return n.toLocaleString();\n },\n\n // ✓ / —\n bool_check({ value }) {\n if (value == null) return muted(EMPTY);\n return value ? \"✓\" : muted(EMPTY);\n },\n\n // ISO clamped to seconds\n datetime({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n const s = String(value);\n // pgtype zero-time and other epoch placeholders read as empty.\n if (s.startsWith(\"0001-\")) return muted(EMPTY);\n return s.slice(0, 19).replace(\"T\", \" \");\n },\n\n // relative (\"5m ago\", \"yesterday\", \"Mar 4\")\n datetime_rel({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n const s = String(value);\n if (s.startsWith(\"0001-\")) return muted(EMPTY);\n return createElement(\"span\", { title: s.slice(0, 19).replace(\"T\", \" \") }, formatRelative(s));\n },\n\n // human duration from a millisecond number\n duration_ms({ value }) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return muted(EMPTY);\n return formatDuration(value);\n },\n\n // humanized bytes (B/KB/MB/GB)\n byte_size({ value }) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return muted(EMPTY);\n return formatBytes(value);\n },\n\n // string[] as pills\n tags_pills({ value }) {\n if (!Array.isArray(value) || value.length === 0) return muted(EMPTY);\n return createElement(\n \"span\",\n { className: \"qt-pills\" },\n value.map((t, i) => createElement(\"span\", { key: `${String(t)}-${i}`, className: \"qt-pill\" }, String(t))),\n );\n },\n\n // value as an <a href={value}> when its URL scheme is safe\n link({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n const label = String(value);\n const href = safeLinkHref(value);\n if (!href) return createElement(\"span\", { className: \"qt-muted\", title: \"Unsafe link blocked\" }, label);\n return createElement(\n \"a\",\n { className: \"qt-link\", href, target: \"_blank\", rel: \"noopener noreferrer\", title: href },\n label,\n );\n },\n};\n\n/** Resolve a FieldDef's renderer: inline fn wins, else registry lookup, else\n * the `text` fallback. */\nexport function resolveRenderer<Row>(\n field: FieldDef<Row>,\n registry: RenderRegistry<Row>,\n): CellRenderer<Row> {\n const r = field.render;\n if (typeof r === \"function\") {\n // core's CellRenderer returns `unknown`; ours narrows that to ReactNode.\n return r as CellRenderer<Row>;\n }\n if (typeof r === \"string\") {\n const found = registry[r];\n if (found) return found;\n }\n // text fallback always exists (consumers spread defaultRenderers in).\n return (registry[\"text\"] ?? defaultRenderers[\"text\"]) as CellRenderer<Row>;\n}\n\n// ---- formatting helpers ---------------------------------------------------\n\nfunction formatDuration(ms: number): string {\n if (ms < 0) return String(ms);\n if (ms < 1) return `${ms.toFixed(2)}ms`;\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n const totalSec = ms / 1000;\n if (totalSec < 60) return `${totalSec.toFixed(1)}s`;\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = Math.round(totalSec % 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m ${s}s`;\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\nfunction formatRelative(iso: string): string {\n const ts = Date.parse(iso);\n if (!Number.isFinite(ts)) return iso.slice(0, 19);\n const now = Date.now();\n const diffSec = Math.round((now - ts) / 1000);\n if (Math.abs(diffSec) < 30) return \"just now\";\n const past = diffSec >= 0;\n const abs = Math.abs(diffSec);\n if (abs < 60) return past ? `${abs}s ago` : `in ${abs}s`;\n if (abs < 3600) return past ? `${Math.round(abs / 60)}m ago` : `in ${Math.round(abs / 60)}m`;\n if (abs < 86400) return past ? `${Math.round(abs / 3600)}h ago` : `in ${Math.round(abs / 3600)}h`;\n const days = Math.round(abs / 86400);\n if (past && days === 1) return \"yesterday\";\n if (days < 7) return past ? `${days}d ago` : `in ${days}d`;\n const d = new Date(ts);\n const sameYear = d.getFullYear() === new Date().getFullYear();\n const opts: Intl.DateTimeFormatOptions = sameYear\n ? { month: \"short\", day: \"numeric\" }\n : { month: \"short\", day: \"numeric\", year: \"2-digit\" };\n return d.toLocaleDateString(undefined, opts);\n}\n","// DataTable — the table renderer.\n//\n// Presentation only: it draws headers (sort affordances), the checkbox column,\n// cells (via the render registry), the right-click CellMenu, column resize\n// handles, and the loading bar. All state\n// lives in the @pythia-software/query-table-react hook; DataTable receives the resolved view\n// and emits intents through onQueryChange. Its props mirror a conventional\n// schema-driven table so adoption is mechanical.\n\nimport { isComputedCellError } from \"@pythia-software/query-table-core\";\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactNode, type SetStateAction } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type { OrderByClause, QueryState, FieldDef, RowId, SelectColumn, WhereClause } from \"@pythia-software/query-table-core\";\nimport { isSortable, readFieldValue } from \"@pythia-software/query-table-core\";\nimport { useColumnDrag, type SelectionApi, type ColumnDragApi } from \"@pythia-software/query-table-react\";\nimport { resolveRenderer, type RenderRegistry } from \"./renderers\";\nimport type { TableClassNames } from \"./classNames\";\nimport { CellMenu } from \"./CellMenu\";\n\nexport interface DataTableProps<Row> {\n /** Ordered visible fields (widths already resolved), from `api.visibleFields`. */\n fields: FieldDef<Row>[];\n rows: Row[];\n query: QueryState;\n onQueryChange: (q: SetStateAction<QueryState>) => void;\n\n /** Resolves FieldDef.render keys. Pass `{ ...defaultRenderers, ...yours }`. */\n renderers: RenderRegistry<Row>;\n /** Row → stable id (defaults to reading the schema's idField). */\n rowId: (row: Row) => RowId | null;\n\n /** Optional checkbox column + selection behavior (from `api.selection`). */\n selection?: SelectionApi;\n\n /** Shared column-reorder drag state (`api.columnDrag`). Pass it so dragging a\n * table header also live-previews/dims the matching QueryBuilder select chip\n * (and vice versa). Omit for a self-contained, table-only drag. */\n columnDrag?: ColumnDragApi;\n\n /** Always-visible trailing column (row actions, links). */\n trailing?: (row: Row) => ReactNode;\n trailingLabel?: string;\n\n /** Total matching rows before pagination, when known. */\n total?: number | null;\n\n loading?: boolean;\n emptyMessage?: string;\n /** Maximum height of the scroll viewport. Defaults to 600px. */\n maxHeight?: number | string;\n /** Estimated row height in pixels; measured rows replace the estimate. Defaults to 37. */\n estimateRowHeight?: number;\n /** Extra rows rendered above and below the visible range. Defaults to 8. */\n overscan?: number;\n /** Tailwind / bespoke styling slots (Mode B). */\n classNames?: TableClassNames;\n}\n\nconst cx = (...parts: Array<string | undefined | false>): string =>\n parts.filter((p): p is string => Boolean(p)).join(\" \");\n\nconst MIN_WIDTH = 1;\nconst MIN_SELECTION_WIDTH = 1;\nconst MAX_WIDTH = 800;\nconst DEFAULT_WIDTH = 120;\nconst DEFAULT_SELECTION_WIDTH = 36;\nconst AUTOFIT_EXTRA_PX = 16;\nconst MENU_WIDTH = 240;\nconst MENU_ROW_HEIGHT = 32;\nconst COPY_FEEDBACK_MS = 900;\nconst DEFAULT_MAX_HEIGHT = 600;\nconst DEFAULT_ROW_HEIGHT = 37;\nconst DEFAULT_OVERSCAN = 8;\nconst SELECTION_COLUMN = \"__qt_selection__\";\ntype HeaderSortPlacement = \"set\" | \"append\" | \"prepend\";\n\ninterface MenuState<Row> {\n kind: \"cell\" | \"header\";\n field: FieldDef<Row>;\n value?: unknown;\n x: number;\n y: number;\n}\n\nexport function DataTable<Row>(props: DataTableProps<Row>): ReactNode {\n const {\n fields,\n rows,\n query,\n onQueryChange,\n renderers,\n rowId,\n selection,\n trailing,\n trailingLabel,\n total = null,\n loading,\n emptyMessage,\n maxHeight = DEFAULT_MAX_HEIGHT,\n estimateRowHeight = DEFAULT_ROW_HEIGHT,\n overscan = DEFAULT_OVERSCAN,\n classNames,\n } = props;\n\n const [menu, setMenu] = useState<MenuState<Row> | null>(null);\n const [selectionColumnWidth, setSelectionColumnWidth] = useState(DEFAULT_SELECTION_WIDTH);\n const [tableColumnOrder, setTableColumnOrder] = useState<string[]>([]);\n const [copiedCellKey, setCopiedCellKey] = useState<string | null>(null);\n const [headerHeight, setHeaderHeight] = useState(0);\n const [showHorizontalCue, setShowHorizontalCue] = useState(false);\n const tableWrapRef = useRef<HTMLDivElement>(null);\n const tableHeadRef = useRef<HTMLTableSectionElement>(null);\n const tableRef = useRef<HTMLTableElement>(null);\n const resizeGuideRef = useRef<HTMLDivElement>(null);\n // A real <col> width change invalidates layout for every row. During a drag,\n // move only the compositor-friendly guide and apply the column width once on\n // release; refs also keep pointermove out of React's render pipeline.\n const resizeCommitRef = useRef<{ name: string; width: number } | null>(null);\n const resizePreviewRef = useRef<{\n name: string;\n width: number;\n previousWidth: number;\n startTableWidth: number;\n guideX: number;\n } | null>(null);\n const resizeFrameRef = useRef<number | null>(null);\n const cancelResizeRef = useRef<(() => void) | null>(null);\n const resizingFieldRef = useRef<string | null>(null);\n const copiedCellTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Shared drag state when the host passes `api.columnDrag`; otherwise a local\n // instance keeps the table self-contained. (The hook is always called to obey\n // the rules of hooks; the local one is unused when a shared one is provided.)\n const localColumnDrag = useColumnDrag();\n const columnDrag = props.columnDrag ?? localColumnDrag;\n const rowIds = useMemo(() => rows.map(rowId), [rowId, rows]);\n const virtualRowKeys = useMemo(\n () => rowIds.map((id, index) => (id == null ? `index:${index}` : `${typeof id}:${String(id)}`)),\n [rowIds],\n );\n const getVirtualRowKey = useCallback((index: number) => virtualRowKeys[index] ?? `index:${index}`, [virtualRowKeys]);\n const normalizedEstimate = Number.isFinite(estimateRowHeight)\n ? Math.max(1, estimateRowHeight)\n : DEFAULT_ROW_HEIGHT;\n const normalizedOverscan = Number.isFinite(overscan)\n ? Math.max(0, Math.floor(overscan))\n : DEFAULT_OVERSCAN;\n const estimateVirtualRow = useCallback(() => normalizedEstimate, [normalizedEstimate]);\n const initialViewportHeight = typeof maxHeight === \"number\" && maxHeight > 0 ? maxHeight : DEFAULT_MAX_HEIGHT;\n const initialRect = useMemo(() => ({ width: 0, height: initialViewportHeight }), [initialViewportHeight]);\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n getScrollElement: () => tableWrapRef.current,\n estimateSize: estimateVirtualRow,\n getItemKey: getVirtualRowKey,\n overscan: normalizedOverscan,\n // The header participates in normal table layout even while it is sticky.\n // Offset row measurements so the virtual range matches the body's origin.\n scrollMargin: headerHeight,\n initialRect,\n });\n\n useEffect(() => {\n return () => {\n if (copiedCellTimerRef.current) {\n clearTimeout(copiedCellTimerRef.current);\n copiedCellTimerRef.current = null;\n }\n cancelResizeRef.current?.();\n };\n }, []);\n\n useEffect(() => {\n const header = tableHeadRef.current;\n if (!header) return;\n\n const measureHeader = () => {\n const next = header.getBoundingClientRect().height;\n setHeaderHeight((current) => (current === next ? current : next));\n };\n measureHeader();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", measureHeader);\n return () => window.removeEventListener(\"resize\", measureHeader);\n }\n\n const observer = new ResizeObserver(measureHeader);\n observer.observe(header);\n return () => observer.disconnect();\n }, []);\n\n function cellKey(rowIdValue: RowId | null, rowIndex: number, fieldName: string): string {\n return rowIdValue == null ? `row:${rowIndex}:${fieldName}` : `id:${rowIdValue}:${fieldName}`;\n }\n\n function isInteractiveTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n return tag === \"A\" || tag === \"BUTTON\" || tag === \"INPUT\" || tag === \"SELECT\";\n }\n\n function showCopyFeedback(cellId: string) {\n if (copiedCellTimerRef.current) {\n clearTimeout(copiedCellTimerRef.current);\n copiedCellTimerRef.current = null;\n }\n setCopiedCellKey(cellId);\n copiedCellTimerRef.current = setTimeout(() => {\n setCopiedCellKey((current) => (current === cellId ? null : current));\n copiedCellTimerRef.current = null;\n }, COPY_FEEDBACK_MS);\n }\n\n async function copyCellToClipboard(e: React.MouseEvent, f: FieldDef<Row>, rowIdValue: RowId | null, rowIndex: number, value: unknown) {\n if (isInteractiveTarget(e.target)) return;\n e.preventDefault();\n e.stopPropagation();\n setMenu(null);\n try {\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(valueToString(value));\n }\n } catch {\n /* clipboard denial is non-fatal */\n }\n showCopyFeedback(cellKey(rowIdValue, rowIndex, f.name));\n }\n\n const pageIds = rowIds.filter((id): id is RowId => id != null);\n const headerState = selection ? selection.pageState(pageIds) : \"none\";\n const showSel = selection != null;\n\n // ---- sort state (used only for indicators + header menu actions) ----\n function sortKeyFor(f: FieldDef<Row>): string {\n return f.sort?.field ?? f.name;\n }\n function applyHeaderSort(f: FieldDef<Row>, dir: \"asc\" | \"desc\", placement: HeaderSortPlacement) {\n if (!isSortable(f)) return;\n onQueryChange({\n ...query,\n offset: 0,\n orderBy: nextHeaderOrderBy(query.orderBy, sortKeyFor(f), dir, placement),\n });\n setMenu(null);\n }\n function removeColumn(f: FieldDef<Row>) {\n const explicit = materialize(query.select, fields);\n const nextSelect = explicit.filter((c) => c.field !== f.name);\n const nextOrderBy = query.orderBy.filter((s) => s.field !== sortKeyFor(f));\n if (nextSelect.length === 0) return;\n onQueryChange({ ...query, select: nextSelect, orderBy: nextOrderBy });\n setMenu(null);\n }\n function sortInfo(f: FieldDef<Row>): { dir: \"asc\" | \"desc\"; priority: number | null } | null {\n const key = sortKeyFor(f);\n const idx = query.orderBy.findIndex((o) => o.field === key);\n if (idx === -1) return null;\n const term = query.orderBy[idx]!;\n return { dir: term.dir, priority: query.orderBy.length > 1 ? idx + 1 : null };\n }\n\n // ---- width (resolved from query.select; written back through onQueryChange) ----\n function widthFor(name: string, f: FieldDef<Row>): number | undefined {\n const col = query.select.find((c) => c.field === name);\n return col?.width ?? f.select?.width;\n }\n function resolvedWidthFor(name: string, f: FieldDef<Row>): number | undefined {\n return widthFor(name, f);\n }\n function resolvedColumnWidthFor(name: string, f?: FieldDef<Row>): number | undefined {\n if (name === SELECTION_COLUMN) return selectionColumnWidth;\n return f ? resolvedWidthFor(name, f) : undefined;\n }\n function displayColumnWidthFor(name: string, f?: FieldDef<Row>): number {\n if (name === SELECTION_COLUMN) return resolvedColumnWidthFor(name) ?? DEFAULT_SELECTION_WIDTH;\n return f ? resolvedWidthFor(name, f) ?? DEFAULT_WIDTH : DEFAULT_WIDTH;\n }\n function clampWidth(width: number): number {\n return Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, Math.round(width)));\n }\n function clampColumnWidth(name: string, width: number): number {\n const min = name === SELECTION_COLUMN ? MIN_SELECTION_WIDTH : MIN_WIDTH;\n return Math.max(min, Math.min(MAX_WIDTH, Math.round(width)));\n }\n function commitColumnWidth(name: string, width: number) {\n if (name === SELECTION_COLUMN) {\n setSelectionColumnWidth(clampColumnWidth(name, width));\n return;\n }\n setWidth(name, width);\n }\n function setWidth(name: string, width: number) {\n const px = clampWidth(width);\n onQueryChange((prev) => ({ ...prev, select: writeWidth(prev.select, fields, name, px) }));\n }\n function applyResizeGuide() {\n const preview = resizePreviewRef.current;\n const guide = resizeGuideRef.current;\n if (!preview || !guide) return;\n guide.style.transform = `translateX(${preview.guideX}px)`;\n }\n function applyCommittedResize() {\n const preview = resizePreviewRef.current;\n const table = tableRef.current;\n if (!preview || !table) return;\n const selector = `col[data-qt-column=\"${cssAttributeValue(preview.name)}\"]`;\n const col = table.querySelector<HTMLTableColElement>(selector);\n if (col) col.style.width = `${preview.width}px`;\n table.style.minWidth = `${preview.startTableWidth + preview.width - preview.previousWidth}px`;\n }\n function startResize(name: string, startWidth: number | undefined, e: React.PointerEvent<HTMLSpanElement>) {\n e.preventDefault();\n e.stopPropagation();\n const startX = e.clientX;\n const startW = startWidth ?? e.currentTarget.parentElement?.getBoundingClientRect().width ?? DEFAULT_WIDTH;\n const previousCursor = document.body.style.cursor;\n const previousUserSelect = document.body.style.userSelect;\n const initialWidth = clampColumnWidth(name, startW);\n const wrap = tableWrapRef.current;\n const wrapRect = wrap?.getBoundingClientRect();\n const header = e.currentTarget.parentElement as HTMLTableCellElement | null;\n resizeCommitRef.current = null;\n resizePreviewRef.current = {\n name,\n width: initialWidth,\n previousWidth: displayColumnWidthFor(name, fieldByName.get(name)),\n startTableWidth: tableWidth,\n guideX: startX - (wrapRect?.left ?? 0) + (wrap?.scrollLeft ?? 0),\n };\n resizingFieldRef.current = name;\n tableWrapRef.current?.classList.add(\"qt-table-wrap--resizing\");\n header?.classList.add(\"qt-th--resizing\");\n if (header) header.draggable = false;\n if (resizeGuideRef.current) {\n resizeGuideRef.current.style.display = \"block\";\n resizeGuideRef.current.style.top = `${wrap?.scrollTop ?? 0}px`;\n resizeGuideRef.current.style.height = `${wrap?.clientHeight ?? 0}px`;\n }\n applyResizeGuide();\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n const cleanup = (commitWidth: boolean) => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", finish);\n window.removeEventListener(\"pointercancel\", finish);\n if (resizeFrameRef.current != null) {\n cancelAnimationFrame(resizeFrameRef.current);\n resizeFrameRef.current = null;\n applyResizeGuide();\n }\n document.body.style.cursor = previousCursor;\n document.body.style.userSelect = previousUserSelect;\n tableWrapRef.current?.classList.remove(\"qt-table-wrap--resizing\");\n tableRef.current\n ?.querySelector<HTMLElement>(`th[data-qt-field=\"${cssAttributeValue(name)}\"]`)\n ?.classList.remove(\"qt-th--resizing\");\n if (header) header.draggable = true;\n const commit = commitWidth ? resizeCommitRef.current : null;\n if (commit) applyCommittedResize();\n if (resizeGuideRef.current) resizeGuideRef.current.style.display = \"none\";\n resizeCommitRef.current = null;\n resizePreviewRef.current = null;\n resizingFieldRef.current = null;\n cancelResizeRef.current = null;\n if (commit) commitColumnWidth(commit.name, commit.width);\n };\n const finish = () => cleanup(true);\n const onMove = (ev: PointerEvent) => {\n const next = clampColumnWidth(name, startW + (ev.clientX - startX));\n resizeCommitRef.current = { name, width: next };\n const preview = resizePreviewRef.current;\n if (preview) {\n preview.width = next;\n preview.guideX = startX + (next - startW) - (wrapRect?.left ?? 0) + (wrap?.scrollLeft ?? 0);\n }\n if (resizeFrameRef.current == null) {\n resizeFrameRef.current = requestAnimationFrame(() => {\n resizeFrameRef.current = null;\n applyResizeGuide();\n });\n }\n };\n cancelResizeRef.current = () => cleanup(false);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", finish);\n window.addEventListener(\"pointercancel\", finish);\n }\n function autofitColumn(name: string) {\n const wrap = tableWrapRef.current;\n if (!wrap) return;\n const selector = `[data-qt-field=\"${cssAttributeValue(name)}\"]`;\n let width = 0;\n wrap.querySelectorAll<HTMLElement>(selector).forEach((el) => {\n width = Math.max(width, el.scrollWidth);\n });\n if (width > 0) setWidth(name, width + AUTOFIT_EXTRA_PX);\n }\n function resizeWithKeyboard(name: string, startWidth: number | undefined, e: React.KeyboardEvent<HTMLSpanElement>) {\n if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\" && e.key !== \"Enter\") return;\n e.preventDefault();\n e.stopPropagation();\n if (e.key === \"Enter\") {\n autofitColumn(name);\n return;\n }\n const step = e.shiftKey ? 25 : 10;\n const direction = e.key === \"ArrowRight\" ? 1 : -1;\n commitColumnWidth(name, (startWidth ?? DEFAULT_WIDTH) + step * direction);\n }\n\n // ---- reorder (drag headers; writes the new SELECT order) ----\n // `overIndex` is a position in the list with the dragged column removed, which\n // is exactly where the live preview shows the dragged header, so the committed\n // order can never disagree with what the user saw.\n function reorderByIndex(from: string, overIndex: number) {\n const withoutDragged = tableColumnNames.filter((n) => n !== from);\n if (withoutDragged.length === tableColumnNames.length) return; // `from` not visible\n const at = Math.max(0, Math.min(overIndex, withoutDragged.length));\n withoutDragged.splice(at, 0, from);\n setTableColumnOrder(withoutDragged);\n const nextFieldOrder = withoutDragged.filter((name) => name !== SELECTION_COLUMN);\n if (!sameOrder(nextFieldOrder, fieldNames)) {\n onQueryChange({ ...query, select: reorderSelect(query.select, fields, nextFieldOrder) });\n }\n }\n\n const fieldByName = useMemo(() => new Map(fields.map((f) => [f.name, f])), [fields]);\n const fieldNames = useMemo(() => fields.map((f) => f.name), [fields]);\n const tableColumnNames = useMemo(() => {\n if (!showSel) return fieldNames;\n const defaultOrder = [SELECTION_COLUMN, ...fieldNames];\n const valid = new Set(defaultOrder);\n const kept = tableColumnOrder.filter((name) => valid.has(name));\n const missing = defaultOrder.filter((name) => !kept.includes(name));\n return [...kept, ...missing];\n }, [fieldNames, showSel, tableColumnOrder]);\n const dragSource = columnDrag.source;\n // While dragging, render the WHOLE column (header + body cells + width) in the\n // order a drop would commit: the dragged column stays MOUNTED (removing the\n // drag-source node mid-drag aborts the native HTML5 drag) but slides to the\n // hovered slot and is dimmed. Because the rendered order IS the would-be\n // result, the live preview can never disagree with where the drop lands.\n const renderedColumnNames = useMemo(() => columnDrag.preview(tableColumnNames), [columnDrag, tableColumnNames]);\n\n // ---- selection ----\n function toggleHeader() {\n if (!selection) return;\n selection.setPage(pageIds, headerState !== \"all\");\n }\n\n // ---- cell menu ----\n function openMenu(e: React.MouseEvent, f: FieldDef<Row>, row: Row) {\n if (isInteractiveTarget(e.target)) return;\n e.preventDefault();\n setMenu({ kind: \"cell\", field: f, value: readFieldValue(f, row), x: e.clientX, y: e.clientY });\n }\n function openHeaderMenu(e: React.MouseEvent, f: FieldDef<Row>) {\n if (isInteractiveTarget(e.target)) return;\n e.preventDefault();\n setMenu({ kind: \"header\", field: f, x: e.clientX, y: e.clientY });\n }\n\n function onTableWheel(e: React.WheelEvent<HTMLDivElement>) {\n const wrap = tableWrapRef.current;\n if (!wrap) return;\n\n const canScrollHorizontally = wrap.scrollWidth > wrap.clientWidth;\n if (!canScrollHorizontally) return;\n\n const dx = e.deltaX;\n const dy = e.deltaY;\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n const prefersHorizontal = absDx > absDy * 1.25;\n\n if (dx === 0 && !e.shiftKey) return;\n\n if (dx === 0 && e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n wrap.scrollLeft += dy;\n return;\n }\n\n if (e.shiftKey || prefersHorizontal) {\n e.preventDefault();\n e.stopPropagation();\n wrap.scrollLeft += dx;\n }\n }\n\n function resizeHandle(name: string, label: string, width: number | undefined): ReactNode {\n return (\n <span\n className={cx(\"qt-resize-handle\", classNames?.resizeHandle)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${label} column`}\n title=\"Drag to resize. Press Enter to auto-fit.\"\n tabIndex={0}\n onPointerDown={(e) => startResize(name, width, e)}\n onKeyDown={(e) => resizeWithKeyboard(name, width, e)}\n onClick={(e) => e.stopPropagation()}\n />\n );\n }\n\n const totalCols = fields.length + (showSel ? 1 : 0) + (trailing ? 1 : 0);\n const tableWidth = renderedColumnNames.reduce((sum, name) => {\n const f = fieldByName.get(name);\n return sum + displayColumnWidthFor(name, f);\n }, trailing ? 40 : 0);\n // A horizontal data grid is more useful than a card stack on small screens,\n // but overflow should be discoverable. Keep a lightweight cue visible only\n // while there is more content to the right.\n useEffect(() => {\n const wrap = tableWrapRef.current;\n if (!wrap) return;\n\n const updateCue = () => {\n const hasMoreToRight = wrap.scrollWidth - wrap.clientWidth - wrap.scrollLeft > 2;\n setShowHorizontalCue(hasMoreToRight);\n };\n\n updateCue();\n window.addEventListener(\"resize\", updateCue);\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(updateCue);\n observer?.observe(wrap);\n return () => {\n window.removeEventListener(\"resize\", updateCue);\n observer?.disconnect();\n };\n }, [renderedColumnNames, tableWidth]);\n const start = query.offset;\n const end = total != null ? Math.min(start + query.limit, total) : start + rows.length;\n const canPrev = start > 0;\n const canNext = total != null ? end < total : rows.length >= query.limit;\n const prevPage = () => onQueryChange((prev) => ({ ...prev, offset: Math.max(0, prev.offset - prev.limit) }));\n const nextPage = () => onQueryChange((prev) => ({ ...prev, offset: prev.offset + prev.limit }));\n const summaryText =\n total == null || total === 0 ? `${rows.length} rows` : `${start + 1}–${end} of ${total}`;\n const virtualRows = rowVirtualizer.getVirtualItems();\n const firstVirtualRow = virtualRows[0];\n const lastVirtualRow = virtualRows[virtualRows.length - 1];\n const paddingTop = firstVirtualRow ? Math.max(0, firstVirtualRow.start - headerHeight) : 0;\n const paddingBottom = lastVirtualRow\n ? Math.max(0, rowVirtualizer.getTotalSize() - (lastVirtualRow.end - headerHeight))\n : 0;\n\n return (\n <>\n {showHorizontalCue ? (\n <div className=\"qt-table-scroll-cue\" aria-hidden=\"true\">\n Swipe to see more <span>→</span>\n </div>\n ) : null}\n <div\n ref={tableWrapRef}\n className={cx(\n \"qt-table-wrap\",\n loading && \"qt-table-wrap--loading\",\n classNames?.wrap,\n )}\n onWheel={onTableWheel}\n style={{ maxHeight, overflowY: \"auto\" }}\n onScroll={() => {\n const wrap = tableWrapRef.current;\n if (!wrap) return;\n setShowHorizontalCue(wrap.scrollWidth - wrap.clientWidth - wrap.scrollLeft > 2);\n }}\n role=\"region\"\n aria-label=\"Scrollable data table\"\n tabIndex={0}\n >\n {loading && (\n <div className={cx(\"qt-loading-bar\", classNames?.loadingBar)} role=\"progressbar\" aria-label=\"loading\" />\n )}\n <div\n ref={resizeGuideRef}\n className={cx(\"qt-resize-guide\", classNames?.resizeGuide)}\n aria-hidden=\"true\"\n />\n <table ref={tableRef} className={cx(\"qt-table\", classNames?.table)} style={{ minWidth: tableWidth }}>\n <colgroup>\n {renderedColumnNames.map((name) => {\n const f = fieldByName.get(name);\n const w = displayColumnWidthFor(name, f);\n if (name === SELECTION_COLUMN) return <col key={name} data-qt-column={name} style={{ width: w }} />;\n if (!f) return null;\n return <col key={f.name} data-qt-column={f.name} style={{ width: w }} />;\n })}\n {trailing && <col style={{ width: 40 }} />}\n </colgroup>\n <thead ref={tableHeadRef} className={classNames?.thead}>\n <tr className={classNames?.headerRow}>\n {renderedColumnNames.map((name) => {\n if (name === SELECTION_COLUMN) {\n return (\n <th\n key={name}\n data-qt-field={name}\n className={cx(\n \"qt-th\",\n \"qt-checkbox-cell\",\n dragSource === name && \"qt-th--dragging\",\n classNames?.th,\n classNames?.checkboxCell,\n )}\n draggable\n onDragStart={(e) => {\n if (resizingFieldRef.current) {\n e.preventDefault();\n return;\n }\n columnDrag.start(name, tableColumnNames.indexOf(name));\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", name);\n }}\n onDragOver={(e) => {\n if (!columnDrag.source) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (columnDrag.source !== name) {\n const withoutDragged = tableColumnNames.filter((n) => n !== columnDrag.source);\n let next = withoutDragged.indexOf(name);\n if (next >= 0) {\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n columnDrag.over(next);\n }\n }\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const from = columnDrag.source || e.dataTransfer.getData(\"text/plain\");\n if (from && columnDrag.overIndex != null) reorderByIndex(from, columnDrag.overIndex);\n columnDrag.end();\n }}\n onDragEnd={() => columnDrag.end()}\n >\n <input\n type=\"checkbox\"\n checked={headerState === \"all\"}\n ref={(el) => {\n if (el) el.indeterminate = headerState === \"some\";\n }}\n onChange={toggleHeader}\n aria-label=\"select all on page\"\n />\n {resizeHandle(name, \"selection\", resolvedColumnWidthFor(name))}\n </th>\n );\n }\n const f = fieldByName.get(name);\n if (!f) return null;\n const info = sortInfo(f);\n const sortable = isSortable(f);\n return (\n <th\n // Stable key (not index-based): while dragging, React must\n // MOVE the dragged <th>, not remount it — a remount removes\n // the drag source and aborts the native drag.\n key={f.name}\n data-qt-field={f.name}\n className={cx(\n \"qt-th\",\n sortable && \"qt-th--sortable\",\n dragSource === f.name && \"qt-th--dragging\",\n classNames?.th,\n )}\n style={f.select?.align ? { textAlign: f.select.align } : undefined}\n draggable\n onDragStart={(e) => {\n if (resizingFieldRef.current) {\n e.preventDefault();\n return;\n }\n columnDrag.start(f.name, tableColumnNames.indexOf(f.name));\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", f.name);\n }}\n onDragOver={(e) => {\n if (!columnDrag.source) return;\n // preventDefault on every header (incl. the dragged one) so\n // there is no dead drop zone anywhere along the row.\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (columnDrag.source !== f.name) {\n const withoutDragged = tableColumnNames.filter((n) => n !== columnDrag.source);\n let next = withoutDragged.indexOf(f.name);\n if (next >= 0) {\n // Drop after the hovered header when past its midpoint,\n // so a column can be moved into the last slot.\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n columnDrag.over(next);\n }\n }\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const from = columnDrag.source || e.dataTransfer.getData(\"text/plain\");\n if (from && columnDrag.overIndex != null) reorderByIndex(from, columnDrag.overIndex);\n columnDrag.end();\n }}\n onDragEnd={() => columnDrag.end()}\n >\n <span\n className=\"qt-th-label\"\n onClick={(e) => openHeaderMenu(e, f)}\n style={{ cursor: \"pointer\" }}\n title=\"Click to open column actions\"\n >\n {f.label}\n {info && (\n <span className=\"qt-sort-indicator\">\n {info.dir === \"asc\" ? \" ↑\" : \" ↓\"}\n {info.priority != null && <sup className=\"qt-sort-priority\">{info.priority}</sup>}\n </span>\n )}\n </span>\n {resizeHandle(f.name, f.label, resolvedColumnWidthFor(f.name, f))}\n </th>\n );\n })}\n {trailing && <th className={cx(\"qt-th\", classNames?.th)}>{trailingLabel ?? \"\"}</th>}\n </tr>\n </thead>\n <tbody className={classNames?.tbody}>\n {rows.length === 0 && (\n <tr>\n <td colSpan={totalCols} className={cx(\"qt-cell\", \"qt-empty\", classNames?.empty)}>\n {emptyMessage ?? \"No rows.\"}\n </td>\n </tr>\n )}\n {paddingTop > 0 && (\n <tr className=\"qt-virtual-spacer\" aria-hidden=\"true\">\n <td colSpan={totalCols} style={{ height: paddingTop, padding: 0, border: 0 }} />\n </tr>\n )}\n {virtualRows.map((virtualRow) => {\n const i = virtualRow.index;\n const row = rows[i]!;\n const id = rowIds[i] ?? null;\n const selected = id != null && selection ? selection.isSelected(id) : false;\n return (\n <tr\n key={virtualRow.key}\n data-index={i}\n ref={rowVirtualizer.measureElement}\n className={cx(\"qt-row\", selected && \"qt-row--selected\", classNames?.row, selected && classNames?.rowSelected)}\n >\n {renderedColumnNames.map((name) => {\n if (name === SELECTION_COLUMN) {\n return (\n <td\n key={name}\n data-qt-field={name}\n className={cx(\n \"qt-cell\",\n \"qt-checkbox-cell\",\n dragSource === name && \"qt-cell--dragging\",\n classNames?.cell,\n classNames?.checkboxCell,\n )}\n >\n {id != null && (\n <input\n type=\"checkbox\"\n checked={selected}\n // Shift-range select is handled inside selection.toggle.\n onClick={(e) => selection!.toggle(id, e.shiftKey)}\n onChange={() => {\n /* state owned by selection; onClick drives it */\n }}\n aria-label={`select row ${String(id)}`}\n />\n )}\n </td>\n );\n }\n const f = fieldByName.get(name);\n if (!f) return null;\n const render = resolveRenderer(f, renderers);\n const value = readFieldValue(f, row);\n const key = cellKey(id, i, f.name);\n return (\n <td\n key={f.name}\n data-qt-field={f.name}\n className={cx(\"qt-cell\", dragSource === f.name && \"qt-cell--dragging\", classNames?.cell)}\n style={f.select?.align ? { textAlign: f.select.align } : undefined}\n onClick={(e) => openMenu(e, f, row)}\n onContextMenu={(e) => openMenu(e, f, row)}\n onDoubleClick={(e) => copyCellToClipboard(e, f, id, i, value)}\n >\n {copiedCellKey === key ? <span className=\"qt-cell-copy-chip\">✓ copied</span> : isComputedCellError(value) ? <span className=\"qt-formula-error\" title={value.computedError}>{value.computedError === \"Calculating…\" ? \"Calculating…\" : \"Error\"}</span> : render({ value, row, field: f, query })}\n </td>\n );\n })}\n {trailing && <td className={cx(\"qt-cell\", \"qt-trailing-cell\", classNames?.cell)}>{trailing(row)}</td>}\n </tr>\n );\n })}\n {paddingBottom > 0 && (\n <tr className=\"qt-virtual-spacer\" aria-hidden=\"true\">\n <td colSpan={totalCols} style={{ height: paddingBottom, padding: 0, border: 0 }} />\n </tr>\n )}\n </tbody>\n <tfoot>\n <tr className={cx(\"qt-table-summary-row\", classNames?.summaryRow)}>\n <td colSpan={totalCols} className={cx(\"qt-cell\", \"qt-table-summary-cell\", classNames?.summaryCell)}>\n <div className={cx(\"qt-table-summary\", classNames?.summaryControls)}>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.summaryButton)}\n disabled={loading || !canPrev}\n onClick={prevPage}\n >\n ← prev\n </button>\n <span className={cx(\"qt-table-summary-hint\", classNames?.summaryHint)}>{summaryText}</span>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.summaryButton)}\n disabled={loading || !canNext}\n onClick={nextPage}\n >\n next →\n </button>\n </div>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n {menu && (\n menu.kind === \"cell\" ? (\n <CellMenu\n field={menu.field}\n value={menu.value}\n x={menu.x}\n y={menu.y}\n onAddFilter={(clause: WhereClause) =>\n onQueryChange((prev) => ({ ...prev, offset: 0, where: [...prev.where, clause] }))\n }\n onClose={() => setMenu(null)}\n />\n ) : (\n <HeaderMenu\n field={menu.field}\n x={menu.x}\n y={menu.y}\n sortable={isSortable(menu.field)}\n canRemoveColumn={fields.length > 1}\n onSetSort={(placement, dir) => applyHeaderSort(menu.field, dir, placement)}\n onRemove={() => removeColumn(menu.field)}\n onClose={() => setMenu(null)}\n />\n )\n )}\n </>\n );\n}\n\nfunction HeaderMenu<Row>({\n field,\n x,\n y,\n sortable,\n canRemoveColumn,\n onSetSort,\n onRemove,\n onClose,\n}: {\n field: FieldDef<Row>;\n x: number;\n y: number;\n sortable: boolean;\n canRemoveColumn: boolean;\n onSetSort: (placement: HeaderSortPlacement, dir: \"asc\" | \"desc\") => void;\n onRemove: () => void;\n onClose: () => void;\n}) {\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n function onDocClick() {\n onClose();\n }\n window.addEventListener(\"keydown\", onKey);\n const t = setTimeout(() => window.addEventListener(\"click\", onDocClick), 0);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"click\", onDocClick);\n clearTimeout(t);\n };\n }, [onClose]);\n\n const items: ReactNode[] = [];\n const addSortItem = (placement: HeaderSortPlacement, dir: \"asc\" | \"desc\", label: string) =>\n items.push(\n <MenuItem key={`${placement}-${dir}`} disabled={!sortable} onClick={() => onSetSort(placement, dir)}>\n {label}\n </MenuItem>,\n );\n\n addSortItem(\"set\", \"asc\", \"Set Sort (Asc)\");\n addSortItem(\"set\", \"desc\", \"Set Sort (Desc)\");\n addSortItem(\"append\", \"asc\", \"Append Sort (Asc)\");\n addSortItem(\"append\", \"desc\", \"Append Sort (Desc)\");\n addSortItem(\"prepend\", \"asc\", \"Prepend Sort (Asc)\");\n addSortItem(\"prepend\", \"desc\", \"Prepend Sort (Desc)\");\n\n items.push(<div key=\"sep\" className=\"qt-cm-sep\" />);\n items.push(\n <MenuItem key=\"remove\" disabled={!canRemoveColumn} onClick={onRemove}>\n Remove Column\n </MenuItem>,\n );\n\n const vw = typeof window !== \"undefined\" ? window.innerWidth : 9999;\n const vh = typeof window !== \"undefined\" ? window.innerHeight : 9999;\n const left = Math.max(8, Math.min(x, vw - MENU_WIDTH - 8));\n const top = Math.max(8, Math.min(y, vh - MENU_ROW_HEIGHT * items.length - 8));\n\n return (\n <div\n className=\"qt-cell-menu\"\n style={{ left, top, width: MENU_WIDTH }}\n onClick={(e) => e.stopPropagation()}\n onContextMenu={(e) => e.preventDefault()}\n role=\"menu\"\n >\n <div className=\"qt-cm-header\">\n <span className=\"qt-cm-field\">{field.label}</span>\n </div>\n {items}\n </div>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n disabled,\n}: {\n children: ReactNode;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className=\"qt-cm-item\"\n onClick={onClick}\n role=\"menuitem\"\n disabled={disabled}\n >\n {children}\n </button>\n );\n}\n\n/** Header menu sort helper for set / append / prepend actions. */\nfunction nextHeaderOrderBy(\n existing: OrderByClause[],\n field: string,\n dir: \"asc\" | \"desc\",\n placement: HeaderSortPlacement,\n): OrderByClause[] {\n const next = existing.filter((s) => s.field !== field);\n if (placement === \"set\") return [{ field, dir }];\n if (placement === \"append\") return [...next, { field, dir }];\n return [{ field, dir }, ...next];\n}\n\n/** Materialize the current visible order into SelectColumn[] so width/order\n * edits diverge from schema defaults cleanly (mirrors useSelect.writeSelect). */\nfunction materialize<Row>(select: SelectColumn[], fields: FieldDef<Row>[]): SelectColumn[] {\n if (select.length) return select.map((c) => ({ ...c }));\n return fields.map((f) => ({ field: f.name }));\n}\n\nfunction writeWidth<Row>(select: SelectColumn[], fields: FieldDef<Row>[], name: string, width: number): SelectColumn[] {\n const cols = materialize(select, fields);\n let found = false;\n const next = cols.map((c) => {\n if (c.field !== name) return c;\n found = true;\n return { ...c, width };\n });\n if (!found) next.push({ field: name, width });\n return next;\n}\n\nfunction reorderSelect<Row>(select: SelectColumn[], fields: FieldDef<Row>[], order: string[]): SelectColumn[] {\n const cols = materialize(select, fields);\n const byName = new Map(cols.map((c) => [c.field, c]));\n return order.map((name) => byName.get(name) ?? { field: name });\n}\n\nfunction cssAttributeValue(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction sameOrder(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((value, index) => value === b[index]);\n}\n\nfunction valueToString(value: unknown): string {\n if (value == null) return \"\";\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n","import { createContext, useContext, useState, type ReactNode } from 'react';\n\n/** Consumer-owned presentation; canonical values remain in queries and URLs. */\nexport interface FilterValuePresentation {\n label?: (field: string, value: string) => string;\n render?: (field: string, value: string) => ReactNode;\n}\nconst Context = createContext<FilterValuePresentation>({});\nexport const FilterValueProvider = Context.Provider;\nexport function useFilterValuePresentation() { return useContext(Context); }\nexport function PresentedFilterValue({field,value,label}: {field:string;value:string;label?:string}) {\n const presentation=useContext(Context);\n return <>{presentation.render?.(field,value) ?? presentation.label?.(field,value) ?? label ?? value}</>;\n}\n\n/** Search by key or label, select canonical keys, preserve unavailable values. */\nexport function PresentedValueInput({field,value,options,onChange}: {\n field:string; value:string; options:Array<string | {value:string;label:string}>; onChange:(value:string)=>void;\n}) {\n const presentation=useContext(Context);\n const [open,setOpen]=useState(false),[search,setSearch]=useState('');\n const choices=options.map(option=>typeof option==='string'?{value:option,label:presentation.label?.(field,option) ?? option}:option);\n const visible=choices.filter(option=>`${option.value} ${option.label}`.toLowerCase().includes(search.toLowerCase()));\n return <span style={{position:'relative'}}>\n <button type=\"button\" aria-label={`Edit ${field} filter value`} aria-expanded={open} onClick={()=>setOpen(!open)}><PresentedFilterValue field={field} value={value} label={choices.find(option=>option.value===value)?.label ?? value}/>{!value&&'Choose value'}</button>\n {open&&<span style={{position:'absolute',top:'100%',left:0,zIndex:30,background:'var(--qt-bg, #fff)',padding:8,minWidth:220,maxHeight:300,overflowY:'auto'}} onKeyDown={e=>{if(e.key==='Escape')setOpen(false)}}>\n <input autoFocus aria-label={`Search ${field} values`} value={search} onChange={e=>setSearch(e.target.value)} onKeyDown={e=>{if(e.key==='Enter'&&search){e.preventDefault();onChange(visible[0]?.value ?? search);setOpen(false)}}}/>\n {visible.map(option=><button type=\"button\" key={option.value} style={{display:'block'}} onClick={()=>{onChange(option.value);setOpen(false)}}><PresentedFilterValue field={field} value={option.value} label={option.label}/>{option.label!==option.value&&<small> {option.value}</small>}</button>)}\n {search&&!choices.some(option=>option.value===search)&&<button type=\"button\" onClick={()=>{onChange(search);setOpen(false)}}>Use “{search}”</button>}\n </span>}\n </span>;\n}\n","import { PresentedFilterValue } from \"./FilterValuePresentation\";\n// CellMenu — right-click (or left-click) a cell → quick-filter popover + copy.\n// Filters are laid out in two columns: each row is a candidate predicate on the\n// left and its logical negation directly opposite (`= 5 | ≠ 5`, `≥ 5 | < 5`,\n// `is null | is not null`, `contains | not contains`). Value ops are prefilled\n// with the clicked cell's value; array cells get a per-element `includes` row.\n// Anchors just off the click point and clamps to the viewport.\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport type { FieldDef, FilterOp, WhereClause } from \"@pythia-software/query-table-core\";\nimport { NULLARY_OPS, negateClause, opsForField, opPairsForField, isFilterable } from \"@pythia-software/query-table-core\";\nimport type { MenuClassNames } from \"./classNames\";\n\nexport interface CellMenuProps<Row> {\n field: FieldDef<Row>;\n value: unknown;\n /** Viewport coordinates of the click. */\n x: number;\n y: number;\n onAddFilter: (clause: WhereClause) => void;\n onClose: () => void;\n classNames?: MenuClassNames;\n}\n\nconst cx = (...parts: Array<string | undefined | false>): string => parts.filter(Boolean).join(\" \");\n\n/** Approximate sizing so the popover can clamp itself into the viewport. */\nconst MENU_WIDTH = 320;\nconst ROW_HEIGHT = 32;\nconst POINTER_OFFSET = 4;\n\ninterface FilterRow {\n positive?: WhereClause;\n negative?: WhereClause;\n}\n\nexport function CellMenu<Row>({ field, value, x, y, onAddFilter, onClose, classNames }: CellMenuProps<Row>): ReactNode {\n // Dismiss on Escape or an outside click. The opening click is deferred a tick\n // so it doesn't immediately re-close the freshly-opened menu.\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n function onDocClick() {\n onClose();\n }\n window.addEventListener(\"keydown\", onKey);\n const t = setTimeout(() => window.addEventListener(\"click\", onDocClick), 0);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"click\", onDocClick);\n clearTimeout(t);\n };\n }, [onClose]);\n\n // A non-filterable field (e.g. a computed column that opted out) offers no\n // filter rows; only the header + copy remain. `pairs` is the shared keep/\n // exclude op source the WHERE op picker uses too, so the two read identically.\n const ops = isFilterable(field) ? opsForField(field) : [];\n const pairs = isFilterable(field) ? opPairsForField(field) : [];\n const hasNullity = pairs.some((p) => p.keep.op === \"is_null\");\n const isArray = Array.isArray(value);\n const isNullish = value == null || value === \"\" || (isArray && (value as unknown[]).length === 0);\n const cellText = valueToString(value);\n\n function applyClause(clause: WhereClause) {\n onAddFilter(clause);\n onClose();\n }\n\n // Build one row = a positive predicate and its negation opposite.\n const rows: FilterRow[] = [];\n const pairRow = (op: FilterOp, raw: string) => {\n const positive: WhereClause = { field: field.name, op, value: NULLARY_OPS.has(op) ? \"\" : raw };\n rows.push({ positive, negative: negateClause(positive, ops) });\n };\n\n if (isArray && !isNullish) {\n // A tag column: filter by the clicked tag (and its negation), then nullity.\n const arrayOp: FilterOp = pairs.find((p) => p.keep.op === \"includes\")?.keep.op ?? pairs[0]?.keep.op ?? \"=\";\n (value as unknown[]).forEach((el) => pairRow(arrayOp, String(el)));\n if (hasNullity) pairRow(\"is_null\", cellText);\n } else if (!isNullish) {\n // Every keep op (value ops + nullity) prefilled with the cell value.\n for (const pair of pairs) pairRow(pair.keep.op, cellText);\n } else if (hasNullity) {\n // Empty cell → only the nullity row makes sense.\n pairRow(\"is_null\", cellText);\n }\n\n const vw = typeof window !== \"undefined\" ? window.innerWidth : 9999;\n const vh = typeof window !== \"undefined\" ? window.innerHeight : 9999;\n // header + copy + separator + one line per filter row.\n const approxRows = 3 + rows.length;\n const left = Math.max(8, Math.min(x + POINTER_OFFSET, vw - MENU_WIDTH - 8));\n const top = Math.max(8, Math.min(y + POINTER_OFFSET, vh - ROW_HEIGHT * approxRows - 8));\n\n return (\n <div\n className={cx(\"qt-cell-menu\", classNames?.popover)}\n style={{ left, top, width: MENU_WIDTH }}\n onClick={(e) => e.stopPropagation()}\n onContextMenu={(e) => e.preventDefault()}\n role=\"menu\"\n >\n <div className=\"qt-cm-header\">\n <span className=\"qt-cm-field\">{field.label}</span>\n <span className=\"qt-cm-value\">{Array.isArray(value) ? value.map(v => <PresentedFilterValue key={String(v)} field={field.name} value={String(v)}/>) : <PresentedFilterValue field={field.name} value={String(value ?? \"\")}/>}</span>\n </div>\n <MenuItem\n classNames={classNames}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(cellText);\n } catch {\n /* clipboard denial is non-fatal */\n }\n onClose();\n }}\n >\n copy value\n </MenuItem>\n <div className={cx(\"qt-cm-sep\", classNames?.separator)} />\n {rows.length > 0 && (\n <div className=\"qt-cm-filter-grid\" role=\"group\" aria-label=\"Filter by this cell\">\n <span className=\"qt-cm-col-head\">keep</span>\n <span className=\"qt-cm-col-head qt-cm-col-head--neg\">exclude</span>\n {rows.map((row, i) => (\n <FilterPairRow key={i} row={row} value={value} classNames={classNames} onApply={applyClause} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction FilterPairRow<Row>({\n row,\n value,\n classNames,\n onApply,\n}: {\n row: FilterRow;\n value: unknown;\n classNames: MenuClassNames | undefined;\n onApply: (clause: WhereClause) => void;\n}): ReactNode {\n return (\n <>\n <FilterButton clause={row.positive} value={value} classNames={classNames} onApply={onApply} />\n <FilterButton clause={row.negative} value={value} negative classNames={classNames} onApply={onApply} />\n </>\n );\n}\n\nfunction FilterButton({\n clause,\n value,\n negative,\n classNames,\n onApply,\n}: {\n clause: WhereClause | undefined;\n value: unknown;\n negative?: boolean;\n classNames: MenuClassNames | undefined;\n onApply: (clause: WhereClause) => void;\n}): ReactNode {\n if (!clause) return <span className=\"qt-cm-filter-empty\" aria-hidden />;\n const nullary = NULLARY_OPS.has(clause.op);\n return (\n <button\n type=\"button\"\n className={cx(\"qt-cm-item\", \"qt-cm-filter\", negative && \"qt-cm-filter--neg\", classNames?.item)}\n onClick={() => onApply(clause)}\n role=\"menuitem\"\n >\n <span className=\"qt-cm-op\">{predicateSymbol(clause)}</span>\n {!nullary ? (\n <>\n {\" \"}\n <code><PresentedFilterValue field={clause.field} value={clause.value}/></code>\n </>\n ) : null}\n </button>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n classNames,\n}: {\n children: ReactNode;\n onClick: () => void;\n classNames: MenuClassNames | undefined;\n}) {\n return (\n <button type=\"button\" className={cx(\"qt-cm-item\", classNames?.item)} onClick={onClick} role=\"menuitem\">\n {children}\n </button>\n );\n}\n\n/** Human-readable label for a predicate, honoring the `negated` flag. */\nfunction predicateSymbol(clause: WhereClause): string {\n const base = opSymbol(clause.op);\n return clause.negated ? `not ${base}` : base;\n}\n\nfunction opSymbol(op: FilterOp): string {\n switch (op) {\n case \"!=\":\n return \"≠\";\n case \">=\":\n return \"≥\";\n case \"<=\":\n return \"≤\";\n case \"starts_with\":\n return \"starts with\";\n case \"ends_with\":\n return \"ends with\";\n case \"matches_regex\":\n return \"matches\";\n case \"not_matches_regex\":\n return \"not matches\";\n case \"is_null\":\n return \"is null\";\n case \"is_not_null\":\n return \"is not null\";\n default:\n return op;\n }\n}\n\nfunction valueToString(v: unknown): string {\n if (v == null) return \"\";\n if (Array.isArray(v)) return v.join(\", \");\n return String(v);\n}\n\nfunction previewValue(v: unknown): string {\n if (v == null || v === \"\") return \"(empty)\";\n if (Array.isArray(v)) {\n return v.length === 0 ? \"(empty)\" : `[${v.length}] ${v.slice(0, 2).join(\", \")}${v.length > 2 ? \"…\" : \"\"}`;\n }\n const s = String(v);\n return s.length > 50 ? s.slice(0, 50) + \"…\" : s;\n}\n","import {\n lazy,\n Suspense,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { QueryTableApi } from \"@pythia-software/query-table-react\";\nimport {\n computedFieldName,\n FORMULA_FUNCTIONS,\n isComputedField,\n isSelectable,\n type ColumnPreview,\n type FieldStats,\n type SelectColumn,\n type RegexInspection,\n} from \"@pythia-software/query-table-core\";\nimport {\n orderPreviewGroups,\n type PreviewSort,\n type PreviewSortKey,\n} from \"./previewOrdering\";\nconst FormulaEditor = lazy(() => import(\"./FormulaEditor\"));\nconst fieldExpression = (name: string) => `[${name.replace(/\\]/g, \"]]\")}]`;\nconst display = (v: unknown) =>\n v === null\n ? \"NULL\"\n : typeof v === \"string\"\n ? v === \"\"\n ? '\"\"'\n : v\n : JSON.stringify(v);\nexport interface SelectColumnEditorProps<Row> {\n api: QueryTableApi<Row>;\n onClose: () => void;\n}\nexport function SelectColumnEditor<Row>({\n api,\n onClose,\n}: SelectColumnEditorProps<Row>) {\n const titleId = useId(),\n dialog = useRef<HTMLDivElement>(null);\n const closeRef = useRef(onClose);\n closeRef.current = onClose;\n const [columns, setColumns] = useState<SelectColumn[]>(() =>\n api.select.visible.map((c) => ({ ...c })),\n );\n const [search, setSearch] = useState(\"\"),\n [active, setActive] = useState<string>(api.select.visible[0]?.field ?? \"\");\n const [editing, setEditing] = useState(false),\n [id, setId] = useState(\"\"),\n [revision, setRevision] = useState<string | null>(null);\n const [label, setLabel] = useState(\"\"),\n [source, setSource] = useState(\"\");\n const [count, setCount] = useState(1000),\n [preview, setPreview] = useState<ColumnPreview | null>(null),\n [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null),\n [notice, setNotice] = useState(\"\"),\n [saving, setSaving] = useState(false);\n const [filter, setFilter] = useState(\"all\"),\n [page, setPage] = useState(0),\n [retry, setRetry] = useState(0),\n [functionSearch, setFunctionSearch] = useState(\"\");\n const [previewSort, setPreviewSort] = useState<PreviewSort | null>(null);\n const [fieldStats, setFieldStats] = useState<Record<string, FieldStats>>({});\n const drag = useRef<string | null>(null);\n const [inspection, setInspection] = useState<RegexInspection | null>(null);\n const catalogue = api.computed.catalogue.filter(isSelectable);\n const chosen = catalogue.find((f) => f.name === active);\n const expression = editing ? source : active ? fieldExpression(active) : \"\";\n const validation = useMemo(() => {\n if (!expression)\n return { error: \"Choose a column or create a computed column.\" };\n try {\n return {\n plan: api.computed.compile(expression, editing ? id : undefined),\n };\n } catch (e) {\n return { error: e instanceof Error ? e.message : String(e) };\n }\n }, [expression, editing, id, api.computed.compile]);\n const previewPlanKey = validation.error\n ? `error:${validation.error}`\n : `plan:${JSON.stringify(validation.plan)}`;\n // Parent refreshes may recreate the API methods without changing the preview.\n // Use the latest method, but restart only when the request itself changes.\n const previewRequest = useRef(api.computed.preview);\n previewRequest.current = api.computed.preview;\n const fieldStatsRequest = useRef(api.fieldStats);\n fieldStatsRequest.current = api.fieldStats;\n const catalogueKey = JSON.stringify(catalogue.map((field) => field.name));\n useEffect(() => {\n const previous = document.activeElement as HTMLElement | null;\n dialog.current?.focus();\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (document.querySelector(\".cm-tooltip-autocomplete\")) return;\n closeRef.current();\n }\n if (e.key === \"Tab\") {\n const focusable = Array.from(\n dialog.current?.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), input:not([disabled]), select, textarea, [tabindex=\"0\"], [contenteditable=\"true\"]',\n ) ?? [],\n ).filter((el) => el.getClientRects().length);\n const first = focusable[0],\n last = focusable[focusable.length - 1];\n if (\n e.shiftKey &&\n (document.activeElement === first ||\n document.activeElement === dialog.current)\n ) {\n e.preventDefault();\n last?.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first?.focus();\n }\n }\n };\n document.addEventListener(\"keydown\", onKey);\n const old = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.body.style.overflow = old;\n previous?.focus();\n };\n }, []);\n useEffect(() => {\n const ac = new AbortController();\n void fieldStatsRequest\n .current(\n catalogue.map((field) => field.name),\n ac.signal,\n )\n .then((result) => {\n if (!ac.signal.aborted) setFieldStats(result);\n })\n .catch(() => {\n // Stats are an optional enhancement; catalogue browsing still works.\n });\n return () => ac.abort();\n // catalogueKey captures membership without refetching when refreshes merely\n // recreate catalogue/API objects.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [catalogueKey]);\n useEffect(() => {\n const ac = new AbortController();\n setPreview(null);\n setError(null);\n setPage(0);\n setInspection(null);\n if (\n validation.error ||\n !Number.isInteger(count) ||\n count < 1 ||\n count > 10000\n ) {\n setLoading(false);\n return;\n }\n setLoading(true);\n const timer = setTimeout(() => {\n const request = previewRequest.current;\n void request(\n expression,\n count,\n ac.signal,\n editing ? id : undefined,\n editing,\n )\n .then((result) => {\n if (!ac.signal.aborted) setPreview(result);\n })\n .catch((e) => {\n if (!ac.signal.aborted)\n setError(e instanceof Error ? e.message : String(e));\n })\n .finally(() => {\n if (!ac.signal.aborted) setLoading(false);\n });\n }, 400);\n return () => {\n ac.abort();\n clearTimeout(timer);\n };\n }, [expression, count, editing, id, previewPlanKey, retry]);\n const move = (field: string, index: number) =>\n setColumns((cols) => {\n const next = cols.filter((c) => c.field !== field),\n item = cols.find((c) => c.field === field);\n if (item) next.splice(Math.max(0, Math.min(index, next.length)), 0, item);\n return next;\n });\n const toggle = (field: string) =>\n setColumns((cols) =>\n cols.some((c) => c.field === field)\n ? cols.filter((c) => c.field !== field)\n : [...cols, { field }],\n );\n function browse(field: string) {\n setActive(field);\n setEditing(false);\n setNotice(\"\");\n }\n function edit(defId?: string) {\n const def = api.computed.definitions.find((d) => d.id === defId);\n setId(def?.id ?? defId ?? crypto.randomUUID());\n setRevision(def?.revision ?? null);\n setLabel(def?.label ?? defId ?? \"\");\n setSource(\n def?.expression.source ??\n (defId ? \"\" : active ? fieldExpression(active) : \"LEFT([field], 3)\"),\n );\n setEditing(true);\n setNotice(\"\");\n }\n async function save() {\n setSaving(true);\n setError(null);\n try {\n const def = await api.computed.save(\n {\n id,\n label: label.trim(),\n expression: { language: \"qt-expr\", version: 1, source },\n },\n revision,\n );\n setRevision(def.revision);\n const field = computedFieldName(def.id);\n setActive(field);\n setColumns((cols) =>\n cols.some((c) => c.field === field) ? cols : [...cols, { field }],\n );\n setNotice(\n \"Definition saved. All queries referencing this ID now use this definition. Apply columns to update this query’s layout.\",\n );\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n const groups = useMemo(\n () =>\n orderPreviewGroups(\n (preview?.groups ?? []).filter((g) =>\n filter === \"errors\"\n ? !!g.result.error\n : filter === \"nulls\"\n ? !g.result.error && g.result.value === null\n : true,\n ),\n previewSort,\n ),\n [preview, filter, previewSort],\n );\n const catalogueResults = useMemo(\n () =>\n catalogue\n .filter((f) =>\n `${f.label} ${f.name} ${f.type} ${f.group ?? \"\"}`\n .toLowerCase()\n .includes(search.toLowerCase()),\n )\n .map((field, index) => ({ field, index }))\n .sort((a, b) => {\n const aLow = (fieldStats[a.field.name]?.distinct ?? 2) <= 1;\n const bLow = (fieldStats[b.field.name]?.distinct ?? 2) <= 1;\n return Number(aLow) - Number(bLow) || a.index - b.index;\n })\n .map(({ field }) => field),\n [catalogue, search, fieldStats],\n );\n const shown = groups.slice(page * 50, (page + 1) * 50);\n const samePreviewSortKey = (a: PreviewSortKey, b: PreviewSortKey) => {\n if (a.kind !== b.kind) return false;\n if (a.kind === \"input\" && b.kind === \"input\")\n return a.index === b.index;\n return true;\n };\n const selectPreviewSort = (key: PreviewSortKey, direction: \"asc\" | \"desc\") => {\n setPreviewSort((current) => {\n const sameKey = !!current && samePreviewSortKey(current.key, key);\n return sameKey\n ? { key, direction: current.direction === \"asc\" ? \"desc\" : \"asc\" }\n : { key, direction };\n });\n setPage(0);\n };\n const previewSortDirection = (key: PreviewSortKey) =>\n previewSort && samePreviewSortKey(previewSort.key, key)\n ? previewSort.direction\n : undefined;\n const previewAriaSort = (key: PreviewSortKey) => {\n const direction = previewSortDirection(key);\n return direction === \"asc\"\n ? \"ascending\"\n : direction === \"desc\"\n ? \"descending\"\n : \"none\";\n };\n const previewSortHeader = (\n label: string,\n key: PreviewSortKey,\n direction: \"asc\" | \"desc\" = \"asc\",\n ) => {\n const currentDirection = previewSortDirection(key);\n return (\n <button\n type=\"button\"\n className=\"qt-preview-sort\"\n onClick={() => selectPreviewSort(key, direction)}\n title={`Sort by ${label}`}\n >\n {label}\n {currentDirection && (currentDirection === \"asc\" ? \" ↑\" : \" ↓\")}\n </button>\n );\n };\n return (\n <div className=\"qt-modal-backdrop qt-select-editor-backdrop\">\n <div\n className=\"qt-select-editor\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n ref={dialog}\n tabIndex={-1}\n >\n <header className=\"qt-select-editor-header\">\n <div>\n <h2 id={titleId}>Select columns</h2>\n <p>\n Arrange your view, explore values, and create reusable computed\n columns.\n </p>\n </div>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={onClose}\n aria-label=\"Close column editor\"\n >\n ✕\n </button>\n </header>\n <div className=\"qt-select-editor-body\">\n <aside className=\"qt-selected-panel\">\n <h3>\n Selected <span className=\"qt-muted\">{columns.length}</span>\n </h3>\n <p className=\"qt-muted\">\n Drag to reorder, or use the arrow buttons.\n </p>\n <ol className=\"qt-editor-columns\">\n {columns.map((c, i) => {\n const f = catalogue.find((f) => f.name === c.field);\n return (\n <li\n key={c.field}\n draggable\n onDragStart={(e) => {\n drag.current = c.field;\n e.dataTransfer.setData(\"text/plain\", c.field);\n }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault();\n if (drag.current) move(drag.current, i);\n drag.current = null;\n }}\n onDragEnd={() => {\n drag.current = null;\n }}\n >\n <span aria-hidden=\"true\">⠿</span>\n <button\n type=\"button\"\n className=\"qt-column-name\"\n onClick={() => browse(c.field)}\n >\n {f?.label ?? c.field}\n </button>\n <button\n type=\"button\"\n className=\"qt-icon-btn\"\n disabled={i === 0}\n onClick={() => move(c.field, i - 1)}\n aria-label={`Move ${f?.label ?? c.field} up`}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"qt-icon-btn\"\n disabled={i === columns.length - 1}\n onClick={() => move(c.field, i + 1)}\n aria-label={`Move ${f?.label ?? c.field} down`}\n >\n ↓\n </button>\n <button\n type=\"button\"\n className=\"qt-icon-btn\"\n onClick={() => toggle(c.field)}\n aria-label={`Remove ${f?.label ?? c.field}`}\n >\n ×\n </button>\n </li>\n );\n })}\n </ol>\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() =>\n setColumns(\n api.defaults.select.length\n ? api.defaults.select\n : catalogue\n .filter((f) => f.select?.default)\n .map((f) => ({ field: f.name })),\n )\n }\n >\n Use default columns\n </button>\n </aside>\n <aside className=\"qt-catalogue-panel\">\n <h3>Column catalogue</h3>\n <input\n className=\"qt-input\"\n aria-label=\"Search columns\"\n placeholder=\"Search name or type…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <button\n type=\"button\"\n className=\"qt-btn qt-create-computed\"\n onClick={() => edit()}\n >\n + Computed column\n </button>\n {api.computed.loading && <p role=\"status\">Loading definitions…</p>}\n {api.computed.error && <p role=\"alert\">{api.computed.error}</p>}\n <div className=\"qt-catalogue-list\">\n {catalogueResults.map((f) => {\n const distinct = fieldStats[f.name]?.distinct;\n return (\n <div\n className={`qt-catalogue-item ${active === f.name && !editing ? \"is-active\" : \"\"} ${distinct != null && distinct <= 1 ? \"is-low-cardinality\" : \"\"}`}\n key={f.name}\n >\n <input\n type=\"checkbox\"\n aria-label={`Include ${f.label}`}\n checked={columns.some((c) => c.field === f.name)}\n onChange={() => toggle(f.name)}\n />\n <button type=\"button\" onClick={() => browse(f.name)}>\n <strong>{f.label}</strong>\n <small>\n {isComputedField(f.name) ? \"ƒ · \" : \"\"}\n {f.type} · {f.group ?? f.name}\n {distinct != null &&\n ` · ${distinct.toLocaleString()} distinct`}\n </small>\n </button>\n </div>\n );\n })}\n </div>\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() => void api.computed.reload()}\n >\n Reload shared definitions\n </button>\n </aside>\n <section className=\"qt-column-workbench\">\n {editing ? (\n <>\n <div className=\"qt-editor-title\">\n <h3>\n {revision\n ? \"Edit shared computed column\"\n : \"New computed column\"}\n </h3>\n <span className=\"qt-type-badge\">\n {validation.plan?.type ?? \"Check formula\"}\n </span>\n </div>\n <label className=\"qt-editor-label\">\n Column name\n <input\n className=\"qt-input\"\n value={label}\n maxLength={200}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"e.g. Email domain\"\n />\n </label>\n <Suspense\n fallback={\n <textarea\n aria-label=\"Computed column formula\"\n value={source}\n onChange={(e) => setSource(e.target.value)}\n />\n }\n >\n <FormulaEditor\n value={source}\n onChange={setSource}\n fields={api.computed.catalogue.filter(\n (f) => f.name !== computedFieldName(id),\n )}\n compile={(value) => api.computed.compile(value, id)}\n />\n </Suspense>\n <details className=\"qt-function-library\">\n <summary>Functions & examples</summary>\n <input\n className=\"qt-input\"\n aria-label=\"Search functions\"\n placeholder=\"Search functions…\"\n value={functionSearch}\n onChange={(e) => setFunctionSearch(e.target.value)}\n />\n <div className=\"qt-function-list\">\n {FORMULA_FUNCTIONS.filter((f) =>\n `${f.name} ${f.description}`\n .toLowerCase()\n .includes(functionSearch.toLowerCase()),\n ).map((f) => (\n <button\n type=\"button\"\n key={f.name}\n title={f.description}\n onClick={() => setSource(`${f.name}(${source})`)}\n >\n <code>{f.signature}</code>\n <small>{f.description}</small>\n </button>\n ))}\n </div>\n <p>\n Examples: <code>LEFT([name], 3)</code> ·{\" \"}\n <code>IF([amount] &gt; 100, \"High\", \"Low\")</code> ·{\" \"}\n <code>REGEX_EXTRACT([email], \"@(.+)$\", 1)</code>\n </p>\n </details>\n <div className=\"qt-definition-actions\">\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={saving || !!validation.error || !label.trim()}\n onClick={() => void save()}\n >\n {saving\n ? \"Saving…\"\n : revision\n ? \"Save shared definition\"\n : \"Save definition & add column\"}\n </button>\n {revision && (\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() => edit(id)}\n >\n Reload editor from catalogue\n </button>\n )}\n </div>\n <p className=\"qt-muted\">\n Saving changes this definition across all queries. Cancel\n below only discards column layout changes.\n </p>\n </>\n ) : (\n <div className=\"qt-editor-title\">\n <div>\n <h3>{chosen?.label ?? \"Explore a column\"}</h3>\n <p className=\"qt-muted\">\n {chosen?.name} {chosen ? `· ${chosen.type}` : \"\"}\n </p>\n </div>\n {chosen && isComputedField(chosen.name) && (\n <>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={() => edit(chosen.name.slice(10))}\n >\n Edit definition\n </button>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={() => {\n const def = api.computed.definitions.find(\n (d) => computedFieldName(d.id) === chosen.name,\n );\n edit();\n if (def) {\n setLabel(`${def.label} copy`);\n setSource(def.expression.source);\n }\n }}\n >\n Duplicate\n </button>\n </>\n )}\n </div>\n )}\n <div className=\"qt-preview-controls\">\n <label>\n Rows to process{\" \"}\n <input\n className=\"qt-input\"\n type=\"number\"\n min={1}\n max={10000}\n step={1}\n value={Number.isNaN(count) ? \"\" : count}\n onChange={(e) => setCount(e.target.valueAsNumber)}\n />\n </label>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={() => setRetry((n) => n + 1)}\n >\n Refresh preview\n </button>\n <label>\n Show{\" \"}\n <select\n value={filter}\n onChange={(e) => {\n setFilter(e.target.value);\n setPage(0);\n }}\n >\n <option value=\"all\">All results</option>\n <option value=\"nulls\">Null results</option>\n <option value=\"errors\">Errors</option>\n </select>\n </label>\n </div>\n <p className=\"qt-muted\">\n First matching rows in current sort order, starting at row 1.\n Counts describe the processed sample. Maximum 10,000 rows.\n </p>\n {(!Number.isInteger(count) || count < 1 || count > 10000) && (\n <p role=\"alert\">Choose a whole number between 1 and 10,000.</p>\n )}\n {validation.error && (\n <p className=\"qt-formula-error\" role=\"alert\">\n {validation.error}\n </p>\n )}\n {error && (\n <p className=\"qt-formula-error\" role=\"alert\">\n {error}\n </p>\n )}\n {notice && (\n <p className=\"qt-editor-notice\" role=\"status\">\n {notice}\n </p>\n )}\n {loading && <p role=\"status\">Processing preview…</p>}\n {preview && (\n <>\n <p className=\"qt-preview-summary\" role=\"status\">\n <strong>{preview.processed.toLocaleString()}</strong> of{\" \"}\n {preview.total.toLocaleString()} matching rows ·{\" \"}\n <strong>{preview.groups.length.toLocaleString()}</strong>{\" \"}\n distinct combinations · {preview.nulls.toLocaleString()} null\n · {preview.errors.toLocaleString()} errors\n {preview.processed === preview.total\n ? \" · complete filtered set\"\n : \" · sample\"}\n </p>\n <div className=\"qt-preview-table-wrap\">\n <table className=\"qt-preview-table\">\n <thead>\n <tr>\n {editing &&\n preview.dependencies.map((name, index) => (\n <th\n key={name}\n aria-sort={previewAriaSort({\n kind: \"input\",\n index,\n })}\n >\n {previewSortHeader(\n api.computed.catalogue.find(\n (f) => f.name === name,\n )?.label ?? name,\n { kind: \"input\", index },\n )}\n </th>\n ))}\n <th aria-sort={previewAriaSort({ kind: \"result\" })}>\n {previewSortHeader(editing ? \"Result\" : \"Value\", {\n kind: \"result\",\n })}\n </th>\n <th aria-sort={previewAriaSort({ kind: \"count\" })}>\n {previewSortHeader(\"Count\", { kind: \"count\" }, \"desc\")}\n </th>\n <th aria-sort={previewAriaSort({ kind: \"percentage\" })}>\n {previewSortHeader(\"%\", { kind: \"percentage\" }, \"desc\")}\n </th>\n </tr>\n </thead>\n <tbody>\n {shown.map((group, i) => (\n <tr key={i}>\n {editing &&\n group.inputs.map((value, j) => (\n <td key={j} title={display(value)}>\n {display(value)}\n </td>\n ))}\n <td\n className={\n group.result.error ? \"qt-formula-error\" : \"\"\n }\n title={\n group.result.error ?? display(group.result.value)\n }\n >\n {group.result.error ?? display(group.result.value)}\n {group.result.regex && (\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() =>\n setInspection(group.result.regex!)\n }\n >\n Inspect match\n </button>\n )}\n </td>\n <td>{group.count.toLocaleString()}</td>\n <td>\n {((100 * group.count) / preview.processed).toFixed(\n 1,\n )}\n %\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {inspection && (\n <div className=\"qt-regex-inspector\">\n <h4>Regex match</h4>\n <pre>\n {inspection.input.slice(0, inspection.start)}\n <mark>\n {inspection.input.slice(\n inspection.start,\n inspection.end,\n )}\n </mark>\n {inspection.input.slice(inspection.end)}\n </pre>\n <dl>\n {inspection.groups.map((value, i) => (\n <div key={i}>\n <dt>\n Group {i}\n {i === 0 ? \" (whole match)\" : \"\"}\n </dt>\n <dd>{display(value)}</dd>\n </div>\n ))}\n </dl>\n </div>\n )}\n {!groups.length && <p>No matching results in this sample.</p>}\n {groups.length > 50 && (\n <div className=\"qt-preview-pages\">\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={page === 0}\n onClick={() => setPage((n) => n - 1)}\n >\n Previous\n </button>\n <span>\n Combinations {page * 50 + 1}–\n {Math.min((page + 1) * 50, groups.length)} of{\" \"}\n {groups.length}\n </span>\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={(page + 1) * 50 >= groups.length}\n onClick={() => setPage((n) => n + 1)}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </section>\n </div>\n <footer className=\"qt-select-editor-footer\">\n <span className=\"qt-muted\">\n Computed columns are display-only. Select at least one column.\n </span>\n <button type=\"button\" className=\"qt-btn\" onClick={onClose}>\n Cancel layout changes\n </button>\n <button\n type=\"button\"\n className=\"qt-btn qt-primary\"\n disabled={!columns.length || columns.length > 200}\n onClick={() => {\n api.setQuery((q) => ({ ...q, select: columns }));\n onClose();\n }}\n >\n Apply columns\n </button>\n </footer>\n </div>\n </div>\n );\n}\n","import type { PreviewGroup } from \"@pythia-software/query-table-core\";\n\nexport type PreviewSortKey =\n | { kind: \"input\"; index: number }\n | { kind: \"result\" }\n | { kind: \"count\" }\n | { kind: \"percentage\" };\n\nexport interface PreviewSort {\n key: PreviewSortKey;\n direction: \"asc\" | \"desc\";\n}\n\nconst collator = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: \"base\",\n});\n\nconst valueLabel = (value: unknown) =>\n value === null\n ? \"NULL\"\n : typeof value === \"string\"\n ? value\n : JSON.stringify(value);\n\nfunction mixedRank(group: PreviewGroup) {\n // A stable hash gives each distinct combination a pseudo-random position.\n // Unlike source, alphabetic, or frequency order, the first page therefore\n // contains a representative mix without changing between renders.\n const value = JSON.stringify([\n group.inputs,\n group.result.value,\n group.result.error ?? null,\n ]);\n let hash = 2166136261;\n for (let i = 0; i < value.length; i++)\n hash = Math.imul(hash ^ value.charCodeAt(i), 16777619);\n return hash >>> 0;\n}\n\nfunction compareValue(a: unknown, b: unknown) {\n return collator.compare(valueLabel(a), valueLabel(b));\n}\n\nfunction sortValue(group: PreviewGroup, key: PreviewSortKey) {\n switch (key.kind) {\n case \"input\":\n return group.inputs[key.index] ?? null;\n case \"result\":\n return group.result.error ?? group.result.value;\n case \"count\":\n case \"percentage\":\n return group.count;\n }\n}\n\n/**\n * Preview groups start in a stable mixed order. A user-selected header replaces\n * that order with the requested alphabetical or numeric order.\n */\nexport function orderPreviewGroups(\n groups: PreviewGroup[],\n sort: PreviewSort | null,\n) {\n return groups\n .map((group, index) => ({ group, index }))\n .sort((a, b) => {\n if (!sort) {\n const rank = mixedRank(a.group) - mixedRank(b.group);\n return rank || a.index - b.index;\n }\n const comparison = compareValue(\n sortValue(a.group, sort.key),\n sortValue(b.group, sort.key),\n );\n return (sort.direction === \"asc\" ? comparison : -comparison) ||\n a.index - b.index;\n })\n .map(({ group }) => group);\n}\n","import { PresentedValueInput, useFilterValuePresentation } from \"./FilterValuePresentation\";\n// QueryBuilder — the chip toolbar: WHERE filters, SELECT columns, ORDER BY\n// (multi-sort, reorderable), and LIMIT/OFFSET paging. Type-aware filter inputs\n// (enum/static <select>, value autocomplete via Transport.fetchDistinctValues).\n// Hosts the Save / saved-queries entry point.\n//\n// Combines a chip layout, autocomplete, draggable column chips, a grouped\n// picker, per-clause operators, and multi-sort.\n\nimport { SelectColumnEditor } from \"./SelectColumnEditor\";\nimport { Fragment, useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type {\n AggOp,\n AggregationClause,\n DistinctValuesResult,\n FieldDef,\n FilterOp,\n OpChoice,\n OrderByClause,\n WhereClause,\n WhereTerm,\n} from \"@pythia-software/query-table-core\";\nimport {\n NULLARY_OPS,\n aggOpNeedsField,\n aggOpsForField,\n encodeQuery,\n filterValues as filterValuesFor,\n isGroupable,\n isMeasurable,\n isOrGroup,\n opPairsForField,\n predicatesOf,\n queriesEqual,\n isFilterable,\n isSelectable,\n isSortable,\n opsForField,\n} from \"@pythia-software/query-table-core\";\nimport type { QueryTableApi } from \"@pythia-software/query-table-react\";\nimport type { QueryBuilderClassNames } from \"./classNames\";\nimport { FieldPicker } from \"./FieldPicker\";\nimport { SavedQueriesModal } from \"./SavedQueriesModal\";\n\nexport interface QueryBuilderProps<Row> {\n /** The controller; QueryBuilder drives it through the intent helpers. */\n api: QueryTableApi<Row>;\n /** All schema fields (for the field picker / sort picker). */\n fields: FieldDef<Row>[];\n /** Total matching rows, for the \"N of M\" paging hint. */\n total: number | null;\n /** Disable inputs while a fetch is in flight. */\n running?: boolean;\n classNames?: QueryBuilderClassNames;\n /** Use this to control collapse state from a parent UI. */\n collapsed?: boolean;\n /** Controlled collapse callback (use when `collapsed` is provided). */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Initial collapse state for uncontrolled mode. */\n defaultCollapsed?: boolean;\n}\n\nconst cx = (...parts: Array<string | undefined | false>): string =>\n parts.filter((p): p is string => Boolean(p)).join(\" \");\n\nconst MAX_AUTO_REFRESH_POLLS = 1000;\nconst DEFAULT_AUTO_REFRESH_FREQUENCY_MS = 20_000;\nconst DEFAULT_AUTO_REFRESH_TURN_OFF_AFTER_MS = 5 * 60_000;\nconst SHARE_FEEDBACK_MS = 2_000;\n\nconst AUTO_REFRESH_FREQUENCIES = [\n { label: \"Every 5s\", value: 5_000 },\n { label: \"Every 10s\", value: 10_000 },\n { label: \"Every 20s\", value: DEFAULT_AUTO_REFRESH_FREQUENCY_MS },\n { label: \"Every 30s\", value: 30_000 },\n { label: \"Every 1m\", value: 60_000 },\n { label: \"Every 2m\", value: 2 * 60_000 },\n { label: \"Every 5m\", value: 5 * 60_000 },\n { label: \"Every 10m\", value: 10 * 60_000 },\n] as const;\n\nconst AUTO_REFRESH_TURN_OFF_AFTER = [\n { label: \"After 5m\", value: DEFAULT_AUTO_REFRESH_TURN_OFF_AFTER_MS },\n { label: \"After 15m\", value: 15 * 60_000 },\n { label: \"After 30m\", value: 30 * 60_000 },\n { label: \"After 1h\", value: 60 * 60_000 },\n { label: \"After 2h\", value: 2 * 60 * 60_000 },\n { label: \"After 4h\", value: 4 * 60 * 60_000 },\n { label: \"After 8h\", value: 8 * 60 * 60_000 },\n { label: \"After 12h\", value: 12 * 60 * 60_000 },\n { label: \"After 24h\", value: 24 * 60 * 60_000 },\n] as const;\n\nfunction autoRefreshPolls(frequencyMs: number, turnOffAfterMs: number): number {\n if (frequencyMs <= 0 || turnOffAfterMs <= 0) return Infinity;\n return Math.floor(turnOffAfterMs / frequencyMs);\n}\n\nfunction formatDuration(ms: number): string {\n const seconds = Math.round(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = minutes / 60;\n return Number.isInteger(hours) ? `${hours}h` : `${minutes}m`;\n}\n\nfunction formatStatusTime(ms: number | null): string {\n if (ms == null) return \"never\";\n return new Date(ms).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\", second: \"2-digit\" });\n}\n\nfunction useFieldHasNull<Row>(api: QueryTableApi<Row>, fieldName: string | undefined): boolean | undefined {\n const [hasNull, setHasNull] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n if (!fieldName) return;\n let cancelled = false;\n\n void api\n .filterValues(fieldName, \"\")\n .then((r) => {\n if (!cancelled && typeof r.hasNull === \"boolean\") {\n setHasNull(r.hasNull);\n }\n })\n .catch(() => {\n if (!cancelled) setHasNull(undefined);\n });\n\n return () => {\n cancelled = true;\n };\n }, [api, fieldName]);\n\n return hasNull;\n}\n\n/** Operators dropped from the WHERE op dropdowns: their negation is expressed by\n * the canonical positive op plus the NOT toggle instead (design: \"just support\n * NOT\"). Legacy queries carrying these ops still decode/compile fine, and a\n * clause already on one keeps showing it (see PredicateEditor). */\nconst CONVERGED_NEGATIVE_OPS: ReadonlySet<FilterOp> = new Set<FilterOp>([\"!=\", \"is_not_null\", \"not_matches_regex\"]);\n\n/** The op options offered for a field in the WHERE builder — its positive ops,\n * with the converged negatives removed (NOT toggle covers those). */\nfunction positiveOpsForField<Row>(field: FieldDef<Row>): FilterOp[] {\n return opsForField(field).filter((op) => !CONVERGED_NEGATIVE_OPS.has(op));\n}\n\nfunction predicateAsText<Row>(clause: WhereClause, byName: Map<string, FieldDef<Row>>): string {\n const field = byName.get(clause.field)?.label ?? clause.field;\n const op = clause.op.replace(/_/g, \" \");\n const not = clause.negated ? \"not \" : \"\";\n if (NULLARY_OPS.has(clause.op)) return `${field} ${not}${op}`;\n const strategy = byName.get(clause.field)?.filter?.values;\n const option = strategy?.source === 'static' ? strategy.options.find(o => typeof o !== 'string' && o.value === clause.value) : undefined;\n const value = clause.value === \"\" ? \"''\" : typeof option === 'object' ? option.label : clause.value;\n return `${field} ${not}${op} ${value}`;\n}\n\nfunction whereTermAsText<Row>(term: WhereTerm, byName: Map<string, FieldDef<Row>>): string {\n if (isOrGroup(term)) return `(${term.any.map((c) => predicateAsText(c, byName)).join(\" or \")})`;\n return predicateAsText(term, byName);\n}\n\nfunction orderByAsText<Row>(term: OrderByClause, byName: Map<string, FieldDef<Row>>): string {\n const field = byName.get(term.field)?.label ?? term.field;\n const expression = term.extract ? `regex_extract(${field}, /${term.extract.regex}/)` : field;\n const nulls = term.nulls ? ` nulls ${term.nulls}` : \"\";\n return `${expression} ${term.dir}${nulls}`;\n}\n\nfunction chipFieldWidthChars(text: string, fallback = 5, max = 30): number {\n return Math.min(max, Math.max(fallback, (text || \"\").length + 1));\n}\n\nfunction chipFieldWidthForInput(text: string, fieldType: string | undefined, fallback = 5, padding = 0): number {\n const cap = fieldType === \"number\" ? 10 : 30;\n return chipFieldWidthChars(text, fallback, cap) + padding;\n}\n\nfunction chipFieldWidthForSelect(text: string, fallback = 3, max = 30): number {\n return chipFieldWidthChars(text, fallback, max) + 2;\n}\n\nfunction buildCollapsedSummary<Row>(\n where: WhereTerm[],\n orderBy: OrderByClause[],\n byName: Map<string, FieldDef<Row>>,\n): string {\n const whereText = whereClauseSummaryText(where, byName);\n const orderText = orderBy.length === 0 ? \"(default)\" : orderBy.map((term) => orderByAsText(term, byName)).join(\", \");\n return `WHERE ${whereText} ORDER BY ${orderText}`;\n}\n\nfunction whereClauseSummaryText<Row>(where: WhereTerm[], byName: Map<string, FieldDef<Row>>): string {\n return where.length === 0 ? \"all rows\" : where.map((t) => whereTermAsText(t, byName)).join(\" and \");\n}\n\nfunction orderBySummaryText<Row>(orderBy: OrderByClause[], byName: Map<string, FieldDef<Row>>): string {\n return orderBy.length === 0 ? \"(default)\" : orderBy.map((term) => orderByAsText(term, byName)).join(\", \");\n}\n\nexport function QueryBuilder<Row>({\n api,\n fields,\n total,\n running,\n classNames,\n collapsed,\n onCollapsedChange,\n defaultCollapsed = false,\n}: QueryBuilderProps<Row>): ReactNode {\n const UNSAVED_QUERY_EDIT_ID = \"__qt-unsaved-query__\";\n const [showSaved, setShowSaved] = useState(false);\n const [shareCopied, setShareCopied] = useState(false);\n const [showAutoRefresh, setShowAutoRefresh] = useState(false);\n const [autoRefreshFrequencyMs, setAutoRefreshFrequencyMs] = useState(DEFAULT_AUTO_REFRESH_FREQUENCY_MS);\n const [autoRefreshTurnOffAfterMs, setAutoRefreshTurnOffAfterMs] = useState(DEFAULT_AUTO_REFRESH_TURN_OFF_AFTER_MS);\n const [editingSavedId, setEditingSavedId] = useState<string | null>(null);\n const [editingSavedName, setEditingSavedName] = useState(\"\");\n const [lastSavedId, setLastSavedId] = useState<string | null>(null);\n const [collapsedFallback, setCollapsedFallback] = useState(defaultCollapsed);\n const collapsedControlled = typeof collapsed !== \"undefined\";\n const isCollapsed = collapsedControlled ? collapsed : collapsedFallback;\n const setCollapsed = (next: boolean) => {\n if (collapsedControlled) {\n onCollapsedChange?.(next);\n return;\n }\n setCollapsedFallback(next);\n };\n const [lastUpdatedAt, setLastUpdatedAt] = useState<number | null>(null);\n const [lastFailureAt, setLastFailureAt] = useState<number | null>(null);\n const byName = useMemo(() => new Map(fields.map((f) => [f.name, f])), [fields]);\n const activeSavedQuery = useMemo(\n () => api.saved.items.find((item) => queriesEqual(item.query, api.query)),\n [api.query, api.saved.items],\n );\n const lastSavedQuery = useMemo(\n () => api.saved.items.find((item) => item.id === lastSavedId) ?? null,\n [api.saved.items, lastSavedId],\n );\n const isSavedQuery = activeSavedQuery != null;\n const isEditingUnsaved = editingSavedId === UNSAVED_QUERY_EDIT_ID;\n const bodyId = useId();\n const isEditingSaved = editingSavedId != null && activeSavedQuery?.id === editingSavedId;\n const showUpdateButton = Boolean(lastSavedQuery) && !activeSavedQuery;\n const collapsedSummary = useMemo(\n () => buildCollapsedSummary(api.query.where, api.query.orderBy, byName),\n [api.query.where, api.query.orderBy, byName],\n );\n const collapsedWhereText = useMemo(\n () => whereClauseSummaryText(api.query.where, byName),\n [api.query.where, byName],\n );\n const collapsedOrderText = useMemo(\n () => orderBySummaryText(api.query.orderBy, byName),\n [api.query.orderBy, byName],\n );\n const autoRefreshStatus = api.autoRefresh.status;\n const selectedAutoRefreshPolls = autoRefreshPolls(autoRefreshFrequencyMs, autoRefreshTurnOffAfterMs);\n const canSubmitAutoRefresh = selectedAutoRefreshPolls >= 1 && selectedAutoRefreshPolls <= MAX_AUTO_REFRESH_POLLS;\n const autoRefreshButtonText = autoRefreshStatus\n ? `⟳ Auto-Update ${formatDuration(autoRefreshStatus.frequencyMs)}`\n : \"⟳ Auto-Update\";\n const rowSummary = `${api.rows.length} of ${total ?? \"?\"}`;\n const lastUpdatedText = formatStatusTime(lastUpdatedAt);\n const failureText = api.error\n ? `Error: ${api.error.message}`\n : lastFailureAt\n ? `Last failure at ${formatStatusTime(lastFailureAt)}`\n : null;\n const isBusy = Boolean(running) || api.loading;\n const lastRowsRef = useRef<Row[] | null>(null);\n const lastTotalRef = useRef<number | null>(null);\n const previousLoadingRef = useRef(api.loading);\n const autoRefreshRef = useRef<HTMLSpanElement>(null);\n const autoRefreshPopoverRef = useRef<HTMLSpanElement>(null);\n const [autoRefreshPopoverAlignRight, setAutoRefreshPopoverAlignRight] = useState(false);\n const shareFeedbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (shareFeedbackTimerRef.current) clearTimeout(shareFeedbackTimerRef.current);\n },\n [],\n );\n\n useEffect(() => {\n setShareCopied(false);\n if (shareFeedbackTimerRef.current) {\n clearTimeout(shareFeedbackTimerRef.current);\n shareFeedbackTimerRef.current = null;\n }\n }, [api.query]);\n\n useEffect(() => {\n if (activeSavedQuery) {\n setLastSavedId(activeSavedQuery.id);\n if (!isEditingSaved) {\n setEditingSavedName(activeSavedQuery.name);\n setEditingSavedId(null);\n }\n return;\n }\n\n if (!isEditingUnsaved) {\n setEditingSavedId(null);\n setEditingSavedName(\"\");\n }\n // activeSavedQuery can become null if edits/loads shift to unsaved or another query\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeSavedQuery, isEditingSaved, isEditingUnsaved]);\n\n useEffect(() => {\n if (!lastSavedId || api.saved.items.some((item) => item.id === lastSavedId)) return;\n setLastSavedId(null);\n }, [api.saved.items, lastSavedId]);\n\n useEffect(() => {\n const hasData = api.rows.length > 0 || total != null;\n const rowsChanged = lastRowsRef.current !== api.rows;\n const totalChanged = lastTotalRef.current !== total;\n const loadingDone = !api.loading;\n\n if (loadingDone && api.error) {\n setLastFailureAt(Date.now());\n lastRowsRef.current = api.rows;\n lastTotalRef.current = total;\n previousLoadingRef.current = api.loading;\n return;\n }\n\n if (\n loadingDone &&\n (previousLoadingRef.current || rowsChanged || totalChanged || lastUpdatedAt == null) &&\n hasData\n ) {\n setLastUpdatedAt(Date.now());\n setLastFailureAt(null);\n lastRowsRef.current = api.rows;\n lastTotalRef.current = total;\n }\n previousLoadingRef.current = api.loading;\n }, [api.error, api.loading, api.rows, total, lastUpdatedAt]);\n\n function saveFailed(error: unknown): void {\n const message = error instanceof Error ? error.message : \"Failed to save query.\";\n if (typeof window !== \"undefined\") window.alert(message);\n }\n\n function beginEditSavedName() {\n if (activeSavedQuery) {\n setEditingSavedId(activeSavedQuery.id);\n setEditingSavedName(activeSavedQuery.name);\n return;\n }\n if (isEditingUnsaved) return;\n setEditingSavedId(UNSAVED_QUERY_EDIT_ID);\n setEditingSavedName((next) => (next ? next : \"Custom Query\"));\n }\n\n function cancelNameEdit() {\n setEditingSavedId(null);\n setEditingSavedName(\"\");\n }\n\n async function persistSavedQuery(name: string): Promise<string | null> {\n const trimmed = name.trim();\n if (!trimmed) return null;\n try {\n const saved = await api.saved.save(trimmed);\n setLastSavedId(saved.id);\n return saved.id;\n } catch (error) {\n saveFailed(error);\n return null;\n }\n }\n\n async function commitSavedNameEdit() {\n if (!isEditingSaved || !activeSavedQuery) return;\n const trimmed = editingSavedName.trim();\n if (!trimmed || trimmed === activeSavedQuery.name) {\n cancelNameEdit();\n return;\n }\n const savedId = await persistSavedQuery(trimmed);\n if (!savedId) return;\n await api.saved.remove(activeSavedQuery.id);\n cancelNameEdit();\n }\n\n async function commitUnsavedNameEdit() {\n if (!isEditingUnsaved) return;\n const savedId = await persistSavedQuery(editingSavedName);\n if (!savedId) {\n cancelNameEdit();\n return;\n }\n cancelNameEdit();\n }\n\n async function updateLastSavedQuery() {\n if (!lastSavedQuery) return;\n const wasDefault = api.saved.defaultId === lastSavedQuery.id;\n const trimmedName = lastSavedQuery.name.trim();\n if (!trimmedName) return;\n\n try {\n await api.saved.remove(lastSavedQuery.id);\n const saved = await api.saved.save(trimmedName);\n if (wasDefault) await api.saved.setDefault(saved.id);\n setLastSavedId(saved.id);\n } catch (error) {\n saveFailed(error);\n }\n }\n\n function commitNameEditor() {\n if (isEditingSaved) {\n void commitSavedNameEdit();\n return;\n }\n if (isEditingUnsaved) {\n void commitUnsavedNameEdit();\n return;\n }\n }\n\n useEffect(() => {\n if (isCollapsed) setShowSaved(false);\n }, [isCollapsed]);\n\n useEffect(() => {\n if (!showAutoRefresh || !autoRefreshStatus) return;\n setAutoRefreshFrequencyMs(autoRefreshStatus.frequencyMs);\n setAutoRefreshTurnOffAfterMs(autoRefreshStatus.turnOffAfterMs);\n }, [showAutoRefresh, autoRefreshStatus]);\n\n useEffect(() => {\n if (!showAutoRefresh) return;\n\n function onDocumentClick(event: MouseEvent) {\n const wrapper = autoRefreshRef.current;\n const target = event.target as Node | null;\n if (!wrapper || !target) return;\n if (!wrapper.contains(target)) setShowAutoRefresh(false);\n }\n\n function onDocumentKeyDown(event: KeyboardEvent) {\n if (event.key === \"Escape\") setShowAutoRefresh(false);\n }\n\n function calculateAutoRefreshPosition() {\n const popover = autoRefreshPopoverRef.current;\n const wrapper = autoRefreshRef.current;\n if (!popover || !wrapper) return;\n const wrapperRect = wrapper.getBoundingClientRect();\n const popWidth = popover.offsetWidth;\n const viewportRightInset = 8;\n setAutoRefreshPopoverAlignRight(wrapperRect.right + popWidth > window.innerWidth - viewportRightInset);\n }\n\n calculateAutoRefreshPosition();\n const t = setTimeout(() => window.addEventListener(\"click\", onDocumentClick), 0);\n window.addEventListener(\"keydown\", onDocumentKeyDown);\n window.addEventListener(\"resize\", calculateAutoRefreshPosition);\n return () => {\n clearTimeout(t);\n window.removeEventListener(\"click\", onDocumentClick);\n window.removeEventListener(\"keydown\", onDocumentKeyDown);\n window.removeEventListener(\"resize\", calculateAutoRefreshPosition);\n };\n }, [showAutoRefresh]);\n\n function submitAutoRefresh() {\n if (!canSubmitAutoRefresh) return;\n try {\n api.autoRefresh.start({\n frequencyMs: autoRefreshFrequencyMs,\n turnOffAfterMs: autoRefreshTurnOffAfterMs,\n });\n setShowAutoRefresh(false);\n } catch (error) {\n saveFailed(error);\n }\n }\n\n async function shareQuery() {\n if (typeof window === \"undefined\") return;\n\n const url = new URL(window.location.href);\n // Always derive the token from the live query. In particular, a saved\n // default must be shared by value because the recipient will not have the\n // sender's StorageAdapter contents.\n url.searchParams.set(\"q\", encodeQuery(api.query));\n\n try {\n await navigator.clipboard.writeText(url.toString());\n setShareCopied(true);\n if (shareFeedbackTimerRef.current) clearTimeout(shareFeedbackTimerRef.current);\n shareFeedbackTimerRef.current = setTimeout(() => {\n setShareCopied(false);\n shareFeedbackTimerRef.current = null;\n }, SHARE_FEEDBACK_MS);\n } catch {\n window.prompt(\"Copy this query URL\", url.toString());\n }\n }\n\n return (\n <div className={cx(\"qt-qb\", classNames?.root)}>\n <div className=\"qt-qb-bar qt-qb-state-bar qt-qb-row\">\n <span className=\"qt-qb-state-main\">\n <span className=\"qt-qb-saved\">\n <button\n type=\"button\"\n className={cx(\"qt-qb-saved-star\", isSavedQuery ? \"qt-qb-saved-star--saved\" : \"qt-qb-saved-star--unsaved\")}\n title={isSavedQuery ? \"Rename saved query\" : \"Save query\"}\n disabled={isBusy}\n onClick={beginEditSavedName}\n >\n {isSavedQuery ? \"★\" : \"☆\"}\n </button>\n {isEditingSaved || isEditingUnsaved ? (\n <span className=\"qt-qb-saved-input-wrap\">\n <input\n type=\"text\"\n className=\"qt-qb-saved-input\"\n value={editingSavedName}\n disabled={isBusy}\n autoFocus\n onChange={(e) => setEditingSavedName(e.target.value)}\n onBlur={commitNameEditor}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitNameEditor();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n cancelNameEdit();\n }\n }}\n onClick={(e) => e.stopPropagation()}\n />\n <button\n type=\"button\"\n className=\"qt-qb-saved-cancel\"\n title=\"Do not save\"\n onMouseDown={(e) => {\n e.preventDefault();\n cancelNameEdit();\n }}\n onClick={(e) => e.stopPropagation()}\n >\n ✕\n </button>\n </span>\n ) : (\n <button\n type=\"button\"\n className={cx(\"qt-qb-saved-name\", !activeSavedQuery && \"qt-qb-saved-name--custom\")}\n onClick={beginEditSavedName}\n >\n {activeSavedQuery ? activeSavedQuery.name : \"Custom Query\"}\n </button>\n )}\n </span>\n {isCollapsed ? (\n <span className=\"qt-qb-summary qt-truncate\" title={collapsedSummary}>\n <span className=\"qt-qb-summary-kw\">WHERE</span>{\" \"}\n <strong>{collapsedWhereText}</strong>{\" \"}\n <span className=\"qt-qb-summary-kw\">ORDER BY</span>{\" \"}\n <strong>{collapsedOrderText}</strong>\n </span>\n ) : null}\n </span>\n {showUpdateButton ? (\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={() => void updateLastSavedQuery()}\n disabled={isBusy}\n >\n {`Update Query '${lastSavedQuery?.name ?? \"query\"}'`}\n </button>\n ) : null}\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={() => void shareQuery()}\n title=\"Copy a URL for this query\"\n aria-live=\"polite\"\n >\n {shareCopied ? \"Copied!\" : \"Share\"}\n </button>\n <button type=\"button\" className={cx(\"qt-btn\", classNames?.button)} onClick={() => setShowSaved(true)}>\n Saved{api.saved.items.length > 0 ? ` (${api.saved.items.length})` : \"\"}\n </button>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", \"qt-qb-collapse-btn\", classNames?.button)}\n onClick={() => setCollapsed(!isCollapsed)}\n aria-expanded={!isCollapsed}\n aria-controls={bodyId}\n title={isCollapsed ? \"Expand query builder\" : \"Collapse query builder\"}\n >\n <span\n className={cx(\"qt-qb-collapse-caret\", isCollapsed && \"qt-qb-collapse-caret--collapsed\")}\n aria-hidden=\"true\"\n >\n ▾\n </span>\n <span className=\"qt-sr-only\">{isCollapsed ? \"Expand query builder\" : \"Collapse query builder\"}</span>\n </button>\n </div>\n\n {!isCollapsed ? (\n <div className=\"qt-qb-bar qt-qb-editor-bar\">\n <div id={bodyId} className=\"qt-qb-body\">\n <SelectRow api={api} fields={fields} classNames={classNames} disabled={isBusy} />\n <WhereRow api={api} byName={byName} fields={fields} classNames={classNames} disabled={isBusy} />\n <OrderRow api={api} fields={fields} classNames={classNames} disabled={isBusy} />\n <WindowRow api={api} classNames={classNames} disabled={isBusy} />\n <MetricsRow api={api} fields={fields} classNames={classNames} disabled={isBusy} />\n </div>\n <div className=\"qt-qb-editor-stack\">\n <button type=\"button\" className={cx(\"qt-btn\", classNames?.button)} onClick={api.undo} disabled={!api.canUndo || isBusy}>\n ↶ Undo\n </button>\n <button type=\"button\" className={cx(\"qt-btn\", classNames?.button)} onClick={api.redo} disabled={!api.canRedo || isBusy}>\n ↷ Redo\n </button>\n <button type=\"button\" className={cx(\"qt-btn\", classNames?.button)} onClick={api.resetAll} disabled={isBusy}>\n Reset All\n </button>\n </div>\n </div>\n ) : null}\n\n <div className=\"qt-qb-bar qt-qb-run-bar qt-qb-row\">\n <span className=\"qt-qb-run-metric qt-qb-run-metric--strong\">{api.loading ? \"loading…\" : `${rowSummary} rows`}</span>\n <span className=\"qt-qb-run-metric\">Last updated {lastUpdatedText}</span>\n {failureText ? <span className=\"qt-qb-run-error\">{failureText}</span> : null}\n <span className=\"qt-qb-run-actions\">\n {autoRefreshStatus ? (\n <span className=\"qt-qb-auto-status\">\n {`Every ${formatDuration(autoRefreshStatus.frequencyMs)}; clear after ${formatDuration(\n autoRefreshStatus.turnOffAfterMs,\n )} (${autoRefreshStatus.pollCount} polls run)`}\n </span>\n ) : null}\n <span className=\"qt-auto-refresh\" ref={autoRefreshRef}>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", Boolean(autoRefreshStatus) && \"qt-btn--active\", classNames?.button)}\n onClick={() => setShowAutoRefresh((next) => !next)}\n aria-expanded={showAutoRefresh}\n title={autoRefreshStatus ? \"View or clear auto-update\" : \"Configure auto-update\"}\n >\n {autoRefreshButtonText}\n </button>\n {showAutoRefresh ? (\n <span\n ref={autoRefreshPopoverRef}\n className={cx(\"qt-auto-refresh-popover\", autoRefreshPopoverAlignRight && \"qt-auto-refresh-popover--align-right\")}\n role=\"dialog\"\n aria-label=\"Auto-refresh settings\"\n >\n <label className=\"qt-auto-refresh-field\">\n <span>Frequency</span>\n <select\n className=\"qt-auto-refresh-select\"\n value={autoRefreshFrequencyMs}\n onChange={(e) => setAutoRefreshFrequencyMs(Number(e.target.value))}\n >\n {AUTO_REFRESH_FREQUENCIES.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <label className=\"qt-auto-refresh-field\">\n <span>Turn off after</span>\n <select\n className=\"qt-auto-refresh-select\"\n value={autoRefreshTurnOffAfterMs}\n onChange={(e) => setAutoRefreshTurnOffAfterMs(Number(e.target.value))}\n >\n {AUTO_REFRESH_TURN_OFF_AFTER.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={\n autoRefreshPolls(autoRefreshFrequencyMs, option.value) < 1 ||\n autoRefreshPolls(autoRefreshFrequencyMs, option.value) > MAX_AUTO_REFRESH_POLLS\n }\n >\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <span className={cx(\"qt-auto-refresh-status\", !canSubmitAutoRefresh && \"qt-auto-refresh-status--error\")}>\n {canSubmitAutoRefresh\n ? `${selectedAutoRefreshPolls} polls maximum`\n : `Choose between 1 and 1000 polls`}\n </span>\n {autoRefreshStatus ? (\n <span className=\"qt-auto-refresh-status\">\n Active: every {formatDuration(autoRefreshStatus.frequencyMs)}, clears after{\" \"}\n {formatDuration(autoRefreshStatus.turnOffAfterMs)}. {autoRefreshStatus.pollCount} polls run.\n </span>\n ) : null}\n <span className=\"qt-auto-refresh-actions\">\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={submitAutoRefresh}\n disabled={!canSubmitAutoRefresh}\n >\n {autoRefreshStatus ? \"Update\" : \"Start\"}\n </button>\n {autoRefreshStatus ? (\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={() => {\n api.autoRefresh.stop();\n setShowAutoRefresh(false);\n }}\n >\n Clear\n </button>\n ) : null}\n </span>\n </span>\n ) : null}\n </span>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", \"qt-btn--primary\", classNames?.button)}\n onClick={api.refresh}\n disabled={isBusy}\n >\n Run Now\n </button>\n </span>\n </div>\n\n {!isCollapsed && showSaved ? (\n <SavedQueriesModal saved={api.saved} onClose={() => setShowSaved(false)} onLoad={setLastSavedId} />\n ) : null}\n </div>\n );\n}\n\nfunction MoveButtons({\n label,\n position,\n count,\n disabled,\n onMove,\n}: {\n label: string;\n position: number;\n count: number;\n disabled: boolean | undefined;\n onMove: (position: number) => void;\n}): ReactNode {\n if (count < 2) return null;\n return (\n <span className=\"qt-chip-move-buttons\">\n <button\n type=\"button\"\n className=\"qt-chip-move\"\n disabled={disabled || position === 0}\n onClick={() => onMove(position - 1)}\n aria-label={`Move ${label} earlier`}\n title=\"Move earlier\"\n >\n ←\n </button>\n <button\n type=\"button\"\n className=\"qt-chip-move\"\n disabled={disabled || position === count - 1}\n onClick={() => onMove(position + 1)}\n aria-label={`Move ${label} later`}\n title=\"Move later\"\n >\n →\n </button>\n </span>\n );\n}\n\n// ---- SELECT ---------------------------------------------------------------\n\nfunction SelectRow<Row>({\n api,\n fields,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const { select, columnDrag } = api;\n const [editingColumns, setEditingColumns] = useState(false);\n const [adding, setAdding] = useState(false);\n const fieldLabelByName = useMemo(() => new Map(select.fields.map((f) => [f.name, f.label])), [select.fields]);\n\n // `overIndex` is a position in the list with the dragged column removed —\n // exactly where the live preview shows it. select.move removes-then-inserts at\n // that index, so the committed order matches the preview.\n function reorderByIndex(from: string, overIndex: number) {\n select.move(from, overIndex);\n }\n\n const fieldNames = select.visible.map((c) => c.field);\n const dragSource = columnDrag.source;\n\n // Live reorder, driven by the SHARED column-drag state so dragging a chip also\n // live-previews/dims the matching table column (and vice versa). The dragged\n // chip stays MOUNTED (removing the drag-source node mid-drag aborts the native\n // drag) and slides to the hovered slot, dimmed. Rendered order == drop result.\n const rendered = columnDrag.preview(fieldNames);\n\n return (\n <div className=\"qt-qb-row\">\n <span className=\"qt-qb-kw\">select</span>\n <button type=\"button\" className=\"qt-btn\" disabled={disabled} onClick={() => setEditingColumns(true)}>Edit columns</button>\n {editingColumns && <SelectColumnEditor api={api} onClose={() => setEditingColumns(false)} />}\n {rendered.map((name, position) => {\n const label = fieldLabelByName.get(name) ?? name;\n return (\n <span\n // Stable key (not index-based) so React MOVES the dragged chip instead\n // of remounting it \\u2014 a remount removes the drag source and aborts the drag.\n key={name}\n className={cx(\n \"qt-chip\",\n \"qt-chip--col\",\n dragSource === name && \"qt-chip--dragging\",\n classNames?.columnChip ?? classNames?.chip,\n )}\n draggable={!disabled}\n onDragStart={(e) => {\n columnDrag.start(name, fieldNames.indexOf(name));\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", name);\n }}\n onDragOver={(e) => {\n if (!columnDrag.source) return;\n // preventDefault on every chip (incl. the dragged one) so there is no\n // dead drop zone along the row.\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (columnDrag.source !== name) {\n const withoutDragged = fieldNames.filter((n) => n !== columnDrag.source);\n let next = withoutDragged.indexOf(name);\n if (next >= 0) {\n // Drop after the hovered chip when past its midpoint, so a column\n // can be moved into the last slot.\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n columnDrag.over(next);\n }\n }\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const from = columnDrag.source || e.dataTransfer.getData(\"text/plain\");\n if (from && columnDrag.overIndex != null) reorderByIndex(from, columnDrag.overIndex);\n columnDrag.end();\n }}\n onDragEnd={() => columnDrag.end()}\n title=\"drag to reorder\"\n >\n <span aria-hidden className=\"qt-chip-grip\">\n ⋮⋮\n </span>\n <span className=\"qt-chip-field\">{label}</span>\n <MoveButtons\n label={label}\n position={position}\n count={rendered.length}\n disabled={disabled}\n onMove={(nextPosition) => select.move(name, nextPosition)}\n />\n <button type=\"button\" className=\"qt-chip-x\" onClick={() => select.hide(name)} disabled={disabled}>\n ✕\n </button>\n </span>\n );\n })}\n {adding ? (\n <FieldPicker\n fields={select.hidden.filter(isSelectable)}\n onPick={(f) => {\n select.show(f.name);\n setAdding(false);\n }}\n onClose={() => setAdding(false)}\n />\n ) : (\n <button\n type=\"button\"\n className=\"qt-add\"\n onClick={() => setAdding(true)}\n disabled={disabled || select.hidden.length === 0}\n >\n + add column\n </button>\n )}\n {api.query.select.length > 0 && (\n <button type=\"button\" className=\"qt-link-btn\" onClick={select.reset} disabled={disabled} title=\"Reset to default columns\">\n reset\n </button>\n )}\n </div>\n );\n}\n\n// ---- WHERE ----------------------------------------------------------------\n\n/** Where a drop lands relative to the hovered term chip: reorder before/after\n * it, or drop onto its center to OR the two together. */\ntype DropMode = \"before\" | \"after\" | \"merge\";\n\ninterface WhereDrag {\n /** Index of the term being dragged. */\n from: number;\n /** Current hovered term + intent, or null when over dead space. */\n over: { index: number; mode: DropMode } | null;\n}\n\n/** Classify a drag position within a chip: outer thirds reorder, the center\n * merges into an OR group. */\nfunction dropModeFor(e: React.DragEvent): DropMode {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n if (x < rect.width * 0.3) return \"before\";\n if (x > rect.width * 0.7) return \"after\";\n return \"merge\";\n}\n\nfunction WhereRow<Row>({\n api,\n byName,\n fields,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n byName: Map<string, FieldDef<Row>>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const [adding, setAdding] = useState(false);\n // Local drag state (WHERE terms are their own list, unlike the columns shared\n // via api.columnDrag). Order is committed only on drop, so the DOM order stays\n // put during the drag and index keys never remount the dragged node.\n const [drag, setDrag] = useState<WhereDrag | null>(null);\n const where = api.query.where;\n // Only make the top-level conjunction explicit (\"AND\" between terms) once an\n // OR group is present — otherwise a plain AND-list reads fine unadorned.\n const hasOr = where.some(isOrGroup);\n\n function addClause(f: FieldDef<Row>) {\n const op = positiveOpsForField(f)[0] ?? opsForField(f)[0] ?? \"=\";\n api.addFilter({ field: f.name, op, value: \"\" });\n setAdding(false);\n }\n\n function handleOver(e: React.DragEvent, index: number) {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const mode = dropModeFor(e);\n setDrag((d) => (d && (d.over?.index !== index || d.over?.mode !== mode) ? { from: d.from, over: { index, mode } } : d));\n }\n\n function handleDrop() {\n if (!drag || !drag.over) {\n setDrag(null);\n return;\n }\n const { from } = drag;\n const { index: target, mode } = drag.over;\n if (mode === \"merge\") {\n if (target !== from) api.mergeFilters(from, target);\n } else {\n // Translate \"before/after term `target`\" into an index in the list with the\n // dragged term already removed (what reorderFilters expects).\n const tPrime = target < from ? target : target - 1;\n const insertAt = mode === \"after\" ? tPrime + 1 : tPrime;\n if (insertAt !== from) api.reorderFilters(from, insertAt);\n }\n setDrag(null);\n }\n\n return (\n <div className=\"qt-qb-row\">\n <span className=\"qt-qb-kw\">where</span>\n {where.length === 0 && !adding && <span className=\"qt-qb-hint\">all rows</span>}\n {where.map((term, index) => (\n <span className=\"qt-where-term-wrap\" key={index}>\n {index > 0 && hasOr && <span className=\"qt-where-and\">AND</span>}\n <TermChip\n api={api}\n term={term}\n index={index}\n byName={byName}\n classNames={classNames}\n disabled={disabled}\n isDragSource={drag?.from === index}\n dropHint={drag?.over?.index === index ? drag.over.mode : null}\n onDragStart={() => setDrag({ from: index, over: null })}\n onDragOver={(e) => handleOver(e, index)}\n onDrop={handleDrop}\n onDragEnd={() => setDrag(null)}\n />\n </span>\n ))}\n {adding ? (\n <FieldPicker\n fields={fields.filter(isFilterable)}\n gateOnDistinct\n onPick={addClause}\n onClose={() => setAdding(false)}\n />\n ) : (\n <button type=\"button\" className=\"qt-add\" onClick={() => setAdding(true)} disabled={disabled}>\n + add filter\n </button>\n )}\n {where.length > 0 && (\n <button type=\"button\" className=\"qt-link-btn\" onClick={api.clearFilters} disabled={disabled} title=\"Reset filters\">\n reset\n </button>\n )}\n </div>\n );\n}\n\n/** One top-level WHERE term: a single predicate, or a bordered OR group holding\n * several. Draggable by its grip; a drop onto another chip's center ORs them,\n * onto its edges reorders. */\nfunction TermChip<Row>({\n api,\n term,\n index,\n byName,\n classNames,\n disabled,\n isDragSource,\n dropHint,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: {\n api: QueryTableApi<Row>;\n term: WhereTerm;\n index: number;\n byName: Map<string, FieldDef<Row>>;\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n isDragSource: boolean;\n dropHint: DropMode | null;\n onDragStart: () => void;\n onDragOver: (e: React.DragEvent) => void;\n onDrop: () => void;\n onDragEnd: () => void;\n}) {\n const group = isOrGroup(term);\n const predicates = predicatesOf(term);\n\n const grip = (\n <span\n className=\"qt-chip-grip\"\n aria-hidden\n draggable={!disabled}\n onDragStart={(e) => {\n onDragStart();\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", String(index));\n }}\n onDragEnd={onDragEnd}\n title=\"drag to reorder, or drop onto another filter to make an OR\"\n >\n ⋮⋮\n </span>\n );\n\n return (\n <span\n className={cx(\n \"qt-chip\",\n \"qt-chip--where\",\n group && \"qt-chip--or\",\n isDragSource && \"qt-chip--dragging\",\n dropHint ? `qt-chip--drop-${dropHint}` : undefined,\n classNames?.chip,\n )}\n onDragOver={onDragOver}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n >\n {grip}\n {group ? (\n <span className=\"qt-or-group\">\n {predicates.map((clause, predIndex) => (\n <span className=\"qt-or-member\" key={predIndex}>\n {predIndex > 0 && <span className=\"qt-chip-and qt-chip-or\">OR</span>}\n <PredicateEditor\n api={api}\n field={byName.get(clause.field)}\n clause={clause}\n classNames={classNames}\n disabled={disabled}\n onChange={(next) => api.updatePredicate(index, predIndex, next)}\n onRemove={() => api.removePredicate(index, predIndex)}\n />\n </span>\n ))}\n </span>\n ) : (\n <PredicateEditor\n api={api}\n field={byName.get(term.field)}\n clause={term}\n classNames={classNames}\n disabled={disabled}\n onChange={(next) => api.updatePredicate(index, 0, next)}\n onRemove={() => api.removeFilter(index)}\n />\n )}\n </span>\n );\n}\n\n/** Human-readable operator labels for the WHERE chips + op picker. */\nconst OP_LABEL: Record<FilterOp, string> = {\n \"=\": \"=\",\n \"!=\": \"≠\",\n \">\": \">\",\n \">=\": \"≥\",\n \"<\": \"<\",\n \"<=\": \"≤\",\n contains: \"contains\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n matches_regex: \"matches\",\n not_matches_regex: \"not matches\",\n includes: \"includes\",\n is_null: \"is null\",\n is_not_null: \"is not null\",\n};\n\nfunction choiceLabel(op: FilterOp, negated: boolean): string {\n return negated ? `not ${OP_LABEL[op]}` : OP_LABEL[op];\n}\n\n/** The operator control: a button showing the current condition that opens a\n * keep/exclude popover — the same two-column layout as the CellMenu, with the\n * active choice highlighted. Picking sets the predicate's op + negation. */\nfunction OpPicker<Row>({\n field,\n clause,\n disabled,\n classNames,\n onPick,\n}: {\n field: FieldDef<Row> | undefined;\n clause: WhereClause;\n disabled: boolean | undefined;\n classNames: QueryBuilderClassNames | undefined;\n onPick: (choice: OpChoice) => void;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function onDocClick(e: MouseEvent) {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) setOpen(false);\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") setOpen(false);\n }\n // Defer the document listener a tick so the opening click doesn't close it.\n const t = setTimeout(() => window.addEventListener(\"click\", onDocClick), 0);\n window.addEventListener(\"keydown\", onKey);\n return () => {\n clearTimeout(t);\n window.removeEventListener(\"click\", onDocClick);\n window.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n const pairs = useMemo(() => (field ? opPairsForField(field) : []), [field]);\n const isActive = (choice: OpChoice) =>\n choice.op === clause.op && Boolean(choice.negated) === Boolean(clause.negated);\n\n return (\n <span className=\"qt-op-picker\" ref={wrapRef}>\n <button\n type=\"button\"\n className={cx(\"qt-chip-op-btn\", \"qt-op-trigger\", classNames?.select)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n {choiceLabel(clause.op, Boolean(clause.negated))}\n <span className=\"qt-op-caret\" aria-hidden>\n ▾\n </span>\n </button>\n {open && pairs.length > 0 && (\n <span className=\"qt-op-pop\" role=\"dialog\" aria-label=\"Choose condition\">\n <span className=\"qt-cm-col-head\">keep</span>\n <span className=\"qt-cm-col-head qt-cm-col-head--neg\">exclude</span>\n {pairs.map((pair, i) => (\n <Fragment key={i}>\n <button\n type=\"button\"\n className={cx(\"qt-op-cell\", isActive(pair.keep) && \"qt-op-cell--on\")}\n onClick={() => {\n onPick(pair.keep);\n setOpen(false);\n }}\n >\n {choiceLabel(pair.keep.op, pair.keep.negated)}\n </button>\n <button\n type=\"button\"\n className={cx(\"qt-op-cell\", \"qt-op-cell--neg\", isActive(pair.exclude) && \"qt-op-cell--on\")}\n onClick={() => {\n onPick(pair.exclude);\n setOpen(false);\n }}\n >\n {choiceLabel(pair.exclude.op, pair.exclude.negated)}\n </button>\n </Fragment>\n ))}\n </span>\n )}\n </span>\n );\n}\n\n/** The editor for one predicate: field label, the operator picker (a keep/\n * exclude popover that also carries negation), a type-aware value input, and\n * remove. Shared by standalone and grouped terms. */\nfunction PredicateEditor<Row>({\n api,\n field,\n clause,\n classNames,\n disabled,\n onChange,\n onRemove,\n}: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row> | undefined;\n clause: WhereClause;\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n onChange: (next: WhereClause) => void;\n onRemove: () => void;\n}) {\n const needsValue = !NULLARY_OPS.has(clause.op);\n const isRegex = clause.op === \"matches_regex\" || clause.op === \"not_matches_regex\";\n\n function pickOp(choice: OpChoice) {\n // Keep the captured value; a nullary op just hides its input.\n const next: WhereClause = { field: clause.field, op: choice.op, value: clause.value };\n if (choice.negated) next.negated = true;\n onChange(next);\n }\n\n return (\n <span className=\"qt-pred\">\n <span className=\"qt-chip-field\">{field?.label ?? clause.field}</span>\n <OpPicker field={field} clause={clause} disabled={disabled} classNames={classNames} onPick={pickOp} />\n {needsValue && (\n <ValueInput\n api={api}\n field={field}\n value={clause.value}\n forceFreeform={isRegex}\n placeholder={isRegex ? \"regex\" : \"value\"}\n classNames={classNames}\n onChange={(v) => onChange({ ...clause, value: v })}\n />\n )}\n <button type=\"button\" className=\"qt-chip-x\" onClick={onRemove} disabled={disabled}>\n ✕\n </button>\n </span>\n );\n}\n\n// ---- value input: autocomplete by default --------------------------------\n\nfunction ValueInput<Row>({\n api,\n field,\n value,\n forceFreeform,\n placeholder = \"value\",\n classNames,\n onChange,\n}: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row> | undefined;\n value: string;\n forceFreeform?: boolean;\n placeholder?: string;\n classNames: QueryBuilderClassNames | undefined;\n onChange: (v: string) => void;\n}) {\n const presentation = useFilterValuePresentation();\n const strategy = field ? filterValuesFor(field) : { source: \"freeform\" as const };\n\n // Static closed domain → a plain <select> of the options.\n if (!forceFreeform && strategy.source === \"static\") {\n if (presentation.render || presentation.label || strategy.options.some(o => typeof o !== 'string')) {\n return <PresentedValueInput field={field?.name ?? ''} value={value} options={strategy.options} onChange={onChange}/>;\n }\n return <select className={cx('qt-chip-val',classNames?.select)} value={value} onChange={e=>onChange(e.target.value)}><option value=\"\">—</option>{strategy.options.map(o=>{const option=typeof o==='string'?{value:o,label:o}:o;return <option key={option.value} value={option.value}>{option.label}</option>})}</select>;\n }\n\n // Freeform → a plain input, no suggestions.\n if (forceFreeform || strategy.source === \"freeform\" || !field) {\n const widthChars = chipFieldWidthForInput(value || placeholder, field?.type, 5, 4);\n return (\n <input\n className={cx(\"qt-chip-val\", classNames?.input)}\n value={value}\n placeholder={placeholder}\n size={widthChars}\n style={{ width: `${widthChars}ch` }}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n // Autocomplete (the default) → debounced combobox backed by api.filterValues.\n return <AutocompleteInput api={api} field={field} value={value} classNames={classNames} onChange={onChange} />;\n}\n\nfunction AutocompleteInput<Row>({\n api,\n field,\n value,\n classNames,\n onChange,\n}: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row>;\n value: string;\n classNames: QueryBuilderClassNames | undefined;\n onChange: (v: string) => void;\n}) {\n const [result, setResult] = useState<DistinctValuesResult>({ values: [], hasMore: false });\n const listId = useId();\n\n useEffect(() => {\n let cancelled = false;\n const t = setTimeout(() => {\n void api\n .filterValues(field.name, value)\n .then((r) => {\n if (!cancelled) setResult(r);\n })\n .catch(() => {\n if (!cancelled) setResult({ values: [], hasMore: false });\n });\n }, 200);\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [api, field.name, value]);\n\n return (\n <span className=\"qt-autocomplete\">\n <input\n className={cx(\"qt-chip-val\", classNames?.input)}\n value={value}\n placeholder=\"value\"\n list={listId}\n size={chipFieldWidthForInput(value || \"value\", field.type, 5, 4)}\n style={{ width: `${chipFieldWidthForInput(value || \"value\", field.type, 5, 4)}ch` }}\n onChange={(e) => onChange(e.target.value)}\n />\n <datalist id={listId}>\n {result.values.map((v) => (\n <option key={v} value={v} />\n ))}\n </datalist>\n {result.hasMore && <span className=\"qt-autocomplete-hint\">keep typing to refine…</span>}\n </span>\n );\n}\n\n// ---- ORDER BY (multi-sort, reorderable) -----------------------------------\n\nfunction OrderTermChip<Row>({\n api,\n field,\n term,\n dataIndex,\n priority,\n showPriority,\n isDragSource,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n disabled,\n updateTerm,\n clearExtract,\n removeTerm,\n position,\n count,\n moveTerm,\n classNames,\n label,\n}: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row> | undefined;\n term: OrderByClause;\n /** Index of this term in the real orderBy array (for update/remove). */\n dataIndex: number;\n /** 1-based sort priority to display (reflects the live drag position). */\n priority: number;\n showPriority: boolean;\n isDragSource: boolean;\n onDragStart: () => void;\n onDragOver: (e: React.DragEvent) => void;\n onDrop: () => void;\n onDragEnd: () => void;\n disabled: boolean | undefined;\n updateTerm: (i: number, patch: Partial<OrderByClause>) => void;\n clearExtract: (i: number) => void;\n removeTerm: (i: number) => void;\n position: number;\n count: number;\n moveTerm: (toIndex: number) => void;\n classNames: QueryBuilderClassNames | undefined;\n label: string;\n}) {\n const fieldHasNull = useFieldHasNull(api, field?.name);\n\n return (\n <span\n className={cx(\"qt-chip\", \"qt-chip--col\", \"qt-chip--sort\", isDragSource && \"qt-chip--dragging\", classNames?.chip)}\n draggable={!disabled}\n onDragStart={(e) => {\n onDragStart();\n // Firefox refuses to start a native drag unless drag data is set here.\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", term.field);\n }}\n onDragOver={onDragOver}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n onDragEnd={onDragEnd}\n title=\"drag to reorder sort priority\"\n >\n <span aria-hidden className=\"qt-chip-grip\">\n ⋮⋮\n </span>\n {showPriority && <span className=\"qt-chip-priority\">{priority}</span>}\n <span className=\"qt-chip-field\">{label}</span>\n <button\n type=\"button\"\n className=\"qt-chip-op-btn\"\n disabled={disabled}\n onClick={() => updateTerm(dataIndex, { dir: term.dir === \"asc\" ? \"desc\" : \"asc\" })}\n >\n {term.dir === \"asc\" ? \"↑ asc\" : \"↓ desc\"}\n </button>\n {term.extract ? (\n <span className=\"qt-sort-extract\">\n <span className=\"qt-chip-and\">extract</span>\n <input\n className={cx(\"qt-chip-val\", classNames?.input)}\n value={term.extract.regex}\n placeholder=\"regex\"\n aria-label={`Regex extract for ${label}`}\n size={chipFieldWidthForInput(term.extract.regex || \"regex\", \"text\", 5, 4)}\n style={{ width: `${chipFieldWidthForInput(term.extract.regex || \"regex\", \"text\", 5, 4)}ch` }}\n disabled={disabled}\n onChange={(e) => updateTerm(dataIndex, { extract: { regex: e.target.value } })}\n />\n <button\n type=\"button\"\n className=\"qt-chip-x\"\n title=\"Remove regex extraction\"\n aria-label={`Remove regex extract for ${label}`}\n disabled={disabled}\n onClick={() => clearExtract(dataIndex)}\n >\n ✕\n </button>\n </span>\n ) : (\n <button\n type=\"button\"\n className=\"qt-chip-op-btn\"\n title=\"Sort by text extracted with a regular expression\"\n disabled={disabled}\n onClick={() => updateTerm(dataIndex, { extract: { regex: \"\" } })}\n >\n + regex extract\n </button>\n )}\n {(term.extract != null || fieldHasNull !== false) && (\n <button\n type=\"button\"\n className=\"qt-chip-op-btn\"\n disabled={disabled}\n title=\"where NULL values sort\"\n onClick={() => updateTerm(dataIndex, { nulls: (term.nulls ?? \"last\") === \"last\" ? \"first\" : \"last\" })}\n >\n nulls {term.nulls ?? \"last\"}\n </button>\n )}\n <MoveButtons\n label={label}\n position={position}\n count={count}\n disabled={disabled}\n onMove={moveTerm}\n />\n <button type=\"button\" className=\"qt-chip-x\" onClick={() => removeTerm(dataIndex)} disabled={disabled}>\n ✕\n </button>\n </span>\n );\n}\n\nfunction OrderRow<Row>({\n api,\n fields,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const orderBy = api.query.orderBy;\n const byName = useMemo(() => new Map(fields.map((f) => [f.name, f])), [fields]);\n // Local live-reorder drag state (sort terms are their own list, distinct from\n // the columns shared via api.columnDrag) — same dimmed-source + slide preview.\n const [drag, setDrag] = useState<{ source: string; overIndex: number } | null>(null);\n const [adding, setAdding] = useState(false);\n\n function setOrderBy(next: OrderByClause[]) {\n api.setSort(next);\n }\n function updateTerm(i: number, patch: Partial<OrderByClause>) {\n setOrderBy(orderBy.map((o, k) => (k === i ? { ...o, ...patch } : o)));\n }\n function clearExtract(i: number) {\n setOrderBy(\n orderBy.map((term, index) => {\n if (index !== i) return term;\n const { extract: _extract, ...plainTerm } = term;\n return plainTerm;\n }),\n );\n }\n function removeTerm(i: number) {\n setOrderBy(orderBy.filter((_, k) => k !== i));\n }\n function addTerm(f: FieldDef<Row>) {\n const field = f.sort?.field ?? f.name;\n const nextOrderBy: OrderByClause[] = [...orderBy, { field, dir: \"desc\" }];\n\n if (orderBy.some((o) => o.field === field)) {\n setAdding(false);\n return;\n }\n\n const hasSelectColumn = api.select.visible.some((c) => c.field === field);\n if (hasSelectColumn) {\n setOrderBy(nextOrderBy);\n setAdding(false);\n return;\n }\n\n api.setQuery((q) => ({\n ...q,\n offset: 0,\n orderBy: nextOrderBy,\n select: q.select.length ? [...q.select, { field }] : [...api.select.visible, { field }],\n }));\n setAdding(false);\n }\n\n // Order-by terms are identified by their (unique) field; the drag math mirrors\n // the column chips so the live preview equals the committed order.\n const termFields = orderBy.map((o) => o.field);\n const termByField = useMemo(() => new Map(orderBy.map((o) => [o.field, o])), [orderBy]);\n function previewFields(): string[] {\n if (!drag) return termFields;\n const without = termFields.filter((f) => f !== drag.source);\n if (without.length === termFields.length) return termFields;\n const at = Math.max(0, Math.min(drag.overIndex, without.length));\n return [...without.slice(0, at), drag.source, ...without.slice(at)];\n }\n function handleSortOver(e: React.DragEvent, field: string) {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (drag.source !== field) {\n const without = termFields.filter((f) => f !== drag.source);\n let next = without.indexOf(field);\n if (next >= 0) {\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n setDrag((d) => (d && d.overIndex !== next ? { source: d.source, overIndex: next } : d));\n }\n }\n }\n function commitSortDrop() {\n if (drag) setOrderBy(previewFields().map((f) => termByField.get(f)!));\n setDrag(null);\n }\n\n const rendered = previewFields();\n const sortable = fields.filter(isSortable);\n const isDefaultOrderBy =\n orderBy.length === api.defaults.orderBy.length &&\n orderBy.every((term, i) => {\n const next = api.defaults.orderBy[i];\n return (\n term.field === next?.field &&\n term.dir === next?.dir &&\n (term.nulls ?? \"last\") === (next?.nulls ?? \"last\") &&\n (term.extract?.regex ?? null) === (next?.extract?.regex ?? null)\n );\n });\n\n return (\n <div className=\"qt-qb-row\">\n <span className=\"qt-qb-kw\">order by</span>\n {orderBy.length === 0 && !adding && <span className=\"qt-qb-hint\">(default)</span>}\n {rendered.map((f, pos) => {\n const term = termByField.get(f)!;\n return (\n <OrderTermChip\n // Stable key (term field) so React MOVES the dragged chip, not remounts it.\n key={f}\n api={api}\n field={byName.get(f)}\n term={term}\n dataIndex={orderBy.findIndex((o) => o.field === f)}\n priority={pos + 1}\n showPriority={orderBy.length > 1}\n isDragSource={drag?.source === f}\n onDragStart={() => setDrag({ source: f, overIndex: termFields.indexOf(f) })}\n onDragOver={(e) => handleSortOver(e, f)}\n onDrop={commitSortDrop}\n onDragEnd={() => setDrag(null)}\n disabled={disabled}\n updateTerm={updateTerm}\n clearExtract={clearExtract}\n removeTerm={removeTerm}\n position={pos}\n count={rendered.length}\n moveTerm={(toIndex) => {\n const next = [...orderBy];\n const fromIndex = next.findIndex((candidate) => candidate.field === f);\n if (fromIndex === -1) return;\n const [moved] = next.splice(fromIndex, 1);\n next.splice(toIndex, 0, moved!);\n setOrderBy(next);\n }}\n classNames={classNames}\n label={byName.get(f)?.label ?? f}\n />\n );\n })}\n {adding ? (\n <FieldPicker fields={sortable} onPick={addTerm} onClose={() => setAdding(false)} />\n ) : (\n <button type=\"button\" className=\"qt-add\" onClick={() => setAdding(true)} disabled={disabled}>\n + add sort\n </button>\n )}\n {!isDefaultOrderBy && (\n <button type=\"button\" className=\"qt-link-btn\" onClick={() => api.setSort(api.defaults.orderBy)} disabled={disabled}>\n reset\n </button>\n )}\n </div>\n );\n}\n\n// ---- LIMIT / OFFSET -------------------------------------------------------\n\nfunction WindowRow<Row>({\n api,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const { query } = api;\n const [limitDraft, setLimitDraft] = useState(String(query.limit));\n const [offsetDraft, setOffsetDraft] = useState(String(query.offset));\n useEffect(() => setLimitDraft(String(query.limit)), [query.limit]);\n useEffect(() => setOffsetDraft(String(query.offset)), [query.offset]);\n const hasLimitDefault = query.limit === api.defaults.limit;\n const hasOffsetDefault = query.offset === api.defaults.offset;\n const hasWindowDefault = hasLimitDefault && hasOffsetDefault;\n\n function commitLimit() {\n api.setLimit(Math.max(1, Number(limitDraft) || query.limit));\n }\n function commitOffset() {\n api.setOffset(Math.max(0, Number(offsetDraft) || 0));\n }\n\n return (\n <div className=\"qt-qb-row qt-qb-pagination\">\n <label className=\"qt-qb-window-field\">\n <span className=\"qt-qb-kw\">limit</span>\n <input\n className={cx(\"qt-qb-num\", classNames?.input)}\n type=\"number\"\n min={1}\n value={limitDraft}\n disabled={disabled}\n onChange={(e) => setLimitDraft(e.target.value)}\n onBlur={commitLimit}\n onKeyDown={(e) => e.key === \"Enter\" && commitLimit()}\n />\n </label>\n <label className=\"qt-qb-window-field\">\n <span className=\"qt-qb-kw\">offset</span>\n <input\n className={cx(\"qt-qb-num\", classNames?.input)}\n type=\"number\"\n min={0}\n value={offsetDraft}\n disabled={disabled}\n onChange={(e) => setOffsetDraft(e.target.value)}\n onBlur={commitOffset}\n onKeyDown={(e) => e.key === \"Enter\" && commitOffset()}\n />\n </label>\n {!hasWindowDefault && (\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() => {\n api.setLimit(api.defaults.limit);\n api.setOffset(api.defaults.offset);\n }}\n disabled={disabled}\n title=\"Reset limit and offset\"\n >\n reset\n </button>\n )}\n </div>\n );\n}\n\n// ---- METRICS (aggregations: op · measure · group-by, reorderable) ---------\n\nconst AGG_OPS: AggOp[] = [\"count\", \"count_distinct\", \"sum\", \"avg\", \"min\", \"max\"];\nconst AGG_OP_LABELS: Record<AggOp, string> = {\n count: \"count\",\n count_distinct: \"count distinct\",\n sum: \"sum\",\n avg: \"avg\",\n min: \"min\",\n max: \"max\",\n};\n\nfunction MetricsRow<Row>({\n api,\n fields,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const { aggregations } = api;\n const clauses = aggregations.clauses;\n const measurable = useMemo(() => fields.filter(isMeasurable), [fields]);\n const groupable = useMemo(() => fields.filter(isGroupable), [fields]);\n\n // Local live-reorder drag state (metrics are their own list, like the order-by\n // terms). Chips are identified by their stable clause id so React MOVES the\n // dragged chip instead of remounting it (a remount aborts the native drag).\n const [drag, setDrag] = useState<{ source: string; overIndex: number } | null>(null);\n\n const ids = clauses.map((c) => c.id);\n const byId = useMemo(() => new Map(clauses.map((c) => [c.id, c])), [clauses]);\n\n function previewIds(): string[] {\n if (!drag) return ids;\n const without = ids.filter((i) => i !== drag.source);\n if (without.length === ids.length) return ids;\n const at = Math.max(0, Math.min(drag.overIndex, without.length));\n return [...without.slice(0, at), drag.source, ...without.slice(at)];\n }\n function handleOver(e: React.DragEvent, id: string) {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (drag.source === id) return;\n const without = ids.filter((i) => i !== drag.source);\n let next = without.indexOf(id);\n if (next >= 0) {\n // Drop after the hovered chip when past its midpoint, so a metric can be\n // moved into the last slot (no clientX ⇒ insert before, like the spec).\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n setDrag((d) => (d && d.overIndex !== next ? { source: d.source, overIndex: next } : d));\n }\n }\n function commitDrop() {\n if (drag) aggregations.move(drag.source, drag.overIndex);\n setDrag(null);\n }\n\n const rendered = previewIds();\n\n return (\n <div className=\"qt-qb-row qt-qb-row--metrics\">\n <span className=\"qt-qb-kw\">metrics</span>\n {clauses.length === 0 && <span className=\"qt-qb-hint\">none</span>}\n {rendered.map((id, position) => {\n const clause = byId.get(id)!;\n return (\n <MetricChip\n // Stable key (clause id) so React MOVES the dragged chip, not remounts it.\n key={id}\n clause={clause}\n measurable={measurable}\n groupable={groupable}\n classNames={classNames}\n disabled={disabled}\n isDragSource={drag?.source === id}\n onDragStart={() => setDrag({ source: id, overIndex: ids.indexOf(id) })}\n onDragOver={(e) => handleOver(e, id)}\n onDrop={commitDrop}\n onDragEnd={() => setDrag(null)}\n onChangeOp={(op) => changeMetricOp(aggregations, clause, measurable, op)}\n onChangeField={(field) => aggregations.update(id, { field })}\n onAddGroup={(field) => aggregations.update(id, { groupBy: [...clause.groupBy, field] })}\n onRemoveGroup={(field) =>\n aggregations.update(id, { groupBy: clause.groupBy.filter((g) => g !== field) })\n }\n onRemove={() => aggregations.remove(id)}\n position={position}\n count={rendered.length}\n onMove={(toIndex) => aggregations.move(id, toIndex)}\n />\n );\n })}\n <button type=\"button\" className=\"qt-add\" onClick={() => aggregations.add()} disabled={disabled}>\n + add metric\n </button>\n {clauses.length > 0 && (\n <button type=\"button\" className=\"qt-link-btn\" onClick={aggregations.clear} disabled={disabled} title=\"Remove all metrics\">\n reset\n </button>\n )}\n </div>\n );\n}\n\n/** Change a metric's op, dropping the measure if it's no longer valid for the\n * new op (e.g. switching avg→count on a text field, or to an op the field type\n * can't aggregate). `count` keeps any chosen measure. */\nfunction changeMetricOp<Row>(\n aggregations: QueryTableApi<Row>[\"aggregations\"],\n clause: AggregationClause,\n measurable: FieldDef<Row>[],\n op: AggOp,\n): void {\n const field = clause.field;\n const stillValid =\n field != null && measurable.some((f) => f.name === field && aggOpsForField(f).includes(op));\n if (field != null && !stillValid) aggregations.update(clause.id, { op, field: undefined });\n else aggregations.update(clause.id, { op });\n}\n\nfunction MetricChip<Row>({\n clause,\n measurable,\n groupable,\n classNames,\n disabled,\n isDragSource,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n onChangeOp,\n onChangeField,\n onAddGroup,\n onRemoveGroup,\n onRemove,\n position,\n count,\n onMove,\n}: {\n clause: AggregationClause;\n measurable: FieldDef<Row>[];\n groupable: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n isDragSource: boolean;\n onDragStart: () => void;\n onDragOver: (e: React.DragEvent) => void;\n onDrop: () => void;\n onDragEnd: () => void;\n onChangeOp: (op: AggOp) => void;\n onChangeField: (field: string | undefined) => void;\n onAddGroup: (field: string) => void;\n onRemoveGroup: (field: string) => void;\n onRemove: () => void;\n position: number;\n count: number;\n onMove: (toIndex: number) => void;\n}) {\n const [addingGroup, setAddingGroup] = useState(false);\n const byName = useMemo(() => new Map(groupable.map((f) => [f.name, f])), [groupable]);\n\n // Measures valid for the current op (a measurable field whose effective ops\n // include this op). `count` may stand alone, so it gets an \"(all rows)\" choice.\n const needsField = aggOpNeedsField(clause.op);\n const measureOptions = measurable.filter((f) => aggOpsForField(f).includes(clause.op));\n\n return (\n <span\n className={cx(\"qt-chip\", \"qt-chip--agg\", isDragSource && \"qt-chip--dragging\", classNames?.chip)}\n draggable={!disabled}\n onDragStart={(e) => {\n onDragStart();\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", clause.id);\n }}\n onDragOver={onDragOver}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n onDragEnd={onDragEnd}\n title=\"drag to reorder metrics\"\n >\n <span aria-hidden className=\"qt-chip-grip\">\n ⋮⋮\n </span>\n <select\n className={cx(\"qt-chip-op\", classNames?.select)}\n value={clause.op}\n disabled={disabled}\n onChange={(e) => onChangeOp(e.target.value as AggOp)}\n >\n {AGG_OPS.map((op) => (\n <option key={op} value={op}>\n {AGG_OP_LABELS[op]}\n </option>\n ))}\n </select>\n <select\n className={cx(\"qt-chip-val\", classNames?.select)}\n value={clause.field ?? \"\"}\n disabled={disabled}\n onChange={(e) => onChangeField(e.target.value || undefined)}\n >\n {!needsField && <option value=\"\">(all rows)</option>}\n {needsField && clause.field == null && <option value=\"\">measure…</option>}\n {measureOptions.map((f) => (\n <option key={f.name} value={f.name}>\n {f.label}\n </option>\n ))}\n </select>\n <span className=\"qt-chip-agg-by\">\n {clause.groupBy.map((g) => (\n <span className=\"qt-chip-agg-group\" key={g}>\n <span className=\"qt-chip-agg-group-label\">{byName.get(g)?.label ?? g}</span>\n <button type=\"button\" className=\"qt-chip-x\" onClick={() => onRemoveGroup(g)} disabled={disabled}>\n ✕\n </button>\n </span>\n ))}\n {addingGroup ? (\n <FieldPicker\n fields={groupable}\n excluded={clause.groupBy}\n onPick={(f) => {\n onAddGroup(f.name);\n setAddingGroup(false);\n }}\n onClose={() => setAddingGroup(false)}\n />\n ) : (\n <button\n type=\"button\"\n className=\"qt-add qt-chip-agg-add\"\n onClick={() => setAddingGroup(true)}\n disabled={disabled}\n title=\"Group by a field\"\n >\n {clause.groupBy.length === 0 ? \"+ by\" : \"+\"}\n </button>\n )}\n </span>\n <MoveButtons\n label={clause.label ?? `${AGG_OP_LABELS[clause.op]} metric`}\n position={position}\n count={count}\n disabled={disabled}\n onMove={onMove}\n />\n <button type=\"button\" className=\"qt-chip-x\" onClick={onRemove} disabled={disabled} title=\"Remove metric\">\n ✕\n </button>\n </span>\n );\n}\n","// FieldPicker — grouped, searchable field chooser.\n// Searches label + name + aliases, groups by FieldDef.group, and surfaces\n// per-field stats (distinct count, min/max) when the Transport provides them.\n// Used to add columns and to add filters.\n\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport type { FieldDef, FieldStats } from \"@pythia-software/query-table-core\";\n\nexport interface FieldPickerProps<Row> {\n fields: FieldDef<Row>[];\n /** Already-shown field names, so the picker can mark/hide them. */\n excluded?: string[];\n /** Stats keyed by field name (optional). */\n stats?: Record<string, FieldStats>;\n /** When true, dim/disable fields with ≤1 distinct value (\"gate on distinct\"). */\n gateOnDistinct?: boolean;\n onPick: (field: FieldDef<Row>) => void;\n onClose?: () => void;\n}\n\nconst UNGROUPED = \"other\";\n\nexport function FieldPicker<Row>({\n fields,\n excluded,\n stats,\n gateOnDistinct,\n onPick,\n onClose,\n}: FieldPickerProps<Row>): ReactNode {\n const [search, setSearch] = useState(\"\");\n const needle = search.trim().toLowerCase();\n const excludedSet = useMemo(() => new Set(excluded ?? []), [excluded]);\n\n const matched = useMemo(\n () =>\n fields.filter((f) => {\n if (excludedSet.has(f.name)) return false;\n if (!needle) return true;\n return (\n f.label.toLowerCase().includes(needle) ||\n f.name.toLowerCase().includes(needle) ||\n (fieldAliases(f).some((a) => a.toLowerCase().includes(needle)))\n );\n }),\n [fields, excludedSet, needle],\n );\n\n const grouped = useMemo(() => groupByGroup(matched), [matched]);\n\n const firstEnabled = matched.find((f) => isEnabled(f, stats, gateOnDistinct));\n\n return (\n <div className=\"qt-picker\">\n <input\n autoFocus\n type=\"text\"\n className=\"qt-picker-input\"\n placeholder=\"search fields…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onClose?.();\n if (e.key === \"Enter\" && firstEnabled) {\n onPick(firstEnabled);\n setSearch(\"\");\n }\n }}\n // Defer so a mousedown on a list item lands before blur closes it.\n onBlur={() => setTimeout(() => onClose?.(), 150)}\n />\n <div className=\"qt-picker-list\">\n {matched.length === 0 ? (\n <div className=\"qt-picker-empty\">no matches</div>\n ) : (\n grouped.map(([group, fs]) => (\n <div key={group} className=\"qt-picker-group\">\n <div className=\"qt-picker-group-label\">{group}</div>\n {fs.map((f) => {\n const enabled = isEnabled(f, stats, gateOnDistinct);\n const s = stats?.[f.name];\n const aliasHit = aliasMatch(f, needle);\n return (\n <button\n key={f.name}\n type=\"button\"\n disabled={!enabled}\n className={enabled ? \"qt-picker-item\" : \"qt-picker-item qt-picker-item--disabled\"}\n title={enabled ? f.name : \"not useful as a filter (≤1 distinct value)\"}\n // Pointer down fires before blur for mouse, pen, and touch.\n onPointerDown={(e) => {\n if (!enabled) return;\n e.preventDefault();\n onPick(f);\n setSearch(\"\");\n }}\n >\n <span className=\"qt-picker-row\">\n <span className=\"qt-picker-label\">{f.label}</span>\n <span className=\"qt-picker-name\">{f.name}</span>\n </span>\n {aliasHit && <span className=\"qt-picker-alias\">matches: {aliasHit}</span>}\n {s && (\n <span className=\"qt-picker-stats\">\n {s.distinct != null && <>{s.distinct} distinct</>}\n {s.min != null && s.max != null && (\n <>\n {\" \"}\n · {fmtStat(s.min)}…{fmtStat(s.max)}\n </>\n )}\n </span>\n )}\n </button>\n );\n })}\n </div>\n ))\n )}\n </div>\n </div>\n );\n}\n\nfunction isEnabled(f: FieldDef, stats: FieldPickerProps<any>[\"stats\"], gate: boolean | undefined): boolean {\n if (!gate) return true;\n const s = stats?.[f.name];\n if (!s || s.distinct == null) return true; // no data → don't gate\n return s.distinct > 1;\n}\n\nfunction aliasMatch(f: FieldDef, needle: string): string | undefined {\n if (!needle) return undefined;\n if (f.label.toLowerCase().includes(needle) || f.name.toLowerCase().includes(needle)) return undefined;\n return fieldAliases(f).find((a) => a.toLowerCase().includes(needle));\n}\n\nfunction fieldAliases<Row>(f: FieldDef<Row>): string[] {\n const aliases = new Set<string>();\n if (f.alias) aliases.add(f.alias);\n if (f.aliases) {\n for (const alias of f.aliases) aliases.add(alias);\n }\n return [...aliases];\n}\n\nfunction groupByGroup<Row>(fs: FieldDef<Row>[]): Array<[string, FieldDef<Row>[]]> {\n const groups = new Map<string, FieldDef<Row>[]>();\n for (const f of fs) {\n const key = f.group ?? UNGROUPED;\n const arr = groups.get(key);\n if (arr) arr.push(f);\n else groups.set(key, [f]);\n }\n return [...groups.entries()];\n}\n\nfunction fmtStat(v: string | number): string {\n if (typeof v === \"number\") return v.toLocaleString();\n const s = String(v);\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(s)) return s.slice(0, 10);\n if (s.length > 18) return s.slice(0, 15) + \"…\";\n return s;\n}\n","// SavedQueriesModal — list / load / delete named saved queries. Thin view over\n// api.saved; loading one pushes its QueryState into the controller (and the URL).\n\nimport { useEffect, type ReactNode } from \"react\";\nimport type { SavedQueriesApi } from \"@pythia-software/query-table-react\";\n\nexport interface SavedQueriesModalProps {\n saved: SavedQueriesApi;\n onClose: () => void;\n onLoad?: (savedId: string) => void;\n}\n\nexport function SavedQueriesModal({ saved, onClose, onLoad }: SavedQueriesModalProps): ReactNode {\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n return (\n <div className=\"qt-modal-backdrop\" onClick={onClose}>\n <div\n className=\"qt-modal\"\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Saved queries\"\n >\n <h3 className=\"qt-modal-title\">Saved queries</h3>\n {saved.loading ? (\n <p className=\"qt-muted\">Loading…</p>\n ) : saved.items.length === 0 ? (\n <p className=\"qt-muted\">None saved yet. Save the current query from the toolbar.</p>\n ) : (\n <ul className=\"qt-saved-list\">\n {saved.items.map((s) => {\n const filters = s.query.where.length;\n const isDefault = saved.defaultId === s.id;\n return (\n <li key={s.id} className=\"qt-saved-item\">\n <button\n type=\"button\"\n className=\"qt-saved-pick\"\n onClick={() => {\n onLoad?.(s.id);\n saved.load(s.id);\n onClose();\n }}\n >\n <span className=\"qt-saved-name\">{s.name}</span>\n <span className=\"qt-saved-meta qt-muted\">\n {isDefault ? \"Default view · \" : \"\"}\n {new Date(s.savedAt).toLocaleString()} · {filters} filter{filters === 1 ? \"\" : \"s\"}\n </span>\n </button>\n {isDefault ? (\n <button\n type=\"button\"\n className=\"qt-btn qt-saved-default\"\n title=\"Clear default view\"\n onClick={() => void saved.clearDefault()}\n >\n default\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"qt-btn qt-saved-default\"\n title=\"Use as default view\"\n onClick={() => void saved.setDefault(s.id)}\n >\n make default\n </button>\n )}\n <button\n type=\"button\"\n className=\"qt-btn qt-saved-delete\"\n title=\"Delete saved query\"\n onClick={() => void saved.remove(s.id)}\n >\n delete\n </button>\n </li>\n );\n })}\n </ul>\n )}\n <div className=\"qt-modal-footer\">\n <button type=\"button\" className=\"qt-btn\" onClick={onClose}>\n close\n </button>\n </div>\n </div>\n </div>\n );\n}\n","// MetricsPanel — the dashboard strip above the table.\n//\n// Renders the optional aggregation metrics (see @pythia-software/query-table-core\n// AggregationClause). Each metric's shape follows its group-by arity:\n// 0 group-by → one big number\n// 1 group-by → a ranked bar list (label · value · share bar)\n// 2 group-by → an x/y pivot table (rows = axis 0, cols = axis 1)\n// 3+ group-by → a flat table, one column per group key + the value\n//\n// Values are formatted through the measure field's own renderer where it makes\n// sense (so AVG(total_ms) reads \"3.2s\", not \"3200\"), falling back to a locale\n// number. Counts are always plain integers.\n\nimport { useMemo, type ReactNode } from \"react\";\nimport { EMPTY_QUERY } from \"@pythia-software/query-table-core\";\nimport type { AggOp, AggregationBucket, AggregationClause, FieldDef } from \"@pythia-software/query-table-core\";\nimport type { AggregationsApi } from \"@pythia-software/query-table-react\";\nimport { resolveRenderer, type RenderRegistry } from \"./renderers\";\n\nexport interface MetricsPanelProps<Row> {\n /** The aggregation API from useQueryTable (clauses + results + status). */\n aggregations: AggregationsApi;\n /** All schema fields, to resolve labels + the measure field's renderer. */\n fields: FieldDef<Row>[];\n /** Cell renderers (same registry as the table) for formatting measure values. */\n renderers?: RenderRegistry<Row>;\n /** Hidden entirely when there are no metrics unless this is set. */\n emptyMessage?: string;\n classNames?: { root?: string; metric?: string };\n}\n\nconst cx = (...parts: Array<string | undefined | false>): string =>\n parts.filter((p): p is string => Boolean(p)).join(\" \");\n\nconst OP_LABELS: Record<AggOp, string> = {\n count: \"Count\",\n count_distinct: \"Distinct\",\n sum: \"Sum\",\n avg: \"Avg\",\n min: \"Min\",\n max: \"Max\",\n};\n\nconst NULL_KEY = \"∅\";\n\nexport function MetricsPanel<Row>({\n aggregations,\n fields,\n renderers,\n emptyMessage,\n classNames,\n}: MetricsPanelProps<Row>): ReactNode {\n const byName = useMemo(() => new Map(fields.map((f) => [f.name, f])), [fields]);\n const { clauses, results, loading, error } = aggregations;\n\n if (clauses.length === 0) {\n return emptyMessage ? <div className={cx(\"qt-metrics\", classNames?.root)}>{emptyMessage}</div> : null;\n }\n\n const resultById = new Map((results?.metrics ?? []).map((m) => [m.id, m.buckets]));\n\n return (\n <div className={cx(\"qt-metrics\", classNames?.root)}>\n {error ? <div className=\"qt-metrics-error\">Metrics failed: {error.message}</div> : null}\n {clauses.map((clause) => (\n <MetricCard\n key={clause.id}\n clause={clause}\n buckets={resultById.get(clause.id) ?? []}\n loading={loading && !resultById.has(clause.id)}\n byName={byName}\n renderers={renderers}\n className={classNames?.metric}\n />\n ))}\n </div>\n );\n}\n\nfunction MetricCard<Row>({\n clause,\n buckets,\n loading,\n byName,\n renderers,\n className,\n}: {\n clause: AggregationClause;\n buckets: AggregationBucket[];\n loading: boolean;\n byName: Map<string, FieldDef<Row>>;\n renderers: RenderRegistry<Row> | undefined;\n className: string | undefined;\n}): ReactNode {\n const measure = clause.field ? byName.get(clause.field) : undefined;\n const groupLabels = clause.groupBy.map((g) => byName.get(g)?.label ?? g);\n // One decimal-place count for the whole card (≈5 significant figures), so every\n // value lines up and we never render a 12-digit float tail.\n const decimals = useMemo(() => cardDecimals(buckets), [buckets]);\n const fmt = (v: number | string | null): ReactNode => formatMetricValue(v, clause.op, measure, renderers, decimals);\n\n return (\n <div className={cx(\"qt-metric\", `qt-metric--gb${Math.min(clause.groupBy.length, 3)}`, className)}>\n <div className=\"qt-metric-head\">\n <span className=\"qt-metric-title\">{metricTitle(clause, measure)}</span>\n {groupLabels.length > 0 && <span className=\"qt-metric-by\">by {groupLabels.join(\" × \")}</span>}\n </div>\n {loading && buckets.length === 0 ? (\n <div className=\"qt-metric-loading\">…</div>\n ) : buckets.length === 0 ? (\n <div className=\"qt-metric-empty\">no data</div>\n ) : clause.groupBy.length === 0 ? (\n <BigNumber bucket={buckets[0]!} fmt={fmt} />\n ) : clause.groupBy.length === 1 ? (\n <BarList buckets={buckets} fmt={fmt} />\n ) : clause.groupBy.length === 2 ? (\n <Pivot buckets={buckets} fmt={fmt} rowLabel={groupLabels[0]!} colLabel={groupLabels[1]!} />\n ) : (\n <FlatTable buckets={buckets} fmt={fmt} groupLabels={groupLabels} valueLabel={metricTitle(clause, measure)} />\n )}\n </div>\n );\n}\n\n// ---- 0 group-by: one big number -------------------------------------------\n\nfunction BigNumber({ bucket, fmt }: { bucket: AggregationBucket; fmt: (v: number | string | null) => ReactNode }) {\n return (\n <div className=\"qt-metric-big\">\n <span className=\"qt-metric-big-value\">{fmt(bucket.value)}</span>\n <span className=\"qt-metric-big-sub\">{bucket.count.toLocaleString()} rows</span>\n </div>\n );\n}\n\n// ---- 1 group-by: ranked bars ----------------------------------------------\n\nfunction BarList({ buckets, fmt }: { buckets: AggregationBucket[]; fmt: (v: number | string | null) => ReactNode }) {\n const max = Math.max(...buckets.map((b) => barMagnitude(b)), 0);\n return (\n <div className=\"qt-metric-bars\">\n {buckets.map((b, i) => {\n const pct = max > 0 ? (barMagnitude(b) / max) * 100 : 0;\n return (\n <div className=\"qt-metric-bar-row\" key={`${keyText(b.keys[0])}-${i}`}>\n <span className=\"qt-metric-bar-label\" title={keyText(b.keys[0])}>\n {keyNode(b.keys[0])}\n </span>\n <span className=\"qt-metric-bar-track\">\n <span className=\"qt-metric-bar-fill\" style={{ width: `${pct}%` }} />\n </span>\n <span className=\"qt-metric-bar-value\">{fmt(b.value)}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---- 2 group-by: x/y pivot ------------------------------------------------\n\nfunction Pivot({\n buckets,\n fmt,\n rowLabel,\n colLabel,\n}: {\n buckets: AggregationBucket[];\n fmt: (v: number | string | null) => ReactNode;\n rowLabel: string;\n colLabel: string;\n}) {\n const rowKeys = distinctKeys(buckets, 0);\n const colKeys = distinctKeys(buckets, 1);\n const cell = new Map<string, number | string | null>();\n for (const b of buckets) cell.set(`${keyText(b.keys[0])}\\u0000${keyText(b.keys[1])}`, b.value);\n\n return (\n <div className=\"qt-metric-pivot-wrap\">\n <table className=\"qt-metric-pivot\">\n <thead>\n <tr>\n <th className=\"qt-metric-pivot-corner\">\n <span className=\"qt-metric-pivot-axes\">\n {rowLabel} <span className=\"qt-muted\">\\</span> {colLabel}\n </span>\n </th>\n {colKeys.map((c) => (\n <th key={keyText(c)} className=\"qt-metric-pivot-col\">\n {keyNode(c)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rowKeys.map((r) => (\n <tr key={keyText(r)}>\n <th className=\"qt-metric-pivot-row\">{keyNode(r)}</th>\n {colKeys.map((c) => {\n const v = cell.get(`${keyText(r)}\\u0000${keyText(c)}`);\n return (\n <td key={keyText(c)} className=\"qt-metric-pivot-cell\">\n {v === undefined ? <span className=\"qt-muted\">·</span> : fmt(v)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ---- 3+ group-by: flat table ----------------------------------------------\n\nfunction FlatTable({\n buckets,\n fmt,\n groupLabels,\n valueLabel,\n}: {\n buckets: AggregationBucket[];\n fmt: (v: number | string | null) => ReactNode;\n groupLabels: string[];\n valueLabel: string;\n}) {\n return (\n <div className=\"qt-metric-pivot-wrap\">\n <table className=\"qt-metric-flat\">\n <thead>\n <tr>\n {groupLabels.map((g) => (\n <th key={g}>{g}</th>\n ))}\n <th className=\"qt-metric-flat-value\">{valueLabel}</th>\n </tr>\n </thead>\n <tbody>\n {buckets.map((b, i) => (\n <tr key={i}>\n {/* Index by column, not by b.keys: a bucket whose `keys` is shorter\n than the header (a malformed/partial result) must still leave the\n value in the value column rather than sliding it left. */}\n {groupLabels.map((_, j) => (\n <td key={j}>{keyNode(b.keys[j])}</td>\n ))}\n <td className=\"qt-metric-flat-value\">{fmt(b.value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ---- helpers --------------------------------------------------------------\n\nfunction metricTitle<Row>(clause: AggregationClause, measure: FieldDef<Row> | undefined): string {\n if (clause.label) return clause.label;\n if (clause.op === \"count\" && !measure) return \"Count\";\n return `${OP_LABELS[clause.op]} ${measure?.label ?? clause.field ?? \"\"}`.trim();\n}\n\n// Default renderers that map a number to a unit-formatted string (and so already\n// bound their own decimals). Any OTHER renderer (text/link/pill/number) is skipped\n// for numeric aggregates — it would stringify the raw float — in favor of the\n// card's shared decimal formatting.\nconst UNIT_RENDER_KEYS: ReadonlySet<string> = new Set([\"duration_ms\", \"byte_size\"]);\n\nfunction formatMetricValue<Row>(\n value: number | string | null,\n op: AggOp,\n measure: FieldDef<Row> | undefined,\n renderers: RenderRegistry<Row> | undefined,\n decimals: number,\n): ReactNode {\n if (value == null) return <span className=\"qt-muted\">—</span>;\n // Counts are dimensionless integers — never run them through a column renderer.\n if (op === \"count\" || op === \"count_distinct\") {\n return typeof value === \"number\" ? formatNumber(value, 0) : String(value);\n }\n if (typeof value === \"number\") {\n const key = typeof measure?.render === \"string\" ? measure.render : undefined;\n if (key && UNIT_RENDER_KEYS.has(key) && measure && renderers) {\n const node = tryRender(measure, renderers, value);\n if (node != null) return node;\n }\n return formatNumber(value, decimals);\n }\n // min/max over text or datetime → the column's renderer, else the raw string.\n if (measure && renderers) {\n const node = tryRender(measure, renderers, value);\n if (node != null) return node;\n }\n return String(value);\n}\n\nfunction tryRender<Row>(\n measure: FieldDef<Row>,\n renderers: RenderRegistry<Row>,\n value: number | string,\n): ReactNode | null {\n try {\n const node = resolveRenderer(measure, renderers)({\n value: value as never,\n row: {} as Row,\n field: measure,\n query: EMPTY_QUERY,\n });\n return node != null && node !== \"\" ? node : null;\n } catch {\n return null;\n }\n}\n\nfunction formatNumber(value: number, decimals: number): string {\n if (!Number.isFinite(value)) return String(value);\n return value.toLocaleString(undefined, { minimumFractionDigits: decimals, maximumFractionDigits: decimals });\n}\n\n// One decimal count for every numeric value in a card: 0 when all are integers\n// (counts, integer measures), else enough places to give the largest-magnitude\n// value ≈5 significant figures (so smaller values share that precision and no\n// value shows a runaway float tail). Capped at 6.\nfunction cardDecimals(buckets: AggregationBucket[]): number {\n const nums = buckets\n .map((b) => b.value)\n .filter((v): v is number => typeof v === \"number\" && Number.isFinite(v));\n if (nums.length === 0) return 0;\n if (nums.every((v) => Number.isInteger(v))) return 0;\n const maxAbs = Math.max(...nums.map((v) => Math.abs(v)));\n const intDigits = maxAbs >= 1 ? Math.floor(Math.log10(maxAbs)) + 1 : 0;\n return Math.min(6, Math.max(0, 5 - intDigits));\n}\n\nfunction barMagnitude(b: AggregationBucket): number {\n return typeof b.value === \"number\" ? Math.abs(b.value) : b.count;\n}\n\nfunction distinctKeys(buckets: AggregationBucket[], axis: number): (string | null)[] {\n const seen = new Set<string>();\n const out: (string | null)[] = [];\n for (const b of buckets) {\n const k = b.keys[axis] ?? null;\n const t = keyText(k);\n if (!seen.has(t)) {\n seen.add(t);\n out.push(k);\n }\n }\n return out;\n}\n\nfunction keyText(k: string | null | undefined): string {\n return k == null ? NULL_KEY : String(k);\n}\n\nfunction keyNode(k: string | null | undefined): ReactNode {\n return k == null ? <span className=\"qt-muted\">{NULL_KEY}</span> : String(k);\n}\n","// SelectionToolbar — the bulk-action FRAME, not the actions.\n//\n// Deliberately generic: it shows the selected count, a clear-all, and an\n// `actions` slot. The actual verbs are domain logic the consumer renders into the\n// slot. The reusable part is the selection plumbing + affordance; the verbs are\n// not. This keeps domain coupling out while still shipping the pattern.\n\nimport type { ReactNode } from \"react\";\nimport type { RowId } from \"@pythia-software/query-table-core\";\nimport type { SelectionApi } from \"@pythia-software/query-table-react\";\n\nexport interface SelectionToolbarProps {\n selection: SelectionApi;\n /** Consumer-rendered action buttons. Receives the selected ids and the public\n * selection API. Existing callbacks that accept only ids remain supported. */\n actions: (selectedIds: RowId[], selection: SelectionApi) => ReactNode;\n /** Hidden when nothing is selected unless `alwaysShow`. */\n alwaysShow?: boolean;\n className?: string;\n}\n\nconst cx = (...parts: Array<string | undefined>): string => parts.filter(Boolean).join(\" \");\n\nexport function SelectionToolbar({ selection, actions, alwaysShow, className }: SelectionToolbarProps): ReactNode {\n if (selection.count === 0 && !alwaysShow) return null;\n\n const selectedIds = [...selection.selected];\n\n return (\n <div className={cx(\"qt-selection-toolbar\", className)} role=\"toolbar\">\n <span className=\"qt-selection-count\">\n {selection.count} selected\n </span>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={selection.clear}\n disabled={selection.count === 0}\n >\n clear\n </button>\n <span className=\"qt-selection-actions\">{actions(selectedIds, selection)}</span>\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","cx","MENU_WIDTH","useState","useEffect","valueToString","MenuItem","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useMemo","useEffect","label","f","Fragment","useEffect","useId","useMemo","useRef","useState","NULLARY_OPS","opPairsForField","isFilterable","isSelectable","isSortable","opsForField","useMemo","useState","Fragment","jsx","jsxs","useEffect","jsx","jsxs","jsx","jsxs","cx","formatDuration","useState","useEffect","opsForField","NULLARY_OPS","useState","useMemo","useId","formatDuration","useRef","useEffect","jsxs","cx","jsx","isSelectable","opsForField","isFilterable","opPairsForField","Fragment","NULLARY_OPS","isSortable","useMemo","jsx","jsxs","cx","useMemo","valueLabel","jsx","jsxs","cx"]}
1
+ {"version":3,"sources":["../src/Icon.tsx","../src/renderers.ts","../src/DataTable.tsx","../src/FilterValuePresentation.tsx","../src/AdaptiveOverlay.tsx","../src/CellMenu.tsx","../src/formatRowCount.ts","../src/SelectColumnEditor.tsx","../src/ReorderList.tsx","../src/previewOrdering.ts","../src/SortExtractionEditor.tsx","../src/sortExtractionPreview.ts","../src/SetFilterEditor.tsx","../src/QueryBuilder.tsx","../src/FieldPicker.tsx","../src/SavedQueriesModal.tsx","../src/MetricsPanel.tsx","../src/SelectionToolbar.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nconst artwork = {\n add: <path d=\"M12 5v14M5 12h14\" />,\n close: <path d=\"m6 6 12 12M6 18 18 6\" />,\n check: <path d=\"m5 12 4.5 4.5L19 7\" />,\n chevronDown: <path d=\"m5 8.5 7 7 7-7\" />,\n chevronRight: <path d=\"m8.5 5 7 7-7 7\" />,\n arrowUp: <path d=\"M12 19V5m-6 6 6-6 6 6\" />,\n arrowDown: <path d=\"M12 5v14m-6-6 6 6 6-6\" />,\n arrowLeft: <path d=\"M19 12H5m6-6-6 6 6 6\" />,\n arrowRight: <path d=\"M5 12h14m-6-6 6 6-6 6\" />,\n grip: <g fill=\"currentColor\" stroke=\"none\">{[5, 12, 19].map((y) => <g key={y}><circle cx=\"8\" cy={y} r=\"1.5\" /><circle cx=\"16\" cy={y} r=\"1.5\" /></g>)}</g>,\n pencil: <><path d=\"m14.5 5.5 4 4M4 20l1-5L16.5 3.5a2.8 2.8 0 0 1 4 4L9 19Z\" /><path d=\"m5 15 4 4\" /></>,\n star: <path d=\"m12 3 2.8 5.7 6.3.9-4.5 4.4 1.1 6.2-5.7-3-5.7 3 1.1-6.2-4.5-4.4 6.3-.9Z\" />,\n undo: <><path d=\"M9 4 4 9l5 5\" /><path d=\"M4 9h10a5 5 0 0 1 0 10\" /></>,\n redo: <><path d=\"m15 4 5 5-5 5\" /><path d=\"M20 9H10a5 5 0 0 0 0 10\" /></>,\n copy: <><rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\" /><path d=\"M5 16H4a1 1 0 0 1-1-1V5a2 2 0 0 1 2-2h10a1 1 0 0 1 1 1v1\" /></>,\n share: <><path d=\"M12 15V3m-4 4 4-4 4 4\" /><path d=\"M7 10H5a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7a2 2 0 0 0-2-2h-2\" /></>,\n refresh: <><path d=\"M20 4v5h-5M4 20v-5h5\" /><path d=\"M20 9a8 8 0 0 0-13.5-3M4 15a8 8 0 0 0 13.5 3\" /></>,\n clock: <><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M12 7v5l3 2\" /></>,\n reset: <><path d=\"M4 4v5h5\" /><path d=\"M4 9a8 8 0 1 1 0 6\" /></>,\n bookmark: <path d=\"M6 4a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v17l-6-4-6 4Z\" />,\n} satisfies Record<string, ReactNode>;\n\nexport type IconName = keyof typeof artwork;\n\nexport interface IconProps {\n name: IconName;\n size?: number;\n className?: string;\n filled?: boolean;\n}\n\nexport function Icon({ name, size = 16, className, filled = false }: IconProps) {\n return (\n <svg className={`qt-icon${className ? ` ${className}` : \"\"}`} width={size} height={size} viewBox=\"0 0 24 24\" fill={filled && name === \"star\" ? \"currentColor\" : \"none\"} stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" data-icon={name}>\n {artwork[name]}\n </svg>\n );\n}\n","import { Icon } from \"./Icon\";\n// renderers.ts — the cell render registry.\n//\n// This is how the table stays \"gold standard but customizable\" (the core ask).\n// The package ships ONLY truly-generic renderers. Domain-specific cells are\n// registered by the consuming app — they must NOT live in a generic package.\n// A FieldDef.render is either a key resolved\n// against `{ ...defaultRenderers, ...consumerRenderers }` or an inline function.\n\nimport type { ReactNode } from \"react\";\nimport { createElement } from \"react\";\nimport type { FieldDef, QueryState } from \"@pythia-software/query-table-core\";\n\nexport interface CellContext<Row = any, V = unknown> {\n value: V;\n row: Row;\n field: FieldDef<Row, V>;\n /** Current query — lets renderers reflect active state (e.g. highlight matches). */\n query: QueryState;\n}\n\nexport type CellRenderer<Row = any, V = unknown> = (ctx: CellContext<Row, V>) => ReactNode;\n\nexport type RenderRegistry<Row = any> = Record<string, CellRenderer<Row>>;\n\n/** The em-dash shown for empty / null values, so every renderer agrees. */\nconst EMPTY = \"—\";\n\nconst muted = (text: string): ReactNode => createElement(\"span\", { className: \"qt-muted\" }, text);\n\nfunction isEmpty(v: unknown): boolean {\n return v == null || v === \"\" || (Array.isArray(v) && v.length === 0);\n}\n\nconst SAFE_LINK_PROTOCOLS: ReadonlySet<string> = new Set([\"http:\", \"https:\", \"mailto:\", \"tel:\"]);\n\n/** Resolve a user-controlled link against a harmless HTTPS base and allow only\n * navigation protocols. This catches obfuscated forms such as `java\\nscript:`\n * that simple prefix checks miss while preserving relative and fragment URLs. */\nexport function safeLinkHref(value: unknown): string | null {\n if (isEmpty(value)) return null;\n const href = String(value).trim();\n if (!href) return null;\n try {\n const parsed = new URL(href, \"https://query-table.invalid/\");\n return SAFE_LINK_PROTOCOLS.has(parsed.protocol) ? href : null;\n } catch {\n return null;\n }\n}\n\n/** Generic, domain-free renderers shipped with the package. Keys are stable and\n * referenced from FieldDef.render. Consumers spread these and add their own. */\nexport const defaultRenderers: RenderRegistry = {\n // String(value), em-dash for null/empty\n text({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n return String(value);\n },\n\n // single-line ellipsis (CSS does the truncation; title carries the full text)\n truncate({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n const s = String(value);\n return createElement(\"span\", { className: \"qt-truncate\", title: s }, s);\n },\n\n // locale-grouped number\n number({ value }) {\n if (value == null || value === \"\") return muted(EMPTY);\n const n = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(n)) return muted(EMPTY);\n return n.toLocaleString();\n },\n\n bool_check({ value }) {\n if (value == null) return muted(EMPTY);\n return value ? createElement(\"span\", { role: \"img\", \"aria-label\": \"True\" }, createElement(Icon, { name: \"check\" })) : muted(EMPTY);\n },\n\n // ISO clamped to seconds\n datetime({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n const s = String(value);\n // pgtype zero-time and other epoch placeholders read as empty.\n if (s.startsWith(\"0001-\")) return muted(EMPTY);\n return s.slice(0, 19).replace(\"T\", \" \");\n },\n\n // relative (\"5m ago\", \"yesterday\", \"Mar 4\")\n datetime_rel({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n const s = String(value);\n if (s.startsWith(\"0001-\")) return muted(EMPTY);\n return createElement(\"span\", { title: s.slice(0, 19).replace(\"T\", \" \") }, formatRelative(s));\n },\n\n // human duration from a millisecond number\n duration_ms({ value }) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return muted(EMPTY);\n return formatDuration(value);\n },\n\n // humanized bytes (B/KB/MB/GB)\n byte_size({ value }) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return muted(EMPTY);\n return formatBytes(value);\n },\n\n // string[] as pills\n tags_pills({ value }) {\n if (!Array.isArray(value) || value.length === 0) return muted(EMPTY);\n return createElement(\n \"span\",\n { className: \"qt-pills\" },\n value.map((t, i) => createElement(\"span\", { key: `${String(t)}-${i}`, className: \"qt-pill\" }, String(t))),\n );\n },\n\n // value as an <a href={value}> when its URL scheme is safe\n link({ value }) {\n if (isEmpty(value)) return muted(EMPTY);\n const label = String(value);\n const href = safeLinkHref(value);\n if (!href) return createElement(\"span\", { className: \"qt-muted\", title: \"Unsafe link blocked\" }, label);\n return createElement(\n \"a\",\n { className: \"qt-link\", href, target: \"_blank\", rel: \"noopener noreferrer\", title: href },\n label,\n );\n },\n};\n\n/** Resolve a FieldDef's renderer: inline fn wins, else registry lookup, else\n * the `text` fallback. */\nexport function resolveRenderer<Row>(\n field: FieldDef<Row>,\n registry: RenderRegistry<Row>,\n): CellRenderer<Row> {\n const r = field.render;\n if (typeof r === \"function\") {\n // core's CellRenderer returns `unknown`; ours narrows that to ReactNode.\n return r as CellRenderer<Row>;\n }\n if (typeof r === \"string\") {\n const found = registry[r];\n if (found) return found;\n }\n // text fallback always exists (consumers spread defaultRenderers in).\n return (registry[\"text\"] ?? defaultRenderers[\"text\"]) as CellRenderer<Row>;\n}\n\n// ---- formatting helpers ---------------------------------------------------\n\nfunction formatDuration(ms: number): string {\n if (ms < 0) return String(ms);\n if (ms < 1) return `${ms.toFixed(2)}ms`;\n if (ms < 1000) return `${ms.toFixed(0)}ms`;\n const totalSec = ms / 1000;\n if (totalSec < 60) return `${totalSec.toFixed(1)}s`;\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = Math.round(totalSec % 60);\n if (h > 0) return `${h}h ${m}m`;\n return `${m}m ${s}s`;\n}\n\nfunction formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n if (n < 1024 * 1024 * 1024) return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n return `${(n / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n}\n\nfunction formatRelative(iso: string): string {\n const ts = Date.parse(iso);\n if (!Number.isFinite(ts)) return iso.slice(0, 19);\n const now = Date.now();\n const diffSec = Math.round((now - ts) / 1000);\n if (Math.abs(diffSec) < 30) return \"just now\";\n const past = diffSec >= 0;\n const abs = Math.abs(diffSec);\n if (abs < 60) return past ? `${abs}s ago` : `in ${abs}s`;\n if (abs < 3600) return past ? `${Math.round(abs / 60)}m ago` : `in ${Math.round(abs / 60)}m`;\n if (abs < 86400) return past ? `${Math.round(abs / 3600)}h ago` : `in ${Math.round(abs / 3600)}h`;\n const days = Math.round(abs / 86400);\n if (past && days === 1) return \"yesterday\";\n if (days < 7) return past ? `${days}d ago` : `in ${days}d`;\n const d = new Date(ts);\n const sameYear = d.getFullYear() === new Date().getFullYear();\n const opts: Intl.DateTimeFormatOptions = sameYear\n ? { month: \"short\", day: \"numeric\" }\n : { month: \"short\", day: \"numeric\", year: \"2-digit\" };\n return d.toLocaleDateString(undefined, opts);\n}\n","import { Icon } from \"./Icon\";\n// DataTable — the table renderer.\n//\n// Presentation only: it draws headers (sort affordances), the checkbox column,\n// cells (via the render registry), the right-click CellMenu, column resize\n// handles, and the loading bar. All state\n// lives in the @pythia-software/query-table-react hook; DataTable receives the resolved view\n// and emits intents through onQueryChange. Its props mirror a conventional\n// schema-driven table so adoption is mechanical.\n\nimport { isComputedCellError } from \"@pythia-software/query-table-core\";\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactNode, type SetStateAction } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type { OrderByClause, QueryState, FieldDef, RowId, SelectColumn, WhereClause } from \"@pythia-software/query-table-core\";\nimport { isSortable, readFieldValue } from \"@pythia-software/query-table-core\";\nimport { useColumnDrag, type SelectionApi, type ColumnDragApi } from \"@pythia-software/query-table-react\";\nimport { resolveRenderer, type RenderRegistry } from \"./renderers\";\nimport type { TableClassNames } from \"./classNames\";\nimport { CellMenu } from \"./CellMenu\";\nimport { formatRowCount, rowCountTitle } from \"./formatRowCount\";\nimport { AdaptiveOverlay, useMobileLayout } from \"./AdaptiveOverlay\";\n\nexport interface DataTableProps<Row> {\n /** Ordered visible fields (widths already resolved), from `api.visibleFields`. */\n fields: FieldDef<Row>[];\n rows: Row[];\n query: QueryState;\n onQueryChange: (q: SetStateAction<QueryState>) => void;\n\n /** Resolves FieldDef.render keys. Pass `{ ...defaultRenderers, ...yours }`. */\n renderers: RenderRegistry<Row>;\n /** Row → stable id (defaults to reading the schema's idField). */\n rowId: (row: Row) => RowId | null;\n\n /** Optional checkbox column + selection behavior (from `api.selection`). */\n selection?: SelectionApi;\n\n /** Shared column-reorder drag state (`api.columnDrag`). Pass it so dragging a\n * table header also live-previews/dims the matching QueryBuilder select chip\n * (and vice versa). Omit for a self-contained, table-only drag. */\n columnDrag?: ColumnDragApi;\n\n /** Always-visible trailing column (row actions, links). */\n trailing?: (row: Row) => ReactNode;\n trailingLabel?: string;\n\n /** Total matching rows before pagination, when known. */\n total?: number | null;\n\n loading?: boolean;\n emptyMessage?: string;\n /** Maximum height of the scroll viewport. Defaults to 600px. */\n maxHeight?: number | string;\n /** Estimated row height in pixels; measured rows replace the estimate. Defaults to 37. */\n estimateRowHeight?: number;\n /** Extra rows rendered above and below the visible range. Defaults to 8. */\n overscan?: number;\n /** Tailwind / bespoke styling slots (Mode B). */\n classNames?: TableClassNames;\n}\n\nconst cx = (...parts: Array<string | undefined | false>): string =>\n parts.filter((p): p is string => Boolean(p)).join(\" \");\n\nconst MIN_WIDTH = 1;\nconst MIN_SELECTION_WIDTH = 1;\nconst MAX_WIDTH = 800;\nconst DEFAULT_WIDTH = 120;\nconst DEFAULT_SELECTION_WIDTH = 36;\nconst AUTOFIT_EXTRA_PX = 16;\nconst MENU_WIDTH = 240;\nconst MENU_ROW_HEIGHT = 32;\nconst COPY_FEEDBACK_MS = 900;\nconst DEFAULT_MAX_HEIGHT = 600;\nconst DEFAULT_ROW_HEIGHT = 37;\nconst DEFAULT_OVERSCAN = 8;\nconst SELECTION_COLUMN = \"__qt_selection__\";\ntype HeaderSortPlacement = \"set\" | \"append\" | \"prepend\";\n\ninterface MenuState<Row> {\n kind: \"cell\" | \"header\";\n field: FieldDef<Row>;\n value?: unknown;\n x: number;\n y: number;\n}\n\nexport function DataTable<Row>(props: DataTableProps<Row>): ReactNode {\n const {\n fields,\n rows,\n query,\n onQueryChange,\n renderers,\n rowId,\n selection,\n trailing,\n trailingLabel,\n total = null,\n loading,\n emptyMessage,\n maxHeight = DEFAULT_MAX_HEIGHT,\n estimateRowHeight = DEFAULT_ROW_HEIGHT,\n overscan = DEFAULT_OVERSCAN,\n classNames,\n } = props;\n\n const [menu, setMenu] = useState<MenuState<Row> | null>(null);\n const [selectionColumnWidth, setSelectionColumnWidth] = useState(DEFAULT_SELECTION_WIDTH);\n const [tableColumnOrder, setTableColumnOrder] = useState<string[]>([]);\n const [copiedCellKey, setCopiedCellKey] = useState<string | null>(null);\n const [headerHeight, setHeaderHeight] = useState(0);\n const [showHorizontalCue, setShowHorizontalCue] = useState(false);\n const tableWrapRef = useRef<HTMLDivElement>(null);\n const tableHeadRef = useRef<HTMLTableSectionElement>(null);\n const tableRef = useRef<HTMLTableElement>(null);\n const resizeGuideRef = useRef<HTMLDivElement>(null);\n // A real <col> width change invalidates layout for every row. During a drag,\n // move only the compositor-friendly guide and apply the column width once on\n // release; refs also keep pointermove out of React's render pipeline.\n const resizeCommitRef = useRef<{ name: string; width: number } | null>(null);\n const resizePreviewRef = useRef<{\n name: string;\n width: number;\n previousWidth: number;\n startTableWidth: number;\n guideX: number;\n } | null>(null);\n const resizeFrameRef = useRef<number | null>(null);\n const cancelResizeRef = useRef<(() => void) | null>(null);\n const resizingFieldRef = useRef<string | null>(null);\n const copiedCellTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Shared drag state when the host passes `api.columnDrag`; otherwise a local\n // instance keeps the table self-contained. (The hook is always called to obey\n // the rules of hooks; the local one is unused when a shared one is provided.)\n const localColumnDrag = useColumnDrag();\n const columnDrag = props.columnDrag ?? localColumnDrag;\n const rowIds = useMemo(() => rows.map(rowId), [rowId, rows]);\n const virtualRowKeys = useMemo(\n () => rowIds.map((id, index) => (id == null ? `index:${index}` : `${typeof id}:${String(id)}`)),\n [rowIds],\n );\n const getVirtualRowKey = useCallback((index: number) => virtualRowKeys[index] ?? `index:${index}`, [virtualRowKeys]);\n const normalizedEstimate = Number.isFinite(estimateRowHeight)\n ? Math.max(1, estimateRowHeight)\n : DEFAULT_ROW_HEIGHT;\n const normalizedOverscan = Number.isFinite(overscan)\n ? Math.max(0, Math.floor(overscan))\n : DEFAULT_OVERSCAN;\n const estimateVirtualRow = useCallback(() => normalizedEstimate, [normalizedEstimate]);\n const initialViewportHeight = typeof maxHeight === \"number\" && maxHeight > 0 ? maxHeight : DEFAULT_MAX_HEIGHT;\n const initialRect = useMemo(() => ({ width: 0, height: initialViewportHeight }), [initialViewportHeight]);\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n getScrollElement: () => tableWrapRef.current,\n estimateSize: estimateVirtualRow,\n getItemKey: getVirtualRowKey,\n overscan: normalizedOverscan,\n // The header participates in normal table layout even while it is sticky.\n // Offset row measurements so the virtual range matches the body's origin.\n scrollMargin: headerHeight,\n initialRect,\n // Row refs measure during React's commit phase; schedule size updates normally.\n useFlushSync: false,\n });\n\n useEffect(() => {\n return () => {\n if (copiedCellTimerRef.current) {\n clearTimeout(copiedCellTimerRef.current);\n copiedCellTimerRef.current = null;\n }\n cancelResizeRef.current?.();\n };\n }, []);\n\n useEffect(() => {\n const header = tableHeadRef.current;\n if (!header) return;\n\n const measureHeader = () => {\n const next = header.getBoundingClientRect().height;\n setHeaderHeight((current) => (current === next ? current : next));\n };\n measureHeader();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", measureHeader);\n return () => window.removeEventListener(\"resize\", measureHeader);\n }\n\n const observer = new ResizeObserver(measureHeader);\n observer.observe(header);\n return () => observer.disconnect();\n }, []);\n\n function cellKey(rowIdValue: RowId | null, rowIndex: number, fieldName: string): string {\n return rowIdValue == null ? `row:${rowIndex}:${fieldName}` : `id:${rowIdValue}:${fieldName}`;\n }\n\n function isInteractiveTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n return tag === \"A\" || tag === \"BUTTON\" || tag === \"INPUT\" || tag === \"SELECT\";\n }\n\n function showCopyFeedback(cellId: string) {\n if (copiedCellTimerRef.current) {\n clearTimeout(copiedCellTimerRef.current);\n copiedCellTimerRef.current = null;\n }\n setCopiedCellKey(cellId);\n copiedCellTimerRef.current = setTimeout(() => {\n setCopiedCellKey((current) => (current === cellId ? null : current));\n copiedCellTimerRef.current = null;\n }, COPY_FEEDBACK_MS);\n }\n\n async function copyCellToClipboard(e: React.MouseEvent, f: FieldDef<Row>, rowIdValue: RowId | null, rowIndex: number, value: unknown) {\n if (isInteractiveTarget(e.target)) return;\n e.preventDefault();\n e.stopPropagation();\n setMenu(null);\n try {\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(valueToString(value));\n }\n } catch {\n /* clipboard denial is non-fatal */\n }\n showCopyFeedback(cellKey(rowIdValue, rowIndex, f.name));\n }\n\n const pageIds = rowIds.filter((id): id is RowId => id != null);\n const headerState = selection ? selection.pageState(pageIds) : \"none\";\n const showSel = selection != null;\n\n // ---- sort state (used only for indicators + header menu actions) ----\n function sortKeyFor(f: FieldDef<Row>): string {\n return f.sort?.field ?? f.name;\n }\n function applyHeaderSort(f: FieldDef<Row>, dir: \"asc\" | \"desc\", placement: HeaderSortPlacement) {\n if (!isSortable(f)) return;\n onQueryChange({\n ...query,\n offset: 0,\n orderBy: nextHeaderOrderBy(query.orderBy, sortKeyFor(f), dir, placement),\n });\n setMenu(null);\n }\n function removeColumn(f: FieldDef<Row>) {\n const explicit = materialize(query.select, fields);\n const nextSelect = explicit.filter((c) => c.field !== f.name);\n const nextOrderBy = query.orderBy.filter((s) => s.field !== sortKeyFor(f));\n if (nextSelect.length === 0) return;\n onQueryChange({ ...query, select: nextSelect, orderBy: nextOrderBy });\n setMenu(null);\n }\n function sortInfo(f: FieldDef<Row>): { dir: \"asc\" | \"desc\"; priority: number | null } | null {\n const key = sortKeyFor(f);\n const idx = query.orderBy.findIndex((o) => o.field === key);\n if (idx === -1) return null;\n const term = query.orderBy[idx]!;\n return { dir: term.dir, priority: query.orderBy.length > 1 ? idx + 1 : null };\n }\n\n // ---- width (resolved from query.select; written back through onQueryChange) ----\n function widthFor(name: string, f: FieldDef<Row>): number | undefined {\n const col = query.select.find((c) => c.field === name);\n return col?.width ?? f.select?.width;\n }\n function resolvedWidthFor(name: string, f: FieldDef<Row>): number | undefined {\n return widthFor(name, f);\n }\n function resolvedColumnWidthFor(name: string, f?: FieldDef<Row>): number | undefined {\n if (name === SELECTION_COLUMN) return selectionColumnWidth;\n return f ? resolvedWidthFor(name, f) : undefined;\n }\n function displayColumnWidthFor(name: string, f?: FieldDef<Row>): number {\n if (name === SELECTION_COLUMN) return resolvedColumnWidthFor(name) ?? DEFAULT_SELECTION_WIDTH;\n return f ? resolvedWidthFor(name, f) ?? DEFAULT_WIDTH : DEFAULT_WIDTH;\n }\n function clampWidth(width: number): number {\n return Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, Math.round(width)));\n }\n function clampColumnWidth(name: string, width: number): number {\n const min = name === SELECTION_COLUMN ? MIN_SELECTION_WIDTH : MIN_WIDTH;\n return Math.max(min, Math.min(MAX_WIDTH, Math.round(width)));\n }\n function commitColumnWidth(name: string, width: number) {\n if (name === SELECTION_COLUMN) {\n setSelectionColumnWidth(clampColumnWidth(name, width));\n return;\n }\n setWidth(name, width);\n }\n function setWidth(name: string, width: number) {\n const px = clampWidth(width);\n onQueryChange((prev) => ({ ...prev, select: writeWidth(prev.select, fields, name, px) }));\n }\n function applyResizeGuide() {\n const preview = resizePreviewRef.current;\n const guide = resizeGuideRef.current;\n if (!preview || !guide) return;\n guide.style.transform = `translateX(${preview.guideX}px)`;\n }\n function applyCommittedResize() {\n const preview = resizePreviewRef.current;\n const table = tableRef.current;\n if (!preview || !table) return;\n const selector = `col[data-qt-column=\"${cssAttributeValue(preview.name)}\"]`;\n const col = table.querySelector<HTMLTableColElement>(selector);\n if (col) col.style.width = `${preview.width}px`;\n table.style.minWidth = `${preview.startTableWidth + preview.width - preview.previousWidth}px`;\n }\n function startResize(name: string, startWidth: number | undefined, e: React.PointerEvent<HTMLSpanElement>) {\n e.preventDefault();\n e.stopPropagation();\n const startX = e.clientX;\n const startW = startWidth ?? e.currentTarget.parentElement?.getBoundingClientRect().width ?? DEFAULT_WIDTH;\n const previousCursor = document.body.style.cursor;\n const previousUserSelect = document.body.style.userSelect;\n const initialWidth = clampColumnWidth(name, startW);\n const wrap = tableWrapRef.current;\n const wrapRect = wrap?.getBoundingClientRect();\n const header = e.currentTarget.parentElement as HTMLTableCellElement | null;\n resizeCommitRef.current = null;\n resizePreviewRef.current = {\n name,\n width: initialWidth,\n previousWidth: displayColumnWidthFor(name, fieldByName.get(name)),\n startTableWidth: tableWidth,\n guideX: startX - (wrapRect?.left ?? 0) + (wrap?.scrollLeft ?? 0),\n };\n resizingFieldRef.current = name;\n tableWrapRef.current?.classList.add(\"qt-table-wrap--resizing\");\n header?.classList.add(\"qt-th--resizing\");\n if (header) header.draggable = false;\n if (resizeGuideRef.current) {\n resizeGuideRef.current.style.display = \"block\";\n resizeGuideRef.current.style.top = `${wrap?.scrollTop ?? 0}px`;\n resizeGuideRef.current.style.height = `${wrap?.clientHeight ?? 0}px`;\n }\n applyResizeGuide();\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n const cleanup = (commitWidth: boolean) => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", finish);\n window.removeEventListener(\"pointercancel\", finish);\n if (resizeFrameRef.current != null) {\n cancelAnimationFrame(resizeFrameRef.current);\n resizeFrameRef.current = null;\n applyResizeGuide();\n }\n document.body.style.cursor = previousCursor;\n document.body.style.userSelect = previousUserSelect;\n tableWrapRef.current?.classList.remove(\"qt-table-wrap--resizing\");\n tableRef.current\n ?.querySelector<HTMLElement>(`th[data-qt-field=\"${cssAttributeValue(name)}\"]`)\n ?.classList.remove(\"qt-th--resizing\");\n if (header) header.draggable = true;\n const commit = commitWidth ? resizeCommitRef.current : null;\n if (commit) applyCommittedResize();\n if (resizeGuideRef.current) resizeGuideRef.current.style.display = \"none\";\n resizeCommitRef.current = null;\n resizePreviewRef.current = null;\n resizingFieldRef.current = null;\n cancelResizeRef.current = null;\n if (commit) commitColumnWidth(commit.name, commit.width);\n };\n const finish = () => cleanup(true);\n const onMove = (ev: PointerEvent) => {\n const next = clampColumnWidth(name, startW + (ev.clientX - startX));\n resizeCommitRef.current = { name, width: next };\n const preview = resizePreviewRef.current;\n if (preview) {\n preview.width = next;\n preview.guideX = startX + (next - startW) - (wrapRect?.left ?? 0) + (wrap?.scrollLeft ?? 0);\n }\n if (resizeFrameRef.current == null) {\n resizeFrameRef.current = requestAnimationFrame(() => {\n resizeFrameRef.current = null;\n applyResizeGuide();\n });\n }\n };\n cancelResizeRef.current = () => cleanup(false);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", finish);\n window.addEventListener(\"pointercancel\", finish);\n }\n function autofitColumn(name: string) {\n const wrap = tableWrapRef.current;\n if (!wrap) return;\n const selector = `[data-qt-field=\"${cssAttributeValue(name)}\"]`;\n let width = 0;\n wrap.querySelectorAll<HTMLElement>(selector).forEach((el) => {\n width = Math.max(width, el.scrollWidth);\n });\n if (width > 0) setWidth(name, width + AUTOFIT_EXTRA_PX);\n }\n function resizeWithKeyboard(name: string, startWidth: number | undefined, e: React.KeyboardEvent<HTMLSpanElement>) {\n if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\" && e.key !== \"Enter\") return;\n e.preventDefault();\n e.stopPropagation();\n if (e.key === \"Enter\") {\n autofitColumn(name);\n return;\n }\n const step = e.shiftKey ? 25 : 10;\n const direction = e.key === \"ArrowRight\" ? 1 : -1;\n commitColumnWidth(name, (startWidth ?? DEFAULT_WIDTH) + step * direction);\n }\n\n // ---- reorder (drag headers; writes the new SELECT order) ----\n // `overIndex` is a position in the list with the dragged column removed, which\n // is exactly where the live preview shows the dragged header, so the committed\n // order can never disagree with what the user saw.\n function reorderByIndex(from: string, overIndex: number) {\n const withoutDragged = tableColumnNames.filter((n) => n !== from);\n if (withoutDragged.length === tableColumnNames.length) return; // `from` not visible\n const at = Math.max(0, Math.min(overIndex, withoutDragged.length));\n withoutDragged.splice(at, 0, from);\n setTableColumnOrder(withoutDragged);\n const nextFieldOrder = withoutDragged.filter((name) => name !== SELECTION_COLUMN);\n if (!sameOrder(nextFieldOrder, fieldNames)) {\n onQueryChange({ ...query, select: reorderSelect(query.select, fields, nextFieldOrder) });\n }\n }\n\n const fieldByName = useMemo(() => new Map(fields.map((f) => [f.name, f])), [fields]);\n const fieldNames = useMemo(() => fields.map((f) => f.name), [fields]);\n const tableColumnNames = useMemo(() => {\n if (!showSel) return fieldNames;\n const defaultOrder = [SELECTION_COLUMN, ...fieldNames];\n const valid = new Set(defaultOrder);\n const kept = tableColumnOrder.filter((name) => valid.has(name));\n const missing = defaultOrder.filter((name) => !kept.includes(name));\n return [...kept, ...missing];\n }, [fieldNames, showSel, tableColumnOrder]);\n const dragSource = columnDrag.source;\n // While dragging, render the WHOLE column (header + body cells + width) in the\n // order a drop would commit: the dragged column stays MOUNTED (removing the\n // drag-source node mid-drag aborts the native HTML5 drag) but slides to the\n // hovered slot and is dimmed. Because the rendered order IS the would-be\n // result, the live preview can never disagree with where the drop lands.\n const renderedColumnNames = useMemo(() => columnDrag.preview(tableColumnNames), [columnDrag, tableColumnNames]);\n\n // ---- selection ----\n function toggleHeader() {\n if (!selection) return;\n selection.setPage(pageIds, headerState !== \"all\");\n }\n\n // ---- cell menu ----\n function openMenu(e: React.MouseEvent, f: FieldDef<Row>, row: Row) {\n if (isInteractiveTarget(e.target)) return;\n e.preventDefault();\n setMenu({ kind: \"cell\", field: f, value: readFieldValue(f, row), x: e.clientX, y: e.clientY });\n }\n function openHeaderMenu(e: React.MouseEvent, f: FieldDef<Row>) {\n if (isInteractiveTarget(e.target)) return;\n e.preventDefault();\n setMenu({ kind: \"header\", field: f, x: e.clientX, y: e.clientY });\n }\n\n function onTableWheel(e: React.WheelEvent<HTMLDivElement>) {\n const wrap = tableWrapRef.current;\n if (!wrap) return;\n\n const canScrollHorizontally = wrap.scrollWidth > wrap.clientWidth;\n if (!canScrollHorizontally) return;\n\n const dx = e.deltaX;\n const dy = e.deltaY;\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n const prefersHorizontal = absDx > absDy * 1.25;\n\n if (dx === 0 && !e.shiftKey) return;\n\n if (dx === 0 && e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n wrap.scrollLeft += dy;\n return;\n }\n\n if (e.shiftKey || prefersHorizontal) {\n e.preventDefault();\n e.stopPropagation();\n wrap.scrollLeft += dx;\n }\n }\n\n function resizeHandle(name: string, label: string, width: number | undefined): ReactNode {\n return (\n <span\n className={cx(\"qt-resize-handle\", classNames?.resizeHandle)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${label} column`}\n title=\"Drag to resize. Press Enter to auto-fit.\"\n tabIndex={0}\n onPointerDown={(e) => startResize(name, width, e)}\n onKeyDown={(e) => resizeWithKeyboard(name, width, e)}\n onClick={(e) => e.stopPropagation()}\n />\n );\n }\n\n const totalCols = fields.length + (showSel ? 1 : 0) + (trailing ? 1 : 0);\n const tableWidth = renderedColumnNames.reduce((sum, name) => {\n const f = fieldByName.get(name);\n return sum + displayColumnWidthFor(name, f);\n }, trailing ? 40 : 0);\n // A horizontal data grid is more useful than a card stack on small screens,\n // but overflow should be discoverable. Keep a lightweight cue visible only\n // while there is more content to the right.\n useEffect(() => {\n const wrap = tableWrapRef.current;\n if (!wrap) return;\n\n const updateCue = () => {\n const hasMoreToRight = wrap.scrollWidth - wrap.clientWidth - wrap.scrollLeft > 2;\n setShowHorizontalCue(hasMoreToRight);\n };\n\n updateCue();\n window.addEventListener(\"resize\", updateCue);\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(updateCue);\n observer?.observe(wrap);\n return () => {\n window.removeEventListener(\"resize\", updateCue);\n observer?.disconnect();\n };\n }, [renderedColumnNames, tableWidth]);\n const start = query.offset;\n const end = total != null ? Math.min(start + query.limit, total) : start + rows.length;\n const canPrev = start > 0;\n const canNext = total != null ? end < total : rows.length >= query.limit;\n const prevPage = () => onQueryChange((prev) => ({ ...prev, offset: Math.max(0, prev.offset - prev.limit) }));\n const nextPage = () => onQueryChange((prev) => ({ ...prev, offset: prev.offset + prev.limit }));\n const summaryCounts = total == null || total === 0\n ? [rows.length]\n : [start + 1, end, total];\n const summaryText = total == null || total === 0\n ? `${formatRowCount(rows.length)} rows`\n : `${formatRowCount(start + 1)}–${formatRowCount(end)} of ${formatRowCount(total)}`;\n const summaryTitle = summaryCounts.some((count) => rowCountTitle(count) != null)\n ? total == null || total === 0\n ? `${rows.length.toLocaleString()} rows`\n : `${(start + 1).toLocaleString()}–${end.toLocaleString()} of ${total.toLocaleString()}`\n : undefined;\n const virtualRows = rowVirtualizer.getVirtualItems();\n const firstVirtualRow = virtualRows[0];\n const lastVirtualRow = virtualRows[virtualRows.length - 1];\n const paddingTop = firstVirtualRow ? Math.max(0, firstVirtualRow.start - headerHeight) : 0;\n const paddingBottom = lastVirtualRow\n ? Math.max(0, rowVirtualizer.getTotalSize() - (lastVirtualRow.end - headerHeight))\n : 0;\n\n return (\n <>\n {showHorizontalCue ? (\n <div className=\"qt-table-scroll-cue\" aria-hidden=\"true\">\n Swipe to see more <Icon name=\"arrowRight\" />\n </div>\n ) : null}\n <div\n ref={tableWrapRef}\n className={cx(\n \"qt-table-wrap\",\n loading && \"qt-table-wrap--loading\",\n classNames?.wrap,\n )}\n onWheel={onTableWheel}\n style={{ maxHeight, overflowY: \"auto\" }}\n onScroll={() => {\n const wrap = tableWrapRef.current;\n if (!wrap) return;\n setShowHorizontalCue(wrap.scrollWidth - wrap.clientWidth - wrap.scrollLeft > 2);\n }}\n role=\"region\"\n aria-label=\"Scrollable data table\"\n tabIndex={0}\n >\n {loading && (\n <div className={cx(\"qt-loading-bar\", classNames?.loadingBar)} role=\"progressbar\" aria-label=\"loading\" />\n )}\n <div\n ref={resizeGuideRef}\n className={cx(\"qt-resize-guide\", classNames?.resizeGuide)}\n aria-hidden=\"true\"\n />\n <table ref={tableRef} className={cx(\"qt-table\", classNames?.table)} style={{ minWidth: tableWidth }}>\n <colgroup>\n {renderedColumnNames.map((name) => {\n const f = fieldByName.get(name);\n const w = displayColumnWidthFor(name, f);\n if (name === SELECTION_COLUMN) return <col key={name} data-qt-column={name} style={{ width: w }} />;\n if (!f) return null;\n return <col key={f.name} data-qt-column={f.name} style={{ width: w }} />;\n })}\n {trailing && <col style={{ width: 40 }} />}\n </colgroup>\n <thead ref={tableHeadRef} className={classNames?.thead}>\n <tr className={classNames?.headerRow}>\n {renderedColumnNames.map((name) => {\n if (name === SELECTION_COLUMN) {\n return (\n <th\n key={name}\n data-qt-field={name}\n className={cx(\n \"qt-th\",\n \"qt-checkbox-cell\",\n dragSource === name && \"qt-th--dragging\",\n classNames?.th,\n classNames?.checkboxCell,\n )}\n draggable\n onDragStart={(e) => {\n if (resizingFieldRef.current) {\n e.preventDefault();\n return;\n }\n columnDrag.start(name, tableColumnNames.indexOf(name));\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", name);\n }}\n onDragOver={(e) => {\n if (!columnDrag.source) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (columnDrag.source !== name) {\n const withoutDragged = tableColumnNames.filter((n) => n !== columnDrag.source);\n let next = withoutDragged.indexOf(name);\n if (next >= 0) {\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n columnDrag.over(next);\n }\n }\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const from = columnDrag.source || e.dataTransfer.getData(\"text/plain\");\n if (from && columnDrag.overIndex != null) reorderByIndex(from, columnDrag.overIndex);\n columnDrag.end();\n }}\n onDragEnd={() => columnDrag.end()}\n >\n <input\n type=\"checkbox\"\n checked={headerState === \"all\"}\n ref={(el) => {\n if (el) el.indeterminate = headerState === \"some\";\n }}\n onChange={toggleHeader}\n aria-label=\"select all on page\"\n />\n {resizeHandle(name, \"selection\", resolvedColumnWidthFor(name))}\n </th>\n );\n }\n const f = fieldByName.get(name);\n if (!f) return null;\n const info = sortInfo(f);\n const sortable = isSortable(f);\n return (\n <th\n // Stable key (not index-based): while dragging, React must\n // MOVE the dragged <th>, not remount it — a remount removes\n // the drag source and aborts the native drag.\n key={f.name}\n data-qt-field={f.name}\n className={cx(\n \"qt-th\",\n sortable && \"qt-th--sortable\",\n dragSource === f.name && \"qt-th--dragging\",\n classNames?.th,\n )}\n style={f.select?.align ? { textAlign: f.select.align } : undefined}\n draggable\n onDragStart={(e) => {\n if (resizingFieldRef.current) {\n e.preventDefault();\n return;\n }\n columnDrag.start(f.name, tableColumnNames.indexOf(f.name));\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", f.name);\n }}\n onDragOver={(e) => {\n if (!columnDrag.source) return;\n // preventDefault on every header (incl. the dragged one) so\n // there is no dead drop zone anywhere along the row.\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (columnDrag.source !== f.name) {\n const withoutDragged = tableColumnNames.filter((n) => n !== columnDrag.source);\n let next = withoutDragged.indexOf(f.name);\n if (next >= 0) {\n // Drop after the hovered header when past its midpoint,\n // so a column can be moved into the last slot.\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n columnDrag.over(next);\n }\n }\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const from = columnDrag.source || e.dataTransfer.getData(\"text/plain\");\n if (from && columnDrag.overIndex != null) reorderByIndex(from, columnDrag.overIndex);\n columnDrag.end();\n }}\n onDragEnd={() => columnDrag.end()}\n >\n <span\n className=\"qt-th-label\"\n onClick={(e) => openHeaderMenu(e, f)}\n style={{ cursor: \"pointer\" }}\n title=\"Click to open column actions\"\n >\n {f.label}\n {info && (\n <span className=\"qt-sort-indicator\">\n <Icon name={info.dir === \"asc\" ? \"arrowUp\" : \"arrowDown\"} />\n {info.priority != null && <sup className=\"qt-sort-priority\">{info.priority}</sup>}\n </span>\n )}\n </span>\n {resizeHandle(f.name, f.label, resolvedColumnWidthFor(f.name, f))}\n </th>\n );\n })}\n {trailing && <th className={cx(\"qt-th\", classNames?.th)}>{trailingLabel ?? \"\"}</th>}\n </tr>\n </thead>\n <tbody className={classNames?.tbody}>\n {rows.length === 0 && (\n <tr>\n <td colSpan={totalCols} className={cx(\"qt-cell\", \"qt-empty\", classNames?.empty)}>\n {emptyMessage ?? \"No rows.\"}\n </td>\n </tr>\n )}\n {paddingTop > 0 && (\n <tr className=\"qt-virtual-spacer\" aria-hidden=\"true\">\n <td colSpan={totalCols} style={{ height: paddingTop, padding: 0, border: 0 }} />\n </tr>\n )}\n {virtualRows.map((virtualRow) => {\n const i = virtualRow.index;\n const row = rows[i]!;\n const id = rowIds[i] ?? null;\n const selected = id != null && selection ? selection.isSelected(id) : false;\n return (\n <tr\n key={virtualRow.key}\n data-index={i}\n ref={rowVirtualizer.measureElement}\n className={cx(\"qt-row\", selected && \"qt-row--selected\", classNames?.row, selected && classNames?.rowSelected)}\n >\n {renderedColumnNames.map((name) => {\n if (name === SELECTION_COLUMN) {\n return (\n <td\n key={name}\n data-qt-field={name}\n className={cx(\n \"qt-cell\",\n \"qt-checkbox-cell\",\n dragSource === name && \"qt-cell--dragging\",\n classNames?.cell,\n classNames?.checkboxCell,\n )}\n >\n {id != null && (\n <input\n type=\"checkbox\"\n checked={selected}\n // Shift-range select is handled inside selection.toggle.\n onClick={(e) => selection!.toggle(id, e.shiftKey)}\n onChange={() => {\n /* state owned by selection; onClick drives it */\n }}\n aria-label={`select row ${String(id)}`}\n />\n )}\n </td>\n );\n }\n const f = fieldByName.get(name);\n if (!f) return null;\n const render = resolveRenderer(f, renderers);\n const value = readFieldValue(f, row);\n const key = cellKey(id, i, f.name);\n return (\n <td\n key={f.name}\n data-qt-field={f.name}\n className={cx(\"qt-cell\", dragSource === f.name && \"qt-cell--dragging\", classNames?.cell)}\n style={f.select?.align ? { textAlign: f.select.align } : undefined}\n onClick={(e) => openMenu(e, f, row)}\n onContextMenu={(e) => openMenu(e, f, row)}\n onDoubleClick={(e) => copyCellToClipboard(e, f, id, i, value)}\n >\n {copiedCellKey === key ? <span className=\"qt-cell-copy-chip\"><Icon name=\"check\" />copied</span> : isComputedCellError(value) ? <span className=\"qt-formula-error\" title={value.computedError}>{value.computedError === \"Calculating…\" ? \"Calculating…\" : \"Error\"}</span> : render({ value, row, field: f, query })}\n </td>\n );\n })}\n {trailing && <td className={cx(\"qt-cell\", \"qt-trailing-cell\", classNames?.cell)}>{trailing(row)}</td>}\n </tr>\n );\n })}\n {paddingBottom > 0 && (\n <tr className=\"qt-virtual-spacer\" aria-hidden=\"true\">\n <td colSpan={totalCols} style={{ height: paddingBottom, padding: 0, border: 0 }} />\n </tr>\n )}\n </tbody>\n <tfoot>\n <tr className={cx(\"qt-table-summary-row\", classNames?.summaryRow)}>\n <td colSpan={totalCols} className={cx(\"qt-cell\", \"qt-table-summary-cell\", classNames?.summaryCell)}>\n <div className={cx(\"qt-table-summary\", classNames?.summaryControls)}>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.summaryButton)}\n disabled={loading || !canPrev}\n onClick={prevPage}\n >\n <Icon name=\"arrowLeft\" />prev\n </button>\n <span className={cx(\"qt-table-summary-hint\", classNames?.summaryHint)} title={summaryTitle}>{summaryText}</span>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.summaryButton)}\n disabled={loading || !canNext}\n onClick={nextPage}\n >\n next<Icon name=\"arrowRight\" />\n </button>\n </div>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n {menu && (\n menu.kind === \"cell\" ? (\n <CellMenu\n field={menu.field}\n value={menu.value}\n x={menu.x}\n y={menu.y}\n onAddFilter={(clause: WhereClause) =>\n onQueryChange((prev) => ({ ...prev, offset: 0, where: [...prev.where, clause] }))\n }\n onClose={() => setMenu(null)}\n />\n ) : (\n <HeaderMenu\n field={menu.field}\n x={menu.x}\n y={menu.y}\n sortable={isSortable(menu.field)}\n canRemoveColumn={fields.length > 1}\n onSetSort={(placement, dir) => applyHeaderSort(menu.field, dir, placement)}\n onRemove={() => removeColumn(menu.field)}\n onClose={() => setMenu(null)}\n />\n )\n )}\n </>\n );\n}\n\nfunction HeaderMenu<Row>({\n field,\n x,\n y,\n sortable,\n canRemoveColumn,\n onSetSort,\n onRemove,\n onClose,\n}: {\n field: FieldDef<Row>;\n x: number;\n y: number;\n sortable: boolean;\n canRemoveColumn: boolean;\n onSetSort: (placement: HeaderSortPlacement, dir: \"asc\" | \"desc\") => void;\n onRemove: () => void;\n onClose: () => void;\n}) {\n const mobile = useMobileLayout();\n useEffect(() => {\n if (mobile) return;\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n function onDocClick() {\n onClose();\n }\n window.addEventListener(\"keydown\", onKey);\n const t = setTimeout(() => window.addEventListener(\"click\", onDocClick), 0);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"click\", onDocClick);\n clearTimeout(t);\n };\n }, [onClose, mobile]);\n\n const items: ReactNode[] = [];\n const addSortItem = (placement: HeaderSortPlacement, dir: \"asc\" | \"desc\", label: string) =>\n items.push(\n <MenuItem key={`${placement}-${dir}`} disabled={!sortable} onClick={() => onSetSort(placement, dir)}>\n {label}\n </MenuItem>,\n );\n\n addSortItem(\"set\", \"asc\", \"Set Sort (Asc)\");\n addSortItem(\"set\", \"desc\", \"Set Sort (Desc)\");\n addSortItem(\"append\", \"asc\", \"Append Sort (Asc)\");\n addSortItem(\"append\", \"desc\", \"Append Sort (Desc)\");\n addSortItem(\"prepend\", \"asc\", \"Prepend Sort (Asc)\");\n addSortItem(\"prepend\", \"desc\", \"Prepend Sort (Desc)\");\n\n items.push(<div key=\"sep\" className=\"qt-cm-sep\" />);\n items.push(\n <MenuItem key=\"remove\" disabled={!canRemoveColumn} onClick={onRemove}>\n Remove Column\n </MenuItem>,\n );\n\n const vw = typeof window !== \"undefined\" ? window.innerWidth : 9999;\n const vh = typeof window !== \"undefined\" ? window.innerHeight : 9999;\n const left = Math.max(8, Math.min(x, vw - MENU_WIDTH - 8));\n const top = Math.max(8, Math.min(y, vh - MENU_ROW_HEIGHT * items.length - 8));\n\n return (\n <AdaptiveOverlay title={`${field.label} column`} onClose={onClose}>\n <div\n className=\"qt-cell-menu\"\n style={{ left, top, width: MENU_WIDTH }}\n onClick={(e) => e.stopPropagation()}\n onContextMenu={(e) => e.preventDefault()}\n role=\"menu\"\n >\n <div className=\"qt-cm-header\">\n <span className=\"qt-cm-field\">{field.label}</span>\n </div>\n {items}\n </div>\n </AdaptiveOverlay>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n disabled,\n}: {\n children: ReactNode;\n onClick: () => void;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className=\"qt-cm-item\"\n onClick={onClick}\n role=\"menuitem\"\n disabled={disabled}\n >\n {children}\n </button>\n );\n}\n\n/** Header menu sort helper for set / append / prepend actions. */\nfunction nextHeaderOrderBy(\n existing: OrderByClause[],\n field: string,\n dir: \"asc\" | \"desc\",\n placement: HeaderSortPlacement,\n): OrderByClause[] {\n const next = existing.filter((s) => s.field !== field);\n if (placement === \"set\") return [{ field, dir }];\n if (placement === \"append\") return [...next, { field, dir }];\n return [{ field, dir }, ...next];\n}\n\n/** Materialize the current visible order into SelectColumn[] so width/order\n * edits diverge from schema defaults cleanly (mirrors useSelect.writeSelect). */\nfunction materialize<Row>(select: SelectColumn[], fields: FieldDef<Row>[]): SelectColumn[] {\n if (select.length) return select.map((c) => ({ ...c }));\n return fields.map((f) => ({ field: f.name }));\n}\n\nfunction writeWidth<Row>(select: SelectColumn[], fields: FieldDef<Row>[], name: string, width: number): SelectColumn[] {\n const cols = materialize(select, fields);\n let found = false;\n const next = cols.map((c) => {\n if (c.field !== name) return c;\n found = true;\n return { ...c, width };\n });\n if (!found) next.push({ field: name, width });\n return next;\n}\n\nfunction reorderSelect<Row>(select: SelectColumn[], fields: FieldDef<Row>[], order: string[]): SelectColumn[] {\n const cols = materialize(select, fields);\n const byName = new Map(cols.map((c) => [c.field, c]));\n return order.map((name) => byName.get(name) ?? { field: name });\n}\n\nfunction cssAttributeValue(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction sameOrder(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((value, index) => value === b[index]);\n}\n\nfunction valueToString(value: unknown): string {\n if (value == null) return \"\";\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n","import { createContext, useContext, useEffect, useRef, useState, type ReactNode } from 'react';\nimport { AdaptiveOverlay, useMobileLayout } from './AdaptiveOverlay';\n\n/** Consumer-owned presentation; canonical values remain in queries and URLs. */\nexport interface FilterValuePresentation {\n label?: (field: string, value: string) => string;\n render?: (field: string, value: string) => ReactNode;\n}\nconst Context = createContext<FilterValuePresentation>({});\nexport const FilterValueProvider = Context.Provider;\nexport function useFilterValuePresentation() { return useContext(Context); }\nexport function PresentedFilterValue({field,value,label}: {field:string;value:string;label?:string}) {\n const presentation=useContext(Context);\n return <>{presentation.render?.(field,value) ?? presentation.label?.(field,value) ?? label ?? value}</>;\n}\n\n/** Search by key or label, select canonical keys, preserve unavailable values. */\nexport function PresentedValueInput({field,value,options,onChange}: {\n field:string; value:string; options:Array<string | {value:string;label:string}>; onChange:(value:string)=>void;\n}) {\n const presentation=useContext(Context);\n const [open,setOpen]=useState(false),[search,setSearch]=useState('');\n const mobile = useMobileLayout();\n const wrapper = useRef<HTMLSpanElement>(null);\n useEffect(() => {\n if (!open || mobile) return;\n const dismiss = (event: PointerEvent) => {\n if (!wrapper.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener('pointerdown', dismiss);\n return () => document.removeEventListener('pointerdown', dismiss);\n }, [open, mobile]);\n const choices=options.map(option=>typeof option==='string'?{value:option,label:presentation.label?.(field,option) ?? option}:option);\n const visible=choices.filter(option=>`${option.value} ${option.label}`.toLowerCase().includes(search.toLowerCase()));\n return <span className=\"qt-value-picker\" ref={wrapper}>\n <button type=\"button\" className=\"qt-chip-op-btn\" aria-label={`Edit ${field} filter value`} aria-haspopup=\"dialog\" aria-expanded={open} onClick={()=>setOpen(!open)}><PresentedFilterValue field={field} value={value} label={choices.find(option=>option.value===value)?.label ?? value}/>{!value&&'Choose value'}</button>\n {open&&<AdaptiveOverlay title=\"Choose a value\" onClose={()=>setOpen(false)}><span className=\"qt-value-picker-pop\" onKeyDown={e=>{if(e.key==='Escape'){e.stopPropagation();setOpen(false)}}}>\n <input className=\"qt-input\" autoFocus={!mobile} aria-label={`Search ${field} values`} placeholder=\"Search values…\" value={search} onChange={e=>setSearch(e.target.value)} onKeyDown={e=>{if(e.key==='Enter'&&search){e.preventDefault();onChange(visible[0]?.value ?? search);setOpen(false)}}}/>\n <span className=\"qt-value-picker-list\">\n {visible.map(option=><button type=\"button\" key={option.value} aria-pressed={option.value === value} onClick={()=>{onChange(option.value);setOpen(false)}}><PresentedFilterValue field={field} value={option.value} label={option.label}/>{option.label!==option.value&&<small> {option.value}</small>}</button>)}\n {!visible.length && <p className=\"qt-muted\">No matching values</p>}\n {search&&!choices.some(option=>option.value===search)&&<button type=\"button\" onClick={()=>{onChange(search);setOpen(false)}}>Use “{search}”</button>}\n </span>\n </span></AdaptiveOverlay>}\n </span>;\n}\n","import { useEffect, useId, useRef, useState, useSyncExternalStore, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nconst MOBILE_QUERY = \"(max-width: 760px), (pointer: coarse) and (max-height: 500px)\";\nconst modalStack: HTMLElement[] = [];\nlet originalOverflow = \"\";\n\nfunction subscribeMobile(listener: () => void) {\n const media = window.matchMedia?.(MOBILE_QUERY);\n media?.addEventListener(\"change\", listener);\n return () => media?.removeEventListener(\"change\", listener);\n}\n\nexport function useMobileLayout(): boolean {\n return useSyncExternalStore(subscribeMobile, () => window.matchMedia?.(MOBILE_QUERY).matches ?? false, () => false);\n}\n\nexport function ModalSurface({\n title,\n onClose,\n children,\n className = \"qt-modal\",\n chrome = true,\n}: {\n title: string;\n onClose: () => void;\n children?: ReactNode;\n className?: string;\n chrome?: boolean;\n}): ReactNode {\n const mobile = useMobileLayout();\n const titleId = useId();\n const surface = useRef<HTMLDivElement>(null);\n const themeAnchor = useRef<HTMLSpanElement>(null);\n const [theme, setTheme] = useState<Record<string, string>>({});\n const close = useRef(onClose);\n close.current = onClose;\n const swipeStart = useRef<number | null>(null);\n const [swipeDistance, setSwipeDistance] = useState(0);\n const [viewport, setViewport] = useState<{ top: number; height: number } | null>(null);\n\n useEffect(() => {\n if (!mobile || !themeAnchor.current) return;\n const styles = getComputedStyle(themeAnchor.current);\n const inherited: Record<string, string> = { fontFamily: styles.fontFamily };\n for (const property of Array.from(styles)) {\n if (property.startsWith(\"--qt-\")) inherited[property] = styles.getPropertyValue(property);\n }\n setTheme(inherited);\n }, [mobile]);\n\n useEffect(() => {\n if (!mobile || !window.visualViewport) return;\n const visualViewport = window.visualViewport;\n const update = () => setViewport({ top: visualViewport.offsetTop, height: visualViewport.height });\n update();\n visualViewport.addEventListener(\"resize\", update);\n visualViewport.addEventListener(\"scroll\", update);\n return () => {\n visualViewport.removeEventListener(\"resize\", update);\n visualViewport.removeEventListener(\"scroll\", update);\n };\n }, [mobile]);\n\n useEffect(() => {\n const element = surface.current;\n if (!element) return;\n const previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n if (modalStack.length === 0) {\n originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n }\n modalStack.push(element);\n element.focus();\n const isTop = () => modalStack[modalStack.length - 1] === element;\n const focusable = () => Array.from(element.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), a[href], [tabindex=\"0\"], [contenteditable=\"true\"]',\n )).filter((target) => {\n if (target.closest('[hidden], [inert], [aria-hidden=\"true\"]')) return false;\n let ancestor: HTMLElement | null = target;\n while (ancestor && ancestor !== element) {\n const style = getComputedStyle(ancestor);\n if (style.display === \"none\" || style.visibility === \"hidden\") return false;\n ancestor = ancestor.parentElement;\n }\n return true;\n });\n const onKey = (event: KeyboardEvent) => {\n if (!isTop()) return;\n if (event.key === \"Escape\" && !element.querySelector(\".cm-tooltip-autocomplete\")) {\n event.preventDefault();\n event.stopPropagation();\n close.current();\n }\n if (event.key !== \"Tab\") return;\n const targets = focusable();\n const first = targets[0];\n const last = targets[targets.length - 1];\n if (!first) {\n event.preventDefault();\n element.focus();\n } else if (event.shiftKey && (document.activeElement === first || document.activeElement === element)) {\n event.preventDefault();\n last?.focus();\n } else if (!event.shiftKey && (document.activeElement === last || document.activeElement === element)) {\n event.preventDefault();\n first.focus();\n }\n };\n const onFocus = (event: FocusEvent) => {\n if (isTop() && !element.contains(event.target as Node)) element.focus();\n };\n document.addEventListener(\"keydown\", onKey, true);\n document.addEventListener(\"focusin\", onFocus);\n return () => {\n document.removeEventListener(\"keydown\", onKey, true);\n document.removeEventListener(\"focusin\", onFocus);\n modalStack.splice(modalStack.indexOf(element), 1);\n if (modalStack.length === 0) document.body.style.overflow = originalOverflow;\n if (previous?.isConnected) previous.focus();\n };\n }, [mobile]);\n\n const content = (\n <div\n className={`qt-modal-backdrop qt-overlay-backdrop${mobile ? \" qt-overlay-backdrop--mobile\" : \"\"}`}\n style={mobile ? { ...theme, ...(viewport ? { top: viewport.top, height: viewport.height, bottom: \"auto\" } : {}) } : undefined}\n onClick={(event) => {\n event.stopPropagation();\n if (event.target === event.currentTarget) onClose();\n }}\n >\n <div\n ref={surface}\n className={`${className} qt-modal-surface${mobile ? \" qt-sheet\" : \"\"}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={chrome ? titleId : undefined}\n aria-label={chrome ? undefined : title}\n tabIndex={-1}\n style={swipeDistance ? { transform: `translateY(${swipeDistance}px)` } : undefined}\n >\n {mobile && (\n <div\n className=\"qt-sheet-handle\"\n aria-hidden=\"true\"\n onPointerDown={(event) => {\n swipeStart.current = event.clientY;\n event.currentTarget.setPointerCapture(event.pointerId);\n }}\n onPointerMove={(event) => {\n if (swipeStart.current !== null) setSwipeDistance(Math.max(0, event.clientY - swipeStart.current));\n }}\n onPointerUp={(event) => {\n const distance = swipeStart.current === null ? 0 : event.clientY - swipeStart.current;\n swipeStart.current = null;\n setSwipeDistance(0);\n if (distance > 80) onClose();\n }}\n onPointerCancel={() => {\n swipeStart.current = null;\n setSwipeDistance(0);\n }}\n ><span /></div>\n )}\n {chrome && (\n <header className=\"qt-overlay-header\">\n <h2 id={titleId}>{title}</h2>\n <button type=\"button\" className=\"qt-btn\" onClick={onClose} aria-label={`Close ${title}`}>Done</button>\n </header>\n )}\n {children}\n </div>\n </div>\n );\n return mobile ? <><span ref={themeAnchor} hidden />{createPortal(content, document.body)}</> : content;\n}\n\nexport function AdaptiveOverlay({ title, onClose, children, enabled = true }: {\n title: string;\n onClose: () => void;\n children: ReactNode;\n enabled?: boolean;\n}): ReactNode {\n const mobile = useMobileLayout();\n return mobile && enabled ? <ModalSurface title={title} onClose={onClose}>{children}</ModalSurface> : children;\n}\n","import { PresentedFilterValue } from \"./FilterValuePresentation\";\n// CellMenu — right-click (or left-click) a cell → quick-filter popover + copy.\n// Filters are laid out in two columns: each row is a candidate predicate on the\n// left and its logical negation directly opposite (`= 5 | ≠ 5`, `≥ 5 | < 5`,\n// `is null | is not null`, `contains | not contains`). Value ops are prefilled\n// with the clicked cell's value; array cells get a per-element `includes` row.\n// Anchors just off the click point and clamps to the viewport.\n\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { Icon } from \"./Icon\";\nimport type { FieldDef, FilterOp, WhereClause } from \"@pythia-software/query-table-core\";\nimport { NULLARY_OPS, negateClause, opsForField, opPairsForField, isFilterable } from \"@pythia-software/query-table-core\";\nimport type { MenuClassNames } from \"./classNames\";\nimport { AdaptiveOverlay, useMobileLayout } from \"./AdaptiveOverlay\";\n\nexport interface CellMenuProps<Row> {\n field: FieldDef<Row>;\n value: unknown;\n /** Viewport coordinates of the click. */\n x: number;\n y: number;\n onAddFilter: (clause: WhereClause) => void;\n onClose: () => void;\n classNames?: MenuClassNames;\n}\n\nconst cx = (...parts: Array<string | undefined | false>): string => parts.filter(Boolean).join(\" \");\n\n/** Approximate sizing so the popover can clamp itself into the viewport. */\nconst MENU_WIDTH = 320;\nconst ROW_HEIGHT = 32;\nconst POINTER_OFFSET = 4;\n\ninterface FilterRow {\n positive?: WhereClause;\n negative?: WhereClause;\n}\n\nexport function CellMenu<Row>({ field, value, x, y, onAddFilter, onClose, classNames }: CellMenuProps<Row>): ReactNode {\n const mobile = useMobileLayout();\n // Dismiss on Escape or an outside click. The opening click is deferred a tick\n // so it doesn't immediately re-close the freshly-opened menu.\n useEffect(() => {\n if (mobile) return;\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n function onDocClick() {\n onClose();\n }\n window.addEventListener(\"keydown\", onKey);\n const t = setTimeout(() => window.addEventListener(\"click\", onDocClick), 0);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"click\", onDocClick);\n clearTimeout(t);\n };\n }, [onClose, mobile]);\n\n // A non-filterable field (e.g. a computed column that opted out) offers no\n // filter rows; only the header + copy remain. `pairs` is the shared keep/\n // exclude op source the WHERE op picker uses too, so the two read identically.\n const ops = isFilterable(field) ? opsForField(field) : [];\n const pairs = isFilterable(field) ? opPairsForField(field) : [];\n const hasNullity = pairs.some((p) => p.keep.op === \"is_null\");\n const isArray = Array.isArray(value);\n const isNullish = value == null || (isArray && (value as unknown[]).length === 0);\n const cellText = valueToString(value);\n\n function applyClause(clause: WhereClause) {\n onAddFilter(clause);\n onClose();\n }\n\n // Build one row = a positive predicate and its negation opposite.\n const rows: FilterRow[] = [];\n const pairRow = (op: FilterOp, raw: string) => {\n const positive: WhereClause = { field: field.name, op, value: NULLARY_OPS.has(op) ? \"\" : raw };\n rows.push({ positive, negative: negateClause(positive, ops) });\n };\n\n if (isArray && !isNullish) {\n // A tag column: filter by the clicked tag (and its negation), then nullity.\n const arrayOp: FilterOp = pairs.find((p) => p.keep.op === \"includes\")?.keep.op ?? pairs[0]?.keep.op ?? \"=\";\n (value as unknown[]).forEach((el) => pairRow(arrayOp, String(el)));\n if (hasNullity) pairRow(\"is_null\", cellText);\n } else if (value === \"\" && field.type === \"text\") {\n if (ops.includes(\"length_eq\")) {\n rows.push({\n positive: { field: field.name, op: \"length_eq\", value: \"0\" },\n negative: ops.includes(\"length_gt\")\n ? { field: field.name, op: \"length_gt\", value: \"0\" }\n : { field: field.name, op: \"length_eq\", value: \"0\", negated: true },\n });\n }\n if (hasNullity) pairRow(\"is_null\", cellText);\n } else if (value === \"\") {\n if (hasNullity) pairRow(\"is_null\", cellText);\n } else if (!isNullish) {\n // Every keep op (value ops + nullity) prefilled with the cell value.\n for (const pair of pairs) {\n const op = pair.keep.op;\n pairRow(op, op === \"length_gt\" || op === \"length_lt\" || op === \"length_eq\" ? String(Array.from(cellText).length) : cellText);\n }\n } else if (hasNullity) {\n // Empty cell → only the nullity row makes sense.\n pairRow(\"is_null\", cellText);\n }\n\n const vw = typeof window !== \"undefined\" ? window.innerWidth : 9999;\n const vh = typeof window !== \"undefined\" ? window.innerHeight : 9999;\n // header + copy + separator + one line per filter row.\n const approxRows = 3 + rows.length;\n const left = Math.max(8, Math.min(x + POINTER_OFFSET, vw - MENU_WIDTH - 8));\n const top = Math.max(8, Math.min(y + POINTER_OFFSET, vh - ROW_HEIGHT * approxRows - 8));\n\n return (\n <AdaptiveOverlay title={field.label} onClose={onClose}>\n <div\n className={cx(\"qt-cell-menu\", classNames?.popover)}\n style={{ left, top, width: MENU_WIDTH }}\n onClick={(e) => e.stopPropagation()}\n onContextMenu={(e) => e.preventDefault()}\n role=\"menu\"\n >\n <div className=\"qt-cm-header\">\n <span className=\"qt-cm-field\">{field.label}</span>\n <span className=\"qt-cm-value\">{Array.isArray(value) ? value.map(v => <PresentedFilterValue key={String(v)} field={field.name} value={String(v)}/>) : <PresentedFilterValue field={field.name} value={String(value ?? \"\")}/>}</span>\n </div>\n <MenuItem\n classNames={classNames}\n onClick={async () => {\n try {\n await navigator.clipboard.writeText(cellText);\n } catch {\n /* clipboard denial is non-fatal */\n }\n onClose();\n }}\n >\n <Icon name=\"copy\" /> copy value\n </MenuItem>\n <div className={cx(\"qt-cm-sep\", classNames?.separator)} />\n {rows.length > 0 && (\n <div className=\"qt-cm-filter-grid\" role=\"group\" aria-label=\"Filter by this cell\">\n <span className=\"qt-cm-col-head\">keep</span>\n <span className=\"qt-cm-col-head qt-cm-col-head--neg\">exclude</span>\n {rows.map((row, i) => (\n <FilterPairRow key={i} row={row} value={value} classNames={classNames} onApply={applyClause} />\n ))}\n </div>\n )}\n </div>\n </AdaptiveOverlay>\n );\n}\n\nfunction FilterPairRow<Row>({\n row,\n value,\n classNames,\n onApply,\n}: {\n row: FilterRow;\n value: unknown;\n classNames: MenuClassNames | undefined;\n onApply: (clause: WhereClause) => void;\n}): ReactNode {\n return (\n <>\n <FilterButton clause={row.positive} value={value} classNames={classNames} onApply={onApply} />\n <FilterButton clause={row.negative} value={value} negative classNames={classNames} onApply={onApply} />\n </>\n );\n}\n\nfunction FilterButton({\n clause,\n value,\n negative,\n classNames,\n onApply,\n}: {\n clause: WhereClause | undefined;\n value: unknown;\n negative?: boolean;\n classNames: MenuClassNames | undefined;\n onApply: (clause: WhereClause) => void;\n}): ReactNode {\n if (!clause) return <span className=\"qt-cm-filter-empty\" aria-hidden />;\n const emptyStringLength = clause.value === \"0\" &&\n (clause.op === \"length_eq\" || clause.op === \"length_gt\");\n const nullary = NULLARY_OPS.has(clause.op) || emptyStringLength;\n return (\n <button\n type=\"button\"\n className={cx(\"qt-cm-item\", \"qt-cm-filter\", negative && \"qt-cm-filter--neg\", classNames?.item)}\n onClick={() => onApply(clause)}\n role=\"menuitem\"\n >\n <span className=\"qt-cm-op\">{predicateSymbol(clause)}</span>\n {!nullary ? (\n <>\n {\" \"}\n <code><PresentedFilterValue field={clause.field} value={clause.value}/></code>\n </>\n ) : null}\n </button>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n classNames,\n}: {\n children: ReactNode;\n onClick: () => void;\n classNames: MenuClassNames | undefined;\n}) {\n return (\n <button type=\"button\" className={cx(\"qt-cm-item\", classNames?.item)} onClick={onClick} role=\"menuitem\">\n {children}\n </button>\n );\n}\n\n/** Human-readable label for a predicate, honoring the `negated` flag. */\nfunction predicateSymbol(clause: WhereClause): string {\n if (clause.value === \"0\" && clause.op === \"length_eq\") {\n return clause.negated ? \"exclude empty strings\" : \"include empty strings\";\n }\n if (clause.value === \"0\" && clause.op === \"length_gt\" && !clause.negated) {\n return \"exclude empty strings\";\n }\n const base = opSymbol(clause.op);\n return clause.negated ? `not ${base}` : base;\n}\n\nfunction opSymbol(op: FilterOp): string {\n switch (op) {\n case \"!=\":\n return \"≠\";\n case \">=\":\n return \"≥\";\n case \"<=\":\n return \"≤\";\n case \"starts_with\":\n return \"starts with\";\n case \"ends_with\":\n return \"ends with\";\n case \"matches_regex\":\n return \"matches\";\n case \"not_matches_regex\":\n return \"not matches\";\n case \"length_eq\":\n return \"length equals\";\n case \"length_gt\":\n return \"length above\";\n case \"length_lt\":\n return \"length below\";\n case \"is_null\":\n return \"is null\";\n case \"is_not_null\":\n return \"is not null\";\n default:\n return op;\n }\n}\n\nfunction valueToString(v: unknown): string {\n if (v == null) return \"\";\n if (Array.isArray(v)) return v.join(\", \");\n return String(v);\n}\n\nfunction previewValue(v: unknown): string {\n if (v == null || v === \"\") return \"(empty)\";\n if (Array.isArray(v)) {\n return v.length === 0 ? \"(empty)\" : `[${v.length}] ${v.slice(0, 2).join(\", \")}${v.length > 2 ? \"…\" : \"\"}`;\n }\n const s = String(v);\n return s.length > 50 ? s.slice(0, 50) + \"…\" : s;\n}\n","const exactRowCountFormatter = new Intl.NumberFormat();\n\n/** Format a row count compactly once grouping separators become hard to scan. */\nexport function formatRowCount(count: number, maximumSignificantDigits = 3): string {\n if (!Number.isFinite(count)) return String(count);\n if (Math.abs(count) < 10_000) return exactRowCountFormatter.format(count);\n\n const precision = Math.min(4, Math.max(1, Math.trunc(maximumSignificantDigits)));\n return new Intl.NumberFormat(undefined, {\n notation: \"compact\",\n maximumSignificantDigits: precision,\n }).format(count);\n}\n\n/** Return the full grouped count when the visible form is abbreviated. */\nexport function rowCountTitle(count: number, formatted = formatRowCount(count)): string | undefined {\n const exact = exactRowCountFormatter.format(count);\n return formatted === exact ? undefined : exact;\n}\n","import {\n lazy,\n Suspense,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ModalSurface, useMobileLayout } from \"./AdaptiveOverlay\";\nimport { ReorderList } from \"./ReorderList\";\nimport { Icon } from \"./Icon\";\nimport type { QueryTableApi } from \"@pythia-software/query-table-react\";\nimport {\n computedFieldName,\n FORMULA_FUNCTIONS,\n isComputedField,\n isSelectable,\n type ColumnPreview,\n type FieldStats,\n type SelectColumn,\n type RegexInspection,\n} from \"@pythia-software/query-table-core\";\nimport {\n orderPreviewGroups,\n type PreviewSort,\n type PreviewSortKey,\n} from \"./previewOrdering\";\nconst FormulaEditor = lazy(() => import(\"./FormulaEditor\"));\nconst fieldExpression = (name: string) => `[${name.replace(/\\]/g, \"]]\")}]`;\nconst display = (v: unknown) =>\n v === null\n ? \"NULL\"\n : typeof v === \"string\"\n ? v === \"\"\n ? '\"\"'\n : v\n : JSON.stringify(v);\nexport interface SelectColumnEditorProps<Row> {\n api: QueryTableApi<Row>;\n onClose: () => void;\n}\nexport function SelectColumnEditor<Row>({\n api,\n onClose,\n}: SelectColumnEditorProps<Row>) {\n const titleId = useId();\n const mobile = useMobileLayout();\n const [mobilePanel, setMobilePanel] = useState(\"selected\");\n const [columns, setColumns] = useState<SelectColumn[]>(() =>\n api.select.visible.map((c) => ({ ...c })),\n );\n const [search, setSearch] = useState(\"\"),\n [active, setActive] = useState<string>(api.select.visible[0]?.field ?? \"\");\n const [editing, setEditing] = useState(false),\n [id, setId] = useState(\"\"),\n [revision, setRevision] = useState<string | null>(null);\n const [label, setLabel] = useState(\"\"),\n [source, setSource] = useState(\"\");\n const [count, setCount] = useState(1000),\n [preview, setPreview] = useState<ColumnPreview | null>(null),\n [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null),\n [notice, setNotice] = useState(\"\"),\n [saving, setSaving] = useState(false);\n const [filter, setFilter] = useState(\"all\"),\n [page, setPage] = useState(0),\n [retry, setRetry] = useState(0),\n [functionSearch, setFunctionSearch] = useState(\"\");\n const [previewSort, setPreviewSort] = useState<PreviewSort | null>(null);\n const [fieldStats, setFieldStats] = useState<Record<string, FieldStats>>({});\n const drag = useRef<string | null>(null);\n const [inspection, setInspection] = useState<RegexInspection | null>(null);\n const catalogue = api.computed.catalogue.filter(isSelectable);\n const chosen = catalogue.find((f) => f.name === active);\n const expression = editing ? source : active ? fieldExpression(active) : \"\";\n const validation = useMemo(() => {\n if (!expression)\n return { error: \"Choose a column or create a computed column.\" };\n try {\n return {\n plan: api.computed.compile(expression, editing ? id : undefined),\n };\n } catch (e) {\n return { error: e instanceof Error ? e.message : String(e) };\n }\n }, [expression, editing, id, api.computed.compile]);\n const previewPlanKey = validation.error\n ? `error:${validation.error}`\n : `plan:${JSON.stringify(validation.plan)}`;\n // Parent refreshes may recreate the API methods without changing the preview.\n // Use the latest method, but restart only when the request itself changes.\n const previewRequest = useRef(api.computed.preview);\n previewRequest.current = api.computed.preview;\n const fieldStatsRequest = useRef(api.fieldStats);\n fieldStatsRequest.current = api.fieldStats;\n const catalogueKey = JSON.stringify(catalogue.map((field) => field.name));\n useEffect(() => {\n const ac = new AbortController();\n void fieldStatsRequest\n .current(\n catalogue.map((field) => field.name),\n ac.signal,\n )\n .then((result) => {\n if (!ac.signal.aborted) setFieldStats(result);\n })\n .catch(() => {\n // Stats are an optional enhancement; catalogue browsing still works.\n });\n return () => ac.abort();\n // catalogueKey captures membership without refetching when refreshes merely\n // recreate catalogue/API objects.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [catalogueKey]);\n useEffect(() => {\n const ac = new AbortController();\n setPreview(null);\n setError(null);\n setPage(0);\n setInspection(null);\n if (\n validation.error ||\n !Number.isInteger(count) ||\n count < 1 ||\n count > 10000\n ) {\n setLoading(false);\n return;\n }\n setLoading(true);\n const timer = setTimeout(() => {\n const request = previewRequest.current;\n void request(\n expression,\n count,\n ac.signal,\n editing ? id : undefined,\n editing,\n )\n .then((result) => {\n if (!ac.signal.aborted) setPreview(result);\n })\n .catch((e) => {\n if (!ac.signal.aborted)\n setError(e instanceof Error ? e.message : String(e));\n })\n .finally(() => {\n if (!ac.signal.aborted) setLoading(false);\n });\n }, 400);\n return () => {\n ac.abort();\n clearTimeout(timer);\n };\n }, [expression, count, editing, id, previewPlanKey, retry]);\n const move = (field: string, index: number) =>\n setColumns((cols) => {\n const next = cols.filter((c) => c.field !== field),\n item = cols.find((c) => c.field === field);\n if (item) next.splice(Math.max(0, Math.min(index, next.length)), 0, item);\n return next;\n });\n const toggle = (field: string) =>\n setColumns((cols) =>\n cols.some((c) => c.field === field)\n ? cols.filter((c) => c.field !== field)\n : [...cols, { field }],\n );\n function browse(field: string) {\n setActive(field);\n setMobilePanel(\"preview\");\n setEditing(false);\n setNotice(\"\");\n }\n function edit(defId?: string) {\n const def = api.computed.definitions.find((d) => d.id === defId);\n setId(def?.id ?? defId ?? crypto.randomUUID());\n setRevision(def?.revision ?? null);\n setLabel(def?.label ?? defId ?? \"\");\n setSource(\n def?.expression.source ??\n (defId ? \"\" : active ? fieldExpression(active) : \"LEFT([field], 3)\"),\n );\n setEditing(true);\n setMobilePanel(\"preview\");\n setNotice(\"\");\n }\n async function save() {\n setSaving(true);\n setError(null);\n try {\n const def = await api.computed.save(\n {\n id,\n label: label.trim(),\n expression: { language: \"qt-expr\", version: 1, source },\n },\n revision,\n );\n setRevision(def.revision);\n const field = computedFieldName(def.id);\n setActive(field);\n setColumns((cols) =>\n cols.some((c) => c.field === field) ? cols : [...cols, { field }],\n );\n setNotice(\n \"Definition saved. All queries referencing this ID now use this definition. Apply columns to update this query’s layout.\",\n );\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n const groups = useMemo(\n () =>\n orderPreviewGroups(\n (preview?.groups ?? []).filter((g) =>\n filter === \"errors\"\n ? !!g.result.error\n : filter === \"nulls\"\n ? !g.result.error && g.result.value === null\n : true,\n ),\n previewSort,\n ),\n [preview, filter, previewSort],\n );\n const catalogueResults = useMemo(\n () =>\n catalogue\n .filter((f) =>\n `${f.label} ${f.name} ${f.type} ${f.group ?? \"\"}`\n .toLowerCase()\n .includes(search.toLowerCase()),\n )\n .map((field, index) => ({ field, index }))\n .sort((a, b) => {\n const aLow = (fieldStats[a.field.name]?.distinct ?? 2) <= 1;\n const bLow = (fieldStats[b.field.name]?.distinct ?? 2) <= 1;\n return Number(aLow) - Number(bLow) || a.index - b.index;\n })\n .map(({ field }) => field),\n [catalogue, search, fieldStats],\n );\n const shown = groups.slice(page * 50, (page + 1) * 50);\n const samePreviewSortKey = (a: PreviewSortKey, b: PreviewSortKey) => {\n if (a.kind !== b.kind) return false;\n if (a.kind === \"input\" && b.kind === \"input\")\n return a.index === b.index;\n return true;\n };\n const selectPreviewSort = (key: PreviewSortKey, direction: \"asc\" | \"desc\") => {\n setPreviewSort((current) => {\n const sameKey = !!current && samePreviewSortKey(current.key, key);\n return sameKey\n ? { key, direction: current.direction === \"asc\" ? \"desc\" : \"asc\" }\n : { key, direction };\n });\n setPage(0);\n };\n const previewSortDirection = (key: PreviewSortKey) =>\n previewSort && samePreviewSortKey(previewSort.key, key)\n ? previewSort.direction\n : undefined;\n const previewAriaSort = (key: PreviewSortKey) => {\n const direction = previewSortDirection(key);\n return direction === \"asc\"\n ? \"ascending\"\n : direction === \"desc\"\n ? \"descending\"\n : \"none\";\n };\n const previewSortHeader = (\n label: string,\n key: PreviewSortKey,\n direction: \"asc\" | \"desc\" = \"asc\",\n ) => {\n const currentDirection = previewSortDirection(key);\n return (\n <button\n type=\"button\"\n className=\"qt-preview-sort\"\n onClick={() => selectPreviewSort(key, direction)}\n title={`Sort by ${label}`}\n >\n {label}\n {currentDirection && <Icon name={currentDirection === \"asc\" ? \"arrowUp\" : \"arrowDown\"} />}\n </button>\n );\n };\n return (\n <ModalSurface title=\"Select columns\" onClose={onClose} className={`qt-select-editor qt-select-editor--${mobilePanel}`} chrome={false}>\n <header className=\"qt-select-editor-header\">\n <div>\n <h2 id={titleId}>Select columns</h2>\n <p>\n Arrange your view, explore values, and create reusable computed\n columns.\n </p>\n </div>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={onClose}\n aria-label=\"Close column editor\"\n >\n <Icon name=\"close\" />\n </button>\n </header>\n <nav className=\"qt-editor-mobile-nav\" aria-label=\"Column editor sections\">\n {[[\"selected\", `Selected (${columns.length})`], [\"catalogue\", \"Catalogue\"], [\"preview\", \"Preview\"]].map(([panel, name]) => (\n <button key={panel} type=\"button\" className=\"qt-btn\" aria-pressed={mobilePanel === panel} onClick={() => setMobilePanel(panel!)}>{name}</button>\n ))}\n </nav>\n <div className={`qt-select-editor-body qt-select-editor-body--${mobilePanel}`}>\n <aside className=\"qt-selected-panel\">\n <h3>\n Selected <span className=\"qt-muted\">{columns.length}</span>\n </h3>\n {mobile ? (\n <ReorderList\n className=\"qt-editor-columns\"\n showHint={false}\n items={columns.map((column) => ({ id: column.field, label: catalogue.find((field) => field.name === column.field)?.label ?? column.field }))}\n onMove={move}\n renderItem={(item) => (\n <>\n <button type=\"button\" className=\"qt-column-name\" onClick={() => browse(item.id)}>{item.label}</button>\n <button type=\"button\" className=\"qt-icon-btn\" onClick={() => toggle(item.id)} aria-label={`Remove ${item.label}`}><Icon name=\"close\" /></button>\n </>\n )}\n />\n ) : (\n <ol className=\"qt-editor-columns\">\n {columns.map((c, i) => {\n const f = catalogue.find((f) => f.name === c.field);\n return (\n <li\n key={c.field}\n draggable\n onDragStart={(e) => {\n drag.current = c.field;\n e.dataTransfer.setData(\"text/plain\", c.field);\n }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault();\n if (drag.current) move(drag.current, i);\n drag.current = null;\n }}\n onDragEnd={() => {\n drag.current = null;\n }}\n >\n <Icon name=\"grip\" />\n <button\n type=\"button\"\n className=\"qt-column-name\"\n onClick={() => browse(c.field)}\n >\n {f?.label ?? c.field}\n </button>\n <button\n type=\"button\"\n className=\"qt-icon-btn qt-editor-move\"\n disabled={i === 0}\n onClick={() => move(c.field, i - 1)}\n aria-label={`Move ${f?.label ?? c.field} up`}\n >\n <Icon name=\"arrowUp\" />\n </button>\n <button\n type=\"button\"\n className=\"qt-icon-btn qt-editor-move\"\n disabled={i === columns.length - 1}\n onClick={() => move(c.field, i + 1)}\n aria-label={`Move ${f?.label ?? c.field} down`}\n >\n <Icon name=\"arrowDown\" />\n </button>\n <button\n type=\"button\"\n className=\"qt-icon-btn\"\n onClick={() => toggle(c.field)}\n aria-label={`Remove ${f?.label ?? c.field}`}\n >\n <Icon name=\"close\" />\n </button>\n </li>\n );\n })}\n </ol>\n )}\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() =>\n setColumns(\n api.defaults.select.length\n ? api.defaults.select\n : catalogue\n .filter((f) => f.select?.default)\n .map((f) => ({ field: f.name })),\n )\n }\n >\n Use default columns\n </button>\n </aside>\n <aside className=\"qt-catalogue-panel\">\n <h3>Column catalogue</h3>\n <input\n className=\"qt-input\"\n aria-label=\"Search columns\"\n placeholder=\"Search name or type…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <button\n type=\"button\"\n className=\"qt-btn qt-create-computed\"\n onClick={() => edit()}\n >\n <Icon name=\"add\" />Computed column\n </button>\n {api.computed.loading && <p role=\"status\">Loading definitions…</p>}\n {api.computed.error && <p role=\"alert\">{api.computed.error}</p>}\n <div className=\"qt-catalogue-list\">\n {catalogueResults.map((f) => {\n const distinct = fieldStats[f.name]?.distinct;\n return (\n <div\n className={`qt-catalogue-item ${active === f.name && !editing ? \"is-active\" : \"\"} ${distinct != null && distinct <= 1 ? \"is-low-cardinality\" : \"\"}`}\n key={f.name}\n >\n <input\n type=\"checkbox\"\n aria-label={`Include ${f.label}`}\n checked={columns.some((c) => c.field === f.name)}\n onChange={() => toggle(f.name)}\n />\n <button type=\"button\" onClick={() => browse(f.name)}>\n <strong>{f.label}</strong>\n <small>\n {isComputedField(f.name) ? \"Computed · \" : \"\"}\n {f.type} · {f.group ?? f.name}\n {distinct != null &&\n ` · ${distinct.toLocaleString()} distinct`}\n </small>\n </button>\n </div>\n );\n })}\n </div>\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() => void api.computed.reload()}\n >\n Reload shared definitions\n </button>\n </aside>\n <section className=\"qt-column-workbench\">\n {editing ? (\n <>\n <div className=\"qt-editor-title\">\n <h3>\n {revision\n ? \"Edit shared computed column\"\n : \"New computed column\"}\n </h3>\n <span className=\"qt-type-badge\">\n {validation.plan?.type ?? \"Check formula\"}\n </span>\n </div>\n <label className=\"qt-editor-label\">\n Column name\n <input\n className=\"qt-input\"\n value={label}\n maxLength={200}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"e.g. Email domain\"\n />\n </label>\n <Suspense\n fallback={\n <textarea\n aria-label=\"Computed column formula\"\n value={source}\n onChange={(e) => setSource(e.target.value)}\n />\n }\n >\n <FormulaEditor\n value={source}\n onChange={setSource}\n fields={api.computed.catalogue.filter(\n (f) => f.name !== computedFieldName(id),\n )}\n compile={(value) => api.computed.compile(value, id)}\n />\n </Suspense>\n <details className=\"qt-function-library\">\n <summary>Functions & examples</summary>\n <input\n className=\"qt-input\"\n aria-label=\"Search functions\"\n placeholder=\"Search functions…\"\n value={functionSearch}\n onChange={(e) => setFunctionSearch(e.target.value)}\n />\n <div className=\"qt-function-list\">\n {FORMULA_FUNCTIONS.filter((f) =>\n `${f.name} ${f.description}`\n .toLowerCase()\n .includes(functionSearch.toLowerCase()),\n ).map((f) => (\n <button\n type=\"button\"\n key={f.name}\n title={f.description}\n onClick={() => setSource(`${f.name}(${source})`)}\n >\n <code>{f.signature}</code>\n <small>{f.description}</small>\n </button>\n ))}\n </div>\n <p>\n Examples: <code>LEFT([name], 3)</code> ·{\" \"}\n <code>IF([amount] &gt; 100, \"High\", \"Low\")</code> ·{\" \"}\n <code>REGEX_EXTRACT([email], \"@(.+)$\", 1)</code>\n </p>\n </details>\n <div className=\"qt-definition-actions\">\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={saving || !!validation.error || !label.trim()}\n onClick={() => void save()}\n >\n {saving\n ? \"Saving…\"\n : revision\n ? \"Save shared definition\"\n : \"Save definition & add column\"}\n </button>\n {revision && (\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() => edit(id)}\n >\n Reload editor from catalogue\n </button>\n )}\n </div>\n <p className=\"qt-muted\">\n Saving changes this definition across all queries. Cancel\n below only discards column layout changes.\n </p>\n </>\n ) : (\n <div className=\"qt-editor-title\">\n <div>\n <h3>{chosen?.label ?? \"Explore a column\"}</h3>\n <p className=\"qt-muted\">\n {chosen?.name} {chosen ? `· ${chosen.type}` : \"\"}\n </p>\n </div>\n {chosen && isComputedField(chosen.name) && (\n <>\n <button\n type=\"button\"\n className=\"qt-btn\"\n aria-label=\"Edit definition\"\n title=\"Edit definition\"\n onClick={() => edit(chosen.name.slice(10))}\n >\n <Icon name=\"pencil\" />\n </button>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={() => {\n const def = api.computed.definitions.find(\n (d) => computedFieldName(d.id) === chosen.name,\n );\n edit();\n if (def) {\n setLabel(`${def.label} copy`);\n setSource(def.expression.source);\n }\n }}\n >\n Duplicate\n </button>\n </>\n )}\n </div>\n )}\n <div className=\"qt-preview-controls\">\n <label>\n Rows to process{\" \"}\n <input\n className=\"qt-input\"\n type=\"number\"\n min={1}\n max={10000}\n step={1}\n value={Number.isNaN(count) ? \"\" : count}\n onChange={(e) => setCount(e.target.valueAsNumber)}\n />\n </label>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={() => setRetry((n) => n + 1)}\n >\n Refresh preview\n </button>\n <label>\n Show{\" \"}\n <select\n value={filter}\n onChange={(e) => {\n setFilter(e.target.value);\n setPage(0);\n }}\n >\n <option value=\"all\">All results</option>\n <option value=\"nulls\">Null results</option>\n <option value=\"errors\">Errors</option>\n </select>\n </label>\n </div>\n <p className=\"qt-muted\">\n First matching rows in current sort order, starting at row 1.\n Counts describe the processed sample. Maximum 10,000 rows.\n </p>\n {(!Number.isInteger(count) || count < 1 || count > 10000) && (\n <p role=\"alert\">Choose a whole number between 1 and 10,000.</p>\n )}\n {validation.error && (\n <p className=\"qt-formula-error\" role=\"alert\">\n {validation.error}\n </p>\n )}\n {error && (\n <p className=\"qt-formula-error\" role=\"alert\">\n {error}\n </p>\n )}\n {notice && (\n <p className=\"qt-editor-notice\" role=\"status\">\n {notice}\n </p>\n )}\n {loading && <p role=\"status\">Processing preview…</p>}\n {preview && (\n <>\n <p className=\"qt-preview-summary\" role=\"status\">\n <strong>{preview.processed.toLocaleString()}</strong> of{\" \"}\n {preview.total.toLocaleString()} matching rows ·{\" \"}\n <strong>{preview.groups.length.toLocaleString()}</strong>{\" \"}\n distinct combinations · {preview.nulls.toLocaleString()} null\n · {preview.errors.toLocaleString()} errors\n {preview.processed === preview.total\n ? \" · complete filtered set\"\n : \" · sample\"}\n </p>\n <div className=\"qt-preview-table-wrap\">\n <table className=\"qt-preview-table\">\n <thead>\n <tr>\n {editing &&\n preview.dependencies.map((name, index) => (\n <th\n key={name}\n aria-sort={previewAriaSort({\n kind: \"input\",\n index,\n })}\n >\n {previewSortHeader(\n api.computed.catalogue.find(\n (f) => f.name === name,\n )?.label ?? name,\n { kind: \"input\", index },\n )}\n </th>\n ))}\n <th aria-sort={previewAriaSort({ kind: \"result\" })}>\n {previewSortHeader(editing ? \"Result\" : \"Value\", {\n kind: \"result\",\n })}\n </th>\n <th aria-sort={previewAriaSort({ kind: \"count\" })}>\n {previewSortHeader(\"Count\", { kind: \"count\" }, \"desc\")}\n </th>\n <th aria-sort={previewAriaSort({ kind: \"percentage\" })}>\n {previewSortHeader(\"%\", { kind: \"percentage\" }, \"desc\")}\n </th>\n </tr>\n </thead>\n <tbody>\n {shown.map((group, i) => (\n <tr key={i}>\n {editing &&\n group.inputs.map((value, j) => (\n <td key={j} title={display(value)}>\n {display(value)}\n </td>\n ))}\n <td\n className={\n group.result.error ? \"qt-formula-error\" : \"\"\n }\n title={\n group.result.error ?? display(group.result.value)\n }\n >\n {group.result.error ?? display(group.result.value)}\n {group.result.regex && (\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() =>\n setInspection(group.result.regex!)\n }\n >\n Inspect match\n </button>\n )}\n </td>\n <td>{group.count.toLocaleString()}</td>\n <td>\n {((100 * group.count) / preview.processed).toFixed(\n 1,\n )}\n %\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {inspection && (\n <div className=\"qt-regex-inspector\">\n <h4>Regex match</h4>\n <pre>\n {inspection.input.slice(0, inspection.start)}\n <mark>\n {inspection.input.slice(\n inspection.start,\n inspection.end,\n )}\n </mark>\n {inspection.input.slice(inspection.end)}\n </pre>\n <dl>\n {inspection.groups.map((value, i) => (\n <div key={i}>\n <dt>\n Group {i}\n {i === 0 ? \" (whole match)\" : \"\"}\n </dt>\n <dd>{display(value)}</dd>\n </div>\n ))}\n </dl>\n </div>\n )}\n {!groups.length && <p>No matching results in this sample.</p>}\n {groups.length > 50 && (\n <div className=\"qt-preview-pages\">\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={page === 0}\n onClick={() => setPage((n) => n - 1)}\n >\n Previous\n </button>\n <span>\n Combinations {page * 50 + 1}–\n {Math.min((page + 1) * 50, groups.length)} of{\" \"}\n {groups.length}\n </span>\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={(page + 1) * 50 >= groups.length}\n onClick={() => setPage((n) => n + 1)}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </section>\n </div>\n <footer className=\"qt-select-editor-footer\">\n <span className=\"qt-muted\">\n Computed columns are display-only. Select at least one column.\n </span>\n <button type=\"button\" className=\"qt-btn\" onClick={onClose}>\n Cancel layout changes\n </button>\n <button\n type=\"button\"\n className=\"qt-btn qt-primary\"\n disabled={!columns.length || columns.length > 200}\n onClick={() => {\n api.setQuery((q) => ({ ...q, select: columns }));\n onClose();\n }}\n >\n Apply columns\n </button>\n </footer>\n </ModalSurface>\n );\n}\n","import { Icon } from \"./Icon\";\nimport { useRef, useState, type ReactNode } from \"react\";\n\nexport interface ReorderItem {\n id: string;\n label: string;\n}\n\ninterface ReorderGesture {\n id: string;\n position: number;\n target: number;\n scrollTop: number;\n layout: Array<{ id: string; top: number; left: number; width: number; height: number; advance: number }>;\n}\n\nexport function ReorderList({ items, onMove, disabled, className, renderItem, showHint = true, layout = \"vertical\" }: {\n items: ReorderItem[];\n onMove: (id: string, position: number) => void;\n disabled?: boolean | undefined;\n className?: string;\n renderItem?: (item: ReorderItem, position: number) => ReactNode;\n showHint?: boolean;\n layout?: \"vertical\" | \"wrap\";\n}): ReactNode {\n const list = useRef<HTMLOListElement>(null);\n const scrollContainer = useRef<HTMLElement | null>(null);\n const gesture = useRef<ReorderGesture | null>(null);\n const [drag, setDrag] = useState<{ id: string; target: number; offsets: Record<string, { x: number; y: number }> } | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n const move = (item: ReorderItem, position: number) => {\n onMove(item.id, position);\n setAnnouncement(`${item.label} moved to position ${position + 1} of ${items.length}`);\n };\n return (\n <>\n {showHint && <p className=\"qt-reorder-hint qt-muted\">Drag handles to reorder.</p>}\n <ol ref={list} className={`qt-reorder-list${className ? ` ${className}` : \"\"}`}>\n {items.map((item, position) => (\n <li key={item.id} data-reorder-id={item.id} style={drag ? { transform: layout === \"wrap\" ? `translate(${drag.offsets[item.id]?.x ?? 0}px, ${drag.offsets[item.id]?.y ?? 0}px)` : `translateY(${drag.offsets[item.id]?.y ?? 0}px)` } : undefined} className={drag?.id === item.id ? \"qt-reorder-item qt-reorder-item--dragging\" : \"qt-reorder-item\"}>\n <button\n type=\"button\"\n className=\"qt-reorder-handle\"\n disabled={disabled}\n aria-label={`Drag to reorder ${item.label}`}\n onPointerDown={(event) => {\n if (event.button !== 0 || disabled) return;\n event.preventDefault();\n event.currentTarget.focus();\n event.currentTarget.setPointerCapture(event.pointerId);\n const rows = Array.from(list.current?.querySelectorAll<HTMLElement>(\"li\") ?? []);\n const positions = rows.map((row, index) => {\n const bounds = row.getBoundingClientRect();\n const next = rows[index + 1]?.getBoundingClientRect();\n const advance = next ? next.top - bounds.top : bounds.height + (parseFloat(getComputedStyle(row).marginBottom) || 0);\n return { id: row.dataset.reorderId!, top: bounds.top, left: bounds.left, width: bounds.width, height: bounds.height, advance };\n });\n let scroller: HTMLElement | null = list.current;\n while (scroller && (!/auto|scroll/.test(getComputedStyle(scroller).overflowY) || scroller.scrollHeight <= scroller.clientHeight)) scroller = scroller.parentElement;\n scrollContainer.current = scroller ?? document.scrollingElement as HTMLElement | null;\n gesture.current = { id: item.id, position, target: position, layout: positions, scrollTop: scrollContainer.current?.scrollTop ?? 0 };\n setDrag({ id: item.id, target: position, offsets: {} });\n }}\n onPointerMove={(event) => {\n const current = gesture.current;\n if (!current) return;\n const scrollDelta = (scrollContainer.current?.scrollTop ?? 0) - current.scrollTop;\n let target = current.layout.findIndex((row) => event.clientY < row.top + row.advance - scrollDelta);\n if (layout === \"wrap\") {\n let nearest = Infinity;\n current.layout.forEach((row, index) => {\n const distanceX = Math.max(row.left - event.clientX, 0, event.clientX - row.left - row.width);\n const distanceY = Math.max(row.top - scrollDelta - event.clientY, 0, event.clientY - row.top + scrollDelta - row.height);\n const distance = distanceX * distanceX + distanceY * distanceY;\n if (distance < nearest) {\n nearest = distance;\n target = index;\n }\n });\n }\n if (target < 0) target = items.length - 1;\n target = Math.max(0, Math.min(target, items.length - 1));\n if (target !== current.target) {\n current.target = target;\n const preview = [...current.layout];\n const [source] = preview.splice(current.position, 1);\n if (source) preview.splice(target, 0, source);\n let top = current.layout[0]?.top ?? 0;\n let left = list.current?.getBoundingClientRect().left ?? 0;\n const firstLeft = left;\n const right = list.current?.getBoundingClientRect().right ?? Infinity;\n const style = list.current ? getComputedStyle(list.current) : null;\n const columnGap = parseFloat(style?.columnGap ?? \"0\") || 0;\n const rowGap = parseFloat(style?.rowGap ?? \"0\") || 0;\n let rowHeight = 0;\n const offsets: Record<string, { x: number; y: number }> = {};\n for (const row of preview) {\n if (layout === \"wrap\") {\n if (left > firstLeft && left + row.width > right + 1) {\n left = firstLeft;\n top += rowHeight + rowGap;\n rowHeight = 0;\n }\n offsets[row.id] = { x: left - row.left, y: top - row.top };\n left += row.width + columnGap;\n rowHeight = Math.max(rowHeight, row.height);\n } else {\n offsets[row.id] = { x: 0, y: top - row.top };\n top += row.advance;\n }\n }\n setDrag({ id: current.id, target, offsets });\n }\n const scroller = scrollContainer.current;\n if (scroller) {\n const bounds = scroller === document.scrollingElement ? { top: 0, bottom: window.innerHeight } : scroller.getBoundingClientRect();\n if (event.clientY > bounds.bottom - 48) scroller.scrollTop += 16;\n if (event.clientY < bounds.top + 48) scroller.scrollTop -= 16;\n }\n }}\n onPointerUp={() => {\n const current = gesture.current;\n gesture.current = null;\n setDrag(null);\n if (current && current.position !== current.target) move(item, current.target);\n }}\n onPointerCancel={() => {\n gesture.current = null;\n setDrag(null);\n }}\n onKeyDown={(event) => {\n if (disabled) return;\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\" || (layout === \"wrap\" && (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\"))) {\n event.preventDefault();\n move(item, Math.max(0, Math.min(items.length - 1, position + (event.key === \"ArrowUp\" || event.key === \"ArrowLeft\" ? -1 : 1))));\n }\n }}\n ><Icon name=\"grip\" /></button>\n {renderItem ? renderItem(item, position) : <span className=\"qt-reorder-label\">{item.label}</span>}\n </li>\n ))}\n </ol>\n <span className=\"qt-sr-only\" role=\"status\">{announcement}</span>\n </>\n );\n}\n","import type { PreviewGroup } from \"@pythia-software/query-table-core\";\n\nexport type PreviewSortKey =\n | { kind: \"input\"; index: number }\n | { kind: \"result\" }\n | { kind: \"count\" }\n | { kind: \"percentage\" };\n\nexport interface PreviewSort {\n key: PreviewSortKey;\n direction: \"asc\" | \"desc\";\n}\n\nconst collator = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: \"base\",\n});\n\nconst valueLabel = (value: unknown) =>\n value === null\n ? \"NULL\"\n : typeof value === \"string\"\n ? value\n : JSON.stringify(value);\n\nfunction mixedRank(group: PreviewGroup) {\n // A stable hash gives each distinct combination a pseudo-random position.\n // Unlike source, alphabetic, or frequency order, the first page therefore\n // contains a representative mix without changing between renders.\n const value = JSON.stringify([\n group.inputs,\n group.result.value,\n group.result.error ?? null,\n ]);\n let hash = 2166136261;\n for (let i = 0; i < value.length; i++)\n hash = Math.imul(hash ^ value.charCodeAt(i), 16777619);\n return hash >>> 0;\n}\n\nfunction compareValue(a: unknown, b: unknown) {\n return collator.compare(valueLabel(a), valueLabel(b));\n}\n\nfunction sortValue(group: PreviewGroup, key: PreviewSortKey) {\n switch (key.kind) {\n case \"input\":\n return group.inputs[key.index] ?? null;\n case \"result\":\n return group.result.error ?? group.result.value;\n case \"count\":\n case \"percentage\":\n return group.count;\n }\n}\n\n/**\n * Preview groups start in a stable mixed order. A user-selected header replaces\n * that order with the requested alphabetical or numeric order.\n */\nexport function orderPreviewGroups(\n groups: PreviewGroup[],\n sort: PreviewSort | null,\n) {\n return groups\n .map((group, index) => ({ group, index }))\n .sort((a, b) => {\n if (!sort) {\n const rank = mixedRank(a.group) - mixedRank(b.group);\n return rank || a.index - b.index;\n }\n const comparison = compareValue(\n sortValue(a.group, sort.key),\n sortValue(b.group, sort.key),\n );\n return (sort.direction === \"asc\" ? comparison : -comparison) ||\n a.index - b.index;\n })\n .map(({ group }) => group);\n}\n","import { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport type { ColumnPreview } from \"@pythia-software/query-table-core\";\nimport type { QueryTableApi } from \"@pythia-software/query-table-react\";\nimport { ModalSurface } from \"./AdaptiveOverlay\";\nimport { Icon } from \"./Icon\";\nimport { previewSortExtraction, type SortExtractionResult } from \"./sortExtractionPreview\";\n\nexport function SortExtractionEditor<Row>({ api, field, label, fieldOptions, onFieldChange, title, applyLabel = \"Apply extraction\", initialPattern, disabled, onApply, onRemove, onClose }: {\n api: QueryTableApi<Row>;\n field: string;\n label: string;\n /** When set, the editor shows a field picker so a new sort can be configured from scratch. */\n fieldOptions?: Array<{ name: string; label: string }> | undefined;\n onFieldChange?: ((field: string) => void) | undefined;\n title?: string | undefined;\n applyLabel?: string | undefined;\n initialPattern?: string | undefined;\n disabled?: boolean | undefined;\n onApply: (pattern: string) => void;\n onRemove: () => void;\n onClose: () => void;\n}) {\n const [pattern, setPattern] = useState(initialPattern ?? \"\");\n const [sample, setSample] = useState<ColumnPreview | null>(null);\n const [sampleError, setSampleError] = useState<string | null>(null);\n const [preview, setPreview] = useState<{ pattern: string; sample: ColumnPreview; results: SortExtractionResult[]; error?: string } | null>(null);\n const request = useRef(api.computed.preview);\n request.current = api.computed.preview;\n const inputId = useId();\n const fieldId = useId();\n const helpId = useId();\n const patternError = useMemo(() => {\n try {\n new RegExp(pattern);\n return null;\n } catch (error) {\n return error instanceof Error ? error.message : \"Invalid regular expression.\";\n }\n }, [pattern]);\n\n useEffect(() => {\n const controller = new AbortController();\n setSample(null);\n setSampleError(null);\n void request.current(`[${field.replace(/\\]/g, \"]]\")}]`, 100, controller.signal).then((result) => {\n if (!controller.signal.aborted) setSample(result);\n }).catch((error) => {\n if (!controller.signal.aborted) setSampleError(error instanceof Error ? error.message : String(error));\n });\n return () => controller.abort();\n }, [field]);\n\n useEffect(() => {\n if (!sample || patternError) return;\n const controller = new AbortController();\n const timer = setTimeout(() => {\n void previewSortExtraction(pattern, sample.groups.map((group) => group.result.value), controller.signal).then((results) => {\n if (!controller.signal.aborted) setPreview({ pattern, sample, results });\n }).catch((error) => {\n if (!controller.signal.aborted) setPreview({ pattern, sample, results: [], error: error instanceof Error ? error.message : String(error) });\n });\n }, 200);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [pattern, patternError, sample]);\n\n const currentPreview = preview?.pattern === pattern && preview.sample === sample ? preview : null;\n const previewWarning = sampleError ?? currentPreview?.error;\n const heading = title ?? `Regex extraction for ${label}`;\n const textValue = (value: unknown) => value == null ? \"NULL\" : String(value) === \"\" ? '\"\"' : String(value);\n\n return (\n <ModalSurface title={heading} onClose={onClose} className=\"qt-sort-extract-editor\" chrome={false}>\n <header className=\"qt-overlay-header\">\n <h2>{heading}</h2>\n <button type=\"button\" className=\"qt-btn\" onClick={onClose} aria-label={title ? `Close ${title.toLowerCase()}` : `Close regex extraction for ${label}`}><Icon name=\"close\" /></button>\n </header>\n <div className=\"qt-overlay-body\">\n {fieldOptions && (\n <>\n <label className=\"qt-sort-extract-label\" htmlFor={fieldId}>Field</label>\n <select id={fieldId} className=\"qt-input qt-sort-extract-field\" value={field} disabled={disabled} onChange={(event) => onFieldChange?.(event.target.value)}>\n {fieldOptions.map((option) => <option key={option.name} value={option.name}>{option.label}</option>)}\n </select>\n </>\n )}\n <label className=\"qt-sort-extract-label\" htmlFor={inputId}>Regular expression</label>\n <input id={inputId} className=\"qt-input qt-sort-extract-input\" value={pattern} onChange={(event) => setPattern(event.target.value)} aria-label={`Regex extract for ${label}`} aria-describedby={helpId} aria-invalid={Boolean(patternError)} disabled={disabled} autoComplete=\"off\" spellCheck={false} placeholder=\"e.g. (\\d+)\" />\n <p id={helpId} className=\"qt-sort-extract-help\">Sort by the first capture group, or the whole match if there are no groups. Unmatched values become NULL; the sort’s null placement still applies.</p>\n {patternError && <p className=\"qt-sort-extract-error\" role=\"alert\">{patternError}</p>}\n {previewWarning && <p className=\"qt-sort-extract-error\" role=\"alert\">Preview unavailable: {previewWarning}. You can still apply a valid pattern.</p>}\n {Boolean(sample?.errors) && <p className=\"qt-sort-extract-error\" role=\"alert\">Some sampled values could not be read. The preview may be incomplete; you can still apply a valid pattern.</p>}\n <p className=\"qt-sort-extract-status\" role=\"status\">{!sample && !sampleError ? \"Loading sample…\" : !currentPreview && !patternError && !previewWarning ? \"Updating preview…\" : sample ? `Preview of ${sample.processed} matching rows (${sample.groups.length} distinct values).` : \"Sample unavailable.\"}</p>\n <div className=\"qt-sort-extract-table-wrap\">\n <table className=\"qt-sort-extract-table\">\n <caption>Extraction preview</caption>\n <thead><tr><th scope=\"col\">Original value</th><th scope=\"col\">Extracted sort value</th><th scope=\"col\">Rows</th></tr></thead>\n <tbody>{sample?.groups.map((group, index) => {\n const result = currentPreview?.results[index];\n return <tr key={index}><td>{group.result.error ? \"Value error\" : textValue(group.result.value)}</td><td>{result ? <><code>{textValue(result.extracted)}</code>{!result.matched && <small>{group.result.value == null ? \"Null input\" : \"No match\"}</small>}</> : \"—\"}</td><td>{group.count}</td></tr>;\n })}</tbody>\n </table>\n </div>\n {sample?.processed === 0 && <p className=\"qt-muted\">No matching rows to preview. You can still apply a valid pattern.</p>}\n </div>\n <footer className=\"qt-sort-extract-footer\">\n {initialPattern !== undefined && <button type=\"button\" className=\"qt-link-btn\" disabled={disabled} onClick={onRemove} aria-label={`Remove regex extract for ${label}`}>Remove extraction</button>}\n <button type=\"button\" className=\"qt-btn\" onClick={onClose}>Cancel</button>\n <button type=\"button\" className=\"qt-btn qt-btn--primary\" disabled={disabled || Boolean(patternError)} onClick={() => onApply(pattern)}>{applyLabel}</button>\n </footer>\n </ModalSurface>\n );\n}\n","export interface SortExtractionResult {\n extracted: string | null;\n matched: boolean;\n}\n\nexport function extractSortSamples(pattern: string, values: unknown[]): SortExtractionResult[] {\n const regex = new RegExp(pattern);\n return values.map((value) => {\n const match = value == null ? null : regex.exec(String(value));\n return { extracted: match ? (match.length > 1 ? match[1] ?? null : match[0]!) : null, matched: match != null };\n });\n}\n\nexport function previewSortExtraction(pattern: string, values: unknown[], signal: AbortSignal): Promise<SortExtractionResult[]> {\n if (signal.aborted) return Promise.reject(new DOMException(\"Aborted\", \"AbortError\"));\n if (!values.length) return Promise.resolve([]);\n return new Promise((resolve, reject) => {\n let worker: Worker;\n try {\n const url = URL.createObjectURL(new Blob([`const extract = ${extractSortSamples.toString()}; self.onmessage = event => { try { self.postMessage({ results: extract(event.data.pattern, event.data.values) }); } catch (error) { self.postMessage({ error: error.message }); } };`], { type: \"text/javascript\" }));\n try {\n worker = new Worker(url);\n } finally {\n URL.revokeObjectURL(url);\n }\n } catch {\n reject(new Error(\"Regex preview worker unavailable. Check your browser’s worker permissions.\"));\n return;\n }\n const cleanup = () => {\n clearTimeout(timer);\n worker.terminate();\n signal.removeEventListener(\"abort\", abort);\n };\n const abort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n const timer = setTimeout(() => {\n cleanup();\n reject(new Error(\"Regex preview timed out. Simplify the pattern.\"));\n }, 2000);\n signal.addEventListener(\"abort\", abort, { once: true });\n worker.onmessage = (event: MessageEvent<{ results: SortExtractionResult[]; error?: string }>) => {\n cleanup();\n if (event.data.error) reject(new Error(event.data.error));\n else resolve(event.data.results);\n };\n worker.onerror = () => {\n cleanup();\n reject(new Error(\"Regex preview worker failed.\"));\n };\n try {\n worker.postMessage({ pattern, values });\n } catch (error) {\n cleanup();\n reject(error);\n }\n });\n}\n","import { useEffect, useId, useRef, useState } from \"react\";\nimport { filterValues, opsForField, type FieldDef, type SetFilterMode } from \"@pythia-software/query-table-core\";\nimport type { QueryTableApi } from \"@pythia-software/query-table-react\";\nimport { PresentedFilterValue, useFilterValuePresentation } from \"./FilterValuePresentation\";\nimport type { QueryBuilderClassNames } from \"./classNames\";\n\nexport function SetFilterEditor<Row>({ api, field, anchor, returnFocus, classNames, mode: initialMode, values: initialValues, disabled, maxPredicates, onApply, onClose }: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row>;\n anchor: HTMLElement;\n returnFocus: HTMLElement;\n classNames: QueryBuilderClassNames | undefined;\n mode: SetFilterMode;\n values: string[];\n disabled: boolean | undefined;\n maxPredicates: number;\n onApply: (mode: SetFilterMode, values: string[]) => void;\n onClose: () => void;\n}) {\n const [mode, setMode] = useState(initialMode);\n const [values, setValues] = useState([...initialValues]);\n const [search, setSearch] = useState(\"\");\n const [suggestions, setSuggestions] = useState<string[]>([]);\n const [error, setError] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [position, setPosition] = useState({ top: 16, left: 16 });\n const dialog = useRef<HTMLDivElement>(null);\n const searchInput = useRef<HTMLInputElement>(null);\n const headingId = useId();\n const presentation = useFilterValuePresentation();\n const strategy = filterValues(field);\n const ops = opsForField(field);\n const allowsMode = (candidate: SetFilterMode) => candidate === \"empty\" ? ops.includes(\"is_null\") : ops.includes(\"includes\") && (candidate !== \"none\" || ops.includes(\"is_null\"));\n const predicateCount = mode === \"empty\" ? 1 : values.length * (mode === \"none\" ? 2 : 1);\n const exceedsBudget = predicateCount > maxPredicates;\n const options = strategy.source === \"static\" ? strategy.options.map((option) => typeof option === \"string\" ? { value: option, label: option } : option) : suggestions.map((value) => ({ value, label: value }));\n const labelFor = (value: string) => presentation.label?.(field.name, value) ?? options.find((option) => option.value === value)?.label ?? value;\n const visible = options.filter((option) => `${option.value} ${option.label} ${labelFor(option.value)}`.toLowerCase().includes(search.toLowerCase()));\n const canCreate = strategy.source !== \"static\" && search.trim().length > 0;\n const showCreate = canCreate && !values.includes(search) && !options.some((option) => option.value === search);\n\n useEffect(() => {\n const rect = anchor.getBoundingClientRect();\n setPosition({ top: Math.max(16, Math.min(rect.bottom + 8, window.innerHeight - 480)), left: Math.max(16, Math.min(rect.left, window.innerWidth - 472)) });\n dialog.current?.querySelector<HTMLElement>(\"select\")?.focus();\n return () => { if (returnFocus.isConnected) returnFocus.focus(); };\n }, [anchor, returnFocus]);\n\n useEffect(() => {\n if (strategy.source !== \"autocomplete\") return;\n let cancelled = false;\n setLoading(true);\n setError(\"\");\n const timer = setTimeout(() => {\n api.filterValues(field.name, search).then((result) => {\n if (!cancelled) setSuggestions(result.values);\n }).catch(() => {\n if (!cancelled) setError(\"Could not load values. Try searching again.\");\n }).finally(() => {\n if (!cancelled) setLoading(false);\n });\n }, 150);\n return () => { cancelled = true; clearTimeout(timer); };\n }, [api.filterValues, field.name, strategy.source, search]);\n\n function toggle(value: string) {\n setValues((previous) => previous.includes(value) ? previous.filter((key) => key !== value) : [...previous, value]);\n }\n\n function addValue(value: string) {\n setValues((previous) => previous.includes(value) ? previous : [...previous, value]);\n setSearch(\"\");\n searchInput.current?.focus();\n }\n\n return <div className={[\"qt-set-backdrop\", classNames?.setBackdrop].filter(Boolean).join(\" \")} onClick={(event) => { if (event.target === event.currentTarget) onClose(); }}>\n <div ref={dialog} className={[\"qt-set-editor\", classNames?.setEditor].filter(Boolean).join(\" \")} style={position} role=\"dialog\" aria-modal=\"true\" aria-labelledby={headingId} onKeyDown={(event) => {\n if (event.key === \"Escape\") { event.stopPropagation(); onClose(); }\n if (event.key !== \"Tab\") return;\n const controls = [...dialog.current!.querySelectorAll<HTMLElement>(\"*\")].filter((element) => element.matches(\"button:not(:disabled), input:not(:disabled), select:not(:disabled)\"));\n const first = controls[0];\n const last = controls[controls.length - 1];\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last?.focus(); }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first?.focus(); }\n }}>\n <h3 id={headingId}>Filter {field.label}</h3>\n <label>Match mode <select className={classNames?.select} aria-label=\"Match mode\" value={mode} disabled={disabled} onChange={(event) => setMode(event.target.value as SetFilterMode)}>\n <option value=\"any\" disabled={!allowsMode(\"any\")}>ANY — at least one selected tag</option>\n <option value=\"all\" disabled={!allowsMode(\"all\")}>ALL — every selected tag</option>\n <option value=\"none\" disabled={!allowsMode(\"none\")}>NONE — exclude selected tags, include empty rows</option>\n <option value=\"empty\" disabled={!allowsMode(\"empty\")}>EMPTY — no tags</option>\n </select></label>\n {mode !== \"empty\" && <>\n <div className=\"qt-set-selected\" aria-label=\"Selected tags\">\n {values.map((value) => <span className=\"qt-chip\" key={value}>\n <PresentedFilterValue field={field.name} value={value} label={labelFor(value)} />\n {strategy.source === \"static\" && !options.some((option) => option.value === value) && <small> unavailable: {value}</small>}\n <button type=\"button\" className=\"qt-chip-x\" disabled={disabled} aria-label={`Remove ${labelFor(value)}`} onClick={() => toggle(value)}>✕</button>\n </span>)}\n </div>\n <input ref={searchInput} className={classNames?.input} aria-label={`Search ${field.label} tags`} placeholder=\"Search names or keys\" value={search} onChange={(event) => setSearch(event.target.value)} disabled={disabled} onKeyDown={(event) => {\n if (event.key !== \"Enter\" || event.nativeEvent.isComposing || disabled) return;\n event.preventDefault();\n if (!search.trim()) return;\n const value = visible[0]?.value;\n if (value !== undefined) addValue(value);\n else if (canCreate) addValue(search);\n }} />\n <div className=\"qt-set-options\" role=\"group\" aria-label=\"Available tags\">\n {visible.map((option) => <label key={option.value} className=\"qt-set-option\">\n <input type=\"checkbox\" checked={values.includes(option.value)} disabled={disabled} onChange={() => toggle(option.value)} />\n <PresentedFilterValue field={field.name} value={option.value} label={labelFor(option.value)} />\n {labelFor(option.value) !== option.value && <small>{option.value}</small>}\n </label>)}\n {!visible.length && !loading && <span className=\"qt-muted\">{strategy.source === \"freeform\" ? \"Type a tag and press Enter\" : \"No matching tags\"}</span>}\n </div>\n {showCreate && <button type=\"button\" className={[\"qt-btn\", classNames?.button].filter(Boolean).join(\" \")} disabled={disabled} onClick={() => addValue(search)}>Add “{search}”</button>}\n <span role=\"status\">{loading ? \"Loading tags…\" : error}</span>\n </>}\n {exceedsBudget && <span role=\"alert\">Too many tags for this query. Remove tags or other filters before applying.</span>}\n <div className=\"qt-set-actions\">\n <button type=\"button\" className={[\"qt-btn\", classNames?.button].filter(Boolean).join(\" \")} onClick={onClose}>Cancel</button>\n <button type=\"button\" className={[\"qt-btn\", classNames?.button].filter(Boolean).join(\" \")} disabled={disabled || exceedsBudget || !allowsMode(mode) || (mode !== \"empty\" && values.length === 0)} onClick={() => onApply(mode, mode === \"empty\" ? [] : values)}>Apply filter</button>\n </div>\n </div>\n </div>;\n}\n","import { PresentedFilterValue, PresentedValueInput, useFilterValuePresentation } from \"./FilterValuePresentation\";\n// QueryBuilder — the chip toolbar: WHERE filters, SELECT columns, ORDER BY\n// (multi-sort, reorderable), and LIMIT/OFFSET paging. Type-aware filter inputs\n// (enum/static <select>, value autocomplete via Transport.fetchDistinctValues).\n// Hosts the Save / saved-queries entry point.\n//\n// Combines a chip layout, autocomplete, draggable column chips, a grouped\n// picker, per-clause operators, and multi-sort.\n\nimport { SelectColumnEditor } from \"./SelectColumnEditor\";\nimport { SortExtractionEditor } from \"./SortExtractionEditor\";\nimport { SetFilterEditor } from \"./SetFilterEditor\";\nimport { Fragment, useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type {\n AggOp,\n AggregationClause,\n DistinctValuesResult,\n FieldDef,\n FilterOp,\n OpChoice,\n OrderByClause,\n WhereClause,\n WhereTerm,\n SetFilterMetadata,\n} from \"@pythia-software/query-table-core\";\nimport {\n NULLARY_OPS,\n MAX_WHERE_CLAUSES,\n aggOpNeedsField,\n aggOpsForField,\n encodeQuery,\n filterValues as filterValuesFor,\n isGroupable,\n isMeasurable,\n isOrGroup,\n opPairsForField,\n negateClause,\n predicatesOf,\n queriesEqual,\n isFilterable,\n isSelectable,\n isSortable,\n opsForField,\n createSetFilter,\n readSetFilter,\n} from \"@pythia-software/query-table-core\";\nimport type { QueryTableApi } from \"@pythia-software/query-table-react\";\nimport type { QueryBuilderClassNames } from \"./classNames\";\nimport { FieldPicker } from \"./FieldPicker\";\nimport { SavedQueriesModal } from \"./SavedQueriesModal\";\nimport { formatRowCount, rowCountTitle } from \"./formatRowCount\";\nimport { AdaptiveOverlay, ModalSurface, useMobileLayout } from \"./AdaptiveOverlay\";\nimport { ReorderList } from \"./ReorderList\";\nimport { Icon } from \"./Icon\";\n\nexport interface QueryBuilderProps<Row> {\n /** The controller; QueryBuilder drives it through the intent helpers. */\n api: QueryTableApi<Row>;\n /** All schema fields (for the field picker / sort picker). */\n fields: FieldDef<Row>[];\n /** Total matching rows, for the \"N of M\" paging hint. */\n total: number | null;\n /** Disable inputs while a fetch is in flight. */\n running?: boolean;\n classNames?: QueryBuilderClassNames;\n /** Use this to control collapse state from a parent UI. */\n collapsed?: boolean;\n /** Controlled collapse callback (use when `collapsed` is provided). */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Initial collapse state for uncontrolled mode. */\n defaultCollapsed?: boolean;\n}\n\nconst cx = (...parts: Array<string | undefined | false>): string =>\n parts.filter((p): p is string => Boolean(p)).join(\" \");\n\nconst MAX_AUTO_REFRESH_POLLS = 1000;\nconst DEFAULT_AUTO_REFRESH_FREQUENCY_MS = 20_000;\nconst DEFAULT_AUTO_REFRESH_TURN_OFF_AFTER_MS = 5 * 60_000;\nconst SHARE_FEEDBACK_MS = 2_000;\n\nconst AUTO_REFRESH_FREQUENCIES = [\n { label: \"Every 5s\", value: 5_000 },\n { label: \"Every 10s\", value: 10_000 },\n { label: \"Every 20s\", value: DEFAULT_AUTO_REFRESH_FREQUENCY_MS },\n { label: \"Every 30s\", value: 30_000 },\n { label: \"Every 1m\", value: 60_000 },\n { label: \"Every 2m\", value: 2 * 60_000 },\n { label: \"Every 5m\", value: 5 * 60_000 },\n { label: \"Every 10m\", value: 10 * 60_000 },\n] as const;\n\nconst AUTO_REFRESH_TURN_OFF_AFTER = [\n { label: \"After 5m\", value: DEFAULT_AUTO_REFRESH_TURN_OFF_AFTER_MS },\n { label: \"After 15m\", value: 15 * 60_000 },\n { label: \"After 30m\", value: 30 * 60_000 },\n { label: \"After 1h\", value: 60 * 60_000 },\n { label: \"After 2h\", value: 2 * 60 * 60_000 },\n { label: \"After 4h\", value: 4 * 60 * 60_000 },\n { label: \"After 8h\", value: 8 * 60 * 60_000 },\n { label: \"After 12h\", value: 12 * 60 * 60_000 },\n { label: \"After 24h\", value: 24 * 60 * 60_000 },\n] as const;\n\nfunction autoRefreshPolls(frequencyMs: number, turnOffAfterMs: number): number {\n if (frequencyMs <= 0 || turnOffAfterMs <= 0) return Infinity;\n return Math.floor(turnOffAfterMs / frequencyMs);\n}\n\nfunction formatDuration(ms: number): string {\n const seconds = Math.round(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = minutes / 60;\n return Number.isInteger(hours) ? `${hours}h` : `${minutes}m`;\n}\n\nfunction formatStatusTime(ms: number | null): string {\n if (ms == null) return \"never\";\n return new Date(ms).toLocaleTimeString([], { hour: \"numeric\", minute: \"2-digit\", second: \"2-digit\" });\n}\n\nfunction useFieldHasNull<Row>(api: QueryTableApi<Row>, fieldName: string | undefined): boolean | undefined {\n const [hasNull, setHasNull] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n if (!fieldName) return;\n let cancelled = false;\n\n void api\n .filterValues(fieldName, \"\")\n .then((r) => {\n if (!cancelled && typeof r.hasNull === \"boolean\") {\n setHasNull(r.hasNull);\n }\n })\n .catch(() => {\n if (!cancelled) setHasNull(undefined);\n });\n\n return () => {\n cancelled = true;\n };\n }, [api, fieldName]);\n\n return hasNull;\n}\n\n/** Operators dropped from the WHERE op dropdowns: their negation is expressed by\n * the canonical positive op plus the NOT toggle instead (design: \"just support\n * NOT\"). Legacy queries carrying these ops still decode/compile fine, and a\n * clause already on one keeps showing it (see PredicateEditor). */\nconst CONVERGED_NEGATIVE_OPS: ReadonlySet<FilterOp> = new Set<FilterOp>([\"!=\", \"is_not_null\", \"not_matches_regex\"]);\n\n/** The op options offered for a field in the WHERE builder — its positive ops,\n * with the converged negatives removed (NOT toggle covers those). */\nfunction positiveOpsForField<Row>(field: FieldDef<Row>): FilterOp[] {\n return opsForField(field).filter((op) => !CONVERGED_NEGATIVE_OPS.has(op));\n}\n\nfunction predicateAsText<Row>(clause: WhereClause, byName: Map<string, FieldDef<Row>>): string {\n const field = byName.get(clause.field)?.label ?? clause.field;\n if (clause.value === \"0\" && clause.op === \"length_eq\") {\n return `${field} is ${clause.negated ? \"not \" : \"\"}empty string`;\n }\n if (clause.value === \"0\" && clause.op === \"length_gt\" && !clause.negated) return `${field} is not empty string`;\n const op = clause.op.replace(/_/g, \" \");\n const not = clause.negated ? \"not \" : \"\";\n if (NULLARY_OPS.has(clause.op)) return `${field} ${not}${op}`;\n const strategy = byName.get(clause.field)?.filter?.values;\n const option = strategy?.source === 'static' ? strategy.options.find(o => typeof o !== 'string' && o.value === clause.value) : undefined;\n const value = clause.value === \"\" ? \"''\" : typeof option === 'object' ? option.label : clause.value;\n return `${field} ${not}${op} ${value}`;\n}\n\nfunction whereTermAsText<Row>(term: WhereTerm, byName: Map<string, FieldDef<Row>>): string {\n if (isOrGroup(term)) return `(${term.any.map((c) => predicateAsText(c, byName)).join(\" or \")})`;\n return predicateAsText(term, byName);\n}\n\nfunction orderByAsText<Row>(term: OrderByClause, byName: Map<string, FieldDef<Row>>): string {\n const field = byName.get(term.field)?.label ?? term.field;\n const expression = term.extract ? `regex_extract(${field}, /${term.extract.regex}/)` : field;\n const nulls = term.nulls ? ` nulls ${term.nulls}` : \"\";\n return `${expression} ${term.dir}${nulls}`;\n}\n\nfunction chipFieldWidthChars(text: string, fallback = 5, max = 30): number {\n return Math.min(max, Math.max(fallback, (text || \"\").length + 1));\n}\n\nfunction chipFieldWidthForInput(text: string, fieldType: string | undefined, fallback = 5, padding = 0): number {\n const cap = fieldType === \"number\" ? 10 : 30;\n return chipFieldWidthChars(text, fallback, cap) + padding;\n}\n\nfunction chipFieldWidthForSelect(text: string, fallback = 3, max = 30): number {\n return chipFieldWidthChars(text, fallback, max) + 2;\n}\n\nfunction buildCollapsedSummary<Row>(\n where: WhereTerm[],\n orderBy: OrderByClause[],\n byName: Map<string, FieldDef<Row>>,\n): string {\n const whereText = whereClauseSummaryText(where, byName);\n const orderText = orderBy.length === 0 ? \"(default)\" : orderBy.map((term) => orderByAsText(term, byName)).join(\", \");\n return `WHERE ${whereText} ORDER BY ${orderText}`;\n}\n\nfunction whereClauseSummaryText<Row>(where: WhereTerm[], byName: Map<string, FieldDef<Row>>): string {\n return where.length === 0 ? \"all rows\" : where.map((t) => whereTermAsText(t, byName)).join(\" and \");\n}\n\nfunction orderBySummaryText<Row>(orderBy: OrderByClause[], byName: Map<string, FieldDef<Row>>): string {\n return orderBy.length === 0 ? \"(default)\" : orderBy.map((term) => orderByAsText(term, byName)).join(\", \");\n}\n\nexport function QueryBuilder<Row>({\n api,\n fields,\n total,\n running,\n classNames,\n collapsed,\n onCollapsedChange,\n defaultCollapsed = false,\n}: QueryBuilderProps<Row>): ReactNode {\n const mobile = useMobileLayout();\n const UNSAVED_QUERY_EDIT_ID = \"__qt-unsaved-query__\";\n const [showSaved, setShowSaved] = useState(false);\n const [shareCopied, setShareCopied] = useState(false);\n const [showAutoRefresh, setShowAutoRefresh] = useState(false);\n const [autoRefreshFrequencyMs, setAutoRefreshFrequencyMs] = useState(DEFAULT_AUTO_REFRESH_FREQUENCY_MS);\n const [autoRefreshTurnOffAfterMs, setAutoRefreshTurnOffAfterMs] = useState(DEFAULT_AUTO_REFRESH_TURN_OFF_AFTER_MS);\n const [editingSavedId, setEditingSavedId] = useState<string | null>(null);\n const [editingSavedName, setEditingSavedName] = useState(\"\");\n const [lastSavedId, setLastSavedId] = useState<string | null>(null);\n const [collapsedFallback, setCollapsedFallback] = useState(defaultCollapsed);\n const collapsedControlled = typeof collapsed !== \"undefined\";\n const isCollapsed = collapsedControlled ? collapsed : collapsedFallback;\n const setCollapsed = (next: boolean) => {\n if (collapsedControlled) {\n onCollapsedChange?.(next);\n return;\n }\n setCollapsedFallback(next);\n };\n const [lastUpdatedAt, setLastUpdatedAt] = useState<number | null>(null);\n const [lastFailureAt, setLastFailureAt] = useState<number | null>(null);\n const byName = useMemo(() => new Map(fields.map((f) => [f.name, f])), [fields]);\n const activeSavedQuery = useMemo(\n () => api.saved.items.find((item) => queriesEqual(item.query, api.query)),\n [api.query, api.saved.items],\n );\n const lastSavedQuery = useMemo(\n () => api.saved.items.find((item) => item.id === lastSavedId) ?? null,\n [api.saved.items, lastSavedId],\n );\n const isSavedQuery = activeSavedQuery != null;\n const isEditingUnsaved = editingSavedId === UNSAVED_QUERY_EDIT_ID;\n const bodyId = useId();\n const isEditingSaved = editingSavedId != null && activeSavedQuery?.id === editingSavedId;\n const showUpdateButton = Boolean(lastSavedQuery) && !activeSavedQuery;\n const collapsedSummary = useMemo(\n () => buildCollapsedSummary(api.query.where, api.query.orderBy, byName),\n [api.query.where, api.query.orderBy, byName],\n );\n const collapsedWhereText = useMemo(\n () => whereClauseSummaryText(api.query.where, byName),\n [api.query.where, byName],\n );\n const collapsedOrderText = useMemo(\n () => orderBySummaryText(api.query.orderBy, byName),\n [api.query.orderBy, byName],\n );\n const autoRefreshStatus = api.autoRefresh.status;\n const selectedAutoRefreshPolls = autoRefreshPolls(autoRefreshFrequencyMs, autoRefreshTurnOffAfterMs);\n const canSubmitAutoRefresh = selectedAutoRefreshPolls >= 1 && selectedAutoRefreshPolls <= MAX_AUTO_REFRESH_POLLS;\n const autoRefreshButtonText = autoRefreshStatus\n ? `Auto-Update ${formatDuration(autoRefreshStatus.frequencyMs)}`\n : \"Auto-Update\";\n const rowSummary = `${formatRowCount(api.rows.length)} of ${total == null ? \"?\" : formatRowCount(total)}`;\n const rowSummaryTitle = [api.rows.length, ...(total == null ? [] : [total])]\n .map((count) => rowCountTitle(count))\n .some((title) => title != null)\n ? `${api.rows.length.toLocaleString()} of ${total == null ? \"?\" : total.toLocaleString()}`\n : undefined;\n const lastUpdatedText = formatStatusTime(lastUpdatedAt);\n const failureText = api.error\n ? `Error: ${api.error.message}`\n : lastFailureAt\n ? `Last failure at ${formatStatusTime(lastFailureAt)}`\n : null;\n const isBusy = Boolean(running) || api.loading;\n const lastRowsRef = useRef<Row[] | null>(null);\n const lastTotalRef = useRef<number | null>(null);\n const previousLoadingRef = useRef(api.loading);\n const autoRefreshRef = useRef<HTMLSpanElement>(null);\n const autoRefreshPopoverRef = useRef<HTMLSpanElement>(null);\n const [autoRefreshPopoverAlignRight, setAutoRefreshPopoverAlignRight] = useState(false);\n const shareFeedbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (shareFeedbackTimerRef.current) clearTimeout(shareFeedbackTimerRef.current);\n },\n [],\n );\n\n useEffect(() => {\n setShareCopied(false);\n if (shareFeedbackTimerRef.current) {\n clearTimeout(shareFeedbackTimerRef.current);\n shareFeedbackTimerRef.current = null;\n }\n }, [api.query]);\n\n useEffect(() => {\n if (activeSavedQuery) {\n setLastSavedId(activeSavedQuery.id);\n if (!isEditingSaved) {\n setEditingSavedName(activeSavedQuery.name);\n setEditingSavedId(null);\n }\n return;\n }\n\n if (!isEditingUnsaved) {\n setEditingSavedId(null);\n setEditingSavedName(\"\");\n }\n // activeSavedQuery can become null if edits/loads shift to unsaved or another query\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeSavedQuery, isEditingSaved, isEditingUnsaved]);\n\n useEffect(() => {\n if (!lastSavedId || api.saved.items.some((item) => item.id === lastSavedId)) return;\n setLastSavedId(null);\n }, [api.saved.items, lastSavedId]);\n\n useEffect(() => {\n const hasData = api.rows.length > 0 || total != null;\n const rowsChanged = lastRowsRef.current !== api.rows;\n const totalChanged = lastTotalRef.current !== total;\n const loadingDone = !api.loading;\n\n if (loadingDone && api.error) {\n setLastFailureAt(Date.now());\n lastRowsRef.current = api.rows;\n lastTotalRef.current = total;\n previousLoadingRef.current = api.loading;\n return;\n }\n\n if (\n loadingDone &&\n (previousLoadingRef.current || rowsChanged || totalChanged || lastUpdatedAt == null) &&\n hasData\n ) {\n setLastUpdatedAt(Date.now());\n setLastFailureAt(null);\n lastRowsRef.current = api.rows;\n lastTotalRef.current = total;\n }\n previousLoadingRef.current = api.loading;\n }, [api.error, api.loading, api.rows, total, lastUpdatedAt]);\n\n function saveFailed(error: unknown): void {\n const message = error instanceof Error ? error.message : \"Failed to save query.\";\n if (typeof window !== \"undefined\") window.alert(message);\n }\n\n function beginEditSavedName() {\n if (activeSavedQuery) {\n setEditingSavedId(activeSavedQuery.id);\n setEditingSavedName(activeSavedQuery.name);\n return;\n }\n if (isEditingUnsaved) return;\n setEditingSavedId(UNSAVED_QUERY_EDIT_ID);\n setEditingSavedName((next) => (next ? next : \"Custom Query\"));\n }\n\n function cancelNameEdit() {\n setEditingSavedId(null);\n setEditingSavedName(\"\");\n }\n\n async function persistSavedQuery(name: string): Promise<string | null> {\n const trimmed = name.trim();\n if (!trimmed) return null;\n try {\n const saved = await api.saved.save(trimmed);\n setLastSavedId(saved.id);\n return saved.id;\n } catch (error) {\n saveFailed(error);\n return null;\n }\n }\n\n async function commitSavedNameEdit() {\n if (!isEditingSaved || !activeSavedQuery) return;\n const trimmed = editingSavedName.trim();\n if (!trimmed || trimmed === activeSavedQuery.name) {\n cancelNameEdit();\n return;\n }\n const savedId = await persistSavedQuery(trimmed);\n if (!savedId) return;\n await api.saved.remove(activeSavedQuery.id);\n cancelNameEdit();\n }\n\n async function commitUnsavedNameEdit() {\n if (!isEditingUnsaved) return;\n const savedId = await persistSavedQuery(editingSavedName);\n if (!savedId) {\n cancelNameEdit();\n return;\n }\n cancelNameEdit();\n }\n\n async function updateLastSavedQuery() {\n if (!lastSavedQuery) return;\n const wasDefault = api.saved.defaultId === lastSavedQuery.id;\n const trimmedName = lastSavedQuery.name.trim();\n if (!trimmedName) return;\n\n try {\n await api.saved.remove(lastSavedQuery.id);\n const saved = await api.saved.save(trimmedName);\n if (wasDefault) await api.saved.setDefault(saved.id);\n setLastSavedId(saved.id);\n } catch (error) {\n saveFailed(error);\n }\n }\n\n function commitNameEditor() {\n if (isEditingSaved) {\n void commitSavedNameEdit();\n return;\n }\n if (isEditingUnsaved) {\n void commitUnsavedNameEdit();\n return;\n }\n }\n\n useEffect(() => {\n if (isCollapsed) setShowSaved(false);\n }, [isCollapsed]);\n\n useEffect(() => {\n if (!showAutoRefresh || !autoRefreshStatus) return;\n setAutoRefreshFrequencyMs(autoRefreshStatus.frequencyMs);\n setAutoRefreshTurnOffAfterMs(autoRefreshStatus.turnOffAfterMs);\n }, [showAutoRefresh, autoRefreshStatus]);\n\n useEffect(() => {\n if (!showAutoRefresh || mobile) return;\n\n function onDocumentClick(event: MouseEvent) {\n const wrapper = autoRefreshRef.current;\n const target = event.target as Node | null;\n if (!wrapper || !target) return;\n if (!wrapper.contains(target)) setShowAutoRefresh(false);\n }\n\n function onDocumentKeyDown(event: KeyboardEvent) {\n if (event.key === \"Escape\") setShowAutoRefresh(false);\n }\n\n function calculateAutoRefreshPosition() {\n const popover = autoRefreshPopoverRef.current;\n const wrapper = autoRefreshRef.current;\n if (!popover || !wrapper) return;\n const wrapperRect = wrapper.getBoundingClientRect();\n const popWidth = popover.offsetWidth;\n const viewportRightInset = 8;\n setAutoRefreshPopoverAlignRight(wrapperRect.right + popWidth > window.innerWidth - viewportRightInset);\n }\n\n calculateAutoRefreshPosition();\n const t = setTimeout(() => window.addEventListener(\"click\", onDocumentClick), 0);\n window.addEventListener(\"keydown\", onDocumentKeyDown);\n window.addEventListener(\"resize\", calculateAutoRefreshPosition);\n return () => {\n clearTimeout(t);\n window.removeEventListener(\"click\", onDocumentClick);\n window.removeEventListener(\"keydown\", onDocumentKeyDown);\n window.removeEventListener(\"resize\", calculateAutoRefreshPosition);\n };\n }, [showAutoRefresh, mobile]);\n\n function submitAutoRefresh() {\n if (!canSubmitAutoRefresh) return;\n try {\n api.autoRefresh.start({\n frequencyMs: autoRefreshFrequencyMs,\n turnOffAfterMs: autoRefreshTurnOffAfterMs,\n });\n setShowAutoRefresh(false);\n } catch (error) {\n saveFailed(error);\n }\n }\n\n async function shareQuery() {\n if (typeof window === \"undefined\") return;\n\n const url = new URL(window.location.href);\n // Always derive the token from the live query. In particular, a saved\n // default must be shared by value because the recipient will not have the\n // sender's StorageAdapter contents.\n url.searchParams.set(\"q\", encodeQuery(api.query));\n\n if (mobile && navigator.share) {\n try {\n await navigator.share({ title: \"Query table\", url: url.toString() });\n return;\n } catch (error) {\n if (error && typeof error === \"object\" && \"name\" in error && error.name === \"AbortError\") return;\n }\n }\n\n try {\n await navigator.clipboard.writeText(url.toString());\n setShareCopied(true);\n if (shareFeedbackTimerRef.current) clearTimeout(shareFeedbackTimerRef.current);\n shareFeedbackTimerRef.current = setTimeout(() => {\n setShareCopied(false);\n shareFeedbackTimerRef.current = null;\n }, SHARE_FEEDBACK_MS);\n } catch {\n window.prompt(\"Copy this query URL\", url.toString());\n }\n }\n\n return (\n <div className={cx(\"qt-qb\", classNames?.root)}>\n <div className=\"qt-qb-bar qt-qb-state-bar qt-qb-row\">\n <span className=\"qt-qb-state-main\">\n <span className=\"qt-qb-saved\">\n <button\n type=\"button\"\n className={cx(\"qt-qb-saved-star\", isSavedQuery ? \"qt-qb-saved-star--saved\" : \"qt-qb-saved-star--unsaved\")}\n title={isSavedQuery ? \"Rename saved query\" : \"Save query\"}\n aria-label={isSavedQuery ? \"Rename saved query\" : \"Save query\"}\n disabled={isBusy}\n onClick={beginEditSavedName}\n >\n <Icon name=\"star\" size={16} filled={isSavedQuery} />\n </button>\n {isEditingSaved || isEditingUnsaved ? (\n <span className=\"qt-qb-saved-input-wrap\">\n <input\n type=\"text\"\n className=\"qt-qb-saved-input\"\n value={editingSavedName}\n disabled={isBusy}\n autoFocus\n onChange={(e) => setEditingSavedName(e.target.value)}\n onBlur={commitNameEditor}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitNameEditor();\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n cancelNameEdit();\n }\n }}\n onClick={(e) => e.stopPropagation()}\n />\n <button\n type=\"button\"\n className=\"qt-qb-saved-cancel\"\n title=\"Do not save\"\n aria-label=\"Do not save\"\n onMouseDown={(e) => {\n e.preventDefault();\n cancelNameEdit();\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <Icon name=\"close\" />\n </button>\n </span>\n ) : (\n <button\n type=\"button\"\n className={cx(\"qt-qb-saved-name\", !activeSavedQuery && \"qt-qb-saved-name--custom\")}\n onClick={beginEditSavedName}\n >\n {activeSavedQuery ? activeSavedQuery.name : \"Custom Query\"}\n </button>\n )}\n </span>\n {isCollapsed ? (\n <span className=\"qt-qb-summary qt-truncate\" title={collapsedSummary}>\n <span className=\"qt-qb-summary-kw\">WHERE</span>{\" \"}\n <strong>{collapsedWhereText}</strong>{\" \"}\n <span className=\"qt-qb-summary-kw\">ORDER BY</span>{\" \"}\n <strong>{collapsedOrderText}</strong>\n </span>\n ) : null}\n </span>\n {showUpdateButton ? (\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={() => void updateLastSavedQuery()}\n disabled={isBusy}\n >\n {`Update Query '${lastSavedQuery?.name ?? \"query\"}'`}\n </button>\n ) : null}\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={() => void shareQuery()}\n title=\"Copy a URL for this query\"\n aria-live=\"polite\"\n >\n <Icon name={shareCopied ? \"check\" : \"share\"} />{shareCopied ? \"Copied!\" : \"Share\"}\n </button>\n <button type=\"button\" className={cx(\"qt-btn\", classNames?.button)} onClick={() => setShowSaved(true)}>\n <Icon name=\"bookmark\" />Saved{api.saved.items.length > 0 ? ` (${api.saved.items.length})` : \"\"}\n </button>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", \"qt-qb-collapse-btn\", classNames?.button)}\n onClick={() => setCollapsed(!isCollapsed)}\n aria-expanded={!isCollapsed}\n aria-controls={bodyId}\n title={isCollapsed ? \"Expand query builder\" : \"Collapse query builder\"}\n >\n <Icon name=\"chevronDown\" size={18} className={cx(\"qt-qb-collapse-caret\", isCollapsed && \"qt-qb-collapse-caret--collapsed\")} />\n <span className=\"qt-sr-only\">{isCollapsed ? \"Expand query builder\" : \"Collapse query builder\"}</span>\n </button>\n </div>\n\n {!isCollapsed ? (\n <div className=\"qt-qb-bar qt-qb-editor-bar\">\n <div id={bodyId} className=\"qt-qb-body\">\n <SelectRow api={api} fields={fields} classNames={classNames} disabled={isBusy} />\n <WhereRow api={api} byName={byName} fields={fields} classNames={classNames} disabled={isBusy} />\n <OrderRow api={api} fields={fields} classNames={classNames} disabled={isBusy} />\n <WindowRow api={api} total={total} classNames={classNames} disabled={isBusy} />\n <MetricsRow api={api} fields={fields} classNames={classNames} disabled={isBusy} />\n </div>\n <div className=\"qt-qb-editor-stack\">\n <button type=\"button\" className={cx(\"qt-btn\", classNames?.button)} onClick={api.undo} disabled={!api.canUndo || isBusy}>\n <Icon name=\"undo\" />Undo\n </button>\n <button type=\"button\" className={cx(\"qt-btn\", classNames?.button)} onClick={api.redo} disabled={!api.canRedo || isBusy}>\n <Icon name=\"redo\" />Redo\n </button>\n <button type=\"button\" className={cx(\"qt-btn\", classNames?.button)} onClick={api.resetAll} disabled={isBusy}>\n <Icon name=\"reset\" />Reset\n </button>\n </div>\n </div>\n ) : null}\n\n <div className=\"qt-qb-bar qt-qb-run-bar qt-qb-row\">\n <span className=\"qt-qb-run-metric qt-qb-run-metric--strong\" title={api.loading ? undefined : rowSummaryTitle}>{api.loading ? \"loading…\" : `${rowSummary} rows`}</span>\n <span className=\"qt-qb-run-metric\">Last updated {lastUpdatedText}</span>\n {failureText ? <span className=\"qt-qb-run-error\">{failureText}</span> : null}\n <span className=\"qt-qb-run-actions\">\n {autoRefreshStatus ? (\n <span className=\"qt-qb-auto-status\">\n {`Every ${formatDuration(autoRefreshStatus.frequencyMs)}; clear after ${formatDuration(\n autoRefreshStatus.turnOffAfterMs,\n )} (${autoRefreshStatus.pollCount} polls run)`}\n </span>\n ) : null}\n <span className=\"qt-auto-refresh\" ref={autoRefreshRef}>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", Boolean(autoRefreshStatus) && \"qt-btn--active\", classNames?.button)}\n onClick={() => setShowAutoRefresh((next) => !next)}\n aria-expanded={showAutoRefresh}\n title={autoRefreshStatus ? \"View or clear auto-update\" : \"Configure auto-update\"}\n >\n <Icon name=\"clock\" />{autoRefreshButtonText}\n </button>\n {showAutoRefresh ? (\n <AdaptiveOverlay title=\"Auto-update\" onClose={() => setShowAutoRefresh(false)}>\n <span\n ref={autoRefreshPopoverRef}\n className={cx(\"qt-auto-refresh-popover\", autoRefreshPopoverAlignRight && \"qt-auto-refresh-popover--align-right\")}\n role={mobile ? undefined : \"dialog\"}\n aria-label=\"Auto-refresh settings\"\n >\n <label className=\"qt-auto-refresh-field\">\n <span>Frequency</span>\n <select\n className=\"qt-auto-refresh-select\"\n value={autoRefreshFrequencyMs}\n onChange={(e) => setAutoRefreshFrequencyMs(Number(e.target.value))}\n >\n {AUTO_REFRESH_FREQUENCIES.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <label className=\"qt-auto-refresh-field\">\n <span>Turn off after</span>\n <select\n className=\"qt-auto-refresh-select\"\n value={autoRefreshTurnOffAfterMs}\n onChange={(e) => setAutoRefreshTurnOffAfterMs(Number(e.target.value))}\n >\n {AUTO_REFRESH_TURN_OFF_AFTER.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={\n autoRefreshPolls(autoRefreshFrequencyMs, option.value) < 1 ||\n autoRefreshPolls(autoRefreshFrequencyMs, option.value) > MAX_AUTO_REFRESH_POLLS\n }\n >\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <span className={cx(\"qt-auto-refresh-status\", !canSubmitAutoRefresh && \"qt-auto-refresh-status--error\")}>\n {canSubmitAutoRefresh\n ? `${selectedAutoRefreshPolls} polls maximum`\n : `Choose between 1 and 1000 polls`}\n </span>\n {autoRefreshStatus ? (\n <span className=\"qt-auto-refresh-status\">\n Active: every {formatDuration(autoRefreshStatus.frequencyMs)}, clears after{\" \"}\n {formatDuration(autoRefreshStatus.turnOffAfterMs)}. {autoRefreshStatus.pollCount} polls run.\n </span>\n ) : null}\n <span className=\"qt-auto-refresh-actions\">\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={submitAutoRefresh}\n disabled={!canSubmitAutoRefresh}\n >\n {autoRefreshStatus ? \"Update\" : \"Start\"}\n </button>\n {autoRefreshStatus ? (\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={() => {\n api.autoRefresh.stop();\n setShowAutoRefresh(false);\n }}\n >\n Clear\n </button>\n ) : null}\n </span>\n </span>\n </AdaptiveOverlay>\n ) : null}\n </span>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", \"qt-btn--primary\", classNames?.button)}\n onClick={api.refresh}\n disabled={isBusy}\n >\n <Icon name=\"refresh\" />Run Now\n </button>\n </span>\n </div>\n\n {!isCollapsed && showSaved ? (\n <SavedQueriesModal saved={api.saved} onClose={() => setShowSaved(false)} onLoad={setLastSavedId} />\n ) : null}\n </div>\n );\n}\n\n// ---- SELECT ---------------------------------------------------------------\n\nfunction SelectRow<Row>({\n api,\n fields,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const { select, columnDrag } = api;\n const mobile = useMobileLayout();\n const [editingColumns, setEditingColumns] = useState(false);\n const [adding, setAdding] = useState(false);\n const fieldLabelByName = useMemo(() => new Map(select.fields.map((f) => [f.name, f.label])), [select.fields]);\n\n // `overIndex` is a position in the list with the dragged column removed —\n // exactly where the live preview shows it. select.move removes-then-inserts at\n // that index, so the committed order matches the preview.\n function reorderByIndex(from: string, overIndex: number) {\n select.move(from, overIndex);\n }\n\n const fieldNames = select.visible.map((c) => c.field);\n const dragSource = columnDrag.source;\n\n // Live reorder, driven by the SHARED column-drag state so dragging a chip also\n // live-previews/dims the matching table column (and vice versa). The dragged\n // chip stays MOUNTED (removing the drag-source node mid-drag aborts the native\n // drag) and slides to the hovered slot, dimmed. Rendered order == drop result.\n const rendered = columnDrag.preview(fieldNames);\n\n const actions = (\n <>\n <span className=\"qt-split-btn\" role=\"group\" aria-label=\"Column actions\">\n <button type=\"button\" className=\"qt-add\" aria-label=\"Add column\" onClick={() => setAdding(true)} disabled={disabled || adding || select.hidden.length === 0}><Icon name=\"add\" />{mobile ? \"Add\" : \"add column\"}</button>\n <button type=\"button\" className=\"qt-add qt-split-btn-caret\" aria-label=\"Customize columns\" title=\"Customize columns\" aria-haspopup=\"dialog\" aria-expanded={editingColumns} disabled={disabled} onClick={() => setEditingColumns(true)}><Icon name=\"chevronRight\" size={18} /></button>\n </span>\n <button type=\"button\" className=\"qt-link-btn\" aria-label=\"Reset columns\" onClick={select.reset} disabled={disabled} title=\"Reset to default columns\">{mobile ? \"Reset\" : \"reset\"}</button>\n </>\n );\n\n return (\n <div className=\"qt-qb-row qt-qb-row--select\">\n <div className=\"qt-qb-section-header\">\n <span className=\"qt-qb-kw\" data-mobile-label=\"Columns\">select</span>\n {mobile && actions}\n </div>\n {editingColumns && <SelectColumnEditor api={api} onClose={() => setEditingColumns(false)} />}\n {mobile ? (\n <ReorderList className=\"qt-query-reorder-list qt-query-reorder-list--columns\" layout=\"wrap\" showHint={false} items={fieldNames.map((name) => ({ id: name, label: fieldLabelByName.get(name) ?? name }))} onMove={select.move} disabled={disabled} renderItem={(item) => (\n <>\n <span className=\"qt-chip-field\">{item.label}</span>\n <button type=\"button\" className=\"qt-chip-x\" onClick={() => select.hide(item.id)} disabled={disabled} aria-label={`Remove ${item.label} column`}><Icon name=\"close\" /></button>\n </>\n )} />\n ) : rendered.map((name) => {\n const label = fieldLabelByName.get(name) ?? name;\n return (\n <span\n // Stable key (not index-based) so React MOVES the dragged chip instead\n // of remounting it \\u2014 a remount removes the drag source and aborts the drag.\n key={name}\n className={cx(\n \"qt-chip\",\n \"qt-chip--col\",\n dragSource === name && \"qt-chip--dragging\",\n classNames?.columnChip ?? classNames?.chip,\n )}\n draggable={!disabled}\n onDragStart={(e) => {\n columnDrag.start(name, fieldNames.indexOf(name));\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", name);\n }}\n onDragOver={(e) => {\n if (!columnDrag.source) return;\n // preventDefault on every chip (incl. the dragged one) so there is no\n // dead drop zone along the row.\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (columnDrag.source !== name) {\n const withoutDragged = fieldNames.filter((n) => n !== columnDrag.source);\n let next = withoutDragged.indexOf(name);\n if (next >= 0) {\n // Drop after the hovered chip when past its midpoint, so a column\n // can be moved into the last slot.\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n columnDrag.over(next);\n }\n }\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const from = columnDrag.source || e.dataTransfer.getData(\"text/plain\");\n if (from && columnDrag.overIndex != null) reorderByIndex(from, columnDrag.overIndex);\n columnDrag.end();\n }}\n onDragEnd={() => columnDrag.end()}\n title=\"drag to reorder\"\n >\n <span aria-hidden className=\"qt-chip-grip\">\n <Icon name=\"grip\" />\n </span>\n <span className=\"qt-chip-field\">{label}</span>\n <button type=\"button\" className=\"qt-chip-x\" onClick={() => select.hide(name)} disabled={disabled} aria-label={`Remove ${label} column`}>\n <Icon name=\"close\" />\n </button>\n </span>\n );\n })}\n {!mobile && actions}\n {adding ? (\n <FieldPicker\n fields={select.hidden.filter(isSelectable)}\n onPick={(f) => {\n select.show(f.name);\n setAdding(false);\n }}\n onClose={() => setAdding(false)}\n />\n ) : null}\n </div>\n );\n}\n\n// ---- WHERE ----------------------------------------------------------------\n\n/** Where a drop lands relative to the hovered term chip: reorder before/after\n * it, or drop onto its center to OR the two together. */\ntype DropMode = \"before\" | \"after\" | \"merge\";\n\ninterface WhereDrag {\n /** Index of the term being dragged. */\n from: number;\n /** Current hovered term + intent, or null when over dead space. */\n over: { index: number; mode: DropMode } | null;\n}\n\n/** Classify a drag position within a chip: outer thirds reorder, the center\n * merges into an OR group. */\nfunction dropModeFor(e: React.DragEvent): DropMode {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n if (x < rect.width * 0.3) return \"before\";\n if (x > rect.width * 0.7) return \"after\";\n return \"merge\";\n}\n\nfunction WhereRow<Row>({\n api,\n byName,\n fields,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n byName: Map<string, FieldDef<Row>>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const [adding, setAdding] = useState(false);\n const mobile = useMobileLayout();\n const editorId = useId();\n const nextSetId = useRef(0);\n const addFilterButton = useRef<HTMLButtonElement>(null);\n const [editingSet, setEditingSet] = useState<{ field: FieldDef<Row>; anchor: HTMLElement; returnFocus: HTMLElement; index: number; count: number; metadata: SetFilterMetadata; signature: string } | null>(null);\n // Local drag state (WHERE terms are their own list, unlike the columns shared\n // via api.columnDrag). Order is committed only on drop, so the DOM order stays\n // put during the drag and index keys never remount the dragged node.\n const [drag, setDrag] = useState<WhereDrag | null>(null);\n const [editingFilter, setEditingFilter] = useState<number | null>(null);\n const where = api.query.where;\n const whereSignature = JSON.stringify(where);\n const setEditors = new Map<number, { field: FieldDef<Row>; metadata: SetFilterMetadata; count: number }>();\n const hiddenSetTerms = new Set<number>();\n for (let index = 0; index < where.length; index++) {\n const set = readSetFilter(where, index);\n const field = set && byName.get(set.field);\n if (!set || field?.type !== \"textarray\" || field.filter?.editor !== \"set\") continue;\n setEditors.set(index, { field, metadata: set.metadata, count: set.count });\n for (let offset = 1; offset < set.count; offset++) hiddenSetTerms.add(index + offset);\n index += set.count - 1;\n }\n useEffect(() => {\n if (editingSet && editingSet.signature !== whereSignature) setEditingSet(null);\n }, [editingSet, whereSignature]);\n // Only make the top-level conjunction explicit (\"AND\" between terms) once an\n // OR group is present — otherwise a plain AND-list reads fine unadorned.\n const hasOr = where.some(isOrGroup);\n\n function replaceSet(id: string, terms: WhereTerm[]) {\n api.setQuery((query) => {\n const index = query.where.findIndex((term) => term.setFilter?.id === id);\n const current = readSetFilter(query.where, index);\n if (!current) return query;\n return { ...query, offset: 0, where: [...query.where.slice(0, index), ...terms, ...query.where.slice(index + current.count)] };\n });\n }\n\n function addClause(f: FieldDef<Row>) {\n if (f.type === \"textarray\" && f.filter?.editor === \"set\") {\n const anchor = addFilterButton.current;\n if (!anchor) return;\n setEditingSet({ field: f, anchor, returnFocus: anchor, index: where.length, count: 0, metadata: { id: `${editorId}-${Date.now()}-${nextSetId.current++}`, mode: \"any\", values: [] }, signature: whereSignature });\n setAdding(false);\n return;\n }\n setEditingFilter(where.length);\n const op = positiveOpsForField(f)[0] ?? opsForField(f)[0] ?? \"=\";\n api.addFilter({ field: f.name, op, value: \"\" });\n setAdding(false);\n }\n\n function handleOver(e: React.DragEvent, index: number) {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const mode = dropModeFor(e);\n setDrag((d) => (d && (d.over?.index !== index || d.over?.mode !== mode) ? { from: d.from, over: { index, mode } } : d));\n }\n\n function handleDrop() {\n if (!drag || !drag.over) {\n setDrag(null);\n return;\n }\n const { from } = drag;\n const { index: target, mode } = drag.over;\n if (mode === \"merge\") {\n if (target !== from) api.mergeFilters(from, target);\n } else {\n // Translate \"before/after term `target`\" into an index in the list with the\n // dragged term already removed (what reorderFilters expects).\n const tPrime = target < from ? target : target - 1;\n const insertAt = mode === \"after\" ? tPrime + 1 : tPrime;\n if (insertAt !== from) api.reorderFilters(from, insertAt);\n }\n setDrag(null);\n }\n\n const actions = (\n <>\n <button ref={addFilterButton} type=\"button\" className=\"qt-add\" aria-label=\"Add filter\" aria-expanded={adding} onClick={() => setAdding(true)} disabled={disabled || adding}><Icon name=\"add\" />add filter</button>\n {adding && <FieldPicker fields={fields.filter(isFilterable)} gateOnDistinct onPick={addClause} onClose={() => setAdding(false)} />}\n {where.length > 0 && <button type=\"button\" className=\"qt-link-btn\" onClick={api.clearFilters} disabled={disabled} title=\"Reset filters\">reset</button>}\n </>\n );\n\n return (\n <div className=\"qt-qb-row qt-qb-row--filters\">\n <div className=\"qt-qb-section-header\">\n <span className=\"qt-qb-kw\" data-mobile-label=\"Filters\">where</span>\n {mobile && actions}\n </div>\n {where.map((term, index) => {\n if (hiddenSetTerms.has(index)) return null;\n const set = setEditors.get(index);\n return (\n <span className=\"qt-where-term-wrap\" key={index}>\n {index > 0 && hasOr && <span className=\"qt-where-and\">AND</span>}\n {set ? <span className={cx(\"qt-chip\", classNames?.chip)}>\n <button type=\"button\" className=\"qt-link-btn\" disabled={disabled} aria-label={`Edit ${set.field.label} tag filter`} onClick={(event) => setEditingSet({ field: set.field, anchor: event.currentTarget, returnFocus: event.currentTarget, index, count: set.count, metadata: set.metadata, signature: whereSignature })}>{set.field.label} {set.metadata.mode.toUpperCase()}</button>\n {set.metadata.values.map((value) => <span key={value} className=\"qt-set-tag\">\n <PresentedFilterValue field={set.field.name} value={value} label={setFilterValueLabel(set.field, value)} />\n <button type=\"button\" className=\"qt-chip-x\" aria-label={`Remove tag ${value}`} disabled={disabled} onClick={() => replaceSet(set.metadata.id, createSetFilter(set.field.name, set.metadata.mode, set.metadata.values.filter((key) => key !== value), set.metadata.id))}>✕</button>\n </span>)}\n <button type=\"button\" className=\"qt-chip-x\" aria-label={`Remove ${set.field.label} tag filter`} disabled={disabled} onClick={() => replaceSet(set.metadata.id, [])}>✕</button>\n </span> : <TermChip\n api={api}\n term={term}\n index={index}\n byName={byName}\n classNames={classNames}\n disabled={disabled}\n isDragSource={drag?.from === index}\n dropHint={drag?.over?.index === index ? drag.over.mode : null}\n onDragStart={() => setDrag({ from: index, over: null })}\n onDragOver={(e) => handleOver(e, index)}\n onDrop={handleDrop}\n onDragEnd={() => setDrag(null)}\n editorOpen={editingFilter === index}\n onEditorChange={(open) => setEditingFilter(open ? index : null)}\n />}\n </span>\n ); })}\n {editingSet && <SetFilterEditor api={api} field={editingSet.field} anchor={editingSet.anchor} returnFocus={editingSet.returnFocus} classNames={classNames} mode={editingSet.metadata.mode} values={editingSet.metadata.values} maxPredicates={MAX_WHERE_CLAUSES - where.reduce((count, term, index) => index >= editingSet.index && index < editingSet.index + editingSet.count ? count : count + predicatesOf(term).length, 0)} disabled={disabled} onClose={() => setEditingSet(null)} onApply={(mode, values) => {\n const terms = createSetFilter(editingSet.field.name, mode, values, editingSet.metadata.id);\n if (editingSet.count > 0) replaceSet(editingSet.metadata.id, terms);\n else api.setQuery((query) => ({ ...query, offset: 0, where: [...query.where, ...terms] }));\n setEditingSet(null);\n }} />}\n {!mobile && actions}\n </div>\n );\n}\n\nfunction setFilterValueLabel(field: FieldDef, value: string): string {\n const strategy = filterValuesFor(field);\n if (strategy.source !== \"static\") return value;\n const option = strategy.options.find((option) => (typeof option === \"string\" ? option : option.value) === value);\n return typeof option === \"string\" ? option : option?.label ?? value;\n}\n\n/** One top-level WHERE term: a single predicate, or a bordered OR group holding\n * several. Draggable by its grip; a drop onto another chip's center ORs them,\n * onto its edges reorders. */\nfunction TermChip<Row>({\n api,\n term,\n index,\n byName,\n classNames,\n disabled,\n isDragSource,\n dropHint,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n editorOpen,\n onEditorChange,\n}: {\n api: QueryTableApi<Row>;\n term: WhereTerm;\n index: number;\n byName: Map<string, FieldDef<Row>>;\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n isDragSource: boolean;\n dropHint: DropMode | null;\n onDragStart: () => void;\n onDragOver: (e: React.DragEvent) => void;\n onDrop: () => void;\n onDragEnd: () => void;\n editorOpen: boolean;\n onEditorChange: (open: boolean) => void;\n}) {\n const mobile = useMobileLayout();\n const group = isOrGroup(term);\n const predicates = predicatesOf(term);\n\n if (mobile) return <MobileFilter api={api} term={term} index={index} byName={byName} classNames={classNames} disabled={disabled} open={editorOpen} onOpenChange={onEditorChange} />;\n\n const grip = (\n <span\n className=\"qt-chip-grip\"\n aria-hidden\n draggable={!disabled}\n onDragStart={(e) => {\n onDragStart();\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", String(index));\n }}\n onDragEnd={onDragEnd}\n title=\"drag to reorder, or drop onto another filter to make an OR\"\n >\n <Icon name=\"grip\" />\n </span>\n );\n\n return (\n <span\n className={cx(\n \"qt-chip\",\n \"qt-chip--where\",\n group && \"qt-chip--or\",\n isDragSource && \"qt-chip--dragging\",\n dropHint ? `qt-chip--drop-${dropHint}` : undefined,\n classNames?.chip,\n )}\n onDragOver={onDragOver}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n >\n {grip}\n {group ? (\n <span className=\"qt-or-group\">\n {predicates.map((clause, predIndex) => (\n <span className=\"qt-or-member\" key={predIndex}>\n {predIndex > 0 && <span className=\"qt-chip-and qt-chip-or\">OR</span>}\n <PredicateEditor\n api={api}\n field={byName.get(clause.field)}\n clause={clause}\n classNames={classNames}\n disabled={disabled}\n onChange={(next) => api.updatePredicate(index, predIndex, next)}\n onRemove={() => api.removePredicate(index, predIndex)}\n />\n </span>\n ))}\n </span>\n ) : (\n <PredicateEditor\n api={api}\n field={byName.get(term.field)}\n clause={term}\n classNames={classNames}\n disabled={disabled}\n onChange={(next) => api.updatePredicate(index, 0, next)}\n onRemove={() => api.removeFilter(index)}\n />\n )}\n </span>\n );\n}\n\nfunction MobileFilter<Row>({ api, term, index, byName, classNames, disabled, open, onOpenChange }: {\n api: QueryTableApi<Row>;\n term: WhereTerm;\n index: number;\n byName: Map<string, FieldDef<Row>>;\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const predicates = predicatesOf(term);\n return (\n <>\n <MobileClauseSummary editLabel={`Edit filter: ${whereTermAsText(term, byName)}`} disabled={disabled} className={classNames?.chip} filter onEdit={() => onOpenChange(true)}>\n <span>\n {predicates.map((clause, position) => {\n const strategy = byName.get(clause.field)?.filter?.values;\n const option = strategy?.source === \"static\" ? strategy.options.find((choice) => typeof choice !== \"string\" && choice.value === clause.value) : undefined;\n const label = typeof option === \"object\" ? option.label : clause.value === \"\" ? '\"\"' : clause.value;\n const emptyStringCondition = clause.value === \"0\" && (clause.op === \"length_eq\" || clause.op === \"length_gt\");\n return (\n <span key={position} className=\"qt-mobile-filter-summary\">\n {position > 0 && <small>OR</small>}\n <strong>{byName.get(clause.field)?.label ?? clause.field}</strong>\n <span>{choiceLabel(clause.op, Boolean(clause.negated), clause.value)} {!NULLARY_OPS.has(clause.op) && !emptyStringCondition && <PresentedFilterValue field={clause.field} value={clause.value} label={label} />}</span>\n </span>\n );\n })}\n </span>\n </MobileClauseSummary>\n {open && (\n <ModalSurface title={predicates.length > 1 ? \"Edit filter group\" : `Filter by ${byName.get(predicates[0]!.field)?.label ?? predicates[0]!.field}`} onClose={() => onOpenChange(false)}>\n <div className=\"qt-overlay-body qt-filter-editor\">\n {predicates.map((clause, position) => (\n <Fragment key={position}>\n {position > 0 && <p className=\"qt-muted\">OR</p>}\n <PredicateEditor api={api} clause={clause} field={byName.get(clause.field)} showField={predicates.length > 1} classNames={classNames} disabled={disabled} onChange={(next) => api.updatePredicate(index, position, next)} onRemove={() => {\n if (predicates.length === 1) onOpenChange(false);\n api.removePredicate(index, position);\n }} />\n </Fragment>\n ))}\n {predicates.length > 1 && <button type=\"button\" className=\"qt-mobile-form-remove\" aria-label=\"Remove filter group\" disabled={disabled} onClick={() => {\n onOpenChange(false);\n api.removeFilter(index);\n }}>Remove filter group</button>}\n {api.query.where.length > 1 && (\n <label className=\"qt-filter-combine\">Match either filter (OR)\n <select className=\"qt-input\" value=\"\" disabled={disabled} onChange={(event) => {\n if (!event.target.value) return;\n onOpenChange(false);\n api.mergeFilters(index, Number(event.target.value));\n }}>\n <option value=\"\">Combine with another filter…</option>\n {api.query.where.map((candidate, position) => position !== index && <option key={position} value={position}>{whereTermAsText(candidate, byName)}</option>)}\n </select>\n </label>\n )}\n </div>\n </ModalSurface>\n )}\n </>\n );\n}\n\n/** Human-readable operator labels for the WHERE chips + op picker. */\nconst OP_LABEL: Record<FilterOp, string> = {\n \"=\": \"=\",\n \"!=\": \"≠\",\n \">\": \">\",\n \">=\": \"≥\",\n \"<\": \"<\",\n \"<=\": \"≤\",\n contains: \"contains\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n matches_regex: \"matches\",\n not_matches_regex: \"not matches\",\n length_gt: \"length above\",\n length_lt: \"length below\",\n length_eq: \"length equals\",\n includes: \"includes\",\n is_null: \"is null\",\n is_not_null: \"is not null\",\n};\n\nfunction choiceLabel(op: FilterOp, negated: boolean, value?: string): string {\n if (value === \"0\" && op === \"length_eq\") return negated ? \"is not empty string\" : \"is empty string\";\n if (value === \"0\" && op === \"length_gt\") return negated ? \"is empty string\" : \"is not empty string\";\n return negated ? `not ${OP_LABEL[op]}` : OP_LABEL[op];\n}\n\n/** The operator control: a button showing the current condition that opens a\n * keep/exclude popover — the same two-column layout as the CellMenu, with the\n * active choice highlighted. Picking sets the predicate's op + negation. */\nfunction OpPicker<Row>({\n field,\n clause,\n disabled,\n classNames,\n onPick,\n}: {\n field: FieldDef<Row> | undefined;\n clause: WhereClause;\n disabled: boolean | undefined;\n classNames: QueryBuilderClassNames | undefined;\n onPick: (choice: OpChoice) => void;\n}) {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLSpanElement>(null);\n const mobile = useMobileLayout();\n\n useEffect(() => {\n if (!open || mobile) return;\n function onDocClick(e: MouseEvent) {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) setOpen(false);\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") setOpen(false);\n }\n // Defer the document listener a tick so the opening click doesn't close it.\n const t = setTimeout(() => window.addEventListener(\"click\", onDocClick), 0);\n window.addEventListener(\"keydown\", onKey);\n return () => {\n clearTimeout(t);\n window.removeEventListener(\"click\", onDocClick);\n window.removeEventListener(\"keydown\", onKey);\n };\n }, [open, mobile]);\n\n const pairs = useMemo(() => (field ? opPairsForField(field) : []), [field]);\n const visiblePairs = clause.value === \"0\" && pairs.some((pair) => pair.keep.op === \"length_gt\")\n ? pairs.filter((pair) => pair.keep.op !== \"length_eq\")\n : pairs;\n const isActive = (choice: OpChoice) => {\n const resolved = choice.negated\n ? negateClause({ field: clause.field, op: choice.op, value: clause.value }, field ? opsForField(field) : undefined)\n : { op: choice.op, negated: false };\n return resolved.op === clause.op && Boolean(resolved.negated) === Boolean(clause.negated);\n };\n\n return (\n <span className=\"qt-op-picker\" ref={wrapRef}>\n <button\n type=\"button\"\n className={cx(\"qt-chip-op-btn\", \"qt-op-trigger\", classNames?.select)}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n {choiceLabel(clause.op, Boolean(clause.negated), clause.value)}\n <Icon name=\"chevronDown\" size={12} className=\"qt-op-caret\" />\n </button>\n {open && visiblePairs.length > 0 && (\n <AdaptiveOverlay title={`Condition for ${field?.label ?? clause.field}`} onClose={() => setOpen(false)}>\n <span className=\"qt-op-pop\" role={mobile ? undefined : \"dialog\"} aria-label=\"Choose condition\">\n <span className=\"qt-cm-col-head\">keep</span>\n <span className=\"qt-cm-col-head qt-cm-col-head--neg\">exclude</span>\n {visiblePairs.map((pair, i) => (\n <Fragment key={i}>\n <button\n type=\"button\"\n className={cx(\"qt-op-cell\", isActive(pair.keep) && \"qt-op-cell--on\")}\n onClick={() => {\n onPick(pair.keep);\n setOpen(false);\n }}\n >\n {choiceLabel(pair.keep.op, pair.keep.negated, clause.value)}\n </button>\n <button\n type=\"button\"\n className={cx(\"qt-op-cell\", \"qt-op-cell--neg\", isActive(pair.exclude) && \"qt-op-cell--on\")}\n onClick={() => {\n onPick(pair.exclude);\n setOpen(false);\n }}\n >\n {choiceLabel(pair.exclude.op, pair.exclude.negated, clause.value)}\n </button>\n </Fragment>\n ))}\n </span>\n </AdaptiveOverlay>\n )}\n </span>\n );\n}\n\n/** The editor for one predicate: field label, the operator picker (a keep/\n * exclude popover that also carries negation), a type-aware value input, and\n * remove. Shared by standalone and grouped terms. */\nfunction PredicateEditor<Row>({\n api,\n field,\n clause,\n classNames,\n disabled,\n onChange,\n onRemove,\n showField = true,\n}: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row> | undefined;\n clause: WhereClause;\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n onChange: (next: WhereClause) => void;\n onRemove: () => void;\n showField?: boolean;\n}) {\n const mobile = useMobileLayout();\n const needsValue = !NULLARY_OPS.has(clause.op);\n const isRegex = clause.op === \"matches_regex\" || clause.op === \"not_matches_regex\";\n const isLength = clause.op === \"length_gt\" || clause.op === \"length_lt\" || clause.op === \"length_eq\";\n\n function pickOp(choice: OpChoice) {\n const nextIsLength = choice.op === \"length_gt\" || choice.op === \"length_lt\" || choice.op === \"length_eq\";\n const value = isLength === nextIsLength ? clause.value : \"\";\n const next: WhereClause = { field: clause.field, op: choice.op, value };\n onChange(choice.negated ? negateClause(next, field ? opsForField(field) : undefined) : next);\n }\n\n const conditionControl = <OpPicker field={field} clause={clause} disabled={disabled} classNames={classNames} onPick={pickOp} />;\n const valueControl = needsValue ? (\n <ValueInput\n api={api}\n field={field}\n value={clause.value}\n forceFreeform={isRegex || isLength}\n numeric={isLength}\n placeholder={isRegex ? \"regex\" : isLength ? \"length\" : \"value\"}\n classNames={classNames}\n onChange={(value) => onChange({ ...clause, value })}\n />\n ) : null;\n const removeControl = <button type=\"button\" className={mobile ? \"qt-mobile-form-remove\" : \"qt-chip-x\"} onClick={onRemove} disabled={disabled} aria-label={`Remove ${field?.label ?? clause.field} filter`}>\n {mobile ? \"Remove filter\" : <Icon name=\"close\" />}\n </button>;\n\n if (mobile) return (\n <div className=\"qt-mobile-predicate qt-mobile-form\">\n {showField && <strong className=\"qt-mobile-form-field--wide\">{field?.label ?? clause.field}</strong>}\n <label className={cx(\"qt-mobile-form-field\", !needsValue && \"qt-mobile-form-field--wide\")}><span>Condition</span>{conditionControl}</label>\n {valueControl && <label className=\"qt-mobile-form-field\"><span>Value</span>{valueControl}</label>}\n {removeControl}\n </div>\n );\n\n return (\n <span className=\"qt-pred\">\n <span className=\"qt-chip-field\">{field?.label ?? clause.field}</span>\n {conditionControl}\n {valueControl}\n {removeControl}\n </span>\n );\n}\n\n// ---- value input: autocomplete by default --------------------------------\n\nfunction ValueInput<Row>({\n api,\n field,\n value,\n forceFreeform,\n numeric,\n placeholder = \"value\",\n classNames,\n onChange,\n}: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row> | undefined;\n value: string;\n forceFreeform?: boolean;\n numeric?: boolean;\n placeholder?: string;\n classNames: QueryBuilderClassNames | undefined;\n onChange: (v: string) => void;\n}) {\n const presentation = useFilterValuePresentation();\n const strategy = field ? filterValuesFor(field) : { source: \"freeform\" as const };\n\n // Static closed domain → a plain <select> of the options.\n if (!forceFreeform && strategy.source === \"static\") {\n if (presentation.render || presentation.label || strategy.options.some(o => typeof o !== 'string')) {\n return <PresentedValueInput field={field?.name ?? ''} value={value} options={strategy.options} onChange={onChange}/>;\n }\n return <select className={cx('qt-chip-val',classNames?.select)} aria-label={`Value for ${field?.label ?? \"filter\"}`} value={value} onChange={e=>onChange(e.target.value)}><option value=\"\">—</option>{strategy.options.map(o=>{const option=typeof o==='string'?{value:o,label:o}:o;return <option key={option.value} value={option.value}>{option.label}</option>})}</select>;\n }\n\n // Freeform → a plain input, no suggestions.\n if (forceFreeform || strategy.source === \"freeform\" || !field) {\n const widthChars = chipFieldWidthForInput(value || placeholder, field?.type, 5, 4);\n return (\n <input\n className={cx(\"qt-chip-val\", classNames?.input)}\n value={value}\n placeholder={placeholder}\n aria-label={`${placeholder} for ${field?.label ?? \"filter\"}`}\n inputMode={numeric ? \"numeric\" : undefined}\n pattern={numeric ? \"[0-9]*\" : undefined}\n size={widthChars}\n style={{ width: `${widthChars}ch` }}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n // Autocomplete (the default) → debounced combobox backed by api.filterValues.\n return <AutocompleteInput api={api} field={field} value={value} classNames={classNames} onChange={onChange} />;\n}\n\nfunction AutocompleteInput<Row>({\n api,\n field,\n value,\n classNames,\n onChange,\n}: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row>;\n value: string;\n classNames: QueryBuilderClassNames | undefined;\n onChange: (v: string) => void;\n}) {\n const [result, setResult] = useState<DistinctValuesResult>({ values: [], hasMore: false });\n const listId = useId();\n\n useEffect(() => {\n let cancelled = false;\n const t = setTimeout(() => {\n void api\n .filterValues(field.name, value)\n .then((r) => {\n if (!cancelled) setResult(r);\n })\n .catch(() => {\n if (!cancelled) setResult({ values: [], hasMore: false });\n });\n }, 200);\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [api, field.name, value]);\n\n return (\n <span className=\"qt-autocomplete\">\n <input\n className={cx(\"qt-chip-val\", classNames?.input)}\n value={value}\n placeholder=\"value\"\n aria-label={`Value for ${field.label}`}\n list={listId}\n size={chipFieldWidthForInput(value || \"value\", field.type, 5, 4)}\n style={{ width: `${chipFieldWidthForInput(value || \"value\", field.type, 5, 4)}ch` }}\n onChange={(e) => onChange(e.target.value)}\n />\n <datalist id={listId}>\n {result.values.map((v) => (\n <option key={v} value={v} />\n ))}\n </datalist>\n {result.hasMore && <span className=\"qt-autocomplete-hint\">keep typing to refine…</span>}\n </span>\n );\n}\n\n// ---- ORDER BY (multi-sort, reorderable) -----------------------------------\n\nfunction MobileClauseSummary({ editLabel, disabled, className, filter, onEdit, children }: {\n editLabel: string;\n disabled: boolean | undefined;\n className?: string | undefined;\n filter?: boolean;\n onEdit: () => void;\n children: ReactNode;\n}) {\n return (\n <div className={cx(\"qt-mobile-clause\", className)}>\n <button type=\"button\" className=\"qt-mobile-filter\" data-qt-filter={filter || undefined} disabled={disabled} aria-label={editLabel} title={editLabel} aria-haspopup=\"dialog\" onClick={onEdit}>\n {children}\n <span className=\"qt-mobile-filter-edit\"><Icon name=\"pencil\" /></span>\n </button>\n </div>\n );\n}\n\nfunction MobileChipEditor({ title, summaryTitle = title, summary, disabled, open, onOpenChange, children }: { title: string; summaryTitle?: string; summary: string; disabled: boolean | undefined; open: boolean; onOpenChange: (open: boolean) => void; children: ReactNode }) {\n const mobile = useMobileLayout();\n if (!mobile) return children;\n return (\n <>\n <MobileClauseSummary editLabel={`Edit ${title}: ${summary}`} disabled={disabled} onEdit={() => onOpenChange(true)}>\n <span className=\"qt-mobile-filter-summary\"><strong>{summaryTitle}</strong><span>{summary}</span></span>\n </MobileClauseSummary>\n {open && <ModalSurface title={title} onClose={() => onOpenChange(false)}><div className=\"qt-overlay-body qt-mobile-chip-editor\">{children}</div></ModalSurface>}\n </>\n );\n}\n\nfunction OrderTermChip<Row>({\n api,\n field,\n term,\n dataIndex,\n priority,\n showPriority,\n isDragSource,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n disabled,\n updateTerm,\n clearExtract,\n removeTerm,\n classNames,\n label,\n editorOpen,\n onEditorChange,\n}: {\n api: QueryTableApi<Row>;\n field: FieldDef<Row> | undefined;\n term: OrderByClause;\n /** Index of this term in the real orderBy array (for update/remove). */\n dataIndex: number;\n /** 1-based sort priority to display (reflects the live drag position). */\n priority: number;\n showPriority: boolean;\n isDragSource: boolean;\n onDragStart: () => void;\n onDragOver: (e: React.DragEvent) => void;\n onDrop: () => void;\n onDragEnd: () => void;\n disabled: boolean | undefined;\n updateTerm: (i: number, patch: Partial<OrderByClause>) => void;\n clearExtract: (i: number) => void;\n removeTerm: (i: number) => void;\n classNames: QueryBuilderClassNames | undefined;\n label: string;\n editorOpen: boolean;\n onEditorChange: (open: boolean) => void;\n}) {\n const fieldHasNull = useFieldHasNull(api, field?.name);\n const mobile = useMobileLayout();\n const [extractOpen, setExtractOpen] = useState(false);\n const title = `Sort by ${label}`;\n const summary = `${term.dir === \"asc\" ? \"Ascending\" : \"Descending\"}${showPriority ? ` · Priority ${priority}` : \"\"}${term.extract ? \" · Regex extraction\" : \"\"}`;\n const extractionEditor = extractOpen && <SortExtractionEditor api={api} field={term.field} label={label} initialPattern={term.extract?.regex} disabled={disabled} onApply={(regex) => { updateTerm(dataIndex, { extract: { regex } }); setExtractOpen(false); }} onRemove={() => { clearExtract(dataIndex); setExtractOpen(false); }} onClose={() => setExtractOpen(false)} />;\n\n if (mobile) return (\n <>\n <MobileChipEditor title={title} summaryTitle={label} summary={summary} disabled={disabled} open={editorOpen} onOpenChange={onEditorChange}>\n <div className=\"qt-mobile-form\">\n <label className=\"qt-mobile-form-field\">\n <span>Direction</span>\n <select className={cx(\"qt-input\", classNames?.select)} value={term.dir} disabled={disabled} onChange={(event) => updateTerm(dataIndex, { dir: event.target.value as OrderByClause[\"dir\"] })}>\n <option value=\"asc\">Ascending</option>\n <option value=\"desc\">Descending</option>\n </select>\n </label>\n {(term.extract != null || fieldHasNull !== false) && (\n <label className=\"qt-mobile-form-field\">\n <span>Null values</span>\n <select className={cx(\"qt-input\", classNames?.select)} value={term.nulls ?? \"last\"} disabled={disabled} onChange={(event) => updateTerm(dataIndex, { nulls: event.target.value as \"first\" | \"last\" })}>\n <option value=\"last\">Last</option>\n <option value=\"first\">First</option>\n </select>\n </label>\n )}\n <div className=\"qt-mobile-form-field qt-mobile-form-field--wide\">\n <span>Extraction</span>\n <button type=\"button\" className=\"qt-btn\" disabled={disabled} onClick={() => setExtractOpen(true)} aria-label={`Configure regex extract for ${label}`}><Icon name={term.extract ? \"pencil\" : \"add\"} />{term.extract ? \"Edit regex extraction\" : \"regex extract\"}</button>\n </div>\n <div className=\"qt-mobile-form-actions\">\n <button type=\"button\" className=\"qt-mobile-form-remove\" disabled={disabled} onClick={() => removeTerm(dataIndex)} aria-label={`Remove ${label} sort`}>Remove sort</button>\n </div>\n </div>\n </MobileChipEditor>\n {extractionEditor}\n </>\n );\n\n return (\n <>\n <span\n className={cx(\"qt-chip\", \"qt-chip--col\", \"qt-chip--sort\", isDragSource && \"qt-chip--dragging\", classNames?.chip)}\n draggable={!disabled}\n onDragStart={(e) => {\n onDragStart();\n // Firefox refuses to start a native drag unless drag data is set here.\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(\"text/plain\", term.field);\n }}\n onDragOver={onDragOver}\n onDrop={(e) => {\n e.preventDefault();\n onDrop();\n }}\n onDragEnd={onDragEnd}\n title=\"drag to reorder sort priority\"\n >\n <span aria-hidden className=\"qt-chip-grip\">\n <Icon name=\"grip\" />\n </span>\n {showPriority && <span className=\"qt-chip-priority\">{priority}</span>}\n <span className=\"qt-chip-field\">{label}</span>\n <button\n type=\"button\"\n className=\"qt-chip-op-btn\"\n disabled={disabled}\n onClick={() => updateTerm(dataIndex, { dir: term.dir === \"asc\" ? \"desc\" : \"asc\" })}\n >\n <Icon name={term.dir === \"asc\" ? \"arrowUp\" : \"arrowDown\"} />{term.dir === \"asc\" ? \"asc\" : \"desc\"}\n </button>\n <button type=\"button\" className=\"qt-chip-op-btn\" title={term.extract ? `Regex: ${term.extract.regex}` : \"Sort by text extracted with a regular expression\"} aria-label={`Configure regex extract for ${label}`} disabled={disabled} onClick={() => setExtractOpen(true)}>\n <Icon name={term.extract ? \"pencil\" : \"add\"} />{term.extract ? \"regex extraction\" : \"regex extract\"}\n </button>\n {(term.extract != null || fieldHasNull !== false) && (\n <button\n type=\"button\"\n className=\"qt-chip-op-btn\"\n disabled={disabled}\n title=\"where NULL values sort\"\n onClick={() => updateTerm(dataIndex, { nulls: (term.nulls ?? \"last\") === \"last\" ? \"first\" : \"last\" })}\n >\n nulls {term.nulls ?? \"last\"}\n </button>\n )}\n <button type=\"button\" className=\"qt-chip-x\" onClick={() => removeTerm(dataIndex)} disabled={disabled} aria-label={`Remove ${label} sort`}>\n <Icon name=\"close\" />\n </button>\n </span>\n {extractionEditor}\n </>\n );\n}\n\nfunction OrderRow<Row>({\n api,\n fields,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const orderBy = api.query.orderBy;\n const mobile = useMobileLayout();\n const byName = useMemo(() => new Map(fields.map((f) => [f.name, f])), [fields]);\n // Local live-reorder drag state (sort terms are their own list, distinct from\n // the columns shared via api.columnDrag) — same dimmed-source + slide preview.\n const [drag, setDrag] = useState<{ source: string; overIndex: number } | null>(null);\n const [adding, setAdding] = useState(false);\n // Field chosen in the \"sort with regex extraction\" configurator (split-button caret).\n const [regexField, setRegexField] = useState<FieldDef<Row> | null>(null);\n\n const [editingSort, setEditingSort] = useState<string | null>(null);\n\n function setOrderBy(next: OrderByClause[]) {\n api.setSort(next);\n }\n function updateTerm(i: number, patch: Partial<OrderByClause>) {\n setOrderBy(orderBy.map((o, k) => (k === i ? { ...o, ...patch } : o)));\n }\n function clearExtract(i: number) {\n setOrderBy(\n orderBy.map((term, index) => {\n if (index !== i) return term;\n const { extract: _extract, ...plainTerm } = term;\n return plainTerm;\n }),\n );\n }\n function removeTerm(i: number) {\n setEditingSort(null);\n setOrderBy(orderBy.filter((_, k) => k !== i));\n }\n function addTerm(f: FieldDef<Row>, extract?: OrderByClause[\"extract\"]) {\n const field = f.sort?.field ?? f.name;\n const nextOrderBy: OrderByClause[] = [...orderBy, { field, dir: \"desc\", ...(extract ? { extract } : {}) }];\n\n const existing = orderBy.findIndex((o) => o.field === field);\n if (existing >= 0) {\n if (extract) updateTerm(existing, { extract });\n setAdding(false);\n return;\n }\n\n if (!extract) setEditingSort(field);\n\n const hasSelectColumn = api.select.visible.some((c) => c.field === field);\n if (hasSelectColumn) {\n setOrderBy(nextOrderBy);\n setAdding(false);\n return;\n }\n\n api.setQuery((q) => ({\n ...q,\n offset: 0,\n orderBy: nextOrderBy,\n select: q.select.length ? [...q.select, { field }] : [...api.select.visible, { field }],\n }));\n setAdding(false);\n }\n\n // Order-by terms are identified by their (unique) field; the drag math mirrors\n // the column chips so the live preview equals the committed order.\n const termFields = orderBy.map((o) => o.field);\n const termByField = useMemo(() => new Map(orderBy.map((o) => [o.field, o])), [orderBy]);\n function previewFields(): string[] {\n if (!drag) return termFields;\n const without = termFields.filter((f) => f !== drag.source);\n if (without.length === termFields.length) return termFields;\n const at = Math.max(0, Math.min(drag.overIndex, without.length));\n return [...without.slice(0, at), drag.source, ...without.slice(at)];\n }\n function handleSortOver(e: React.DragEvent, field: string) {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (drag.source !== field) {\n const without = termFields.filter((f) => f !== drag.source);\n let next = without.indexOf(field);\n if (next >= 0) {\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n setDrag((d) => (d && d.overIndex !== next ? { source: d.source, overIndex: next } : d));\n }\n }\n }\n function commitSortDrop() {\n if (drag) setOrderBy(previewFields().map((f) => termByField.get(f)!));\n setDrag(null);\n }\n\n const rendered = previewFields();\n const sortable = fields.filter(isSortable);\n const sortKey = (f: FieldDef<Row>) => f.sort?.field ?? f.name;\n function openRegexConfigurator() {\n const unsorted = sortable.filter((f) => !termFields.includes(sortKey(f)));\n setRegexField(unsorted.find((f) => f.type === \"text\") ?? unsorted[0] ?? sortable[0] ?? null);\n }\n const renderTerm = (name: string, position: number) => {\n const term = termByField.get(name)!;\n return (\n <OrderTermChip\n key={name}\n api={api}\n field={byName.get(name)}\n term={term}\n dataIndex={orderBy.findIndex((candidate) => candidate.field === name)}\n priority={position + 1}\n showPriority={orderBy.length > 1}\n isDragSource={drag?.source === name}\n onDragStart={() => setDrag({ source: name, overIndex: termFields.indexOf(name) })}\n onDragOver={(event) => handleSortOver(event, name)}\n onDrop={commitSortDrop}\n onDragEnd={() => setDrag(null)}\n disabled={disabled}\n updateTerm={updateTerm}\n clearExtract={clearExtract}\n removeTerm={removeTerm}\n classNames={classNames}\n label={byName.get(name)?.label ?? name}\n editorOpen={editingSort === name}\n onEditorChange={(open) => setEditingSort(open ? name : null)}\n />\n );\n };\n const isDefaultOrderBy =\n orderBy.length === api.defaults.orderBy.length &&\n orderBy.every((term, i) => {\n const next = api.defaults.orderBy[i];\n return (\n term.field === next?.field &&\n term.dir === next?.dir &&\n (term.nulls ?? \"last\") === (next?.nulls ?? \"last\") &&\n (term.extract?.regex ?? null) === (next?.extract?.regex ?? null)\n );\n });\n\n const actions = (\n <>\n <span className=\"qt-split-btn\" role=\"group\" aria-label=\"Sort actions\">\n <button type=\"button\" className=\"qt-add\" aria-label=\"Add sort\" onClick={() => setAdding(true)} disabled={disabled || adding || sortable.length === 0}><Icon name=\"add\" />{mobile ? \"Add\" : \"add sort\"}</button>\n <button type=\"button\" className=\"qt-add qt-split-btn-caret\" aria-label=\"Sort with regex extraction\" title=\"Sort with regex extraction\" aria-haspopup=\"dialog\" aria-expanded={regexField != null} disabled={disabled || sortable.length === 0} onClick={openRegexConfigurator}><Icon name=\"chevronRight\" size={18} /></button>\n </span>\n {!isDefaultOrderBy && <button type=\"button\" className=\"qt-link-btn\" onClick={() => api.setSort(api.defaults.orderBy)} disabled={disabled}>{mobile ? \"Reset\" : \"reset\"}</button>}\n </>\n );\n\n return (\n <div className=\"qt-qb-row qt-qb-row--sort\">\n <div className=\"qt-qb-section-header\">\n <span className=\"qt-qb-kw\" data-mobile-label=\"Sort\">order by</span>\n {mobile && actions}\n </div>\n {orderBy.length === 0 && !adding && <span className=\"qt-qb-hint\">(default)</span>}\n {mobile && orderBy.length > 0 ? <ReorderList className=\"qt-query-reorder-list\" showHint={false} items={orderBy.map((term) => ({ id: term.field, label: orderByAsText(term, byName) }))} disabled={disabled} renderItem={(item, position) => renderTerm(item.id, position)} onMove={(id, position) => {\n const next = [...orderBy];\n const source = next.findIndex((term) => term.field === id);\n if (source < 0) return;\n const [term] = next.splice(source, 1);\n next.splice(position, 0, term!);\n setOrderBy(next);\n }} /> : rendered.map(renderTerm)}\n {!mobile && actions}\n {adding && <FieldPicker fields={sortable} onPick={(field) => addTerm(field)} onClose={() => setAdding(false)} />}\n {regexField && (\n <SortExtractionEditor\n api={api}\n field={sortKey(regexField)}\n label={regexField.label}\n fieldOptions={sortable.map((f) => ({ name: sortKey(f), label: f.label }))}\n onFieldChange={(name) => setRegexField(sortable.find((f) => sortKey(f) === name) ?? null)}\n title=\"Sort with regex extraction\"\n applyLabel={termFields.includes(sortKey(regexField)) ? \"Update sort\" : \"Add sort\"}\n disabled={disabled}\n onApply={(regex) => {\n addTerm(regexField, { regex });\n setRegexField(null);\n }}\n onRemove={() => setRegexField(null)}\n onClose={() => setRegexField(null)}\n />\n )}\n </div>\n );\n}\n\n// ---- LIMIT / OFFSET -------------------------------------------------------\n\nfunction WindowRow<Row>({\n api,\n total,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n total: number | null;\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const { query } = api;\n const offsetId = useId();\n const [limitDraft, setLimitDraft] = useState(String(query.limit));\n const [offsetDraft, setOffsetDraft] = useState(String(query.offset));\n useEffect(() => setLimitDraft(String(query.limit)), [query.limit]);\n useEffect(() => setOffsetDraft(String(query.offset)), [query.offset]);\n const hasLimitDefault = query.limit === api.defaults.limit;\n const hasOffsetDefault = query.offset === api.defaults.offset;\n const hasWindowDefault = hasLimitDefault && hasOffsetDefault;\n\n function commitLimit() {\n api.setLimit(Math.max(1, Number(limitDraft) || query.limit));\n }\n function commitOffset() {\n api.setOffset(Math.max(0, Number(offsetDraft) || 0));\n }\n\n return (\n <div className=\"qt-qb-row qt-qb-pagination\">\n <label className=\"qt-qb-window-field\">\n <span className=\"qt-qb-kw\" data-mobile-label=\"Limit\">limit</span>\n <input\n className={cx(\"qt-qb-num\", classNames?.input)}\n type=\"number\"\n min={1}\n value={limitDraft}\n disabled={disabled}\n onChange={(e) => setLimitDraft(e.target.value)}\n onBlur={commitLimit}\n onKeyDown={(e) => e.key === \"Enter\" && commitLimit()}\n />\n </label>\n <div className=\"qt-qb-window-field\">\n <label className=\"qt-qb-kw\" htmlFor={offsetId} data-mobile-label=\"Offset\">offset</label>\n <span className=\"qt-qb-num-combo\">\n <input\n id={offsetId}\n className={cx(\"qt-qb-num\", classNames?.input)}\n type=\"number\"\n min={0}\n value={offsetDraft}\n disabled={disabled}\n onChange={(e) => setOffsetDraft(e.target.value)}\n onBlur={commitOffset}\n onKeyDown={(e) => e.key === \"Enter\" && commitOffset()}\n />\n {query.offset >= query.limit && (\n <button\n type=\"button\"\n className=\"qt-qb-num-step\"\n onClick={() => api.setOffset(query.offset - query.limit)}\n disabled={disabled}\n title={`Previous ${query.limit} rows`}\n aria-label={`Previous ${query.limit} rows`}\n >\n −{query.limit}\n </button>\n )}\n <button\n type=\"button\"\n className=\"qt-qb-num-step\"\n onClick={() => api.setOffset(query.offset + query.limit)}\n disabled={disabled || (total != null && query.offset + query.limit >= total)}\n title={`Next ${query.limit} rows`}\n aria-label={`Next ${query.limit} rows`}\n >\n +{query.limit}\n </button>\n </span>\n </div>\n {!hasWindowDefault && (\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() => {\n api.setLimit(api.defaults.limit);\n api.setOffset(api.defaults.offset);\n }}\n disabled={disabled}\n title=\"Reset limit and offset\"\n >\n reset\n </button>\n )}\n </div>\n );\n}\n\n// ---- METRICS (aggregations: op · measure · group-by, reorderable) ---------\n\nconst AGG_OPS: AggOp[] = [\"count\", \"count_distinct\", \"sum\", \"avg\", \"min\", \"max\"];\nconst AGG_OP_LABELS: Record<AggOp, string> = {\n count: \"count\",\n count_distinct: \"count distinct\",\n sum: \"sum\",\n avg: \"avg\",\n min: \"min\",\n max: \"max\",\n};\n\nfunction MetricsRow<Row>({\n api,\n fields,\n classNames,\n disabled,\n}: {\n api: QueryTableApi<Row>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n}) {\n const { aggregations } = api;\n const mobile = useMobileLayout();\n const clauses = aggregations.clauses;\n const [editingMetric, setEditingMetric] = useState<string | null>(null);\n const measurable = useMemo(() => fields.filter(isMeasurable), [fields]);\n const groupable = useMemo(() => fields.filter(isGroupable), [fields]);\n\n // Local live-reorder drag state (metrics are their own list, like the order-by\n // terms). Chips are identified by their stable clause id so React MOVES the\n // dragged chip instead of remounting it (a remount aborts the native drag).\n const [drag, setDrag] = useState<{ source: string; overIndex: number } | null>(null);\n\n const ids = clauses.map((c) => c.id);\n const byId = useMemo(() => new Map(clauses.map((c) => [c.id, c])), [clauses]);\n\n function previewIds(): string[] {\n if (!drag) return ids;\n const without = ids.filter((i) => i !== drag.source);\n if (without.length === ids.length) return ids;\n const at = Math.max(0, Math.min(drag.overIndex, without.length));\n return [...without.slice(0, at), drag.source, ...without.slice(at)];\n }\n function handleOver(e: React.DragEvent, id: string) {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n if (drag.source === id) return;\n const without = ids.filter((i) => i !== drag.source);\n let next = without.indexOf(id);\n if (next >= 0) {\n // Drop after the hovered chip when past its midpoint, so a metric can be\n // moved into the last slot (no clientX ⇒ insert before, like the spec).\n const rect = e.currentTarget.getBoundingClientRect();\n if (e.clientX > rect.left + rect.width / 2) next += 1;\n setDrag((d) => (d && d.overIndex !== next ? { source: d.source, overIndex: next } : d));\n }\n }\n function commitDrop() {\n if (drag) aggregations.move(drag.source, drag.overIndex);\n setDrag(null);\n }\n\n const rendered = previewIds();\n const renderMetric = (id: string) => {\n const clause = byId.get(id)!;\n return (\n <MetricChip\n key={id}\n clause={clause}\n measurable={measurable}\n groupable={groupable}\n classNames={classNames}\n disabled={disabled}\n editorOpen={editingMetric === id}\n onEditorChange={(open) => setEditingMetric(open ? id : null)}\n isDragSource={drag?.source === id}\n onDragStart={() => setDrag({ source: id, overIndex: ids.indexOf(id) })}\n onDragOver={(event) => handleOver(event, id)}\n onDrop={commitDrop}\n onDragEnd={() => setDrag(null)}\n onChangeOp={(op) => changeMetricOp(aggregations, clause, measurable, op)}\n onChangeField={(field) => aggregations.update(id, { field })}\n onAddGroup={(field) => aggregations.update(id, { groupBy: [...clause.groupBy, field] })}\n onRemoveGroup={(field) => aggregations.update(id, { groupBy: clause.groupBy.filter((group) => group !== field) })}\n onRemove={() => {\n setEditingMetric(null);\n aggregations.remove(id);\n }}\n />\n );\n };\n\n const actions = (\n <>\n <button type=\"button\" className=\"qt-add\" aria-label=\"Add metric\" onClick={() => setEditingMetric(aggregations.add())} disabled={disabled}><Icon name=\"add\" />add metric</button>\n {clauses.length > 0 && <button type=\"button\" className=\"qt-link-btn\" onClick={aggregations.clear} disabled={disabled} title=\"Remove all metrics\">reset</button>}\n </>\n );\n\n return (\n <div className=\"qt-qb-row qt-qb-row--metrics\">\n <div className=\"qt-qb-section-header\">\n <span className=\"qt-qb-kw\" data-mobile-label=\"Metrics\">metrics</span>\n {mobile && actions}\n </div>\n {mobile && clauses.length > 0 ? <ReorderList className=\"qt-query-reorder-list\" showHint={false} items={clauses.map((clause) => ({ id: clause.id, label: clause.label ?? `${AGG_OP_LABELS[clause.op]} ${clause.field ?? \"all rows\"}` }))} onMove={aggregations.move} disabled={disabled} renderItem={(item) => renderMetric(item.id)} /> : rendered.map(renderMetric)}\n {!mobile && actions}\n </div>\n );\n}\n\n/** Change a metric's op, dropping the measure if it's no longer valid for the\n * new op (e.g. switching avg→count on a text field, or to an op the field type\n * can't aggregate). `count` keeps any chosen measure. */\nfunction changeMetricOp<Row>(\n aggregations: QueryTableApi<Row>[\"aggregations\"],\n clause: AggregationClause,\n measurable: FieldDef<Row>[],\n op: AggOp,\n): void {\n const field = clause.field;\n const stillValid =\n field != null && measurable.some((f) => f.name === field && aggOpsForField(f).includes(op));\n if (field != null && !stillValid) aggregations.update(clause.id, { op, field: undefined });\n else aggregations.update(clause.id, { op });\n}\n\nfunction MetricChip<Row>({\n clause,\n measurable,\n groupable,\n classNames,\n disabled,\n isDragSource,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n onChangeOp,\n onChangeField,\n onAddGroup,\n onRemoveGroup,\n onRemove,\n editorOpen,\n onEditorChange,\n}: {\n clause: AggregationClause;\n measurable: FieldDef<Row>[];\n groupable: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n disabled: boolean | undefined;\n isDragSource: boolean;\n onDragStart: () => void;\n onDragOver: (e: React.DragEvent) => void;\n onDrop: () => void;\n onDragEnd: () => void;\n onChangeOp: (op: AggOp) => void;\n onChangeField: (field: string | undefined) => void;\n onAddGroup: (field: string) => void;\n onRemoveGroup: (field: string) => void;\n onRemove: () => void;\n editorOpen: boolean;\n onEditorChange: (open: boolean) => void;\n}) {\n const [addingGroup, setAddingGroup] = useState(false);\n const mobile = useMobileLayout();\n const byName = useMemo(() => new Map(groupable.map((f) => [f.name, f])), [groupable]);\n\n // Measures valid for the current op (a measurable field whose effective ops\n // include this op). `count` may stand alone, so it gets an \"(all rows)\" choice.\n const needsField = aggOpNeedsField(clause.op);\n const measureOptions = measurable.filter((f) => aggOpsForField(f).includes(clause.op));\n\n const operationControl = (\n <select\n className={cx(\"qt-chip-op\", classNames?.select)}\n value={clause.op}\n aria-label=\"Aggregation function\"\n disabled={disabled}\n onChange={(event) => onChangeOp(event.target.value as AggOp)}\n >\n {AGG_OPS.map((op) => (\n <option key={op} value={op}>\n {AGG_OP_LABELS[op]}\n </option>\n ))}\n </select>\n );\n const measureControl = (\n <select\n className={cx(\"qt-chip-val\", classNames?.select)}\n value={clause.field ?? \"\"}\n aria-label=\"Metric measure\"\n disabled={disabled}\n onChange={(event) => onChangeField(event.target.value || undefined)}\n >\n {!needsField && <option value=\"\">(all rows)</option>}\n {needsField && clause.field == null && <option value=\"\">measure…</option>}\n {measureOptions.map((field) => (\n <option key={field.name} value={field.name}>\n {field.label}\n </option>\n ))}\n </select>\n );\n const groupControl = (\n <span className=\"qt-chip-agg-by\">\n {clause.groupBy.map((field) => (\n <span className=\"qt-chip-agg-group\" key={field}>\n <span className=\"qt-chip-agg-group-label\">{byName.get(field)?.label ?? field}</span>\n <button type=\"button\" className=\"qt-chip-x\" onClick={() => onRemoveGroup(field)} disabled={disabled} aria-label={`Remove ${byName.get(field)?.label ?? field} grouping`}>\n <Icon name=\"close\" />\n </button>\n </span>\n ))}\n {addingGroup ? (\n <FieldPicker\n fields={groupable}\n excluded={clause.groupBy}\n onPick={(field) => {\n onAddGroup(field.name);\n setAddingGroup(false);\n }}\n onClose={() => setAddingGroup(false)}\n />\n ) : (\n <button\n type=\"button\"\n className=\"qt-add qt-chip-agg-add\"\n onClick={() => setAddingGroup(true)}\n disabled={disabled}\n title=\"Group by a field\"\n aria-label=\"Add grouping field\"\n >\n <Icon name=\"add\" />{mobile ? \"group\" : clause.groupBy.length === 0 ? \"by\" : null}\n </button>\n )}\n </span>\n );\n\n if (mobile) return (\n <MobileChipEditor title={clause.label ?? `${AGG_OP_LABELS[clause.op]} ${measurable.find((field) => field.name === clause.field)?.label ?? \"all rows\"}`} summary={clause.groupBy.length ? `By ${clause.groupBy.map((name) => byName.get(name)?.label ?? name).join(\", \")}` : \"All matching rows\"} disabled={disabled} open={editorOpen} onOpenChange={onEditorChange}>\n <div className=\"qt-mobile-form\">\n <label className=\"qt-mobile-form-field\"><span>Function</span>{operationControl}</label>\n <label className=\"qt-mobile-form-field\"><span>Measure</span>{measureControl}</label>\n <div className=\"qt-mobile-form-field qt-mobile-form-field--wide\"><span>Group by</span>{groupControl}</div>\n <p className=\"qt-mobile-form-hint\">Uses all filtered rows, not just this page.</p>\n <button type=\"button\" className=\"qt-mobile-form-remove\" onClick={onRemove} disabled={disabled}>Remove metric</button>\n </div>\n </MobileChipEditor>\n );\n\n return (\n <span\n className={cx(\"qt-chip\", \"qt-chip--agg\", isDragSource && \"qt-chip--dragging\", classNames?.chip)}\n draggable={!disabled}\n onDragStart={(event) => {\n onDragStart();\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", clause.id);\n }}\n onDragOver={onDragOver}\n onDrop={(event) => {\n event.preventDefault();\n onDrop();\n }}\n onDragEnd={onDragEnd}\n title=\"drag to reorder metrics\"\n >\n <span aria-hidden className=\"qt-chip-grip\"><Icon name=\"grip\" /></span>\n {operationControl}\n {measureControl}\n {clause.groupBy.length > 0 && <span className=\"qt-chip-agg-kw\">by</span>}\n {groupControl}\n <button type=\"button\" className=\"qt-chip-x\" onClick={onRemove} disabled={disabled} title=\"Remove metric\" aria-label=\"Remove metric\">\n <Icon name=\"close\" />\n </button>\n </span>\n );\n}\n","// FieldPicker — grouped, searchable field chooser.\n// Searches label + name + aliases, groups by FieldDef.group, and surfaces\n// per-field stats (distinct count, min/max) when the Transport provides them.\n// Used to add columns and to add filters.\n\nimport { useMemo, useState, type ReactNode } from \"react\";\nimport type { FieldDef, FieldStats } from \"@pythia-software/query-table-core\";\nimport { AdaptiveOverlay, useMobileLayout } from \"./AdaptiveOverlay\";\n\nexport interface FieldPickerProps<Row> {\n fields: FieldDef<Row>[];\n /** Already-shown field names, so the picker can mark/hide them. */\n excluded?: string[];\n /** Stats keyed by field name (optional). */\n stats?: Record<string, FieldStats>;\n /** When true, dim/disable fields with ≤1 distinct value (\"gate on distinct\"). */\n gateOnDistinct?: boolean;\n onPick: (field: FieldDef<Row>) => void;\n onClose?: () => void;\n}\n\nconst UNGROUPED = \"other\";\n\nexport function FieldPicker<Row>({\n fields,\n excluded,\n stats,\n gateOnDistinct,\n onPick,\n onClose,\n}: FieldPickerProps<Row>): ReactNode {\n const mobile = useMobileLayout();\n const [search, setSearch] = useState(\"\");\n const needle = search.trim().toLowerCase();\n const excludedSet = useMemo(() => new Set(excluded ?? []), [excluded]);\n\n const matched = useMemo(\n () =>\n fields.filter((f) => {\n if (excludedSet.has(f.name)) return false;\n if (!needle) return true;\n return (\n f.label.toLowerCase().includes(needle) ||\n f.name.toLowerCase().includes(needle) ||\n (fieldAliases(f).some((a) => a.toLowerCase().includes(needle)))\n );\n }),\n [fields, excludedSet, needle],\n );\n\n const grouped = useMemo(() => groupByGroup(matched), [matched]);\n\n const firstEnabled = matched.find((f) => isEnabled(f, stats, gateOnDistinct));\n\n return (\n <AdaptiveOverlay title=\"Choose a field\" onClose={() => onClose?.()} enabled={Boolean(onClose)}>\n <div className=\"qt-picker\" onBlur={(event) => {\n if (!mobile && !event.currentTarget.contains(event.relatedTarget as Node | null)) onClose?.();\n }}>\n <input\n autoFocus={!mobile}\n aria-label=\"Search fields\"\n type=\"text\"\n className=\"qt-picker-input\"\n placeholder=\"search fields…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onClose?.();\n if (e.key === \"Enter\" && firstEnabled) {\n onPick(firstEnabled);\n setSearch(\"\");\n }\n }}\n />\n <div className=\"qt-picker-list\">\n {matched.length === 0 ? (\n <div className=\"qt-picker-empty\">no matches</div>\n ) : (\n grouped.map(([group, fs]) => (\n <div key={group} className=\"qt-picker-group\">\n <div className=\"qt-picker-group-label\">{group}</div>\n {fs.map((f) => {\n const enabled = isEnabled(f, stats, gateOnDistinct);\n const s = stats?.[f.name];\n const aliasHit = aliasMatch(f, needle);\n return (\n <button\n key={f.name}\n type=\"button\"\n disabled={!enabled}\n className={enabled ? \"qt-picker-item\" : \"qt-picker-item qt-picker-item--disabled\"}\n title={enabled ? f.name : \"not useful as a filter (≤1 distinct value)\"}\n onPointerDown={(event) => {\n if (!mobile) event.preventDefault();\n }}\n onClick={() => {\n if (!enabled) return;\n onPick(f);\n setSearch(\"\");\n }}\n >\n <span className=\"qt-picker-row\">\n <span className=\"qt-picker-label\">{f.label}</span>\n <span className=\"qt-picker-name\">{f.name}</span>\n </span>\n {aliasHit && <span className=\"qt-picker-alias\">matches: {aliasHit}</span>}\n {s && (\n <span className=\"qt-picker-stats\">\n {s.distinct != null && <>{s.distinct} distinct</>}\n {s.min != null && s.max != null && (\n <>\n {\" \"}\n · {fmtStat(s.min)}…{fmtStat(s.max)}\n </>\n )}\n </span>\n )}\n </button>\n );\n })}\n </div>\n ))\n )}\n </div>\n </div>\n </AdaptiveOverlay>\n );\n}\n\nfunction isEnabled(f: FieldDef, stats: FieldPickerProps<any>[\"stats\"], gate: boolean | undefined): boolean {\n if (!gate) return true;\n const s = stats?.[f.name];\n if (!s || s.distinct == null) return true; // no data → don't gate\n return s.distinct > 1;\n}\n\nfunction aliasMatch(f: FieldDef, needle: string): string | undefined {\n if (!needle) return undefined;\n if (f.label.toLowerCase().includes(needle) || f.name.toLowerCase().includes(needle)) return undefined;\n return fieldAliases(f).find((a) => a.toLowerCase().includes(needle));\n}\n\nfunction fieldAliases<Row>(f: FieldDef<Row>): string[] {\n const aliases = new Set<string>();\n if (f.alias) aliases.add(f.alias);\n if (f.aliases) {\n for (const alias of f.aliases) aliases.add(alias);\n }\n return [...aliases];\n}\n\nfunction groupByGroup<Row>(fs: FieldDef<Row>[]): Array<[string, FieldDef<Row>[]]> {\n const groups = new Map<string, FieldDef<Row>[]>();\n for (const f of fs) {\n const key = f.group ?? UNGROUPED;\n const arr = groups.get(key);\n if (arr) arr.push(f);\n else groups.set(key, [f]);\n }\n return [...groups.entries()];\n}\n\nfunction fmtStat(v: string | number): string {\n if (typeof v === \"number\") return v.toLocaleString();\n const s = String(v);\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(s)) return s.slice(0, 10);\n if (s.length > 18) return s.slice(0, 15) + \"…\";\n return s;\n}\n","// SavedQueriesModal — list / load / delete named saved queries. Thin view over\n// api.saved; loading one pushes its QueryState into the controller (and the URL).\n\nimport { type ReactNode } from \"react\";\nimport type { SavedQueriesApi } from \"@pythia-software/query-table-react\";\nimport { ModalSurface } from \"./AdaptiveOverlay\";\n\nexport interface SavedQueriesModalProps {\n saved: SavedQueriesApi;\n onClose: () => void;\n onLoad?: (savedId: string) => void;\n}\n\nexport function SavedQueriesModal({ saved, onClose, onLoad }: SavedQueriesModalProps): ReactNode {\n return (\n <ModalSurface title=\"Saved queries\" onClose={onClose}>\n <div className=\"qt-overlay-body\">\n {saved.loading ? (\n <p className=\"qt-muted\">Loading…</p>\n ) : saved.items.length === 0 ? (\n <p className=\"qt-muted\">None saved yet. Save the current query from the toolbar.</p>\n ) : (\n <ul className=\"qt-saved-list\">\n {saved.items.map((s) => {\n const filters = s.query.where.length;\n const isDefault = saved.defaultId === s.id;\n return (\n <li key={s.id} className=\"qt-saved-item\">\n <button\n type=\"button\"\n className=\"qt-saved-pick\"\n onClick={() => {\n onLoad?.(s.id);\n saved.load(s.id);\n onClose();\n }}\n >\n <span className=\"qt-saved-name\">{s.name}</span>\n <span className=\"qt-saved-meta qt-muted\">\n {isDefault ? \"Default view · \" : \"\"}\n {new Date(s.savedAt).toLocaleString()} · {filters} filter{filters === 1 ? \"\" : \"s\"}\n </span>\n </button>\n {isDefault ? (\n <button\n type=\"button\"\n className=\"qt-btn qt-saved-default\"\n title=\"Clear default view\"\n onClick={() => void saved.clearDefault()}\n >\n default\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"qt-btn qt-saved-default\"\n title=\"Use as default view\"\n onClick={() => void saved.setDefault(s.id)}\n >\n make default\n </button>\n )}\n <button\n type=\"button\"\n className=\"qt-btn qt-saved-delete\"\n title=\"Delete saved query\"\n onClick={() => void saved.remove(s.id)}\n >\n delete\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </ModalSurface>\n );\n}\n","// MetricsPanel — the dashboard strip above the table.\n//\n// Renders the optional aggregation metrics (see @pythia-software/query-table-core\n// AggregationClause). Each metric's shape follows its group-by arity:\n// 0 group-by → one big number\n// 1 group-by → a ranked bar list (label · value · share bar)\n// 2 group-by → an x/y pivot table (rows = axis 0, cols = axis 1)\n// 3+ group-by → a flat table, one column per group key + the value\n//\n// Values are formatted through the measure field's own renderer where it makes\n// sense (so AVG(total_ms) reads \"3.2s\", not \"3200\"), falling back to a locale\n// number. Counts are always plain integers.\n\nimport { useMemo, type ReactNode } from \"react\";\nimport { EMPTY_QUERY } from \"@pythia-software/query-table-core\";\nimport type { AggOp, AggregationBucket, AggregationClause, FieldDef } from \"@pythia-software/query-table-core\";\nimport type { AggregationsApi } from \"@pythia-software/query-table-react\";\nimport { resolveRenderer, type RenderRegistry } from \"./renderers\";\n\nexport interface MetricsPanelProps<Row> {\n /** The aggregation API from useQueryTable (clauses + results + status). */\n aggregations: AggregationsApi;\n /** All schema fields, to resolve labels + the measure field's renderer. */\n fields: FieldDef<Row>[];\n /** Cell renderers (same registry as the table) for formatting measure values. */\n renderers?: RenderRegistry<Row>;\n /** Hidden entirely when there are no metrics unless this is set. */\n emptyMessage?: string;\n classNames?: { root?: string; metric?: string };\n}\n\nconst cx = (...parts: Array<string | undefined | false>): string =>\n parts.filter((p): p is string => Boolean(p)).join(\" \");\n\nconst OP_LABELS: Record<AggOp, string> = {\n count: \"Count\",\n count_distinct: \"Distinct\",\n sum: \"Sum\",\n avg: \"Avg\",\n min: \"Min\",\n max: \"Max\",\n};\n\nconst NULL_KEY = \"∅\";\n\nexport function MetricsPanel<Row>({\n aggregations,\n fields,\n renderers,\n emptyMessage,\n classNames,\n}: MetricsPanelProps<Row>): ReactNode {\n const byName = useMemo(() => new Map(fields.map((f) => [f.name, f])), [fields]);\n const { clauses, results, loading, error } = aggregations;\n\n if (clauses.length === 0) {\n return emptyMessage ? <div className={cx(\"qt-metrics\", classNames?.root)}>{emptyMessage}</div> : null;\n }\n\n const resultById = new Map((results?.metrics ?? []).map((m) => [m.id, m.buckets]));\n\n return (\n <div className={cx(\"qt-metrics\", classNames?.root)}>\n {error ? <div className=\"qt-metrics-error\">Metrics failed: {error.message}</div> : null}\n {clauses.map((clause) => (\n <MetricCard\n key={clause.id}\n clause={clause}\n buckets={resultById.get(clause.id) ?? []}\n loading={loading && !resultById.has(clause.id)}\n byName={byName}\n renderers={renderers}\n className={classNames?.metric}\n />\n ))}\n </div>\n );\n}\n\nfunction MetricCard<Row>({\n clause,\n buckets,\n loading,\n byName,\n renderers,\n className,\n}: {\n clause: AggregationClause;\n buckets: AggregationBucket[];\n loading: boolean;\n byName: Map<string, FieldDef<Row>>;\n renderers: RenderRegistry<Row> | undefined;\n className: string | undefined;\n}): ReactNode {\n const measure = clause.field ? byName.get(clause.field) : undefined;\n const groupLabels = clause.groupBy.map((g) => byName.get(g)?.label ?? g);\n // One decimal-place count for the whole card (≈5 significant figures), so every\n // value lines up and we never render a 12-digit float tail.\n const decimals = useMemo(() => cardDecimals(buckets), [buckets]);\n const fmt = (v: number | string | null): ReactNode => formatMetricValue(v, clause.op, measure, renderers, decimals);\n\n return (\n <div className={cx(\"qt-metric\", `qt-metric--gb${Math.min(clause.groupBy.length, 3)}`, className)}>\n <div className=\"qt-metric-head\">\n <span className=\"qt-metric-title\">{metricTitle(clause, measure)}</span>\n {groupLabels.length > 0 && <span className=\"qt-metric-by\">by {groupLabels.join(\" × \")}</span>}\n </div>\n {loading && buckets.length === 0 ? (\n <div className=\"qt-metric-loading\">…</div>\n ) : buckets.length === 0 ? (\n <div className=\"qt-metric-empty\">no data</div>\n ) : clause.groupBy.length === 0 ? (\n <BigNumber bucket={buckets[0]!} fmt={fmt} />\n ) : clause.groupBy.length === 1 ? (\n <BarList buckets={buckets} fmt={fmt} />\n ) : clause.groupBy.length === 2 ? (\n <Pivot buckets={buckets} fmt={fmt} rowLabel={groupLabels[0]!} colLabel={groupLabels[1]!} />\n ) : (\n <FlatTable buckets={buckets} fmt={fmt} groupLabels={groupLabels} valueLabel={metricTitle(clause, measure)} />\n )}\n </div>\n );\n}\n\n// ---- 0 group-by: one big number -------------------------------------------\n\nfunction BigNumber({ bucket, fmt }: { bucket: AggregationBucket; fmt: (v: number | string | null) => ReactNode }) {\n return (\n <div className=\"qt-metric-big\">\n <span className=\"qt-metric-big-value\">{fmt(bucket.value)}</span>\n <span className=\"qt-metric-big-sub\">{bucket.count.toLocaleString()} rows</span>\n </div>\n );\n}\n\n// ---- 1 group-by: ranked bars ----------------------------------------------\n\nfunction BarList({ buckets, fmt }: { buckets: AggregationBucket[]; fmt: (v: number | string | null) => ReactNode }) {\n const max = Math.max(...buckets.map((b) => barMagnitude(b)), 0);\n return (\n <div className=\"qt-metric-bars\">\n {buckets.map((b, i) => {\n const pct = max > 0 ? (barMagnitude(b) / max) * 100 : 0;\n return (\n <div className=\"qt-metric-bar-row\" key={`${keyText(b.keys[0])}-${i}`}>\n <span className=\"qt-metric-bar-label\" title={keyText(b.keys[0])}>\n {keyNode(b.keys[0])}\n </span>\n <span className=\"qt-metric-bar-track\">\n <span className=\"qt-metric-bar-fill\" style={{ width: `${pct}%` }} />\n </span>\n <span className=\"qt-metric-bar-value\">{fmt(b.value)}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---- 2 group-by: x/y pivot ------------------------------------------------\n\nfunction Pivot({\n buckets,\n fmt,\n rowLabel,\n colLabel,\n}: {\n buckets: AggregationBucket[];\n fmt: (v: number | string | null) => ReactNode;\n rowLabel: string;\n colLabel: string;\n}) {\n const rowKeys = distinctKeys(buckets, 0);\n const colKeys = distinctKeys(buckets, 1);\n const cell = new Map<string, number | string | null>();\n for (const b of buckets) cell.set(`${keyText(b.keys[0])}\\u0000${keyText(b.keys[1])}`, b.value);\n\n return (\n <div className=\"qt-metric-pivot-wrap\">\n <table className=\"qt-metric-pivot\">\n <thead>\n <tr>\n <th className=\"qt-metric-pivot-corner\">\n <span className=\"qt-metric-pivot-axes\">\n {rowLabel} <span className=\"qt-muted\">\\</span> {colLabel}\n </span>\n </th>\n {colKeys.map((c) => (\n <th key={keyText(c)} className=\"qt-metric-pivot-col\">\n {keyNode(c)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rowKeys.map((r) => (\n <tr key={keyText(r)}>\n <th className=\"qt-metric-pivot-row\">{keyNode(r)}</th>\n {colKeys.map((c) => {\n const v = cell.get(`${keyText(r)}\\u0000${keyText(c)}`);\n return (\n <td key={keyText(c)} className=\"qt-metric-pivot-cell\">\n {v === undefined ? <span className=\"qt-muted\">·</span> : fmt(v)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ---- 3+ group-by: flat table ----------------------------------------------\n\nfunction FlatTable({\n buckets,\n fmt,\n groupLabels,\n valueLabel,\n}: {\n buckets: AggregationBucket[];\n fmt: (v: number | string | null) => ReactNode;\n groupLabels: string[];\n valueLabel: string;\n}) {\n return (\n <div className=\"qt-metric-pivot-wrap\">\n <table className=\"qt-metric-flat\">\n <thead>\n <tr>\n {groupLabels.map((g) => (\n <th key={g}>{g}</th>\n ))}\n <th className=\"qt-metric-flat-value\">{valueLabel}</th>\n </tr>\n </thead>\n <tbody>\n {buckets.map((b, i) => (\n <tr key={i}>\n {/* Index by column, not by b.keys: a bucket whose `keys` is shorter\n than the header (a malformed/partial result) must still leave the\n value in the value column rather than sliding it left. */}\n {groupLabels.map((_, j) => (\n <td key={j}>{keyNode(b.keys[j])}</td>\n ))}\n <td className=\"qt-metric-flat-value\">{fmt(b.value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ---- helpers --------------------------------------------------------------\n\nfunction metricTitle<Row>(clause: AggregationClause, measure: FieldDef<Row> | undefined): string {\n if (clause.label) return clause.label;\n if (clause.op === \"count\" && !measure) return \"Count\";\n return `${OP_LABELS[clause.op]} ${measure?.label ?? clause.field ?? \"\"}`.trim();\n}\n\n// Default renderers that map a number to a unit-formatted string (and so already\n// bound their own decimals). Any OTHER renderer (text/link/pill/number) is skipped\n// for numeric aggregates — it would stringify the raw float — in favor of the\n// card's shared decimal formatting.\nconst UNIT_RENDER_KEYS: ReadonlySet<string> = new Set([\"duration_ms\", \"byte_size\"]);\n\nfunction formatMetricValue<Row>(\n value: number | string | null,\n op: AggOp,\n measure: FieldDef<Row> | undefined,\n renderers: RenderRegistry<Row> | undefined,\n decimals: number,\n): ReactNode {\n if (value == null) return <span className=\"qt-muted\">—</span>;\n // Counts are dimensionless integers — never run them through a column renderer.\n if (op === \"count\" || op === \"count_distinct\") {\n return typeof value === \"number\" ? formatNumber(value, 0) : String(value);\n }\n if (typeof value === \"number\") {\n const key = typeof measure?.render === \"string\" ? measure.render : undefined;\n if (key && UNIT_RENDER_KEYS.has(key) && measure && renderers) {\n const node = tryRender(measure, renderers, value);\n if (node != null) return node;\n }\n return formatNumber(value, decimals);\n }\n // min/max over text or datetime → the column's renderer, else the raw string.\n if (measure && renderers) {\n const node = tryRender(measure, renderers, value);\n if (node != null) return node;\n }\n return String(value);\n}\n\nfunction tryRender<Row>(\n measure: FieldDef<Row>,\n renderers: RenderRegistry<Row>,\n value: number | string,\n): ReactNode | null {\n try {\n const node = resolveRenderer(measure, renderers)({\n value: value as never,\n row: {} as Row,\n field: measure,\n query: EMPTY_QUERY,\n });\n return node != null && node !== \"\" ? node : null;\n } catch {\n return null;\n }\n}\n\nfunction formatNumber(value: number, decimals: number): string {\n if (!Number.isFinite(value)) return String(value);\n return value.toLocaleString(undefined, { minimumFractionDigits: decimals, maximumFractionDigits: decimals });\n}\n\n// One decimal count for every numeric value in a card: 0 when all are integers\n// (counts, integer measures), else enough places to give the largest-magnitude\n// value ≈5 significant figures (so smaller values share that precision and no\n// value shows a runaway float tail). Capped at 6.\nfunction cardDecimals(buckets: AggregationBucket[]): number {\n const nums = buckets\n .map((b) => b.value)\n .filter((v): v is number => typeof v === \"number\" && Number.isFinite(v));\n if (nums.length === 0) return 0;\n if (nums.every((v) => Number.isInteger(v))) return 0;\n const maxAbs = Math.max(...nums.map((v) => Math.abs(v)));\n const intDigits = maxAbs >= 1 ? Math.floor(Math.log10(maxAbs)) + 1 : 0;\n return Math.min(6, Math.max(0, 5 - intDigits));\n}\n\nfunction barMagnitude(b: AggregationBucket): number {\n return typeof b.value === \"number\" ? Math.abs(b.value) : b.count;\n}\n\nfunction distinctKeys(buckets: AggregationBucket[], axis: number): (string | null)[] {\n const seen = new Set<string>();\n const out: (string | null)[] = [];\n for (const b of buckets) {\n const k = b.keys[axis] ?? null;\n const t = keyText(k);\n if (!seen.has(t)) {\n seen.add(t);\n out.push(k);\n }\n }\n return out;\n}\n\nfunction keyText(k: string | null | undefined): string {\n return k == null ? NULL_KEY : String(k);\n}\n\nfunction keyNode(k: string | null | undefined): ReactNode {\n return k == null ? <span className=\"qt-muted\">{NULL_KEY}</span> : String(k);\n}\n","// SelectionToolbar — the bulk-action FRAME, not the actions.\n//\n// Deliberately generic: it shows the selected count, a clear-all, and an\n// `actions` slot. The actual verbs are domain logic the consumer renders into the\n// slot. The reusable part is the selection plumbing + affordance; the verbs are\n// not. This keeps domain coupling out while still shipping the pattern.\n\nimport type { ReactNode } from \"react\";\nimport type { RowId } from \"@pythia-software/query-table-core\";\nimport type { SelectionApi } from \"@pythia-software/query-table-react\";\n\nexport interface SelectionToolbarProps {\n selection: SelectionApi;\n /** Consumer-rendered action buttons. Receives the selected ids and the public\n * selection API. Existing callbacks that accept only ids remain supported. */\n actions: (selectedIds: RowId[], selection: SelectionApi) => ReactNode;\n /** Hidden when nothing is selected unless `alwaysShow`. */\n alwaysShow?: boolean;\n className?: string;\n}\n\nconst cx = (...parts: Array<string | undefined>): string => parts.filter(Boolean).join(\" \");\n\nexport function SelectionToolbar({ selection, actions, alwaysShow, className }: SelectionToolbarProps): ReactNode {\n if (selection.count === 0 && !alwaysShow) return null;\n\n const selectedIds = [...selection.selected];\n\n return (\n <div className={cx(\"qt-selection-toolbar\", className)} role=\"toolbar\">\n <span className=\"qt-selection-count\">\n {selection.count} selected\n </span>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={selection.clear}\n disabled={selection.count === 0}\n >\n clear\n </button>\n <span className=\"qt-selection-actions\">{actions(selectedIds, selection)}</span>\n </div>\n );\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","useEffect","useRef","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useEffect","Fragment","jsx","jsxs","useEffect","Fragment","jsx","jsxs","cx","MENU_WIDTH","useState","useRef","useEffect","valueToString","MenuItem","useEffect","useId","useMemo","useRef","useState","useRef","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useId","useState","useRef","useMemo","useEffect","label","f","useEffect","useId","useMemo","useRef","useState","Fragment","jsx","jsxs","useState","useRef","useId","useMemo","useEffect","useEffect","useId","useRef","useState","opsForField","Fragment","jsx","jsxs","useState","useRef","useId","opsForField","useEffect","Fragment","useEffect","useId","useMemo","useRef","useState","NULLARY_OPS","opPairsForField","negateClause","isFilterable","isSelectable","isSortable","opsForField","useMemo","useState","Fragment","jsx","jsxs","useState","useMemo","jsx","jsxs","Fragment","jsx","jsxs","cx","formatDuration","useState","useEffect","opsForField","NULLARY_OPS","useState","useMemo","useId","formatDuration","useRef","useEffect","jsxs","cx","jsx","Fragment","isSelectable","opsForField","isFilterable","option","NULLARY_OPS","opPairsForField","negateClause","isSortable","term","useMemo","jsx","jsxs","cx","useMemo","valueLabel","jsx","jsxs","cx"]}