@pythia-software/query-table-ui 0.5.0 → 0.6.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/README.md +32 -4
- package/dist/FormulaEditor-FZPLQRWN.js +739 -0
- package/dist/FormulaEditor-FZPLQRWN.js.map +1 -0
- package/dist/index.d.ts +114 -9
- package/dist/index.js +6629 -1496
- package/dist/index.js.map +1 -1
- package/dist/theme.css +1838 -17
- package/dist/theme.css.map +1 -1
- package/package.json +4 -10
- package/dist/FormulaEditor-YCPICDIH.js +0 -251
- package/dist/FormulaEditor-YCPICDIH.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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] > 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"]}
|
|
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/columnWidths.ts","../src/RequestActivity.tsx","../src/metricPresentation.ts","../src/MetricsEditor.tsx","../src/ReorderList.tsx","../src/MetricsPanel.tsx","../src/MetricChart.tsx","../src/metricColors.ts","../src/metricFormat.ts","../src/metricChartHelpers.ts","../src/useMetricResize.ts","../src/useMetricWorkbench.ts","../src/SelectColumnEditor.tsx","../src/previewOrdering.ts","../src/SortExtractionEditor.tsx","../src/sortExtractionPreview.ts","../src/SetFilterEditor.tsx","../src/QueryBuilder.tsx","../src/FieldPicker.tsx","../src/SavedQueriesModal.tsx","../src/SelectionToolbar.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nconst artwork = {\n panelList: <><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M9 4v16M13 8h4M13 12h4M13 16h4\" /></>,\n panelDefinition: <><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"m10 9-3 3 3 3m4-6 3 3-3 3\" /></>,\n panelReference: <><path d=\"M12 5v15M12 5C9 3 6 3 3 4v15c3-1 6-1 9 1 3-2 6-2 9-1V4c-3-1-6-1-9 1Z\" /><path d=\"M6 8h3m6 0h3M6 12h3m6 0h3\" /></>,\n panelPreview: <><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M7 16v-4m5 4V8m5 8v-6\" /></>,\n dashboard: <><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" /></>,\n resize: <path d=\"m8 20 12-12m-6 12 6-6\" />,\n alert: <><path d=\"m12 3 10 18H2Z\" /><path d=\"M12 9v5m0 3v.1\" /></>,\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 stopwatch: <><circle cx=\"12\" cy=\"14\" r=\"8\" /><path d=\"M9 2h6m-3 0v4m6 1 2-2M12 10v4l3-2\" /></>,\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, the loading bar, and the header menu (sort, column widths). 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, useLayoutEffect, 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\";\nimport { equalWidths, fitContentWidths, fitScreenWidths, type ColumnWidthPreset } from \"./columnWidths\";\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;\n// Covers collapsed borders and sub-pixel text so measured content never ellipsizes.\nconst AUTOFIT_EXTRA_PX = 4;\n// Collapsed outer table border; keeps \"fit to screen\" from adding a scrollbar.\nconst TABLE_BORDER_PX = 2;\nconst TRAILING_WIDTH = 40;\nconst MENU_WIDTH = 240;\nconst MENU_ROW_HEIGHT = 32;\nconst SUBMENU_WIDTH = 200;\nconst WIDTH_SUBMENU_OVERHANG_ROWS = 5;\nconst SUBMENU_CLOSE_DELAY_MS = 300;\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 [selectionColumnIndex, setSelectionColumnIndex] = useState(0);\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 setWidths(new Map([[name, width]]));\n }\n function setWidths(widths: Map<string, number>) {\n const px = new Map(Array.from(widths, ([name, width]) => [name, clampWidth(width)]));\n onQueryChange((prev) => ({ ...prev, select: writeWidths(prev.select, fields, 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 /** Widest rendered header/cell content per column (0 when nothing measured). */\n function measureContentWidths(names: string[]): number[] {\n const wrap = tableWrapRef.current;\n if (!wrap) return names.map(() => 0);\n return names.map((name) => {\n const cells = wrap.querySelectorAll<HTMLElement>(`[data-qt-field=\"${cssAttributeValue(name)}\"]`);\n const width = measureIntrinsicWidth(Array.from(cells));\n return width > 0 ? width + AUTOFIT_EXTRA_PX : 0;\n });\n }\n function autofitColumn(name: string) {\n const [width = 0] = measureContentWidths([name]);\n if (width > 0) setWidth(name, width);\n }\n function applyWidthPreset(preset: ColumnWidthPreset) {\n setMenu(null);\n const names = renderedColumnNames.filter((name) => fieldByName.has(name));\n if (names.length === 0) return;\n const content = measureContentWidths(names).map((w, i) => w || displayColumnWidthFor(names[i]!, fieldByName.get(names[i]!)));\n const wrap = tableWrapRef.current;\n const available = (wrap?.clientWidth ?? 0)\n - (showSel ? selectionColumnWidth : 0)\n - (trailing ? TRAILING_WIDTH : 0)\n - TABLE_BORDER_PX;\n const widths = preset === \"content\"\n ? fitContentWidths(content)\n : preset === \"equal\"\n ? equalWidths(names.length, available)\n : fitScreenWidths(content, available);\n setWidths(new Map(names.map((name, i) => [name, widths[i]!])));\n }\n const hasCustomWidths = selectionColumnWidth !== DEFAULT_SELECTION_WIDTH || query.select.some((c) => c.width != null);\n function resetWidths() {\n setMenu(null);\n setSelectionColumnWidth(DEFAULT_SELECTION_WIDTH);\n onQueryChange((prev) => ({ ...prev, select: prev.select.map((c) => ({ field: c.field })) }));\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 const nextSelectionIndex = withoutDragged.indexOf(SELECTION_COLUMN);\n if (nextSelectionIndex >= 0) setSelectionColumnIndex(nextSelectionIndex);\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 // QueryState.select owns field order on every surface. Keep only the\n // auxiliary selection column's position locally, so chip edits/undo cannot\n // be shadowed by a stale header order.\n const order = [...fieldNames];\n order.splice(Math.min(selectionColumnIndex, order.length), 0, SELECTION_COLUMN);\n return order;\n }, [fieldNames, showSel, selectionColumnIndex]);\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 const dragPreviewRef = useRef<string[] | null>(null);\n const dropRevisionRef = useRef(columnDrag.dropRevision);\n // A drop handled by chips also commits the full table preview's auxiliary\n // position. Cancelled drags must never move selection, even when fields match.\n const useCommitLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n useCommitLayoutEffect(() => {\n if (columnDrag.active) {\n dragPreviewRef.current = renderedColumnNames;\n return;\n }\n const confirmed = dropRevisionRef.current !== columnDrag.dropRevision;\n dropRevisionRef.current = columnDrag.dropRevision;\n const preview = dragPreviewRef.current;\n dragPreviewRef.current = null;\n if (!confirmed || !preview || !sameOrder(preview.filter((name) => name !== SELECTION_COLUMN), fieldNames)) return;\n const index = preview.indexOf(SELECTION_COLUMN);\n if (index >= 0) setSelectionColumnIndex(index);\n }, [columnDrag.active, columnDrag.dropRevision, renderedColumnNames, fieldNames]);\n\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 ? TRAILING_WIDTH : 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: TRAILING_WIDTH }} />}\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), tableColumnNames);\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, tableColumnNames);\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, renderedColumnNames.indexOf(from));\n columnDrag.end(Boolean(from && columnDrag.overIndex != null));\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), tableColumnNames);\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, tableColumnNames);\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, renderedColumnNames.indexOf(from));\n columnDrag.end(Boolean(from && columnDrag.overIndex != null));\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 canResetWidths={hasCustomWidths}\n onFitColumn={() => {\n setMenu(null);\n autofitColumn(menu.field.name);\n }}\n onWidthPreset={applyWidthPreset}\n onResetWidths={resetWidths}\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 canResetWidths,\n onSetSort,\n onRemove,\n onFitColumn,\n onWidthPreset,\n onResetWidths,\n onClose,\n}: {\n field: FieldDef<Row>;\n x: number;\n y: number;\n sortable: boolean;\n canRemoveColumn: boolean;\n canResetWidths: boolean;\n onSetSort: (placement: HeaderSortPlacement, dir: \"asc\" | \"desc\") => void;\n onRemove: () => void;\n onFitColumn: () => void;\n onWidthPreset: (preset: ColumnWidthPreset) => void;\n onResetWidths: () => void;\n onClose: () => void;\n}) {\n const mobile = useMobileLayout();\n const [widthsOpen, setWidthsOpen] = useState(false);\n const widthsTriggerRef = useRef<HTMLButtonElement>(null);\n const widthsMenuRef = useRef<HTMLDivElement>(null);\n const focusWidthsOnOpen = useRef(false);\n // Closing on a short delay lets the pointer cut diagonally across sibling\n // items on its way into the submenu without dismissing it.\n const widthsCloseTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelWidthsClose = () => {\n if (widthsCloseTimer.current) clearTimeout(widthsCloseTimer.current);\n widthsCloseTimer.current = null;\n };\n useEffect(() => cancelWidthsClose, []);\n useEffect(() => {\n if (!widthsOpen || !focusWidthsOnOpen.current) return;\n focusWidthsOnOpen.current = false;\n widthsMenuRef.current?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")?.focus();\n }, [widthsOpen]);\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 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 // Desktop submenu flies out to the right, or to the left near the edge.\n const flipWidths = left + MENU_WIDTH + SUBMENU_WIDTH + 12 > vw;\n\n items.push(<div key=\"sep\" className=\"qt-cm-sep\" />);\n items.push(\n <div\n key=\"widths\"\n className=\"qt-cm-submenu-wrap\"\n onMouseEnter={mobile ? undefined : () => {\n cancelWidthsClose();\n setWidthsOpen(true);\n }}\n onMouseLeave={mobile ? undefined : () => {\n cancelWidthsClose();\n widthsCloseTimer.current = setTimeout(() => setWidthsOpen(false), SUBMENU_CLOSE_DELAY_MS);\n }}\n >\n <button\n ref={widthsTriggerRef}\n type=\"button\"\n className={cx(\"qt-cm-item\", \"qt-cm-submenu-trigger\", widthsOpen && \"qt-cm-item--open\")}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={widthsOpen}\n // Desktop hover has already opened it, so a click must not toggle it\n // shut under the pointer; the inline mobile sheet section toggles.\n onClick={() => setWidthsOpen((open) => (mobile ? !open : true))}\n onKeyDown={(e) => {\n if (e.key !== \"ArrowRight\") return;\n e.preventDefault();\n focusWidthsOnOpen.current = true;\n setWidthsOpen(true);\n }}\n >\n Column Widths\n <Icon name={mobile && widthsOpen ? \"chevronDown\" : \"chevronRight\"} />\n </button>\n {widthsOpen && (\n <div\n ref={widthsMenuRef}\n className={cx(\"qt-cm-submenu\", flipWidths && \"qt-cm-submenu--left\")}\n style={mobile ? undefined : { width: SUBMENU_WIDTH }}\n role=\"menu\"\n aria-label=\"Column widths\"\n onKeyDown={(e) => {\n if (e.key !== \"ArrowLeft\") return;\n e.preventDefault();\n setWidthsOpen(false);\n widthsTriggerRef.current?.focus();\n }}\n >\n <MenuItem onClick={onFitColumn} title={`Size ${field.label} to its widest visible value`}>\n Fit This Column\n </MenuItem>\n <div className=\"qt-cm-sep\" />\n {WIDTH_PRESETS.map(({ preset, label, hint }) => (\n <MenuItem key={preset} onClick={() => onWidthPreset(preset)} title={hint}>\n {label}\n </MenuItem>\n ))}\n <div className=\"qt-cm-sep\" />\n <MenuItem disabled={!canResetWidths} onClick={onResetWidths} title=\"Back to the default column widths\">\n Reset Widths\n </MenuItem>\n </div>\n )}\n </div>,\n );\n items.push(\n <MenuItem key=\"remove\" disabled={!canRemoveColumn} onClick={onRemove}>\n Remove Column\n </MenuItem>,\n );\n\n // Leave room below for the widths submenu, which hangs past the last item.\n const top = Math.max(8, Math.min(y, vh - MENU_ROW_HEIGHT * (items.length + WIDTH_SUBMENU_OVERHANG_ROWS) - 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\nconst WIDTH_PRESETS: Array<{ preset: ColumnWidthPreset; label: string; hint: string }> = [\n { preset: \"content\", label: \"Fit All to Content\", hint: \"Size every column to its widest visible value\" },\n { preset: \"screen\", label: \"Fit All to Screen\", hint: \"Fill the table width, trimming the widest columns first\" },\n { preset: \"equal\", label: \"Equal Widths\", hint: \"Split the table width evenly across columns\" },\n];\n\nfunction MenuItem({\n children,\n onClick,\n disabled,\n title,\n}: {\n children: ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n}) {\n return (\n <button\n type=\"button\"\n className=\"qt-cm-item\"\n onClick={onClick}\n role=\"menuitem\"\n disabled={disabled}\n title={title}\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 writeWidths<Row>(select: SelectColumn[], fields: FieldDef<Row>[], widths: Map<string, number>): SelectColumn[] {\n const cols = materialize(select, fields);\n const next = cols.map((c) => {\n const width = widths.get(c.field);\n return width == null ? c : { ...c, width };\n });\n const present = new Set(cols.map((c) => c.field));\n for (const [field, width] of widths) {\n if (!present.has(field)) next.push({ field, width });\n }\n return next;\n}\n\n/** Max-content width (plus horizontal padding) across the given cells. Each\n * cell's content is cloned into an unconstrained probe so the measurement is\n * independent of the column's current width; all probes are inserted before\n * any is read so the whole pass costs a single layout. */\nfunction measureIntrinsicWidth(cells: HTMLElement[]): number {\n const probes = cells.map((cell) => {\n // Headers: measure the label (+ sort indicator), not the resize handle.\n const source = cell.querySelector<HTMLElement>(\":scope > .qt-th-label\") ?? cell;\n const probe = document.createElement(\"span\");\n probe.setAttribute(\"aria-hidden\", \"true\");\n probe.style.cssText = \"position:absolute;left:0;top:0;width:max-content;white-space:nowrap;visibility:hidden;pointer-events:none;\";\n source.childNodes.forEach((node) => probe.appendChild(node.cloneNode(true)));\n cell.appendChild(probe);\n return probe;\n });\n let width = 0;\n probes.forEach((probe, i) => {\n const style = getComputedStyle(cells[i]!);\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);\n width = Math.max(width, probe.getBoundingClientRect().width + padding);\n });\n probes.forEach((probe) => probe.remove());\n return Math.ceil(width);\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 {\n useEffect,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nconst MOBILE_QUERY =\n \"(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(\n subscribeMobile,\n () => window.matchMedia?.(MOBILE_QUERY).matches ?? false,\n () => false,\n );\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<{\n top: number;\n height: number;\n } | 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-\"))\n 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 = () =>\n setViewport({\n top: visualViewport.offsetTop,\n height: visualViewport.height,\n });\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 =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : 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 = () =>\n Array.from(\n element.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), a[href], summary, [tabindex=\"0\"], [contenteditable=\"true\"]',\n ),\n ).filter((target) => {\n if (target.closest('[hidden], [inert], [aria-hidden=\"true\"]'))\n return false;\n for (\n let parent: HTMLElement | null = target.parentElement;\n parent && parent !== element;\n parent = parent.parentElement\n ) {\n if (\n parent instanceof HTMLDetailsElement &&\n !parent.open &&\n !parent.querySelector(\":scope > summary\")?.contains(target)\n )\n return false;\n }\n let ancestor: HTMLElement | null = target;\n while (ancestor && ancestor !== element) {\n const style = getComputedStyle(ancestor);\n if (style.display === \"none\" || style.visibility === \"hidden\")\n return false;\n ancestor = ancestor.parentElement;\n }\n return true;\n });\n const onKey = (event: KeyboardEvent) => {\n if (!isTop() || event.defaultPrevented) return;\n if (\n event.key === \"Escape\" &&\n !element.querySelector(\"[data-qt-formula-suggestions]\")\n ) {\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 (\n event.shiftKey &&\n (document.activeElement === first || document.activeElement === element)\n ) {\n event.preventDefault();\n last?.focus();\n } else if (\n !event.shiftKey &&\n (document.activeElement === last || document.activeElement === element)\n ) {\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);\n document.addEventListener(\"focusin\", onFocus);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"focusin\", onFocus);\n modalStack.splice(modalStack.indexOf(element), 1);\n if (modalStack.length === 0)\n 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={\n mobile\n ? {\n ...theme,\n ...(viewport\n ? { top: viewport.top, height: viewport.height, bottom: \"auto\" }\n : {}),\n }\n : undefined\n }\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={\n swipeDistance\n ? { transform: `translateY(${swipeDistance}px)` }\n : undefined\n }\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)\n setSwipeDistance(\n Math.max(0, event.clientY - swipeStart.current),\n );\n }}\n onPointerUp={(event) => {\n const distance =\n swipeStart.current === null\n ? 0\n : 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 >\n <span />\n </div>\n )}\n {chrome && (\n <header className=\"qt-overlay-header\">\n <h2 id={titleId}>{title}</h2>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={onClose}\n aria-label={`Close ${title}`}\n >\n Done\n </button>\n </header>\n )}\n {children}\n </div>\n </div>\n );\n return mobile ? (\n <>\n <span ref={themeAnchor} hidden />\n {createPortal(content, document.body)}\n </>\n ) : (\n content\n );\n}\n\nexport function AdaptiveOverlay({\n title,\n onClose,\n children,\n enabled = true,\n}: {\n title: string;\n onClose: () => void;\n children: ReactNode;\n enabled?: boolean;\n}): ReactNode {\n const mobile = useMobileLayout();\n return mobile && enabled ? (\n <ModalSurface title={title} onClose={onClose}>\n {children}\n </ModalSurface>\n ) : (\n children\n );\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","// columnWidths.ts — bulk column-width presets for the DataTable \"widths\" menu.\n//\n// Pure math only: DataTable measures content and the viewport, these helpers\n// decide the pixel widths. Every result is integral and, when the columns can\n// fit, sums to exactly the available width so no stray horizontal scrollbar\n// appears.\n\nexport type ColumnWidthPreset = \"content\" | \"screen\" | \"equal\";\n\n/** Narrowest column the screen/equal presets will produce. */\nexport const PRESET_MIN_WIDTH = 48;\n\n/** Every column at its measured content width. */\nexport function fitContentWidths(content: number[], min = PRESET_MIN_WIDTH): number[] {\n return content.map((w) => Math.max(min, Math.ceil(w)));\n}\n\n/** The same width for every column, sharing the available width. */\nexport function equalWidths(count: number, available: number, min = PRESET_MIN_WIDTH): number[] {\n if (count <= 0) return [];\n if (available < count * min) return Array.from({ length: count }, () => min);\n return distributePixels(Array.from({ length: count }, () => available / count), available);\n}\n\n/**\n * Fill the available width exactly. When content fits, every column grows in\n * proportion to its content. When it does not, narrow columns keep their full\n * content width and only the widest columns are capped at a shared level\n * (water-filling), so truncation lands where there is the most text to lose.\n */\nexport function fitScreenWidths(content: number[], available: number, min = PRESET_MIN_WIDTH): number[] {\n const count = content.length;\n if (count === 0) return [];\n if (available < count * min) return content.map(() => min);\n const natural = content.map((w) => Math.max(min, w));\n const total = natural.reduce((sum, w) => sum + w, 0);\n if (total <= available) {\n return distributePixels(natural.map((w) => (w / total) * available), available);\n }\n const order = natural.map((w, i) => [w, i] as const).sort((a, b) => a[0] - b[0]);\n const widths = new Array<number>(count);\n let remaining = available;\n order.forEach(([w, i], rank) => {\n const share = remaining / (count - rank);\n const width = Math.min(w, share);\n widths[i] = width;\n remaining -= width;\n });\n return distributePixels(widths, available);\n}\n\n/** Round fractional widths down, then hand leftover pixels to the columns that\n * lost the most to rounding, so the result sums to floor(total). */\nfunction distributePixels(widths: number[], total: number): number[] {\n const floored = widths.map(Math.floor);\n let leftover = Math.floor(total) - floored.reduce((sum, w) => sum + w, 0);\n const byRemainder = widths\n .map((w, i) => [w - Math.floor(w), i] as const)\n .sort((a, b) => b[0] - a[0]);\n for (const [, i] of byRemainder) {\n if (leftover <= 0) break;\n floored[i] = floored[i]! + 1;\n leftover -= 1;\n }\n return floored;\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport type { RequestActivityApi } from \"@pythia-software/query-table-react\";\n\nexport interface RequestActivityProps {\n activity: RequestActivityApi;\n /** Optional host diagnostics, e.g. database and network timings. */\n children?: ReactNode;\n id?: string;\n}\nexport function RequestActivity({\n activity,\n children,\n id,\n}: RequestActivityProps) {\n const pending = activity.entries.filter((e) => e.status === \"pending\").length;\n const [now, setNow] = useState(Date.now());\n useEffect(() => {\n if (!pending) return;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 250);\n return () => clearInterval(timer);\n }, [pending]);\n return (\n <section\n id={id}\n className=\"qt-request-activity\"\n aria-label=\"Request activity\"\n >\n <div className=\"qt-request-activity-head\">\n <strong>Request activity</strong>\n <span role=\"status\">{pending} pending</span>\n <button type=\"button\" className=\"qt-btn\" onClick={activity.clear}>\n Clear completed\n </button>\n </div>\n {activity.entries.length ? (\n <div className=\"qt-request-activity-scroll\">\n <table>\n <thead>\n <tr>\n <th>Request</th>\n <th>State</th>\n <th>Elapsed</th>\n <th>Details</th>\n </tr>\n </thead>\n <tbody>\n {activity.entries.map((e) => (\n <tr key={e.id} data-status={e.status}>\n <td>\n #{e.id} {e.kind}\n </td>\n <td>{e.status}</td>\n <td>\n {Math.round(\n e.durationMs ?? Math.max(0, now - e.startedAt),\n ).toLocaleString()}{\" \"}\n ms\n </td>\n <td>{e.error ?? \"—\"}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <p className=\"qt-muted\">\n No requests recorded. Client data is evaluated locally.\n </p>\n )}\n {children}\n </section>\n );\n}\n","import type { AggregationClause } from \"@pythia-software/query-table-core\";\n\nexport function metricPresentationProblem(\n clause: AggregationClause,\n): string | undefined {\n for (const scale of [clause.display?.xScale, clause.display?.yScale]) {\n if (!scale) continue;\n if (\n (scale.mode !== undefined &&\n scale.mode !== \"linear\" &&\n scale.mode !== \"log\") ||\n [scale.min, scale.max].some(\n (v) =>\n v !== undefined &&\n (!Number.isFinite(v) || (scale.mode === \"log\" && v <= 0)),\n ) ||\n (scale.min !== undefined &&\n scale.max !== undefined &&\n scale.min >= scale.max)\n )\n return \"Axis bounds must be finite, increasing, and positive for logarithmic scales.\";\n }\n if (clause.display?.kind === \"value\" && clause.groupBy.length)\n return \"Value display requires no grouping. Remove the grouping keys or choose Table, List, or a chart.\";\n return undefined;\n}\n\n/** Remote results are untrusted even when the transport has TypeScript types. */\nexport function distributionProblem(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n const bad =\n \"Invalid distribution result. Refresh the metric or ask the data provider to return a valid distribution summary.\";\n if (!value || typeof value !== \"object\") return bad;\n const d = value as Record<string, unknown>;\n const finite = (v: unknown): v is number =>\n typeof v === \"number\" &&\n Number.isFinite(v) &&\n (!Number.isInteger(v) || Number.isSafeInteger(v));\n const count = (v: unknown): v is number =>\n finite(v) && Number.isSafeInteger(v) && v >= 0;\n const numbers = (v: unknown): v is number[] =>\n Array.isArray(v) && v.every(finite);\n if (d.kind === \"box\") {\n if (d.summary === null) return undefined;\n if (!d.summary || typeof d.summary !== \"object\") return bad;\n const s = d.summary as Record<string, unknown>;\n const stats = [s.min, s.q1, s.median, s.q3, s.max, s.mean, s.low, s.high];\n if (\n !stats.every(finite) ||\n !count(s.n) ||\n s.n === 0 ||\n !count(s.outlierCount) ||\n !numbers(s.outliers) ||\n s.outlierCount < s.outliers.length ||\n s.outlierCount > s.n ||\n s.method !== \"exact-linear\" ||\n ![\"minmax\", \"tukey\"].includes(String(s.whiskers))\n )\n return bad;\n const [min, q1, median, q3, max, mean, low, high] = stats as number[];\n // Summation may round a mathematically bounded mean a few ULPs past an endpoint.\n const meanTolerance =\n Math.max(\n Number.MIN_VALUE,\n Math.max(Math.abs(min!), Math.abs(max!), Math.abs(mean!)) *\n Number.EPSILON,\n ) * 16;\n if (\n !(\n min! <= q1! &&\n q1! <= median! &&\n median! <= q3! &&\n q3! <= max! &&\n min! - meanTolerance <= mean! &&\n mean! <= max! + meanTolerance &&\n min! <= low! &&\n low! <= high! &&\n high! <= max!\n ) ||\n s.outliers.some((v) => v < min! || v > max!)\n )\n return bad;\n return undefined;\n }\n if (d.kind === \"histogram\") {\n if (\n !numbers(d.edges) ||\n !Array.isArray(d.counts) ||\n !d.counts.every(count) ||\n !count(d.n)\n )\n return bad;\n if (!d.edges.length && !d.counts.length && d.n === 0) return undefined;\n if (\n d.edges.length !== d.counts.length + 1 ||\n !d.counts.length ||\n d.counts.reduce((sum: number, n: number) => sum + n, 0) !== d.n ||\n d.edges.some(\n (v, i, edges) =>\n i > 0 &&\n (v < edges[i - 1]! || (edges.length > 2 && v === edges[i - 1])),\n )\n )\n return bad;\n return undefined;\n }\n return bad;\n}\n","import { metricPresentationProblem } from \"./metricPresentation\";\nimport {\n lazy,\n Suspense,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n type InputHTMLAttributes,\n} from \"react\";\nimport {\n MAX_AGGREGATIONS,\n aggOpsForField,\n compileFormula,\n compileMetric,\n isGroupable,\n isMeasurable,\n metricComputationKey,\n metricExpression,\n type AggregationBucket,\n type AggregationClause,\n type AggregationResult,\n type FieldDef,\n type MetricDisplay,\n type MetricLayout,\n type MetricValueFormat,\n} from \"@pythia-software/query-table-core\";\nimport type { QueryTableApi } from \"@pythia-software/query-table-react\";\nimport { ModalSurface } from \"./AdaptiveOverlay\";\nimport { ReorderList } from \"./ReorderList\";\nimport { MetricCard, cardDecimals } from \"./MetricsPanel\";\nimport { formatMetricOutput, validateMetricFormat } from \"./metricFormat\";\nimport type { MetricTheme } from \"./metricColors\";\nimport { useMetricWorkbench } from \"./useMetricWorkbench\";\nimport { useMetricResize } from \"./useMetricResize\";\nimport { Icon, type IconName } from \"./Icon\";\nimport { FORMULA_FUNCTIONS } from \"@pythia-software/query-table-core\";\n\nconst FormulaEditor = lazy(() => import(\"./FormulaEditor\"));\nconst clone = <T,>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\nconst fieldSource = (name: string) => `[${name.replace(/\\]/g, \"]]\")}]`;\nconst defaultLayout: MetricLayout = {\n widthRem: 20,\n heightRem: 12,\n minWidthRem: 14,\n minHeightRem: 8,\n};\nconst kinds: Array<[MetricDisplay[\"kind\"], string]> = [\n [\"auto\", \"Automatic\"],\n [\"value\", \"Value\"],\n [\"table\", \"Table\"],\n [\"list\", \"List\"],\n [\"bar-horizontal\", \"Horizontal bars\"],\n [\"bar-vertical\", \"Vertical bars\"],\n [\"line\", \"Line chart\"],\n [\"pie\", \"Pie chart\"],\n [\"donut\", \"Ring chart\"],\n [\"scatter\", \"Scatterplot\"],\n [\"box\", \"Box & whisker\"],\n [\"histogram\", \"Histogram\"],\n];\nconst panes: Array<{ label: string; icon: IconName }> = [\n { label: \"Metric list\", icon: \"panelList\" },\n { label: \"Definition\", icon: \"panelDefinition\" },\n { label: \"Fields & functions\", icon: \"panelReference\" },\n { label: \"Live preview\", icon: \"panelPreview\" },\n];\nconst aggregateFunctions = [\n {\n name: \"SUM\",\n signature: \"SUM(row expression)\",\n description: \"Total numeric values per group; ignores NULL.\",\n },\n {\n name: \"AVG\",\n signature: \"AVG(row expression)\",\n description: \"Average numeric values per group; ignores NULL.\",\n },\n {\n name: \"COUNT\",\n signature: \"COUNT(expression?)\",\n description: \"Count rows, or non-NULL values per group.\",\n },\n {\n name: \"COUNT_DISTINCT\",\n signature: \"COUNT_DISTINCT(row expression)\",\n description: \"Count distinct non-NULL values per group.\",\n },\n {\n name: \"MIN\",\n signature: \"MIN(row expression)\",\n description: \"Minimum non-NULL value per group.\",\n },\n {\n name: \"MAX\",\n signature: \"MAX(row expression)\",\n description: \"Maximum non-NULL value per group.\",\n },\n];\nconst titleOf = (clause: AggregationClause, fields: FieldDef[]) =>\n clause.label ||\n `${clause.op.toUpperCase()} ${fields.find((f) => f.name === clause.field)?.label ?? clause.field ?? \"rows\"}`;\n\nexport interface MetricsEditorProps<Row> {\n api: QueryTableApi<Row>;\n fields: FieldDef<Row>[];\n onClose: () => void;\n initialMetricId?: string;\n initialView?: \"editor\" | \"dashboard\";\n theme?: MetricTheme;\n locale?: string;\n}\n\n/** Transactional query-local authoring; previews never mutate the table query. */\nexport function MetricsEditor<Row>({\n api,\n fields,\n onClose,\n initialMetricId,\n initialView = \"editor\",\n theme,\n locale,\n}: MetricsEditorProps<Row>): ReactNode {\n const titleId = useId();\n const initial = useRef(clone(api.aggregations.clauses));\n const initialKey = useRef(JSON.stringify(initial.current));\n const [drafts, setDrafts] = useState(initial.current);\n const [active, setActive] = useState(\n initialMetricId ?? initial.current[0]?.id ?? \"\",\n );\n const [view, setView] = useState<\"editor\" | \"dashboard\">(initialView);\n const [discard, setDiscard] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n const [preview, setPreview] = useState<AggregationResult | null>(null);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [retry, setRetry] = useState(0);\n const [canvas, setCanvas] = useState(1120);\n const [returnMetric, setReturnMetric] = useState<string | null>(null);\n const [removed, setRemoved] = useState<{\n clause: AggregationClause;\n position: number;\n } | null>(null);\n const [openSettings, setOpenSettings] = useState<Record<string, boolean>>({});\n const settingsState = (title: string) => ({\n open: openSettings[title] ?? false,\n onOpenChange: (open: boolean) =>\n setOpenSettings((previous) =>\n previous[title] === open ? previous : { ...previous, [title]: open },\n ),\n });\n const geometryDrag = useMetricResize();\n const canvasElement = useRef<HTMLDivElement | null>(null);\n const focusDestination = useRef(false);\n const [navigation, setNavigation] = useState(0);\n const paneScroll = useRef([0, 0, 0, 0]);\n const [previewSize, setPreviewSize] = useState({ width: 320, height: 200 });\n const [formatTarget, setFormatTarget] = useState<\"value\" | \"x\" | \"y\">(\n \"value\",\n );\n const [reference, setReference] = useState<\"fields\" | \"functions\">(\"fields\");\n const [referenceSearch, setReferenceSearch] = useState({\n fields: \"\",\n functions: \"\",\n });\n const search = referenceSearch[reference];\n const setSearch = (value: string) =>\n setReferenceSearch((previous) => ({ ...previous, [reference]: value }));\n const [concept, setConcept] = useState(\"all\");\n const [inspectOpen, setInspectOpen] = useState(false);\n const [inspectedKey, setInspectedKey] = useState<string | null>(null);\n const [inputTarget, setInputTarget] = useState<\"primary\" | \"secondary\">(\n \"primary\",\n );\n const pendingInsertion = useRef<{\n id: string;\n text: string;\n wrap: boolean;\n } | null>(null);\n const input = useRef<HTMLTextAreaElement | null>(null),\n inputY = useRef<HTMLTextAreaElement | null>(null);\n const previewContainer = useRef<HTMLDivElement | null>(null);\n const workbench = useMetricWorkbench(view === \"editor\");\n const selected = drafts.find((c) => c.id === active);\n const chosen = selected?.display ?? { kind: \"auto\" as const };\n const dirty = JSON.stringify(drafts) !== initialKey.current;\n const contextChanged =\n JSON.stringify(api.aggregations.clauses) !== initialKey.current;\n const measurable = fields.filter(isMeasurable),\n groupable = fields.filter(isGroupable);\n const compileRef = useRef(api.aggregations.compile);\n compileRef.current = api.aggregations.compile;\n const requestRef = useRef(api.aggregations.preview);\n requestRef.current = api.aggregations.preview;\n const draftRef = useRef(drafts);\n draftRef.current = drafts;\n const computationalKey = metricComputationKey(drafts);\n const queryContext = JSON.stringify([\n api.aggregations.contextKey,\n api.query.where,\n drafts.some((d) => d.scope === \"shownRows\")\n ? [api.query.orderBy, api.query.limit, api.query.offset, api.rows]\n : null,\n ]);\n const computationDiagnostics = useMemo(() => {\n const problems = new Map<string, string>();\n for (const c of drafts)\n try {\n if (compileRef.current) compileRef.current(c);\n else if (\n c.distribution &&\n [\"box\", \"histogram\"].includes(c.display?.kind ?? c.distribution.kind)\n )\n compileFormula(c.distribution.input, fields);\n else {\n compileMetric(metricExpression(c), fields);\n if (c.display?.kind === \"scatter\")\n compileMetric(c.expressionY ?? \"\", fields);\n }\n } catch (e) {\n problems.set(c.id, e instanceof Error ? e.message : String(e));\n }\n return problems;\n }, [drafts, fields, api.aggregations.compile]);\n const diagnostics = useMemo(() => {\n const problems = new Map(computationDiagnostics);\n for (const c of drafts) {\n const presentationProblem = metricPresentationProblem(c);\n if (presentationProblem) problems.set(c.id, presentationProblem);\n if (c.label !== undefined && !c.label.trim())\n problems.set(c.id, \"Enter a metric name.\");\n for (const format of [\n c.display?.format,\n c.display?.xFormat,\n c.display?.yFormat,\n ])\n if (format) {\n const problem = validateMetricFormat(format);\n if (problem) problems.set(c.id, problem);\n }\n }\n return problems;\n }, [drafts, computationDiagnostics]);\n const diagnosticKey = JSON.stringify([...computationDiagnostics]);\n\n useEffect(() => {\n const controller = new AbortController();\n setError(null);\n const executable = draftRef.current.filter(\n (c) => !computationDiagnostics.has(c.id),\n );\n if (!executable.length) {\n setPreviewLoading(false);\n setPreview(null);\n return;\n }\n if (!requestRef.current) {\n setPreviewLoading(false);\n setPreview(null);\n return;\n }\n setPreviewLoading(true);\n setPreview(null);\n const timer = setTimeout(() => {\n void requestRef.current!(clone(executable), controller.signal)\n .then((result) => {\n if (!controller.signal.aborted) setPreview(result);\n })\n .catch((e) => {\n if (!controller.signal.aborted)\n setError(e instanceof Error ? e.message : String(e));\n })\n .finally(() => {\n if (!controller.signal.aborted) setPreviewLoading(false);\n });\n }, 250);\n return () => {\n controller.abort();\n clearTimeout(timer);\n };\n }, [\n computationalKey,\n queryContext,\n diagnosticKey,\n retry,\n api.aggregations.preview,\n ]);\n\n useLayoutEffect(() => {\n setInspectOpen(false);\n setInspectedKey(null);\n pendingInsertion.current = null;\n if (!selected) return;\n const layout = selected.layout ?? defaultLayout;\n const rem =\n typeof document === \"undefined\"\n ? 16\n : parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n setPreviewSize({\n width: layout.widthRem * rem,\n height: layout.heightRem * rem,\n });\n setFormatTarget(\n [\"scatter\", \"histogram\"].includes(selected.display?.kind ?? \"\")\n ? \"x\"\n : \"value\",\n );\n // Selection affects geometry, not execution.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active]);\n useEffect(() => {\n const element = previewContainer.current;\n if (!element || typeof ResizeObserver === \"undefined\" || view !== \"editor\")\n return;\n const observer = new ResizeObserver(() => {\n if (element.offsetWidth > 0 && element.offsetHeight > 0)\n setPreviewSize((previous) => {\n const next = {\n width: element.offsetWidth,\n height: element.offsetHeight,\n };\n return next.width === previous.width &&\n next.height === previous.height\n ? previous\n : next;\n });\n });\n observer.observe(element);\n return () => observer.disconnect();\n }, [view, !!selected]);\n\n useLayoutEffect(() => {\n if (view === \"dashboard\") {\n const card = Array.from(\n canvasElement.current?.querySelectorAll<HTMLElement>(\n \"[data-metric-id]\",\n ) ?? [],\n ).find((element) => element.dataset.metricId === active);\n card?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n if (focusDestination.current) {\n const target =\n card ??\n workbench.header.current\n ?.closest<HTMLElement>(\"[role=dialog]\")\n ?.querySelector<HTMLElement>(\".qt-metric-canvas-controls button\");\n target?.focus({ preventScroll: true });\n }\n } else if (focusDestination.current) {\n const dialog =\n workbench.header.current?.closest<HTMLElement>(\"[role=dialog]\");\n const selector = !selected\n ? \".qt-metric-create\"\n : workbench.visiblePanes[1]\n ? '[aria-label=\"Metric name\"]'\n : '[aria-label=\"Editing metric\"]';\n const target = dialog?.querySelector<HTMLElement>(selector);\n if (selector === '[aria-label=\"Metric name\"]') {\n const definition = target?.closest<HTMLElement>(\n \".qt-metric-definition\",\n );\n if (definition) definition.scrollTop = 0;\n paneScroll.current[1] = 0;\n }\n if (target && !target.closest(\"[hidden]\"))\n target.focus({ preventScroll: true });\n else\n dialog\n ?.querySelector<HTMLElement>('[aria-label=\"Metric list panel\"]')\n ?.focus();\n }\n focusDestination.current = false;\n }, [view, active, navigation]);\n\n function navigate(destination: \"editor\" | \"dashboard\", id = active) {\n geometryDrag.stop();\n if (destination === \"editor\") workbench.showPane(1);\n focusDestination.current = true;\n setNavigation((previous) => previous + 1);\n setActive(id);\n setView(destination);\n setAnnouncement(\n destination === \"dashboard\"\n ? \"Showing this metric in the dashboard draft.\"\n : \"Editing the selected metric. Changes stay in this draft.\",\n );\n }\n function seeInDashboard() {\n setReturnMetric(active);\n navigate(\"dashboard\");\n }\n function createMetric() {\n if (drafts.length >= MAX_AGGREGATIONS) return;\n const c: AggregationClause = {\n id: newId(),\n op: \"count\",\n groupBy: [],\n label: \"New metric\",\n layout: { ...defaultLayout },\n };\n setDrafts((previous) => [...previous, c]);\n navigate(\"editor\", c.id);\n }\n function canvasWidth(value: number) {\n if (Number.isFinite(value))\n setCanvas(Math.max(320, Math.min(2400, Math.round(value))));\n }\n function paneProps(index: number) {\n return {\n id: `${titleId}-pane-${index}`,\n hidden: !workbench.visiblePanes[index],\n ref: (element: HTMLElement | null) => {\n if (element) element.scrollTop = paneScroll.current[index] ?? 0;\n },\n onScroll: (e: React.UIEvent<HTMLElement>) => {\n paneScroll.current[index] = e.currentTarget.scrollTop;\n },\n };\n }\n function panelToggle(index: number, collapse = false) {\n const pane = panes[index]!;\n const shown = workbench.visiblePanes[index];\n return (\n <button\n type=\"button\"\n className={`qt-btn qt-metric-icon-button${collapse ? \" qt-metric-pane-collapse\" : \"\"}`}\n aria-label={\n collapse\n ? `Hide ${pane.label.toLowerCase()} panel`\n : `${pane.label} panel`\n }\n aria-controls={`${titleId}-pane-${index}`}\n aria-pressed={collapse ? undefined : shown}\n disabled={shown && workbench.visibleIndices.length === 1}\n title={`${shown ? \"Hide\" : \"Show\"} ${pane.label.toLowerCase()} panel`}\n onClick={() => workbench.togglePane(index)}\n >\n <Icon name={collapse ? \"close\" : pane.icon} />\n </button>\n );\n }\n function paneHeading(index: number, label: ReactNode) {\n return (\n <div className=\"qt-metric-pane-heading\">\n <h3>{label}</h3>\n {panelToggle(index, true)}\n </div>\n );\n }\n\n function patch(\n id: string,\n values: {\n [K in keyof AggregationClause]?: AggregationClause[K] | undefined;\n },\n ) {\n setDrafts((previous) =>\n previous.map((c) => {\n if (c.id !== id) return c;\n const next = { ...c, ...values } as AggregationClause;\n for (const key of Object.keys(next) as Array<keyof AggregationClause>)\n if (next[key] === undefined) delete next[key];\n return next;\n }),\n );\n }\n function displayPatch(values: Partial<MetricDisplay>) {\n if (selected) patch(selected.id, { display: { ...chosen, ...values } });\n }\n function move(id: string, position: number) {\n setDrafts((previous) => {\n const item = previous.find((c) => c.id === id);\n if (!item) return previous;\n const next = previous.filter((c) => c.id !== id);\n next.splice(Math.max(0, Math.min(position, next.length)), 0, item);\n return next;\n });\n }\n function remove(id: string) {\n const position = drafts.findIndex((c) => c.id === id),\n clause = drafts[position];\n if (!clause) return;\n focusDestination.current = true;\n setNavigation((previous) => previous + 1);\n setRemoved({ clause: clone(clause), position });\n setDrafts((previous) => previous.filter((c) => c.id !== id));\n if (active === id)\n setActive(drafts[position + 1]?.id ?? drafts[position - 1]?.id ?? \"\");\n setAnnouncement(\n `${titleOf(clause, fields)} removed. Undo is available in the footer.`,\n );\n }\n function duplicate(c: AggregationClause) {\n if (drafts.length >= MAX_AGGREGATIONS) return;\n const id = newId();\n setDrafts((previous) => [\n ...previous,\n { ...clone(c), id, label: `${titleOf(c, fields)} copy` },\n ]);\n navigate(view, id);\n }\n function regroup(groupBy: string[]) {\n if (!selected) return;\n const sort = selected.sort?.flatMap((s) => {\n if (!s.key.startsWith(\"group\")) return [s];\n const name = selected.groupBy[Number(s.key.slice(5))];\n const index = name === undefined ? -1 : groupBy.indexOf(name);\n return index < 0\n ? []\n : [{ ...s, key: `group${index}` as `group${number}` }];\n });\n patch(selected.id, { groupBy, ...(sort ? { sort } : {}) });\n }\n function changeSize(key: keyof MetricLayout, raw: number) {\n if (!selected || !Number.isFinite(raw)) return;\n const layout = {\n ...(selected.layout ?? defaultLayout),\n [key]: Math.max(1, Math.min(75, Math.round(raw))),\n };\n layout.widthRem = Math.max(layout.widthRem, layout.minWidthRem);\n layout.heightRem = Math.max(layout.heightRem, layout.minHeightRem);\n patch(selected.id, { layout });\n }\n function changeDisplay(kind: MetricDisplay[\"kind\"]) {\n if (!selected) return;\n const next: Partial<AggregationClause> = { display: { ...chosen, kind } };\n setFormatTarget(kind === \"scatter\" || kind === \"histogram\" ? \"x\" : \"value\");\n if (selected.sort)\n next.sort = selected.sort.filter(\n (s) =>\n (s.key !== \"y\" || kind === \"scatter\") &&\n (s.key !== \"samples\" || kind === \"box\" || kind === \"histogram\"),\n );\n if (kind === \"scatter\" && !selected.expressionY)\n next.expressionY = \"COUNT()\";\n if (kind === \"scatter\" && !selected.expression)\n next.expression = metricExpression(selected);\n if (kind === \"box\" || kind === \"histogram\")\n next.distribution = {\n ...selected.distribution,\n kind,\n input:\n selected.distribution?.input ??\n (selected.field\n ? fieldSource(selected.field)\n : measurable[0]\n ? fieldSource(measurable[0].name)\n : \"NULL\"),\n };\n // Retain inactive expressions in the draft; only the active shape executes.\n patch(selected.id, next);\n }\n function changeExpression(source: string, secondary = false) {\n if (!selected) return;\n if (secondary) patch(selected.id, { expressionY: source });\n else if ([\"box\", \"histogram\"].includes(chosen.kind))\n patch(selected.id, {\n distribution: {\n ...(selected.distribution ?? {\n kind: chosen.kind as \"box\" | \"histogram\",\n input: source,\n }),\n input: source,\n },\n });\n else patch(selected.id, { expression: source });\n }\n function finishInsertion(textarea: HTMLTextAreaElement) {\n const pending = pendingInsertion.current;\n if (!pending || pending.id !== selected?.id) return;\n pendingInsertion.current = null;\n const from = pending.wrap ? 0 : textarea.value.indexOf(\"(\") + 1;\n const to = pending.wrap\n ? textarea.value.length\n : textarea.value.lastIndexOf(\")\");\n textarea.setSelectionRange(from, Math.max(from, to));\n insertInto(textarea, pending.text, pending.wrap, false);\n }\n function insert(text: string, wrap = false) {\n if (!selected) return;\n const secondary = inputTarget === \"secondary\" && chosen.kind === \"scatter\";\n const textarea = secondary ? inputY.current : input.current;\n workbench.showPane(1);\n if (!textarea) {\n pendingInsertion.current = { id: selected.id, text, wrap };\n patch(selected.id, { expression: metricExpression(selected) });\n setAnnouncement(\"Formula mode enabled and reference inserted.\");\n return;\n }\n if (!workbench.visiblePanes[1]) {\n requestAnimationFrame(() => insertInto(textarea, text, wrap, secondary));\n } else insertInto(textarea, text, wrap, secondary);\n }\n function insertInto(\n textarea: HTMLTextAreaElement,\n text: string,\n wrap: boolean,\n secondary: boolean,\n ) {\n const from = textarea.selectionStart,\n to = textarea.selectionEnd,\n selectedText = textarea.value.slice(from, to);\n const content = wrap ? `${text}(${selectedText})` : text;\n textarea.focus();\n textarea.setSelectionRange(from, to);\n const before = textarea.value;\n try {\n document.execCommand?.(\"insertText\", false, content);\n } catch {\n /* plain textarea fallback */\n }\n if (textarea.value === before)\n textarea.setRangeText(content, from, to, \"end\");\n changeExpression(textarea.value, secondary);\n const position =\n from + (wrap ? text.length + selectedText.length + 1 : content.length);\n textarea.setSelectionRange(position, position);\n }\n function close() {\n if (dirty) setDiscard(true);\n else onClose();\n }\n function apply() {\n if (diagnostics.size) return;\n if (contextChanged) {\n setError(\n \"Metrics changed while this editor was open. Close this draft and reopen to use the latest configuration.\",\n );\n return;\n }\n try {\n if (api.aggregations.replace)\n api.aggregations.replace(clone(drafts), initial.current);\n else api.setQuery((q) => ({ ...q, aggregations: clone(drafts) }));\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n }\n const resultById = new Map(preview?.metrics.map((m) => [m.id, m]) ?? []);\n const issues = new Map(diagnostics);\n for (const metric of preview?.metrics ?? [])\n if (metric.error) issues.set(metric.id, metric.error);\n const orderItems = drafts.map((c) => ({\n id: c.id,\n label: titleOf(c, fields),\n }));\n const selectedPosition = drafts.findIndex((c) => c.id === active);\n const selectedResult = selected ? resultById.get(selected.id) : undefined;\n const inspectedBucket =\n selectedResult?.buckets.find(\n (b) => JSON.stringify(b.keys) === inspectedKey,\n ) ?? selectedResult?.buckets[0];\n const referenceItems = (\n reference === \"fields\"\n ? fields.map((f) => ({\n name: f.name,\n label: f.label,\n detail: fieldSource(f.name),\n description: f.type,\n type: f.type,\n wrap: false,\n }))\n : [\n ...(concept !== \"row\" && ![\"box\", \"histogram\"].includes(chosen.kind)\n ? aggregateFunctions\n : []),\n ...(concept !== \"aggregate\" ? FORMULA_FUNCTIONS : []),\n ].map((f) => ({\n name: f.name,\n label: f.name,\n detail: f.signature,\n description: f.description,\n type: aggregateFunctions.some((fn) => fn.name === f.name)\n ? \"Aggregate\"\n : \"Row\",\n wrap: true,\n }))\n ).filter((item) =>\n `${item.name} ${item.label} ${item.description}`\n .toLowerCase()\n .includes(search.toLowerCase()),\n );\n const valueFormat = (formatTarget === \"x\"\n ? chosen.xFormat\n : formatTarget === \"y\"\n ? chosen.yFormat\n : chosen.format) ?? {\n kind: \"number\",\n decimals:\n selected &&\n !selected.expression &&\n [\"count\", \"count_distinct\"].includes(selected.op)\n ? 0\n : cardDecimals(selectedResult?.buckets ?? []),\n };\n const setFormat = (format: MetricValueFormat) =>\n displayPatch(\n formatTarget === \"x\"\n ? { xFormat: format }\n : formatTarget === \"y\"\n ? { yFormat: format }\n : { format },\n );\n const menu = (c: AggregationClause, index: number) => (\n <details\n className=\"qt-metric-actions\"\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && e.currentTarget.open) {\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.open = false;\n e.currentTarget.querySelector(\"summary\")?.focus();\n }\n }}\n >\n <summary aria-label={`Actions for ${titleOf(c, fields)}`}>⋯</summary>\n <div\n onClick={(e) => {\n const details = e.currentTarget.closest(\"details\");\n if (details) {\n details.open = false;\n details.querySelector(\"summary\")?.focus();\n }\n }}\n >\n {view === \"dashboard\" && (\n <button\n type=\"button\"\n onClick={() => {\n navigate(\"editor\", c.id);\n }}\n >\n Edit metric\n </button>\n )}\n <button\n type=\"button\"\n disabled={drafts.length >= MAX_AGGREGATIONS}\n onClick={() => duplicate(c)}\n >\n Duplicate\n </button>\n <button\n type=\"button\"\n disabled={index === 0}\n onClick={() => move(c.id, index - 1)}\n >\n Move up\n </button>\n <button\n type=\"button\"\n disabled={index === drafts.length - 1}\n onClick={() => move(c.id, index + 1)}\n >\n Move down\n </button>\n <button\n type=\"button\"\n className=\"qt-metric-remove\"\n onClick={() => remove(c.id)}\n >\n Remove\n </button>\n </div>\n </details>\n );\n const sizeControls = selected && (\n <div className=\"qt-metric-size-controls\">\n {([\"widthRem\", \"heightRem\", \"minWidthRem\", \"minHeightRem\"] as const).map(\n (key) => (\n <label key={key}>\n {\n {\n widthRem: \"Width\",\n heightRem: \"Height\",\n minWidthRem: \"Min width\",\n minHeightRem: \"Min height\",\n }[key]\n }{\" \"}\n (rem)\n <MetricNumberInput\n key={`${selected.id}-${key}`}\n aria-label={`${{ widthRem: \"Width\", heightRem: \"Height\", minWidthRem: \"Min width\", minHeightRem: \"Min height\" }[key]} in rem`}\n min={1}\n max={75}\n step={1}\n value={(selected.layout ?? defaultLayout)[key]}\n onCommit={(value) => changeSize(key, value)}\n />\n </label>\n ),\n )}\n </div>\n );\n const card = (c: AggregationClause) => (\n <MetricCard\n clause={c}\n result={\n diagnostics.has(c.id)\n ? { buckets: [], error: diagnostics.get(c.id)! }\n : resultById.get(c.id)\n }\n fields={fields}\n loading={previewLoading}\n theme={theme}\n locale={locale}\n onInspect={\n view === \"editor\" && c.id === active\n ? (bucket) => {\n setInspectedKey(JSON.stringify(bucket.keys));\n setInspectOpen(true);\n }\n : undefined\n }\n />\n );\n\n return (\n <ModalSurface\n title=\"Edit metrics\"\n className=\"qt-modal qt-metrics-editor\"\n chrome={false}\n onClose={close}\n >\n <header ref={workbench.header} className=\"qt-metrics-editor-header\">\n <h2 id={titleId}>Edit metrics</h2>\n <label>\n <span className=\"qt-sr-only\">Workbench view</span>\n <select\n aria-label=\"Workbench view\"\n value={view}\n onChange={(e) => {\n geometryDrag.stop();\n setView(e.target.value as typeof view);\n }}\n >\n <option value=\"editor\">Metric editor</option>\n <option value=\"dashboard\">Dashboard layout</option>\n </select>\n </label>\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-reset-layout\"\n title=\"Restore dialog size and show all panels\"\n onClick={workbench.reset}\n >\n Reset layout\n </button>\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-close\"\n aria-label=\"Close metric editor\"\n onClick={close}\n >\n ×\n </button>\n </header>\n <div className=\"qt-metrics-editor-context\">\n <span>\n Shown: <b>{api.rows.length.toLocaleString(locale)} rows</b>\n </span>\n <span>\n Matching:{\" \"}\n <b>\n {api.total === null ? \"unknown\" : api.total.toLocaleString(locale)}{\" \"}\n rows\n </b>\n </span>\n <span>\n {api.query.where.length\n ? `${api.query.where.length} filter terms`\n : \"No filters\"}\n </span>\n </div>\n {view === \"editor\" && (\n <div className=\"qt-metric-workbench-tools\">\n <div className=\"qt-metric-selection-tools\">\n <select\n aria-label=\"Editing metric\"\n value={active}\n onChange={(e) => setActive(e.target.value)}\n disabled={!drafts.length}\n >\n {!drafts.length && <option value=\"\">No metrics yet</option>}\n {orderItems.map((item) => (\n <option key={item.id} value={item.id}>\n {item.label}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-icon-button\"\n aria-label=\"Previous metric\"\n title=\"Previous metric\"\n disabled={selectedPosition <= 0}\n onClick={() => setActive(drafts[selectedPosition - 1]!.id)}\n >\n <Icon name=\"arrowUp\" />\n </button>\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-icon-button\"\n aria-label=\"Next metric\"\n title=\"Next metric\"\n disabled={\n selectedPosition < 0 || selectedPosition >= drafts.length - 1\n }\n onClick={() => setActive(drafts[selectedPosition + 1]!.id)}\n >\n <Icon name=\"arrowDown\" />\n </button>\n </div>\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-context-link\"\n disabled={!selected}\n onClick={seeInDashboard}\n >\n <Icon name=\"dashboard\" />\n See in dashboard\n <Icon name=\"arrowRight\" size={14} />\n </button>\n <div\n className=\"qt-metric-panel-tools\"\n role=\"group\"\n aria-label=\"Visible editor panels\"\n >\n <span>Panels</span>\n {panes.map((pane, i) => (\n <span key={pane.label}>{panelToggle(i)}</span>\n ))}\n </div>\n </div>\n )}\n {view === \"dashboard\" ? (\n <section className=\"qt-metric-layout-editor\">\n <div className=\"qt-metric-canvas-controls\">\n <div className=\"qt-metric-canvas-heading\">\n <strong>Dashboard layout</strong>\n <p className=\"qt-metric-help\">\n Select a card to adjust it. Drag handles to reorder, corners to\n resize.\n </p>\n </div>\n {returnMetric && drafts.some((c) => c.id === returnMetric) && (\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-return\"\n title={`Return to ${titleOf(\n drafts.find((c) => c.id === returnMetric)!,\n fields,\n )}`}\n onClick={() => navigate(\"editor\", returnMetric)}\n >\n <Icon name=\"arrowLeft\" />\n Back to metric\n </button>\n )}\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={drafts.length >= MAX_AGGREGATIONS}\n onClick={createMetric}\n >\n <Icon name=\"add\" />\n Create metric\n </button>\n <div\n className=\"qt-metric-canvas-presets\"\n role=\"group\"\n aria-label=\"Viewport presets\"\n >\n <label>\n Canvas width (px)\n <MetricNumberInput\n aria-label=\"Canvas width\"\n min={320}\n max={2400}\n step={10}\n value={canvas}\n onCommit={canvasWidth}\n />\n </label>\n <span>or preset</span>\n {([360, 768, 1200] as const).map((width) => (\n <button\n type=\"button\"\n className=\"qt-btn\"\n key={width}\n aria-pressed={canvas === width}\n onClick={() => setCanvas(width)}\n >\n {width === 360\n ? \"Phone\"\n : width === 768\n ? \"Tablet\"\n : \"Desktop\"}{\" \"}\n · {width}\n </button>\n ))}\n </div>\n </div>\n <div className=\"qt-metric-layout-controls\">\n <label className=\"qt-metric-layout-picker\">\n Selected metric\n <select\n aria-label=\"Selected metric\"\n value={active}\n onChange={(e) => setActive(e.target.value)}\n >\n {orderItems.map((item) => (\n <option key={item.id} value={item.id}>\n {item.label}\n </option>\n ))}\n </select>\n </label>\n {selected && (\n <label className=\"qt-metric-layout-name\">\n Name\n <input\n aria-label=\"Layout metric name\"\n maxLength={1000}\n value={selected.label ?? titleOf(selected, fields)}\n onChange={(e) =>\n patch(selected.id, { label: e.target.value })\n }\n />\n </label>\n )}\n {sizeControls}\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={!selected}\n onClick={() => navigate(\"editor\")}\n >\n Edit metric\n </button>\n </div>\n <div className=\"qt-metric-canvas-scroll\">\n <div\n className=\"qt-metric-canvas-frame\"\n style={{ width: canvas + 18 }}\n >\n <div\n ref={canvasElement}\n className=\"qt-metric-layout-canvas\"\n style={{ width: canvas }}\n >\n <ReorderList\n items={orderItems}\n layout=\"wrap\"\n showHint={false}\n className=\"qt-metric-layout-items\"\n onMove={move}\n itemClassName={(item) =>\n item.id === active ? \"qt-metric-layout-selected\" : \"\"\n }\n itemStyle={(item) => {\n const c = drafts.find((d) => d.id === item.id)!,\n layout = c.layout ?? defaultLayout;\n return {\n flexBasis: `${layout.widthRem}rem`,\n minWidth: `${layout.minWidthRem}rem`,\n minHeight: `${layout.minHeightRem}rem`,\n height: `${Math.max(layout.heightRem, layout.minHeightRem)}rem`,\n flexGrow: 1,\n };\n }}\n renderItem={(item, index) => {\n const c = drafts.find((d) => d.id === item.id)!;\n return (\n <div\n className=\"qt-metric-layout-card\"\n data-metric-id={item.id}\n tabIndex={0}\n aria-label={`Select ${item.label}`}\n aria-current={item.id === active}\n title={`${item.label} · Double-click to edit`}\n onFocus={() => setActive(item.id)}\n onDoubleClick={(e) => {\n if (\n !(e.target as Element).closest(\n \"button, input, select, textarea, summary, a, [role=button]\",\n )\n )\n navigate(\"editor\", item.id);\n }}\n onClick={(e) => {\n if (\n !(e.target as Element).closest(\n \"button, input, select, textarea, summary, a\",\n )\n )\n setActive(item.id);\n }}\n onKeyDown={(e) => {\n if (\n e.currentTarget === e.target &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n setActive(item.id);\n }\n }}\n >\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-card-edit qt-metric-icon-button\"\n aria-label={`Edit ${item.label}`}\n title=\"Edit metric\"\n onClick={() => navigate(\"editor\", item.id)}\n >\n <Icon name=\"pencil\" size={14} />\n </button>\n {menu(c, index)}\n {card(c)}\n <button\n type=\"button\"\n className=\"qt-metric-card-resize\"\n aria-label={`Resize ${item.label}`}\n title=\"Drag to resize card. Arrow keys adjust width and height; Shift for larger steps.\"\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n setActive(c.id);\n const original = c.layout,\n base = { ...(original ?? defaultLayout) };\n const rem =\n parseFloat(\n getComputedStyle(document.documentElement)\n .fontSize,\n ) || 16;\n geometryDrag.start(\n e,\n (dx, dy) => {\n const widthRem = Math.max(\n base.minWidthRem,\n Math.min(\n 75,\n Math.round(base.widthRem + dx / rem),\n ),\n );\n const heightRem = Math.max(\n base.minHeightRem,\n Math.min(\n 75,\n Math.round(base.heightRem + dy / rem),\n ),\n );\n patch(c.id, {\n layout:\n widthRem === base.widthRem &&\n heightRem === base.heightRem\n ? original\n : { ...base, widthRem, heightRem },\n });\n },\n () => patch(c.id, { layout: original }),\n );\n }}\n onKeyDown={(e) => {\n if (\n ![\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Home\",\n ].includes(e.key)\n )\n return;\n e.preventDefault();\n e.stopPropagation();\n const base = c.layout ?? defaultLayout,\n step = e.shiftKey ? 4 : 1;\n const layout = {\n ...base,\n widthRem: Math.max(\n base.minWidthRem,\n Math.min(\n 75,\n e.key === \"Home\"\n ? defaultLayout.widthRem\n : base.widthRem +\n (e.key === \"ArrowRight\"\n ? step\n : e.key === \"ArrowLeft\"\n ? -step\n : 0),\n ),\n ),\n heightRem: Math.max(\n base.minHeightRem,\n Math.min(\n 75,\n e.key === \"Home\"\n ? defaultLayout.heightRem\n : base.heightRem +\n (e.key === \"ArrowDown\"\n ? step\n : e.key === \"ArrowUp\"\n ? -step\n : 0),\n ),\n ),\n };\n if (\n layout.widthRem !== base.widthRem ||\n layout.heightRem !== base.heightRem\n )\n patch(c.id, { layout });\n }}\n >\n <Icon name=\"resize\" size={14} />\n </button>\n </div>\n );\n }}\n />\n {!drafts.length && (\n <div className=\"qt-metric-authoring-empty\">\n <Icon name=\"dashboard\" size={28} />\n <strong>Your dashboard is empty</strong>\n <p>Create a metric to start arranging your dashboard.</p>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={createMetric}\n >\n <Icon name=\"add\" />\n Create your first metric\n </button>\n </div>\n )}\n </div>\n <div\n className=\"qt-metric-canvas-resize\"\n role=\"separator\"\n tabIndex={0}\n aria-orientation=\"vertical\"\n aria-label=\"Resize dashboard canvas\"\n aria-valuemin={320}\n aria-valuemax={2400}\n aria-valuenow={canvas}\n aria-valuetext={`${canvas} pixels`}\n title=\"Drag to resize canvas. Left / Right adjust width; Home or double-click resets.\"\n onPointerDown={(e) => {\n const initial = canvas;\n geometryDrag.start(\n e,\n (dx) => canvasWidth(initial + dx),\n () => setCanvas(initial),\n );\n }}\n onDoubleClick={() => setCanvas(1120)}\n onKeyDown={(e) => {\n if (e.key === \"Home\") {\n e.preventDefault();\n setCanvas(1120);\n }\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") {\n e.preventDefault();\n canvasWidth(\n canvas +\n (e.key === \"ArrowLeft\" ? -1 : 1) *\n (e.shiftKey ? 50 : 10),\n );\n }\n }}\n >\n <Icon name=\"grip\" size={14} />\n </div>\n </div>\n </div>\n <p className=\"qt-metric-canvas-note qt-metric-help\">\n {canvas} px canvas · Drag the right edge to test wrapping. Card\n widths are preferred sizes; cards expand to fill each row.\n </p>\n </section>\n ) : (\n <div\n ref={workbench.root}\n className=\"qt-metric-workspace\"\n style={{\n gridTemplateColumns: workbench.visibleIndices\n .map((i) => `${workbench.widths[i]}px`)\n .join(\" 6px \"),\n }}\n >\n <aside\n className=\"qt-metric-library\"\n {...paneProps(0)}\n aria-label=\"Metrics in this query\"\n >\n {paneHeading(\n 0,\n <>\n In this query <span>· {drafts.length}</span>\n </>,\n )}\n <ReorderList\n items={orderItems}\n onMove={move}\n showHint={false}\n itemClassName={(item) =>\n item.id === active ? \"qt-metric-library-selected\" : \"\"\n }\n renderItem={(item, index) => {\n const c = drafts.find((d) => d.id === item.id)!;\n return (\n <>\n <button\n type=\"button\"\n className=\"qt-metric-library-chip\"\n aria-current={item.id === active}\n onClick={() => setActive(item.id)}\n >\n <strong>\n {item.label}\n {issues.has(c.id) && (\n <span\n className=\"qt-metric-needs-attention\"\n aria-label=\"Needs attention\"\n title={issues.get(c.id)}\n >\n <Icon name=\"alert\" size={12} />\n </span>\n )}\n {JSON.stringify(c) !==\n JSON.stringify(\n initial.current.find((m) => m.id === c.id),\n ) && (\n <i\n className=\"qt-metric-dirty-dot\"\n aria-label=\"Modified\"\n />\n )}\n </strong>\n <span>\n {c.groupBy\n .map(\n (g) => fields.find((f) => f.name === g)?.label ?? g,\n )\n .join(\" × \") || \"One value\"}{\" \"}\n ·{\" \"}\n {c.scope === \"shownRows\"\n ? \"Shown rows\"\n : \"All matching\"}\n </span>\n </button>\n {menu(c, index)}\n </>\n );\n }}\n />\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-create\"\n disabled={drafts.length >= MAX_AGGREGATIONS}\n onClick={createMetric}\n >\n + Create metric\n </button>\n </aside>\n {separator(0)}\n <section className=\"qt-metric-definition\" {...paneProps(1)}>\n {paneHeading(1, \"Metric definition\")}\n {selected ? (\n <>\n <label>\n Metric name\n <input\n aria-label=\"Metric name\"\n maxLength={1000}\n value={selected.label ?? titleOf(selected, fields)}\n onChange={(e) =>\n patch(selected.id, { label: e.target.value })\n }\n />\n </label>\n <div className=\"qt-metric-expression-heading\">\n <strong>\n {[\"box\", \"histogram\"].includes(chosen.kind)\n ? \"Values to summarize\"\n : chosen.kind === \"scatter\"\n ? \"X expression\"\n : \"Expression\"}\n </strong>\n {![\"box\", \"histogram\", \"scatter\"].includes(chosen.kind) && (\n <div\n className=\"qt-metric-mode\"\n role=\"group\"\n aria-label=\"Expression mode\"\n >\n <button\n type=\"button\"\n aria-pressed={selected.expression === undefined}\n disabled={\n selected.expression !== undefined &&\n !simpleAggregate(selected, fields)\n }\n title={\n selected.expression !== undefined &&\n !simpleAggregate(selected, fields)\n ? \"This formula cannot be represented in Basic\"\n : undefined\n }\n onClick={() => {\n const basic = simpleAggregate(selected, fields);\n if (basic)\n patch(selected.id, {\n op: basic.op,\n field: basic.field,\n expression: undefined,\n });\n }}\n >\n Basic\n </button>\n <button\n type=\"button\"\n aria-pressed={selected.expression !== undefined}\n onClick={() =>\n patch(selected.id, {\n expression: metricExpression(selected),\n })\n }\n >\n Formula\n </button>\n </div>\n )}\n </div>\n {selected.expression === undefined &&\n ![\"box\", \"histogram\", \"scatter\"].includes(chosen.kind) ? (\n <div className=\"qt-metric-basic\">\n <select\n aria-label=\"Aggregation function\"\n value={selected.op}\n onChange={(e) =>\n patch(selected.id, {\n op: e.target.value as AggregationClause[\"op\"],\n })\n }\n >\n {(selected.field &&\n fields.find((f) => f.name === selected.field)\n ? aggOpsForField(\n fields.find((f) => f.name === selected.field)!,\n )\n : [\"count\"]\n ).map((op) => (\n <option key={op} value={op}>\n {op.toUpperCase()}\n </option>\n ))}\n </select>\n <select\n aria-label=\"Measure field\"\n value={selected.field ?? \"\"}\n onChange={(e) => {\n const field = e.target.value;\n const definition = fields.find((f) => f.name === field);\n patch(selected.id, {\n field: field || undefined,\n op:\n definition &&\n aggOpsForField(definition).includes(selected.op)\n ? selected.op\n : \"count\",\n });\n }}\n >\n <option value=\"\">All rows</option>\n {measurable.map((f) => (\n <option key={f.name} value={f.name}>\n {f.label}\n </option>\n ))}\n </select>\n </div>\n ) : (\n <Suspense fallback={<p>Loading expression editor…</p>}>\n <FormulaEditor\n key={`${selected.id}-x`}\n value={\n [\"box\", \"histogram\"].includes(chosen.kind)\n ? (selected.distribution?.input ?? \"NULL\")\n : metricExpression(selected)\n }\n onChange={(source) => changeExpression(source)}\n fields={fields}\n compile={(source) =>\n api.aggregations.compile\n ? api.aggregations.compile(\n [\"box\", \"histogram\"].includes(chosen.kind)\n ? {\n ...selected,\n distribution: {\n ...selected.distribution!,\n input: source,\n },\n }\n : { ...selected, expression: source },\n )\n : [\"box\", \"histogram\"].includes(chosen.kind)\n ? compileFormula(source, fields)\n : compileMetric(source, fields)\n }\n rows={3}\n suggestions={false}\n showLibrary={false}\n ariaLabel=\"Metric expression\"\n inputRef={input}\n onReady={finishInsertion}\n onFocus={() => setInputTarget(\"primary\")}\n />\n </Suspense>\n )}\n {chosen.kind === \"scatter\" && (\n <>\n <strong>Y expression</strong>\n <Suspense fallback={<p>Loading expression editor…</p>}>\n <FormulaEditor\n key={`${selected.id}-y`}\n value={selected.expressionY ?? \"COUNT()\"}\n onChange={(source) => changeExpression(source, true)}\n fields={fields}\n compile={(source) =>\n api.aggregations.compile\n ? api.aggregations.compile({\n ...selected,\n expressionY: source,\n })\n : compileMetric(source, fields)\n }\n rows={3}\n suggestions={false}\n showLibrary={false}\n ariaLabel=\"Y metric expression\"\n inputRef={inputY}\n onFocus={() => setInputTarget(\"secondary\")}\n />\n </Suspense>\n </>\n )}\n {diagnostics.get(selected.id) &&\n (!computationDiagnostics.has(selected.id) ||\n (selected.expression === undefined &&\n ![\"box\", \"histogram\", \"scatter\"].includes(\n chosen.kind,\n ))) && (\n <p className=\"qt-metric-editor-error\" role=\"status\">\n {diagnostics.get(selected.id)}\n </p>\n )}\n {!diagnostics.has(selected.id) && (\n <p className=\"qt-metric-validation\">✓ Valid expression</p>\n )}\n <Settings\n title=\"Data scope\"\n {...settingsState(\"Data scope\")}\n summary={\n selected.scope === \"shownRows\"\n ? \"Shown rows\"\n : \"All matching rows\"\n }\n >\n <div\n className=\"qt-metric-scope\"\n role=\"group\"\n aria-label=\"Calculate over\"\n >\n {([\"allMatching\", \"shownRows\"] as const).map((scope) => (\n <button\n type=\"button\"\n key={scope}\n aria-pressed={\n (selected.scope ?? \"allMatching\") === scope\n }\n onClick={() => patch(selected.id, { scope })}\n >\n {scope === \"allMatching\"\n ? \"All matching rows\"\n : \"Shown rows\"}\n </button>\n ))}\n </div>\n <p className=\"qt-metric-help\">\n {selected.scope === \"shownRows\"\n ? \"Uses only rows on the current page, after sorting and paging.\"\n : \"Uses every matching row; ignores the table’s limit and offset.\"}\n </p>\n </Settings>\n <Settings\n title=\"Grouping\"\n {...settingsState(\"Grouping\")}\n summary={\n selected.groupBy.length\n ? selected.groupBy\n .map(\n (g) => fields.find((f) => f.name === g)?.label ?? g,\n )\n .join(\" × \")\n : \"One value\"\n }\n >\n {selected.groupBy.map((group, index) => (\n <div\n className=\"qt-metric-group-row\"\n key={`${group}-${index}`}\n >\n <select\n aria-label={`Grouping ${index + 1}`}\n value={group}\n onChange={(e) => {\n const groupBy = [...selected.groupBy];\n groupBy[index] = e.target.value;\n patch(selected.id, { groupBy });\n }}\n >\n {groupable.map((f) => (\n <option\n key={f.name}\n value={f.name}\n disabled={\n f.name !== group &&\n selected.groupBy.includes(f.name)\n }\n >\n {f.label}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n aria-label={`Remove grouping ${index + 1}`}\n onClick={() =>\n regroup(\n selected.groupBy.filter((_, i) => i !== index),\n )\n }\n >\n ×\n </button>\n {index > 0 && (\n <button\n type=\"button\"\n aria-label={`Move grouping ${index + 1} up`}\n onClick={() => {\n const groups = [...selected.groupBy];\n [groups[index], groups[index - 1]] = [\n groups[index - 1]!,\n groups[index]!,\n ];\n regroup(groups);\n }}\n >\n ↑\n </button>\n )}\n </div>\n ))}\n <select\n aria-label=\"Add grouping\"\n value=\"\"\n onChange={(e) => {\n if (e.target.value)\n patch(selected.id, {\n groupBy: [...selected.groupBy, e.target.value],\n });\n }}\n >\n <option value=\"\">+ Add grouping</option>\n {groupable\n .filter((f) => !selected.groupBy.includes(f.name))\n .map((f) => (\n <option key={f.name} value={f.name}>\n {f.label}\n </option>\n ))}\n </select>\n </Settings>\n <Settings\n title=\"Ordering & limits\"\n {...settingsState(\"Ordering & limits\")}\n summary={\n selected.sort?.length\n ? `${selected.sort.length} sort ${selected.sort.length === 1 ? \"rule\" : \"rules\"}${selected.groupLimit ? ` · first ${selected.groupLimit}` : \"\"}`\n : `Default ordering${selected.groupLimit ? ` · first ${selected.groupLimit}` : \"\"}`\n }\n >\n {(selected.sort ?? []).map((sort, index) => (\n <div className=\"qt-metric-sort-row\" key={index}>\n <select\n aria-label={`Sort result ${index + 1}`}\n value={sort.key}\n onChange={(e) =>\n patch(selected.id, {\n sort: selected.sort!.map((s, i) =>\n i === index\n ? { ...s, key: e.target.value as typeof s.key }\n : s,\n ),\n })\n }\n >\n <option value=\"value\">\n {chosen.kind === \"box\"\n ? \"Median\"\n : chosen.kind === \"scatter\"\n ? \"X value\"\n : \"Value\"}\n </option>\n {chosen.kind === \"scatter\" && (\n <option value=\"y\">Y value</option>\n )}\n <option value=\"count\">Rows</option>\n {[\"box\", \"histogram\"].includes(chosen.kind) && (\n <option value=\"samples\">Numeric samples</option>\n )}\n {selected.groupBy.map((g, i) => (\n <option key={g} value={`group${i}`}>\n {fields.find((f) => f.name === g)?.label ?? g}\n </option>\n ))}\n </select>\n <select\n aria-label={`Sort direction ${index + 1}`}\n value={sort.dir}\n onChange={(e) =>\n patch(selected.id, {\n sort: selected.sort!.map((s, i) =>\n i === index\n ? {\n ...s,\n dir: e.target.value as \"asc\" | \"desc\",\n }\n : s,\n ),\n })\n }\n >\n <option value=\"asc\">Ascending</option>\n <option value=\"desc\">Descending</option>\n </select>\n <select\n aria-label={`Null placement ${index + 1}`}\n value={sort.nulls ?? \"last\"}\n onChange={(e) =>\n patch(selected.id, {\n sort: selected.sort!.map((s, i) =>\n i === index\n ? {\n ...s,\n nulls: e.target.value as \"first\" | \"last\",\n }\n : s,\n ),\n })\n }\n >\n <option value=\"last\">NULL last</option>\n <option value=\"first\">NULL first</option>\n </select>\n <button\n type=\"button\"\n aria-label={`Remove sort ${index + 1}`}\n onClick={() =>\n patch(selected.id, {\n sort: selected.sort!.filter((_, i) => i !== index),\n })\n }\n >\n ×\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n className=\"qt-btn\"\n disabled={(selected.sort?.length ?? 0) >= 20}\n onClick={() =>\n patch(selected.id, {\n sort: [\n ...(selected.sort ?? []),\n { key: \"value\", dir: \"desc\", nulls: \"last\" },\n ],\n })\n }\n >\n + Add sort\n </button>\n <label>\n Show first groups\n <input\n aria-label=\"Metric group limit\"\n type=\"number\"\n min={1}\n max={10000}\n placeholder=\"All groups\"\n value={selected.groupLimit ?? \"\"}\n onChange={(e) => {\n const n = e.currentTarget.valueAsNumber;\n if (!e.currentTarget.value)\n patch(selected.id, { groupLimit: undefined });\n else if (Number.isInteger(n) && n >= 1 && n <= 10000)\n patch(selected.id, { groupLimit: n });\n }}\n />\n </label>\n </Settings>\n <Settings\n title=\"Display\"\n {...settingsState(\"Display\")}\n summary={`${kinds.find(([kind]) => kind === chosen.kind)?.[1] ?? chosen.kind}${chosen.format ? ` · ${chosen.format.kind}` : \"\"}`}\n >\n {chosen.kind === \"scatter\" && (\n <label>\n Format measure\n <select\n aria-label=\"Format measure\"\n value={formatTarget}\n onChange={(e) =>\n setFormatTarget(e.target.value as \"x\" | \"y\")\n }\n >\n <option value=\"x\">X output</option>\n <option value=\"y\">Y output</option>\n </select>\n </label>\n )}\n <MetricFormatControls\n displayControl={\n <label>\n Display\n <select\n aria-label=\"Metric display\"\n value={chosen.kind}\n onChange={(e) =>\n changeDisplay(\n e.target.value as MetricDisplay[\"kind\"],\n )\n }\n >\n {kinds.map(([kind, label]) => (\n <option key={kind} value={kind}>\n {label}\n </option>\n ))}\n </select>\n </label>\n }\n format={valueFormat}\n onChange={setFormat}\n sample={\n chosen.kind === \"histogram\" &&\n selectedResult?.buckets[0]?.distribution?.kind ===\n \"histogram\"\n ? selectedResult.buckets[0].distribution.edges[0]\n : formatTarget === \"y\"\n ? selectedResult?.buckets[0]?.y\n : selectedResult?.buckets[0]?.value\n }\n locale={locale}\n />\n {[\n \"bar-horizontal\",\n \"bar-vertical\",\n \"line\",\n \"scatter\",\n \"box\",\n \"histogram\",\n \"list\",\n ].includes(chosen.kind) && (\n <details className=\"qt-metric-settings\">\n <summary>Scale & bounds</summary>\n {(chosen.kind === \"scatter\" ||\n chosen.kind === \"histogram\" ||\n chosen.kind === \"line\"\n ? ([\"xScale\", \"yScale\"] as const)\n : ([\n chosen.kind === \"box\" ||\n chosen.kind === \"bar-horizontal\" ||\n chosen.kind === \"list\"\n ? \"xScale\"\n : \"yScale\",\n ] as const)\n ).map((key) => (\n <fieldset key={key} className=\"qt-metric-axis-settings\">\n <legend>\n {key === \"xScale\"\n ? \"X / horizontal axis\"\n : \"Y / vertical axis\"}\n </legend>\n <label>\n Scale\n <select\n aria-label={`${key === \"xScale\" ? \"X\" : \"Y\"} axis scale`}\n value={chosen[key]?.mode ?? \"linear\"}\n onChange={(e) =>\n displayPatch({\n [key]: {\n ...chosen[key],\n mode: e.target.value,\n },\n })\n }\n >\n <option value=\"linear\">Linear</option>\n <option value=\"log\">Logarithmic</option>\n </select>\n </label>\n {([\"min\", \"max\"] as const).map((bound) => (\n <label key={bound}>\n {bound === \"min\" ? \"Minimum\" : \"Maximum\"}\n <input\n type=\"number\"\n step=\"any\"\n placeholder=\"Automatic\"\n aria-label={`${key === \"xScale\" ? \"X\" : \"Y\"} axis ${bound}`}\n value={chosen[key]?.[bound] ?? \"\"}\n onChange={(e) => {\n if (e.target.validity.badInput) return;\n const next = { ...chosen[key] };\n if (e.target.value === \"\") delete next[bound];\n else next[bound] = Number(e.target.value);\n displayPatch({ [key]: next });\n }}\n />\n </label>\n ))}\n </fieldset>\n ))}\n <p className=\"qt-muted\">\n Bounds use raw result units. Logarithmic axes omit zero\n and negative values. Pie and ring charts use\n proportional areas.\n </p>\n </details>\n )}\n {[\"pie\", \"donut\", \"scatter\", \"histogram\"].includes(\n chosen.kind,\n ) && (\n <label>\n Legend placement\n <select\n aria-label=\"Legend placement\"\n value={chosen.legendPosition ?? \"right\"}\n onChange={(e) =>\n displayPatch({\n legendPosition: e.target.value as NonNullable<\n MetricDisplay[\"legendPosition\"]\n >,\n })\n }\n >\n {(\n [\"left\", \"right\", \"bottom\", \"top\", \"none\"] as const\n ).map((position) => (\n <option key={position} value={position}>\n {\n {\n left: \"Left\",\n right: \"Right\",\n bottom: \"Below\",\n top: \"Above\",\n none: \"None\",\n }[position]\n }\n </option>\n ))}\n </select>\n </label>\n )}\n {chosen.kind === \"list\" && (\n <div className=\"qt-metric-list-controls\">\n {(\n [\"showBars\", \"useGroupColors\", \"showValues\"] as const\n ).map((key) => (\n <label key={key}>\n <input\n type=\"checkbox\"\n checked={chosen.list?.[key] !== false}\n onChange={(e) =>\n displayPatch({\n list: {\n ...chosen.list,\n [key]: e.target.checked,\n },\n })\n }\n />\n {\n {\n showBars: \"Show line bars\",\n useGroupColors: \"Use group colors\",\n showValues: \"Show final values\",\n }[key]\n }\n </label>\n ))}\n </div>\n )}\n {chosen.kind === \"table\" && selected.groupBy.length === 2 && (\n <>\n <label>\n <input\n type=\"checkbox\"\n checked={chosen.pivot?.swap ?? false}\n onChange={(e) =>\n displayPatch({\n pivot: {\n ...chosen.pivot,\n swap: e.target.checked,\n },\n })\n }\n />\n Swap X/Y axes\n </label>\n {([\"rowDir\", \"columnDir\"] as const).map((key) => (\n <label key={key}>\n {key === \"rowDir\" ? \"Row keys\" : \"Column keys\"}\n <select\n value={chosen.pivot?.[key] ?? \"asc\"}\n onChange={(e) =>\n displayPatch({\n pivot: {\n ...chosen.pivot,\n [key]: e.target.value as \"asc\" | \"desc\",\n },\n })\n }\n >\n <option value=\"asc\">Ascending</option>\n <option value=\"desc\">Descending</option>\n </select>\n </label>\n ))}\n </>\n )}\n {chosen.kind === \"box\" && selected.distribution && (\n <>\n <label>\n Whiskers\n <select\n aria-label=\"Box whiskers\"\n value={selected.distribution.whiskers ?? \"minmax\"}\n onChange={(e) =>\n patch(selected.id, {\n distribution: {\n ...selected.distribution!,\n whiskers: e.target.value as \"minmax\" | \"tukey\",\n },\n })\n }\n >\n <option value=\"minmax\">Minimum / maximum</option>\n <option value=\"tukey\">\n 1.5 × IQR · show outliers\n </option>\n </select>\n </label>\n <label>\n <input\n type=\"checkbox\"\n checked={chosen.boxMean !== false}\n onChange={(e) =>\n displayPatch({ boxMean: e.target.checked })\n }\n />\n Show mean marker\n </label>\n </>\n )}\n {chosen.kind === \"histogram\" && selected.distribution && (\n <label>\n Equal-width bins\n <MetricNumberInput\n key={selected.id}\n aria-label=\"Histogram bins\"\n min={2}\n max={30}\n step={1}\n value={selected.distribution.bins ?? 10}\n onCommit={(n) => {\n if (Number.isInteger(n) && n >= 2 && n <= 30)\n patch(selected.id, {\n distribution: {\n ...selected.distribution!,\n bins: n,\n },\n });\n }}\n />\n </label>\n )}\n </Settings>\n <Settings\n title=\"Labels\"\n {...settingsState(\"Labels\")}\n summary={\n [chosen.valueLabel, chosen.xLabel, chosen.yLabel].some(\n Boolean,\n )\n ? \"Custom\"\n : \"Automatic\"\n }\n >\n {([\"valueLabel\", \"xLabel\", \"yLabel\"] as const).map((key) => (\n <label key={key}>\n {\n {\n valueLabel: \"Value label\",\n xLabel: \"X axis label\",\n yLabel: \"Y axis label\",\n }[key]\n }\n <input\n maxLength={1000}\n value={chosen[key] ?? \"\"}\n onChange={(e) =>\n displayPatch({ [key]: e.target.value })\n }\n />\n </label>\n ))}\n </Settings>\n <Settings\n title=\"Card size\"\n {...settingsState(\"Card size\")}\n summary={`${(selected.layout ?? defaultLayout).widthRem} × ${(selected.layout ?? defaultLayout).heightRem} rem · min ${(selected.layout ?? defaultLayout).minWidthRem} × ${(selected.layout ?? defaultLayout).minHeightRem}`}\n >\n {sizeControls}\n </Settings>\n </>\n ) : (\n <div className=\"qt-metric-authoring-empty\">\n <Icon name=\"panelDefinition\" size={28} />\n <strong>No metric selected</strong>\n <p>Create a metric to define what you want to measure.</p>\n <button type=\"button\" className=\"qt-btn\" onClick={createMetric}>\n <Icon name=\"add\" />\n Create metric\n </button>\n </div>\n )}\n </section>\n {separator(1)}\n <aside\n className=\"qt-metric-reference\"\n {...paneProps(2)}\n aria-label=\"Field and function library\"\n >\n {paneHeading(2, \"Fields & functions\")}\n <select\n aria-label=\"Reference library\"\n value={reference}\n onChange={(e) => setReference(e.target.value as typeof reference)}\n >\n <option value=\"fields\">Fields</option>\n <option value=\"functions\">Functions</option>\n </select>\n <label>\n Search {reference}\n <input\n aria-label=\"Search metric reference\"\n type=\"search\"\n placeholder=\"Name or purpose\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </label>\n {reference === \"functions\" && (\n <label>\n Concept\n <select\n aria-label=\"Function concept\"\n value={concept}\n onChange={(e) => setConcept(e.target.value)}\n >\n <option value=\"all\">All functions</option>\n <option value=\"aggregate\">Aggregation</option>\n <option value=\"row\">Row arithmetic & conditions</option>\n </select>\n </label>\n )}\n <div className=\"qt-metric-reference-columns\" aria-hidden=\"true\">\n <span>Type</span>\n <span>Name</span>\n <span>{reference === \"fields\" ? \"ID\" : \"Signature\"}</span>\n </div>\n <div className=\"qt-metric-reference-list\">\n {referenceItems.map((item) => (\n <button\n type=\"button\"\n className=\"qt-metric-reference-item\"\n key={item.name}\n title={`${item.label} · ${item.detail}\n${item.description}`}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n insert(item.wrap ? item.name : item.detail, item.wrap)\n }\n >\n <span>{item.type}</span>\n <strong>{item.label}</strong>\n <code>\n {reference === \"fields\" ? item.name : item.detail}\n </code>\n </button>\n ))}\n {referenceItems.length === 0 && (\n <p className=\"qt-metric-help\" role=\"status\">\n No {reference} match “{search}”.\n </p>\n )}\n </div>\n <p className=\"qt-metric-help\">\n Insert at the cursor. Select expression text to wrap it in a\n function.\n </p>\n </aside>\n {separator(2)}\n <section className=\"qt-metric-live-preview\" {...paneProps(3)}>\n <div className=\"qt-metric-preview-heading\">\n <h3>Live preview</h3>\n <span className=\"qt-metric-preview-status\" role=\"status\">\n {previewLoading\n ? \"Calculating…\"\n : selectedResult?.error ||\n error ||\n (selected && diagnostics.has(selected.id))\n ? \"Needs attention\"\n : selectedResult?.coverage === \"exact\"\n ? \"Complete results\"\n : selectedResult?.coverage === \"partial\"\n ? \"Partial results\"\n : \"Preview\"}\n </span>\n {panelToggle(3, true)}\n </div>\n {selected && (\n <>\n <p className=\"qt-metric-preview-scope\">\n {selected.scope === \"shownRows\"\n ? \"Shown rows on this page\"\n : \"All matching rows\"}\n </p>\n <p className=\"qt-metric-help\">\n Aggregate input rows, then apply result ordering and display.\n </p>\n <div className=\"qt-metric-preview-controls\">\n <label>\n Width (px)\n <MetricNumberInput\n key={selected.id}\n aria-label=\"Preview width\"\n min={100}\n max={1800}\n value={previewSize.width}\n onCommit={(n) => {\n if (Number.isFinite(n))\n setPreviewSize((previous) => ({\n ...previous,\n width: Math.max(100, Math.min(1800, n)),\n }));\n }}\n />\n </label>\n <label>\n Height (px)\n <MetricNumberInput\n key={selected.id}\n aria-label=\"Preview height\"\n min={60}\n max={1000}\n value={previewSize.height}\n onCommit={(n) => {\n if (Number.isFinite(n))\n setPreviewSize((previous) => ({\n ...previous,\n height: Math.max(60, Math.min(1000, n)),\n }));\n }}\n />\n </label>\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={() => {\n const layout = selected.layout ?? defaultLayout;\n const rem =\n parseFloat(\n getComputedStyle(document.documentElement).fontSize,\n ) || 16;\n setPreviewSize({\n width: layout.widthRem * rem,\n height: layout.heightRem * rem,\n });\n }}\n >\n Use card size\n </button>\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-refresh\"\n aria-label=\"Refresh preview\"\n title=\"Refresh preview\"\n onClick={() => setRetry((value) => value + 1)}\n >\n <Icon name=\"refresh\" size={14} />\n </button>\n </div>\n <div\n ref={previewContainer}\n className=\"qt-metric-preview-card\"\n style={{\n width: previewSize.width,\n height: previewSize.height,\n }}\n >\n {card(selected)}\n </div>\n <p className=\"qt-metric-help\">\n Drag the lower-right corner to resize. Preview dimensions are\n temporary.\n </p>\n {selectedResult?.processedRows !== undefined && (\n <p className=\"qt-muted\">\n {selectedResult.processedRows.toLocaleString(locale)} input\n rows · {selectedResult.buckets.length} of{\" \"}\n {selectedResult.groupCount ?? selectedResult.buckets.length}{\" \"}\n groups\n </p>\n )}\n {inspectedBucket && (\n <details\n className=\"qt-metric-settings qt-metric-inspection\"\n open={inspectOpen}\n onToggle={(e) => setInspectOpen(e.currentTarget.open)}\n >\n <summary>\n <strong>Inspect result</strong>\n <span>\n {inspectedBucket.keys\n .map((k) => (k === null ? \"NULL\" : String(k)))\n .join(\" / \") || \"One value\"}\n </span>\n </summary>\n <div>\n {selectedResult && selectedResult.buckets.length > 1 && (\n <label>\n Result group\n <select\n aria-label=\"Inspect result group\"\n value={JSON.stringify(inspectedBucket.keys)}\n onChange={(e) => setInspectedKey(e.target.value)}\n >\n {selectedResult.buckets.map((b) => (\n <option\n key={JSON.stringify(b.keys)}\n value={JSON.stringify(b.keys)}\n >\n {b.keys\n .map((k) => (k === null ? \"NULL\" : String(k)))\n .join(\" / \")}\n </option>\n ))}\n </select>\n </label>\n )}\n <MetricInspection\n bucket={inspectedBucket}\n clause={selected}\n locale={locale}\n />\n </div>\n </details>\n )}\n </>\n )}\n </section>\n </div>\n )}\n {error && (\n <p className=\"qt-metric-editor-error\" role=\"alert\">\n {error}\n </p>\n )}\n {contextChanged && (\n <p className=\"qt-metric-editor-error\" role=\"status\">\n The metric configuration changed outside this draft.\n </p>\n )}\n <footer className=\"qt-metrics-editor-footer\">\n <span className=\"qt-muted\">\n {dirty\n ? \"Unsaved changes\"\n : \"Changes stay in this draft until applied.\"}\n </span>\n {removed && (\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-undo-remove\"\n title={`Restore ${titleOf(removed.clause, fields)}`}\n disabled={drafts.length >= MAX_AGGREGATIONS}\n onClick={() => {\n setDrafts((previous) => {\n const next = [...previous];\n next.splice(\n Math.min(removed.position, next.length),\n 0,\n removed.clause,\n );\n return next;\n });\n focusDestination.current = true;\n setNavigation((previous) => previous + 1);\n setActive(removed.clause.id);\n setAnnouncement(`${titleOf(removed.clause, fields)} restored.`);\n setRemoved(null);\n }}\n >\n <Icon name=\"undo\" size={14} />\n Undo remove\n </button>\n )}\n {issues.size > 0 && (\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-review-issues\"\n onClick={() => {\n workbench.showPane(3);\n navigate(\"editor\", issues.keys().next().value);\n }}\n >\n <Icon name=\"alert\" size={14} />\n Review {issues.size} {issues.size === 1 ? \"issue\" : \"issues\"}\n </button>\n )}\n <button type=\"button\" className=\"qt-btn\" onClick={close}>\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"qt-btn qt-btn-primary\"\n disabled={\n diagnostics.size > 0 ||\n contextChanged ||\n !!error ||\n previewLoading ||\n !!preview?.metrics.some((m) => m.error)\n }\n onClick={apply}\n >\n Apply metrics\n </button>\n </footer>\n <div className=\"qt-sr-only\" role=\"status\" aria-live=\"polite\">\n {announcement}\n {selectedPosition >= 0\n ? `Selected metric ${selectedPosition + 1} of ${drafts.length}`\n : \"\"}\n </div>\n {discard && (\n <ModalSurface\n title=\"Discard metric changes?\"\n className=\"qt-modal qt-metric-discard\"\n onClose={() => setDiscard(false)}\n >\n <div className=\"qt-overlay-body\">\n <p>Your metric draft has not been applied.</p>\n <div className=\"qt-metric-discard-actions\">\n <button\n type=\"button\"\n className=\"qt-btn\"\n onClick={() => setDiscard(false)}\n >\n Keep editing\n </button>\n <button type=\"button\" className=\"qt-btn\" onClick={onClose}>\n Discard changes\n </button>\n </div>\n </div>\n </ModalSurface>\n )}\n </ModalSurface>\n );\n\n function separator(index: number) {\n const next = workbench.nextPane(index);\n if (!workbench.visiblePanes[index] || next === undefined) return null;\n return (\n <div\n role=\"separator\"\n tabIndex={0}\n aria-orientation=\"vertical\"\n aria-label={`Resize metric panes ${index + 1} and ${next + 1}`}\n aria-controls={`${titleId}-pane-${index} ${titleId}-pane-${next}`}\n title={`Resize ${panes[index]!.label.toLowerCase()} and ${panes[next]!.label.toLowerCase()} panels`}\n aria-valuemin={workbench.minWidths[index]}\n aria-valuenow={Math.round(workbench.widths[index] ?? 0)}\n className=\"qt-metric-pane-separator\"\n aria-valuemax={\n (workbench.widths[index] ?? 0) +\n (workbench.widths[next] ?? 0) -\n (workbench.minWidths[next] ?? 0)\n }\n aria-valuetext={`${Math.round(workbench.widths[index] ?? 0)} pixels`}\n onDoubleClick={workbench.resetPanes}\n onPointerDown={(e) => workbench.startResize(e, index)}\n onKeyDown={(e) => {\n if (e.key === \"Home\") {\n e.preventDefault();\n workbench.resetPanes();\n }\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") {\n e.preventDefault();\n workbench.stepResize(\n index,\n (e.key === \"ArrowLeft\" ? -1 : 1) * (e.shiftKey ? 50 : 10),\n );\n }\n }}\n />\n );\n }\n}\n\nfunction newId(): string {\n return typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ? crypto.randomUUID()\n : `metric-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** Preserve incomplete typing; bounds apply only on blur or Enter. */\nfunction MetricNumberInput({\n value,\n onCommit,\n min,\n max,\n ...props\n}: Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"onChange\" | \"onBlur\" | \"onKeyDown\" | \"min\" | \"max\"\n> & {\n value: number;\n min: number;\n max: number;\n onCommit: (value: number) => void;\n}) {\n const [draft, setDraft] = useState<string | null>(null);\n return (\n <input\n {...props}\n type=\"number\"\n min={min}\n max={max}\n value={draft ?? value}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onBlur={() => {\n if (draft !== null && draft.trim() && Number.isFinite(Number(draft)))\n onCommit(Math.max(min, Math.min(max, Math.round(Number(draft)))));\n setDraft(null);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.currentTarget.blur();\n }\n if (event.key === \"Escape\" && draft !== null) {\n event.preventDefault();\n event.stopPropagation();\n setDraft(null);\n }\n }}\n />\n );\n}\nfunction Settings({\n title,\n summary,\n children,\n open,\n onOpenChange,\n}: {\n title: string;\n summary: string;\n children: ReactNode;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n return (\n <details\n className=\"qt-metric-settings\"\n open={open}\n onToggle={(e) => onOpenChange(e.currentTarget.open)}\n >\n <summary>\n <strong>{title}</strong>\n <span>{summary}</span>\n </summary>\n <div>{children}</div>\n </details>\n );\n}\nfunction MetricFormatControls({\n format,\n onChange,\n displayControl,\n sample,\n locale,\n}: {\n displayControl?: ReactNode;\n sample?: AggregationBucket[\"value\"] | undefined;\n locale?: string | undefined;\n format: MetricValueFormat;\n onChange: (format: MetricValueFormat) => void;\n}) {\n const temporal = ![\"number\", \"percent\"].includes(format.kind),\n duration = format.kind === \"duration\";\n const patch = (values: Partial<MetricValueFormat>) =>\n onChange({ ...format, ...values });\n const units: Array<[NonNullable<MetricValueFormat[\"sourceUnit\"]>, string]> =\n duration\n ? [\n [\"milliseconds\", \"Milliseconds\"],\n [\"seconds\", \"Seconds\"],\n [\"minutes\", \"Minutes\"],\n [\"hours\", \"Hours\"],\n [\"days\", \"Days\"],\n ]\n : [\n [\"iso\", \"ISO text\"],\n [\"epochSeconds\", \"Unix seconds\"],\n [\"epochMilliseconds\", \"Unix milliseconds\"],\n ...(format.kind === \"time\"\n ? ([\n [\"secondsOfDay\", \"Seconds since midnight\"],\n [\"millisecondsOfDay\", \"Milliseconds since midnight\"],\n ] as Array<\n [NonNullable<MetricValueFormat[\"sourceUnit\"]>, string]\n >)\n : []),\n ];\n return (\n <div\n className={`qt-metric-format-controls${temporal ? \" qt-metric-format-controls--temporal\" : \"\"}`}\n >\n {displayControl}\n <label>\n Output type\n <select\n aria-label=\"Metric output type\"\n value={format.kind}\n onChange={(e) =>\n onChange({\n kind: e.target.value as MetricValueFormat[\"kind\"],\n decimals: format.decimals ?? 0,\n sourceUnit:\n e.target.value === \"duration\" ? \"milliseconds\" : \"iso\",\n style: \"human\",\n timeZone: \"UTC\",\n })\n }\n >\n {(\n [\n \"number\",\n \"percent\",\n \"duration\",\n \"date\",\n \"time\",\n \"datetime\",\n ] as const\n ).map((kind) => (\n <option key={kind} value={kind}>\n {\n {\n number: \"Number\",\n percent: \"Percent\",\n duration: \"Duration\",\n date: \"Date\",\n time: \"Time\",\n datetime: \"Date & time\",\n }[kind]\n }\n </option>\n ))}\n </select>\n </label>\n {!temporal && (\n <label>\n Decimals\n <MetricNumberInput\n aria-label=\"Metric decimals\"\n min={0}\n max={6}\n step={1}\n value={format.decimals ?? 0}\n onCommit={(n) => {\n if (Number.isInteger(n) && n >= 0 && n <= 6)\n patch({ decimals: n });\n }}\n />\n </label>\n )}\n {temporal && (\n <div className=\"qt-metric-temporal-controls\">\n <label>\n Source units / encoding\n <select\n aria-label=\"Source units\"\n value={format.sourceUnit ?? (duration ? \"milliseconds\" : \"iso\")}\n onChange={(e) =>\n patch({\n sourceUnit: e.target.value as NonNullable<\n MetricValueFormat[\"sourceUnit\"]\n >,\n })\n }\n >\n {units.map(([unit, label]) => (\n <option value={unit} key={unit}>\n {label}\n </option>\n ))}\n </select>\n </label>\n <label>\n Label format\n <select\n aria-label=\"Label format\"\n value={format.style ?? \"human\"}\n onChange={(e) =>\n patch({\n style: e.target.value as NonNullable<\n MetricValueFormat[\"style\"]\n >,\n pattern:\n format.pattern ??\n (duration\n ? \"{h}h{m}m\"\n : format.kind === \"time\"\n ? \"HH:mm:ss\"\n : format.kind === \"date\"\n ? \"YYYY-MM-DD\"\n : \"YYYY-MM-DD HH:mm:ss\"),\n })\n }\n >\n <option value=\"human\">\n {duration\n ? \"Human readable\"\n : format.kind === \"time\"\n ? \"24-hour\"\n : \"Readable\"}\n </option>\n {duration ? (\n <>\n <option value=\"long\">Long</option>\n <option value=\"clock\">Clock · total hours</option>\n </>\n ) : (\n <option value=\"iso\">{\"ISO-style\"}</option>\n )}\n <option value=\"custom\">Custom format string</option>\n </select>\n </label>\n {format.style === \"custom\" && (\n <label>\n Format string\n <input\n aria-label=\"Output format string\"\n maxLength={160}\n value={format.pattern ?? \"\"}\n onChange={(e) => patch({ pattern: e.target.value })}\n />\n <span className=\"qt-muted\">\n {duration\n ? \"{d} {h} {hh} {m} {mm} {s} {ss} {ms}\"\n : \"YYYY MM DD MMM MMMM ddd HH hh mm ss SSS A Z; [literal text]\"}\n </span>\n </label>\n )}\n {!duration &&\n ![\"secondsOfDay\", \"millisecondsOfDay\"].includes(\n format.sourceUnit ?? \"\",\n ) && (\n <label>\n Timezone\n <input\n aria-label=\"Output timezone\"\n maxLength={80}\n value={format.timeZone ?? \"UTC\"}\n placeholder=\"UTC, local, or America/Denver\"\n onChange={(e) => patch({ timeZone: e.target.value })}\n />\n </label>\n )}\n </div>\n )}\n <div className=\"qt-metric-format-example\">\n <span>Format example</span>\n <strong>\n {\n formatMetricOutput(\n sample === undefined\n ? format.kind === \"date\" || format.kind === \"datetime\"\n ? \"2026-10-08T14:30:00Z\"\n : format.kind === \"time\"\n ? \"14:30:00\"\n : format.kind === \"duration\"\n ? 83400\n : 0.875\n : sample,\n format,\n locale,\n ).text\n }\n </strong>\n </div>\n </div>\n );\n}\n\nfunction MetricInspection({\n bucket,\n clause,\n locale,\n}: {\n bucket: AggregationBucket;\n clause: AggregationClause;\n locale?: string | undefined;\n}) {\n const rows: Array<[string, string]> = [\n [\"Input rows\", bucket.count.toLocaleString(locale)],\n ];\n const box =\n bucket.distribution?.kind === \"box\" ? bucket.distribution.summary : null;\n if (box)\n for (const key of [\"min\", \"q1\", \"median\", \"q3\", \"max\", \"mean\"] as const)\n rows.push([\n {\n min: \"Minimum\",\n q1: \"First quartile\",\n median: \"Median\",\n q3: \"Third quartile\",\n max: \"Maximum\",\n mean: \"Mean\",\n }[key],\n formatMetricOutput(box[key], clause.display?.format, locale).text,\n ]);\n else {\n rows.push([\"Raw value\", String(bucket.value ?? \"NULL\")]);\n if (clause.display?.kind === \"scatter\")\n rows.push([\"Raw Y value\", String(bucket.y ?? \"NULL\")]);\n }\n if (bucket.distribution)\n rows.push(\n [\n \"Numeric samples\",\n String(\n bucket.distribution.kind === \"box\"\n ? (bucket.distribution.summary?.n ?? 0)\n : bucket.distribution.n,\n ),\n ],\n [\"NULL values\", String(bucket.nullCount ?? 0)],\n );\n return (\n <>\n <code className=\"qt-metric-inspection-expression\">\n {clause.distribution &&\n [\"box\", \"histogram\"].includes(clause.display?.kind ?? \"\")\n ? clause.distribution.input\n : metricExpression(clause)}\n </code>\n <dl className=\"qt-metric-inspection-values\">\n {rows.map(([label, value]) => (\n <div key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </div>\n ))}\n </dl>\n {bucket.error && <p className=\"qt-metric-editor-error\">{bucket.error}</p>}\n </>\n );\n}\n\nfunction simpleAggregate(\n clause: AggregationClause,\n fields: FieldDef[],\n): { op: AggregationClause[\"op\"]; field?: string } | undefined {\n try {\n const ast = compileMetric(metricExpression(clause), fields).ast;\n if (\n ast.kind !== \"call\" ||\n ![\"COUNT\", \"COUNT_DISTINCT\", \"SUM\", \"AVG\", \"MIN\", \"MAX\"].includes(\n ast.name,\n )\n )\n return;\n if (ast.args.length === 0 && ast.name === \"COUNT\") return { op: \"count\" };\n if (ast.args.length === 1 && ast.args[0]?.kind === \"field\")\n return {\n op: ast.name.toLowerCase() as AggregationClause[\"op\"],\n field: ast.args[0].name,\n };\n } catch {\n return;\n }\n}\n","import { Icon } from \"./Icon\";\nimport { useRef, useState, type ReactNode, type CSSProperties } 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<{\n id: string;\n top: number;\n left: number;\n width: number;\n height: number;\n advance: number;\n }>;\n}\n\nexport function ReorderList({\n items,\n onMove,\n disabled,\n className,\n renderItem,\n showHint = true,\n layout = \"vertical\",\n itemStyle,\n itemClassName,\n}: {\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 itemStyle?: (item: ReorderItem, position: number) => CSSProperties;\n itemClassName?: (item: ReorderItem, position: number) => string;\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<{\n id: string;\n target: number;\n offsets: Record<string, { x: number; y: number }>;\n } | null>(null);\n const [announcement, setAnnouncement] = useState(\"\");\n const move = (item: ReorderItem, position: number) => {\n onMove(item.id, position);\n setAnnouncement(\n `${item.label} moved to position ${position + 1} of ${items.length}`,\n );\n };\n return (\n <>\n {showHint && (\n <p className=\"qt-reorder-hint qt-muted\">Drag handles to reorder.</p>\n )}\n <ol\n ref={list}\n className={`qt-reorder-list${className ? ` ${className}` : \"\"}`}\n >\n {items.map((item, position) => (\n <li\n key={item.id}\n data-reorder-id={item.id}\n style={{\n ...itemStyle?.(item, position),\n ...(drag\n ? {\n transform:\n layout === \"wrap\"\n ? `translate(${drag.offsets[item.id]?.x ?? 0}px, ${drag.offsets[item.id]?.y ?? 0}px)`\n : `translateY(${drag.offsets[item.id]?.y ?? 0}px)`,\n }\n : {}),\n }}\n className={`${drag?.id === item.id ? \"qt-reorder-item qt-reorder-item--dragging\" : \"qt-reorder-item\"} ${itemClassName?.(item, position) ?? \"\"}`}\n >\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(\n list.current?.querySelectorAll<HTMLElement>(\n \":scope > li[data-reorder-id]\",\n ) ?? [],\n );\n const positions = rows.map((row, index) => {\n const bounds = row.getBoundingClientRect();\n const next = rows[index + 1]?.getBoundingClientRect();\n const advance = next\n ? next.top - bounds.top\n : bounds.height +\n (parseFloat(getComputedStyle(row).marginBottom) || 0);\n return {\n id: row.dataset.reorderId!,\n top: bounds.top,\n left: bounds.left,\n width: bounds.width,\n height: bounds.height,\n advance,\n };\n });\n let scroller: HTMLElement | null = list.current;\n while (\n scroller &&\n (!/auto|scroll/.test(getComputedStyle(scroller).overflowY) ||\n scroller.scrollHeight <= scroller.clientHeight)\n )\n scroller = scroller.parentElement;\n scrollContainer.current =\n scroller ?? (document.scrollingElement as HTMLElement | null);\n gesture.current = {\n id: item.id,\n position,\n target: position,\n layout: positions,\n scrollTop: scrollContainer.current?.scrollTop ?? 0,\n };\n setDrag({ id: item.id, target: position, offsets: {} });\n }}\n onPointerMove={(event) => {\n const current = gesture.current;\n if (!current) return;\n const scrollDelta =\n (scrollContainer.current?.scrollTop ?? 0) - current.scrollTop;\n let target = current.layout.findIndex(\n (row) => event.clientY < row.top + row.advance - scrollDelta,\n );\n if (layout === \"wrap\") {\n let nearest = Infinity;\n current.layout.forEach((row, index) => {\n const distanceX = Math.max(\n row.left - event.clientX,\n 0,\n event.clientX - row.left - row.width,\n );\n const distanceY = Math.max(\n row.top - scrollDelta - event.clientY,\n 0,\n event.clientY - row.top + scrollDelta - row.height,\n );\n const distance =\n 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 =\n list.current?.getBoundingClientRect().right ?? Infinity;\n const style = list.current\n ? getComputedStyle(list.current)\n : 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] = {\n x: left - row.left,\n y: top - row.top,\n };\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 =\n scroller === document.scrollingElement\n ? { top: 0, bottom: window.innerHeight }\n : scroller.getBoundingClientRect();\n if (event.clientY > bounds.bottom - 48)\n 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)\n move(item, current.target);\n }}\n onPointerCancel={() => {\n gesture.current = null;\n setDrag(null);\n }}\n onKeyDown={(event) => {\n if (disabled) return;\n if (\n event.key === \"ArrowUp\" ||\n event.key === \"ArrowDown\" ||\n (layout === \"wrap\" &&\n (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\"))\n ) {\n event.preventDefault();\n move(\n item,\n Math.max(\n 0,\n Math.min(\n items.length - 1,\n position +\n (event.key === \"ArrowUp\" || event.key === \"ArrowLeft\"\n ? -1\n : 1),\n ),\n ),\n );\n }\n }}\n >\n <Icon name=\"grip\" />\n </button>\n {renderItem ? (\n renderItem(item, position)\n ) : (\n <span className=\"qt-reorder-label\">{item.label}</span>\n )}\n </li>\n ))}\n </ol>\n <span className=\"qt-sr-only\" role=\"status\">\n {announcement}\n </span>\n </>\n );\n}\n","import {\n distributionProblem,\n metricPresentationProblem,\n} from \"./metricPresentation\";\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 { useState, useMemo, type ReactNode } from \"react\";\nimport { EMPTY_QUERY } from \"@pythia-software/query-table-core\";\nimport type { AggOp, FieldDef } from \"@pythia-software/query-table-core\";\nimport type { AggregationsApi } from \"@pythia-software/query-table-react\";\nimport { MetricsEditor } from \"./MetricsEditor\";\nimport { Icon } from \"./Icon\";\nimport type { QueryTableApi } from \"@pythia-software/query-table-react\";\nimport { MetricChart } from \"./MetricChart\";\nimport {\n createMetricColorResolver,\n metricThemeStyle,\n typedMetricKey,\n metricTupleKey,\n type MetricTheme,\n type MetricClassNames,\n} from \"./metricColors\";\nimport { metricScale } from \"./metricChartHelpers\";\nimport { formatMetricOutput } from \"./metricFormat\";\nimport type {\n MetricBucket as AggregationBucket,\n RenderingClause as AggregationClause,\n MetricValue,\n MetricRenderResult,\n} from \"./metricTypes\";\nimport { resolveRenderer, type RenderRegistry } from \"./renderers\";\n\nexport interface MetricsPanelProps<Row> {\n /** Enables quick editing using the transactional metrics editor. */\n api?: QueryTableApi<Row>;\n onEditMetric?: (id: string) => void;\n onEditDashboard?: () => void;\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?: MetricClassNames;\n theme?: MetricTheme;\n locale?: string;\n onInspect?: (bucket: AggregationBucket, clause: AggregationClause) => void;\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 api,\n onEditMetric,\n onEditDashboard,\n fields,\n renderers,\n emptyMessage,\n classNames,\n theme,\n locale,\n onInspect,\n}: MetricsPanelProps<Row>): ReactNode {\n const { clauses, results, loading, error } = aggregations;\n const [editing, setEditing] = useState<{\n id?: string;\n view: \"editor\" | \"dashboard\";\n } | null>(null);\n const editMetric =\n onEditMetric ??\n (api ? (id: string) => setEditing({ id, view: \"editor\" }) : undefined);\n const editDashboard =\n onEditDashboard ??\n (api ? () => setEditing({ view: \"dashboard\" }) : undefined);\n\n if (clauses.length === 0) {\n return emptyMessage ? (\n <div\n className={cx(\"qt-metrics\", classNames?.root)}\n style={metricThemeStyle(theme)}\n >\n {emptyMessage}\n </div>\n ) : null;\n }\n\n const resultById = new Map((results?.metrics ?? []).map((m) => [m.id, m]));\n\n return (\n <div\n className={cx(\"qt-metrics\", classNames?.root)}\n style={metricThemeStyle(theme)}\n >\n {editDashboard && (\n <button\n type=\"button\"\n className=\"qt-btn qt-metrics-edit\"\n aria-label=\"Edit dashboard layout\"\n title=\"Edit dashboard layout\"\n onClick={editDashboard}\n >\n <Icon name=\"pencil\" />\n </button>\n )}\n {editing && api && (\n <MetricsEditor\n api={api}\n fields={api.computed.catalogue}\n initialView={editing.view}\n {...(editing.id ? { initialMetricId: editing.id } : {})}\n {...(theme ? { theme } : {})}\n {...(locale ? { locale } : {})}\n onClose={() => setEditing(null)}\n />\n )}\n {error ? (\n <div className=\"qt-metrics-error\">Metrics failed: {error.message}</div>\n ) : null}\n {clauses.map((clause) => (\n <MetricCard\n key={clause.id}\n clause={clause}\n result={resultById.get(clause.id)}\n loading={loading && !resultById.has(clause.id)}\n fields={fields}\n theme={theme}\n locale={locale}\n onInspect={onInspect}\n onEdit={editMetric ? () => editMetric(clause.id) : undefined}\n classNames={classNames}\n renderers={renderers}\n className={classNames?.metric}\n />\n ))}\n </div>\n );\n}\n\nexport interface MetricCardProps<Row> {\n onEdit?: (() => void) | undefined;\n clause: AggregationClause;\n buckets?: AggregationBucket[] | undefined;\n result?: MetricRenderResult | undefined;\n fields: FieldDef<Row>[];\n loading?: boolean | undefined;\n renderers?: RenderRegistry<Row> | undefined;\n theme?: MetricTheme | undefined;\n locale?: string | undefined;\n className?: string | undefined;\n classNames?: MetricClassNames | undefined;\n onInspect?:\n | ((bucket: AggregationBucket, clause: AggregationClause) => void)\n | undefined;\n}\n\nexport function MetricCard<Row>({\n clause,\n buckets: explicitBuckets,\n onEdit,\n result,\n fields,\n loading = false,\n renderers,\n theme,\n locale,\n className,\n classNames,\n onInspect,\n}: MetricCardProps<Row>): ReactNode {\n const buckets = explicitBuckets ?? result?.buckets ?? [];\n const byName = useMemo(\n () => new Map(fields.map((f) => [f.name, f])),\n [fields],\n );\n const measure = clause.field ? byName.get(clause.field) : undefined;\n const groupLabels = clause.groupBy.map((g) => byName.get(g)?.label ?? g);\n const decimals = cardDecimals(buckets);\n const fmt = (v: MetricValue): ReactNode => {\n if (clause.display?.format) {\n const out = formatMetricOutput(v, clause.display.format, locale);\n return (\n <span\n title={out.error}\n className={out.error ? \"qt-metric-format-error\" : undefined}\n >\n {out.text}\n </span>\n );\n }\n if (clause.expression)\n return formatMetricOutput(\n v,\n typeof v === \"number\" ? { kind: \"number\", decimals } : undefined,\n locale,\n ).text;\n return formatMetricValue(v, clause.op, measure, renderers, decimals);\n };\n const kind = clause.display?.kind ?? \"auto\";\n const chart = [\n \"bar-horizontal\",\n \"bar-vertical\",\n \"line\",\n \"pie\",\n \"donut\",\n \"scatter\",\n \"box\",\n \"histogram\",\n ].includes(kind);\n const layout = clause.layout;\n const size = layout\n ? {\n flexBasis: `${layout.widthRem}rem`,\n flexGrow: 1,\n width: `${layout.widthRem}rem`,\n height: `${layout.heightRem}rem`,\n minWidth: `${layout.minWidthRem}rem`,\n minHeight: `${layout.minHeightRem}rem`,\n }\n : {};\n const invalidDistribution = [\n ...buckets,\n ...(result?.other ? [result.other] : []),\n ]\n .map((b) => distributionProblem(b.distribution))\n .find(Boolean);\n const problem =\n result?.error ??\n metricPresentationProblem(clause) ??\n invalidDistribution ??\n ((kind === \"value\" || (kind === \"auto\" && !clause.groupBy.length)) &&\n (buckets.length > 1 || buckets.some((b) => b.keys.length > 0))\n ? \"Value display requires one ungrouped result. Choose Table or List, or correct the result grouping.\"\n : undefined);\n let body: ReactNode;\n if (problem)\n body = (\n <div className=\"qt-metrics-error\" role=\"status\">\n {problem}\n </div>\n );\n else if (loading && buckets.length === 0)\n body = <div className=\"qt-metric-loading\">…</div>;\n else if (!buckets.length)\n body = <div className=\"qt-metric-empty\">no data</div>;\n else if (chart)\n body = (\n <MetricChart\n clause={clause}\n buckets={buckets}\n result={result}\n theme={theme}\n locale={locale}\n classNames={classNames}\n onInspect={onInspect ? (b) => onInspect(b, clause) : undefined}\n />\n );\n else if (kind === \"value\" || (kind === \"auto\" && clause.groupBy.length === 0))\n body = <BigNumber bucket={buckets[0]!} fmt={fmt} />;\n else if (kind === \"list\" || (kind === \"auto\" && clause.groupBy.length === 1))\n body = (\n <BarList clause={clause} theme={theme} buckets={buckets} fmt={fmt} />\n );\n else if (clause.groupBy.length === 2)\n body = (\n <Pivot\n clause={clause}\n buckets={buckets}\n fmt={fmt}\n rowLabel={groupLabels[0]!}\n colLabel={groupLabels[1]!}\n />\n );\n else\n body = (\n <FlatTable\n buckets={buckets}\n fmt={fmt}\n groupLabels={groupLabels}\n valueLabel={clause.display?.valueLabel ?? metricTitle(clause, measure)}\n />\n );\n return (\n <div\n className={cx(\n \"qt-metric\",\n `qt-metric--gb${Math.min(clause.groupBy.length, 3)}`,\n chart && \"qt-metric--chart\",\n className,\n classNames?.metric,\n )}\n style={{ ...metricThemeStyle(theme), ...size }}\n >\n {onEdit && (\n <button\n type=\"button\"\n className=\"qt-btn qt-metric-edit\"\n aria-label={`Edit metric ${metricTitle(clause, measure)}`}\n title=\"Edit metric\"\n onClick={onEdit}\n >\n <Icon name=\"pencil\" />\n </button>\n )}\n <div className=\"qt-metric-head\">\n <span className={cx(\"qt-metric-title\", classNames?.title)}>\n {metricTitle(clause, measure)}\n </span>\n {groupLabels.length > 0 && (\n <span className=\"qt-metric-by\">by {groupLabels.join(\" × \")}</span>\n )}\n </div>\n {result?.coverage === \"partial\" && (\n <p className=\"qt-metric-note\" role=\"status\">\n Partial results\n </p>\n )}\n {body}\n {result?.groupCount !== undefined &&\n result.groupCount > buckets.length && (\n <p className=\"qt-metric-note\">\n {buckets.length} of {result.groupCount} groups returned. Increase\n the group limit to see more.\n </p>\n )}\n </div>\n );\n}\n\n// ---- 0 group-by: one big number -------------------------------------------\n\nfunction BigNumber({\n bucket,\n fmt,\n}: {\n bucket: AggregationBucket;\n fmt: (v: MetricValue) => ReactNode;\n}) {\n return (\n <div className=\"qt-metric-big\">\n <span className=\"qt-metric-big-value\">\n {bucket.error ?? fmt(bucket.value)}\n </span>\n <span className=\"qt-metric-big-sub\">\n {bucket.count.toLocaleString()} rows\n </span>\n </div>\n );\n}\n\n// ---- 1 group-by: ranked bars ----------------------------------------------\n\nfunction BarList({\n buckets,\n fmt,\n clause,\n theme,\n}: {\n buckets: AggregationBucket[];\n fmt: (v: MetricValue) => ReactNode;\n clause: AggregationClause;\n theme: MetricTheme | undefined;\n}) {\n const colors = createMetricColorResolver(theme),\n options = clause.display?.list;\n const showBars =\n options?.showBars !== false &&\n !buckets.some((b) => typeof b.value === \"number\" && b.value < 0);\n const axis = metricScale(\n buckets\n .filter((b) => !b.error && typeof b.value === \"number\")\n .map((b) => b.value as number),\n clause.display?.xScale,\n true,\n );\n return (\n <div className=\"qt-metric-bars\">\n {buckets.map((b, i) => {\n const pct =\n typeof b.value === \"number\" && !b.error && axis.accepts(b.value)\n ? Math.max(0, Math.min(1, axis.fraction(b.value))) * 100\n : 0;\n return (\n <div\n className=\"qt-metric-bar-row\"\n style={{\n gridTemplateColumns: `minmax(3.375rem, 38%) ${showBars ? \"1fr \" : \"\"}${options?.showValues !== false ? \"auto\" : \"\"}`,\n }}\n key={`${keyText(b.keys[0])}-${i}`}\n >\n <span className=\"qt-metric-bar-label\" title={keyText(b.keys[0])}>\n {options?.useGroupColors && (\n <span\n className=\"qt-metric-swatch\"\n style={{\n background: colors.color(\n clause.groupBy[0] ?? \"\",\n b.keys[0] ?? null,\n ),\n marginInlineEnd: \".35rem\",\n }}\n />\n )}\n {b.keys.map(keyText).join(\" / \")}\n </span>\n {showBars && (\n <span className=\"qt-metric-bar-track\">\n <span\n className=\"qt-metric-bar-fill\"\n style={{\n width: `${pct}%`,\n ...(options?.useGroupColors\n ? {\n background: colors.color(\n clause.groupBy[0] ?? \"\",\n b.keys[0] ?? null,\n ),\n }\n : {}),\n }}\n />\n </span>\n )}\n {options?.showValues !== false && (\n <span className=\"qt-metric-bar-value\">\n {b.error ?? fmt(b.value)}\n </span>\n )}\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 clause,\n}: {\n buckets: AggregationBucket[];\n fmt: (v: MetricValue) => ReactNode;\n rowLabel: string;\n colLabel: string;\n clause: AggregationClause;\n}) {\n const rowAxis = clause.display?.pivot?.swap ? 1 : 0,\n colAxis = 1 - rowAxis;\n if (rowAxis === 1) [rowLabel, colLabel] = [colLabel, rowLabel];\n const rowKeys = distinctKeys(buckets, rowAxis);\n const colKeys = distinctKeys(buckets, colAxis);\n const sortKeys = (values: MetricValue[], dir: \"asc\" | \"desc\" | undefined) => {\n if (dir)\n values.sort(\n (a, b) =>\n (typeof a === \"number\" && typeof b === \"number\"\n ? a - b\n : keyText(a).localeCompare(keyText(b))) * (dir === \"asc\" ? 1 : -1),\n );\n };\n sortKeys(rowKeys, clause.display?.pivot?.rowDir);\n sortKeys(colKeys, clause.display?.pivot?.columnDir);\n const cell = new Map<string, AggregationBucket>();\n for (const b of buckets)\n cell.set(\n metricTupleKey([b.keys[rowAxis] ?? null, b.keys[colAxis] ?? null]),\n b,\n );\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={typedMetricKey(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={typedMetricKey(r)}>\n <th className=\"qt-metric-pivot-row\">{keyNode(r)}</th>\n {colKeys.map((c) => {\n const v = cell.get(metricTupleKey([r, c]));\n return (\n <td key={typedMetricKey(c)} className=\"qt-metric-pivot-cell\">\n {v === undefined ? (\n <span className=\"qt-muted\">·</span>\n ) : (\n (v.error ?? fmt(v.value))\n )}\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: MetricValue) => 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\">\n {b.error ?? fmt(b.value)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ---- helpers --------------------------------------------------------------\n\nfunction metricTitle<Row>(\n clause: AggregationClause,\n measure: FieldDef<Row> | undefined,\n): string {\n if (clause.label) return clause.label;\n if (clause.expression) return clause.expression;\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([\n \"duration_ms\",\n \"byte_size\",\n]);\n\nfunction formatMetricValue<Row>(\n value: MetricValue,\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 =\n 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 | boolean,\n): ReactNode | null {\n try {\n const node = resolveRenderer(\n measure,\n renderers,\n )({\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, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\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.\nexport function 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 distinctKeys(\n buckets: AggregationBucket[],\n axis: number,\n): MetricValue[] {\n const seen = new Set<string>();\n const out: MetricValue[] = [];\n for (const b of buckets) {\n const k = b.keys[axis] ?? null;\n const t = typedMetricKey(k);\n if (!seen.has(t)) {\n seen.add(t);\n out.push(k);\n }\n }\n return out;\n}\n\nfunction keyText(k: MetricValue | undefined): string {\n return k == null ? NULL_KEY : String(k);\n}\n\nfunction keyNode(k: MetricValue | undefined): ReactNode {\n return k == null ? <span className=\"qt-muted\">{NULL_KEY}</span> : String(k);\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type ReactNode,\n type SVGProps,\n} from \"react\";\nimport {\n createMetricColorResolver,\n metricTupleKey,\n typedMetricKey,\n type MetricClassNames,\n type MetricTheme,\n} from \"./metricColors\";\nimport { formatMetricOutput } from \"./metricFormat\";\nimport {\n chronologicalBuckets,\n finiteMetricNumber,\n metricScale,\n metricGroupLabel,\n metricPieSlices,\n} from \"./metricChartHelpers\";\nimport type {\n MetricBucket,\n MetricRenderResult,\n MetricValue,\n MetricValueFormat,\n RenderingClause,\n} from \"./metricTypes\";\n\ninterface ChartProps {\n clause: RenderingClause;\n buckets: MetricBucket[];\n result?: MetricRenderResult | undefined;\n theme?: MetricTheme | undefined;\n locale?: string | undefined;\n classNames?: MetricClassNames | undefined;\n onInspect?: ((bucket: MetricBucket) => void) | undefined;\n}\nfunction usePlotSize() {\n const ref = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState({ width: 400, height: 220 });\n useEffect(() => {\n const element = ref.current;\n if (!element || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const rect = entries[0]?.contentRect;\n if (rect && rect.width > 0 && rect.height > 0)\n setSize({\n width: Math.max(160, rect.width),\n height: Math.max(100, rect.height),\n });\n });\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n return { ref, ...size };\n}\nexport function MetricChart({\n clause,\n buckets,\n result,\n theme,\n locale,\n classNames,\n onInspect,\n}: ChartProps): ReactNode {\n const { ref, width: W, height: H } = usePlotSize(),\n tooltipId = useId(),\n clipId = useId(),\n [tooltip, setTooltip] = useState<string | null>(null);\n const display = clause.display ?? { kind: \"auto\" },\n kind = display.kind,\n colors = createMetricColorResolver(theme);\n const fmt = (v: MetricValue | undefined, f: MetricValueFormat | undefined) =>\n formatMetricOutput(v, f, locale).text;\n const tickFmt = (v: number, format: MetricValueFormat | undefined) =>\n format\n ? fmt(v, format)\n : v.toLocaleString(locale, { maximumSignificantDigits: 8 });\n const percent = (ratio: number) =>\n formatMetricOutput(\n ratio,\n {\n kind: \"percent\",\n decimals: display.format?.decimals ?? 1,\n },\n locale,\n ).text;\n const shade = (b: MetricBucket) =>\n b.keys.length\n ? colors.color(clause.groupBy[0] ?? \"\", b.keys[0] ?? null)\n : colors.token(\"accent\");\n const detail = (b: MetricBucket) =>\n `${metricGroupLabel(b)}\\n${b.error ?? fmt(b.value, kind === \"scatter\" ? display.xFormat : display.format)}${kind === \"scatter\" ? ` / ${b.yError ?? fmt(b.y, display.yFormat)}` : \"\"}\\n${b.count.toLocaleString(locale)} rows`;\n const interaction = (\n b: MetricBucket,\n label = detail(b),\n inspectable = true,\n ): SVGProps<SVGGElement> => ({\n clipPath: [\"pie\", \"donut\"].includes(kind) ? undefined : `url(#${clipId})`,\n tabIndex: 0,\n role: onInspect && inspectable ? \"button\" : \"img\",\n \"aria-label\": label,\n \"aria-describedby\": tooltip === label ? tooltipId : undefined,\n className: `qt-metric-mark ${classNames?.mark ?? \"\"}`,\n onMouseEnter: () => setTooltip(label),\n onMouseLeave: () => setTooltip(null),\n onFocus: () => setTooltip(label),\n onBlur: () => setTooltip(null),\n onClick: () => {\n if (inspectable) onInspect?.(b);\n },\n onKeyDown: (e) => {\n if (e.key === \"Escape\" && tooltip) {\n e.preventDefault();\n e.stopPropagation();\n setTooltip(null);\n }\n if (onInspect && inspectable && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onInspect(b);\n }\n },\n });\n const left = Math.min(78, W * 0.24),\n right = W - 32,\n top = 12,\n bottom = H - 42,\n plotW = right - left,\n plotH = bottom - top;\n const text = (\n x: number,\n y: number,\n label: string,\n anchor: \"start\" | \"middle\" | \"end\" = \"middle\",\n ) => (\n <text\n x={x}\n y={y}\n textAnchor={anchor}\n className={`qt-metric-axis ${classNames?.axis ?? \"\"}`}\n >\n {label}\n </text>\n );\n const grid = (x1: number, y1: number, x2: number, y2: number) => (\n <line\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n className={`qt-metric-grid ${classNames?.grid ?? \"\"}`}\n />\n );\n let marks: ReactNode = null,\n axes: ReactNode = null,\n note = \"\",\n disclosure = \"\",\n problem: string | undefined;\n const scaleNotes: string[] = [];\n const scale = (\n values: number[],\n options: typeof display.xScale,\n zero = false,\n ) => {\n const axis = metricScale(values, options, zero);\n if (axis.error) problem = axis.error;\n if (axis.omitted)\n scaleNotes.push(\n `${axis.omitted} nonpositive values omitted from logarithmic axis.`,\n );\n return axis;\n };\n let legend: Array<{ key: string; label: string; color: string }> = Array.from(\n new Map(\n buckets.map((b) => [\n typedMetricKey(b.keys[0]),\n {\n key: typedMetricKey(b.keys[0]),\n label: String(b.keys[0] ?? \"NULL\"),\n color: shade(b),\n },\n ]),\n ).values(),\n );\n if (kind === \"pie\" || kind === \"donut\") {\n const pie = metricPieSlices(\n clause,\n buckets,\n result?.groupCount,\n result?.other,\n );\n problem =\n result?.coverage === \"partial\"\n ? \"Pie requires exact coverage of the scoped rows.\"\n : pie.error;\n const cx = W / 2,\n cy = H / 2,\n r = Math.max(10, Math.min(W, H) / 2 - 15),\n inner = kind === \"donut\" ? r * 0.58 : 0;\n let angle = -Math.PI / 2;\n const point = (a: number, radius: number) =>\n `${cx + Math.cos(a) * radius} ${cy + Math.sin(a) * radius}`;\n marks = pie.slices.map((s, i) => {\n const start = angle;\n angle += (s.value / pie.total) * Math.PI * 2;\n const end = angle,\n large = end - start > Math.PI ? 1 : 0,\n color = s.other ? colors.token(\"other\") : shade(s.bucket),\n label = `${s.other ? \"Other (combined remainder)\" : metricGroupLabel(s.bucket)}: ${fmt(s.value, display.format)} (${percent(s.value / pie.total)} of ${fmt(pie.total, display.format)})`;\n return (\n <g key={i} {...interaction(s.bucket, label, !s.other)}>\n {s.value === pie.total ? (\n <circle\n cx={cx}\n cy={cy}\n r={inner ? (r + inner) / 2 : r}\n fill={inner ? \"none\" : color}\n stroke={inner ? color : \"none\"}\n strokeWidth={r - inner}\n />\n ) : (\n <path\n fill={color}\n d={\n inner\n ? `M ${point(start, r)} A ${r} ${r} 0 ${large} 1 ${point(end, r)} L ${point(end, inner)} A ${inner} ${inner} 0 ${large} 0 ${point(start, inner)} Z`\n : `M ${cx} ${cy} L ${point(start, r)} A ${r} ${r} 0 ${large} 1 ${point(end, r)} Z`\n }\n />\n )}\n </g>\n );\n });\n legend = pie.slices.map((s, i) => ({\n key: String(i),\n label: `${s.other ? \"Other (remainder)\" : metricGroupLabel(s.bucket)} · ${fmt(s.value, display.format)} · ${percent(s.value / pie.total)}`,\n color: s.other ? colors.token(\"other\") : shade(s.bucket),\n }));\n note = `Exact additive denominator: ${fmt(pie.total, display.format)}. Other combines remaining groups; Hover a slice for its value.`;\n } else if (kind === \"box\") {\n const summaries = buckets.flatMap((b) =>\n !b.error && b.distribution?.kind === \"box\" && b.distribution.summary\n ? [b.distribution.summary]\n : [],\n ),\n axis = scale(\n summaries.flatMap((s) => [s.min, s.max]),\n display.xScale,\n ),\n x = (v: number) => left + axis.fraction(v) * plotW;\n const visible = buckets.slice(0, Math.max(1, Math.floor(plotH / 22))),\n step = plotH / Math.max(1, visible.length);\n axes = axis.ticks.map((v, i) => (\n <g key={i}>\n {grid(x(v), top, x(v), bottom)}\n {text(x(v), bottom + 18, tickFmt(v, display.format))}\n </g>\n ));\n marks = visible.map((b, i) => {\n const s = b.distribution?.kind === \"box\" ? b.distribution.summary : null,\n y = top + step * (i + 0.5),\n color = shade(b);\n const label = s\n ? `${metricGroupLabel(b)}\\nMin ${fmt(s.min, display.format)} · Q1 ${fmt(s.q1, display.format)} · Median ${fmt(s.median, display.format)} · Q3 ${fmt(s.q3, display.format)} · Max ${fmt(s.max, display.format)} · Mean ${fmt(s.mean, display.format)}\\nWhiskers ${fmt(s.low, display.format)} – ${fmt(s.high, display.format)}\\n${s.n} samples · ${b.nullCount ?? 0} NULL · ${s.outlierCount} outliers (${s.outliers.length} markers returned)`\n : detail(b);\n return (\n <g key={i}>\n {text(left - 8, y + 4, metricGroupLabel(b), \"end\")}\n {!s || b.error || !axis.accepts(s.min) ? (\n text(\n (left + right) / 2,\n y + 4,\n b.error ? \"Error\" : s ? \"Nonpositive samples\" : \"No samples\",\n )\n ) : (\n <g {...interaction(b, label)}>\n <line\n x1={x(s.low)}\n x2={x(s.high)}\n y1={y}\n y2={y}\n stroke={color}\n strokeWidth={2}\n />\n {[s.low, s.high].map((v, j) => (\n <line\n key={j}\n x1={x(v)}\n x2={x(v)}\n y1={y - 6}\n y2={y + 6}\n stroke={color}\n />\n ))}\n <rect\n x={x(s.q1)}\n y={y - 8}\n width={Math.max(1, x(s.q3) - x(s.q1))}\n height={16}\n fill={color}\n fillOpacity={0.25}\n stroke={color}\n />\n <line\n x1={x(s.median)}\n x2={x(s.median)}\n y1={y - 8}\n y2={y + 8}\n stroke={color}\n strokeWidth={2}\n />\n {display.boxMean !== false && (\n <circle\n cx={x(s.mean)}\n cy={y}\n r={3}\n fill={colors.token(\"surface\")}\n stroke={color}\n />\n )}\n <rect\n x={left}\n y={y - 11}\n width={plotW}\n height={22}\n fill=\"transparent\"\n />\n {s.outliers.map((v, j) => (\n <circle key={j} cx={x(v)} cy={y} r={3} fill={color} />\n ))}\n </g>\n )}\n </g>\n );\n });\n if (visible.length < buckets.length)\n disclosure = `${visible.length} of ${buckets.length} returned groups drawn. Additional groups are not drawn.`;\n const missing = buckets.filter(\n (b) =>\n b.error || b.distribution?.kind !== \"box\" || !b.distribution.summary,\n ).length;\n const omittedOutliers = summaries.reduce(\n (n, s) => n + s.outlierCount - s.outliers.length,\n 0,\n );\n if (missing)\n disclosure += ` ${missing} groups have no summary or an error.`;\n if (omittedOutliers)\n disclosure += ` ${omittedOutliers} outlier markers omitted.`;\n note = `${visible.length} of ${buckets.length} groups drawn. Scale includes all returned summaries. Hover a box for its summary.`;\n } else if (kind === \"histogram\") {\n const valid = buckets.filter(\n (b) =>\n !b.error &&\n b.distribution?.kind === \"histogram\" &&\n b.distribution.n > 0,\n ),\n series = valid.slice(0, 6),\n first = series[0]?.distribution,\n edges = first?.kind === \"histogram\" ? first.edges : [],\n bins = edges.length - 1;\n if (clause.groupBy.length > 1)\n problem = \"Histogram comparisons support at most one grouping key.\";\n if (\n valid.some(\n (b) =>\n b.distribution?.kind === \"histogram\" &&\n (b.distribution.edges.length !== edges.length ||\n b.distribution.edges.some((v, i) => v !== edges[i]) ||\n b.distribution.counts.length !== bins ||\n b.distribution.counts.some((n) => !Number.isInteger(n) || n < 0) ||\n b.distribution.counts.reduce((a, n) => a + n, 0) !==\n b.distribution.n),\n )\n )\n problem =\n \"Histogram results must use shared edges and conserve sample counts.\";\n if (\n edges.some(\n (v, i) =>\n !Number.isFinite(v) ||\n (i > 0 && (v < edges[i - 1]! || (bins > 1 && v === edges[i - 1]))),\n )\n )\n problem = \"Histogram edges must be finite and strictly increasing.\";\n if (bins < 1) problem = \"No numeric samples to summarize.\";\n const counts = series.flatMap((b) =>\n b.distribution?.kind === \"histogram\" ? b.distribution.counts : [],\n );\n const ya = scale(counts, display.yScale, true),\n xa = scale(edges, display.xScale);\n const y = (v: number) => bottom - ya.fraction(v) * plotH;\n axes = (\n <>\n {ya.ticks.map((v, i) => (\n <g key={i}>\n {grid(left, y(v), right, y(v))}\n {text(left - 7, y(v) + 4, v.toLocaleString(locale), \"end\")}\n </g>\n ))}\n {xa.ticks.map((v, i) => (\n <g key={i}>\n {text(\n left + xa.fraction(v) * plotW,\n bottom + 18,\n tickFmt(v, display.xFormat),\n )}\n </g>\n ))}\n </>\n );\n marks = series.flatMap((b, j) =>\n b.distribution?.kind === \"histogram\"\n ? b.distribution.counts.map((n, i) => {\n if (\n !ya.accepts(n) ||\n !xa.accepts(edges[i]!) ||\n !xa.accepts(edges[i + 1]!)\n )\n return null;\n const pointInterval = edges[i] === edges[i + 1];\n const center = left + xa.fraction(edges[i]!) * plotW;\n const pointWidth = Math.min(64, plotW / 3);\n const binLeft = pointInterval ? center - pointWidth / 2 : center,\n binRight = pointInterval\n ? center + pointWidth / 2\n : left + xa.fraction(edges[i + 1]!) * plotW,\n binWidth = Math.max(1, binRight - binLeft),\n x = binLeft + (j * binWidth) / series.length,\n w = binWidth / series.length;\n const label = `${metricGroupLabel(b)}\\n${fmt(edges[i], display.xFormat)} ≤ value ${i === bins - 1 ? \"≤\" : \"<\"} ${fmt(edges[i + 1], display.xFormat)}\\n${n} rows · ${b.distribution?.kind === \"histogram\" ? b.distribution.n : 0} numeric samples · ${b.nullCount ?? 0} NULL`;\n return (\n <g key={`${j}-${i}`} {...interaction(b, label)}>\n <rect\n x={x}\n y={y(n)}\n width={Math.max(0.5, w - 1)}\n height={Math.max(0, y(ya.baseline) - y(n))}\n fill={shade(b)}\n />\n <rect\n x={x}\n y={Math.min(y(n), bottom - 6)}\n width={w}\n height={Math.max(6, bottom - y(n))}\n fill=\"transparent\"\n />\n </g>\n );\n })\n : [],\n );\n legend = series.map((b, i) => ({\n key: String(i),\n label: metricGroupLabel(b),\n color: shade(b),\n }));\n if (series.length < buckets.length)\n disclosure = `${series.length} of ${buckets.length} returned groups drawn; ${buckets.length - valid.length} empty/error groups. Additional bins are not drawn.`;\n note = `${series.length} of ${result?.groupCount ?? buckets.length} groups drawn; Hover a bin for its count. Shared edges; final upper bound included. Frequencies are row counts.`;\n } else if (kind === \"scatter\") {\n const points = buckets.filter(\n (b) =>\n !b.error &&\n !b.yError &&\n finiteMetricNumber(b.value) &&\n finiteMetricNumber(b.y),\n );\n const xa = scale(\n points.map((b) => b.value as number),\n display.xScale,\n ),\n ya = scale(\n points.map((b) => b.y as number),\n display.yScale,\n ),\n x = (v: number) => left + xa.fraction(v) * plotW,\n y = (v: number) => bottom - ya.fraction(v) * plotH;\n axes = (\n <>\n {xa.ticks.map((v, i) => (\n <g key={`x${i}`}>\n {grid(x(v), top, x(v), bottom)}\n {text(x(v), bottom + 18, tickFmt(v, display.xFormat))}\n </g>\n ))}\n {ya.ticks.map((v, i) => (\n <g key={`y${i}`}>\n {grid(left, y(v), right, y(v))}\n {text(left - 7, y(v) + 4, tickFmt(v, display.yFormat), \"end\")}\n </g>\n ))}\n </>\n );\n marks = points\n .filter((b) => xa.accepts(b.value as number) && ya.accepts(b.y as number))\n .map((b, i) => (\n <g key={i} {...interaction(b)}>\n <circle\n cx={x(b.value as number)}\n cy={y(b.y as number)}\n r={4}\n fill={shade(b)}\n />\n <circle\n cx={x(b.value as number)}\n cy={y(b.y as number)}\n r={12}\n fill=\"transparent\"\n />\n </g>\n ));\n if (points.length < buckets.length)\n disclosure = `${points.length} paired points; ${buckets.length - points.length} missing/error pairs.`;\n note = `${points.length} paired points; ${buckets.length - points.length} missing/error pairs. Coordinates use raw paired values.`;\n } else {\n if (buckets.some((b) => b.value !== null && !finiteMetricNumber(b.value)))\n problem = \"This chart requires finite numeric values.\";\n const horizontal = kind === \"bar-horizontal\",\n axis = scale(\n buckets.flatMap((b) =>\n !b.error && finiteMetricNumber(b.value) ? [b.value] : [],\n ),\n horizontal ? display.xScale : display.yScale,\n true,\n );\n const x = (v: number) => left + axis.fraction(v) * plotW,\n y = (v: number) => bottom - axis.fraction(v) * plotH;\n if (kind === \"line\") {\n try {\n const ordered = chronologicalBuckets(buckets),\n timeAxis = scale(\n ordered.map((p) => p.time),\n display.xScale,\n ),\n tx = (v: number) => left + timeAxis.fraction(v) * plotW;\n const series = new Map<string, typeof ordered>();\n for (const point of ordered) {\n const key = metricTupleKey(point.bucket.keys.slice(1));\n const entries = series.get(key) ?? [];\n entries.push(point);\n series.set(key, entries);\n }\n const times = [...new Set(ordered.map((p) => p.time))];\n const paths = [...series.entries()].map(([key, points]) => {\n let open = false,\n path = \"\";\n const byTime = new Map(points.map((p) => [p.time, p.bucket]));\n for (const time of times) {\n const bucket = byTime.get(time);\n if (\n !bucket ||\n bucket.error ||\n !finiteMetricNumber(bucket.value) ||\n !axis.accepts(bucket.value) ||\n !timeAxis.accepts(time)\n ) {\n open = false;\n continue;\n }\n path += `${open ? \"L\" : \"M\"}${tx(time)},${y(bucket.value)} `;\n open = true;\n }\n const first = points[0]!.bucket;\n const color =\n clause.groupBy.length > 1\n ? colors.color(clause.groupBy[1]!, first.keys[1] ?? null)\n : colors.token(\"accent\");\n return {\n key,\n path,\n color,\n label: metricGroupLabel({ ...first, keys: first.keys.slice(1) }),\n };\n });\n marks = (\n <>\n {paths.map((series) => (\n <path\n key={series.key}\n clipPath={`url(#${clipId})`}\n d={series.path}\n fill=\"none\"\n stroke={series.color}\n strokeWidth={2}\n />\n ))}\n {ordered.map(({ bucket: b, time }, i) =>\n !b.error &&\n finiteMetricNumber(b.value) &&\n axis.accepts(b.value) &&\n timeAxis.accepts(time) ? (\n <g key={i} {...interaction(b)}>\n <circle\n cx={tx(time)}\n cy={y(b.value)}\n r={4}\n fill={\n clause.groupBy.length > 1\n ? colors.color(clause.groupBy[1]!, b.keys[1] ?? null)\n : colors.token(\"accent\")\n }\n />\n <circle\n cx={tx(time)}\n cy={y(b.value)}\n r={12}\n fill=\"transparent\"\n />\n </g>\n ) : null,\n )}\n {ordered\n .filter(\n (_, i) =>\n i % Math.max(1, Math.ceil(ordered.length / 4)) === 0 ||\n i === ordered.length - 1,\n )\n .filter(({ time }) => timeAxis.accepts(time))\n .map(({ bucket: b, time }, i) => (\n <g key={i}>{text(tx(time), bottom + 18, String(b.keys[0]))}</g>\n ))}\n </>\n );\n const missing = buckets.filter(\n (b) => b.error || !finiteMetricNumber(b.value),\n ).length;\n if (missing)\n disclosure = `${missing} missing/error points; lines break at gaps.`;\n note =\n \"Chronological spacing; NULL/error values break the line. All returned points are drawn.\";\n legend =\n clause.groupBy.length > 1\n ? paths.map((s) => ({ key: s.key, label: s.label, color: s.color }))\n : [];\n } catch {\n problem =\n \"Line charts require strict ISO dates/timestamps or numeric group coordinates.\";\n }\n } else {\n const visible = horizontal\n ? buckets.slice(0, Math.max(1, Math.floor(plotH / 20)))\n : buckets,\n step = (horizontal ? plotH : plotW) / Math.max(1, visible.length);\n marks = visible.map((b, i) => {\n const center = (horizontal ? top : left) + step * (i + 0.5),\n valid =\n !b.error && finiteMetricNumber(b.value) && axis.accepts(b.value),\n value = valid ? (b.value as number) : 0;\n return (\n <g key={i}>\n {(horizontal || step > 42 || i % Math.ceil(42 / step) === 0) &&\n text(\n horizontal ? left - 7 : center,\n horizontal ? center + 4 : bottom + 18,\n metricGroupLabel(b),\n horizontal ? \"end\" : \"middle\",\n )}\n {valid ? (\n <g {...interaction(b)}>\n <rect\n x={\n horizontal\n ? Math.min(x(axis.baseline), x(value))\n : center - step * 0.32\n }\n y={\n horizontal\n ? center - step * 0.3\n : Math.min(y(axis.baseline), y(value))\n }\n width={\n horizontal\n ? Math.max(1, Math.abs(x(value) - x(axis.baseline)))\n : step * 0.64\n }\n height={\n horizontal\n ? step * 0.6\n : Math.max(1, Math.abs(y(value) - y(axis.baseline)))\n }\n fill={shade(b)}\n />\n </g>\n ) : horizontal ? (\n text((left + right) / 2, center + 4, b.error ? \"Error\" : \"—\")\n ) : null}\n </g>\n );\n });\n if (visible.length < buckets.length)\n disclosure = `${visible.length} of ${buckets.length} returned groups drawn. Additional groups are not drawn.`;\n const missing = buckets.filter(\n (b) => b.error || !finiteMetricNumber(b.value),\n ).length;\n if (missing) disclosure += ` ${missing} missing/error values.`;\n note = `${axis.accepts(0) ? \"Signed values use a zero baseline.\" : \"Logarithmic values use the positive domain minimum as baseline.\"} ${visible.length} of ${result?.groupCount ?? buckets.length} groups drawn; Hover a mark for its value.`;\n }\n axes = axis.ticks.map((v, i) => (\n <g key={i}>\n {horizontal\n ? grid(x(v), top, x(v), bottom)\n : grid(left, y(v), right, y(v))}\n {horizontal\n ? text(x(v), bottom + 18, fmt(v, display.format))\n : text(left - 7, y(v) + 4, tickFmt(v, display.format), \"end\")}\n </g>\n ));\n axes = (\n <>\n {axes}\n {horizontal ? (\n <line\n x1={x(axis.baseline)}\n x2={x(axis.baseline)}\n y1={top}\n y2={bottom}\n stroke={colors.token(\"muted\")}\n />\n ) : (\n <line\n x1={left}\n x2={right}\n y1={y(axis.baseline)}\n y2={y(axis.baseline)}\n stroke={colors.token(\"muted\")}\n />\n )}\n </>\n );\n }\n if (\n kind !== \"scatter\" &&\n [\"date\", \"time\", \"datetime\"].includes(display.format?.kind ?? \"\")\n )\n problem =\n \"Calendar outputs work in values, tables or lists. Use duration formatting for elapsed quantities.\";\n const position =\n display.legendPosition ??\n ([\"pie\", \"donut\", \"scatter\", \"histogram\"].includes(kind)\n ? \"right\"\n : \"none\");\n return (\n <>\n <div\n className={`qt-metric-chart-layout qt-metric-legend-${position}`}\n style={\n kind === \"bar-horizontal\" || kind === \"box\"\n ? {\n minHeight:\n Math.min(8, buckets.length) * (kind === \"box\" ? 22 : 20) + 54,\n }\n : undefined\n }\n >\n <div ref={ref} className={`qt-metric-plot ${classNames?.plot ?? \"\"}`}>\n {problem ? (\n <p className=\"qt-metric-message\" role=\"status\">\n {problem}\n </p>\n ) : (\n <svg\n viewBox={`0 0 ${W} ${H}`}\n aria-label={clause.label ?? \"Metric chart\"}\n role=\"group\"\n >\n <title>{clause.label ?? \"Metric chart\"}</title>\n <defs>\n <clipPath id={clipId}>\n <rect x={left} y={top} width={plotW} height={plotH} />\n </clipPath>\n </defs>\n {axes}\n {marks}\n {![\"pie\", \"donut\"].includes(kind) && (\n <>\n {text(\n (left + right) / 2,\n H - 5,\n display.xLabel ??\n (kind === \"scatter\"\n ? \"X value\"\n : kind === \"box\" || kind === \"histogram\"\n ? (display.valueLabel ?? \"Value\")\n : horizontalLabel(kind, clause)),\n )}\n {display.yLabel && (\n <text\n transform={`translate(12 ${(top + bottom) / 2}) rotate(-90)`}\n textAnchor=\"middle\"\n className=\"qt-metric-axis\"\n >\n {display.yLabel}\n </text>\n )}\n </>\n )}\n </svg>\n )}\n </div>\n {position !== \"none\" && legend.length > 0 && (\n <ul\n className={`qt-metric-legend ${classNames?.legend ?? \"\"}`}\n aria-label=\"Legend\"\n >\n {legend.map((e) => (\n <li key={e.key}>\n <span\n className=\"qt-metric-swatch\"\n style={{ background: e.color }}\n />\n <span>{e.label}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n {tooltip && (\n <div id={tooltipId} role=\"tooltip\" className=\"qt-metric-tooltip\">\n {tooltip}\n </div>\n )}\n {!problem && scaleNotes.length > 0 && (\n <p className=\"qt-metric-note\" role=\"status\">\n {[...new Set(scaleNotes)].join(\" \")}\n </p>\n )}\n {!problem && disclosure && (\n <p className=\"qt-metric-note\" role=\"status\">\n {disclosure.trim()}\n </p>\n )}\n <p className=\"qt-metric-note qt-sr-only\">{note}</p>\n </>\n );\n}\nfunction horizontalLabel(kind: string, clause: RenderingClause): string {\n return kind === \"bar-horizontal\"\n ? (clause.display?.valueLabel ?? \"Value\")\n : clause.groupBy.join(\" / \");\n}\n","import type { CSSProperties } from \"react\";\nimport type { MetricValue } from \"./metricTypes\";\nexport type MetricToken =\n | \"accent\"\n | \"text\"\n | \"muted\"\n | \"grid\"\n | \"surface\"\n | \"other\"\n | \"null\"\n | \"error\";\nexport interface MetricTheme {\n layers?: ReadonlyArray<{ id: string; colors: ReadonlyArray<string> }>;\n dimensions?: Readonly<\n Record<\n string,\n {\n layer: string;\n domain?: ReadonlyArray<MetricValue>;\n overrides?: ReadonlyArray<{ value: MetricValue; color: string }>;\n identity?: string;\n }\n >\n >;\n tokens?: Partial<Record<MetricToken, string>>;\n}\nexport interface MetricClassNames {\n root?: string;\n metric?: string;\n title?: string;\n plot?: string;\n axis?: string;\n grid?: string;\n legend?: string;\n mark?: string;\n}\nconst palette = [\n \"#0969da\",\n \"#8250df\",\n \"#1a7f37\",\n \"#bf8700\",\n \"#bc4c00\",\n \"#cf4b8c\",\n];\nexport const typedMetricKey = (value: MetricValue | undefined): string =>\n value == null ? \"null:\" : `${typeof value}:${String(value)}`;\nexport const metricTupleKey = (values: readonly MetricValue[]): string =>\n JSON.stringify(values.map(typedMetricKey));\nfunction hash(value: string): number {\n let n = 2166136261;\n for (let i = 0; i < value.length; i++)\n n = Math.imul(n ^ value.charCodeAt(i), 16777619);\n return n >>> 0;\n}\nfunction validColor(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= 256 &&\n !/[;{}<>\\u0000-\\u001f]/.test(value) &&\n !/url\\s*\\(/i.test(value)\n );\n}\nexport function createMetricColorResolver(theme: MetricTheme = {}) {\n const layers = (theme.layers ?? [])\n .slice(0, 64)\n .map((l) => ({\n id: l.id,\n colors: l.colors.slice(0, 256).filter(validColor),\n }))\n .filter((l) => l.colors.length);\n const token = (name: MetricToken): string =>\n validColor(theme.tokens?.[name])\n ? theme.tokens![name]!\n : `var(--qt-metric-${name}, ${name === \"accent\" ? \"var(--qt-accent, #0969da)\" : name === \"text\" ? \"var(--qt-text, #24292f)\" : name === \"muted\" ? \"var(--qt-muted, #68717d)\" : name === \"surface\" ? \"var(--qt-bg, #fff)\" : name === \"grid\" ? \"var(--qt-border-subtle, #eaeef2)\" : name === \"error\" ? \"#c23934\" : name === \"null\" ? \"#858585\" : \"#8c959f\"})`;\n return {\n token,\n color(field: string, value: MetricValue): string {\n const dim = theme.dimensions?.[field],\n identity = dim?.identity ?? field;\n const override = dim?.overrides\n ?.slice(0, 4096)\n .find(\n (o) =>\n typedMetricKey(o.value) === typedMetricKey(value) &&\n validColor(o.color),\n );\n if (override) return override.color;\n if (value === null) return token(\"null\");\n const colors =\n (\n layers.find((l) => l.id === dim?.layer) ??\n (dim ? undefined : layers[hash(identity) % layers.length])\n )?.colors ?? palette;\n const index =\n dim?.domain\n ?.slice(0, 4096)\n .findIndex((v) => typedMetricKey(v) === typedMetricKey(value)) ?? -1;\n return colors[\n (index >= 0 ? index : hash(`${identity}\\0${typedMetricKey(value)}`)) %\n colors.length\n ]!;\n },\n };\n}\nexport function metricThemeStyle(theme?: MetricTheme): CSSProperties {\n const resolver = createMetricColorResolver(theme);\n const style: Record<string, string> = {};\n for (const name of [\n \"accent\",\n \"text\",\n \"muted\",\n \"grid\",\n \"surface\",\n \"other\",\n \"null\",\n \"error\",\n ] as const)\n if (validColor(theme?.tokens?.[name]))\n style[`--qt-metric-${name}`] = resolver.token(name);\n return style as CSSProperties;\n}\n","import type { MetricValue, MetricValueFormat } from \"./metricTypes\";\nexport interface MetricFormattedValue {\n text: string;\n error?: string;\n raw: MetricValue | undefined;\n}\nconst durationUnits: Record<string, number> = {\n milliseconds: 1,\n seconds: 1000,\n minutes: 60000,\n hours: 3600000,\n days: 86400000,\n};\nconst dateTokens = /\\[[^\\[\\]]*\\]|YYYY|MMMM|MMM|MM|DD|ddd|HH|hh|mm|ss|SSS|A|Z/g;\nconst pad = (n: number | string, width = 2) => String(n).padStart(width, \"0\");\n/** Suppress minus signs only when the formatter actually rounds to zero.\n * This works with older Intl implementations and non-Latin digit locales. */\nfunction numberText(\n value: number,\n locale: string | undefined,\n options: Intl.NumberFormatOptions,\n): string {\n const formatter = new Intl.NumberFormat(locale, options);\n if (\n (value < 0 || Object.is(value, -0)) &&\n formatter.format(Math.abs(value)) === formatter.format(0)\n )\n return formatter.format(0);\n return formatter.format(value);\n}\nfunction zone(format: MetricValueFormat): string | undefined {\n return format.timeZone === \"local\" ? undefined : (format.timeZone ?? \"UTC\");\n}\nexport function validateMetricFormat(\n format: MetricValueFormat,\n): string | undefined {\n if (\n format.decimals !== undefined &&\n (!Number.isInteger(format.decimals) ||\n format.decimals < 0 ||\n format.decimals > 20)\n )\n return \"Decimals must be an integer from 0 to 20.\";\n if (format.kind === \"number\" || format.kind === \"percent\") return;\n const duration = format.kind === \"duration\",\n unit = format.sourceUnit ?? (duration ? \"milliseconds\" : \"iso\");\n if (\n duration\n ? !Object.prototype.hasOwnProperty.call(durationUnits, unit)\n : ![\n \"iso\",\n \"epochSeconds\",\n \"epochMilliseconds\",\n ...(format.kind === \"time\"\n ? [\"secondsOfDay\", \"millisecondsOfDay\"]\n : []),\n ].includes(unit)\n )\n return \"Unsupported source unit for this format.\";\n if (\n !(\n duration\n ? [\"human\", \"long\", \"clock\", \"custom\"]\n : [\"human\", \"iso\", \"custom\"]\n ).includes(format.style ?? \"human\")\n )\n return \"Unsupported label style.\";\n if (!duration)\n try {\n new Intl.DateTimeFormat(undefined, { timeZone: zone(format) });\n } catch {\n return \"Enter a valid IANA timezone or UTC/local.\";\n }\n if (format.style === \"custom\") {\n const pattern = format.pattern ?? \"\";\n if (!pattern.trim() || pattern.length > 160)\n return \"Enter a format pattern of 1–160 characters.\";\n if (duration) {\n const rest = pattern.replace(/\\{(?:d|hh|h|mm|m|ss|s|ms)\\}/g, \"\");\n if (rest === pattern || /[{}]/.test(rest))\n return \"Use duration tokens {d}, {h}, {hh}, {m}, {mm}, {s}, {ss}, {ms}.\";\n } else {\n const tokens = pattern.match(dateTokens) ?? [];\n const rest = pattern.replace(dateTokens, \"\");\n if (!tokens.some((t) => !t.startsWith(\"[\")) || /[A-Za-z\\[\\]]/.test(rest))\n return \"Use supported date/time tokens and [bracketed literals].\";\n }\n }\n}\nfunction numeric(value: MetricValue): number {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (\n typeof value === \"string\" &&\n /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(value.trim())\n ) {\n const n = Number(value);\n if (Number.isFinite(n)) return n;\n }\n throw Error(\"Expected a finite number in the selected source unit.\");\n}\nfunction durationText(\n value: MetricValue,\n format: MetricValueFormat,\n locale?: string,\n): string {\n const ms =\n numeric(value) * durationUnits[format.sourceUnit ?? \"milliseconds\"]!;\n if (!Number.isFinite(ms) || Math.abs(ms) > Number.MAX_SAFE_INTEGER)\n throw Error(\"Duration exceeds safe millisecond precision.\");\n const abs = Math.abs(ms),\n rounded = Math.round(abs),\n sign =\n ms < 0 &&\n (format.style === \"clock\" || format.style === \"custom\"\n ? rounded > 0\n : abs > 0)\n ? \"−\"\n : \"\",\n seconds = Math.floor(rounded / 1000),\n hours = Math.floor(seconds / 3600);\n const h = format.pattern?.includes(\"{d}\") ? hours % 24 : hours;\n // Wrap only when a larger unit is explicitly represented. Otherwise the\n // highest displayed unit carries the full elapsed duration.\n const custom = format.style === \"custom\";\n const minutes = Math.floor(seconds / 60);\n const m = custom\n ? /\\{hh?\\}/.test(format.pattern!)\n ? minutes % 60\n : /\\{d\\}/.test(format.pattern!)\n ? minutes % 1440\n : minutes\n : minutes % 60;\n const s = custom\n ? /\\{mm?\\}/.test(format.pattern!)\n ? seconds % 60\n : /\\{hh?\\}/.test(format.pattern!)\n ? seconds % 3600\n : /\\{d\\}/.test(format.pattern!)\n ? seconds % 86400\n : seconds\n : seconds % 60;\n const millis =\n !custom || /\\{ss?\\}/.test(format.pattern!)\n ? rounded % 1000\n : /\\{mm?\\}/.test(format.pattern!)\n ? rounded % 60000\n : /\\{hh?\\}/.test(format.pattern!)\n ? rounded % 3600000\n : /\\{d\\}/.test(format.pattern!)\n ? rounded % 86400000\n : rounded;\n const parts: Record<string, string | number> = {\n d: Math.floor(seconds / 86400),\n h,\n hh: pad(h),\n m,\n mm: pad(m),\n s,\n ss: pad(s),\n ms: pad(millis, 3),\n };\n if (format.style === \"custom\") {\n const tokens = format.pattern!.match(/\\{(d|hh|h|mm|m|ss|s|ms)\\}/g) ?? [];\n const visible = tokens.some(\n (token) => Number(parts[token.slice(1, -1)]) !== 0,\n );\n return (\n (visible ? sign : \"\") +\n format.pattern!.replace(/\\{(d|hh|h|mm|m|ss|s|ms)\\}/g, (_, key: string) =>\n String(parts[key]),\n )\n );\n }\n if (format.style === \"clock\")\n return `${sign}${pad(hours)}:${parts.mm}:${parts.ss}${rounded % 1000 ? \".\" + parts.ms : \"\"}`;\n const amount = (n: number) =>\n n.toLocaleString(locale, { maximumFractionDigits: 3 });\n const long = format.style === \"long\";\n if (abs < 1000)\n return `${sign}${abs > 0 && abs < 0.001 ? \"<0.001\" : amount(abs)}${long ? (abs === 1 ? \" millisecond\" : \" milliseconds\") : \"ms\"}`;\n if (abs < 60000 && rounded < 60000)\n return `${sign}${amount(rounded / 1000)}${long ? (rounded === 1000 ? \" second\" : \" seconds\") : \"s\"}`;\n const sec = Math.round(abs / 1000),\n values = [\n Math.floor(sec / 86400),\n Math.floor(sec / 3600) % 24,\n Math.floor(sec / 60) % 60,\n sec % 60,\n ];\n return (\n sign +\n values\n .map((v, i) => ({ v, i }))\n .filter((p) => p.v)\n .slice(0, 2)\n .map(({ v, i }) =>\n long\n ? `${v} ${[\"day\", \"hour\", \"minute\", \"second\"][i]}${v === 1 ? \"\" : \"s\"}`\n : `${v}${[\"d\", \"h\", \"m\", \"s\"][i]}`,\n )\n .join(long ? \", \" : \"\")\n );\n}\nfunction validCalendar(year: number, month: number, day: number): boolean {\n const d = new Date(0);\n d.setUTCFullYear(year, month - 1, day);\n return (\n year >= 1 &&\n year <= 9999 &&\n d.getUTCFullYear() === year &&\n d.getUTCMonth() === month - 1 &&\n d.getUTCDate() === day\n );\n}\n/** Strict coordinate parser shared by calendar formatting and chronological charts. */\nexport function metricTimestamp(\n value: MetricValue,\n format: MetricValueFormat = { kind: \"datetime\" },\n): { date: Date; timeZone: string | undefined } {\n const unit = format.sourceUnit ?? \"iso\";\n let ms: number,\n civil = false;\n if (unit === \"epochSeconds\" || unit === \"epochMilliseconds\")\n ms = numeric(value) * (unit === \"epochSeconds\" ? 1000 : 1);\n else if (unit === \"secondsOfDay\" || unit === \"millisecondsOfDay\") {\n ms = numeric(value) * (unit === \"secondsOfDay\" ? 1000 : 1);\n if (format.kind !== \"time\" || ms < 0 || ms >= 86400000)\n throw Error(\"Time of day must be in [0, 24 hours).\");\n civil = true;\n } else {\n if (typeof value !== \"string\")\n throw Error(\n \"Expected ISO text; select Unix units for numeric timestamps.\",\n );\n const date = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value),\n clock = /^(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,3}))?)?$/.exec(value),\n stamp =\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?(Z|[+-]\\d{2}:\\d{2})$/.exec(\n value,\n );\n const calendar = date ?? stamp;\n if (calendar && !validCalendar(+calendar[1]!, +calendar[2]!, +calendar[3]!))\n throw Error(\"Invalid calendar date.\");\n if (date && format.kind !== \"time\") {\n ms = Date.parse(value + \"T00:00:00Z\");\n civil = true;\n } else if (clock && format.kind === \"time\") {\n const h = +clock[1]!,\n m = +clock[2]!,\n s = +(clock[3] ?? 0);\n if (h > 23 || m > 59 || s > 59) throw Error(\"Invalid clock time.\");\n ms =\n ((h * 60 + m) * 60 + s) * 1000 +\n Number((clock[4] ?? \"\").padEnd(3, \"0\"));\n civil = true;\n } else if (stamp) {\n const offset = stamp[8]!;\n if (\n +stamp[4]! > 23 ||\n +stamp[5]! > 59 ||\n +stamp[6]! > 59 ||\n (offset !== \"Z\" && (+offset.slice(1, 3) > 23 || +offset.slice(4) > 59))\n )\n throw Error(\"Invalid timestamp time or offset.\");\n ms = Date.parse(value);\n } else\n throw Error(\n \"Use a strict ISO date/time with an explicit timestamp offset.\",\n );\n }\n const date = new Date(ms);\n if (\n !Number.isFinite(ms) ||\n !Number.isFinite(date.getTime()) ||\n date.getUTCFullYear() < 1 ||\n date.getUTCFullYear() > 9999\n )\n throw Error(\"Calendar output supports years 0001–9999.\");\n const timeZone = civil ? \"UTC\" : zone(format);\n const calendarParts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n era: \"short\",\n }).formatToParts(date);\n const year = Number(calendarParts.find((p) => p.type === \"year\")?.value),\n era = calendarParts.find((p) => p.type === \"era\")?.value;\n if (era !== \"AD\" || year < 1 || year > 9999)\n throw Error(\n \"Calendar output supports years 0001–9999 in the selected timezone.\",\n );\n return { date, timeZone };\n}\nfunction calendarText(\n value: MetricValue,\n format: MetricValueFormat,\n locale?: string,\n): string {\n const { date, timeZone } = metricTimestamp(value, format);\n if (format.style === \"custom\" || format.style === \"iso\") {\n const parts: Record<string, string> = {};\n for (const p of new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }).formatToParts(date))\n parts[p.type] = p.value;\n const offsetDate = new Date(0);\n offsetDate.setUTCFullYear(+parts.year!, +parts.month! - 1, +parts.day!);\n offsetDate.setUTCHours(\n +parts.hour!,\n +parts.minute!,\n +parts.second!,\n date.getUTCMilliseconds(),\n );\n const offset = Math.round((offsetDate.getTime() - date.getTime()) / 60000);\n const names = (options: Intl.DateTimeFormatOptions) =>\n new Intl.DateTimeFormat(\"en-US\", { timeZone, ...options }).format(date);\n const tokens: Record<string, string> = {\n YYYY: pad(parts.year!, 4),\n MM: parts.month!,\n DD: parts.day!,\n HH: parts.hour!,\n hh: pad(+parts.hour! % 12 || 12),\n mm: parts.minute!,\n ss: parts.second!,\n SSS: pad(date.getUTCMilliseconds(), 3),\n MMM: names({ month: \"short\" }),\n MMMM: names({ month: \"long\" }),\n ddd: names({ weekday: \"short\" }),\n A: +parts.hour! < 12 ? \"AM\" : \"PM\",\n Z: `${offset < 0 ? \"-\" : \"+\"}${pad(Math.floor(Math.abs(offset) / 60))}:${pad(Math.abs(offset) % 60)}`,\n };\n const pattern =\n format.style === \"custom\"\n ? format.pattern!\n : format.kind === \"date\"\n ? \"YYYY-MM-DD\"\n : format.kind === \"time\"\n ? \"HH:mm:ss\"\n : \"YYYY-MM-DD HH:mm:ss Z\";\n return pattern.replace(dateTokens, (t) =>\n t.startsWith(\"[\") ? t.slice(1, -1) : tokens[t]!,\n );\n }\n const options: Intl.DateTimeFormatOptions =\n format.kind === \"date\"\n ? { year: \"numeric\", month: \"short\", day: \"numeric\" }\n : format.kind === \"time\"\n ? {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n }\n : {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hourCycle: \"h23\",\n timeZoneName: \"short\",\n };\n return new Intl.DateTimeFormat(locale, { ...options, timeZone }).format(date);\n}\nexport function formatMetricOutput(\n value: MetricValue | undefined,\n format?: MetricValueFormat,\n locale?: string,\n): MetricFormattedValue {\n if (value == null) return { text: \"—\", raw: value };\n try {\n if (typeof value === \"number\" && !Number.isFinite(value))\n throw Error(\"Expected a finite numeric value.\");\n if (!format)\n return {\n text:\n typeof value === \"number\"\n ? numberText(value, locale, { maximumFractionDigits: 6 })\n : String(value),\n raw: value,\n };\n const error = validateMetricFormat(format);\n if (error) throw Error(error);\n const text =\n format.kind === \"duration\"\n ? durationText(value, format, locale)\n : [\"date\", \"time\", \"datetime\"].includes(format.kind)\n ? calendarText(value, format, locale)\n : typeof value === \"number\"\n ? numberText(value, locale, {\n style: format.kind === \"percent\" ? \"percent\" : \"decimal\",\n minimumFractionDigits: format.decimals ?? 0,\n maximumFractionDigits: format.decimals ?? 0,\n })\n : String(value);\n return { text, raw: value };\n } catch (error) {\n return {\n text: \"Invalid format\",\n error: error instanceof Error ? error.message : \"Invalid format\",\n raw: value,\n };\n }\n}\n","import type { MetricBucket, RenderingClause, MetricValue } from \"./metricTypes\";\nimport { metricTimestamp } from \"./metricFormat\";\nexport const metricGroupLabel = (b: MetricBucket): string =>\n b.keys.length\n ? b.keys.map((v) => (v === null ? \"NULL\" : String(v))).join(\" / \")\n : \"All rows\";\nexport const finiteMetricNumber = (v: MetricValue | undefined): v is number =>\n typeof v === \"number\" && Number.isFinite(v);\nexport function metricExtent(\n values: readonly number[],\n zero = false,\n): [number, number] {\n let min = zero ? 0 : Infinity,\n max = zero ? 0 : -Infinity;\n for (const v of values)\n if (Number.isFinite(v)) {\n min = Math.min(min, v);\n max = Math.max(max, v);\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1];\n if (min === max) {\n const pad = Math.abs(min) * 0.05 || 1;\n return zero\n ? [Math.min(0, min), Math.min(Number.MAX_VALUE, max + pad)]\n : [\n Math.max(-Number.MAX_VALUE, min - pad),\n Math.min(Number.MAX_VALUE, max + pad),\n ];\n }\n return [min, max];\n}\nexport function chronologicalBuckets(\n buckets: readonly MetricBucket[],\n): Array<{ bucket: MetricBucket; time: number }> {\n return buckets\n .map((bucket) => ({\n bucket,\n time:\n typeof bucket.keys[0] === \"number\"\n ? bucket.keys[0]\n : metricTimestamp(bucket.keys[0] ?? null).date.getTime(),\n }))\n .map((point) => {\n if (!Number.isFinite(point.time))\n throw Error(\"Line coordinates must be finite.\");\n return point;\n })\n .sort((a, b) => a.time - b.time);\n}\nexport function additiveMetric(clause: RenderingClause): boolean {\n if (!clause.expression) return clause.op === \"count\" || clause.op === \"sum\";\n return /^\\s*(?:COUNT\\(\\s*(?:\\[[^\\]]+\\])?\\s*\\)|SUM\\(\\s*\\[[^\\]]+\\]\\s*\\))\\s*$/i.test(\n clause.expression,\n );\n}\nexport interface MetricPieSlice {\n bucket: MetricBucket;\n value: number;\n other: boolean;\n}\n/** No guessed denominator: incomplete responses need an explicit exact Other. */\nexport function metricPieSlices(\n clause: RenderingClause,\n buckets: readonly MetricBucket[],\n groupCount?: number,\n other?: MetricBucket,\n limit = 8,\n): { slices: MetricPieSlice[]; total: number; error?: string } {\n const fail = (error: string) => ({ slices: [], total: 0, error });\n if (!additiveMetric(clause))\n return fail(\"Pie charts require additive counts or sums.\");\n if (groupCount !== undefined && groupCount > buckets.length && !other)\n return fail(\n \"Pie requires complete group results or an exact Other result.\",\n );\n const all = other ? [...buckets, other] : [...buckets];\n if (all.some((b) => b.error || !finiteMetricNumber(b.value) || b.value < 0))\n return fail(\n \"Pie requires finite, nonnegative values without missing or errored groups.\",\n );\n const total = all.reduce((n, b) => n + (b.value as number), 0);\n if (!Number.isFinite(total) || total <= 0)\n return fail(\"No positive additive values to display.\");\n const head = buckets.slice(0, limit),\n tail = buckets.slice(limit);\n const slices = head.map((bucket) => ({\n bucket,\n value: bucket.value as number,\n other: false,\n }));\n const remainder =\n tail.reduce((n, b) => n + (b.value as number), 0) +\n ((other?.value as number) ?? 0);\n if (tail.length || other)\n slices.push({\n bucket: {\n keys: [\"Other\"],\n value: remainder,\n count: tail.reduce((n, b) => n + b.count, 0) + (other?.count ?? 0),\n },\n value: remainder,\n other: true,\n });\n return { slices, total };\n}\n\n/** Unit-interval coordinate without overflowing for opposite signed finite extremes. */\nexport function metricFraction(\n value: number,\n min: number,\n max: number,\n): number {\n const span = max - min;\n return Number.isFinite(span)\n ? (value - min) / span\n : (value / 2 - min / 2) / (max / 2 - min / 2);\n}\n\n/** A true logarithmic axis: nonpositive values are omitted, never shifted. */\nexport function metricScale(\n values: readonly number[],\n options:\n import(\"@pythia-software/query-table-core\").MetricAxisScale | undefined,\n zero = false,\n) {\n const log = options?.mode === \"log\";\n const accepts = (value: number) =>\n Number.isFinite(value) && (!log || value > 0);\n const valid = values.filter(accepts);\n let [min, max] = metricExtent(valid, zero && !log);\n if (log) {\n if (!valid.length) [min, max] = [1, 10];\n else if (min <= 0) min = Math.min(...valid);\n }\n min = options?.min ?? min;\n max = options?.max ?? max;\n // A single user bound can sit outside the inferred domain.\n if (options?.min !== undefined && options.max === undefined && max <= min)\n max = log\n ? Math.min(Number.MAX_VALUE, min * 10)\n : min + (Math.abs(min) * 0.05 || 1);\n if (options?.max !== undefined && options.min === undefined && min >= max)\n min = log ? max / 10 : max - (Math.abs(max) * 0.05 || 1);\n const error =\n !Number.isFinite(min) ||\n !Number.isFinite(max) ||\n min >= max ||\n (log && min <= 0)\n ? \"Axis bounds must be finite, increasing, and positive for logarithmic scales.\"\n : undefined;\n const fraction = (value: number) => {\n const position = log\n ? metricFraction(Math.log(value), Math.log(min), Math.log(max))\n : metricFraction(value, min, max);\n // Marks beyond the viewport are clipped. Bound distant coordinates to keep\n // valid extreme values and very narrow explicit bounds finite in SVG.\n return Math.max(-1e12, Math.min(1e12, position));\n };\n const ticks = log\n ? [min, Math.exp(Math.log(min) / 2 + Math.log(max) / 2), max]\n : [min, min / 2 + max / 2, max];\n return {\n min,\n max,\n fraction,\n ticks,\n accepts,\n error,\n baseline: log ? min : Math.max(min, Math.min(max, 0)),\n omitted: values.length - valid.length,\n };\n}\n","import { useEffect, useRef, type PointerEvent } from \"react\";\n\n/** Shared pointer lifecycle for authoring geometry. Escape cancels only the drag. */\nexport function useMetricResize() {\n const cleanup = useRef<(() => void) | null>(null);\n useEffect(() => () => cleanup.current?.(), []);\n return {\n stop: () => cleanup.current?.(),\n start: (\n event: PointerEvent<HTMLElement>,\n update: (dx: number, dy: number) => void,\n restore: () => void,\n ) => {\n if (event.button !== 0) return;\n cleanup.current?.();\n event.preventDefault();\n event.stopPropagation();\n const handle = event.currentTarget;\n handle.focus({ preventScroll: true });\n handle.setPointerCapture?.(event.pointerId);\n const { clientX: x, clientY: y, pointerId } = event;\n const previousCursor = document.body.style.cursor;\n const previousSelection = [\"user-select\", \"-webkit-user-select\"].map(\n (name) => ({\n name,\n value: document.body.style.getPropertyValue(name),\n priority: document.body.style.getPropertyPriority(name),\n }),\n );\n document.body.style.cursor = getComputedStyle(handle).cursor;\n previousSelection.forEach(({ name }) =>\n document.body.style.setProperty(name, \"none\"),\n );\n let moved = false;\n const move = (e: globalThis.PointerEvent) => {\n if (e.pointerId !== pointerId) return;\n moved ||= e.clientX !== x || e.clientY !== y;\n if (moved) update(e.clientX - x, e.clientY - y);\n };\n const cancel = () => {\n restore();\n cleanup.current?.();\n };\n const end = (e: globalThis.PointerEvent) => {\n if (e.pointerId === pointerId) {\n if (moved || e.clientX !== x || e.clientY !== y)\n update(e.clientX - x, e.clientY - y);\n cleanup.current?.();\n }\n };\n const cancelled = (e: globalThis.PointerEvent) => {\n if (e.pointerId === pointerId) cancel();\n };\n const key = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n e.preventDefault();\n e.stopImmediatePropagation();\n cancel();\n };\n const blur = () => cancel();\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", end);\n window.addEventListener(\"pointercancel\", cancelled);\n window.addEventListener(\"keydown\", key, true);\n window.addEventListener(\"blur\", blur);\n cleanup.current = () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", end);\n window.removeEventListener(\"pointercancel\", cancelled);\n window.removeEventListener(\"keydown\", key, true);\n window.removeEventListener(\"blur\", blur);\n if (handle.hasPointerCapture?.(pointerId))\n handle.releasePointerCapture(pointerId);\n document.body.style.cursor = previousCursor;\n previousSelection.forEach(({ name, value, priority }) =>\n document.body.style.setProperty(name, value, priority),\n );\n cleanup.current = null;\n };\n },\n };\n}\n","import { useMetricResize } from \"./useMetricResize\";\nimport { useLayoutEffect, useRef, useState, type PointerEvent } from \"react\";\n\nconst DEFAULT_PANES = [240, 390, 250, 460] as const;\nconst MIN_PANES = [180, 300, 200, 280] as const;\n\n/** Workbench geometry is deliberately independent of query and metric state. */\nfunction initialPanes(available: number): number[] {\n return [240, 390, 250, Math.max(280, available - 880)];\n}\nfunction fitPanes(\n previous: number[],\n available: number,\n visible: boolean[],\n): number[] {\n const total = Math.max(\n MIN_PANES.reduce((sum, width, i) => sum + (visible[i] ? width : 0), 0),\n available,\n );\n const shown = previous.map((width, i) => (visible[i] ? width : 0));\n if (Math.abs(shown.reduce((sum, width) => sum + width, 0) - total) < 0.5)\n return shown;\n let low = 0,\n high = Math.max(\n 2,\n (total / shown.reduce((sum, width) => sum + width, 0)) * 2,\n );\n for (let i = 0; i < 40; i++) {\n const scale = (low + high) / 2;\n const sum = previous.reduce(\n (sum, width, index) =>\n sum +\n (visible[index] ? Math.max(MIN_PANES[index] ?? 0, width * scale) : 0),\n 0,\n );\n if (sum > total) high = scale;\n else low = scale;\n }\n return previous.map((width, index) =>\n visible[index] ? Math.max(MIN_PANES[index] ?? 0, width * low) : 0,\n );\n}\n\nexport function useMetricWorkbench(isEditor = true) {\n const header = useRef<HTMLElement | null>(null);\n const root = useRef<HTMLDivElement | null>(null);\n const [preferredWidths, setWidths] = useState<number[]>([...DEFAULT_PANES]);\n const [visiblePanes, setVisiblePanes] = useState([true, true, true, true]);\n const [available, setAvailable] = useState(1340);\n const drag = useMetricResize();\n const initialized = useRef(false);\n const visibleIndices = visiblePanes.flatMap((visible, i) =>\n visible ? [i] : [],\n );\n const widths = fitPanes(preferredWidths, available, visiblePanes);\n useLayoutEffect(() => {\n const element = root.current;\n if (!element || !isEditor) return;\n const fit = () => {\n if (!element.clientWidth) return;\n const space = element.clientWidth - (visibleIndices.length - 1) * 6;\n setAvailable(space);\n if (!initialized.current) {\n initialized.current = true;\n setWidths(initialPanes(space));\n }\n };\n fit();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(fit);\n observer.observe(element);\n return () => observer.disconnect();\n }, [isEditor, visibleIndices.length]);\n const resetPanes = (showAll = false) => {\n drag.stop();\n const containerWidth =\n root.current?.clientWidth ??\n header.current?.closest<HTMLElement>(\"[role=dialog]\")?.clientWidth ??\n available + 18;\n setAvailable(\n containerWidth - ((showAll ? 4 : visibleIndices.length) - 1) * 6,\n );\n setWidths(initialPanes(containerWidth - 18));\n };\n const nextPane = (index: number) => visibleIndices.find((i) => i > index);\n const resize = (index: number, delta: number, initial: number[]) => {\n const next = nextPane(index);\n if (next === undefined) return;\n const left = initial[index]!,\n right = initial[next]!;\n const move = Math.max(\n MIN_PANES[index]! - left,\n Math.min(delta, right - MIN_PANES[next]!),\n );\n setWidths((previous) =>\n previous.map((width, i) =>\n i === index\n ? left + move\n : i === next\n ? right - move\n : visiblePanes[i]\n ? initial[i]!\n : width,\n ),\n );\n };\n const startResize = (event: PointerEvent<HTMLElement>, index: number) => {\n const initial = [...widths],\n original = [...preferredWidths];\n drag.start(\n event,\n (dx) => resize(index, dx, initial),\n () => setWidths(original),\n );\n };\n return {\n root,\n header,\n widths,\n minWidths: MIN_PANES,\n visiblePanes,\n visibleIndices,\n nextPane,\n togglePane: (index: number) => {\n drag.stop();\n setVisiblePanes((previous) =>\n previous.filter(Boolean).length === 1 && previous[index]\n ? previous\n : previous.map((visible, i) => (i === index ? !visible : visible)),\n );\n },\n showPane: (index: number) =>\n setVisiblePanes((previous) =>\n previous[index]\n ? previous\n : previous.map((visible, i) => (i === index ? true : visible)),\n ),\n startResize,\n resetPanes: () => resetPanes(),\n stepResize: (index: number, delta: number) => resize(index, delta, widths),\n reset: () => {\n drag.stop();\n const dialog = header.current?.closest<HTMLElement>(\"[role=dialog]\");\n if (dialog) {\n dialog.style.removeProperty(\"width\");\n dialog.style.removeProperty(\"height\");\n }\n setVisiblePanes([true, true, true, true]);\n resetPanes(true);\n },\n };\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 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 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 <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 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 {\n PresentedFilterValue,\n PresentedValueInput,\n useFilterValuePresentation,\n} 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 { RequestActivity } from \"./RequestActivity\";\nimport { MetricsEditor } from \"./MetricsEditor\";\nimport type { MetricTheme } from \"./metricColors\";\nimport { SelectColumnEditor } from \"./SelectColumnEditor\";\nimport { SortExtractionEditor } from \"./SortExtractionEditor\";\nimport { SetFilterEditor } from \"./SetFilterEditor\";\nimport {\n Fragment,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type {\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 encodeQuery,\n filterValues as filterValuesFor,\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 {\n AdaptiveOverlay,\n ModalSurface,\n useMobileLayout,\n} from \"./AdaptiveOverlay\";\nimport { ReorderList } from \"./ReorderList\";\nimport { Icon } from \"./Icon\";\n\nexport interface QueryBuilderProps<Row> {\n /** Additional diagnostics shown inside request activity. */\n requestActivityDetails?: ReactNode;\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 metricTheme?: MetricTheme;\n metricLocale?: string;\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([], {\n hour: \"numeric\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n\nfunction useFieldHasNull<Row>(\n api: QueryTableApi<Row>,\n fieldName: string | undefined,\n): 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.filterValues, 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>([\n \"!=\",\n \"is_not_null\",\n \"not_matches_regex\",\n]);\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>(\n clause: WhereClause,\n byName: Map<string, FieldDef<Row>>,\n): 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)\n 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 =\n strategy?.source === \"static\"\n ? strategy.options.find(\n (o) => typeof o !== \"string\" && o.value === clause.value,\n )\n : undefined;\n const value =\n clause.value === \"\"\n ? \"''\"\n : typeof option === \"object\"\n ? option.label\n : clause.value;\n return `${field} ${not}${op} ${value}`;\n}\n\nfunction whereTermAsText<Row>(\n term: WhereTerm,\n byName: Map<string, FieldDef<Row>>,\n): string {\n if (isOrGroup(term))\n return `(${term.any.map((c) => predicateAsText(c, byName)).join(\" or \")})`;\n return predicateAsText(term, byName);\n}\n\nfunction orderByAsText<Row>(\n term: OrderByClause,\n byName: Map<string, FieldDef<Row>>,\n): string {\n const field = byName.get(term.field)?.label ?? term.field;\n const expression = term.extract\n ? `regex_extract(${field}, /${term.extract.regex}/)`\n : 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(\n text: string,\n fieldType: string | undefined,\n fallback = 5,\n padding = 0,\n): 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 =\n orderBy.length === 0\n ? \"(default)\"\n : orderBy.map((term) => orderByAsText(term, byName)).join(\", \");\n return `WHERE ${whereText} ORDER BY ${orderText}`;\n}\n\nfunction whereClauseSummaryText<Row>(\n where: WhereTerm[],\n byName: Map<string, FieldDef<Row>>,\n): string {\n return where.length === 0\n ? \"all rows\"\n : where.map((t) => whereTermAsText(t, byName)).join(\" and \");\n}\n\nfunction orderBySummaryText<Row>(\n orderBy: OrderByClause[],\n byName: Map<string, FieldDef<Row>>,\n): string {\n return orderBy.length === 0\n ? \"(default)\"\n : 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 metricTheme,\n metricLocale,\n requestActivityDetails,\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 [showActivity, setShowActivity] = useState(false);\n const activityId = useId();\n const [showAutoRefresh, setShowAutoRefresh] = useState(false);\n const [autoRefreshFrequencyMs, setAutoRefreshFrequencyMs] = useState(\n DEFAULT_AUTO_REFRESH_FREQUENCY_MS,\n );\n const [autoRefreshTurnOffAfterMs, setAutoRefreshTurnOffAfterMs] = useState(\n DEFAULT_AUTO_REFRESH_TURN_OFF_AFTER_MS,\n );\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(\n () => new Map(fields.map((f) => [f.name, f])),\n [fields],\n );\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 =\n 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(\n autoRefreshFrequencyMs,\n autoRefreshTurnOffAfterMs,\n );\n const canSubmitAutoRefresh =\n selectedAutoRefreshPolls >= 1 &&\n 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] =\n useState(false);\n const shareFeedbackTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n useEffect(\n () => () => {\n if (shareFeedbackTimerRef.current)\n 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))\n 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 ||\n rowsChanged ||\n totalChanged ||\n 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 =\n 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(\n wrapperRect.right + popWidth > window.innerWidth - viewportRightInset,\n );\n }\n\n calculateAutoRefreshPosition();\n const t = setTimeout(\n () => window.addEventListener(\"click\", onDocumentClick),\n 0,\n );\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 (\n error &&\n typeof error === \"object\" &&\n \"name\" in error &&\n error.name === \"AbortError\"\n )\n return;\n }\n }\n\n try {\n await navigator.clipboard.writeText(url.toString());\n setShareCopied(true);\n if (shareFeedbackTimerRef.current)\n 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(\n \"qt-qb-saved-star\",\n isSavedQuery\n ? \"qt-qb-saved-star--saved\"\n : \"qt-qb-saved-star--unsaved\",\n )}\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(\n \"qt-qb-saved-name\",\n !activeSavedQuery && \"qt-qb-saved-name--custom\",\n )}\n onClick={beginEditSavedName}\n >\n {activeSavedQuery ? activeSavedQuery.name : \"Custom Query\"}\n </button>\n )}\n </span>\n {isCollapsed ? (\n <span\n className=\"qt-qb-summary qt-truncate\"\n title={collapsedSummary}\n >\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\"} />\n {shareCopied ? \"Copied!\" : \"Share\"}\n </button>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={() => setShowSaved(true)}\n >\n <Icon name=\"bookmark\" />\n Saved\n {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={\n isCollapsed ? \"Expand query builder\" : \"Collapse query builder\"\n }\n >\n <Icon\n name=\"chevronDown\"\n size={18}\n className={cx(\n \"qt-qb-collapse-caret\",\n isCollapsed && \"qt-qb-collapse-caret--collapsed\",\n )}\n />\n <span className=\"qt-sr-only\">\n {isCollapsed ? \"Expand query builder\" : \"Collapse query builder\"}\n </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\n api={api}\n fields={fields}\n classNames={classNames}\n disabled={isBusy}\n />\n <WhereRow\n api={api}\n byName={byName}\n fields={fields}\n classNames={classNames}\n disabled={isBusy}\n />\n <OrderRow\n api={api}\n fields={fields}\n classNames={classNames}\n disabled={isBusy}\n />\n <WindowRow\n api={api}\n total={total}\n classNames={classNames}\n disabled={isBusy}\n />\n <MetricsRow\n api={api}\n fields={fields}\n classNames={classNames}\n theme={metricTheme}\n locale={metricLocale}\n />\n </div>\n <div className=\"qt-qb-editor-stack\">\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={api.undo}\n disabled={!api.canUndo || isBusy}\n >\n <Icon name=\"undo\" />\n Undo\n </button>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={api.redo}\n disabled={!api.canRedo || isBusy}\n >\n <Icon name=\"redo\" />\n Redo\n </button>\n <button\n type=\"button\"\n className={cx(\"qt-btn\", classNames?.button)}\n onClick={api.resetAll}\n disabled={isBusy}\n >\n <Icon name=\"reset\" />\n 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\n className=\"qt-qb-run-metric qt-qb-run-metric--strong\"\n title={api.loading ? undefined : rowSummaryTitle}\n >\n {api.loading ? \"loading…\" : `${rowSummary} rows`}\n </span>\n <span className=\"qt-qb-run-metric\">Last updated {lastUpdatedText}</span>\n {failureText ? (\n <span className=\"qt-qb-run-error\">{failureText}</span>\n ) : 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 <button\n type=\"button\"\n className={cx(\n \"qt-btn\",\n showActivity && \"qt-btn--active\",\n classNames?.button,\n )}\n aria-label=\"Request activity\"\n title=\"Request activity\"\n aria-expanded={showActivity}\n aria-controls={activityId}\n onClick={() => setShowActivity((v) => !v)}\n >\n <Icon name=\"stopwatch\" />\n </button>\n <span className=\"qt-auto-refresh\" ref={autoRefreshRef}>\n <button\n type=\"button\"\n className={cx(\n \"qt-btn\",\n Boolean(autoRefreshStatus) && \"qt-btn--active\",\n classNames?.button,\n )}\n onClick={() => setShowAutoRefresh((next) => !next)}\n aria-expanded={showAutoRefresh}\n title={\n autoRefreshStatus\n ? \"View or clear auto-update\"\n : \"Configure auto-update\"\n }\n >\n <Icon name=\"clock\" />\n {autoRefreshButtonText}\n </button>\n {showAutoRefresh ? (\n <AdaptiveOverlay\n title=\"Auto-update\"\n onClose={() => setShowAutoRefresh(false)}\n >\n <span\n ref={autoRefreshPopoverRef}\n className={cx(\n \"qt-auto-refresh-popover\",\n autoRefreshPopoverAlignRight &&\n \"qt-auto-refresh-popover--align-right\",\n )}\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) =>\n setAutoRefreshFrequencyMs(Number(e.target.value))\n }\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) =>\n setAutoRefreshTurnOffAfterMs(Number(e.target.value))\n }\n >\n {AUTO_REFRESH_TURN_OFF_AFTER.map((option) => (\n <option\n key={option.value}\n value={option.value}\n disabled={\n autoRefreshPolls(\n autoRefreshFrequencyMs,\n option.value,\n ) < 1 ||\n autoRefreshPolls(\n autoRefreshFrequencyMs,\n option.value,\n ) > MAX_AUTO_REFRESH_POLLS\n }\n >\n {option.label}\n </option>\n ))}\n </select>\n </label>\n <span\n className={cx(\n \"qt-auto-refresh-status\",\n !canSubmitAutoRefresh && \"qt-auto-refresh-status--error\",\n )}\n >\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{\" \"}\n {formatDuration(autoRefreshStatus.frequencyMs)}, clears\n after {formatDuration(autoRefreshStatus.turnOffAfterMs)}.{\" \"}\n {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\" />\n Run Now\n </button>\n </span>\n </div>\n\n {showActivity && (\n <RequestActivity id={activityId} activity={api.requestActivity}>\n {requestActivityDetails}\n </RequestActivity>\n )}\n {!isCollapsed && showSaved ? (\n <SavedQueriesModal\n saved={api.saved}\n onClose={() => setShowSaved(false)}\n onLoad={setLastSavedId}\n />\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(\n () => new Map(select.fields.map((f) => [f.name, f.label])),\n [select.fields],\n );\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\n type=\"button\"\n className=\"qt-add\"\n aria-label=\"Add column\"\n onClick={() => setAdding(true)}\n disabled={disabled || adding || select.hidden.length === 0}\n >\n <Icon name=\"add\" />\n {mobile ? \"Add\" : \"add column\"}\n </button>\n <button\n type=\"button\"\n className=\"qt-add qt-split-btn-caret\"\n aria-label=\"Customize columns\"\n title=\"Customize columns\"\n aria-haspopup=\"dialog\"\n aria-expanded={editingColumns}\n disabled={disabled}\n onClick={() => setEditingColumns(true)}\n >\n <Icon name=\"chevronRight\" size={18} />\n </button>\n </span>\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n aria-label=\"Reset columns\"\n onClick={select.reset}\n disabled={disabled}\n title=\"Reset to default columns\"\n >\n {mobile ? \"Reset\" : \"reset\"}\n </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\">\n select\n </span>\n {mobile && actions}\n </div>\n {editingColumns && (\n <SelectColumnEditor\n api={api}\n onClose={() => setEditingColumns(false)}\n />\n )}\n {mobile ? (\n <ReorderList\n className=\"qt-query-reorder-list qt-query-reorder-list--columns\"\n layout=\"wrap\"\n showHint={false}\n items={fieldNames.map((name) => ({\n id: name,\n label: fieldLabelByName.get(name) ?? name,\n }))}\n onMove={select.move}\n disabled={disabled}\n renderItem={(item) => (\n <>\n <span className=\"qt-chip-field\">{item.label}</span>\n <button\n type=\"button\"\n className=\"qt-chip-x\"\n onClick={() => select.hide(item.id)}\n disabled={disabled}\n aria-label={`Remove ${item.label} column`}\n >\n <Icon name=\"close\" />\n </button>\n </>\n )}\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), fieldNames);\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) => n !== columnDrag.source,\n );\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, fieldNames);\n }\n }\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const from =\n columnDrag.source || e.dataTransfer.getData(\"text/plain\");\n if (\n from &&\n columnDrag.overIndex != null &&\n rendered.includes(from)\n ) {\n reorderByIndex(from, rendered.indexOf(from));\n columnDrag.end(true);\n } else 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\n type=\"button\"\n className=\"qt-chip-x\"\n onClick={() => select.hide(name)}\n disabled={disabled}\n aria-label={`Remove ${label} column`}\n >\n <Icon name=\"close\" />\n </button>\n </span>\n );\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<{\n field: FieldDef<Row>;\n anchor: HTMLElement;\n returnFocus: HTMLElement;\n index: number;\n count: number;\n metadata: SetFilterMetadata;\n signature: string;\n } | 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<\n number,\n { field: FieldDef<Row>; metadata: SetFilterMetadata; count: number }\n >();\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\")\n continue;\n setEditors.set(index, { field, metadata: set.metadata, count: set.count });\n for (let offset = 1; offset < set.count; offset++)\n hiddenSetTerms.add(index + offset);\n index += set.count - 1;\n }\n useEffect(() => {\n if (editingSet && editingSet.signature !== whereSignature)\n 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 {\n ...query,\n offset: 0,\n where: [\n ...query.where.slice(0, index),\n ...terms,\n ...query.where.slice(index + current.count),\n ],\n };\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({\n field: f,\n anchor,\n returnFocus: anchor,\n index: where.length,\n count: 0,\n metadata: {\n id: `${editorId}-${Date.now()}-${nextSetId.current++}`,\n mode: \"any\",\n values: [],\n },\n signature: whereSignature,\n });\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) =>\n d && (d.over?.index !== index || d.over?.mode !== mode)\n ? { from: d.from, over: { index, mode } }\n : d,\n );\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\n ref={addFilterButton}\n type=\"button\"\n className=\"qt-add\"\n aria-label=\"Add filter\"\n aria-expanded={adding}\n onClick={() => setAdding(true)}\n disabled={disabled || adding}\n >\n <Icon name=\"add\" />\n add filter\n </button>\n {adding && (\n <FieldPicker\n fields={fields.filter(isFilterable)}\n gateOnDistinct\n onPick={addClause}\n onClose={() => setAdding(false)}\n />\n )}\n {where.length > 0 && (\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={api.clearFilters}\n disabled={disabled}\n title=\"Reset filters\"\n >\n reset\n </button>\n )}\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\">\n where\n </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 ? (\n <span className={cx(\"qt-chip\", classNames?.chip)}>\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n disabled={disabled}\n aria-label={`Edit ${set.field.label} tag filter`}\n onClick={(event) =>\n setEditingSet({\n field: set.field,\n anchor: event.currentTarget,\n returnFocus: event.currentTarget,\n index,\n count: set.count,\n metadata: set.metadata,\n signature: whereSignature,\n })\n }\n >\n {set.field.label} {set.metadata.mode.toUpperCase()}\n </button>\n {set.metadata.values.map((value) => (\n <span key={value} className=\"qt-set-tag\">\n <PresentedFilterValue\n field={set.field.name}\n value={value}\n label={setFilterValueLabel(set.field, value)}\n />\n <button\n type=\"button\"\n className=\"qt-chip-x\"\n aria-label={`Remove tag ${value}`}\n disabled={disabled}\n onClick={() =>\n replaceSet(\n set.metadata.id,\n createSetFilter(\n set.field.name,\n set.metadata.mode,\n set.metadata.values.filter((key) => key !== value),\n set.metadata.id,\n ),\n )\n }\n >\n ✕\n </button>\n </span>\n ))}\n <button\n type=\"button\"\n className=\"qt-chip-x\"\n aria-label={`Remove ${set.field.label} tag filter`}\n disabled={disabled}\n onClick={() => replaceSet(set.metadata.id, [])}\n >\n ✕\n </button>\n </span>\n ) : (\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 editorOpen={editingFilter === index}\n onEditorChange={(open) => setEditingFilter(open ? index : null)}\n />\n )}\n </span>\n );\n })}\n {editingSet && (\n <SetFilterEditor\n api={api}\n field={editingSet.field}\n anchor={editingSet.anchor}\n returnFocus={editingSet.returnFocus}\n classNames={classNames}\n mode={editingSet.metadata.mode}\n values={editingSet.metadata.values}\n maxPredicates={\n MAX_WHERE_CLAUSES -\n where.reduce(\n (count, term, index) =>\n index >= editingSet.index &&\n index < editingSet.index + editingSet.count\n ? count\n : count + predicatesOf(term).length,\n 0,\n )\n }\n disabled={disabled}\n onClose={() => setEditingSet(null)}\n onApply={(mode, values) => {\n const terms = createSetFilter(\n editingSet.field.name,\n mode,\n values,\n editingSet.metadata.id,\n );\n if (editingSet.count > 0) replaceSet(editingSet.metadata.id, terms);\n else\n api.setQuery((query) => ({\n ...query,\n offset: 0,\n where: [...query.where, ...terms],\n }));\n setEditingSet(null);\n }}\n />\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(\n (option) => (typeof option === \"string\" ? option : option.value) === value,\n );\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)\n return (\n <MobileFilter\n api={api}\n term={term}\n index={index}\n byName={byName}\n classNames={classNames}\n disabled={disabled}\n open={editorOpen}\n onOpenChange={onEditorChange}\n />\n );\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 && (\n <span className=\"qt-chip-and qt-chip-or\">OR</span>\n )}\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>({\n api,\n term,\n index,\n byName,\n classNames,\n disabled,\n open,\n onOpenChange,\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 open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const predicates = predicatesOf(term);\n return (\n <>\n <MobileClauseSummary\n editLabel={`Edit filter: ${whereTermAsText(term, byName)}`}\n disabled={disabled}\n className={classNames?.chip}\n filter\n onEdit={() => onOpenChange(true)}\n >\n <span>\n {predicates.map((clause, position) => {\n const strategy = byName.get(clause.field)?.filter?.values;\n const option =\n strategy?.source === \"static\"\n ? strategy.options.find(\n (choice) =>\n typeof choice !== \"string\" &&\n choice.value === clause.value,\n )\n : undefined;\n const label =\n typeof option === \"object\"\n ? option.label\n : clause.value === \"\"\n ? '\"\"'\n : clause.value;\n const emptyStringCondition =\n clause.value === \"0\" &&\n (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>\n {byName.get(clause.field)?.label ?? clause.field}\n </strong>\n <span>\n {choiceLabel(\n clause.op,\n Boolean(clause.negated),\n clause.value,\n )}{\" \"}\n {!NULLARY_OPS.has(clause.op) && !emptyStringCondition && (\n <PresentedFilterValue\n field={clause.field}\n value={clause.value}\n label={label}\n />\n )}\n </span>\n </span>\n );\n })}\n </span>\n </MobileClauseSummary>\n {open && (\n <ModalSurface\n title={\n predicates.length > 1\n ? \"Edit filter group\"\n : `Filter by ${byName.get(predicates[0]!.field)?.label ?? predicates[0]!.field}`\n }\n onClose={() => onOpenChange(false)}\n >\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\n api={api}\n clause={clause}\n field={byName.get(clause.field)}\n showField={predicates.length > 1}\n classNames={classNames}\n disabled={disabled}\n onChange={(next) =>\n api.updatePredicate(index, position, next)\n }\n onRemove={() => {\n if (predicates.length === 1) onOpenChange(false);\n api.removePredicate(index, position);\n }}\n />\n </Fragment>\n ))}\n {predicates.length > 1 && (\n <button\n type=\"button\"\n className=\"qt-mobile-form-remove\"\n aria-label=\"Remove filter group\"\n disabled={disabled}\n onClick={() => {\n onOpenChange(false);\n api.removeFilter(index);\n }}\n >\n Remove filter group\n </button>\n )}\n {api.query.where.length > 1 && (\n <label className=\"qt-filter-combine\">\n Match either filter (OR)\n <select\n className=\"qt-input\"\n value=\"\"\n disabled={disabled}\n onChange={(event) => {\n if (!event.target.value) return;\n onOpenChange(false);\n api.mergeFilters(index, Number(event.target.value));\n }}\n >\n <option value=\"\">Combine with another filter…</option>\n {api.query.where.map(\n (candidate, position) =>\n position !== index && (\n <option key={position} value={position}>\n {whereTermAsText(candidate, byName)}\n </option>\n ),\n )}\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\")\n return negated ? \"is not empty string\" : \"is empty string\";\n if (value === \"0\" && op === \"length_gt\")\n 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))\n 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 =\n 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(\n { field: clause.field, op: choice.op, value: clause.value },\n field ? opsForField(field) : undefined,\n )\n : { op: choice.op, negated: false };\n return (\n resolved.op === clause.op &&\n Boolean(resolved.negated) === Boolean(clause.negated)\n );\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\n title={`Condition for ${field?.label ?? clause.field}`}\n onClose={() => setOpen(false)}\n >\n <span\n className=\"qt-op-pop\"\n role={mobile ? undefined : \"dialog\"}\n aria-label=\"Choose condition\"\n >\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(\n \"qt-op-cell\",\n isActive(pair.keep) && \"qt-op-cell--on\",\n )}\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(\n \"qt-op-cell\",\n \"qt-op-cell--neg\",\n isActive(pair.exclude) && \"qt-op-cell--on\",\n )}\n onClick={() => {\n onPick(pair.exclude);\n setOpen(false);\n }}\n >\n {choiceLabel(\n pair.exclude.op,\n pair.exclude.negated,\n clause.value,\n )}\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 =\n clause.op === \"matches_regex\" || clause.op === \"not_matches_regex\";\n const isLength =\n clause.op === \"length_gt\" ||\n clause.op === \"length_lt\" ||\n clause.op === \"length_eq\";\n\n function pickOp(choice: OpChoice) {\n const nextIsLength =\n choice.op === \"length_gt\" ||\n choice.op === \"length_lt\" ||\n choice.op === \"length_eq\";\n const value = isLength === nextIsLength ? clause.value : \"\";\n const next: WhereClause = { field: clause.field, op: choice.op, value };\n onChange(\n choice.negated\n ? negateClause(next, field ? opsForField(field) : undefined)\n : next,\n );\n }\n\n const conditionControl = (\n <OpPicker\n field={field}\n clause={clause}\n disabled={disabled}\n classNames={classNames}\n onPick={pickOp}\n />\n );\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={\n isRegex\n ? \"regex\"\n : isLength\n ? \"length\"\n : field?.type === \"datetime\"\n ? \"ISO date or signed duration\"\n : \"value\"\n }\n classNames={classNames}\n onChange={(value) => onChange({ ...clause, value })}\n />\n ) : null;\n const removeControl = (\n <button\n type=\"button\"\n className={mobile ? \"qt-mobile-form-remove\" : \"qt-chip-x\"}\n onClick={onRemove}\n disabled={disabled}\n aria-label={`Remove ${field?.label ?? clause.field} filter`}\n >\n {mobile ? \"Remove filter\" : <Icon name=\"close\" />}\n </button>\n );\n\n if (mobile)\n return (\n <div className=\"qt-mobile-predicate qt-mobile-form\">\n {showField && (\n <strong className=\"qt-mobile-form-field--wide\">\n {field?.label ?? clause.field}\n </strong>\n )}\n <label\n className={cx(\n \"qt-mobile-form-field\",\n !needsValue && \"qt-mobile-form-field--wide\",\n )}\n >\n <span>Condition</span>\n {conditionControl}\n </label>\n {valueControl && (\n <label className=\"qt-mobile-form-field\">\n <span>Value</span>\n {valueControl}\n </label>\n )}\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\n ? filterValuesFor(field)\n : { source: \"freeform\" as const };\n\n // Static closed domain → a plain <select> of the options.\n if (!forceFreeform && strategy.source === \"static\") {\n if (\n presentation.render ||\n presentation.label ||\n strategy.options.some((o) => typeof o !== \"string\")\n ) {\n return (\n <PresentedValueInput\n field={field?.name ?? \"\"}\n value={value}\n options={strategy.options}\n onChange={onChange}\n />\n );\n }\n return (\n <select\n className={cx(\"qt-chip-val\", classNames?.select)}\n aria-label={`Value for ${field?.label ?? \"filter\"}`}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">—</option>\n {strategy.options.map((o) => {\n const option = typeof o === \"string\" ? { value: o, label: o } : o;\n return (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n );\n })}\n </select>\n );\n }\n\n // Freeform → a plain input, no suggestions.\n if (forceFreeform || strategy.source === \"freeform\" || !field) {\n const widthChars = chipFieldWidthForInput(\n value || placeholder,\n field?.type,\n 5,\n 4,\n );\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 (\n <AutocompleteInput\n api={api}\n field={field}\n value={value}\n classNames={classNames}\n onChange={onChange}\n />\n );\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>({\n values: [],\n hasMore: false,\n });\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={{\n width: `${chipFieldWidthForInput(value || \"value\", field.type, 5, 4)}ch`,\n }}\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 && (\n <span className=\"qt-autocomplete-hint\">keep typing to refine…</span>\n )}\n </span>\n );\n}\n\n// ---- ORDER BY (multi-sort, reorderable) -----------------------------------\n\nfunction MobileClauseSummary({\n editLabel,\n disabled,\n className,\n filter,\n onEdit,\n children,\n}: {\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\n type=\"button\"\n className=\"qt-mobile-filter\"\n data-qt-filter={filter || undefined}\n disabled={disabled}\n aria-label={editLabel}\n title={editLabel}\n aria-haspopup=\"dialog\"\n onClick={onEdit}\n >\n {children}\n <span className=\"qt-mobile-filter-edit\">\n <Icon name=\"pencil\" />\n </span>\n </button>\n </div>\n );\n}\n\nfunction MobileChipEditor({\n title,\n summaryTitle = title,\n summary,\n disabled,\n open,\n onOpenChange,\n children,\n}: {\n title: string;\n summaryTitle?: string;\n summary: string;\n disabled: boolean | undefined;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: ReactNode;\n}) {\n const mobile = useMobileLayout();\n if (!mobile) return children;\n return (\n <>\n <MobileClauseSummary\n editLabel={`Edit ${title}: ${summary}`}\n disabled={disabled}\n onEdit={() => onOpenChange(true)}\n >\n <span className=\"qt-mobile-filter-summary\">\n <strong>{summaryTitle}</strong>\n <span>{summary}</span>\n </span>\n </MobileClauseSummary>\n {open && (\n <ModalSurface title={title} onClose={() => onOpenChange(false)}>\n <div className=\"qt-overlay-body qt-mobile-chip-editor\">\n {children}\n </div>\n </ModalSurface>\n )}\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 && (\n <SortExtractionEditor\n api={api}\n field={term.field}\n label={label}\n initialPattern={term.extract?.regex}\n disabled={disabled}\n onApply={(regex) => {\n updateTerm(dataIndex, { extract: { regex } });\n setExtractOpen(false);\n }}\n onRemove={() => {\n clearExtract(dataIndex);\n setExtractOpen(false);\n }}\n onClose={() => setExtractOpen(false)}\n />\n );\n\n if (mobile)\n return (\n <>\n <MobileChipEditor\n title={title}\n summaryTitle={label}\n summary={summary}\n disabled={disabled}\n open={editorOpen}\n onOpenChange={onEditorChange}\n >\n <div className=\"qt-mobile-form\">\n <label className=\"qt-mobile-form-field\">\n <span>Direction</span>\n <select\n className={cx(\"qt-input\", classNames?.select)}\n value={term.dir}\n disabled={disabled}\n onChange={(event) =>\n updateTerm(dataIndex, {\n dir: event.target.value as OrderByClause[\"dir\"],\n })\n }\n >\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\n className={cx(\"qt-input\", classNames?.select)}\n value={term.nulls ?? \"last\"}\n disabled={disabled}\n onChange={(event) =>\n updateTerm(dataIndex, {\n nulls: event.target.value as \"first\" | \"last\",\n })\n }\n >\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\n type=\"button\"\n className=\"qt-btn\"\n disabled={disabled}\n onClick={() => setExtractOpen(true)}\n aria-label={`Configure regex extract for ${label}`}\n >\n <Icon name={term.extract ? \"pencil\" : \"add\"} />\n {term.extract ? \"Edit regex extraction\" : \"regex extract\"}\n </button>\n </div>\n <div className=\"qt-mobile-form-actions\">\n <button\n type=\"button\"\n className=\"qt-mobile-form-remove\"\n disabled={disabled}\n onClick={() => removeTerm(dataIndex)}\n aria-label={`Remove ${label} sort`}\n >\n Remove sort\n </button>\n </div>\n </div>\n </MobileChipEditor>\n {extractionEditor}\n </>\n );\n\n return (\n <>\n <span\n className={cx(\n \"qt-chip\",\n \"qt-chip--col\",\n \"qt-chip--sort\",\n isDragSource && \"qt-chip--dragging\",\n classNames?.chip,\n )}\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={() =>\n updateTerm(dataIndex, { dir: term.dir === \"asc\" ? \"desc\" : \"asc\" })\n }\n >\n <Icon name={term.dir === \"asc\" ? \"arrowUp\" : \"arrowDown\"} />\n {term.dir === \"asc\" ? \"asc\" : \"desc\"}\n </button>\n <button\n type=\"button\"\n className=\"qt-chip-op-btn\"\n title={\n term.extract\n ? `Regex: ${term.extract.regex}`\n : \"Sort by text extracted with a regular expression\"\n }\n aria-label={`Configure regex extract for ${label}`}\n disabled={disabled}\n onClick={() => setExtractOpen(true)}\n >\n <Icon name={term.extract ? \"pencil\" : \"add\"} />\n {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={() =>\n updateTerm(dataIndex, {\n nulls: (term.nulls ?? \"last\") === \"last\" ? \"first\" : \"last\",\n })\n }\n >\n nulls {term.nulls ?? \"last\"}\n </button>\n )}\n <button\n type=\"button\"\n className=\"qt-chip-x\"\n onClick={() => removeTerm(dataIndex)}\n disabled={disabled}\n aria-label={`Remove ${label} sort`}\n >\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(\n () => new Map(fields.map((f) => [f.name, f])),\n [fields],\n );\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<{\n source: string;\n overIndex: number;\n } | 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[] = [\n ...orderBy,\n { field, dir: \"desc\", ...(extract ? { extract } : {}) },\n ];\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\n ? [...q.select, { field }]\n : [...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(\n () => new Map(orderBy.map((o) => [o.field, o])),\n [orderBy],\n );\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) =>\n d && d.overIndex !== next ? { source: d.source, overIndex: next } : d,\n );\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(\n unsorted.find((f) => f.type === \"text\") ??\n unsorted[0] ??\n sortable[0] ??\n null,\n );\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={() =>\n setDrag({ source: name, overIndex: termFields.indexOf(name) })\n }\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\n type=\"button\"\n className=\"qt-add\"\n aria-label=\"Add sort\"\n onClick={() => setAdding(true)}\n disabled={disabled || adding || sortable.length === 0}\n >\n <Icon name=\"add\" />\n {mobile ? \"Add\" : \"add sort\"}\n </button>\n <button\n type=\"button\"\n className=\"qt-add qt-split-btn-caret\"\n aria-label=\"Sort with regex extraction\"\n title=\"Sort with regex extraction\"\n aria-haspopup=\"dialog\"\n aria-expanded={regexField != null}\n disabled={disabled || sortable.length === 0}\n onClick={openRegexConfigurator}\n >\n <Icon name=\"chevronRight\" size={18} />\n </button>\n </span>\n {!isDefaultOrderBy && (\n <button\n type=\"button\"\n className=\"qt-link-btn\"\n onClick={() => api.setSort(api.defaults.orderBy)}\n disabled={disabled}\n >\n {mobile ? \"Reset\" : \"reset\"}\n </button>\n )}\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\">\n order by\n </span>\n {mobile && actions}\n </div>\n {orderBy.length === 0 && !adding && (\n <span className=\"qt-qb-hint\">(default)</span>\n )}\n {mobile && orderBy.length > 0 ? (\n <ReorderList\n className=\"qt-query-reorder-list\"\n showHint={false}\n items={orderBy.map((term) => ({\n id: term.field,\n label: orderByAsText(term, byName),\n }))}\n disabled={disabled}\n renderItem={(item, position) => renderTerm(item.id, position)}\n 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 }}\n />\n ) : (\n rendered.map(renderTerm)\n )}\n {!mobile && actions}\n {adding && (\n <FieldPicker\n fields={sortable}\n onPick={(field) => addTerm(field)}\n onClose={() => setAdding(false)}\n />\n )}\n {regexField && (\n <SortExtractionEditor\n api={api}\n field={sortKey(regexField)}\n label={regexField.label}\n fieldOptions={sortable.map((f) => ({\n name: sortKey(f),\n label: f.label,\n }))}\n onFieldChange={(name) =>\n setRegexField(sortable.find((f) => sortKey(f) === name) ?? null)\n }\n title=\"Sort with regex extraction\"\n applyLabel={\n termFields.includes(sortKey(regexField))\n ? \"Update sort\"\n : \"Add sort\"\n }\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\">\n limit\n </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\n className=\"qt-qb-kw\"\n htmlFor={offsetId}\n data-mobile-label=\"Offset\"\n >\n offset\n </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={\n disabled || (total != null && query.offset + query.limit >= total)\n }\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 authoring lives in a single transactional workbench.\nfunction MetricsRow<Row>({\n api,\n fields,\n classNames,\n theme,\n locale,\n}: {\n api: QueryTableApi<Row>;\n fields: FieldDef<Row>[];\n classNames: QueryBuilderClassNames | undefined;\n theme: MetricTheme | undefined;\n locale: string | undefined;\n}) {\n const [editing, setEditing] = useState<string | null>(null);\n const allFields = useMemo(\n () => [\n ...fields,\n ...api.computed.catalogue.filter(\n (f) => !fields.some((existing) => existing.name === f.name),\n ),\n ],\n [fields, api.computed.catalogue],\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\">\n metrics\n </span>\n <button\n type=\"button\"\n className=\"qt-add\"\n aria-label=\"Edit metrics\"\n onClick={() => setEditing(\"\")}\n >\n <Icon name=\"pencil\" />\n Edit metrics\n </button>\n </div>\n {api.aggregations.clauses.map((clause) => (\n <button\n type=\"button\"\n key={clause.id}\n className={cx(\"qt-chip\", \"qt-chip--agg\", classNames?.chip)}\n onClick={() => setEditing(clause.id)}\n >\n {clause.label ??\n `${clause.op.toUpperCase()} ${clause.field ?? \"rows\"}`}\n </button>\n ))}\n {editing !== null && (\n <MetricsEditor\n api={api}\n fields={allFields}\n onClose={() => setEditing(null)}\n {...(editing ? { initialMetricId: editing } : {})}\n {...(theme ? { theme } : {})}\n {...(locale ? { locale } : {})}\n />\n )}\n </div>\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","// 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","useState","jsx","jsxs","useEffect","useId","useLayoutEffect","useMemo","useRef","useState","useRef","useState","Fragment","jsx","jsxs","useState","useMemo","useEffect","useId","useRef","useState","date","options","pad","Fragment","jsx","jsxs","useRef","useState","useEffect","useId","display","cx","series","jsx","jsxs","cx","useState","useMemo","valueLabel","useEffect","useRef","useLayoutEffect","useRef","useState","sum","Fragment","jsx","jsxs","useId","useRef","useState","useMemo","useEffect","useLayoutEffect","card","initial","lazy","Suspense","useEffect","useId","useMemo","useRef","useState","hash","Fragment","jsx","jsxs","FormulaEditor","lazy","useId","useState","useRef","useMemo","useEffect","label","f","Suspense","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","useId","useMemo","formatDuration","useRef","useEffect","jsxs","cx","jsx","Fragment","isSelectable","opsForField","isFilterable","option","NULLARY_OPS","opPairsForField","negateClause","numeric","isSortable","term","jsx","jsxs","cx"]}
|