{"version":3,"sources":["../src/theme.ts","../src/dom.ts","../src/icons.ts","../src/i18n.ts","../src/export/index.ts","../src/dialogs/formatDialog.ts","../src/dialogs/conditionalDialog.ts","../src/toolbar/toolbar.ts","../src/dialogs/filterDialog.ts","../src/fieldlist/fieldList.ts","../src/dialogs/fieldsDialog.ts","../src/render/model.ts","../src/render/selection.ts","../src/render/virtual.ts","../src/render/grid.ts","../src/state/uiState.ts","../src/state/history.ts","../src/state/persistence.ts","../src/PivotTable.ts"],"names":["escapeHtml","numInput","AGGREGATION_LABELS","field","dropIndex","start","PivotEngine"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Built-in theme names. Custom themes can be applied via any string + CSS. */\nexport type ThemeName = 'light' | 'dark' | (string & {});\n\n/** Apply a theme by setting the `data-ph-theme` attribute on the root element. */\nexport function applyTheme(root: HTMLElement, theme: ThemeName): void {\n  root.setAttribute('data-ph-theme', theme);\n}\n\n/**\n * Override theme tokens at runtime by writing CSS custom properties onto the\n * root. Keys are token names without the `--ph-` prefix (e.g. `accent`).\n */\nexport function setThemeTokens(root: HTMLElement, tokens: Record<string, string>): void {\n  for (const [key, value] of Object.entries(tokens)) {\n    root.style.setProperty(`--ph-${key}`, value);\n  }\n}\n\n/**\n * Strongly-typed style tokens. Pass these as the `tokens` prop/option to restyle\n * the widget without writing any CSS. Each maps to a `--ph-*` custom property.\n */\nexport interface ThemeTokens {\n  /** Primary accent (buttons, links, active states). */\n  accent?: string;\n  /** Foreground/text color on accent surfaces. */\n  accentForeground?: string;\n  /** Body text color. */\n  foreground?: string;\n  /** Muted/secondary text color. */\n  mutedForeground?: string;\n  /** Grid background. */\n  background?: string;\n  /** Alternate background (toolbar, panels). */\n  altBackground?: string;\n  /** Header cell background. */\n  headerBackground?: string;\n  /** Border color. */\n  border?: string;\n  /** Stronger border (hover/focus). */\n  borderStrong?: string;\n  /** Subtotal cell background. */\n  subtotalBackground?: string;\n  /** Grand-total cell background. */\n  grandTotalBackground?: string;\n  /** Row/cell hover background. */\n  hoverBackground?: string;\n  /** Popover/dialog shadow. */\n  shadow?: string;\n  /** Font family. */\n  fontFamily?: string;\n  /** Base font size (e.g. '13px'). */\n  fontSize?: string;\n  /** Corner radius — number is treated as px. */\n  radius?: string | number;\n}\n\nconst TOKEN_TO_VAR: Record<keyof ThemeTokens, string> = {\n  accent: 'accent',\n  accentForeground: 'accent-fg',\n  foreground: 'fg',\n  mutedForeground: 'fg-muted',\n  background: 'bg',\n  altBackground: 'bg-alt',\n  headerBackground: 'bg-header',\n  border: 'border',\n  borderStrong: 'border-strong',\n  subtotalBackground: 'total-bg',\n  grandTotalBackground: 'grand-bg',\n  hoverBackground: 'hover',\n  shadow: 'shadow',\n  fontFamily: 'font',\n  fontSize: 'font-size',\n  radius: 'radius',\n};\n\n/** Apply a typed {@link ThemeTokens} object onto the root as CSS variables. */\nexport function applyTokens(root: HTMLElement, tokens: ThemeTokens): void {\n  for (const key of Object.keys(tokens) as Array<keyof ThemeTokens>) {\n    const value = tokens[key];\n    if (value == null) continue;\n    const cssValue = key === 'radius' && typeof value === 'number' ? `${value}px` : String(value);\n    root.style.setProperty(`--ph-${TOKEN_TO_VAR[key]}`, cssValue);\n  }\n}\n","/** Tiny DOM helpers — keeps the renderer terse and dependency-free. */\n\nexport type Child = Node | string | number | null | undefined | false;\n\nexport interface Props {\n  class?: string;\n  className?: string;\n  text?: string;\n  html?: string;\n  title?: string;\n  style?: Partial<CSSStyleDeclaration> | string;\n  dataset?: Record<string, string>;\n  attrs?: Record<string, string | number | boolean | null | undefined>;\n  on?: Partial<{ [K in keyof HTMLElementEventMap]: (ev: HTMLElementEventMap[K]) => void }>;\n  [key: string]: unknown;\n}\n\n/** Create an element with props + children in one call. */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n  tag: K,\n  props: Props = {},\n  ...children: Child[]\n): HTMLElementTagNameMap[K] {\n  const el = document.createElement(tag);\n  const cls = props.class ?? props.className;\n  if (cls) el.className = cls;\n  if (props.text != null) el.textContent = String(props.text);\n  if (props.html != null) el.innerHTML = props.html;\n  if (props.title != null) el.title = props.title;\n  if (props.style) {\n    if (typeof props.style === 'string') el.setAttribute('style', props.style);\n    else Object.assign(el.style, props.style);\n  }\n  if (props.dataset) {\n    for (const [k, v] of Object.entries(props.dataset)) el.dataset[k] = v;\n  }\n  if (props.attrs) {\n    for (const [k, v] of Object.entries(props.attrs)) {\n      if (v === false || v == null) continue;\n      el.setAttribute(k, v === true ? '' : String(v));\n    }\n  }\n  if (props.on) {\n    for (const [event, handler] of Object.entries(props.on)) {\n      el.addEventListener(event, handler as EventListener);\n    }\n  }\n  appendChildren(el, children);\n  return el;\n}\n\nexport function appendChildren(el: HTMLElement, children: Child[]): void {\n  for (const child of children.flat(Infinity as 1)) {\n    if (child == null || child === false) continue;\n    el.append(child instanceof Node ? child : document.createTextNode(String(child)));\n  }\n}\n\nexport function clear(el: HTMLElement): void {\n  while (el.firstChild) el.removeChild(el.firstChild);\n}\n\nexport function on<K extends keyof HTMLElementEventMap>(\n  el: HTMLElement | Document | Window,\n  event: K,\n  handler: (ev: HTMLElementEventMap[K]) => void,\n  options?: AddEventListenerOptions,\n): () => void {\n  el.addEventListener(event, handler as EventListener, options);\n  return () => el.removeEventListener(event, handler as EventListener, options);\n}\n\n/** Resolve a string selector or element into an element (throws if missing). */\nexport function resolveTarget(target: string | HTMLElement): HTMLElement {\n  if (typeof target === 'string') {\n    const el = document.querySelector(target);\n    if (!el) throw new Error(`pvotly: target \"${target}\" not found`);\n    return el as HTMLElement;\n  }\n  return target;\n}\n","/** Inline SVG icons (no external assets). Each returns an SVG string. */\n\nconst svg = (path: string, viewBox = '0 0 24 24') =>\n  `<svg viewBox=\"${viewBox}\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${path}</svg>`;\n\nexport const ICONS = {\n  fields: svg('<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>'),\n  filter: svg('<polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/>'),\n  sortAsc: svg('<path d=\"M11 5h10\"/><path d=\"M11 9h7\"/><path d=\"M11 13h4\"/><path d=\"M3 17l3 3 3-3\"/><path d=\"M6 18V4\"/>'),\n  sortDesc: svg('<path d=\"M11 5h4\"/><path d=\"M11 9h7\"/><path d=\"M11 13h10\"/><path d=\"M3 7l3-3 3 3\"/><path d=\"M6 4v14\"/>'),\n  expand: svg('<polyline points=\"6 9 12 15 18 9\"/>'),\n  collapse: svg('<polyline points=\"9 18 15 12 9 6\"/>'),\n  export: svg('<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"/>'),\n  format: svg('<path d=\"M4 7V4h16v3\"/><path d=\"M9 20h6\"/><path d=\"M12 4v16\"/>'),\n  paint: svg('<path d=\"M19 11V9a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v2\"/><rect x=\"3\" y=\"11\" width=\"18\" height=\"10\" rx=\"2\"/>'),\n  fullscreen: svg('<path d=\"M8 3H5a2 2 0 0 0-2 2v3\"/><path d=\"M21 8V5a2 2 0 0 0-2-2h-3\"/><path d=\"M3 16v3a2 2 0 0 0 2 2h3\"/><path d=\"M16 21h3a2 2 0 0 0 2-2v-3\"/>'),\n  close: svg('<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>'),\n  grip: svg('<circle cx=\"9\" cy=\"6\" r=\"1\"/><circle cx=\"9\" cy=\"12\" r=\"1\"/><circle cx=\"9\" cy=\"18\" r=\"1\"/><circle cx=\"15\" cy=\"6\" r=\"1\"/><circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"18\" r=\"1\"/>'),\n  remove: svg('<circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>'),\n  grid: svg('<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/>'),\n  undo: svg('<path d=\"M3 7v6h6\"/><path d=\"M3 13a9 9 0 1 0 3-7.7L3 8\"/>'),\n  redo: svg('<path d=\"M21 7v6h-6\"/><path d=\"M21 13a9 9 0 1 1-3-7.7L21 8\"/>'),\n  copy: svg('<rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/>'),\n  freeze: svg('<path d=\"M12 2v20\"/><path d=\"m6 8 6-4 6 4\"/><path d=\"M4 12h16\"/><path d=\"m6 16 6 4 6-4\"/>'),\n};\n\nexport type IconName = keyof typeof ICONS;\n","import type { Localization } from '@pvotly/core';\n\n/**\n * All user-facing UI strings used by the toolbar, field list and the four\n * dialogs (fields / filter / format / conditional). Every key maps to a single\n * visible label so the whole widget can be localized via the report's\n * `localization` object (see {@link resolveStrings}).\n *\n * The {@link DEFAULT_STRINGS} values are the canonical English UI text. They are\n * deliberately byte-identical to the literals previously hardcoded in the view\n * modules so existing tests/e2e assertions on exact text keep passing.\n */\nexport interface UIStrings {\n  /* ---- toolbar ---- */\n  fields: string;\n  format: string;\n  formatTitle: string;\n  conditional: string;\n  conditionalTitle: string;\n  fullscreen: string;\n  layout: string;\n  compact: string;\n  classic: string;\n  flat: string;\n  export: string;\n  toCSV: string;\n  toExcel: string;\n  toHTML: string;\n  toJSON: string;\n  printPdf: string;\n\n  /* ---- field list / fields dialog: zones ---- */\n  reportFilters: string;\n  columns: string;\n  rows: string;\n  values: string;\n\n  /* ---- fields dialog ---- */\n  fieldsTitle: string;\n  allFields: string;\n  expandAll: string;\n  collapseAll: string;\n  search: string;\n  searchFields: string;\n  dropFieldHere: string;\n  dragAndDrop: string;\n  noMatchingFields: string;\n  expand: string;\n  collapse: string;\n  remove: string;\n  moveUp: string;\n  moveDown: string;\n  measure: string;\n\n  /* ---- field list ---- */\n  dragToArea: string;\n  sort: string;\n  filter: string;\n  aggregation: string;\n\n  /* ---- filter dialog ---- */\n  filterTitle: string;\n  members: string;\n  value: string;\n  searchMembers: string;\n  selectAll: string;\n  clear: string;\n  keepMembersByValue: string;\n  by: string;\n  apply: string;\n  clearFilter: string;\n  cancel: string;\n\n  /* ---- format dialog ---- */\n  formatTitle2: string;\n  applyTo: string;\n  defaultAll: string;\n  decimalPlaces: string;\n  thousandsSeparator: string;\n  decimalSeparator: string;\n  currencySymbol: string;\n  currencyPosition: string;\n  left: string;\n  right: string;\n  negatives: string;\n  negativeMinus: string;\n  negativeParentheses: string;\n  negativeRedMinus: string;\n  showAsPercent: string;\n  blankNullText: string;\n\n  /* ---- conditional dialog ---- */\n  conditionalDialogTitle: string;\n  noRulesYet: string;\n  allMeasures: string;\n  valuePlaceholder: string;\n  toPlaceholder: string;\n  addRule: string;\n  fill: string;\n  text: string;\n  opGreaterThan: string;\n  opGreaterOrEqual: string;\n  opLessThan: string;\n  opLessOrEqual: string;\n  opEquals: string;\n  opNotEquals: string;\n  opBetween: string;\n  opContains: string;\n\n  /* ---- grid interactions ---- */\n  noData: string;\n  sortAscending: string;\n  sortDescending: string;\n  removeSort: string;\n  resizeColumn: string;\n  freezeColumns: string;\n  copy: string;\n\n  /* ---- values axis toggle ---- */\n  valuesAxis: string;\n  valuesAsColumns: string;\n  valuesAsRows: string;\n\n  /* ---- undo / redo / state ---- */\n  undo: string;\n  redo: string;\n}\n\n/**\n * Canonical English strings. CRITICAL: keep these byte-identical to the\n * historical hardcoded literals — tests assert exact text and labels.\n */\nexport const DEFAULT_STRINGS: UIStrings = {\n  /* toolbar */\n  fields: 'Fields',\n  format: 'Format',\n  formatTitle: 'Format cells',\n  conditional: 'Conditional',\n  conditionalTitle: 'Conditional formatting',\n  fullscreen: 'Fullscreen',\n  layout: 'Layout',\n  compact: 'Compact',\n  classic: 'Classic',\n  flat: 'Flat',\n  export: 'Export',\n  toCSV: 'To CSV',\n  toExcel: 'To Excel',\n  toHTML: 'To HTML',\n  toJSON: 'To JSON',\n  printPdf: 'Print / PDF',\n\n  /* zones */\n  reportFilters: 'Report Filters',\n  columns: 'Columns',\n  rows: 'Rows',\n  values: 'Values',\n\n  /* fields dialog */\n  fieldsTitle: 'Fields',\n  allFields: 'All Fields',\n  expandAll: 'Expand All',\n  collapseAll: 'Collapse All',\n  search: 'Search',\n  searchFields: 'Search fields',\n  dropFieldHere: 'Drop field here',\n  dragAndDrop: 'Drag and drop fields to arrange',\n  noMatchingFields: 'No matching fields',\n  expand: 'Expand',\n  collapse: 'Collapse',\n  remove: 'Remove',\n  moveUp: 'Move up',\n  moveDown: 'Move down',\n  measure: 'Measure',\n\n  /* field list */\n  dragToArea: 'Drag to an area, or double-click to add',\n  sort: 'Sort',\n  filter: 'Filter',\n  aggregation: 'Aggregation',\n\n  /* filter dialog */\n  filterTitle: 'Filter',\n  members: 'Members',\n  value: 'Value',\n  searchMembers: 'Search members…',\n  selectAll: 'Select all',\n  clear: 'Clear',\n  keepMembersByValue: 'Keep members by measure value:',\n  by: 'by',\n  apply: 'Apply',\n  clearFilter: 'Clear filter',\n  cancel: 'Cancel',\n\n  /* format dialog */\n  formatTitle2: 'Format cells',\n  applyTo: 'Apply to',\n  defaultAll: 'Default (all)',\n  decimalPlaces: 'Decimal places',\n  thousandsSeparator: 'Thousands separator',\n  decimalSeparator: 'Decimal separator',\n  currencySymbol: 'Currency symbol',\n  currencyPosition: 'Currency position',\n  left: 'Left',\n  right: 'Right',\n  negatives: 'Negatives',\n  negativeMinus: '-1,234',\n  negativeParentheses: '(1,234)',\n  negativeRedMinus: 'Red -1,234',\n  showAsPercent: 'Show as percent',\n  blankNullText: 'Blank / null text',\n\n  /* conditional dialog */\n  conditionalDialogTitle: 'Conditional formatting',\n  noRulesYet: 'No rules yet.',\n  allMeasures: 'All measures',\n  valuePlaceholder: 'value',\n  toPlaceholder: 'to',\n  addRule: '+ Add rule',\n  fill: 'Fill',\n  text: 'Text',\n  opGreaterThan: 'greater than',\n  opGreaterOrEqual: 'greater or equal',\n  opLessThan: 'less than',\n  opLessOrEqual: 'less or equal',\n  opEquals: 'equals',\n  opNotEquals: 'not equals',\n  opBetween: 'between',\n  opContains: 'contains',\n\n  /* grid interactions */\n  noData: 'No data to display',\n  sortAscending: 'Sort ascending',\n  sortDescending: 'Sort descending',\n  removeSort: 'Remove sort',\n  resizeColumn: 'Drag to resize',\n  freezeColumns: 'Freeze columns',\n  copy: 'Copy',\n\n  /* values axis toggle */\n  valuesAxis: 'Values',\n  valuesAsColumns: 'Values on columns',\n  valuesAsRows: 'Values on rows',\n\n  /* undo / redo / state */\n  undo: 'Undo',\n  redo: 'Redo',\n};\n\n/**\n * Merge {@link DEFAULT_STRINGS} with the report's `localization` object. Any\n * `UIStrings` key present on `localization` overrides the default; a handful of\n * well-known {@link Localization} fields are also mapped onto matching UI keys.\n *\n * When `localization` is undefined (the default), this returns the canonical\n * English strings so existing behavior is preserved.\n */\nexport function resolveStrings(localization?: Localization | undefined): UIStrings {\n  const merged: UIStrings = { ...DEFAULT_STRINGS };\n  if (!localization) return merged;\n\n  // Allow overriding any UIString directly via a matching localization key.\n  for (const key of Object.keys(DEFAULT_STRINGS) as Array<keyof UIStrings>) {\n    const v = localization[key as string];\n    if (typeof v === 'string') merged[key] = v;\n  }\n\n  return merged;\n}\n\n/** Layout direction. */\nexport type Direction = 'ltr' | 'rtl';\n\n/**\n * Resolve the desired layout direction from the report's `localization` object.\n * Honors either `localization.direction: 'rtl'` or a boolean `localization.rtl`.\n * Defaults to `'ltr'`.\n */\nexport function resolveDirection(localization?: Localization | undefined): Direction {\n  if (!localization) return 'ltr';\n  const dir = localization.direction;\n  if (dir === 'rtl' || dir === 'ltr') return dir;\n  if (localization.rtl === true) return 'rtl';\n  return 'ltr';\n}\n","import type { MeasureConfig, PivotGrid } from '@pvotly/core';\n\nexport type ExportFormat = 'csv' | 'html' | 'json' | 'excel';\n\nexport interface ExportOptions {\n  filename?: string;\n  /** Use raw numeric values instead of formatted strings. */\n  raw?: boolean;\n}\n\ninterface FlatColumn {\n  header: string;\n  colLeaf: PivotGrid['columnLeaves'][number];\n  measure: MeasureConfig;\n}\n\nfunction flatColumns(grid: PivotGrid): FlatColumn[] {\n  const cols: FlatColumn[] = [];\n  for (const colLeaf of grid.columnLeaves) {\n    for (const m of grid.measures) {\n      const measureLabel = m.caption ?? m.uniqueName;\n      const header = colLeaf.caption ? `${colLeaf.caption} – ${measureLabel}` : measureLabel;\n      cols.push({ header, colLeaf, measure: m });\n    }\n  }\n  return cols;\n}\n\n/** Build a 2D matrix (header row + body rows) of the visible grid. */\nexport function gridToMatrix(grid: PivotGrid, raw = false): (string | number | null)[][] {\n  const cols = flatColumns(grid);\n  const matrix: (string | number | null)[][] = [];\n  matrix.push(['', ...cols.map((c) => c.header)]);\n  for (const rowLeaf of grid.rowLeaves) {\n    const line: (string | number | null)[] = [rowLeaf.caption];\n    for (const c of cols) {\n      const cell = grid.getCell(rowLeaf, c.colLeaf, c.measure);\n      line.push(raw ? (cell.displayValue as number | null) : cell.formatted);\n    }\n    matrix.push(line);\n  }\n  return matrix;\n}\n\nfunction escapeCsv(value: string | number | null): string {\n  if (value == null) return '';\n  const s = String(value);\n  return /[\",\\n\\r]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n}\n\nexport function exportToCSV(grid: PivotGrid, options: ExportOptions = {}): string {\n  return gridToMatrix(grid, options.raw)\n    .map((row) => row.map(escapeCsv).join(','))\n    .join('\\r\\n');\n}\n\nexport function exportToJSON(grid: PivotGrid, options: ExportOptions = {}): string {\n  const matrix = gridToMatrix(grid, options.raw ?? true);\n  const [header, ...rows] = matrix;\n  const records = rows.map((row) => {\n    const obj: Record<string, unknown> = {};\n    header!.forEach((key, i) => {\n      obj[String(key) || 'row'] = row[i];\n    });\n    return obj;\n  });\n  return JSON.stringify(records, null, 2);\n}\n\nfunction escapeHtml(value: string | number | null): string {\n  if (value == null) return '';\n  return String(value)\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\nexport function exportToHTML(grid: PivotGrid, options: ExportOptions = {}): string {\n  const matrix = gridToMatrix(grid, options.raw);\n  const [header, ...rows] = matrix;\n  const thead = `<thead><tr>${header!.map((c) => `<th>${escapeHtml(c)}</th>`).join('')}</tr></thead>`;\n  const tbody = `<tbody>${rows\n    .map((row) => `<tr>${row.map((c, i) => `<t${i === 0 ? 'h' : 'd'}>${escapeHtml(c)}</t${i === 0 ? 'h' : 'd'}>`).join('')}</tr>`)\n    .join('')}</tbody>`;\n  return `<table border=\"1\" cellspacing=\"0\" cellpadding=\"4\">${thead}${tbody}</table>`;\n}\n\n/** Excel-compatible export using the SpreadsheetML / HTML-table format (.xls). */\nexport function exportToExcel(grid: PivotGrid, options: ExportOptions = {}): string {\n  const table = exportToHTML(grid, options);\n  return `<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\"><head><meta charset=\"utf-8\"/><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Pivot</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body>${table}</body></html>`;\n}\n\nconst MIME: Record<ExportFormat, string> = {\n  csv: 'text/csv;charset=utf-8',\n  html: 'text/html;charset=utf-8',\n  json: 'application/json;charset=utf-8',\n  excel: 'application/vnd.ms-excel',\n};\n\nconst EXT: Record<ExportFormat, string> = { csv: 'csv', html: 'html', json: 'json', excel: 'xls' };\n\nexport function serializeExport(grid: PivotGrid, format: ExportFormat, options: ExportOptions = {}): string {\n  switch (format) {\n    case 'csv':\n      return exportToCSV(grid, options);\n    case 'html':\n      return exportToHTML(grid, options);\n    case 'json':\n      return exportToJSON(grid, options);\n    case 'excel':\n      return exportToExcel(grid, options);\n  }\n}\n\n/** Trigger a browser download (no-op outside the browser). */\nexport function downloadExport(grid: PivotGrid, format: ExportFormat, options: ExportOptions = {}): void {\n  const content = serializeExport(grid, format, options);\n  if (typeof document === 'undefined' || typeof URL === 'undefined' || !URL.createObjectURL) return;\n  const blob = new Blob([content], { type: MIME[format] });\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = `${options.filename ?? 'pivot'}.${EXT[format]}`;\n  document.body.appendChild(a);\n  a.click();\n  a.remove();\n  URL.revokeObjectURL(url);\n}\n\n/** Open the browser print dialog scoped to the table (for PDF export). */\nexport function printGrid(grid: PivotGrid, title = 'Pivot Table'): void {\n  if (typeof window === 'undefined') return;\n  const win = window.open('', '_blank');\n  if (!win) return;\n  win.document.write(\n    `<!doctype html><html><head><title>${title}</title><style>table{border-collapse:collapse;font-family:sans-serif;font-size:12px}th,td{border:1px solid #ccc;padding:4px 8px;text-align:right}th:first-child,td:first-child{text-align:left}</style></head><body>${exportToHTML(grid)}</body></html>`,\n  );\n  win.document.close();\n  win.focus();\n  win.print();\n}\n","import type { NumberFormat } from '@pvotly/core';\nimport type { PivotContext } from '../context';\nimport { h } from '../dom';\nimport { resolveStrings } from '../i18n';\n\n/** Open the number-format editor for the default (and per-measure) format. */\nexport function openFormatDialog(ctx: PivotContext): void {\n  const engine = ctx.engine;\n  const config = engine.getConfiguration();\n  const t = resolveStrings(config.localization);\n  const formats = config.formats ?? [];\n  const measures = engine.getSlice().measures ?? [];\n\n  // Target selector: default format ('') or a measure's own named format.\n  const targetSel = h('select', { class: 'ph-input' }) as HTMLSelectElement;\n  targetSel.append(h('option', { text: t.defaultAll, attrs: { value: '' } }));\n  for (const m of measures) targetSel.append(h('option', { text: m.caption ?? m.uniqueName, attrs: { value: m.uniqueName } }));\n\n  const find = (name: string): NumberFormat =>\n    formats.find((f) => f.name === name) ?? { name, decimalPlaces: 2, thousandsSeparator: ',', decimalSeparator: '.' };\n\n  const decimals = numInput(t.decimalPlaces, 0, 10);\n  const thousands = textInput(t.thousandsSeparator);\n  const decimalSep = textInput(t.decimalSeparator);\n  const currency = textInput(t.currencySymbol);\n  const currencyAlign = selectInput(t.currencyPosition, [\n    ['left', t.left],\n    ['right', t.right],\n  ]);\n  const negative = selectInput(t.negatives, [\n    ['minus', t.negativeMinus],\n    ['parentheses', t.negativeParentheses],\n    ['redMinus', t.negativeRedMinus],\n  ]);\n  const percent = checkboxInput(t.showAsPercent);\n  const nullVal = textInput(t.blankNullText);\n\n  const load = (name: string) => {\n    const f = find(name);\n    decimals.input.value = String(f.decimalPlaces ?? 2);\n    thousands.input.value = f.thousandsSeparator ?? ',';\n    decimalSep.input.value = f.decimalSeparator ?? '.';\n    currency.input.value = f.currencySymbol ?? '';\n    currencyAlign.input.value = f.currencySymbolAlign ?? 'left';\n    negative.input.value = f.negativeFormat ?? 'minus';\n    percent.input.checked = !!f.isPercent;\n    nullVal.input.value = f.nullValue ?? '';\n  };\n  load('');\n  targetSel.addEventListener('change', () => load(targetSel.value === '' ? '' : measureFormatName(targetSel.value)));\n\n  const measureFormatName = (measureName: string) =>\n    measures.find((m) => m.uniqueName === measureName)?.format ?? '';\n\n  const apply = h('button', {\n    class: 'ph-btn ph-btn-primary',\n    text: t.apply,\n    attrs: { type: 'button' },\n    on: {\n      click: () => {\n        const targetMeasure = targetSel.value;\n        const name = targetMeasure === '' ? '' : `fmt_${targetMeasure}`;\n        const fmt: NumberFormat = {\n          name,\n          decimalPlaces: Number(decimals.input.value),\n          thousandsSeparator: thousands.input.value,\n          decimalSeparator: decimalSep.input.value || '.',\n          currencySymbol: currency.input.value,\n          currencySymbolAlign: currencyAlign.input.value as 'left' | 'right',\n          negativeFormat: negative.input.value as NumberFormat['negativeFormat'],\n          isPercent: percent.input.checked,\n          nullValue: nullVal.input.value,\n        };\n        const next = (config.formats ?? []).filter((f) => f.name !== name);\n        next.push(fmt);\n        engine.setFormats(next);\n        if (targetMeasure !== '') engine.setMeasureFormat(targetMeasure, name);\n        ctx.closeDialog();\n      },\n    },\n  });\n\n  const content = h(\n    'div',\n    { class: 'ph-format-dialog' },\n    field(t.applyTo, targetSel),\n    decimals.row,\n    thousands.row,\n    decimalSep.row,\n    currency.row,\n    currencyAlign.row,\n    negative.row,\n    percent.row,\n    nullVal.row,\n    h(\n      'div',\n      { class: 'ph-dialog-footer' },\n      h('button', { class: 'ph-btn', text: t.cancel, attrs: { type: 'button' }, on: { click: () => ctx.closeDialog() } }),\n      apply,\n    ),\n  );\n  ctx.openDialog(content, t.formatTitle2);\n}\n\nfunction field(label: string, input: HTMLElement): HTMLElement {\n  return h('label', { class: 'ph-field' }, h('span', { text: label }), input);\n}\n\nfunction numInput(label: string, min: number, max: number) {\n  const input = h('input', { class: 'ph-input', attrs: { type: 'number', min, max } }) as HTMLInputElement;\n  return { input, row: field(label, input) };\n}\nfunction textInput(label: string) {\n  const input = h('input', { class: 'ph-input' }) as HTMLInputElement;\n  return { input, row: field(label, input) };\n}\nfunction selectInput(label: string, options: Array<[string, string]>) {\n  const input = h('select', { class: 'ph-input' }) as HTMLSelectElement;\n  for (const [v, l] of options) input.append(h('option', { text: l, attrs: { value: v } }));\n  return { input, row: field(label, input) };\n}\nfunction checkboxInput(label: string) {\n  const input = h('input', { attrs: { type: 'checkbox' } }) as HTMLInputElement;\n  return { input, row: h('label', { class: 'ph-field ph-field-check' }, input, h('span', { text: label })) };\n}\n","import type { ConditionalFormat, ConditionExpr } from '@pvotly/core';\nimport type { PivotContext } from '../context';\nimport { h } from '../dom';\nimport { resolveStrings, type UIStrings } from '../i18n';\n\nfunction buildOps(t: UIStrings): Array<{ value: string; label: string; needs: 'one' | 'two' | 'none' }> {\n  return [\n    { value: '>', label: t.opGreaterThan, needs: 'one' },\n    { value: '>=', label: t.opGreaterOrEqual, needs: 'one' },\n    { value: '<', label: t.opLessThan, needs: 'one' },\n    { value: '<=', label: t.opLessOrEqual, needs: 'one' },\n    { value: '=', label: t.opEquals, needs: 'one' },\n    { value: '!=', label: t.opNotEquals, needs: 'one' },\n    { value: 'between', label: t.opBetween, needs: 'two' },\n    { value: 'contains', label: t.opContains, needs: 'one' },\n  ];\n}\n\n/** Open the conditional-formatting rules editor. */\nexport function openConditionalDialog(ctx: PivotContext): void {\n  const engine = ctx.engine;\n  const t = resolveStrings(engine.getConfiguration().localization);\n  const OPS = buildOps(t);\n  const rules: ConditionalFormat[] = (engine.getConfiguration().conditions ?? []).map((c) => ({ ...c }));\n  const measures = engine.getSlice().measures ?? [];\n\n  const content = h('div', { class: 'ph-cond-dialog' });\n  const list = h('div', { class: 'ph-cond-list' });\n\n  const renderList = () => {\n    list.replaceChildren();\n    if (!rules.length) list.append(h('p', { class: 'ph-hint', text: t.noRulesYet }));\n    rules.forEach((rule, i) => {\n      const desc = describeRule(rule, t);\n      const swatch = h('span', {\n        class: 'ph-swatch',\n        style: {\n          backgroundColor: rule.format.backgroundColor ?? 'transparent',\n          color: rule.format.color ?? 'inherit',\n        },\n        text: 'Aa',\n      });\n      list.append(\n        h(\n          'div',\n          { class: 'ph-cond-item' },\n          swatch,\n          h('span', { class: 'ph-cond-desc', text: desc }),\n          h('button', {\n            class: 'ph-btn ph-btn-sm',\n            text: '✕',\n            attrs: { type: 'button' },\n            on: {\n              click: () => {\n                rules.splice(i, 1);\n                renderList();\n              },\n            },\n          }),\n        ),\n      );\n    });\n  };\n\n  // Add-rule form\n  const measureSel = h('select', { class: 'ph-input' }) as HTMLSelectElement;\n  measureSel.append(h('option', { text: t.allMeasures, attrs: { value: '' } }));\n  for (const m of measures) measureSel.append(h('option', { text: m.caption ?? m.uniqueName, attrs: { value: m.uniqueName } }));\n\n  const opSel = h('select', { class: 'ph-input' }) as HTMLSelectElement;\n  for (const op of OPS) opSel.append(h('option', { text: op.label, attrs: { value: op.value } }));\n\n  const v1 = h('input', { class: 'ph-input ph-input-num', attrs: { type: 'text', placeholder: t.valuePlaceholder } }) as HTMLInputElement;\n  const v2 = h('input', { class: 'ph-input ph-input-num', attrs: { type: 'text', placeholder: t.toPlaceholder } }) as HTMLInputElement;\n  v2.style.display = 'none';\n  opSel.addEventListener('change', () => {\n    const def = OPS.find((o) => o.value === opSel.value);\n    v2.style.display = def?.needs === 'two' ? '' : 'none';\n  });\n\n  const bg = h('input', { attrs: { type: 'color', value: '#fff3cd' } }) as HTMLInputElement;\n  const fg = h('input', { attrs: { type: 'color', value: '#664d03' } }) as HTMLInputElement;\n\n  const addBtn = h('button', {\n    class: 'ph-btn',\n    text: t.addRule,\n    attrs: { type: 'button' },\n    on: {\n      click: () => {\n        const op = opSel.value;\n        const def = OPS.find((o) => o.value === op);\n        let condition: ConditionExpr;\n        if (def?.needs === 'two') {\n          condition = { op: 'between', from: Number(v1.value) || 0, to: Number(v2.value) || 0 };\n        } else if (op === 'contains') {\n          condition = { op: 'contains', value: v1.value };\n        } else {\n          condition = { op: op as never, value: Number(v1.value) || 0 };\n        }\n        const rule: ConditionalFormat = {\n          measure: measureSel.value || undefined,\n          condition,\n          format: { backgroundColor: bg.value, color: fg.value },\n        };\n        rules.push(rule);\n        renderList();\n      },\n    },\n  });\n\n  const form = h(\n    'div',\n    { class: 'ph-cond-form' },\n    h('div', { class: 'ph-row' }, measureSel, opSel, v1, v2),\n    h('div', { class: 'ph-row' }, h('span', { text: t.fill }), bg, h('span', { text: t.text }), fg, addBtn),\n  );\n\n  const footer = h(\n    'div',\n    { class: 'ph-dialog-footer' },\n    h('button', {\n      class: 'ph-btn',\n      text: t.cancel,\n      attrs: { type: 'button' },\n      on: { click: () => ctx.closeDialog() },\n    }),\n    h('button', {\n      class: 'ph-btn ph-btn-primary',\n      text: t.apply,\n      attrs: { type: 'button' },\n      on: {\n        click: () => {\n          engine.setConditions(rules);\n          ctx.closeDialog();\n        },\n      },\n    }),\n  );\n\n  renderList();\n  content.append(list, form, footer);\n  ctx.openDialog(content, t.conditionalDialogTitle);\n}\n\nfunction describeRule(rule: ConditionalFormat, t: UIStrings): string {\n  const target = rule.measure ?? t.allMeasures;\n  const c = rule.condition;\n  let cond = '';\n  switch (c.op) {\n    case 'between':\n      cond = `between ${c.from} and ${c.to}`;\n      break;\n    case 'contains':\n      cond = `contains \"${c.value}\"`;\n      break;\n    case 'isTrue':\n      cond = 'is true';\n      break;\n    case 'isFalse':\n      cond = 'is false';\n      break;\n    default:\n      cond = `${c.op} ${(c as { value: unknown }).value}`;\n  }\n  return `${target} ${cond}`;\n}\n","import type { GridType } from '@pvotly/core';\nimport type { PivotContext } from '../context';\nimport type { PivotTable } from '../PivotTable';\nimport { ICONS } from '../icons';\nimport { h } from '../dom';\nimport { downloadExport, printGrid, type ExportFormat } from '../export';\nimport { openFormatDialog } from '../dialogs/formatDialog';\nimport { openConditionalDialog } from '../dialogs/conditionalDialog';\nimport { resolveStrings, type UIStrings } from '../i18n';\n\n/** The built-in action ids that can be toggled / customized. */\nexport type ActionBarAction =\n  | 'fields'\n  | 'format'\n  | 'conditional'\n  | 'layout'\n  | 'export'\n  | 'fullscreen'\n  | 'undo'\n  | 'redo'\n  | 'copy';\n\n/** Per-button override. `false` hides it; an object customizes it. */\nexport interface ActionBarButtonConfig {\n  visible?: boolean;\n  /** Override the label text. */\n  label?: string;\n  /** Override the icon (raw SVG/HTML string). */\n  icon?: string;\n  /** Tooltip. */\n  title?: string;\n  /** Extra class name(s) added to the button. */\n  className?: string;\n  /** Replace the default click behavior. Receives the widget instance. */\n  onClick?: (table: PivotTable) => void;\n}\n\n/** A fully custom button added to the action bar. */\nexport interface ActionBarItem {\n  id: string;\n  label?: string;\n  icon?: string;\n  title?: string;\n  className?: string;\n  onClick: (table: PivotTable) => void;\n}\n\n/**\n * Configure / style the action bar (toolbar). Each built-in action can be a\n * boolean (show/hide) or an object override; add your own buttons via `custom`.\n *\n * @example\n * ```ts\n * actionBar: {\n *   className: 'my-bar',\n *   fields: { label: 'Configure', icon: gearSvg },  // restyle a built-in\n *   conditional: false,                              // hide one\n *   custom: [{ id: 'refresh', label: 'Reload', onClick: (t) => t.refresh() }],\n * }\n * ```\n */\nexport interface ActionBarConfig {\n  /** Hide the whole bar. */\n  visible?: boolean;\n  /** Class name(s) added to the bar element. */\n  className?: string;\n  /** Inline styles for the bar element. */\n  style?: string | Partial<CSSStyleDeclaration>;\n  /** Where custom buttons go relative to the built-ins (default 'end'). */\n  customPosition?: 'start' | 'end';\n  /** Extra custom buttons. */\n  custom?: ActionBarItem[];\n\n  fields?: boolean | ActionBarButtonConfig;\n  format?: boolean | ActionBarButtonConfig;\n  conditional?: boolean | ActionBarButtonConfig;\n  layout?: boolean | ActionBarButtonConfig;\n  export?: boolean | ActionBarButtonConfig;\n  fullscreen?: boolean | ActionBarButtonConfig;\n  /** Undo button (hidden unless enabled). */\n  undo?: boolean | ActionBarButtonConfig;\n  /** Redo button (hidden unless enabled). */\n  redo?: boolean | ActionBarButtonConfig;\n  /** Copy-selection button (hidden unless enabled). */\n  copy?: boolean | ActionBarButtonConfig;\n}\n\ninterface Resolved {\n  label: string;\n  icon: string;\n  title: string;\n  className?: string;\n  onClick: () => void;\n}\n\n/** Render the toolbar into `container`, honoring the table's actionBar config. */\nexport function mountToolbar(ctx: PivotContext, container: HTMLElement): void {\n  container.replaceChildren();\n  const cfg: ActionBarConfig = ctx.table.actionBar ?? {};\n  if (cfg.visible === false) return;\n\n  const bar = h('div', {\n    class: `ph-toolbar${cfg.className ? ` ${cfg.className}` : ''}`,\n    attrs: { role: 'toolbar' },\n  });\n  if (cfg.style) {\n    if (typeof cfg.style === 'string') bar.setAttribute('style', cfg.style);\n    else Object.assign(bar.style, cfg.style);\n  }\n\n  const t = resolveStrings(ctx.engine.getConfiguration().localization);\n\n  const defaults: Record<Exclude<ActionBarAction, 'layout' | 'export'>, Resolved> = {\n    fields: {\n      label: t.fields,\n      icon: ICONS.fields,\n      title: t.fields,\n      onClick: () => ctx.table.openFieldsDialog(),\n    },\n    format: {\n      label: t.format,\n      icon: ICONS.format,\n      title: t.formatTitle,\n      onClick: () => openFormatDialog(ctx),\n    },\n    conditional: {\n      label: t.conditional,\n      icon: ICONS.paint,\n      title: t.conditionalTitle,\n      onClick: () => openConditionalDialog(ctx),\n    },\n    fullscreen: {\n      label: t.fullscreen,\n      icon: ICONS.fullscreen,\n      title: t.fullscreen,\n      onClick: () => void ctx.table.toggleFullscreen(),\n    },\n    undo: {\n      label: t.undo,\n      icon: ICONS.undo,\n      title: t.undo,\n      onClick: () => void ctx.table.undo(),\n    },\n    redo: {\n      label: t.redo,\n      icon: ICONS.redo,\n      title: t.redo,\n      onClick: () => void ctx.table.redo(),\n    },\n    copy: {\n      label: t.copy,\n      icon: ICONS.copy,\n      title: t.copy,\n      onClick: () => void ctx.table.copySelection(),\n    },\n  };\n\n  const resolve = (\n    action: ActionBarAction,\n    def: Resolved,\n    defaultOn = true,\n  ): HTMLElement | null => {\n    const raw = cfg[action];\n    if (raw === false) return null;\n    if (raw === undefined && !defaultOn) return null;\n    const o: ActionBarButtonConfig = typeof raw === 'object' ? raw : {};\n    if (o.visible === false) return null;\n    const onClick = o.onClick ? () => o.onClick!(ctx.table) : def.onClick;\n    return toolBtn(o.label ?? def.label, o.icon ?? def.icon, onClick, {\n      title: o.title ?? def.title,\n      className: o.className,\n      action,\n    });\n  };\n\n  const customButtons = (cfg.custom ?? []).map((item) =>\n    toolBtn(item.label ?? '', item.icon ?? '', () => item.onClick(ctx.table), {\n      title: item.title ?? item.label,\n      className: item.className,\n      action: item.id,\n    }),\n  );\n\n  if (cfg.customPosition === 'start') bar.append(...customButtons);\n\n  const fields = resolve('fields', defaults.fields);\n  if (fields) bar.append(fields);\n  const format = resolve('format', defaults.format);\n  if (format) bar.append(format);\n  const conditional = resolve('conditional', defaults.conditional);\n  if (conditional) bar.append(conditional);\n\n  const layout = layoutControl(ctx, cfg.layout, t);\n  if (layout) bar.append(layout);\n\n  const exportEl = exportControl(ctx, cfg.export, t);\n  if (exportEl) bar.append(exportEl);\n\n  // Undo / redo / copy are opt-in (hidden unless explicitly enabled).\n  const undo = resolve('undo', defaults.undo, false);\n  if (undo) bar.append(undo);\n  const redo = resolve('redo', defaults.redo, false);\n  if (redo) bar.append(redo);\n  const copy = resolve('copy', defaults.copy, false);\n  if (copy) bar.append(copy);\n\n  bar.append(spacer());\n\n  const fullscreen = resolve('fullscreen', defaults.fullscreen);\n  if (fullscreen) bar.append(fullscreen);\n\n  if (cfg.customPosition !== 'start') bar.append(...customButtons);\n\n  container.append(bar);\n}\n\ninterface BtnOpts {\n  title?: string;\n  className?: string;\n  action?: string;\n}\n\nfunction toolBtn(label: string, icon: string, onClick: () => void, opts: BtnOpts = {}): HTMLElement {\n  return h('button', {\n    class: `ph-tool-btn${opts.className ? ` ${opts.className}` : ''}`,\n    html: `${icon}${label ? `<span>${escapeHtml(label)}</span>` : ''}`,\n    title: opts.title ?? label,\n    attrs: { type: 'button', 'data-action': opts.action },\n    on: { click: onClick },\n  });\n}\n\nfunction escapeHtml(s: string): string {\n  return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nfunction spacer(): HTMLElement {\n  return h('span', { class: 'ph-tool-spacer' });\n}\n\nfunction layoutControl(\n  ctx: PivotContext,\n  raw: boolean | ActionBarButtonConfig | undefined,\n  t: UIStrings,\n): HTMLElement | null {\n  if (raw === false) return null;\n  const o: ActionBarButtonConfig = typeof raw === 'object' ? raw : {};\n  if (o.visible === false) return null;\n  const current = ctx.engine.getConfiguration().options?.grid?.type ?? 'compact';\n  const sel = h('select', {\n    class: `ph-tool-select${o.className ? ` ${o.className}` : ''}`,\n    title: o.title ?? t.layout,\n    attrs: { 'data-action': 'layout', 'aria-label': t.layout },\n  }) as HTMLSelectElement;\n  for (const [value, label] of [\n    ['compact', t.compact],\n    ['classic', t.classic],\n    ['flat', t.flat],\n  ] as Array<[GridType, string]>) {\n    const opt = h('option', { text: label, attrs: { value } });\n    if (value === current) opt.selected = true;\n    sel.append(opt);\n  }\n  sel.addEventListener('change', () =>\n    ctx.engine.setOptions({\n      grid: { ...ctx.engine.getConfiguration().options?.grid, type: sel.value as GridType },\n    }),\n  );\n  return sel;\n}\n\nfunction exportControl(\n  ctx: PivotContext,\n  raw: boolean | ActionBarButtonConfig | undefined,\n  t: UIStrings,\n): HTMLElement | null {\n  if (raw === false) return null;\n  const o: ActionBarButtonConfig = typeof raw === 'object' ? raw : {};\n  if (o.visible === false) return null;\n\n  // A custom onClick turns Export into a plain button (no menu).\n  if (o.onClick) {\n    return toolBtn(o.label ?? t.export, o.icon ?? ICONS.export, () => o.onClick!(ctx.table), {\n      title: o.title ?? t.export,\n      className: o.className,\n      action: 'export',\n    });\n  }\n\n  const wrap = h('div', { class: 'ph-menu-wrap' });\n  const menu = h('div', { class: 'ph-menu', attrs: { hidden: true } });\n  const items: Array<[string, () => void]> = [\n    [t.toCSV, () => downloadExport(ctx.engine.getGrid(), 'csv')],\n    [t.toExcel, () => downloadExport(ctx.engine.getGrid(), 'excel')],\n    [t.toHTML, () => downloadExport(ctx.engine.getGrid(), 'html')],\n    [t.toJSON, () => downloadExport(ctx.engine.getGrid(), 'json')],\n    [t.printPdf, () => printGrid(ctx.engine.getGrid())],\n  ];\n  for (const [label, action] of items) {\n    menu.append(\n      h('button', {\n        class: 'ph-menu-item',\n        text: label,\n        attrs: { type: 'button' },\n        on: {\n          click: () => {\n            action();\n            menu.hidden = true;\n          },\n        },\n      }),\n    );\n  }\n  const btn = toolBtn(o.label ?? t.export, o.icon ?? ICONS.export, () => {\n    menu.hidden = !menu.hidden;\n  }, { title: o.title ?? t.export, className: o.className, action: 'export' });\n  document.addEventListener('click', (e) => {\n    if (!wrap.contains(e.target as Node)) menu.hidden = true;\n  });\n  wrap.append(btn, menu);\n  return wrap;\n}\n\nexport type { ExportFormat };\n","import type { DataValue, FieldFilter, MemberFilter, SliceField } from '@pvotly/core';\nimport type { PivotContext } from '../context';\nimport { h } from '../dom';\nimport { resolveStrings } from '../i18n';\n\nfunction currentFilter(ctx: PivotContext, uniqueName: string): FieldFilter | undefined {\n  const s = ctx.engine.getSlice();\n  const all = [...(s.rows ?? []), ...(s.columns ?? []), ...(s.reportFilters ?? [])] as SliceField[];\n  return all.find((f) => f.uniqueName === uniqueName)?.filter;\n}\n\n/** Open a member-checklist + value/label filter dialog for a field. */\nexport function openFilterDialog(ctx: PivotContext, uniqueName: string): void {\n  const engine = ctx.engine;\n  const t = resolveStrings(engine.getConfiguration().localization);\n  const members = engine.getMembers(uniqueName);\n  const caption = engine.getDataset().fieldCaption(uniqueName);\n  const existing = currentFilter(ctx, uniqueName);\n  let activePane: 'members' | 'value' = 'members';\n\n  const included = new Set<string>();\n  const keyOf = (v: DataValue) => (v instanceof Date ? `d${v.getTime()}` : String(v));\n  if (existing?.type === 'members') {\n    const mf = existing as MemberFilter;\n    if (mf.include) mf.include.forEach((v) => included.add(keyOf(v)));\n    else {\n      members.forEach((v) => included.add(keyOf(v)));\n      (mf.exclude ?? []).forEach((v) => included.delete(keyOf(v)));\n    }\n  } else {\n    members.forEach((v) => included.add(keyOf(v)));\n  }\n\n  const content = h('div', { class: 'ph-filter-dialog' });\n\n  // Tabs\n  const tabBar = h('div', { class: 'ph-tabs' });\n  const panes = h('div', { class: 'ph-tab-panes' });\n  const tabs: Array<{ name: string; pane: HTMLElement }> = [];\n  const addTab = (name: string, key: 'members' | 'value', pane: HTMLElement, active = false) => {\n    const btn = h('button', {\n      class: `ph-tab${active ? ' ph-active' : ''}`,\n      text: name,\n      attrs: { type: 'button' },\n      on: {\n        click: () => {\n          activePane = key;\n          tabBar.querySelectorAll('.ph-tab').forEach((el) => el.classList.remove('ph-active'));\n          panes.querySelectorAll('.ph-tab-pane').forEach((p) => ((p as HTMLElement).style.display = 'none'));\n          btn.classList.add('ph-active');\n          pane.style.display = '';\n        },\n      },\n    });\n    pane.classList.add('ph-tab-pane');\n    pane.style.display = active ? '' : 'none';\n    tabBar.append(btn);\n    panes.append(pane);\n    tabs.push({ name, pane });\n  };\n\n  // ---- Members pane ----\n  const membersPane = h('div', {});\n  const search = h('input', {\n    class: 'ph-input',\n    attrs: { type: 'search', placeholder: t.searchMembers },\n  }) as HTMLInputElement;\n  const list = h('div', { class: 'ph-member-list' });\n  const checks = new Map<string, HTMLInputElement>();\n  const renderMembers = (q: string) => {\n    list.replaceChildren();\n    for (const m of members) {\n      const cap = engine.getDataset().memberCaption(uniqueName, m);\n      if (q && !cap.toLowerCase().includes(q.toLowerCase())) continue;\n      const k = keyOf(m);\n      const cb = h('input', { attrs: { type: 'checkbox' } }) as HTMLInputElement;\n      cb.checked = included.has(k);\n      cb.addEventListener('change', () => (cb.checked ? included.add(k) : included.delete(k)));\n      checks.set(k, cb);\n      list.append(h('label', { class: 'ph-member' }, cb, h('span', { text: cap })));\n    }\n  };\n  search.addEventListener('input', () => renderMembers(search.value));\n  renderMembers('');\n\n  const selAll = h('button', {\n    class: 'ph-btn ph-btn-sm',\n    text: t.selectAll,\n    attrs: { type: 'button' },\n    on: {\n      click: () => {\n        members.forEach((m) => included.add(keyOf(m)));\n        renderMembers(search.value);\n      },\n    },\n  });\n  const clearAll = h('button', {\n    class: 'ph-btn ph-btn-sm',\n    text: t.clear,\n    attrs: { type: 'button' },\n    on: {\n      click: () => {\n        included.clear();\n        renderMembers(search.value);\n      },\n    },\n  });\n  membersPane.append(search, h('div', { class: 'ph-member-actions' }, selAll, clearAll), list);\n  addTab(t.members, 'members', membersPane, true);\n\n  // ---- Value (Top N) pane ----\n  const valuePane = h('div', { class: 'ph-value-filter' });\n  const measures = engine.getSlice().measures ?? [];\n  const measureSel = h('select', { class: 'ph-input' }) as HTMLSelectElement;\n  for (const m of measures) measureSel.append(h('option', { text: m.caption ?? m.uniqueName, attrs: { value: m.uniqueName } }));\n  const opSel = h('select', { class: 'ph-input' }) as HTMLSelectElement;\n  for (const op of ['top', 'bottom', 'greater', 'less', 'greaterEqual', 'lessEqual', 'equal']) {\n    opSel.append(h('option', { text: op, attrs: { value: op } }));\n  }\n  const numInput = h('input', { class: 'ph-input', attrs: { type: 'number', value: '10' } }) as HTMLInputElement;\n  valuePane.append(\n    h('p', { class: 'ph-hint', text: t.keepMembersByValue }),\n    h('div', { class: 'ph-row' }, opSel, numInput),\n    h('div', { class: 'ph-row' }, h('span', { text: t.by }), measureSel),\n  );\n  if (measures.length) addTab(t.value, 'value', valuePane);\n\n  // ---- Footer ----\n  const footer = h('div', { class: 'ph-dialog-footer' });\n  const apply = h('button', {\n    class: 'ph-btn ph-btn-primary',\n    text: t.apply,\n    attrs: { type: 'button' },\n    on: {\n      click: () => {\n        if (activePane === 'value' && measures.length) {\n          const count = Number(numInput.value) || 0;\n          const op = opSel.value as never;\n          const measure = measureSel.value;\n          const query =\n            op === 'top' || op === 'bottom'\n              ? { op, count }\n              : { op, value: count };\n          engine.setFilter(uniqueName, { type: 'value', measure, query } as FieldFilter);\n        } else {\n          const total = members.length;\n          if (included.size === total) engine.clearFilter(uniqueName);\n          else {\n            const include = members.filter((m) => included.has(keyOf(m)));\n            engine.setFilter(uniqueName, { type: 'members', include });\n          }\n        }\n        ctx.closeDialog();\n      },\n    },\n  });\n  const clearBtn = h('button', {\n    class: 'ph-btn',\n    text: t.clearFilter,\n    attrs: { type: 'button' },\n    on: {\n      click: () => {\n        engine.clearFilter(uniqueName);\n        ctx.closeDialog();\n      },\n    },\n  });\n  const cancel = h('button', {\n    class: 'ph-btn',\n    text: t.cancel,\n    attrs: { type: 'button' },\n    on: { click: () => ctx.closeDialog() },\n  });\n  footer.append(clearBtn, cancel, apply);\n\n  content.append(tabBar, panes, footer);\n  ctx.openDialog(content, `${t.filterTitle}: ${caption}`);\n}\n","import type { AggregationType, FieldInfo, MeasureConfig, SliceField } from '@pvotly/core';\nimport { AGGREGATION_LABELS } from '@pvotly/core';\nimport type { PivotContext } from '../context';\nimport type { Axis } from '@pvotly/core';\nimport { ICONS } from '../icons';\nimport { clear, h } from '../dom';\nimport { resolveStrings, type UIStrings } from '../i18n';\nimport { openFilterDialog } from '../dialogs/filterDialog';\n\nconst DND_TYPE = 'text/pivot-field';\n\ninterface AreaDef {\n  axis: Axis;\n  label: string;\n}\n\n/** Render the drag-and-drop configurator panel. */\nexport function mountFieldList(ctx: PivotContext, container: HTMLElement): void {\n  const engine = ctx.engine;\n  const slice = engine.getSlice();\n  const fields = engine.getFields();\n  const t = resolveStrings(engine.getConfiguration().localization);\n  const areas: AreaDef[] = [\n    { axis: 'reportFilters', label: t.reportFilters },\n    { axis: 'columns', label: t.columns },\n    { axis: 'rows', label: t.rows },\n    { axis: 'measures', label: t.values },\n  ];\n\n  const used = new Set<string>([\n    ...(slice.rows ?? []).map((f) => f.uniqueName),\n    ...(slice.columns ?? []).map((f) => f.uniqueName),\n    ...(slice.reportFilters ?? []).map((f) => f.uniqueName),\n    ...(slice.measures ?? []).map((m) => m.uniqueName),\n  ]);\n  const available = fields.filter((f) => !used.has(f.uniqueName));\n\n  clear(container);\n  const panel = h('div', { class: 'ph-fieldlist' });\n\n  panel.append(h('div', { class: 'ph-fl-title', text: t.fields }));\n\n  // Available fields\n  const allBox = h('div', { class: 'ph-fl-available', attrs: { 'data-axis': 'available' } });\n  for (const f of available) {\n    allBox.append(makeFieldChip(ctx, f, t));\n  }\n  wireDropZone(ctx, allBox, 'available');\n  panel.append(allBox);\n\n  // Drop areas\n  const areasWrap = h('div', { class: 'ph-fl-areas' });\n  for (const area of areas) {\n    const box = h('div', { class: 'ph-fl-area', attrs: { 'data-axis': area.axis } });\n    const label = h('div', { class: 'ph-fl-area-label', html: `${ICONS.grip} ${escapeHtml(area.label)}` });\n    if (area.axis === 'measures') label.append(valuesAxisToggle(ctx, t));\n    box.append(label);\n    const items = h('div', { class: 'ph-fl-items' });\n\n    if (area.axis === 'measures') {\n      for (const m of slice.measures ?? []) items.append(makeMeasureChip(ctx, m, t));\n    } else {\n      const list = (slice[area.axis] ?? []) as SliceField[];\n      for (const sf of list) {\n        const info = fields.find((f) => f.uniqueName === sf.uniqueName);\n        items.append(makeAxisChip(ctx, sf, area.axis, info, t));\n      }\n    }\n    wireDropZone(ctx, items, area.axis);\n    box.append(items);\n    areasWrap.append(box);\n  }\n  panel.append(areasWrap);\n  container.append(panel);\n}\n\nfunction escapeHtml(s: string): string {\n  return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/** A small \"Values on columns / rows\" axis switch shown in the Values area. */\nfunction valuesAxisToggle(ctx: PivotContext, t: UIStrings): HTMLElement {\n  const axis = ctx.table.getValuesAxis();\n  const onRows = axis === 'rows';\n  return h('button', {\n    class: `ph-fl-axis-toggle${onRows ? ' ph-active' : ''}`,\n    html: ICONS.grid,\n    title: onRows ? t.valuesAsColumns : t.valuesAsRows,\n    attrs: { type: 'button', 'aria-label': onRows ? t.valuesAsColumns : t.valuesAsRows, 'aria-pressed': onRows ? 'true' : 'false' },\n    on: {\n      click: (e) => {\n        e.stopPropagation();\n        ctx.table.setValuesAxis(onRows ? 'columns' : 'rows');\n      },\n    },\n  });\n}\n\nfunction makeFieldChip(ctx: PivotContext, f: FieldInfo, t: UIStrings): HTMLElement {\n  const chip = h('div', {\n    class: `ph-chip ph-chip-available${f.isMeasure ? ' ph-chip-measure' : ''}`,\n    attrs: { draggable: 'true', 'data-field': f.uniqueName },\n    title: t.dragToArea,\n  });\n  chip.append(h('span', { class: 'ph-chip-label', text: f.caption }));\n  wireDrag(chip, f.uniqueName);\n  chip.addEventListener('dblclick', () => {\n    ctx.engine.setFieldAxis(f.uniqueName, f.isMeasure ? 'measures' : 'rows');\n  });\n  return chip;\n}\n\nfunction makeAxisChip(\n  ctx: PivotContext,\n  sf: SliceField,\n  axis: Axis,\n  info: FieldInfo | undefined,\n  t: UIStrings,\n): HTMLElement {\n  const chip = h('div', {\n    class: 'ph-chip ph-chip-axis',\n    attrs: { draggable: 'true', 'data-field': sf.uniqueName },\n  });\n  chip.append(h('span', { class: 'ph-chip-label', text: info?.caption ?? sf.uniqueName }));\n\n  if (axis === 'rows' || axis === 'columns') {\n    const dir = sf.sort ?? 'asc';\n    chip.append(\n      h('button', {\n        class: 'ph-chip-btn',\n        html: dir === 'desc' ? ICONS.sortDesc : ICONS.sortAsc,\n        title: `${t.sort} (${dir})`,\n        attrs: { type: 'button' },\n        on: {\n          click: (e) => {\n            e.stopPropagation();\n            const next: SliceField['sort'] = dir === 'asc' ? 'desc' : dir === 'desc' ? 'unsorted' : 'asc';\n            ctx.engine.sortField(sf.uniqueName, next);\n          },\n        },\n      }),\n    );\n  }\n\n  chip.append(\n    h('button', {\n      class: `ph-chip-btn${sf.filter ? ' ph-active' : ''}`,\n      html: ICONS.filter,\n      title: t.filter,\n      attrs: { type: 'button' },\n      on: {\n        click: (e) => {\n          e.stopPropagation();\n          openFilterDialog(ctx, sf.uniqueName);\n        },\n      },\n    }),\n  );\n  chip.append(removeBtn(ctx, sf.uniqueName, t));\n  wireDrag(chip, sf.uniqueName);\n  return chip;\n}\n\nfunction makeMeasureChip(ctx: PivotContext, m: MeasureConfig, t: UIStrings): HTMLElement {\n  const chip = h('div', {\n    class: 'ph-chip ph-chip-value',\n    attrs: { draggable: 'true', 'data-field': m.uniqueName },\n  });\n  chip.append(h('span', { class: 'ph-chip-label', text: m.caption ?? m.uniqueName }));\n\n  if (!m.formula) {\n    const select = h('select', { class: 'ph-agg-select', title: t.aggregation });\n    for (const [type, label] of Object.entries(AGGREGATION_LABELS)) {\n      const opt = h('option', { text: label, attrs: { value: type } });\n      if ((m.aggregation ?? 'sum') === type) opt.selected = true;\n      select.append(opt);\n    }\n    select.addEventListener('change', () =>\n      ctx.engine.setAggregation(m.uniqueName, select.value as AggregationType),\n    );\n    select.addEventListener('click', (e) => e.stopPropagation());\n    chip.append(select);\n  } else {\n    chip.append(h('span', { class: 'ph-chip-formula', text: 'ƒx', title: m.formula }));\n  }\n  chip.append(removeBtn(ctx, m.uniqueName, t));\n  wireDrag(chip, m.uniqueName);\n  return chip;\n}\n\nfunction removeBtn(ctx: PivotContext, uniqueName: string, t: UIStrings): HTMLElement {\n  return h('button', {\n    class: 'ph-chip-btn ph-chip-remove',\n    html: ICONS.remove,\n    title: t.remove,\n    attrs: { type: 'button' },\n    on: {\n      click: (e) => {\n        e.stopPropagation();\n        ctx.engine.removeField(uniqueName);\n      },\n    },\n  });\n}\n\nfunction wireDrag(el: HTMLElement, field: string): void {\n  el.addEventListener('dragstart', (e) => {\n    e.dataTransfer?.setData(DND_TYPE, field);\n    e.dataTransfer?.setData('text/plain', field);\n    if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n    el.classList.add('ph-dragging');\n  });\n  el.addEventListener('dragend', () => el.classList.remove('ph-dragging'));\n}\n\nfunction wireDropZone(ctx: PivotContext, zone: HTMLElement, axis: Axis | 'available'): void {\n  zone.addEventListener('dragover', (e) => {\n    e.preventDefault();\n    if (e.dataTransfer) e.dataTransfer.dropEffect = 'move';\n    zone.classList.add('ph-drop-hover');\n  });\n  zone.addEventListener('dragleave', () => zone.classList.remove('ph-drop-hover'));\n  zone.addEventListener('drop', (e) => {\n    e.preventDefault();\n    zone.classList.remove('ph-drop-hover');\n    const field = e.dataTransfer?.getData(DND_TYPE) || e.dataTransfer?.getData('text/plain');\n    if (!field) return;\n    const index = dropIndex(zone, e.clientY);\n    if (axis === 'available') ctx.engine.removeField(field);\n    else ctx.engine.setFieldAxis(field, axis, index);\n  });\n}\n\n/** Compute the insertion index from the pointer position within a zone. */\nfunction dropIndex(zone: HTMLElement, clientY: number): number | undefined {\n  const chips = [...zone.querySelectorAll('.ph-chip')] as HTMLElement[];\n  for (let i = 0; i < chips.length; i++) {\n    const rect = chips[i]!.getBoundingClientRect();\n    if (clientY < rect.top + rect.height / 2) return i;\n  }\n  return undefined;\n}\n","import type { FieldInfo, MeasureConfig, Slice, SliceField } from '@pvotly/core';\nimport { AGGREGATION_LABELS } from '@pvotly/core';\nimport type { PivotContext } from '../context';\nimport { ICONS } from '../icons';\nimport { clear, h } from '../dom';\nimport { resolveStrings } from '../i18n';\n\nconst DND = 'text/pivot-field';\n\ntype ZoneKey = 'reportFilters' | 'columns' | 'rows' | 'measures';\n\ninterface Draft {\n  reportFilters: SliceField[];\n  columns: SliceField[];\n  rows: SliceField[];\n  measures: MeasureConfig[];\n}\n\nfunction cloneDraft(slice: Slice): Draft {\n  const c = <T>(v: T[] | undefined): T[] => (v ? v.map((x) => ({ ...x })) : []);\n  return {\n    reportFilters: c(slice.reportFilters),\n    columns: c(slice.columns),\n    rows: c(slice.rows),\n    measures: c(slice.measures),\n  };\n}\n\n/**\n * The modal \"Fields\" configurator: an all-fields checklist (with expandable\n * date parts, measure markers and a search box) plus the four drop zones\n * (Report Filters / Columns / Rows / Values) with drag-drop + reorder, and\n * Apply/Cancel that commit or discard against a working copy of the slice.\n */\nexport function openFieldsDialog(ctx: PivotContext): void {\n  const engine = ctx.engine;\n  const t = resolveStrings(engine.getConfiguration().localization);\n  const ZONES: Array<{ key: ZoneKey; label: string }> = [\n    { key: 'reportFilters', label: t.reportFilters },\n    { key: 'columns', label: t.columns },\n    { key: 'rows', label: t.rows },\n    { key: 'measures', label: t.values },\n  ];\n  const all = engine.getFields();\n  const byName = new Map<string, FieldInfo>(all.map((f) => [f.uniqueName, f]));\n  const draft = cloneDraft(engine.getSlice());\n\n  const bases = all.filter((f) => !f.part);\n  const childrenOf = (name: string) => all.filter((f) => f.part && f.field === name);\n\n  const expandedGroups = new Set<string>();\n  let search = '';\n\n  const content = h('div', { class: 'ph-fields-dialog' });\n\n  /* ---- draft helpers ------------------------------------------------- */\n\n  const indexIn = (key: ZoneKey, name: string) =>\n    (draft[key] as Array<{ uniqueName: string }>).findIndex((e) => e.uniqueName === name);\n\n  const zoneOf = (name: string): ZoneKey | null => {\n    for (const z of ZONES) if (indexIn(z.key, name) >= 0) return z.key;\n    return null;\n  };\n\n  const captionOf = (name: string) => byName.get(name)?.caption ?? name;\n\n  const makeMeasure = (name: string): MeasureConfig => {\n    const info = byName.get(name);\n    return {\n      uniqueName: name,\n      caption: info?.caption,\n      aggregation: info?.aggregation ?? (info?.isMeasure ? 'sum' : 'count'),\n    };\n  };\n\n  const removeEverywhere = (name: string) => {\n    for (const z of ZONES) {\n      const i = indexIn(z.key, name);\n      if (i >= 0) (draft[z.key] as unknown[]).splice(i, 1);\n    }\n  };\n\n  const placeIn = (key: ZoneKey, name: string, index?: number) => {\n    removeEverywhere(name);\n    const entry: SliceField | MeasureConfig =\n      key === 'measures' ? makeMeasure(name) : { uniqueName: name };\n    const arr = draft[key] as Array<SliceField | MeasureConfig>;\n    if (index == null || index < 0 || index >= arr.length) arr.push(entry);\n    else arr.splice(index, 0, entry);\n  };\n\n  const toggleActive = (name: string) => {\n    const z = zoneOf(name);\n    if (z) removeEverywhere(name);\n    else placeIn(byName.get(name)?.isMeasure ? 'measures' : 'rows', name);\n    render();\n  };\n\n  const reorder = (key: ZoneKey, index: number, dir: -1 | 1) => {\n    const arr = draft[key] as unknown[];\n    const j = index + dir;\n    if (j < 0 || j >= arr.length) return;\n    [arr[index], arr[j]] = [arr[j], arr[index]];\n    render();\n  };\n\n  /* ---- left: all fields --------------------------------------------- */\n\n  function fieldRow(info: FieldInfo, child = false): HTMLElement {\n    const active = zoneOf(info.uniqueName) != null;\n    const row = h('div', {\n      class: `ph-ff-row${child ? ' ph-ff-child' : ''}${active ? ' ph-ff-active' : ''}`,\n      attrs: { draggable: 'true', 'data-field': info.uniqueName },\n    });\n    row.addEventListener('dragstart', (e) => {\n      e.dataTransfer?.setData(DND, info.uniqueName);\n      if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n    });\n\n    const kids = child ? [] : childrenOf(info.uniqueName);\n    const chevron = h('button', {\n      class: `ph-ff-chevron${kids.length ? '' : ' ph-ff-chevron-hidden'}`,\n      html: expandedGroups.has(info.uniqueName) ? ICONS.expand : ICONS.collapse,\n      attrs: { type: 'button', 'aria-label': t.expand },\n      on: {\n        click: (e) => {\n          e.stopPropagation();\n          if (expandedGroups.has(info.uniqueName)) expandedGroups.delete(info.uniqueName);\n          else expandedGroups.add(info.uniqueName);\n          render();\n        },\n      },\n    });\n\n    const check = h('input', { class: 'ph-ff-check', attrs: { type: 'checkbox' } }) as HTMLInputElement;\n    check.checked = active;\n    check.addEventListener('change', () => toggleActive(info.uniqueName));\n\n    row.append(\n      chevron,\n      check,\n      h('span', { class: 'ph-ff-label', text: info.caption }),\n      h('span', { class: 'ph-ff-spacer' }),\n    );\n    if (info.isMeasure) {\n      row.append(h('span', { class: 'ph-ff-sigma', text: 'Σ', title: t.measure }));\n    }\n    row.append(h('span', { class: 'ph-ff-grip', html: ICONS.grip }));\n    return row;\n  }\n\n  function leftPanel(): HTMLElement {\n    const panel = h('div', { class: 'ph-ff-panel' });\n\n    const head = h('div', { class: 'ph-ff-head' });\n    const titleCol = h(\n      'div',\n      {},\n      h('div', { class: 'ph-ff-head-title', text: t.allFields }),\n      h('button', {\n        class: 'ph-ff-expandall',\n        text: expandedGroups.size ? t.collapseAll : t.expandAll,\n        attrs: { type: 'button' },\n        on: {\n          click: () => {\n            if (expandedGroups.size) expandedGroups.clear();\n            else for (const b of bases) if (childrenOf(b.uniqueName).length) expandedGroups.add(b.uniqueName);\n            render();\n          },\n        },\n      }),\n    );\n    const searchBox = h('input', {\n      class: 'ph-ff-search',\n      attrs: { type: 'search', placeholder: t.search, 'aria-label': t.searchFields },\n    }) as HTMLInputElement;\n    searchBox.value = search;\n    searchBox.addEventListener('input', () => {\n      search = searchBox.value;\n      renderList();\n    });\n    head.append(titleCol, h('span', { class: 'ph-ff-search-wrap' }, h('span', { class: 'ph-ff-search-icon', html: ICONS.filter }), searchBox));\n\n    const list = h('div', { class: 'ph-ff-list' });\n    const renderList = () => {\n      clear(list);\n      const term = search.trim().toLowerCase();\n      for (const base of bases) {\n        const kids = childrenOf(base.uniqueName);\n        const matches =\n          !term ||\n          base.caption.toLowerCase().includes(term) ||\n          kids.some((k) => k.caption.toLowerCase().includes(term));\n        if (!matches) continue;\n        list.append(fieldRow(base));\n        if (expandedGroups.has(base.uniqueName)) {\n          for (const k of kids) list.append(fieldRow(k, true));\n        }\n      }\n      if (!list.childNodes.length) list.append(h('div', { class: 'ph-ff-empty', text: t.noMatchingFields }));\n    };\n    renderList();\n\n    // Dropping back onto the field list removes a field from all zones.\n    makeDropZone(list, (name) => {\n      removeEverywhere(name);\n      render();\n    });\n\n    panel.append(head, list);\n    return panel;\n  }\n\n  /* ---- right: zones -------------------------------------------------- */\n\n  function zoneChip(key: ZoneKey, entry: { uniqueName: string }, index: number, total: number): HTMLElement {\n    const labels = AGGREGATION_LABELS as Record<string, string>;\n    const aggName = String((entry as MeasureConfig).aggregation ?? 'sum');\n    const label =\n      key === 'measures'\n        ? `${labels[aggName] ?? aggName} of ${captionOf(entry.uniqueName)}`\n        : captionOf(entry.uniqueName);\n    const chip = h('div', {\n      class: 'ph-zone-chip',\n      attrs: { draggable: 'true', 'data-field': entry.uniqueName },\n    });\n    chip.addEventListener('dragstart', (e) => {\n      e.dataTransfer?.setData(DND, entry.uniqueName);\n      if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n    });\n    chip.append(\n      h('span', { class: 'ph-zone-chip-label', text: label }),\n      h(\n        'span',\n        { class: 'ph-zone-chip-arrows' },\n        arrow(key, index, -1, index === 0),\n        arrow(key, index, 1, index === total - 1),\n        h('button', {\n          class: 'ph-zone-remove',\n          html: ICONS.close,\n          attrs: { type: 'button', 'aria-label': t.remove },\n          on: {\n            click: () => {\n              removeEverywhere(entry.uniqueName);\n              render();\n            },\n          },\n        }),\n      ),\n    );\n    return chip;\n  }\n\n  function arrow(key: ZoneKey, index: number, dir: -1 | 1, disabled: boolean): HTMLElement {\n    return h('button', {\n      class: `ph-zone-arrow${disabled ? ' ph-disabled' : ''}`,\n      html: dir === -1 ? ICONS.sortAsc : ICONS.sortDesc,\n      attrs: { type: 'button', 'aria-label': dir === -1 ? t.moveUp : t.moveDown, disabled },\n      on: { click: () => !disabled && reorder(key, index, dir) },\n    });\n  }\n\n  function zoneBox(def: { key: ZoneKey; label: string }): HTMLElement {\n    const entries = draft[def.key] as Array<{ uniqueName: string }>;\n    const box = h('div', { class: 'ph-zone' });\n    box.append(\n      h(\n        'div',\n        { class: 'ph-zone-head' },\n        h('span', { text: def.label }),\n        entries.length ? h('span', { class: 'ph-zone-count', text: String(entries.length) }) : false,\n      ),\n    );\n    const body = h('div', { class: 'ph-zone-body' });\n    entries.forEach((e, i) => body.append(zoneChip(def.key, e, i, entries.length)));\n    body.append(h('div', { class: 'ph-zone-placeholder', text: t.dropFieldHere }));\n    makeDropZone(body, (name, e) => {\n      placeIn(def.key, name, dropIndex(body, e));\n      render();\n    });\n    box.append(body);\n    return box;\n  }\n\n  function zonesPanel(): HTMLElement {\n    const grid = h('div', { class: 'ph-zones' });\n    for (const z of ZONES) grid.append(zoneBox(z));\n    return grid;\n  }\n\n  /* ---- shared drop wiring ------------------------------------------- */\n\n  function makeDropZone(el: HTMLElement, onDrop: (name: string, e: DragEvent) => void): void {\n    el.addEventListener('dragover', (e) => {\n      e.preventDefault();\n      if (e.dataTransfer) e.dataTransfer.dropEffect = 'move';\n      el.classList.add('ph-drop-hover');\n    });\n    el.addEventListener('dragleave', (e) => {\n      if (!el.contains(e.relatedTarget as Node)) el.classList.remove('ph-drop-hover');\n    });\n    el.addEventListener('drop', (e) => {\n      e.preventDefault();\n      el.classList.remove('ph-drop-hover');\n      const name = e.dataTransfer?.getData(DND) || e.dataTransfer?.getData('text/plain');\n      if (name) onDrop(name, e);\n    });\n  }\n\n  /** Insertion index within a zone based on the pointer's vertical position. */\n  function dropIndex(zone: HTMLElement, e: DragEvent): number | undefined {\n    const chips = [...zone.querySelectorAll('.ph-zone-chip')] as HTMLElement[];\n    for (let i = 0; i < chips.length; i++) {\n      const r = chips[i]!.getBoundingClientRect();\n      if (e.clientY < r.top + r.height / 2) return i;\n    }\n    return undefined;\n  }\n\n  /* ---- render -------------------------------------------------------- */\n\n  function render(): void {\n    clear(content);\n    content.append(\n      h('p', { class: 'ph-ff-subtitle', text: t.dragAndDrop }),\n      h('div', { class: 'ph-fields-grid' }, leftPanel(), zonesPanel()),\n      h(\n        'div',\n        { class: 'ph-dialog-footer' },\n        h('button', {\n          class: 'ph-btn',\n          text: t.cancel,\n          attrs: { type: 'button' },\n          on: { click: () => ctx.closeDialog() },\n        }),\n        h('button', {\n          class: 'ph-btn ph-btn-primary',\n          text: t.apply,\n          attrs: { type: 'button' },\n          on: {\n            click: () => {\n              engine.setSlice({ ...engine.getSlice(), ...draft });\n              ctx.closeDialog();\n            },\n          },\n        }),\n      ),\n    );\n  }\n\n  render();\n  ctx.openDialog(content, t.fieldsTitle, { width: '900px' });\n}\n","import type { HeaderNode, MeasureConfig, PivotConfiguration, PivotGrid } from '@pvotly/core';\n\n/**\n * A flattened, windowing-friendly view of a {@link PivotGrid}. This is the\n * single source of truth the renderer (table + virtualized paths) programs\n * against: ordered value columns, ordered body rows and the spanning column\n * header matrix — all carrying stable ids so resized widths survive rebuilds.\n */\nexport interface ValueColumn {\n  /** Stable id (column-leaf path + measure) used to persist widths. */\n  id: string;\n  leaf: HeaderNode;\n  /** The measure rendered in this column, or null when there are no measures. */\n  measure: MeasureConfig | null;\n  measureIndex: number;\n}\n\nexport interface BodyRow {\n  /** Stable id (row-node path + measure index). */\n  id: string;\n  node: HeaderNode;\n  /** For measures-on-rows: the measure rendered by this sub-row. */\n  measure?: MeasureConfig;\n  measureIndex: number;\n  /** Whether this row prints the member caption (false for measure sub-rows > 0). */\n  showLabel: boolean;\n  /** Whether this row prints the gutter expander button. */\n  showGutterButton: boolean;\n  isTotal: boolean;\n  isGrandTotal: boolean;\n}\n\nexport interface HeaderCell {\n  node: HeaderNode;\n  caption: string;\n  /** Span measured in column *leaves* (not value columns). */\n  colspan: number;\n  rowspan: number;\n  /** First value-column index covered by this header cell (inclusive). */\n  valueStart: number;\n  /** Last value-column index covered by this header cell (exclusive). */\n  valueEnd: number;\n}\n\nexport interface GridModel {\n  grid: PivotGrid;\n  measures: MeasureConfig[];\n  colLevels: number;\n  rowFieldCount: number;\n  gutter: boolean;\n  measuresOnRows: boolean;\n  showMeasureRow: boolean;\n  rowLabelsCaption: string;\n  gtCaption: string;\n  /** Number of leading (row-header) columns: gutter ? 2 : 1. */\n  leadingCols: number;\n  colLeaves: HeaderNode[];\n  /** Spanning member header rows (length === colLevels). */\n  headerRows: HeaderCell[][];\n  /** The real body columns (one per measure per column-leaf, or per leaf). */\n  valueColumns: ValueColumn[];\n  bodyRows: BodyRow[];\n  empty: boolean;\n}\n\nexport const ALL_NODE: HeaderNode = {\n  uniqueName: '',\n  value: null,\n  caption: '',\n  level: 0,\n  path: [],\n  children: [],\n  expanded: false,\n  leafCount: 1,\n};\n\nexport function grandTotalNode(caption: string): HeaderNode {\n  return { ...ALL_NODE, caption, isGrandTotal: true };\n}\n\n/** Stable key for a header node based on its member path. */\nexport function nodePathKey(node: HeaderNode): string {\n  if (node.isGrandTotal) return '\\u0000GT';\n  if (!node.path.length) return '\\u0000ALL';\n  return node.path.map((p) => `${p.uniqueName}=${valueToken(p.value)}`).join('/');\n}\n\nfunction valueToken(value: unknown): string {\n  if (value instanceof Date) return `d${value.getTime()}`;\n  if (value === null || value === undefined) return '\\u0000';\n  return String(value);\n}\n\n/** Visible nodes for the compact row axis: every node, recursing when expanded. */\nfunction walkRowsCompact(nodes: HeaderNode[], out: HeaderNode[] = []): HeaderNode[] {\n  for (const node of nodes) {\n    out.push(node);\n    if (node.expanded && node.children.length) walkRowsCompact(node.children, out);\n  }\n  return out;\n}\n\n/** Build spanning column-header rows + the ordered visible leaf columns. */\nfunction buildColumnHeader(\n  roots: HeaderNode[],\n  levels: number,\n): { rows: HeaderCell[][]; leaves: HeaderNode[] } {\n  const rows: HeaderCell[][] = Array.from({ length: levels }, () => []);\n  const leaves: HeaderNode[] = [];\n  const rec = (node: HeaderNode): { span: number; start: number } => {\n    const hasKids = node.expanded && node.children.length > 0;\n    if (!hasKids) {\n      const start = leaves.length;\n      leaves.push(node);\n      rows[node.level]?.push({\n        node,\n        caption: node.caption,\n        colspan: 1,\n        rowspan: levels - node.level,\n        valueStart: start,\n        valueEnd: start + 1,\n      });\n      return { span: 1, start };\n    }\n    let span = 0;\n    const start = leaves.length;\n    for (const child of node.children) span += rec(child).span;\n    rows[node.level]?.push({\n      node,\n      caption: node.caption,\n      colspan: span,\n      rowspan: 1,\n      valueStart: start,\n      valueEnd: start + span,\n    });\n    return { span, start };\n  };\n  for (const root of roots) rec(root);\n  return { rows, leaves };\n}\n\n/** Compute the unified, windowing-friendly model from a computed grid. */\nexport function buildGridModel(grid: PivotGrid, config: PivotConfiguration): GridModel {\n  const measures = grid.measures;\n  const colLevels = grid.meta.columnFieldCount;\n  const rowFieldCount = grid.meta.rowFieldCount;\n  const gridOpts = config.options?.grid ?? {};\n  const gtCaption = config.localization?.grandTotal ?? 'Grand Total';\n  const gutter = gridOpts.rowLayout === 'gutter' && rowFieldCount > 0;\n  // Honor either the renderer's `options.grid.measurePosition` or core's\n  // top-level `valuesAxis` contract field, whichever is present.\n  const valuesAxis = (config as PivotConfiguration & { valuesAxis?: 'columns' | 'rows' }).valuesAxis;\n  const measuresOnRows =\n    (gridOpts.measurePosition === 'rows' || valuesAxis === 'rows') && measures.length > 0;\n  const rowLabelsCaption = gridOpts.rowLabelsCaption ?? 'Row Labels';\n  const showMeasureRow = measures.length > 0 && !measuresOnRows;\n\n  const hasRowGT = grid.rowLeaves.some((l) => l.isGrandTotal);\n  const hasColGT = grid.columnLeaves.some((l) => l.isGrandTotal);\n\n  // ---- columns / header matrix ----\n  let colLeaves: HeaderNode[];\n  let headerRows: HeaderCell[][];\n  if (colLevels === 0) {\n    colLeaves = [ALL_NODE];\n    headerRows = [];\n  } else {\n    const built = buildColumnHeader(grid.columnTree, colLevels);\n    headerRows = built.rows;\n    colLeaves = built.leaves;\n    if (hasColGT) {\n      const gt = grandTotalNode(gtCaption);\n      const start = colLeaves.length;\n      colLeaves = [...colLeaves, gt];\n      headerRows[0]?.push({\n        node: gt,\n        caption: gtCaption,\n        colspan: 1,\n        rowspan: colLevels,\n        valueStart: start,\n        valueEnd: start + 1,\n      });\n    }\n  }\n\n  // ---- value columns (the real body columns) ----\n  const valueColumns: ValueColumn[] = [];\n  const mult = showMeasureRow ? measures.length : 1;\n  if (measuresOnRows) {\n    colLeaves.forEach((leaf) => {\n      valueColumns.push({\n        id: `c:${nodePathKey(leaf)}`,\n        leaf,\n        measure: measures[0] ?? null,\n        measureIndex: 0,\n      });\n    });\n  } else if (measures.length === 0) {\n    colLeaves.forEach((leaf) => {\n      valueColumns.push({ id: `c:${nodePathKey(leaf)}`, leaf, measure: null, measureIndex: 0 });\n    });\n  } else {\n    colLeaves.forEach((leaf) => {\n      measures.forEach((m, mi) => {\n        valueColumns.push({\n          id: `c:${nodePathKey(leaf)}|m:${m.uniqueName}`,\n          leaf,\n          measure: m,\n          measureIndex: mi,\n        });\n      });\n    });\n  }\n\n  // Re-map header leaf-span ranges from leaf units into value-column units.\n  if (mult !== 1) {\n    for (const row of headerRows) {\n      for (const cell of row) {\n        cell.valueStart *= mult;\n        cell.valueEnd *= mult;\n      }\n    }\n  }\n\n  // ---- body rows ----\n  let rowNodes: HeaderNode[];\n  if (rowFieldCount === 0) {\n    rowNodes = [ALL_NODE];\n  } else {\n    rowNodes = walkRowsCompact(grid.rowTree);\n    if (hasRowGT) rowNodes = [...rowNodes, grandTotalNode(gtCaption)];\n  }\n\n  const bodyRows: BodyRow[] = [];\n  if (measuresOnRows) {\n    for (const node of rowNodes) {\n      measures.forEach((m, mi) => {\n        bodyRows.push({\n          id: `r:${nodePathKey(node)}|m:${mi}`,\n          node,\n          measure: m,\n          measureIndex: mi,\n          showLabel: mi === 0,\n          showGutterButton: mi === 0,\n          isTotal: !!node.isTotal,\n          isGrandTotal: !!node.isGrandTotal,\n        });\n      });\n    }\n  } else {\n    for (const node of rowNodes) {\n      bodyRows.push({\n        id: `r:${nodePathKey(node)}`,\n        node,\n        measureIndex: 0,\n        showLabel: true,\n        showGutterButton: true,\n        isTotal: !!node.isTotal,\n        isGrandTotal: !!node.isGrandTotal,\n      });\n    }\n  }\n\n  const empty = !rowNodes.length || !measures.length;\n\n  return {\n    grid,\n    measures,\n    colLevels,\n    rowFieldCount,\n    gutter,\n    measuresOnRows,\n    showMeasureRow,\n    rowLabelsCaption,\n    gtCaption,\n    leadingCols: gutter ? 2 : 1,\n    colLeaves,\n    headerRows,\n    valueColumns,\n    bodyRows,\n    empty,\n  };\n}\n\n/** Row-header column ids (stable; used for width persistence + freeze). */\nexport const ROWHEAD_COL_ID = '__ph_rowhead__';\nexport const GUTTER_COL_ID = '__ph_gutter__';\n","import type { PivotCell } from '@pvotly/core';\nimport type { GridModel } from './model';\n\n/** A logical body-cell coordinate: row index + value-column index. */\nexport interface CellCoord {\n  r: number;\n  c: number;\n}\n\n/** A normalized inclusive rectangle of body cells. */\nexport interface CellRange {\n  r0: number;\n  c0: number;\n  r1: number;\n  c1: number;\n}\n\n/** Normalize an anchor/focus pair into an inclusive rectangle. */\nexport function normalizeRange(anchor: CellCoord, focus: CellCoord): CellRange {\n  return {\n    r0: Math.min(anchor.r, focus.r),\n    r1: Math.max(anchor.r, focus.r),\n    c0: Math.min(anchor.c, focus.c),\n    c1: Math.max(anchor.c, focus.c),\n  };\n}\n\nexport function rangeContains(range: CellRange | null, r: number, c: number): boolean {\n  if (!range) return false;\n  return r >= range.r0 && r <= range.r1 && c >= range.c0 && c <= range.c1;\n}\n\n/** Resolve the computed {@link PivotCell} at a logical body coordinate. */\nexport function cellAt(model: GridModel, r: number, c: number): PivotCell | null {\n  const row = model.bodyRows[r];\n  const col = model.valueColumns[c];\n  if (!row || !col) return null;\n  const measure = model.measuresOnRows ? row.measure : col.measure;\n  if (!measure) return null;\n  return model.grid.getCell(row.node, col.leaf, measure);\n}\n\n/** Formatted display text for a logical body coordinate. */\nexport function cellText(model: GridModel, r: number, c: number): string {\n  return cellAt(model, r, c)?.formatted ?? '';\n}\n\nexport interface TSVOptions {\n  /** Prepend the row-header caption column(s) and a column-header row. */\n  includeHeaders?: boolean;\n}\n\n/**\n * Serialize a body-cell rectangle as TSV (tab-separated, `\\n` rows) — the\n * clipboard format Excel / Google Sheets paste natively.\n */\nexport function buildTSV(model: GridModel, range: CellRange, options: TSVOptions = {}): string {\n  const lines: string[] = [];\n\n  if (options.includeHeaders) {\n    const header: string[] = [''];\n    for (let c = range.c0; c <= range.c1; c++) {\n      const col = model.valueColumns[c];\n      if (!col) continue;\n      const measureLabel = col.measure ? col.measure.caption ?? col.measure.uniqueName : '';\n      const leafCaption = col.leaf.caption;\n      header.push([leafCaption, measureLabel].filter(Boolean).join(' · '));\n    }\n    lines.push(header.map(escapeTsv).join('\\t'));\n  }\n\n  for (let r = range.r0; r <= range.r1; r++) {\n    const row = model.bodyRows[r];\n    const cells: string[] = [];\n    if (options.includeHeaders) cells.push(escapeTsv(row?.node.caption ?? ''));\n    for (let c = range.c0; c <= range.c1; c++) {\n      cells.push(escapeTsv(cellText(model, r, c)));\n    }\n    lines.push(cells.join('\\t'));\n  }\n\n  return lines.join('\\n');\n}\n\nfunction escapeTsv(value: string): string {\n  // Tabs and newlines would corrupt the grid; quote such cells like a CSV.\n  if (/[\\t\\n\\r\"]/.test(value)) return `\"${value.replace(/\"/g, '\"\"')}\"`;\n  return value;\n}\n\n/** Write text to the clipboard, falling back to a hidden textarea + execCommand. */\nexport async function writeClipboard(text: string): Promise<boolean> {\n  try {\n    if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n      await navigator.clipboard.writeText(text);\n      return true;\n    }\n  } catch {\n    /* fall through to legacy path */\n  }\n  if (typeof document === 'undefined') return false;\n  try {\n    const ta = document.createElement('textarea');\n    ta.value = text;\n    ta.style.position = 'fixed';\n    ta.style.opacity = '0';\n    document.body.appendChild(ta);\n    ta.select();\n    const ok = document.execCommand('copy');\n    ta.remove();\n    return ok;\n  } catch {\n    return false;\n  }\n}\n","/** Pure windowing math for the virtualized renderer. */\n\nexport interface Window {\n  /** First index to render (inclusive). */\n  start: number;\n  /** Last index to render (exclusive). */\n  end: number;\n  /** Pixels of spacer before `start`. */\n  before: number;\n  /** Pixels of spacer after `end`. */\n  after: number;\n}\n\n/** Window a uniform-height list (rows). */\nexport function windowUniform(\n  count: number,\n  itemHeight: number,\n  scroll: number,\n  viewport: number,\n  overscan: number,\n): Window {\n  if (count === 0 || itemHeight <= 0) return { start: 0, end: count, before: 0, after: 0 };\n  let start = Math.floor(scroll / itemHeight) - overscan;\n  let end = Math.ceil((scroll + viewport) / itemHeight) + overscan;\n  start = Math.max(0, start);\n  end = Math.min(count, Math.max(end, start + 1));\n  return {\n    start,\n    end,\n    before: start * itemHeight,\n    after: (count - end) * itemHeight,\n  };\n}\n\n/** Cumulative offsets for a variable-width list. `offsets` has length n+1. */\nexport function cumulativeOffsets(widths: number[]): number[] {\n  const offsets = new Array<number>(widths.length + 1);\n  offsets[0] = 0;\n  for (let i = 0; i < widths.length; i++) offsets[i + 1] = offsets[i]! + widths[i]!;\n  return offsets;\n}\n\n/**\n * Window a variable-width list (columns) given the visible scroll span\n * `[scroll, scroll + viewport]` and a leading dead-zone (frozen columns) of\n * `lead` pixels that always cover the start of the viewport.\n */\nexport function windowVariable(\n  offsets: number[],\n  scroll: number,\n  viewport: number,\n  lead: number,\n  overscanPx: number,\n): Window {\n  const count = offsets.length - 1;\n  if (count === 0) return { start: 0, end: 0, before: 0, after: 0 };\n  const total = offsets[count]!;\n  const viewStart = scroll + lead - overscanPx;\n  const viewEnd = scroll + viewport + overscanPx;\n\n  let start = 0;\n  while (start < count && offsets[start + 1]! <= viewStart) start++;\n  let end = start;\n  while (end < count && offsets[end]! < viewEnd) end++;\n  end = Math.max(end, start + 1);\n  end = Math.min(end, count);\n\n  return {\n    start,\n    end,\n    before: offsets[start]!,\n    after: total - offsets[end]!,\n  };\n}\n","import type { HeaderNode, MeasureConfig, PivotConfiguration, SortDirection } from '@pvotly/core';\nimport type { PivotContext } from '../context';\nimport { ICONS } from '../icons';\nimport { clear, h, on } from '../dom';\nimport { resolveDirection, resolveStrings, type Direction, type UIStrings } from '../i18n';\nimport {\n  buildGridModel,\n  GUTTER_COL_ID,\n  ROWHEAD_COL_ID,\n  type BodyRow,\n  type GridModel,\n  type HeaderCell,\n  type ValueColumn,\n} from './model';\nimport {\n  buildTSV,\n  cellAt,\n  normalizeRange,\n  rangeContains,\n  writeClipboard,\n  type CellCoord,\n  type CellRange,\n} from './selection';\nimport { cumulativeOffsets, windowUniform, windowVariable } from './virtual';\n\nconst DEFAULT_ROW_HEIGHT = 30;\nconst DEFAULT_VALUE_WIDTH = 96;\nconst DEFAULT_ROWHEAD_WIDTH = 180;\nconst DEFAULT_GUTTER_WIDTH = 34;\nconst MIN_COL_WIDTH = 40;\nconst MIN_ROW_HEIGHT = 22;\nconst OVERSCAN_ROWS = 6;\nconst OVERSCAN_PX = 280;\n/** Auto-enable virtualization beyond this many body rows. */\nconst AUTO_VIRT_ROWS = 200;\n/** Auto-window columns beyond this many column leaves (single-level headers only). */\nconst COL_VIRT_LEAVES = 60;\n\n/** Per-container singleton view, so scroll/selection state survives re-renders. */\nconst views = new WeakMap<HTMLElement, GridView>();\n\n/** Render (or update) the crosstab into `container`. Public, stable entry point. */\nexport function renderGrid(ctx: PivotContext, container: HTMLElement): void {\n  let view = views.get(container);\n  if (!view) {\n    view = new GridView(ctx, container);\n    views.set(container, view);\n  }\n  view.update();\n}\n\n/** Copy the current selection (or focused cell) of a rendered grid as TSV. */\nexport function copyGridSelection(container: HTMLElement): Promise<boolean> {\n  const view = views.get(container);\n  return view ? view.copySelection() : Promise.resolve(false);\n}\n\n/**\n * Owns the grid DOM for one container. Holds persistent interaction state\n * (scroll position via the container, selection, focus, in-flight resize) and\n * supports both a plain full-table render and a windowed/virtualized render.\n */\nclass GridView {\n  private readonly ctx: PivotContext;\n  private readonly scroller: HTMLElement;\n  private model!: GridModel;\n  private config!: PivotConfiguration;\n  private t!: UIStrings;\n  private dir: Direction = 'ltr';\n  private virtual = false;\n  private colVirtual = false;\n  private rowHeight = DEFAULT_ROW_HEIGHT;\n\n  // selection / focus (logical body coordinates)\n  private anchor: CellCoord | null = null;\n  private focus: CellCoord | null = null;\n  private range: CellRange | null = null;\n  private dragging = false;\n  private wantFocus = false;\n\n  private rafScheduled = false;\n  private disposers: Array<() => void> = [];\n\n  constructor(ctx: PivotContext, container: HTMLElement) {\n    this.ctx = ctx;\n    this.scroller = container;\n    this.scroller.classList.add('ph-grid-scroller');\n    this.disposers.push(on(this.scroller, 'scroll', () => this.onScroll()));\n  }\n\n  /* ---- lifecycle ----------------------------------------------------- */\n\n  update(): void {\n    const grid = this.ctx.engine.getGrid();\n    this.config = this.ctx.engine.getConfiguration();\n    this.t = resolveStrings(this.config.localization);\n    this.dir = resolveDirection(this.config.localization);\n    this.model = buildGridModel(grid, this.config);\n\n    const rowCount = this.model.bodyRows.length;\n    const leafCount = this.model.colLeaves.length;\n    const explicit = this.config.options?.virtualization === true;\n    this.virtual = explicit || rowCount > AUTO_VIRT_ROWS;\n    // Column windowing only when headers are single-level (alignment-safe).\n    this.colVirtual = this.virtual && this.model.colLevels <= 1 && leafCount > COL_VIRT_LEAVES;\n    this.rowHeight = this.ctx.ui.rowHeight || DEFAULT_ROW_HEIGHT;\n\n    // Clamp selection/focus to the new model bounds.\n    this.clampState();\n    this.scroller.classList.toggle('ph-virtual', this.virtual);\n    this.scroller.setAttribute('dir', this.dir);\n    this.paint();\n  }\n\n  private clampState(): void {\n    const maxR = this.model.bodyRows.length - 1;\n    const maxC = this.model.valueColumns.length - 1;\n    const clamp = (p: CellCoord | null) =>\n      p && maxR >= 0 && maxC >= 0\n        ? { r: Math.min(p.r, maxR), c: Math.min(p.c, maxC) }\n        : null;\n    this.anchor = clamp(this.anchor);\n    this.focus = clamp(this.focus);\n    this.recomputeRange();\n  }\n\n  private onScroll(): void {\n    if (!this.virtual || this.rafScheduled) return;\n    this.rafScheduled = true;\n    requestAnimationFrame(() => {\n      this.rafScheduled = false;\n      this.paint();\n    });\n  }\n\n  dispose(): void {\n    for (const d of this.disposers) d();\n    this.disposers = [];\n  }\n\n  /* ---- sizing helpers ------------------------------------------------ */\n\n  private colWidth(vc: ValueColumn): number {\n    return this.ctx.ui.columnWidths[vc.id] ?? DEFAULT_VALUE_WIDTH;\n  }\n\n  private leafWidth(leafIndex: number): number {\n    const m = this.model;\n    if (m.measuresOnRows || m.measures.length === 0) return this.colWidth(m.valueColumns[leafIndex]!);\n    let w = 0;\n    const base = leafIndex * m.measures.length;\n    for (let i = 0; i < m.measures.length; i++) w += this.colWidth(m.valueColumns[base + i]!);\n    return w;\n  }\n\n  private rowHeadWidth(): number {\n    return this.ctx.ui.columnWidths[ROWHEAD_COL_ID] ?? DEFAULT_ROWHEAD_WIDTH;\n  }\n\n  private gutterWidth(): number {\n    return this.ctx.ui.columnWidths[GUTTER_COL_ID] ?? DEFAULT_GUTTER_WIDTH;\n  }\n\n  private freezeCount(): number {\n    return Math.max(0, Math.min(this.ctx.ui.freezeColumns, this.model.valueColumns.length));\n  }\n\n  /* ---- paint --------------------------------------------------------- */\n\n  private paint(): void {\n    const m = this.model;\n\n    if (m.empty) {\n      this.paintEmpty();\n      return;\n    }\n\n    const valuesPerLeaf = m.measuresOnRows || m.measures.length === 0 ? 1 : m.measures.length;\n    const leafCount = m.colLeaves.length;\n    const freezeValues = this.freezeCount();\n    const frozenLeaves = this.colVirtual\n      ? Math.min(Math.ceil(freezeValues / valuesPerLeaf), leafCount)\n      : 0;\n\n    // Column window (over leaves).\n    let leafStart = frozenLeaves;\n    let leafEnd = leafCount;\n    let leftSpacer = 0;\n    let rightSpacer = 0;\n    if (this.colVirtual) {\n      const leafWidths = Array.from({ length: leafCount }, (_, i) => this.leafWidth(i));\n      const offsets = cumulativeOffsets(leafWidths);\n      const lead = this.leadingWidth() + (offsets[frozenLeaves]! - offsets[0]!);\n      const win = windowVariable(\n        offsets,\n        this.scroller.scrollLeft,\n        this.scroller.clientWidth || 1,\n        lead,\n        OVERSCAN_PX,\n      );\n      leafStart = Math.max(frozenLeaves, win.start);\n      leafEnd = Math.max(win.end, leafStart);\n      leftSpacer = offsets[leafStart]! - offsets[frozenLeaves]!;\n      rightSpacer = offsets[leafCount]! - offsets[leafEnd]!;\n    }\n\n    // Row window.\n    const rowCount = m.bodyRows.length;\n    const rowWin = this.virtual\n      ? windowUniform(rowCount, this.rowHeight, this.scroller.scrollTop, this.scroller.clientHeight || 1, OVERSCAN_ROWS)\n      : { start: 0, end: rowCount, before: 0, after: 0 };\n\n    const table = h('table', {\n      class: 'ph-table',\n      attrs: {\n        role: 'grid',\n        'aria-rowcount': this.totalHeaderRows() + rowCount,\n        'aria-colcount': m.leadingCols + m.valueColumns.length,\n      },\n    });\n\n    table.append(this.buildHead(frozenLeaves, leafStart, leafEnd, leftSpacer, rightSpacer));\n    table.append(this.buildBody(rowWin, frozenLeaves, leafStart, leafEnd, leftSpacer, rightSpacer));\n\n    clear(this.scroller);\n    this.scroller.append(table);\n    this.applyFreeze();\n    this.restoreFocus();\n  }\n\n  private paintEmpty(): void {\n    const m = this.model;\n    const table = h('table', { class: 'ph-table', attrs: { role: 'grid' } });\n    table.append(\n      h(\n        'tbody',\n        {},\n        h(\n          'tr',\n          { attrs: { role: 'row' } },\n          h('td', {\n            class: 'ph-empty',\n            text: this.t.noData,\n            attrs: { colspan: Math.max(m.valueColumns.length + m.leadingCols, 1), role: 'gridcell' },\n          }),\n        ),\n      ),\n    );\n    clear(this.scroller);\n    this.scroller.append(table);\n  }\n\n  private totalHeaderRows(): number {\n    const m = this.model;\n    return m.colLevels + (m.showMeasureRow ? 1 : 0) || 1;\n  }\n\n  private leadingWidth(): number {\n    return this.rowHeadWidth() + (this.model.gutter ? this.gutterWidth() : 0);\n  }\n\n  /* ---- THEAD --------------------------------------------------------- */\n\n  private buildHead(\n    frozenLeaves: number,\n    leafStart: number,\n    leafEnd: number,\n    leftSpacer: number,\n    rightSpacer: number,\n  ): HTMLElement {\n    const m = this.model;\n    const thead = h('thead', {});\n    const totalHeaderRows = this.totalHeaderRows();\n    const vpl = this.valuesPerLeaf();\n\n    // Member header levels.\n    for (let level = 0; level < m.colLevels; level++) {\n      const tr = h('tr', { attrs: { role: 'row', 'aria-rowindex': level + 1 } });\n      if (level === 0) this.appendCornerCells(tr, totalHeaderRows);\n      const cells = m.headerRows[level] ?? [];\n      if (!this.colVirtual) {\n        // Full, span-correct render (handles multi-level rowspans natively).\n        for (const cell of cells) {\n          const startLeaf = Math.floor(cell.valueStart / vpl);\n          tr.append(this.buildColHeaderCell(cell, Math.max(1, Math.round(cell.colspan)), startLeaf));\n        }\n      } else {\n        // Single-level windowed render: one cell per leaf (colspan === 1 leaf).\n        const byLeaf = new Map<number, HeaderCell>();\n        for (const cell of cells) byLeaf.set(Math.floor(cell.valueStart / vpl), cell);\n        const emit = (i: number) => {\n          const cell = byLeaf.get(i);\n          if (cell) tr.append(this.buildColHeaderCell(cell, 1, i));\n          else tr.append(h('th', { class: 'ph-col-head', attrs: { scope: 'col', role: 'columnheader' }, style: this.widthStyle(this.leafWidth(i) || DEFAULT_VALUE_WIDTH) }));\n        };\n        for (let i = 0; i < frozenLeaves; i++) emit(i);\n        if (leftSpacer > 0) tr.append(this.headerSpacer(leftSpacer));\n        for (let i = leafStart; i < leafEnd; i++) emit(i);\n        if (rightSpacer > 0) tr.append(this.headerSpacer(rightSpacer));\n      }\n      thead.append(tr);\n    }\n\n    if (m.colLevels === 0) {\n      const tr = h('tr', {\n        class: m.showMeasureRow ? 'ph-measure-row' : '',\n        attrs: { role: 'row', 'aria-rowindex': 1 },\n      });\n      this.appendCornerCells(tr, 1);\n      if (m.showMeasureRow) this.appendMeasureRow(tr, frozenLeaves, leafStart, leafEnd, leftSpacer, rightSpacer);\n      thead.append(tr);\n    } else if (m.showMeasureRow) {\n      const tr = h('tr', {\n        class: 'ph-measure-row',\n        attrs: { role: 'row', 'aria-rowindex': m.colLevels + 1 },\n      });\n      this.appendMeasureRow(tr, frozenLeaves, leafStart, leafEnd, leftSpacer, rightSpacer);\n      thead.append(tr);\n    }\n\n    return thead;\n  }\n\n  /** Iterate visible leaves: frozen prefix, gap, window, trailing gap. */\n  private eachVisibleLeaf(\n    frozenLeaves: number,\n    leafStart: number,\n    leafEnd: number,\n    leftSpacer: number,\n    rightSpacer: number,\n    onLeaf: (leafIndex: number) => void,\n    onGap: (width: number) => void,\n  ): void {\n    for (let i = 0; i < frozenLeaves; i++) onLeaf(i);\n    if (this.colVirtual && leftSpacer > 0) onGap(leftSpacer);\n    for (let i = leafStart; i < leafEnd; i++) onLeaf(i);\n    if (this.colVirtual && rightSpacer > 0) onGap(rightSpacer);\n  }\n\n  private valuesPerLeaf(): number {\n    const m = this.model;\n    return m.measuresOnRows || m.measures.length === 0 ? 1 : m.measures.length;\n  }\n\n  private appendCornerCells(tr: HTMLElement, rowspan: number): void {\n    const m = this.model;\n    if (m.gutter) {\n      tr.append(\n        this.tagFreeze(\n          h('th', {\n            class: 'ph-corner ph-gutter-corner',\n            attrs: { rowspan, scope: 'col', role: 'columnheader' },\n            style: this.widthStyle(this.gutterWidth(), this.pinned(GUTTER_COL_ID)),\n            dataset: { colId: GUTTER_COL_ID },\n          }),\n          0,\n        ),\n      );\n      tr.append(this.buildRowLabelsHeader(rowspan));\n    } else {\n      tr.append(\n        this.tagFreeze(\n          h('th', {\n            class: 'ph-corner',\n            attrs: { colspan: 1, rowspan, scope: 'col', role: 'columnheader' },\n            style: this.widthStyle(this.rowHeadWidth(), this.pinned(ROWHEAD_COL_ID)),\n            dataset: { colId: ROWHEAD_COL_ID },\n          }),\n          0,\n          this.makeColResizer(ROWHEAD_COL_ID),\n        ),\n      );\n    }\n  }\n\n  private buildRowLabelsHeader(rowspan: number): HTMLElement {\n    const m = this.model;\n    const firstRowField = m.grid.rowTree[0]?.uniqueName ?? '';\n    const direction = firstRowField ? this.fieldSort(firstRowField) : 'unsorted';\n    const th = h('th', {\n      class: 'ph-row-labels-head ph-sortable',\n      attrs: {\n        rowspan,\n        scope: 'col',\n        role: 'columnheader',\n        'aria-sort': ariaSort(direction),\n        title: this.sortTitle(direction),\n      },\n      style: this.widthStyle(this.rowHeadWidth(), this.pinned(ROWHEAD_COL_ID)),\n      dataset: { colId: ROWHEAD_COL_ID },\n      on: { click: () => this.cycleSort(firstRowField) },\n    });\n    th.append(h('span', { class: 'ph-caption', text: m.rowLabelsCaption }));\n    const ind = sortIndicator(direction);\n    if (ind) th.append(ind);\n    this.tagFreeze(th, m.gutter ? 1 : 0, this.makeColResizer(ROWHEAD_COL_ID));\n    return th;\n  }\n\n  private headerSpacer(width: number): HTMLElement {\n    return h('th', {\n      class: 'ph-col-spacer',\n      attrs: { 'aria-hidden': 'true', role: 'presentation' },\n      style: this.widthStyle(width, true),\n    });\n  }\n\n  private buildColHeaderCell(cell: HeaderCell, spanLeaves: number, leafIndex: number): HTMLElement {\n    const node = cell.node;\n    const hasChildren = node.children.length > 0;\n    const direction = node.uniqueName ? this.fieldSort(node.uniqueName) : 'unsorted';\n    const width = this.spanWidth(leafIndex, spanLeaves);\n    const th = h('th', {\n      class: `ph-col-head ph-sortable${node.isGrandTotal ? ' ph-grand-total' : ''}`,\n      attrs: {\n        colspan: spanLeaves * this.valuesPerLeaf(),\n        rowspan: cell.rowspan,\n        scope: 'col',\n        role: 'columnheader',\n        'aria-sort': node.isGrandTotal ? null : ariaSort(direction),\n        title: node.isGrandTotal ? null : this.sortTitle(direction),\n      },\n      style: this.widthStyle(width),\n      on: {\n        click: () => {\n          if (node.isGrandTotal) return;\n          this.cycleSort(node.uniqueName);\n        },\n      },\n    });\n    if (hasChildren) {\n      th.append(\n        h('button', {\n          class: 'ph-toggle',\n          html: node.expanded ? ICONS.expand : ICONS.collapse,\n          attrs: { type: 'button', 'aria-label': node.expanded ? this.t.collapse : this.t.expand },\n          on: {\n            click: (e) => {\n              e.stopPropagation();\n              this.toggleNode('columns', node);\n            },\n          },\n        }),\n      );\n    }\n    th.append(h('span', { class: 'ph-caption', text: cell.caption }));\n    const ind = sortIndicator(direction);\n    if (ind && !node.isGrandTotal) th.append(ind);\n    return th;\n  }\n\n  private spanWidth(leafIndex: number, spanLeaves: number): number {\n    let w = 0;\n    for (let i = 0; i < spanLeaves; i++) w += this.leafWidth(leafIndex + i) || DEFAULT_VALUE_WIDTH;\n    return w;\n  }\n\n  private appendMeasureRow(\n    tr: HTMLElement,\n    frozenLeaves: number,\n    leafStart: number,\n    leafEnd: number,\n    leftSpacer: number,\n    rightSpacer: number,\n  ): void {\n    const m = this.model;\n    this.eachVisibleLeaf(\n      frozenLeaves,\n      leafStart,\n      leafEnd,\n      leftSpacer,\n      rightSpacer,\n      (leafIndex) => {\n        m.measures.forEach((measure, mi) => {\n          const vc = m.valueColumns[leafIndex * m.measures.length + mi];\n          if (!vc) return;\n          tr.append(\n            this.tagColResizable(\n              h('th', {\n                class: 'ph-measure-head',\n                text: measure.caption ?? measure.uniqueName,\n                attrs: { scope: 'col', role: 'columnheader' },\n                style: this.widthStyle(this.colWidth(vc), this.pinned(vc.id)),\n                dataset: { colId: vc.id },\n              }),\n              vc.id,\n            ),\n          );\n        });\n      },\n      (width) => tr.append(this.headerSpacer(width)),\n    );\n  }\n\n  /* ---- TBODY --------------------------------------------------------- */\n\n  private buildBody(\n    rowWin: { start: number; end: number; before: number; after: number },\n    frozenLeaves: number,\n    leafStart: number,\n    leafEnd: number,\n    leftSpacer: number,\n    rightSpacer: number,\n  ): HTMLElement {\n    const m = this.model;\n    const tbody = h('tbody', {});\n    const colCount = m.leadingCols + m.valueColumns.length + frozenLeaves + 4;\n\n    if (this.virtual && rowWin.before > 0) tbody.append(spacerRow(rowWin.before, colCount));\n\n    for (let r = rowWin.start; r < rowWin.end; r++) {\n      const row = m.bodyRows[r]!;\n      tbody.append(this.buildBodyRow(row, r, frozenLeaves, leafStart, leafEnd, leftSpacer, rightSpacer));\n    }\n\n    if (this.virtual && rowWin.after > 0) tbody.append(spacerRow(rowWin.after, colCount));\n    return tbody;\n  }\n\n  private buildBodyRow(\n    row: BodyRow,\n    r: number,\n    frozenLeaves: number,\n    leafStart: number,\n    leafEnd: number,\n    leftSpacer: number,\n    rightSpacer: number,\n  ): HTMLElement {\n    const m = this.model;\n    const cls = [row.isGrandTotal ? 'ph-grand-total' : '', row.isTotal ? 'ph-subtotal' : '', m.measuresOnRows ? 'ph-measure-body-row' : '']\n      .filter(Boolean)\n      .join(' ');\n    const heightPx = this.virtual ? this.rowHeight : this.ctx.ui.rowHeights[row.id];\n    const tr = h('tr', {\n      class: cls,\n      attrs: { role: 'row', 'aria-rowindex': this.totalHeaderRows() + r + 1 },\n      style: heightPx ? { height: `${heightPx}px` } : undefined,\n    });\n\n    if (m.gutter) tr.append(this.buildGutterCell(row));\n    tr.append(this.buildRowHeaderCell(row, r));\n\n    const measures = m.measures;\n    this.eachVisibleLeaf(\n      frozenLeaves,\n      leafStart,\n      leafEnd,\n      leftSpacer,\n      rightSpacer,\n      (leafIndex) => {\n        const leaf = m.colLeaves[leafIndex]!;\n        if (m.measuresOnRows) {\n          tr.append(this.buildBodyCell(row, leaf, row.measure!, r, leafIndex));\n        } else if (measures.length > 0) {\n          measures.forEach((measure, mi) => {\n            tr.append(this.buildBodyCell(row, leaf, measure, r, leafIndex * measures.length + mi));\n          });\n        }\n      },\n      (width) => tr.append(bodySpacer(width)),\n    );\n\n    return tr;\n  }\n\n  private buildGutterCell(row: BodyRow): HTMLElement {\n    const node = row.node;\n    const hasChildren = node.children.length > 0 && !node.isGrandTotal;\n    const td = h('td', {\n      class: `ph-gutter${node.isGrandTotal ? ' ph-grand-total' : ''}${node.isTotal ? ' ph-subtotal' : ''}`,\n      attrs: { role: 'rowheader' },\n      style: { paddingInlineStart: `${4 + node.level * 16}px` },\n    });\n    if (hasChildren && row.showGutterButton) {\n      td.append(\n        h('button', {\n          class: 'ph-expander',\n          text: node.expanded ? '−' : '+',\n          attrs: {\n            type: 'button',\n            'aria-label': node.expanded ? this.t.collapse : this.t.expand,\n            'aria-expanded': node.expanded ? 'true' : 'false',\n          },\n          on: {\n            click: (e) => {\n              e.stopPropagation();\n              this.toggleNode('rows', node);\n            },\n          },\n        }),\n      );\n    }\n    return this.tagFreeze(td, 0);\n  }\n\n  private buildRowHeaderCell(row: BodyRow, r: number): HTMLElement {\n    const m = this.model;\n    const node = row.node;\n    const hasChildren = node.children.length > 0;\n    const indent = m.gutter ? 8 + node.level * 16 : 8 + node.level * 18;\n    const sortable = !m.gutter && !!node.uniqueName && !node.isGrandTotal;\n    const th = h('th', {\n      class: `ph-row-head${node.isGrandTotal ? ' ph-grand-total' : ''}${node.isTotal ? ' ph-subtotal' : ''}${sortable ? ' ph-sortable' : ''}`,\n      attrs: { scope: 'row', role: 'rowheader', 'aria-rowindex': this.totalHeaderRows() + r + 1 },\n      style: { paddingInlineStart: `${indent}px`, ...this.widthStyle(this.rowHeadWidth(), this.pinned(ROWHEAD_COL_ID)) },\n      dataset: { colId: ROWHEAD_COL_ID },\n    });\n    if (!m.gutter && hasChildren) {\n      th.append(\n        h('button', {\n          class: 'ph-toggle',\n          html: node.expanded ? ICONS.expand : ICONS.collapse,\n          attrs: { type: 'button', 'aria-label': node.expanded ? this.t.collapse : this.t.expand },\n          on: {\n            click: (e) => {\n              e.stopPropagation();\n              this.toggleNode('rows', node);\n            },\n          },\n        }),\n      );\n    }\n    if (row.showLabel) th.append(h('span', { class: 'ph-caption', text: node.caption }));\n    if (row.measure) {\n      th.append(h('span', { class: 'ph-row-measure', text: row.measure.caption ?? row.measure.uniqueName }));\n    }\n    if (sortable) th.addEventListener('click', () => this.cycleSort(node.uniqueName));\n    const idx = m.gutter ? 1 : 0;\n    this.tagFreeze(th, idx, this.makeRowResizer(row.id));\n    return th;\n  }\n\n  private buildBodyCell(\n    row: BodyRow,\n    colNode: HeaderNode,\n    measure: MeasureConfig,\n    r: number,\n    c: number,\n  ): HTMLElement {\n    const cell = this.model.grid.getCell(row.node, colNode, measure);\n    const vc = this.model.valueColumns[c];\n    const selected = rangeContains(this.range, r, c);\n    const focused = this.focus?.r === r && this.focus?.c === c;\n    // Roving tabindex: the focused cell (or cell 0,0 when nothing is focused yet)\n    // is the single tab stop, so keyboard users can enter the grid.\n    const isEntry = !this.focus && r === 0 && c === 0;\n    const td = h('td', {\n      class: [\n        'ph-cell',\n        cell.isGrandTotal ? 'ph-grand-total' : '',\n        cell.isTotal ? 'ph-subtotal' : '',\n        selected ? 'ph-selected' : '',\n        focused ? 'ph-focused' : '',\n      ]\n        .filter(Boolean)\n        .join(' '),\n      text: cell.formatted,\n      attrs: {\n        role: 'gridcell',\n        tabindex: focused || isEntry ? 0 : -1,\n        'aria-colindex': this.model.leadingCols + c + 1,\n        'aria-selected': selected ? 'true' : null,\n      },\n      dataset: { r: String(r), c: String(c), colId: vc?.id ?? '' },\n      style: vc ? this.widthStyle(this.colWidth(vc), this.pinned(vc.id)) : undefined,\n    });\n    if (cell.style) Object.assign(td.style, cell.style as Partial<CSSStyleDeclaration>);\n\n    td.addEventListener('pointerdown', (e) => this.onCellPointerDown(e, r, c));\n    td.addEventListener('pointerenter', () => this.onCellPointerEnter(r, c));\n    td.addEventListener('click', () => this.ctx.engine.emit('cellClick', { cell }));\n    td.addEventListener('dblclick', () => {\n      const records = this.ctx.engine.getRecords(cell.rowPath, cell.columnPath);\n      this.ctx.engine.emit('cellDoubleClick', { cell, records });\n      this.ctx.engine.emit('drillThrough', { cell, records });\n    });\n    td.addEventListener('keydown', (e) => this.onKeyDown(e));\n    return td;\n  }\n\n  /* ---- selection ----------------------------------------------------- */\n\n  private onCellPointerDown(e: PointerEvent, r: number, c: number): void {\n    if (e.button !== 0) return;\n    this.wantFocus = true;\n    if (e.shiftKey && this.anchor) {\n      this.focus = { r, c };\n    } else {\n      this.anchor = { r, c };\n      this.focus = { r, c };\n    }\n    this.dragging = true;\n    this.recomputeRange();\n    const off = on(document, 'pointerup', () => {\n      this.dragging = false;\n      off();\n    });\n    this.repaintSelection();\n  }\n\n  private onCellPointerEnter(r: number, c: number): void {\n    if (!this.dragging) return;\n    this.focus = { r, c };\n    this.recomputeRange();\n    this.repaintSelection();\n  }\n\n  private recomputeRange(): void {\n    this.range = this.anchor && this.focus ? normalizeRange(this.anchor, this.focus) : null;\n  }\n\n  /** Re-apply selection/focus classes without rebuilding the whole table. */\n  private repaintSelection(): void {\n    const cells = this.scroller.querySelectorAll<HTMLElement>('td.ph-cell');\n    cells.forEach((td) => {\n      const r = Number(td.dataset.r);\n      const c = Number(td.dataset.c);\n      const selected = rangeContains(this.range, r, c);\n      const focused = this.focus?.r === r && this.focus?.c === c;\n      td.classList.toggle('ph-selected', selected);\n      td.classList.toggle('ph-focused', focused);\n      td.setAttribute('tabindex', focused ? '0' : '-1');\n      if (selected) td.setAttribute('aria-selected', 'true');\n      else td.removeAttribute('aria-selected');\n    });\n    if (this.wantFocus) this.restoreFocus();\n  }\n\n  /* ---- keyboard ------------------------------------------------------ */\n\n  private onKeyDown(e: KeyboardEvent): void {\n    const maxR = this.model.bodyRows.length - 1;\n    const maxC = this.model.valueColumns.length - 1;\n    if (maxR < 0 || maxC < 0) return;\n    const cur = this.focus ?? { r: 0, c: 0 };\n    const rtl = this.dir === 'rtl';\n    let next: CellCoord | null = null;\n    const pageRows = Math.max(1, Math.floor((this.scroller.clientHeight || this.rowHeight) / this.rowHeight) - 1);\n\n    switch (e.key) {\n      case 'ArrowDown':\n        next = { r: Math.min(maxR, cur.r + 1), c: cur.c };\n        break;\n      case 'ArrowUp':\n        next = { r: Math.max(0, cur.r - 1), c: cur.c };\n        break;\n      case 'ArrowRight':\n        next = { r: cur.r, c: rtl ? Math.max(0, cur.c - 1) : Math.min(maxC, cur.c + 1) };\n        break;\n      case 'ArrowLeft':\n        next = { r: cur.r, c: rtl ? Math.min(maxC, cur.c + 1) : Math.max(0, cur.c - 1) };\n        break;\n      case 'Home':\n        next = e.ctrlKey || e.metaKey ? { r: 0, c: 0 } : { r: cur.r, c: 0 };\n        break;\n      case 'End':\n        next = e.ctrlKey || e.metaKey ? { r: maxR, c: maxC } : { r: cur.r, c: maxC };\n        break;\n      case 'PageDown':\n        next = { r: Math.min(maxR, cur.r + pageRows), c: cur.c };\n        break;\n      case 'PageUp':\n        next = { r: Math.max(0, cur.r - pageRows), c: cur.c };\n        break;\n      case 'c':\n      case 'C':\n        if (e.ctrlKey || e.metaKey) {\n          e.preventDefault();\n          void this.copySelection();\n        }\n        return;\n      case 'Enter': {\n        const c = cellAt(this.model, cur.r, cur.c);\n        if (c) this.ctx.engine.emit('cellClick', { cell: c });\n        return;\n      }\n      default:\n        return;\n    }\n    if (!next) return;\n    e.preventDefault();\n    this.focus = next;\n    if (e.shiftKey) {\n      if (!this.anchor) this.anchor = cur;\n    } else {\n      this.anchor = next;\n    }\n    this.recomputeRange();\n    this.wantFocus = true;\n    this.ensureVisible(next);\n    if (this.virtual) this.paint();\n    else this.repaintSelection();\n  }\n\n  private ensureVisible(coord: CellCoord): void {\n    // Vertical\n    const top = coord.r * this.rowHeight;\n    const bottom = top + this.rowHeight;\n    if (this.virtual) {\n      if (top < this.scroller.scrollTop) this.scroller.scrollTop = top;\n      else if (bottom > this.scroller.scrollTop + this.scroller.clientHeight)\n        this.scroller.scrollTop = bottom - this.scroller.clientHeight;\n    }\n    // Horizontal handled by browser scrollIntoView fallback after focus.\n  }\n\n  /* ---- clipboard ----------------------------------------------------- */\n\n  async copySelection(): Promise<boolean> {\n    const range = this.range ?? (this.focus ? { r0: this.focus.r, r1: this.focus.r, c0: this.focus.c, c1: this.focus.c } : null);\n    if (!range) return false;\n    const tsv = buildTSV(this.model, range);\n    return writeClipboard(tsv);\n  }\n\n  /* ---- focus restore ------------------------------------------------- */\n\n  private restoreFocus(): void {\n    if (!this.focus) return;\n    const sel = `td.ph-cell[data-r=\"${this.focus.r}\"][data-c=\"${this.focus.c}\"]`;\n    const el = this.scroller.querySelector<HTMLElement>(sel);\n    if (el) {\n      el.setAttribute('tabindex', '0');\n      if (this.wantFocus) {\n        el.focus?.({ preventScroll: this.virtual });\n        if (!this.virtual) el.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n        this.wantFocus = false;\n      }\n    }\n  }\n\n  /* ---- freeze (sticky pinned columns) -------------------------------- */\n\n  private tagFreeze(el: HTMLElement, freezeIndex: number, ...extra: Array<HTMLElement | null>): HTMLElement {\n    el.dataset.freeze = String(freezeIndex);\n    for (const x of extra) if (x) el.append(x);\n    return el;\n  }\n\n  private tagColResizable(el: HTMLElement, colId: string): HTMLElement {\n    const handle = this.makeColResizer(colId);\n    if (handle) el.append(handle);\n    return el;\n  }\n\n  /**\n   * After paint, pin the leading row-header column(s) and the first\n   * `freezeColumns` value columns by measuring their rendered widths and\n   * assigning cumulative sticky `inset-inline-start` offsets. Works in both\n   * LTR and RTL via logical inset properties.\n   */\n  private applyFreeze(): void {\n    const m = this.model;\n    const leading = m.leadingCols;\n    const freeze = this.freezeCount();\n    const totalFrozen = leading + freeze;\n    if (totalFrozen <= 0) return;\n\n    // Tag the frozen value columns (header measure cells + body cells), so the\n    // leading row-header columns and the first `freeze` value columns all carry\n    // a contiguous data-freeze index 0..totalFrozen-1.\n    for (let v = 0; v < freeze; v++) {\n      const vc = m.valueColumns[v];\n      if (!vc) continue;\n      const cells = this.scroller.querySelectorAll<HTMLElement>(`[data-col-id=\"${cssEscape(vc.id)}\"]`);\n      cells.forEach((cell) => {\n        if (cell.classList.contains('ph-row-head') || cell.classList.contains('ph-corner')) return;\n        cell.dataset.freeze = String(leading + v);\n      });\n    }\n\n    // Measure each frozen column's rendered width from a representative cell.\n    const widths: number[] = [];\n    for (let i = 0; i < totalFrozen; i++) {\n      const cell = this.scroller.querySelector<HTMLElement>(`[data-freeze=\"${i}\"]`);\n      const measured = cell?.getBoundingClientRect().width ?? 0;\n      widths[i] =\n        measured ||\n        (i < leading\n          ? i === 0 && m.gutter\n            ? this.gutterWidth()\n            : this.rowHeadWidth()\n          : this.colWidth(m.valueColumns[i - leading]!));\n    }\n\n    let offset = 0;\n    for (let i = 0; i < totalFrozen; i++) {\n      const cells = this.scroller.querySelectorAll<HTMLElement>(`[data-freeze=\"${i}\"]`);\n      const off = offset;\n      cells.forEach((cell) => {\n        cell.style.position = 'sticky';\n        cell.style.insetInlineStart = `${off}px`;\n        cell.classList.add('ph-frozen');\n        if (i === totalFrozen - 1) cell.classList.add('ph-frozen-edge');\n      });\n      offset += widths[i] ?? 0;\n    }\n  }\n\n  /* ---- resize handles ------------------------------------------------ */\n\n  private makeColResizer(colId: string): HTMLElement | null {\n    const handle = h('span', { class: 'ph-col-resize', attrs: { 'aria-hidden': 'true', title: this.t.resizeColumn } });\n    handle.addEventListener('pointerdown', (e) => this.startColResize(e, colId));\n    handle.addEventListener('click', (e) => e.stopPropagation());\n    handle.addEventListener('dblclick', (e) => {\n      e.stopPropagation();\n      delete this.ctx.ui.columnWidths[colId];\n      this.paint();\n    });\n    return handle;\n  }\n\n  private startColResize(e: PointerEvent, colId: string): void {\n    e.preventDefault();\n    e.stopPropagation();\n    const startX = e.clientX;\n    const rtl = this.dir === 'rtl';\n    const startW = this.ctx.ui.columnWidths[colId] ?? (colId === ROWHEAD_COL_ID ? this.rowHeadWidth() : DEFAULT_VALUE_WIDTH);\n    this.scroller.classList.add('ph-resizing');\n    const move = (ev: PointerEvent) => {\n      const delta = (ev.clientX - startX) * (rtl ? -1 : 1);\n      this.ctx.ui.columnWidths[colId] = Math.max(MIN_COL_WIDTH, Math.round(startW + delta));\n      this.applyColWidth(colId);\n    };\n    const up = () => {\n      this.scroller.classList.remove('ph-resizing');\n      offMove();\n      offUp();\n      this.paint();\n    };\n    const offMove = on(document, 'pointermove', move);\n    const offUp = on(document, 'pointerup', up);\n  }\n\n  /** Live-apply a column width to already-rendered cells (no full repaint). */\n  private applyColWidth(colId: string): void {\n    const w = this.ctx.ui.columnWidths[colId];\n    if (w == null) return;\n    const cells = this.scroller.querySelectorAll<HTMLElement>(`[data-col-id=\"${cssEscape(colId)}\"]`);\n    cells.forEach((cell) => {\n      cell.style.width = `${w}px`;\n      cell.style.minWidth = `${w}px`;\n      cell.style.maxWidth = `${w}px`;\n    });\n  }\n\n  private makeRowResizer(rowId: string): HTMLElement | null {\n    if (this.virtual) return null; // uniform row height while virtualized\n    const handle = h('span', { class: 'ph-row-resize', attrs: { 'aria-hidden': 'true' } });\n    handle.addEventListener('pointerdown', (e) => this.startRowResize(e, rowId));\n    handle.addEventListener('click', (e) => e.stopPropagation());\n    handle.addEventListener('dblclick', (e) => {\n      e.stopPropagation();\n      delete this.ctx.ui.rowHeights[rowId];\n      this.paint();\n    });\n    return handle;\n  }\n\n  private startRowResize(e: PointerEvent, rowId: string): void {\n    e.preventDefault();\n    e.stopPropagation();\n    const startY = e.clientY;\n    const startH = this.ctx.ui.rowHeights[rowId] ?? (e.target as HTMLElement).closest('tr')?.getBoundingClientRect().height ?? DEFAULT_ROW_HEIGHT;\n    this.scroller.classList.add('ph-resizing');\n    const move = (ev: PointerEvent) => {\n      this.ctx.ui.rowHeights[rowId] = Math.max(MIN_ROW_HEIGHT, Math.round(startH + (ev.clientY - startY)));\n      this.paint();\n    };\n    const up = () => {\n      this.scroller.classList.remove('ph-resizing');\n      offMove();\n      offUp();\n      this.paint();\n    };\n    const offMove = on(document, 'pointermove', move);\n    const offUp = on(document, 'pointerup', up);\n  }\n\n  /* ---- sorting / expand ---------------------------------------------- */\n\n  private fieldSort(uniqueName: string): SortDirection {\n    // Read the live slice (cheap clone, no bulk data) so repeated header clicks\n    // before the async re-render still cycle correctly.\n    const slice = this.ctx.engine.getSlice();\n    for (const f of [...(slice.rows ?? []), ...(slice.columns ?? [])]) {\n      if (f.uniqueName === uniqueName) return f.sort ?? 'unsorted';\n    }\n    return 'unsorted';\n  }\n\n  private cycleSort(uniqueName: string): void {\n    if (!uniqueName) return;\n    const current = this.fieldSort(uniqueName);\n    const next: SortDirection = current === 'asc' ? 'desc' : current === 'desc' ? 'unsorted' : 'asc';\n    this.ctx.engine.sortField(uniqueName, next);\n  }\n\n  private sortTitle(direction: SortDirection): string {\n    if (direction === 'asc') return this.t.sortDescending;\n    if (direction === 'desc') return this.t.removeSort;\n    return this.t.sortAscending;\n  }\n\n  private toggleNode(axis: 'rows' | 'columns', node: HeaderNode): void {\n    const path = { tuple: node.path.map((p) => ({ uniqueName: p.uniqueName, value: p.value })) };\n    if (node.expanded) this.ctx.engine.collapse(axis, path);\n    else this.ctx.engine.expand(axis, path);\n  }\n\n  /* ---- width style helper ------------------------------------------- */\n\n  private widthStyle(width: number, force = false): Partial<CSSStyleDeclaration> | undefined {\n    // Pin widths when virtualizing (geometry needed) or when forced (a column\n    // the user has explicitly resized). Otherwise let the browser auto-size.\n    if (!this.virtual && !force) return undefined;\n    return { width: `${width}px`, minWidth: `${width}px`, maxWidth: `${width}px` };\n  }\n\n  /** Whether a column's width should be pinned (virtualized or user-resized). */\n  private pinned(colId: string): boolean {\n    return this.virtual || this.ctx.ui.columnWidths[colId] !== undefined;\n  }\n}\n\n/* ---- small module helpers ------------------------------------------- */\n\nfunction spacerRow(height: number, colspan: number): HTMLElement {\n  return h('tr', { class: 'ph-vrow-spacer', attrs: { 'aria-hidden': 'true', role: 'presentation' } },\n    h('td', { attrs: { colspan }, style: { height: `${height}px`, padding: '0', border: '0' } }),\n  );\n}\n\nfunction bodySpacer(width: number): HTMLElement {\n  return h('td', {\n    class: 'ph-col-spacer',\n    attrs: { 'aria-hidden': 'true', role: 'presentation' },\n    style: { width: `${width}px`, minWidth: `${width}px`, maxWidth: `${width}px` },\n  });\n}\n\nfunction sortIndicator(direction: SortDirection): HTMLElement | null {\n  if (direction === 'unsorted') return null;\n  return h('span', {\n    class: 'ph-sort-ind',\n    html: direction === 'asc' ? ICONS.sortAsc : ICONS.sortDesc,\n    attrs: { 'aria-hidden': 'true' },\n  });\n}\n\nfunction ariaSort(direction: SortDirection): string {\n  return direction === 'asc' ? 'ascending' : direction === 'desc' ? 'descending' : 'none';\n}\n\nfunction cssEscape(value: string): string {\n  if (typeof CSS !== 'undefined' && CSS.escape) return CSS.escape(value);\n  return value.replace(/[\"\\\\\\]]/g, '\\\\$&');\n}\n","/**\n * Renderer-level UI state that lives alongside the report but is *not* part of\n * the core {@link PivotConfiguration}: column/row sizes, the frozen-column count\n * and the persisted vertical row height used by virtualization.\n *\n * It is intentionally a plain, JSON-serializable object so it can be saved to\n * `localStorage` / the URL hash next to the report (see {@link ./persistence}).\n */\nexport interface UIStateData {\n  /** Per-column pixel widths, keyed by the renderer's stable column id. */\n  columnWidths?: Record<string, number>;\n  /** Per-row-header pixel heights, keyed by the renderer's stable row id. */\n  rowHeights?: Record<string, number>;\n  /** Number of leading columns kept pinned during horizontal scroll. */\n  freezeColumns?: number;\n  /** Uniform body row height (px) used when virtualization is active. */\n  rowHeight?: number;\n}\n\n/**\n * Small mutable holder for {@link UIStateData}. The widget owns one instance and\n * hands it to the grid renderer through the {@link PivotContext}. Mutations are\n * in place; persistence reads {@link UIState.data} as a snapshot.\n */\nexport class UIState {\n  columnWidths: Record<string, number>;\n  rowHeights: Record<string, number>;\n  freezeColumns: number;\n  rowHeight: number;\n\n  constructor(initial: UIStateData = {}) {\n    this.columnWidths = { ...(initial.columnWidths ?? {}) };\n    this.rowHeights = { ...(initial.rowHeights ?? {}) };\n    this.freezeColumns = Math.max(0, initial.freezeColumns ?? 0);\n    this.rowHeight = initial.rowHeight ?? 0;\n  }\n\n  /** Serializable snapshot of the current UI state. */\n  get data(): UIStateData {\n    return {\n      columnWidths: { ...this.columnWidths },\n      rowHeights: { ...this.rowHeights },\n      freezeColumns: this.freezeColumns,\n      rowHeight: this.rowHeight || undefined,\n    };\n  }\n\n  /** Replace the entire UI state (used by restore). */\n  set(data: UIStateData): void {\n    this.columnWidths = { ...(data.columnWidths ?? {}) };\n    this.rowHeights = { ...(data.rowHeights ?? {}) };\n    this.freezeColumns = Math.max(0, data.freezeColumns ?? 0);\n    this.rowHeight = data.rowHeight ?? 0;\n  }\n\n  /** Forget all stored sizes (keeps the freeze count). */\n  clearSizes(): void {\n    this.columnWidths = {};\n    this.rowHeights = {};\n  }\n}\n","import type { PivotConfiguration } from '@pvotly/core';\nimport type { UIStateData } from './uiState';\n\n/** A single point-in-time state captured on the undo/redo stack. */\nexport interface HistoryEntry {\n  report: PivotConfiguration;\n  ui?: UIStateData;\n}\n\nexport interface HistoryOptions {\n  /** Maximum number of retained states (default 50). Oldest are dropped. */\n  limit?: number;\n}\n\nfunction deepClone<T>(value: T): T {\n  if (typeof structuredClone === 'function') {\n    try {\n      return structuredClone(value);\n    } catch {\n      /* fall through */\n    }\n  }\n  return JSON.parse(JSON.stringify(value));\n}\n\n/**\n * A linear undo/redo stack of {@link HistoryEntry} snapshots. Entries are deep\n * cloned on the way in and out so callers can mutate freely without corrupting\n * history. Pushing a new state after an undo discards the redo branch.\n */\nexport class UndoRedoStack {\n  private stack: HistoryEntry[] = [];\n  private index = -1;\n  private readonly limit: number;\n\n  constructor(options: HistoryOptions = {}) {\n    this.limit = Math.max(1, options.limit ?? 50);\n  }\n\n  /** Discard all history and seed it with a single baseline state. */\n  reset(entry: HistoryEntry): void {\n    this.stack = [deepClone(entry)];\n    this.index = 0;\n  }\n\n  /** Record a new state, dropping any redo branch and trimming to the limit. */\n  push(entry: HistoryEntry): void {\n    // Collapse no-op pushes (identical to the current state).\n    if (this.index >= 0 && sameEntry(this.stack[this.index]!, entry)) return;\n    this.stack = this.stack.slice(0, this.index + 1);\n    this.stack.push(deepClone(entry));\n    if (this.stack.length > this.limit) this.stack.shift();\n    this.index = this.stack.length - 1;\n  }\n\n  canUndo(): boolean {\n    return this.index > 0;\n  }\n\n  canRedo(): boolean {\n    return this.index < this.stack.length - 1;\n  }\n\n  /** Step back one state and return it (or `null` if at the beginning). */\n  undo(): HistoryEntry | null {\n    if (!this.canUndo()) return null;\n    this.index -= 1;\n    return deepClone(this.stack[this.index]!);\n  }\n\n  /** Step forward one state and return it (or `null` if at the end). */\n  redo(): HistoryEntry | null {\n    if (!this.canRedo()) return null;\n    this.index += 1;\n    return deepClone(this.stack[this.index]!);\n  }\n\n  /** The current state, or `null` when empty. */\n  current(): HistoryEntry | null {\n    return this.index >= 0 ? deepClone(this.stack[this.index]!) : null;\n  }\n\n  /** Number of states retained. */\n  get size(): number {\n    return this.stack.length;\n  }\n}\n\nfunction sameEntry(a: HistoryEntry, b: HistoryEntry): boolean {\n  return JSON.stringify(a.report) === JSON.stringify(b.report) && JSON.stringify(a.ui) === JSON.stringify(b.ui);\n}\n","import type { PivotConfiguration } from '@pvotly/core';\nimport type { UIStateData } from './uiState';\n\n/** A complete, serializable snapshot of a pivot widget (report + UI state). */\nexport interface PivotSnapshot {\n  /** Schema version, for forward-compatible restores. */\n  version: 1;\n  /** The full report. Bulk data is stripped unless `includeData` is set. */\n  report: PivotConfiguration;\n  /** Renderer UI state (sizes / freeze). */\n  ui?: UIStateData;\n}\n\nexport interface SerializeOptions {\n  /**\n   * Include the raw `dataSource` rows (`data` / `matrix` / `csv`). Off by\n   * default — snapshots store the report *shape*, not the (potentially huge)\n   * dataset, so URLs / localStorage stay small. The `mapping` is always kept.\n   */\n  includeData?: boolean;\n}\n\nconst DEFAULT_HASH_KEY = 'pivot';\nconst DEFAULT_STORAGE_KEY = 'pvotly:state';\n\n/** Strip the bulk dataset from a report, preserving field mappings. */\nfunction stripData(report: PivotConfiguration): PivotConfiguration {\n  const { dataSource, ...rest } = report;\n  return {\n    ...rest,\n    dataSource: dataSource?.mapping ? { mapping: dataSource.mapping } : {},\n  };\n}\n\n/** Build a {@link PivotSnapshot} from a report + UI state. */\nexport function createSnapshot(\n  report: PivotConfiguration,\n  ui?: UIStateData,\n  options: SerializeOptions = {},\n): PivotSnapshot {\n  return {\n    version: 1,\n    report: options.includeData ? report : stripData(report),\n    ui,\n  };\n}\n\n/** JSON-encode a snapshot. */\nexport function serializeSnapshot(\n  report: PivotConfiguration,\n  ui?: UIStateData,\n  options: SerializeOptions = {},\n): string {\n  return JSON.stringify(createSnapshot(report, ui, options));\n}\n\n/** Parse a JSON snapshot string. Returns `null` on malformed input. */\nexport function parseSnapshot(json: string | null | undefined): PivotSnapshot | null {\n  if (!json) return null;\n  try {\n    const parsed = JSON.parse(json) as PivotSnapshot;\n    if (!parsed || typeof parsed !== 'object' || !parsed.report) return null;\n    return parsed;\n  } catch {\n    return null;\n  }\n}\n\n/* ---- localStorage -------------------------------------------------------- */\n\nexport function saveToLocalStorage(\n  report: PivotConfiguration,\n  ui?: UIStateData,\n  options: SerializeOptions & { key?: string } = {},\n): boolean {\n  if (typeof localStorage === 'undefined') return false;\n  try {\n    localStorage.setItem(\n      options.key ?? DEFAULT_STORAGE_KEY,\n      serializeSnapshot(report, ui, options),\n    );\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport function loadFromLocalStorage(key = DEFAULT_STORAGE_KEY): PivotSnapshot | null {\n  if (typeof localStorage === 'undefined') return null;\n  try {\n    return parseSnapshot(localStorage.getItem(key));\n  } catch {\n    return null;\n  }\n}\n\nexport function clearLocalStorage(key = DEFAULT_STORAGE_KEY): void {\n  if (typeof localStorage === 'undefined') return;\n  try {\n    localStorage.removeItem(key);\n  } catch {\n    /* ignore */\n  }\n}\n\n/* ---- URL hash ------------------------------------------------------------ */\n\nfunction encodeHashValue(json: string): string {\n  // base64url keeps the hash compact and free of reserved characters.\n  try {\n    const b64 = typeof btoa === 'function' ? btoa(unescape(encodeURIComponent(json))) : json;\n    return b64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n  } catch {\n    return encodeURIComponent(json);\n  }\n}\n\nfunction decodeHashValue(value: string): string {\n  try {\n    const b64 = value.replace(/-/g, '+').replace(/_/g, '/');\n    if (typeof atob === 'function') return decodeURIComponent(escape(atob(b64)));\n    return decodeURIComponent(value);\n  } catch {\n    try {\n      return decodeURIComponent(value);\n    } catch {\n      return value;\n    }\n  }\n}\n\n/** Read `#pivot=...` style params out of a location hash. */\nfunction readHashParams(hash: string): Record<string, string> {\n  const out: Record<string, string> = {};\n  const raw = hash.replace(/^#/, '');\n  if (!raw) return out;\n  for (const part of raw.split('&')) {\n    const eq = part.indexOf('=');\n    if (eq === -1) continue;\n    out[decodeURIComponent(part.slice(0, eq))] = part.slice(eq + 1);\n  }\n  return out;\n}\n\nfunction writeHashParams(params: Record<string, string>): string {\n  return Object.entries(params)\n    .map(([k, v]) => `${encodeURIComponent(k)}=${v}`)\n    .join('&');\n}\n\n/** Encode a snapshot into a URL hash fragment value (base64url). */\nexport function encodeSnapshotToHash(\n  report: PivotConfiguration,\n  ui?: UIStateData,\n  options: SerializeOptions = {},\n): string {\n  return encodeHashValue(serializeSnapshot(report, ui, options));\n}\n\n/** Persist a snapshot into `location.hash` under `key` (default `pivot`). */\nexport function saveToUrlHash(\n  report: PivotConfiguration,\n  ui?: UIStateData,\n  options: SerializeOptions & { key?: string } = {},\n): boolean {\n  if (typeof location === 'undefined' || typeof history === 'undefined') return false;\n  const key = options.key ?? DEFAULT_HASH_KEY;\n  const params = readHashParams(location.hash);\n  params[key] = encodeSnapshotToHash(report, ui, options);\n  try {\n    history.replaceState(null, '', `#${writeHashParams(params)}`);\n    return true;\n  } catch {\n    location.hash = writeHashParams(params);\n    return true;\n  }\n}\n\n/** Restore a snapshot previously stored in `location.hash`. */\nexport function loadFromUrlHash(key = DEFAULT_HASH_KEY): PivotSnapshot | null {\n  if (typeof location === 'undefined') return null;\n  const params = readHashParams(location.hash);\n  const value = params[key];\n  if (!value) return null;\n  return parseSnapshot(decodeHashValue(value));\n}\n","import {\n  PivotEngine,\n  type PivotConfiguration,\n  type PivotEventMap,\n  type PivotEventName,\n} from '@pvotly/core';\nimport type { PivotContext } from './context';\nimport { applyTheme, applyTokens, setThemeTokens, type ThemeName, type ThemeTokens } from './theme';\nimport { clear, h, resolveTarget } from './dom';\nimport { ICONS } from './icons';\nimport { resolveDirection, type Direction } from './i18n';\nimport { mountToolbar, type ActionBarConfig } from './toolbar/toolbar';\nimport { mountFieldList } from './fieldlist/fieldList';\nimport { openFieldsDialog as openFieldsDialogImpl } from './dialogs/fieldsDialog';\nimport { openFormatDialog as openFormatDialogImpl } from './dialogs/formatDialog';\nimport { openConditionalDialog as openConditionalDialogImpl } from './dialogs/conditionalDialog';\nimport { openFilterDialog as openFilterDialogImpl } from './dialogs/filterDialog';\nimport { renderGrid, copyGridSelection } from './render/grid';\nimport { downloadExport, printGrid, type ExportFormat, type ExportOptions } from './export';\nimport { UIState, type UIStateData } from './state/uiState';\nimport { UndoRedoStack } from './state/history';\nimport {\n  createSnapshot,\n  loadFromLocalStorage,\n  loadFromUrlHash,\n  parseSnapshot,\n  saveToLocalStorage,\n  saveToUrlHash,\n  serializeSnapshot,\n  type PivotSnapshot,\n  type SerializeOptions,\n} from './state/persistence';\n\n/** Values-axis position. Mirrors core's `valuesAxis` contract. */\nexport type ValuesAxis = 'columns' | 'rows';\n\nexport interface PivotTableOptions extends PivotConfiguration {\n  /** Show the toolbar (default true). */\n  toolbar?: boolean;\n  /** Show the drag-and-drop field-list panel (default true). */\n  fieldList?: boolean;\n  /** Theme name (default 'light'). */\n  theme?: ThemeName;\n  /** Typed style tokens applied as CSS variables — restyle without writing CSS. */\n  tokens?: ThemeTokens;\n  /** Configure / style the action bar (toggle built-ins, add custom buttons). */\n  actionBar?: ActionBarConfig;\n  /** CSS height for the widget (e.g. 500 or '60vh'). */\n  height?: string | number;\n  /** CSS width. */\n  width?: string | number;\n  /**\n   * Show the horizontal report-filter bar above the grid. When omitted it\n   * defaults to `true` if `slice.reportFilters` is non-empty, else `false`.\n   * Each report-filter field renders a chip that opens its filter dialog.\n   */\n  reportFilterBar?: boolean;\n  /** Number of leading value columns to freeze (pin) during horizontal scroll. */\n  freezeColumns?: number;\n  /** Initial renderer UI state (column/row sizes, freeze count). */\n  uiState?: UIStateData;\n  /** Maximum number of undo/redo states retained (default 50). */\n  historyLimit?: number;\n}\n\n/**\n * The all-in-one pivot table widget. Owns a {@link PivotEngine}, builds the\n * layout (toolbar / field list / grid), and re-renders on every state change.\n *\n * @example\n * ```ts\n * import { PivotTable } from '@pvotly/web';\n * import '@pvotly/web/styles.css';\n *\n * const pivot = new PivotTable('#app', {\n *   dataSource: { data },\n *   slice: { rows: [{ uniqueName: 'Country' }], measures: [{ uniqueName: 'Sales' }] },\n * });\n * ```\n */\nexport class PivotTable {\n  readonly engine: PivotEngine;\n  private readonly root: HTMLElement;\n  private readonly toolbarEl: HTMLElement;\n  private readonly reportBarEl: HTMLElement;\n  private readonly mainEl: HTMLElement;\n  private readonly fieldListEl: HTMLElement;\n  private readonly gridEl: HTMLElement;\n  private readonly dialogLayer: HTMLElement;\n  private readonly ctx: PivotContext;\n  private showFieldList: boolean;\n  private readonly showToolbar: boolean;\n  private readonly reportFilterBar?: boolean;\n  /** Action-bar configuration (mutable; see {@link setActionBar}). */\n  actionBar?: ActionBarConfig;\n  /** Renderer-level UI state (column sizes, freeze count). */\n  readonly uiState: UIState;\n  private readonly history: UndoRedoStack;\n  private applyingHistory = false;\n  private unsubscribe: () => void;\n  private renderScheduled = false;\n\n  constructor(target: string | HTMLElement, options: PivotTableOptions) {\n    const {\n      toolbar = true,\n      fieldList = true,\n      theme = 'light',\n      tokens,\n      actionBar,\n      height,\n      width,\n      reportFilterBar,\n      freezeColumns,\n      uiState,\n      historyLimit,\n      ...config\n    } = options;\n    this.showFieldList = fieldList;\n    this.showToolbar = toolbar;\n    this.actionBar = actionBar;\n    this.reportFilterBar = reportFilterBar;\n    this.uiState = new UIState({ ...uiState, freezeColumns: freezeColumns ?? uiState?.freezeColumns });\n\n    this.root = resolveTarget(target);\n    this.root.classList.add('ph-root');\n    applyTheme(this.root, theme);\n    if (tokens) applyTokens(this.root, tokens);\n    if (height != null) this.root.style.setProperty('--ph-height', cssSize(height));\n    if (width != null) this.root.style.width = cssSize(width);\n    clear(this.root);\n\n    this.engine = new PivotEngine(config as PivotConfiguration);\n    this.applyDirection();\n\n    this.toolbarEl = h('div', { class: 'ph-toolbar-host' });\n    this.reportBarEl = h('div', { class: 'ph-report-bar-host' });\n    this.fieldListEl = h('div', { class: 'ph-fieldlist-host' });\n    this.gridEl = h('div', { class: 'ph-grid-host' });\n    this.mainEl = h('div', { class: 'ph-main' }, this.gridEl, this.fieldListEl);\n    this.dialogLayer = h('div', { class: 'ph-dialog-layer', attrs: { hidden: true } });\n    this.root.append(this.toolbarEl, this.reportBarEl, this.mainEl, this.dialogLayer);\n\n    this.ctx = {\n      engine: this.engine,\n      table: this,\n      ui: this.uiState,\n      refresh: () => this.scheduleRender(),\n      openDialog: (content, title, opts) => this.openDialog(content, title, opts),\n      closeDialog: () => this.closeDialog(),\n    };\n\n    this.history = new UndoRedoStack({ limit: historyLimit });\n    this.history.reset(this.captureEntry());\n\n    this.unsubscribe = this.engine.on('reportChange', () => {\n      this.scheduleRender();\n      if (!this.applyingHistory) this.history.push(this.captureEntry());\n    });\n\n    if (this.showToolbar) mountToolbar(this.ctx, this.toolbarEl);\n    this.render();\n  }\n\n  /** Reflect the localization layout direction onto the root element. */\n  private applyDirection(): void {\n    const dir = resolveDirection(this.engine.getConfiguration().localization);\n    this.root.setAttribute('dir', dir);\n    this.root.classList.toggle('ph-rtl', dir === 'rtl');\n  }\n\n  /** The current layout direction. */\n  get direction(): Direction {\n    return resolveDirection(this.engine.getConfiguration().localization);\n  }\n\n  /* ---- rendering ----------------------------------------------------- */\n\n  private scheduleRender(): void {\n    if (this.renderScheduled) return;\n    this.renderScheduled = true;\n    queueMicrotask(() => {\n      this.renderScheduled = false;\n      this.render();\n    });\n  }\n\n  private render(): void {\n    this.renderReportBar();\n    this.fieldListEl.hidden = !this.showFieldList;\n    if (this.showFieldList) mountFieldList(this.ctx, this.fieldListEl);\n    renderGrid(this.ctx, this.gridEl);\n  }\n\n  /** Render the horizontal report-filter chip bar above the grid. */\n  private renderReportBar(): void {\n    const reportFilters = this.engine.getConfiguration().slice?.reportFilters ?? [];\n    const show = this.reportFilterBar ?? reportFilters.length > 0;\n    clear(this.reportBarEl);\n    if (!show || reportFilters.length === 0) {\n      this.reportBarEl.hidden = true;\n      return;\n    }\n    this.reportBarEl.hidden = false;\n    const dataset = this.engine.getDataset();\n    const bar = h('div', { class: 'ph-report-filters' });\n    for (const field of reportFilters) {\n      const caption = field.caption ?? dataset.fieldCaption(field.uniqueName);\n      const chip = h('button', {\n        class: 'ph-report-chip',\n        attrs: { type: 'button', 'aria-label': `Filter ${caption}` },\n        on: { click: () => this.openFilterDialog(field.uniqueName) },\n      });\n      chip.append(\n        h('span', { class: 'ph-report-chip-icon', html: ICONS.filter }),\n        h('span', { class: 'ph-report-chip-label', text: caption }),\n      );\n      bar.append(chip);\n    }\n    this.reportBarEl.append(bar);\n  }\n\n  /** Force an immediate re-render. */\n  refresh(): void {\n    this.render();\n  }\n\n  /* ---- dialogs ------------------------------------------------------- */\n\n  private openDialog(content: HTMLElement, title = '', opts: { width?: string } = {}): void {\n    const dialog = h(\n      'div',\n      {\n        class: 'ph-dialog',\n        attrs: { role: 'dialog', 'aria-modal': 'true' },\n        style: opts.width ? { width: opts.width, maxWidth: '94%' } : undefined,\n      },\n      h(\n        'div',\n        { class: 'ph-dialog-head' },\n        h('span', { class: 'ph-dialog-title', text: title }),\n        h('button', {\n          class: 'ph-dialog-close',\n          html: ICONS.close,\n          attrs: { type: 'button', 'aria-label': 'Close' },\n          on: { click: () => this.closeDialog() },\n        }),\n      ),\n      h('div', { class: 'ph-dialog-body' }, content),\n    );\n    clear(this.dialogLayer);\n    this.dialogLayer.append(\n      h('div', {\n        class: 'ph-dialog-backdrop',\n        on: { click: () => this.closeDialog() },\n      }),\n      dialog,\n    );\n    this.dialogLayer.hidden = false;\n  }\n\n  closeDialog(): void {\n    clear(this.dialogLayer);\n    this.dialogLayer.hidden = true;\n  }\n\n  /* ---- public API ---------------------------------------------------- */\n\n  getConfiguration(): PivotConfiguration {\n    return this.engine.getConfiguration();\n  }\n\n  setConfiguration(config: PivotConfiguration): void {\n    this.engine.setConfiguration(config);\n    this.applyDirection();\n    this.render();\n  }\n\n  /* ---- values axis (measures on columns / rows) ---------------------- */\n\n  /** Current values-axis position (`'columns'` default, or `'rows'`). */\n  getValuesAxis(): ValuesAxis {\n    const cfg = this.engine.getConfiguration() as PivotConfiguration & { valuesAxis?: ValuesAxis };\n    return cfg.valuesAxis ?? (cfg.options?.grid?.measurePosition === 'rows' ? 'rows' : 'columns');\n  }\n\n  /**\n   * Move the Values (measures) between the column axis and the row axis. Sets\n   * both the core `valuesAxis` contract field and the renderer's\n   * `options.grid.measurePosition`, so it works against the current renderer and\n   * forward-compatibly once core honors `valuesAxis`.\n   */\n  setValuesAxis(axis: ValuesAxis): void {\n    const cfg = this.engine.getConfiguration() as PivotConfiguration & { valuesAxis?: ValuesAxis };\n    cfg.valuesAxis = axis;\n    cfg.options = {\n      ...cfg.options,\n      grid: { ...cfg.options?.grid, measurePosition: axis },\n    };\n    this.engine.setConfiguration(cfg);\n    this.render();\n  }\n\n  /* ---- freeze / sizing ----------------------------------------------- */\n\n  /** Freeze (pin) the first `count` value columns during horizontal scroll. */\n  freezeColumns(count: number): void {\n    this.uiState.freezeColumns = Math.max(0, Math.floor(count));\n    this.render();\n  }\n\n  /** Set the width (px) of a column by its renderer id (or reset with null). */\n  setColumnWidth(columnId: string, width: number | null): void {\n    if (width == null) delete this.uiState.columnWidths[columnId];\n    else this.uiState.columnWidths[columnId] = Math.max(1, Math.round(width));\n    this.render();\n  }\n\n  /** Forget all user resize/size overrides. */\n  resetSizes(): void {\n    this.uiState.clearSizes();\n    this.render();\n  }\n\n  /** Snapshot of the renderer UI state. */\n  getUIState(): UIStateData {\n    return this.uiState.data;\n  }\n\n  /** Replace the renderer UI state and re-render. */\n  setUIState(data: UIStateData): void {\n    this.uiState.set(data);\n    this.render();\n  }\n\n  /* ---- undo / redo --------------------------------------------------- */\n\n  private captureEntry() {\n    const { dataSource, ...report } = this.engine.getConfiguration();\n    void dataSource;\n    return { report: report as PivotConfiguration, ui: this.uiState.data };\n  }\n\n  private applyEntry(entry: { report: PivotConfiguration; ui?: UIStateData }): void {\n    this.applyingHistory = true;\n    const dataSource = this.engine.getConfiguration().dataSource;\n    if (entry.ui) this.uiState.set(entry.ui);\n    this.engine.setConfiguration({ ...entry.report, dataSource });\n    this.applyingHistory = false;\n    this.applyDirection();\n    this.render();\n  }\n\n  canUndo(): boolean {\n    return this.history.canUndo();\n  }\n\n  canRedo(): boolean {\n    return this.history.canRedo();\n  }\n\n  /** Revert to the previous report/UI state. Returns false when at the start. */\n  undo(): boolean {\n    const entry = this.history.undo();\n    if (!entry) return false;\n    this.applyEntry(entry);\n    return true;\n  }\n\n  /** Re-apply the next report/UI state. Returns false when at the end. */\n  redo(): boolean {\n    const entry = this.history.redo();\n    if (!entry) return false;\n    this.applyEntry(entry);\n    return true;\n  }\n\n  /* ---- save / restore ------------------------------------------------ */\n\n  /** Serialize the full report + UI state to a JSON string. */\n  serializeState(options?: SerializeOptions): string {\n    return serializeSnapshot(this.engine.getConfiguration(), this.uiState.data, options);\n  }\n\n  /** A structured snapshot of the report + UI state. */\n  getSnapshot(options?: SerializeOptions): PivotSnapshot {\n    return createSnapshot(this.engine.getConfiguration(), this.uiState.data, options);\n  }\n\n  /** Restore from a snapshot object or JSON string (keeps the current data). */\n  restoreState(source: PivotSnapshot | string): boolean {\n    const snapshot = typeof source === 'string' ? parseSnapshot(source) : source;\n    if (!snapshot?.report) return false;\n    const dataSource = this.engine.getConfiguration().dataSource;\n    const restoredData = snapshot.report.dataSource;\n    const mergedSource =\n      restoredData && (restoredData.data || restoredData.matrix || restoredData.csv)\n        ? restoredData\n        : { ...restoredData, ...dataSource };\n    this.uiState.set(snapshot.ui ?? {});\n    this.engine.setConfiguration({ ...snapshot.report, dataSource: mergedSource });\n    this.applyDirection();\n    this.history.reset(this.captureEntry());\n    this.render();\n    return true;\n  }\n\n  /** Persist the current state to `localStorage`. */\n  saveToLocalStorage(options?: SerializeOptions & { key?: string }): boolean {\n    return saveToLocalStorage(this.engine.getConfiguration(), this.uiState.data, options);\n  }\n\n  /** Restore state previously written with {@link saveToLocalStorage}. */\n  loadFromLocalStorage(key?: string): boolean {\n    const snapshot = loadFromLocalStorage(key);\n    return snapshot ? this.restoreState(snapshot) : false;\n  }\n\n  /** Persist the current state into `location.hash`. */\n  saveToUrlHash(options?: SerializeOptions & { key?: string }): boolean {\n    return saveToUrlHash(this.engine.getConfiguration(), this.uiState.data, options);\n  }\n\n  /** Restore state previously written with {@link saveToUrlHash}. */\n  loadFromUrlHash(key?: string): boolean {\n    const snapshot = loadFromUrlHash(key);\n    return snapshot ? this.restoreState(snapshot) : false;\n  }\n\n  /** Copy the current grid selection (or focused cell) to the clipboard as TSV. */\n  copySelection(): Promise<boolean> {\n    return copyGridSelection(this.gridEl);\n  }\n\n  on<K extends PivotEventName>(event: K, handler: (payload: PivotEventMap[K]) => void): () => void {\n    return this.engine.on(event, handler);\n  }\n\n  off<K extends PivotEventName>(event: K, handler: (payload: PivotEventMap[K]) => void): void {\n    this.engine.off(event, handler);\n  }\n\n  setTheme(theme: ThemeName): void {\n    applyTheme(this.root, theme);\n  }\n\n  setThemeTokens(tokens: Record<string, string>): void {\n    setThemeTokens(this.root, tokens);\n  }\n\n  /** Apply typed style tokens (the same shape as the `tokens` option). */\n  setTokens(tokens: ThemeTokens): void {\n    applyTokens(this.root, tokens);\n  }\n\n  toggleFieldList(show?: boolean): void {\n    this.showFieldList = show ?? !this.showFieldList;\n    this.render();\n  }\n\n  /** Open the modal \"Fields\" configurator (drag-drop + checklist + Apply/Cancel). */\n  openFieldsDialog(): void {\n    openFieldsDialogImpl(this.ctx);\n  }\n\n  /** Open the number-format dialog (wire this to your own action-bar button). */\n  openFormatDialog(): void {\n    openFormatDialogImpl(this.ctx);\n  }\n\n  /** Open the conditional-formatting dialog. */\n  openConditionalDialog(): void {\n    openConditionalDialogImpl(this.ctx);\n  }\n\n  /** Open the filter dialog for a specific field. */\n  openFilterDialog(uniqueName: string): void {\n    openFilterDialogImpl(this.ctx, uniqueName);\n  }\n\n  /** Update the action-bar configuration and re-render the toolbar. */\n  setActionBar(config: ActionBarConfig): void {\n    this.actionBar = config;\n    if (this.showToolbar) mountToolbar(this.ctx, this.toolbarEl);\n  }\n\n  async toggleFullscreen(): Promise<void> {\n    if (typeof document === 'undefined') return;\n    if (document.fullscreenElement) await document.exitFullscreen();\n    else await this.root.requestFullscreen?.();\n  }\n\n  exportTo(format: ExportFormat, options?: ExportOptions): void {\n    downloadExport(this.engine.getGrid(), format, options);\n  }\n\n  print(title?: string): void {\n    printGrid(this.engine.getGrid(), title);\n  }\n\n  /** The root element of the widget. */\n  get element(): HTMLElement {\n    return this.root;\n  }\n\n  destroy(): void {\n    this.unsubscribe();\n    this.engine.clear();\n    clear(this.root);\n    this.root.classList.remove('ph-root');\n  }\n}\n\nfunction cssSize(value: string | number): string {\n  return typeof value === 'number' ? `${value}px` : value;\n}\n"]}