@dlh.io/bideux 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +90 -0
  3. package/dist/all.d.ts +14 -0
  4. package/dist/all.js +15 -0
  5. package/dist/all.js.map +1 -0
  6. package/dist/chunk-62IQGXLW.js +11470 -0
  7. package/dist/chunk-62IQGXLW.js.map +1 -0
  8. package/dist/chunk-75CRTQK7.js +315 -0
  9. package/dist/chunk-75CRTQK7.js.map +1 -0
  10. package/dist/chunk-FVO6E22Z.js +225 -0
  11. package/dist/chunk-FVO6E22Z.js.map +1 -0
  12. package/dist/chunk-GRITOB4M.js +337 -0
  13. package/dist/chunk-GRITOB4M.js.map +1 -0
  14. package/dist/chunk-HPFHIZWO.js +40 -0
  15. package/dist/chunk-HPFHIZWO.js.map +1 -0
  16. package/dist/chunk-IMNUQGHE.js +2864 -0
  17. package/dist/chunk-IMNUQGHE.js.map +1 -0
  18. package/dist/chunk-LHD445PJ.js +571 -0
  19. package/dist/chunk-LHD445PJ.js.map +1 -0
  20. package/dist/chunk-LPLBBHOW.js +386 -0
  21. package/dist/chunk-LPLBBHOW.js.map +1 -0
  22. package/dist/chunk-NGM5R3LW.js +881 -0
  23. package/dist/chunk-NGM5R3LW.js.map +1 -0
  24. package/dist/chunk-OMPR32AR.js +1320 -0
  25. package/dist/chunk-OMPR32AR.js.map +1 -0
  26. package/dist/chunk-QDQ5VVTC.js +255 -0
  27. package/dist/chunk-QDQ5VVTC.js.map +1 -0
  28. package/dist/chunk-RRWZKNDZ.js +1004 -0
  29. package/dist/chunk-RRWZKNDZ.js.map +1 -0
  30. package/dist/chunk-SRWIBMEB.js +178 -0
  31. package/dist/chunk-SRWIBMEB.js.map +1 -0
  32. package/dist/element/chunk-AOKCBPMV.js +1646 -0
  33. package/dist/element/chunk-AOKCBPMV.js.map +1 -0
  34. package/dist/element/chunk-B67SYRQP.js +281 -0
  35. package/dist/element/chunk-B67SYRQP.js.map +1 -0
  36. package/dist/element/chunk-FNRVFA2C.js +55 -0
  37. package/dist/element/chunk-FNRVFA2C.js.map +1 -0
  38. package/dist/element/chunk-G3C722QP.js +4707 -0
  39. package/dist/element/chunk-G3C722QP.js.map +1 -0
  40. package/dist/element/chunk-H5IFOSQP.js +346 -0
  41. package/dist/element/chunk-H5IFOSQP.js.map +1 -0
  42. package/dist/element/chunk-LXR3CLCN.js +30 -0
  43. package/dist/element/chunk-LXR3CLCN.js.map +1 -0
  44. package/dist/element/chunk-TFV4CJR4.js +183 -0
  45. package/dist/element/chunk-TFV4CJR4.js.map +1 -0
  46. package/dist/element/chunk-TXSK3CIN.js +859 -0
  47. package/dist/element/chunk-TXSK3CIN.js.map +1 -0
  48. package/dist/element/chunk-WDTTBY3S.js +45 -0
  49. package/dist/element/chunk-WDTTBY3S.js.map +1 -0
  50. package/dist/element/chunk-ZI3RYCAR.js +233 -0
  51. package/dist/element/chunk-ZI3RYCAR.js.map +1 -0
  52. package/dist/element/element.d.ts +3044 -0
  53. package/dist/element/element.js +146554 -0
  54. package/dist/element/element.js.map +1 -0
  55. package/dist/element/revo-grid.entry-7FHEBN3O.js +4817 -0
  56. package/dist/element/revo-grid.entry-7FHEBN3O.js.map +1 -0
  57. package/dist/element/revogr-attribution_7.entry-LSOFVZRA.js +1328 -0
  58. package/dist/element/revogr-attribution_7.entry-LSOFVZRA.js.map +1 -0
  59. package/dist/element/revogr-clipboard_3.entry-V74UIBPJ.js +494 -0
  60. package/dist/element/revogr-clipboard_3.entry-V74UIBPJ.js.map +1 -0
  61. package/dist/element/revogr-data_4.entry-2UBOKTFN.js +1041 -0
  62. package/dist/element/revogr-data_4.entry-2UBOKTFN.js.map +1 -0
  63. package/dist/element/revogr-filter-panel.entry-B24PLQU4.js +552 -0
  64. package/dist/element/revogr-filter-panel.entry-B24PLQU4.js.map +1 -0
  65. package/dist/index.d.ts +1041 -0
  66. package/dist/index.js +10 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/react.d.ts +1915 -0
  69. package/dist/react.js +14 -0
  70. package/dist/react.js.map +1 -0
  71. package/dist/renderers/echarts.d.ts +44 -0
  72. package/dist/renderers/echarts.js +6 -0
  73. package/dist/renderers/echarts.js.map +1 -0
  74. package/dist/renderers/index.d.ts +48 -0
  75. package/dist/renderers/index.js +12 -0
  76. package/dist/renderers/index.js.map +1 -0
  77. package/dist/renderers/revogrid.d.ts +76 -0
  78. package/dist/renderers/revogrid.js +6 -0
  79. package/dist/renderers/revogrid.js.map +1 -0
  80. package/dist/renderers/tabulator.d.ts +37 -0
  81. package/dist/renderers/tabulator.js +6 -0
  82. package/dist/renderers/tabulator.js.map +1 -0
  83. package/dist/result-table-CPls-277.d.ts +1885 -0
  84. package/dist/schema/dashboard.schema.json +4374 -0
  85. package/dist/schema/semantic-model.schema.json +1200 -0
  86. package/dist/schema/widget.schema.json +1793 -0
  87. package/dist/styles.css +156 -0
  88. package/dist/theme.css +1789 -0
  89. package/dist/types-CHFSsU_X.d.ts +1007 -0
  90. package/package.json +119 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../dashboard-core/src/dashboard-template.ts","../../dashboard-core/src/grid-config.ts","../../dashboard-core/src/layout.ts","../../dashboard-core/src/model-document.ts","../../dashboard-core/src/model-builder-checks.ts","../../dashboard-core/src/model-templates.ts","../../dashboard-core/src/model-yaml-markers.ts","../../dashboard-core/src/widget-builder-checks.ts","../../dashboard-core/src/dashboard-document.ts","../../dashboard-core/src/widget-document.ts","../../dashboard-core/src/widget-template.ts","../../dashboard-core/src/widget-yaml-markers.ts","../../dashboard-renderers/src/dashboard-tabs.ts","../../dashboard-renderers/src/responsive.ts","../../dashboard-renderers/src/reader-grid.ts","../../dashboard-renderers/src/result-table.ts"],"names":["parseDocument","text","isSeq","LineCounter","isMap","str","mapAt","mapsOf","stringList","isScalar","setStringSeq","setOrDelete","delta","positionOf"],"mappings":"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","file":"chunk-IMNUQGHE.js","sourcesContent":["/**\n * Ready-to-edit YAML for a brand new dashboard.\n *\n * A new dashboard already has a place for its controls. Without a filter panel\n * a filter added later becomes an ordinary tile somewhere on the grid, which is\n * not where a reader looks for one. It also has one tab, because a widget has\n * to be added to a tab and a dashboard with no tabs has nowhere to put it.\n */\n\nexport interface DashboardTemplateOptions {\n /** The address the dashboard will be created under. Seeds the document id. */\n slug: string;\n /** What the dashboard is called. */\n name: string;\n /** What the dashboard is for, written into the manifest as given. */\n description?: string;\n}\n\n/** The YAML of a blank dashboard, valid the moment it is read back. */\nexport function dashboardTemplate(options: DashboardTemplateOptions): string {\n const { slug, name, description = \"\" } = options;\n return [\n 'version: \"1.0\"',\n \"kind: dashboard\",\n \"metadata:\",\n ` id: ${slug}`,\n ` name: ${JSON.stringify(name)}`,\n ` description: ${JSON.stringify(description)}`,\n \"spec:\",\n \" config:\",\n \" filterPanel:\",\n \" position: top\",\n \" collapsible: true\",\n \" tabs:\",\n \" - id: main\",\n \" label: Main\",\n \" widgets: []\",\n \"\",\n ].join(\"\\n\");\n}\n","import type { DashboardGridConfig } from \"./types.js\";\n\nexport const MAX_LAYOUT_WIDTHS: Record<\n \"mobile\" | \"tablet\" | \"desktop\" | \"wide\",\n number\n> = {\n mobile: 480,\n tablet: 768,\n desktop: 1024,\n wide: 1440,\n};\n\n/**\n * Default grid behavior for dashboards.\n * Authors can override these values through dashboard.spec.config.grid.\n */\nexport const DEFAULT_GRID_CONFIG: DashboardGridConfig = {\n compactType: \"vertical\",\n preventCollision: false,\n allowOverlap: false,\n isBounded: true,\n draggableHandle: \".custom-drag-handle\",\n draggableCancel: \".widget-edit-btn, .widget-remove-btn\",\n resizeHandles: [\"se\", \"sw\"],\n containerPadding: null,\n maxRows: 12,\n maxLayoutWidth: \"wide\",\n snap: false,\n squareCells: true,\n};\n\n/**\n * Resolve the compactType and preventCollision values for the current\n * snap setting.\n * - Snap on = vertical compaction + collision re-ordering, so a drag pushes the\n * neighbours it lands on out of the way.\n * - Snap off = no compaction + collision prevention. This gives free placement\n * to any empty cell up to maxRows; dragging an item onto another reverts it.\n *\n * Collisions are prevented in free placement regardless of what the dashboard\n * declares, because `preventCollision: false` without compaction is the one\n * combination that lets a widget be dropped on top of another and stay there.\n * A dashboard that genuinely wants stacking sets `allowOverlap`.\n */\nexport function resolveSnap(\n grid: DashboardGridConfig,\n snap: boolean,\n): {\n compactType: \"vertical\" | \"horizontal\" | null;\n preventCollision: boolean;\n} {\n if (grid.allowOverlap) {\n return { compactType: null, preventCollision: false };\n }\n if (!snap) {\n return { compactType: null, preventCollision: true };\n }\n return {\n compactType: grid.compactType ?? \"vertical\",\n preventCollision: false,\n };\n}\n","import type {\n Breakpoint,\n DashboardFilterPanelConfig,\n DashboardSpec,\n LayoutItem,\n ResponsiveLayouts,\n WidgetSpec,\n} from \"./types.js\";\n\nexport const BREAKPOINT_MAP: Record<string, Breakpoint> = {\n lg: \"wide\",\n md: \"desktop\",\n sm: \"tablet\",\n xs: \"mobile\",\n xxs: \"mobile\",\n};\n\n/** The layout keys whose breakpoints are phone sized. */\nconst NARROW_KEYS = [\"xs\", \"xxs\"] as const;\n\n/** Components that are controls the reader changes rather than tiles on the grid. */\nexport const CONTROL_COMPONENTS = new Set([\"filter\", \"select\"]);\n\nexport function isControlComponent(component: string): boolean {\n return CONTROL_COMPONENTS.has(component);\n}\n\n/**\n * The filter panel configuration under either spelling the specification\n * accepts. A document read straight from YAML keeps `filter_panel`; one read back\n * from a Pydantic model carries `filterPanel`.\n */\nexport function filterPanelConfig(\n dashboard: DashboardSpec,\n): DashboardFilterPanelConfig | undefined {\n const config = dashboard.spec.config;\n if (config === undefined || config === null) return undefined;\n const panel = config.filterPanel ?? config[\"filter_panel\"];\n if (typeof panel !== \"object\" || panel === null || Array.isArray(panel)) {\n return undefined;\n }\n return panel as DashboardFilterPanelConfig;\n}\n\n/**\n * True when the dashboard shows this widget in its filter panel rather than as a\n * tile, so it must not reserve a cell on the grid.\n */\nexport function isPanelledControl(\n widget: WidgetSpec,\n dashboard: DashboardSpec,\n): boolean {\n return (\n Boolean(filterPanelConfig(dashboard)) &&\n isControlComponent(widget.spec.component ?? \"echarts\")\n );\n}\n\n/**\n * Drop the panelled controls from every breakpoint of a set of layouts.\n *\n * A control drawn in the filter panel that still holds a cell leaves a hole the\n * tiles around it were placed away from, and free placement never closes it.\n */\nexport function stripPanelledControls(\n layouts: ResponsiveLayouts,\n widgets: Record<string, WidgetSpec>,\n dashboard: DashboardSpec,\n): ResponsiveLayouts {\n const controls = new Set(\n Object.values(widgets)\n .filter((widget) => isPanelledControl(widget, dashboard))\n .map((widget) => widget.metadata.id),\n );\n if (controls.size === 0) return layouts;\n const out: ResponsiveLayouts = {};\n for (const [key, list] of Object.entries(layouts)) {\n out[key] = (list ?? []).filter((item) => !controls.has(item.i));\n }\n return out;\n}\n\nfunction clamp(n: number, min: number, max: number) {\n return Math.max(min, Math.min(n, max));\n}\n\nexport function layoutForBreakpoint(\n widget: WidgetSpec,\n bp: Breakpoint,\n colCount: number,\n maxRows?: number,\n): LayoutItem {\n const base = widget.spec.layout ?? {};\n const responsive = base.responsive ?? {};\n const bpLayout = responsive[bp] ?? base;\n\n const minW = clamp(bpLayout.minW ?? base.minW ?? 2, 1, colCount);\n const minH = Math.max(1, bpLayout.minH ?? base.minH ?? 2);\n const w = clamp(bpLayout.w ?? base.w ?? 4, minW, colCount);\n const x = clamp(bpLayout.x ?? base.x ?? 0, 0, colCount - w);\n let h = Math.max(minH, bpLayout.h ?? base.h ?? 4);\n const y = Math.max(0, bpLayout.y ?? base.y ?? 0);\n\n // Only the height is capped. Pulling y up to fit the row limit dropped a\n // widget on the one above, the collision pass pushed it back down, and the\n // grid reported it as moved however often the layout was saved.\n if (maxRows !== undefined && maxRows > 0) {\n h = Math.min(h, maxRows);\n }\n\n const layout: LayoutItem = {\n i: widget.metadata.id,\n x,\n y,\n w,\n h,\n minW,\n minH,\n };\n\n const maxW = bpLayout.maxW ?? base.maxW;\n if (typeof maxW === \"number\" && maxW > 0) {\n layout.maxW = clamp(maxW, 1, colCount);\n }\n const maxH = bpLayout.maxH ?? base.maxH;\n if (typeof maxH === \"number\" && maxH > 0) {\n layout.maxH = Math.max(1, maxH);\n }\n\n const isBounded = bpLayout.isBounded ?? base.isBounded;\n if (typeof isBounded === \"boolean\") layout.isBounded = isBounded;\n\n const isDraggable = bpLayout.isDraggable ?? base.isDraggable;\n if (typeof isDraggable === \"boolean\") layout.isDraggable = isDraggable;\n\n const isResizable = bpLayout.isResizable ?? base.isResizable;\n if (typeof isResizable === \"boolean\") layout.isResizable = isResizable;\n\n const resizeHandles = bpLayout.resizeHandles ?? base.resizeHandles;\n if (Array.isArray(resizeHandles) && resizeHandles.length > 0) {\n layout.resizeHandles = resizeHandles as NonNullable<\n LayoutItem[\"resizeHandles\"]\n >;\n }\n\n return layout;\n}\n\n/** True when two grid items share any cell. */\nexport function itemsCollide(a: LayoutItem, b: LayoutItem): boolean {\n if (a.i === b.i) return false;\n return (\n a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y\n );\n}\n\n/**\n * The topmost, then leftmost, empty rectangle that fits a widget of this size.\n *\n * Scanning for a gap rather than always appending at the bottom is what makes a\n * widget land somewhere usable: a dashboard with one tall chart on the left has\n * room beside it, and dropping the next widget far below that looks broken.\n */\nexport function firstFreeSlot(\n existing: LayoutItem[],\n w: number,\n h: number,\n colCount: number,\n): { x: number; y: number } {\n const width = Math.min(w, colCount);\n const bottomY = existing.reduce(\n (max, item) => Math.max(max, item.y + item.h),\n 0,\n );\n for (let y = 0; y <= bottomY; y += 1) {\n for (let x = 0; x + width <= colCount; x += 1) {\n const candidate: LayoutItem = { i: \"__probe__\", x, y, w: width, h };\n if (!existing.some((item) => itemsCollide(candidate, item))) {\n return { x, y };\n }\n }\n }\n return { x: 0, y: bottomY };\n}\n\n/**\n * Push overlapping items down until nothing shares a cell.\n *\n * Positions are honoured where they can be: an item only moves when something\n * already sits where it wants to be, and it moves down rather than sideways so\n * columns the author chose survive. Rows are not capped here, because squashing\n * an item back inside a row limit is what put two widgets on top of each other\n * in the first place. Callers grow the grid instead.\n */\nexport function resolveCollisions(items: LayoutItem[]): LayoutItem[] {\n const ordered = [...items].sort((a, b) => a.y - b.y || a.x - b.x);\n const placed: LayoutItem[] = [];\n for (const item of ordered) {\n let y = Math.max(0, item.y);\n let candidate: LayoutItem = { ...item, y };\n while (placed.some((other) => itemsCollide(candidate, other))) {\n y += 1;\n candidate = { ...item, y };\n }\n placed.push(candidate);\n }\n // Return the caller's order so a collision pass changes positions only.\n const byId = new Map(placed.map((item) => [item.i, item]));\n return items.map((item) => byId.get(item.i) ?? item);\n}\n\n/** The rows every breakpoint needs before anything has to overlap. */\nexport function requiredRows(layouts: ResponsiveLayouts): number {\n let rows = 0;\n for (const list of Object.values(layouts)) {\n for (const item of list ?? []) {\n rows = Math.max(rows, item.y + item.h);\n }\n }\n return rows;\n}\n\n/** The ids that sit on top of another widget, in the layout as given. */\nexport function overlappingIds(layouts: ResponsiveLayouts): string[] {\n const found = new Set<string>();\n for (const list of Object.values(layouts)) {\n const items = (list ?? []) as LayoutItem[];\n for (let i = 0; i < items.length; i += 1) {\n for (let j = i + 1; j < items.length; j += 1) {\n const first = items[i];\n const second = items[j];\n if (\n first !== undefined &&\n second !== undefined &&\n itemsCollide(first, second)\n ) {\n found.add(first.i);\n found.add(second.i);\n }\n }\n }\n }\n return [...found];\n}\n\n/**\n * The ids whose position or size differ between two sets of layouts.\n *\n * *only* narrows this to a single breakpoint. A narrow breakpoint reflows what a\n * wide one saved, so counting every breakpoint named widgets as moved that\n * nobody looking at the page could see, and saving never cleared the notice.\n */\nexport function movedIds(\n before: ResponsiveLayouts,\n after: ResponsiveLayouts,\n only?: string,\n): string[] {\n const found = new Set<string>();\n for (const [key, list] of Object.entries(before)) {\n if (only !== undefined && key !== only) continue;\n const afterById = new Map(\n ((after[key] ?? []) as LayoutItem[]).map((item) => [item.i, item]),\n );\n for (const item of (list ?? []) as LayoutItem[]) {\n const moved = afterById.get(item.i);\n if (!moved) continue;\n if (\n moved.x !== item.x ||\n moved.y !== item.y ||\n moved.w !== item.w ||\n moved.h !== item.h\n ) {\n found.add(item.i);\n }\n }\n }\n return [...found];\n}\n\nfunction maybeResolve(items: LayoutItem[], resolve: boolean): LayoutItem[] {\n return resolve ? resolveCollisions(items) : items;\n}\n\nfunction placeWidgetInFirstGap(\n widget: WidgetSpec,\n bp: Breakpoint,\n colCount: number,\n existing: LayoutItem[],\n maxRows?: number,\n): LayoutItem {\n const layout = layoutForBreakpoint(widget, bp, colCount, maxRows);\n const slot = firstFreeSlot(existing, layout.w, layout.h, colCount);\n layout.x = slot.x;\n layout.y = slot.y;\n return layout;\n}\n\ntype LayoutColumnCounts = {\n lg: number;\n md: number;\n sm: number;\n xs: number;\n xxs: number;\n};\n\nfunction dashboardColumns(\n dashboard: DashboardSpec,\n gridOverrides: Partial<\n Record<Breakpoint, { rowHeight?: number; cols?: number }>\n >,\n): LayoutColumnCounts {\n const responsive = dashboard.spec.responsive;\n return {\n lg: gridOverrides.wide?.cols ?? responsive?.wide?.cols ?? 24,\n md: gridOverrides.desktop?.cols ?? responsive?.desktop?.cols ?? 24,\n sm: gridOverrides.tablet?.cols ?? responsive?.tablet?.cols ?? 24,\n xs: gridOverrides.mobile?.cols ?? responsive?.mobile?.cols ?? 24,\n xxs: gridOverrides.mobile?.cols ?? responsive?.mobile?.cols ?? 24,\n };\n}\n\nconst LAYOUT_BREAKPOINTS: Record<\n keyof LayoutColumnCounts,\n { bp: Breakpoint; cols: keyof LayoutColumnCounts }\n> = {\n lg: { bp: \"wide\", cols: \"lg\" },\n md: { bp: \"desktop\", cols: \"md\" },\n sm: { bp: \"tablet\", cols: \"sm\" },\n xs: { bp: \"mobile\", cols: \"xs\" },\n xxs: { bp: \"mobile\", cols: \"xxs\" },\n};\n\n/**\n * Ensure every grid breakpoint and widget has an explicit layout item.\n *\n * Responsive invents absent breakpoints and children while rendering. Keeping\n * the coverage here means those generated positions never become drafts.\n */\nexport function ensureLayoutCoverage(\n layouts: ResponsiveLayouts,\n widgets: Record<string, WidgetSpec>,\n dashboard: DashboardSpec,\n gridOverrides: Partial<\n Record<Breakpoint, { rowHeight?: number; cols?: number }>\n > = {},\n unplacedWidgetIds: string[] = [],\n maxRows?: number,\n): ResponsiveLayouts {\n const cols = dashboardColumns(dashboard, gridOverrides);\n const base = buildBaseLayouts(\n widgets,\n dashboard,\n gridOverrides,\n unplacedWidgetIds,\n maxRows,\n { resolve: false },\n );\n const out: ResponsiveLayouts = {};\n const excluded = new Set(unplacedWidgetIds);\n for (const [key, { bp, cols: colsKey }] of Object.entries(\n LAYOUT_BREAKPOINTS,\n ) as Array<\n [\n keyof LayoutColumnCounts,\n { bp: Breakpoint; cols: keyof LayoutColumnCounts },\n ]\n >) {\n const existing = [...((layouts[key] ?? []) as LayoutItem[])].filter(\n (item) => {\n const widget = widgets[item.i];\n return (\n widget !== undefined &&\n !excluded.has(item.i) &&\n !isPanelledControl(widget, dashboard)\n );\n },\n );\n const ids = new Set(existing.map((item) => item.i));\n const colCount = cols[colsKey];\n for (const widget of Object.values(widgets)) {\n if (ids.has(widget.metadata.id)) continue;\n if (!(base[key] ?? []).some((item) => item.i === widget.metadata.id)) {\n continue;\n }\n existing.push(\n placeWidgetInFirstGap(widget, bp, colCount, existing, maxRows),\n );\n ids.add(widget.metadata.id);\n }\n out[key] = existing;\n }\n return out;\n}\n\n/**\n * Scale horizontal geometry when a breakpoint changes column space.\n *\n * Positions and widths stay in the same relative place instead of being\n * clamped into the new grid and then collision-resolved into a new order.\n */\nexport function rescaleLayoutColumns(\n layouts: ResponsiveLayouts,\n key: string,\n oldCols: number,\n newCols: number,\n): ResponsiveLayouts {\n const safeOldCols = Math.max(1, Math.floor(oldCols));\n const safeNewCols = Math.max(1, Math.floor(newCols));\n if (safeOldCols === safeNewCols) return layouts;\n const list = layouts[key];\n if (!list) return layouts;\n return {\n ...layouts,\n [key]: (list as LayoutItem[]).map((item) => {\n const w = clamp(\n Math.round((item.w * safeNewCols) / safeOldCols),\n 1,\n safeNewCols,\n );\n const x = clamp(\n Math.round((item.x * safeNewCols) / safeOldCols),\n 0,\n safeNewCols - w,\n );\n const minW =\n item.minW === undefined\n ? undefined\n : clamp(Math.round((item.minW * safeNewCols) / safeOldCols), 1, w);\n const maxW =\n item.maxW === undefined\n ? undefined\n : clamp(\n Math.round((item.maxW * safeNewCols) / safeOldCols),\n w,\n safeNewCols,\n );\n return {\n ...item,\n x,\n w,\n ...(minW === undefined ? {} : { minW }),\n ...(maxW === undefined ? {} : { maxW }),\n };\n }),\n };\n}\n\nexport function computeRequiredMaxRows(\n layouts: ResponsiveLayouts,\n widget: WidgetSpec,\n dashboard: DashboardSpec,\n gridOverrides: Partial<\n Record<Breakpoint, { rowHeight?: number; cols?: number }>\n > = {},\n currentMaxRows?: number,\n): number | undefined {\n // A panelled control takes no cell, so it must not grow the grid either.\n if (isPanelledControl(widget, dashboard)) return currentMaxRows;\n const cols = dashboardColumns(dashboard, gridOverrides);\n const bpMap: Record<string, { bp: Breakpoint; cols: number }> = {\n lg: { bp: \"wide\", cols: cols.lg },\n md: { bp: \"desktop\", cols: cols.md },\n sm: { bp: \"tablet\", cols: cols.sm },\n xs: { bp: \"mobile\", cols: cols.xs },\n xxs: { bp: \"mobile\", cols: cols.xxs },\n };\n let required = 0;\n for (const [key, { bp, cols: colCount }] of Object.entries(bpMap)) {\n const list = (layouts[key] ?? []) as LayoutItem[];\n const bottomY = list.reduce(\n (max, item) => Math.max(max, item.y + item.h),\n 0,\n );\n const h = layoutForBreakpoint(widget, bp, colCount, undefined).h;\n required = Math.max(required, bottomY + h);\n }\n if (currentMaxRows === undefined || !Number.isFinite(currentMaxRows)) {\n return currentMaxRows;\n }\n return Math.max(currentMaxRows, required);\n}\n\nexport function addWidgetToLayouts(\n layouts: ResponsiveLayouts,\n widget: WidgetSpec,\n dashboard: DashboardSpec,\n gridOverrides: Partial<\n Record<Breakpoint, { rowHeight?: number; cols?: number }>\n > = {},\n maxRows?: number,\n): ResponsiveLayouts {\n // The filter panel decides where a control goes, so reserving a cell for one\n // only left a hole on the grid that nothing filled.\n if (isPanelledControl(widget, dashboard)) {\n const cleared: ResponsiveLayouts = {};\n for (const [key, list] of Object.entries(layouts)) {\n cleared[key] = (list ?? []).filter(\n (item) => item.i !== widget.metadata.id,\n );\n }\n return cleared;\n }\n const cols = dashboardColumns(dashboard, gridOverrides);\n const bpMap: Record<string, { bp: Breakpoint; cols: number }> = {\n lg: { bp: \"wide\", cols: cols.lg },\n md: { bp: \"desktop\", cols: cols.md },\n sm: { bp: \"tablet\", cols: cols.sm },\n xs: { bp: \"mobile\", cols: cols.xs },\n xxs: { bp: \"mobile\", cols: cols.xxs },\n };\n const next: ResponsiveLayouts = {};\n for (const [key, { bp, cols: colCount }] of Object.entries(bpMap)) {\n const list = (layouts[key] ?? []).filter(\n (item) => item.i !== widget.metadata.id,\n );\n next[key] = [\n ...list,\n placeWidgetInFirstGap(widget, bp, colCount, list, maxRows),\n ];\n }\n return next;\n}\n\nexport function filterLayoutsByIds(\n layouts: ResponsiveLayouts,\n ids: Set<string>,\n): ResponsiveLayouts {\n const out: ResponsiveLayouts = {};\n for (const [key, list] of Object.entries(layouts)) {\n out[key] = (list ?? []).filter((item) => ids.has(item.i));\n }\n return out;\n}\n\nfunction clampLayoutItem(\n item: LayoutItem,\n colCount: number,\n maxRows?: number,\n): LayoutItem {\n const w = Math.min(item.w, colCount);\n const x = Math.max(0, Math.min(item.x, colCount - w));\n let h = item.h;\n const y = Math.max(0, item.y);\n if (maxRows !== undefined && maxRows > 0) {\n // Only the height is capped. Pulling y up to fit a row limit is what used\n // to drop a widget on top of the one above it; the grid grows instead.\n h = Math.min(h, maxRows);\n }\n return { ...item, x, y, w, h };\n}\n\nexport function sanitizeLayouts(\n layouts: ResponsiveLayouts,\n cols: { lg: number; md: number; sm: number; xs: number; xxs: number },\n maxRows?: number,\n): ResponsiveLayouts {\n const colCounts = {\n lg: cols.lg,\n md: cols.md,\n sm: cols.sm,\n xs: cols.xs,\n xxs: cols.xxs,\n };\n const out: ResponsiveLayouts = {};\n for (const [key, list] of Object.entries(layouts)) {\n const colCount = colCounts[key as keyof typeof colCounts] ?? cols.md;\n out[key] = resolveCollisions(\n (list ?? []).map((item) => clampLayoutItem(item, colCount, maxRows)),\n );\n }\n return out;\n}\n\nexport function mergeLayouts(\n base: ResponsiveLayouts,\n overlay: ResponsiveLayouts,\n): ResponsiveLayouts {\n const out: ResponsiveLayouts = {};\n const keys = new Set([...Object.keys(base), ...Object.keys(overlay)]);\n for (const key of keys) {\n const baseList = (base[key] ?? []) as LayoutItem[];\n const overlayList = (overlay[key] ?? []) as LayoutItem[];\n const map = new Map(baseList.map((item) => [item.i, item]));\n for (const item of overlayList) {\n map.set(item.i, item);\n }\n out[key] = Array.from(map.values());\n }\n return out;\n}\n\n/**\n * Copy the desktop (md) and wide (lg) layouts to each other when one side is\n * empty. This keeps the editor and the wide preview in sync for dashboards that\n * do not define separate responsive positions for desktop vs wide.\n */\nexport function syncDesktopWideLayouts(\n layouts: ResponsiveLayouts,\n cols: { lg: number; md: number; sm: number; xs: number; xxs: number },\n): ResponsiveLayouts {\n if (cols.lg !== cols.md) return layouts;\n const md = layouts.md ?? [];\n const lg = layouts.lg ?? [];\n if (md.length === 0 && lg.length === 0) return layouts;\n\n const out = { ...layouts };\n if (md.length === 0 && lg.length > 0) {\n out.md = lg.map((item) => ({ ...item }));\n } else if (lg.length === 0 && md.length > 0) {\n out.lg = md.map((item) => ({ ...item }));\n }\n return out;\n}\n\n/**\n * Copy the active layout into its desktop/wide sibling when both breakpoints\n * use the same number of columns. This ensures that dragging or resizing in one\n * view is reflected in the other.\n */\nexport function syncActiveLayoutToDesktopWide(\n layouts: ResponsiveLayouts,\n activeKey: string,\n cols: { lg: number; md: number; sm: number; xs: number; xxs: number },\n): ResponsiveLayouts {\n if (cols.lg !== cols.md) return layouts;\n if (activeKey !== \"md\" && activeKey !== \"lg\") return layouts;\n const sibling = activeKey === \"md\" ? \"lg\" : \"md\";\n const activeList = layouts[activeKey] ?? [];\n if (activeList.length === 0) return layouts;\n return { ...layouts, [sibling]: activeList.map((item) => ({ ...item })) };\n}\n\n/**\n * One widget per row, full width, in the order the layout reads.\n *\n * Authored order is kept (top to bottom, then left to right) but authored widths\n * are not: a mobile position written as half of a twenty column grid leaves a\n * chart about 150px across, which holds neither an axis label nor a legend.\n */\nfunction stackItems(items: LayoutItem[], colCount: number): LayoutItem[] {\n const ordered = [...items].sort((a, b) => a.y - b.y || a.x - b.x);\n let y = 0;\n const placed = new Map<string, LayoutItem>();\n for (const item of ordered) {\n placed.set(item.i, {\n ...item,\n x: 0,\n y,\n w: colCount,\n ...(item.minW === undefined\n ? {}\n : { minW: Math.min(item.minW, colCount) }),\n // An authored ceiling of half the grid would undo the full width.\n ...(item.maxW !== undefined ? { maxW: colCount } : {}),\n });\n y += item.h;\n }\n return items.map((item) => placed.get(item.i) ?? item);\n}\n\n/**\n * Stack the phone breakpoints of a set of layouts, leaving every other\n * breakpoint untouched.\n *\n * Read at render time rather than saved, so a dashboard whose desktop layout\n * changes later still reflows on a phone, and the YAML keeps whatever its author\n * wrote.\n */\nexport function stackNarrowLayouts(\n layouts: ResponsiveLayouts,\n cols: { xs: number; xxs: number },\n): ResponsiveLayouts {\n const out: ResponsiveLayouts = { ...layouts };\n for (const key of NARROW_KEYS) {\n const list = (layouts[key] ?? []) as LayoutItem[];\n if (list.length === 0) continue;\n out[key] = stackItems(list, cols[key]);\n }\n return out;\n}\n\nexport function buildBaseLayouts(\n widgets: Record<string, WidgetSpec>,\n dashboard: DashboardSpec,\n gridOverrides: Partial<\n Record<Breakpoint, { rowHeight?: number; cols?: number }>\n > = {},\n unplacedWidgetIds?: string[],\n maxRows?: number,\n /**\n * Set false to read the positions exactly as the specs declare them, which is\n * how a caller can tell what had to be moved to stop widgets overlapping.\n */\n options: { resolve?: boolean } = {},\n): ResponsiveLayouts {\n const resolve = options.resolve !== false;\n const exclude = new Set(unplacedWidgetIds ?? []);\n // A dashboard with a filter panel shows its controls there, so a control must\n // not reserve a cell on the grid as well. Reserving one left an invisible hole\n // that the tiles around it were then pushed away from.\n const controlsArePanelled = Boolean(filterPanelConfig(dashboard));\n const widgetList = Object.values(widgets).filter(\n (w) =>\n !exclude.has(w.metadata.id) &&\n !(\n controlsArePanelled && isControlComponent(w.spec.component ?? \"echarts\")\n ),\n );\n const cols = dashboardColumns(dashboard, gridOverrides);\n const bpMap: Record<string, { bp: Breakpoint; cols: number }> = {\n lg: { bp: \"wide\", cols: cols.lg },\n md: { bp: \"desktop\", cols: cols.md },\n sm: { bp: \"tablet\", cols: cols.sm },\n xs: { bp: \"mobile\", cols: cols.xs },\n xxs: { bp: \"mobile\", cols: cols.xxs },\n };\n return Object.fromEntries(\n Object.entries(bpMap).map(([key, { bp, cols: colCount }]) => [\n key,\n // Saved specs can declare the same cell twice, and a widget written by the\n // Builder or the assistant starts at 0,0 by default, so the positions are\n // separated here rather than drawn on top of each other.\n maybeResolve(\n widgetList.map((w) => layoutForBreakpoint(w, bp, colCount, maxRows)),\n resolve,\n ),\n ]),\n ) as ResponsiveLayouts;\n}\n\n/**\n * The grid's layouts renamed for storage: `lg`, `md`, `sm`, `xs` become\n * `wide`, `desktop`, `tablet`, `mobile`, which is how a widget document names\n * its `layout.responsive` entries and what a layout save port expects.\n * `xxs` only fills `mobile` when `xs` gave nothing.\n */\nexport function layoutsForSave(\n layouts: ResponsiveLayouts,\n): Partial<Record<Breakpoint, LayoutItem[]>> {\n const out: Partial<Record<Breakpoint, LayoutItem[]>> = {};\n for (const key of [\"lg\", \"md\", \"sm\", \"xs\", \"xxs\"]) {\n const items = layouts[key];\n const bp = BREAKPOINT_MAP[key];\n if (!items || bp === undefined || out[bp] !== undefined) continue;\n out[bp] = items.map((item) => ({ ...item }));\n }\n return out;\n}\n","/**\n * Read and edit the semantic model as a YAML document, not as an object.\n *\n * The Builder is a second way to edit one text, never a second source of truth.\n * So every edit here goes through the `yaml` Document API and touches only the\n * keys it is responsible for: comments, key order, quoting style and anything\n * the Builder does not understand (mesh plans, `ai_context`, custom renderers)\n * survive an edit untouched. That is what makes the Builder | YAML toggle safe\n * in both directions.\n */\n\nimport {\n Document,\n isMap,\n isScalar,\n isSeq,\n parseDocument,\n type YAMLMap,\n type YAMLSeq,\n} from \"yaml\";\n\n/** A data store as the Builder presents it: no UUID typed by hand. */\nexport interface BuilderDataStore {\n id: string;\n name: string | null;\n vendor: string | null;\n /** Host connection identifier, written from a dropdown choice. */\n dataModelId: string | null;\n isDefault: boolean;\n}\n\nexport type BuilderDimensionType =\n | \"string\"\n | \"number\"\n | \"date\"\n | \"time\"\n | \"boolean\";\n\nexport interface BuilderDimension {\n id: string;\n column: string | null;\n type: BuilderDimensionType;\n isTime: boolean;\n}\n\nexport interface BuilderMetric {\n id: string;\n label: string | null;\n /** SQL such as `SUM(NET_SALES)`, whether typed or built from a dropdown. */\n expression: string;\n type: \"sql\" | \"formula\";\n}\n\nexport interface BuilderRollup {\n source: string | null;\n grain: string[];\n metrics: string[];\n}\n\nexport interface BuilderDataset {\n id: string;\n name: string | null;\n dataStoreId: string | null;\n source: string | null;\n sourceType: string | null;\n /** The column carrying the location key, which scoping needs. */\n filterField: string | null;\n dimensions: BuilderDimension[];\n metrics: BuilderMetric[];\n rollup: BuilderRollup | null;\n /**\n * Keys the Builder has no editor for. Non-empty means the dataset is shown\n * read-only rather than being silently flattened on the next edit.\n */\n unsupportedKeys: string[];\n}\n\nexport type BuilderCardinality =\n | \"one_to_one\"\n | \"many_to_one\"\n | \"one_to_many\"\n | \"many_to_many\";\n\n/** A join between two datasets, as a pair of dataset ids and column pairs. */\nexport interface BuilderRelationship {\n name: string;\n from: string | null;\n to: string | null;\n /** Positionally matched with `toColumns`, which is how the engine reads them. */\n fromColumns: string[];\n toColumns: string[];\n cardinality: BuilderCardinality | null;\n unsupportedKeys: string[];\n}\n\n/** A metric declared on the model rather than inside one dataset. */\nexport interface BuilderModelMetric {\n id: string;\n label: string | null;\n description: string | null;\n expression: string;\n type: \"sql\" | \"formula\";\n format: string | null;\n unsupportedKeys: string[];\n}\n\nexport interface ModelParseError {\n message: string;\n line: number;\n}\n\n/** Keys the dataset editor owns. Anything else makes a dataset read-only. */\nconst DATASET_KEYS = new Set([\n \"id\",\n \"name\",\n \"description\",\n \"data_store_id\",\n \"source\",\n \"from\",\n \"source_type\",\n \"filter_field\",\n \"filter_param\",\n \"dimensions\",\n \"fields\",\n \"metrics\",\n \"materialization\",\n \"cache\",\n]);\n\n/** Keys the relationship editor owns. */\nconst RELATIONSHIP_KEYS = new Set([\n \"name\",\n \"description\",\n \"from\",\n \"to\",\n \"from_columns\",\n \"to_columns\",\n \"relationship\",\n]);\n\n/** Keys the model metric editor owns. */\nconst MODEL_METRIC_KEYS = new Set([\n \"id\",\n \"name\",\n \"label\",\n \"description\",\n \"expression\",\n \"type\",\n \"format\",\n]);\n\nexport const AGGREGATIONS = [\"SUM\", \"AVG\", \"MIN\", \"MAX\", \"COUNT\"] as const;\nexport type Aggregation = (typeof AGGREGATIONS)[number];\n\n/** Types a warehouse column maps onto, so dimensions do not need typing by hand. */\nexport function dimensionTypeFor(warehouseType: string): BuilderDimensionType {\n const type = warehouseType.toUpperCase();\n if (/DATE|TIME|TIMESTAMP/.test(type)) return \"date\";\n if (/INT|NUM|DEC|FLOAT|DOUBLE|REAL/.test(type)) return \"number\";\n if (/BOOL/.test(type)) return \"boolean\";\n return \"string\";\n}\n\n/** `SUM(NET_SALES)` for a dropdown choice. */\nexport function aggregationExpression(\n aggregation: Aggregation,\n column: string,\n): string {\n return `${aggregation}(${column})`;\n}\n\n/**\n * The aggregation and column behind a metric, when it is a plain one.\n *\n * Anything else (a ratio, a CASE, a window) returns null, and the Builder shows\n * the raw expression instead of pretending a dropdown describes it.\n */\nexport function parseAggregation(\n expression: string,\n): { aggregation: Aggregation; column: string } | null {\n const match = /^\\s*(\\w+)\\s*\\(\\s*([\\w.\"]+)\\s*\\)\\s*$/.exec(expression);\n if (!match) return null;\n const rawName = match[1];\n const column = match[2];\n if (rawName === undefined || column === undefined) return null;\n const name = rawName.toUpperCase();\n if (!(AGGREGATIONS as readonly string[]).includes(name)) return null;\n return { aggregation: name as Aggregation, column };\n}\n\n/** The model as an editable document, or where its syntax error is. */\nexport function parseModelDocument(specYaml: string): {\n doc: Document | null;\n error: ModelParseError | null;\n} {\n const doc = parseDocument(specYaml);\n const first = doc.errors[0];\n if (first) {\n return {\n doc: null,\n error: {\n message: first.message,\n line: first.linePos?.[0].line ?? 1,\n },\n };\n }\n if (!isMap(doc.contents)) {\n return {\n doc: null,\n error: { message: \"The model must be a YAML mapping.\", line: 1 },\n };\n }\n return { doc, error: null };\n}\n\nfunction str(node: unknown): string | null {\n return typeof node === \"string\" && node !== \"\" ? node : null;\n}\n\nfunction seqOf(doc: Document, key: string): YAMLSeq | null {\n const node = doc.get(key, true);\n return isSeq(node) ? node : null;\n}\n\nfunction mapsOf(seq: YAMLSeq | null): YAMLMap[] {\n if (!seq) return [];\n return seq.items.filter((item): item is YAMLMap => isMap(item));\n}\n\nfunction findByKey(\n seq: YAMLSeq | null,\n key: string,\n value: string,\n): YAMLMap | null {\n return mapsOf(seq).find((item) => item.get(key) === value) ?? null;\n}\n\nfunction findById(seq: YAMLSeq | null, id: string): YAMLMap | null {\n return findByKey(seq, \"id\", id);\n}\n\n/**\n * Write a list of strings, leaving the node alone when the values already match.\n *\n * Rewriting it unconditionally would turn `[store_key]` into a block list, which\n * shows up as a diff on a line nobody edited.\n */\nfunction setStringSeq(\n doc: Document,\n map: YAMLMap,\n key: string,\n values: string[],\n): void {\n if (values.length === 0) {\n if (map.has(key)) map.delete(key);\n return;\n }\n const current = stringList(map.get(key, true));\n if (\n current.length === values.length &&\n current.every((value, index) => value === values[index])\n ) {\n return;\n }\n map.set(key, doc.createNode(values));\n}\n\n/** Set a key, or remove it when the value is empty, so blanks do not litter. */\nfunction setOrDelete(map: YAMLMap, key: string, value: unknown): void {\n if (value === null || value === undefined || value === \"\") {\n if (map.has(key)) map.delete(key);\n return;\n }\n map.set(key, value);\n}\n\nexport function readDataStores(doc: Document): BuilderDataStore[] {\n return mapsOf(seqOf(doc, \"data_stores\")).flatMap((item) => {\n const id = str(item.get(\"id\"));\n if (!id) return [];\n return [\n {\n id,\n name: str(item.get(\"name\")),\n vendor: str(item.get(\"vendor\")),\n dataModelId: str(item.get(\"data_model_id\")),\n isDefault: item.get(\"default\") === true,\n },\n ];\n });\n}\n\nfunction readDimensions(item: YAMLMap): BuilderDimension[] {\n const node = item.get(\"dimensions\", true) ?? item.get(\"fields\", true);\n if (!isSeq(node)) return [];\n return mapsOf(node).flatMap((dim) => {\n const id = str(dim.get(\"id\"));\n if (!id) return [];\n const type = str(dim.get(\"type\")) ?? \"string\";\n return [\n {\n id,\n column: str(dim.get(\"column\")),\n type: (\n [\"string\", \"number\", \"date\", \"time\", \"boolean\"] as string[]\n ).includes(type)\n ? (type as BuilderDimensionType)\n : \"string\",\n isTime: dim.get(\"is_time\") === true,\n },\n ];\n });\n}\n\nfunction readMetrics(item: YAMLMap): BuilderMetric[] {\n const node = item.get(\"metrics\", true);\n if (!isSeq(node)) return [];\n return mapsOf(node).flatMap((metric) => {\n const id = str(metric.get(\"id\"));\n const expression = metric.get(\"expression\");\n // An expression given as a per-dialect map is beyond the dropdown, so it is\n // reported as an empty expression and the panel sends the admin to YAML.\n if (!id || typeof expression !== \"string\") return [];\n return [\n {\n id,\n label: str(metric.get(\"label\")) ?? str(metric.get(\"name\")),\n expression,\n type: metric.get(\"type\") === \"formula\" ? \"formula\" : \"sql\",\n },\n ];\n });\n}\n\nfunction stringList(node: unknown): string[] {\n if (!isSeq(node)) return [];\n return node.items.flatMap((item) => {\n const value = isScalar(item) ? item.value : item;\n return typeof value === \"string\" ? [value] : [];\n });\n}\n\nfunction readRollup(item: YAMLMap): BuilderRollup | null {\n const node = item.get(\"materialization\", true);\n if (!isMap(node)) return null;\n return {\n source: str(node.get(\"source\")),\n grain: stringList(node.get(\"grain\", true)),\n metrics: stringList(node.get(\"metrics\", true)),\n };\n}\n\nfunction keyName(key: unknown): string | null {\n const value = isScalar(key) ? key.value : key;\n return typeof value === \"string\" ? value : null;\n}\n\n/**\n * Keys the Builder has no editor for but that do not change how rows are read.\n *\n * They are carried through every edit untouched, so they are worth a quiet note\n * rather than a warning, and they must not turn the whole card read-only: a\n * dataset that merely declares `ai_context` is still an ordinary dataset.\n */\nconst PRESERVED_KEYS = new Set([\n \"ai_context\",\n \"primary_key\",\n \"tags\",\n \"labels\",\n \"owner\",\n \"synonyms\",\n \"grain\",\n \"params\",\n \"time_dimension\",\n \"default_time_dimension\",\n]);\n\n/** The keys that really do stop the Builder editing this thing safely. */\nexport function blockingKeys(keys: string[]): string[] {\n return keys.filter((key) => !PRESERVED_KEYS.has(key));\n}\n\n/** The keys kept as they are, which the Builder only needs to mention. */\nexport function preservedKeys(keys: string[]): string[] {\n return keys.filter((key) => PRESERVED_KEYS.has(key));\n}\n\nfunction unsupportedKeys(item: YAMLMap, owned: Set<string>): string[] {\n return item.items\n .map((pair) => keyName(pair.key))\n .filter((key): key is string => key !== null && !owned.has(key));\n}\n\nexport function readDatasets(doc: Document): BuilderDataset[] {\n return mapsOf(seqOf(doc, \"datasets\")).flatMap((item) => {\n const id = str(item.get(\"id\"));\n if (!id) return [];\n return [\n {\n id,\n name: str(item.get(\"name\")),\n dataStoreId: str(item.get(\"data_store_id\")),\n source: str(item.get(\"source\")) ?? str(item.get(\"from\")),\n sourceType: str(item.get(\"source_type\")),\n filterField: str(item.get(\"filter_field\")),\n dimensions: readDimensions(item),\n metrics: readMetrics(item),\n rollup: readRollup(item),\n unsupportedKeys: unsupportedKeys(item, DATASET_KEYS),\n },\n ];\n });\n}\n\nconst CARDINALITIES: readonly string[] = [\n \"one_to_one\",\n \"many_to_one\",\n \"one_to_many\",\n \"many_to_many\",\n];\n\nexport function readRelationships(doc: Document): BuilderRelationship[] {\n return mapsOf(seqOf(doc, \"relationships\")).flatMap((item) => {\n const name = str(item.get(\"name\"));\n if (!name) return [];\n const cardinality = str(item.get(\"relationship\"));\n return [\n {\n name,\n from: str(item.get(\"from\")),\n to: str(item.get(\"to\")),\n fromColumns: stringList(item.get(\"from_columns\", true)),\n toColumns: stringList(item.get(\"to_columns\", true)),\n cardinality: CARDINALITIES.includes(cardinality ?? \"\")\n ? (cardinality as BuilderCardinality)\n : null,\n unsupportedKeys: unsupportedKeys(item, RELATIONSHIP_KEYS),\n },\n ];\n });\n}\n\nexport function readModelMetrics(doc: Document): BuilderModelMetric[] {\n return mapsOf(seqOf(doc, \"metrics\")).flatMap((item) => {\n const id = str(item.get(\"id\"));\n if (!id) return [];\n const expression = item.get(\"expression\");\n return [\n {\n id,\n label: str(item.get(\"name\")) ?? str(item.get(\"label\")),\n description: str(item.get(\"description\")),\n // A per-dialect expression map is beyond this editor: an empty\n // expression is how the panel knows to stay read-only.\n expression: typeof expression === \"string\" ? expression : \"\",\n type: item.get(\"type\") === \"formula\" ? \"formula\" : \"sql\",\n format: str(item.get(\"format\")),\n unsupportedKeys: unsupportedKeys(item, MODEL_METRIC_KEYS),\n },\n ];\n });\n}\n\n/** The document back as text, byte for byte apart from the edits made. */\nexport function modelText(doc: Document): string {\n // Defaults would refold long lines and pad flow collections, which shows up as\n // a diff on lines nobody edited.\n return doc.toString({ lineWidth: 0, flowCollectionPadding: false });\n}\n\nfunction ensureSeq(doc: Document, key: string): YAMLSeq {\n const existing = seqOf(doc, key);\n if (existing) return existing;\n doc.set(key, doc.createNode([]));\n const created = seqOf(doc, key);\n if (!created) throw new Error(`Could not create ${key} in the model`);\n return created;\n}\n\n/**\n * Write a data store, creating it when the id is new.\n *\n * `dataModelId` comes from the connection dropdown, so the operator picks\n * \"Restaurant Ops DW\" and the UUID contract in the YAML is unchanged.\n */\nexport function upsertDataStore(\n specYaml: string,\n store: BuilderDataStore,\n originalId?: string,\n): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return specYaml;\n const seq = ensureSeq(doc, \"data_stores\");\n const existing = findById(seq, originalId ?? store.id);\n const target = existing ?? (doc.createNode({ id: store.id }) as YAMLMap);\n target.set(\"id\", store.id);\n setOrDelete(target, \"name\", store.name);\n setOrDelete(target, \"vendor\", store.vendor);\n setOrDelete(target, \"data_model_id\", store.dataModelId);\n if (store.isDefault) {\n target.set(\"default\", true);\n // Exactly one store answers datasets that name none.\n for (const other of mapsOf(seq)) {\n if (other !== target && other.get(\"default\") === true)\n other.delete(\"default\");\n }\n } else if (target.has(\"default\")) {\n target.delete(\"default\");\n }\n if (!existing) seq.add(target);\n return modelText(doc);\n}\n\nexport function removeDataStore(specYaml: string, id: string): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return specYaml;\n const seq = seqOf(doc, \"data_stores\");\n if (!seq) return specYaml;\n const index = seq.items.findIndex(\n (item) => isMap(item) && item.get(\"id\") === id,\n );\n if (index >= 0) seq.delete(index);\n return modelText(doc);\n}\n\nfunction dimensionNode(doc: Document, dimension: BuilderDimension): YAMLMap {\n const node: Record<string, unknown> = {\n id: dimension.id,\n type: dimension.type,\n };\n if (dimension.column && dimension.column !== dimension.id) {\n node.column = dimension.column;\n }\n if (dimension.isTime) node.is_time = true;\n const created = doc.createNode(node);\n if (!isMap(created)) throw new Error(\"Could not create a dimension\");\n created.flow = false;\n return created;\n}\n\nfunction metricNode(doc: Document, metric: BuilderMetric): YAMLMap {\n const node: Record<string, unknown> = {\n id: metric.id,\n type: metric.type,\n expression: metric.expression,\n };\n if (metric.label) node.label = metric.label;\n const created = doc.createNode(node);\n if (!isMap(created)) throw new Error(\"Could not create a metric\");\n created.flow = false;\n return created;\n}\n\n/**\n * Write a dataset, creating it when the id is new.\n *\n * Only the keys the dataset editor owns are written. A dataset carrying a mesh\n * plan or `ai_context` keeps them, because the Builder refuses to edit such a\n * dataset in the first place rather than dropping what it cannot show.\n */\nexport function upsertDataset(\n specYaml: string,\n dataset: BuilderDataset,\n originalId?: string,\n): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return specYaml;\n const seq = ensureSeq(doc, \"datasets\");\n const existing = findById(seq, originalId ?? dataset.id);\n const target = existing ?? (doc.createNode({ id: dataset.id }) as YAMLMap);\n target.set(\"id\", dataset.id);\n setOrDelete(target, \"name\", dataset.name);\n setOrDelete(target, \"data_store_id\", dataset.dataStoreId);\n // `from` is an accepted alias for `source`; keep whichever the text used so a\n // hand-written model does not get rewritten under its author.\n if (target.has(\"from\") && !target.has(\"source\")) {\n setOrDelete(target, \"from\", dataset.source);\n } else {\n setOrDelete(target, \"source\", dataset.source);\n }\n setOrDelete(target, \"source_type\", dataset.sourceType);\n setOrDelete(target, \"filter_field\", dataset.filterField);\n\n const dimensionsKey =\n target.has(\"fields\") && !target.has(\"dimensions\") ? \"fields\" : \"dimensions\";\n if (dataset.dimensions.length > 0) {\n target.set(\n dimensionsKey,\n doc.createNode(dataset.dimensions.map((d) => dimensionNode(doc, d))),\n );\n } else if (target.has(dimensionsKey)) {\n target.delete(dimensionsKey);\n }\n\n if (dataset.metrics.length > 0) {\n target.set(\n \"metrics\",\n doc.createNode(dataset.metrics.map((m) => metricNode(doc, m))),\n );\n } else if (target.has(\"metrics\")) {\n target.delete(\"metrics\");\n }\n\n if (dataset.rollup) {\n const rollup: Record<string, unknown> = { enabled: true };\n if (dataset.rollup.source) rollup.source = dataset.rollup.source;\n rollup.grain = dataset.rollup.grain;\n rollup.metrics = dataset.rollup.metrics;\n target.set(\"materialization\", doc.createNode(rollup));\n } else if (target.has(\"materialization\")) {\n target.delete(\"materialization\");\n }\n\n if (!existing) seq.add(target);\n return modelText(doc);\n}\n\nexport function removeDataset(specYaml: string, id: string): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return specYaml;\n const seq = seqOf(doc, \"datasets\");\n if (!seq) return specYaml;\n const index = seq.items.findIndex(\n (item) => isMap(item) && item.get(\"id\") === id,\n );\n if (index >= 0) seq.delete(index);\n return modelText(doc);\n}\n\n/**\n * Write a relationship, creating it when the name is new.\n *\n * `from_columns` and `to_columns` are written as block sequences in the order\n * the panel shows them, because the engine pairs them positionally.\n */\nexport function upsertRelationship(\n specYaml: string,\n relationship: BuilderRelationship,\n originalName?: string,\n): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return specYaml;\n const seq = ensureSeq(doc, \"relationships\");\n const existing = findByKey(seq, \"name\", originalName ?? relationship.name);\n const target =\n existing ?? (doc.createNode({ name: relationship.name }) as YAMLMap);\n target.set(\"name\", relationship.name);\n setOrDelete(target, \"from\", relationship.from);\n setOrDelete(target, \"to\", relationship.to);\n setStringSeq(doc, target, \"from_columns\", relationship.fromColumns);\n setStringSeq(doc, target, \"to_columns\", relationship.toColumns);\n setOrDelete(target, \"relationship\", relationship.cardinality);\n if (!existing) seq.add(target);\n return modelText(doc);\n}\n\nexport function removeRelationship(specYaml: string, name: string): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return specYaml;\n const seq = seqOf(doc, \"relationships\");\n if (!seq) return specYaml;\n const index = seq.items.findIndex(\n (item) => isMap(item) && item.get(\"name\") === name,\n );\n if (index >= 0) seq.delete(index);\n return modelText(doc);\n}\n\n/** Write a model level metric, creating it when the id is new. */\nexport function upsertModelMetric(\n specYaml: string,\n metric: BuilderModelMetric,\n originalId?: string,\n): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return specYaml;\n const seq = ensureSeq(doc, \"metrics\");\n const existing = findById(seq, originalId ?? metric.id);\n const target = existing ?? (doc.createNode({ id: metric.id }) as YAMLMap);\n target.set(\"id\", metric.id);\n // A model written with `label` keeps `label`; anything new gets `name`, which\n // is what the seeded models and the AI grounding block read.\n if (target.has(\"label\") && !target.has(\"name\")) {\n setOrDelete(target, \"label\", metric.label);\n } else {\n setOrDelete(target, \"name\", metric.label);\n }\n setOrDelete(target, \"description\", metric.description);\n target.set(\"type\", metric.type);\n target.set(\"expression\", metric.expression);\n setOrDelete(target, \"format\", metric.format);\n if (!existing) seq.add(target);\n return modelText(doc);\n}\n\nexport function removeModelMetric(specYaml: string, id: string): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return specYaml;\n const seq = seqOf(doc, \"metrics\");\n if (!seq) return specYaml;\n const index = seq.items.findIndex(\n (item) => isMap(item) && item.get(\"id\") === id,\n );\n if (index >= 0) seq.delete(index);\n return modelText(doc);\n}\n\n/** One side of a ratio: an aggregate over a column of a named dataset. */\nexport interface RatioSide {\n dataset: string;\n aggregation: Aggregation;\n column: string;\n}\n\n/**\n * The SQL for \"labor cost as a share of net sales\".\n *\n * Columns are qualified with the dataset id, which is the alias the engine gives\n * each dataset in the join, and the denominator is wrapped in NULLIF so a day\n * with no sales is null rather than a division error.\n *\n * The result is always a share, never percentage points: `format: percent`\n * multiplies by 100 when the number is drawn, so scaling it here as well is how\n * a labor percent of 13.3% was printed as 1,333%.\n */\nexport function ratioExpression(\n numerator: RatioSide,\n denominator: RatioSide,\n): string {\n const top = `${numerator.aggregation}(${numerator.dataset}.${numerator.column})`;\n const bottom = `${denominator.aggregation}(${denominator.dataset}.${denominator.column})`;\n return `${top} / NULLIF(${bottom}, 0)`;\n}\n\nconst RATIO_PATTERN =\n /^\\s*(\\w+)\\(([\\w$]+)\\.([\\w$]+)\\)\\s*\\/\\s*NULLIF\\(\\s*(\\w+)\\(([\\w$]+)\\.([\\w$]+)\\)\\s*,\\s*0\\s*\\)\\s*(\\*\\s*100)?\\s*$/i;\n\n/** The two sides behind a ratio, when the expression is one this wrote. */\nexport function parseRatioExpression(expression: string): {\n numerator: RatioSide;\n denominator: RatioSide;\n /** True when the expression ends in `* 100`, written before or by hand. */\n scaledBy100: boolean;\n} | null {\n const match = RATIO_PATTERN.exec(expression);\n if (!match) return null;\n const topAggregation = match[1];\n const topDataset = match[2];\n const topColumn = match[3];\n const bottomAggregation = match[4];\n const bottomDataset = match[5];\n const bottomColumn = match[6];\n if (\n topAggregation === undefined ||\n topDataset === undefined ||\n topColumn === undefined ||\n bottomAggregation === undefined ||\n bottomDataset === undefined ||\n bottomColumn === undefined\n ) {\n return null;\n }\n const topAgg = topAggregation.toUpperCase();\n const bottomAgg = bottomAggregation.toUpperCase();\n if (\n !(AGGREGATIONS as readonly string[]).includes(topAgg) ||\n !(AGGREGATIONS as readonly string[]).includes(bottomAgg)\n ) {\n return null;\n }\n return {\n numerator: {\n aggregation: topAgg as Aggregation,\n dataset: topDataset,\n column: topColumn,\n },\n denominator: {\n aggregation: bottomAgg as Aggregation,\n dataset: bottomDataset,\n column: bottomColumn,\n },\n scaledBy100: Boolean(match[7]),\n };\n}\n\n/**\n * True when a metric would print a hundred times too large.\n *\n * `format: percent` turns a share into a percentage, so an expression that has\n * already multiplied by 100 is scaled twice.\n */\nexport function isDoubleScaledPercent(\n expression: string,\n format: string | null | undefined,\n): boolean {\n if (format !== \"percent\") return false;\n return /\\*\\s*100\\s*$/.test(expression.trim());\n}\n\n/** The text of one entry, for a panel that shows the YAML it produces. */\nfunction fragmentOf(\n specYaml: string,\n collection: string,\n value: string,\n key = \"id\",\n): string {\n const { doc } = parseModelDocument(specYaml);\n if (!doc) return \"\";\n const item = findByKey(seqOf(doc, collection), key, value);\n if (!item) return \"\";\n return modelText(new Document(item)).trimEnd();\n}\n\n/** The YAML for one dataset, so a panel can show the text it produces. */\nexport function datasetFragment(specYaml: string, id: string): string {\n return fragmentOf(specYaml, \"datasets\", id);\n}\n\n/** The YAML for one data store, for the same reason. */\nexport function dataStoreFragment(specYaml: string, id: string): string {\n return fragmentOf(specYaml, \"data_stores\", id);\n}\n\n/** The YAML for one relationship, keyed by name rather than id. */\nexport function relationshipFragment(specYaml: string, name: string): string {\n return fragmentOf(specYaml, \"relationships\", name, \"name\");\n}\n\n/** The YAML for one model level metric. */\nexport function modelMetricFragment(specYaml: string, id: string): string {\n return fragmentOf(specYaml, \"metrics\", id);\n}\n\n/** Rows the rail needs: the model's shape at a glance, without parsing twice. */\nexport interface ModelOutline {\n dataStores: BuilderDataStore[];\n datasets: BuilderDataset[];\n relationships: BuilderRelationship[];\n modelMetrics: BuilderModelMetric[];\n error: ModelParseError | null;\n}\n\nexport function readModelOutline(specYaml: string): ModelOutline {\n const { doc, error } = parseModelDocument(specYaml);\n if (!doc) {\n return {\n dataStores: [],\n datasets: [],\n relationships: [],\n modelMetrics: [],\n error,\n };\n }\n return {\n dataStores: readDataStores(doc),\n datasets: readDatasets(doc),\n relationships: readRelationships(doc),\n modelMetrics: readModelMetrics(doc),\n error: null,\n };\n}\n","/**\n * Checks the Builder runs while you type, before the model reaches the API.\n *\n * These are the mistakes that make a widget fail at render time rather than at\n * save time: a join naming a dataset that is not there, columns that do not pair\n * up, a metric spanning two datasets nothing joins, or a join the engine cannot\n * push into one warehouse. Server validation still runs on Validate and Save;\n * this only shortens the loop.\n */\n\nimport {\n isDoubleScaledPercent,\n type BuilderDataStore,\n type BuilderDataset,\n type BuilderModelMetric,\n type BuilderRelationship,\n} from \"./model-document.js\";\n\n/** The store a dataset reads, following the default when it names none. */\nexport function storeOf(\n dataset: BuilderDataset,\n stores: BuilderDataStore[],\n): string | null {\n if (dataset.dataStoreId) return dataset.dataStoreId;\n return stores.find((s) => s.isDefault)?.id ?? stores[0]?.id ?? null;\n}\n\nexport function relationshipIssues(\n relationship: BuilderRelationship,\n datasets: BuilderDataset[],\n stores: BuilderDataStore[],\n): string[] {\n const issues: string[] = [];\n if (!relationship.name.trim()) issues.push(\"This join has no name.\");\n const from = datasets.find((d) => d.id === relationship.from);\n const to = datasets.find((d) => d.id === relationship.to);\n if (!relationship.from || !relationship.to) {\n issues.push(\"Pick the dataset on each side of the join.\");\n } else if (!from) {\n issues.push(`No dataset called ${relationship.from}.`);\n } else if (!to) {\n issues.push(`No dataset called ${relationship.to}.`);\n } else if (relationship.from === relationship.to) {\n issues.push(\"Both sides are the same dataset, so this join does nothing.\");\n }\n if (\n relationship.fromColumns.length === 0 ||\n relationship.toColumns.length === 0\n ) {\n issues.push(\"A join needs at least one pair of columns.\");\n } else if (\n relationship.fromColumns.length !== relationship.toColumns.length\n ) {\n issues.push(\n \"The columns are matched in pairs, so both sides need the same number.\",\n );\n }\n if (\n from &&\n to &&\n storeOf(from, stores) !== storeOf(to, stores) &&\n relationship.from !== relationship.to\n ) {\n // One warehouse cannot join across two connections, so the engine refuses\n // this rather than returning half the rows.\n issues.push(\n `${from.id} and ${to.id} read different data stores, so this join cannot run. Combine them in a mesh dataset instead.`,\n );\n }\n return issues;\n}\n\n/** Dataset ids a model level metric expression reads, like `daily_sales.X`. */\nexport function datasetsInExpression(\n expression: string,\n datasetIds: string[],\n): string[] {\n return datasetIds.filter((id) =>\n new RegExp(`(^|[^\\\\w.])${id}\\\\.`, \"i\").test(expression),\n );\n}\n\n/** True when relationships connect the two datasets, directly or through others. */\nexport function datasetsAreJoined(\n a: string,\n b: string,\n relationships: BuilderRelationship[],\n): boolean {\n const seen = new Set([a]);\n const queue = [a];\n while (queue.length > 0) {\n const current = queue.shift() as string;\n if (current === b) return true;\n for (const relationship of relationships) {\n for (const [left, right] of [\n [relationship.from, relationship.to],\n [relationship.to, relationship.from],\n ]) {\n if (left === current && right && !seen.has(right)) {\n seen.add(right);\n queue.push(right);\n }\n }\n }\n }\n return seen.has(b);\n}\n\nexport function modelMetricIssues(\n metric: BuilderModelMetric,\n datasets: BuilderDataset[],\n relationships: BuilderRelationship[],\n): string[] {\n const issues: string[] = [];\n if (!metric.id.trim())\n issues.push(\"This metric has no id for widgets to ask for.\");\n if (!metric.expression.trim()) {\n issues.push(\"This metric has no plain expression, so edit it in YAML.\");\n return issues;\n }\n const ids = datasets.map((d) => d.id);\n const referenced = datasetsInExpression(metric.expression, ids);\n const qualified = [\n ...new Set(\n Array.from(metric.expression.matchAll(/(?:^|[^\\w.])([A-Za-z_]\\w*)\\./g))\n .map((match) => match[1])\n .filter((name): name is string => name !== undefined),\n ),\n ];\n for (const name of qualified) {\n // NULLIF(...) and function names are not followed by a dot, so anything\n // qualifying a column here is meant to be a dataset.\n if (!ids.includes(name)) {\n issues.push(`${name} is not a dataset in this model.`);\n }\n }\n if (referenced.length === 0) {\n issues.push(\n \"Qualify each column with its dataset, for example daily_sales.NET_SALES, so the engine knows where to read it.\",\n );\n }\n const first = referenced[0];\n for (const other of referenced.slice(1)) {\n if (\n first !== undefined &&\n !datasetsAreJoined(first, other, relationships)\n ) {\n issues.push(\n `${first} and ${other} are not connected by any relationship, so this metric cannot be computed.`,\n );\n }\n }\n if (isDoubleScaledPercent(metric.expression, metric.format)) {\n issues.push(\n \"This multiplies by 100 and the percent format multiplies by 100 again, so a share of 0.133 reads 1,333%. Drop the * 100 and keep the percent format.\",\n );\n }\n return issues;\n}\n","/**\n * Ready-to-edit YAML blocks for the semantic model.\n *\n * Starting from a correct block with the required fields present is the fastest\n * path for someone who has never written the model by hand, and it avoids the\n * two mistakes that cost the most time: a dataset with no `filter_field`, and a\n * relationship with mismatched join columns.\n */\n\nimport { LineCounter, isSeq, parseDocument } from \"yaml\";\n\nexport interface ModelTemplate {\n id: string;\n label: string;\n /** Top-level key the block belongs under. */\n section: \"data_stores\" | \"datasets\" | \"relationships\" | \"metrics\";\n description: string;\n yaml: string;\n}\n\nexport const MODEL_TEMPLATES: ModelTemplate[] = [\n {\n id: \"data_store\",\n label: \"Data store\",\n section: \"data_stores\",\n description:\n \"A warehouse connection. Leave data_model_id out to use the host's default store.\",\n yaml: ` - id: ops_dw\n name: Operations warehouse\n vendor: snowflake\n default: true\n`,\n },\n {\n id: \"dataset_table\",\n label: \"Dataset from a table\",\n section: \"datasets\",\n description:\n \"A table or view with the dimensions and metrics widgets may ask for.\",\n yaml: ` - id: daily_sales\n name: Daily sales\n data_store_id: ops_dw\n source_type: table\n source: \"{mart_schema}.RPT_DAILY_SALES_SUMMARY\"\n filter_field: store_key\n dimensions:\n - {id: business_date, type: date, is_time: true}\n - {id: store_key, type: string}\n metrics:\n - {id: net_sales, type: sql, expression: SUM(NET_SALES)}\n - {id: order_count, type: sql, expression: SUM(ORDER_COUNT)}\n`,\n },\n {\n id: \"dataset_query\",\n label: \"Dataset from SQL\",\n section: \"datasets\",\n description: \"Use when no single table has the shape you need.\",\n yaml: ` - id: sales_by_daypart\n data_store_id: ops_dw\n source_type: query\n filter_field: store_key\n query: |\n SELECT store_key, business_date, daypart, SUM(net_sales) AS net_sales\n FROM {mart_schema}.FCT_ORDERS\n GROUP BY 1, 2, 3\n dimensions:\n - {id: business_date, type: date, is_time: true}\n - {id: daypart, type: string}\n metrics:\n - {id: net_sales, type: sql, expression: SUM(net_sales)}\n`,\n },\n {\n id: \"relationship\",\n label: \"Relationship (join)\",\n section: \"relationships\",\n description:\n \"Lets one widget mix fields from both datasets. Column lists are matched in order.\",\n yaml: ` - name: sales_to_labor\n from: daily_sales\n to: daily_labor\n from_columns: [store_key, business_date]\n to_columns: [store_key, business_date]\n relationship: one_to_one\n`,\n },\n {\n id: \"metric_formula\",\n label: \"Metric across datasets\",\n section: \"metrics\",\n description:\n \"A formula over dataset metrics, computed after the query. Needs a relationship when it spans datasets.\",\n yaml: ` - id: labor_pct\n name: Labor percent\n type: formula\n expression: \"daily_labor.labor_cost / daily_sales.net_sales\"\n format: percent\n`,\n },\n];\n\n/**\n * Add a template's block to the right section of an existing document.\n *\n * Edits the text rather than re-serialising the document, so comments, key order\n * and formatting survive. Three cases: the section already has entries (append\n * after the last one), the section exists but is empty (replace the `[]`), or the\n * section is missing (append it at the end).\n */\nexport function insertModelTemplate(\n specYaml: string,\n template: ModelTemplate,\n): string {\n const block = template.yaml.endsWith(\"\\n\")\n ? template.yaml\n : `${template.yaml}\\n`;\n const lineCounter = new LineCounter();\n const doc = parseDocument(specYaml, { lineCounter });\n const section = doc.get(template.section, true);\n const text = specYaml.endsWith(\"\\n\") ? specYaml : `${specYaml}\\n`;\n\n if (isSeq(section) && section.items.length > 0) {\n const last = section.items[section.items.length - 1];\n const range = (last as { range?: [number, number, number] }).range;\n if (range) {\n // range[2] runs to the start of the next line, so this lands the block on\n // its own line directly after the last entry.\n const at = range[2];\n const head = text.slice(0, at);\n return `${head.endsWith(\"\\n\") ? head : `${head}\\n`}${block}${text.slice(at)}`;\n }\n }\n\n const emptySection = new RegExp(\n `^${template.section}:[ \\\\t]*(\\\\[\\\\s*\\\\])?[ \\\\t]*$`,\n \"m\",\n );\n if (emptySection.test(text)) {\n return text.replace(\n emptySection,\n `${template.section}:\\n${block.trimEnd()}`,\n );\n }\n\n return `${text}${template.section}:\\n${block}`;\n}\n","/**\n * Put semantic model problems on the line that causes them.\n *\n * Diagnostics come back keyed by object id (\"dataset daily_sales: ...\"), which\n * leaves the reader to find `daily_sales` in a few hundred lines of YAML by eye.\n * These helpers locate the node that declares each id and turn the issues into\n * editor markers, so a problem is underlined where it lives.\n */\n\nimport { LineCounter, isMap, isSeq, parseDocument, type Node } from \"yaml\";\n\nimport type { DashboardModelDiagnostics } from \"./types.js\";\n\nexport type ModelMarkerSeverity = \"error\" | \"warning\" | \"info\";\n\nexport interface ModelMarker {\n /** 1-based, as common code editors count. */\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n message: string;\n severity: ModelMarkerSeverity;\n}\n\n/** Where a collection entry is declared, 1-based. */\ninterface NodePosition {\n line: number;\n column: number;\n endLine: number;\n endColumn: number;\n}\n\n/** The top-level collections a diagnostic can point into. */\nconst KEYED_BY_ID = [\"data_stores\", \"datasets\", \"metrics\"] as const;\n\nfunction positionOf(node: Node, lineCounter: LineCounter): NodePosition | null {\n if (!node.range) return null;\n const [start, valueEnd] = node.range;\n const startPos = lineCounter.linePos(start);\n const endPos = lineCounter.linePos(valueEnd);\n return {\n line: startPos.line,\n column: startPos.col,\n endLine: endPos.line,\n endColumn: endPos.col,\n };\n}\n\n/**\n * Line of every `id` (or `name`, for relationships) under each top-level\n * collection, keyed as `datasets:daily_sales`.\n */\nexport function indexModelYaml(specYaml: string): Map<string, NodePosition> {\n const lineCounter = new LineCounter();\n const doc = parseDocument(specYaml, { lineCounter, keepSourceTokens: true });\n const index = new Map<string, NodePosition>();\n if (!isMap(doc.contents)) return index;\n\n for (const collection of [...KEYED_BY_ID, \"relationships\"]) {\n const seq = doc.get(collection, true);\n if (!isSeq(seq)) continue;\n for (const item of seq.items) {\n if (!isMap(item)) continue;\n const keyNode = collection === \"relationships\" ? \"name\" : \"id\";\n const id = item.get(keyNode);\n if (typeof id !== \"string\") continue;\n const position = positionOf(item as Node, lineCounter);\n if (position) index.set(`${collection}:${id}`, position);\n }\n }\n return index;\n}\n\n/** Syntax errors from the YAML parser itself, so a typo marks instantly. */\nexport function yamlSyntaxMarkers(specYaml: string): ModelMarker[] {\n const lineCounter = new LineCounter();\n const doc = parseDocument(specYaml, { lineCounter });\n return doc.errors.map((err) => {\n const start = lineCounter.linePos(err.pos[0]);\n const end = lineCounter.linePos(err.pos[1]);\n return {\n startLineNumber: start.line,\n startColumn: start.col,\n endLineNumber: end.line,\n endColumn: end.col,\n message: err.message,\n severity: \"error\" as const,\n };\n });\n}\n\nfunction marker(\n position: NodePosition | undefined,\n message: string,\n severity: ModelMarkerSeverity,\n): ModelMarker {\n // An id the YAML does not declare (or a whole-model issue) belongs at the\n // top rather than nowhere, otherwise the count and the gutter disagree.\n const at = position ?? { line: 1, column: 1, endLine: 1, endColumn: 1 };\n return {\n startLineNumber: at.line,\n startColumn: at.column,\n // Underlining a whole dataset block buries the code in red, so mark its\n // first line only.\n endLineNumber: at.line,\n endColumn: at.line === at.endLine ? at.endColumn : Number.MAX_SAFE_INTEGER,\n message,\n severity,\n };\n}\n\n/**\n * Markers for one validation response, placed on the declaring line.\n *\n * Issues are errors, data store notes are informational: a store with no\n * `data_model_id` resolves to the organisation's default and is not a problem.\n */\nexport function diagnosticsToMarkers(\n specYaml: string,\n diagnostics: DashboardModelDiagnostics,\n): ModelMarker[] {\n const index = indexModelYaml(specYaml);\n const markers: ModelMarker[] = [];\n\n for (const issue of diagnostics.model.issues) {\n markers.push(marker(undefined, issue, \"error\"));\n }\n for (const store of diagnostics.data_stores) {\n const position = index.get(`data_stores:${store.id}`);\n for (const issue of store.issues) {\n markers.push(marker(position, issue, \"error\"));\n }\n for (const note of store.notes ?? []) {\n markers.push(marker(position, note, \"info\"));\n }\n }\n for (const dataset of diagnostics.datasets) {\n const position = index.get(`datasets:${dataset.id}`);\n for (const issue of dataset.issues) {\n markers.push(marker(position, issue, \"error\"));\n }\n }\n for (const relationship of diagnostics.relationships) {\n const position = index.get(`relationships:${relationship.name}`);\n for (const issue of relationship.issues) {\n markers.push(marker(position, issue, \"error\"));\n }\n }\n for (const metric of diagnostics.metrics) {\n const id = metric.metric.id;\n const position =\n typeof id === \"string\" ? index.get(`metrics:${id}`) : undefined;\n for (const issue of metric.issues) {\n markers.push(marker(position, issue, \"error\"));\n }\n }\n return markers;\n}\n\n/** How many of a validation response's findings are real problems. */\nexport function countModelIssues(\n diagnostics: DashboardModelDiagnostics,\n): number {\n return (\n diagnostics.model.issues.length +\n diagnostics.data_stores.reduce((n, s) => n + s.issues.length, 0) +\n diagnostics.datasets.reduce((n, d) => n + d.issues.length, 0) +\n diagnostics.relationships.reduce((n, r) => n + r.issues.length, 0) +\n diagnostics.metrics.reduce((n, m) => n + m.issues.length, 0)\n );\n}\n","/**\n * Checks the widget Builder runs while you click, before anything is saved.\n *\n * The failure this exists to kill is the blank chart: rows arrive, the widget\n * points at a column name the query never returned, and nothing draws. The\n * Builder only offers columns the chosen dataset can answer, and these checks\n * catch the rest: no dataset, no columns, a mapping left unset, a series naming\n * a column that is not selected, or a column from a dataset nothing joins to.\n */\n\nimport { datasetsAreJoined } from \"./model-builder-checks.js\";\nimport type {\n BuilderDataset,\n BuilderModelMetric,\n BuilderRelationship,\n} from \"./model-document.js\";\nimport type { BuilderWidget } from \"./widget-document.js\";\n\n/** One column a widget may ask for, and where it comes from. */\nexport interface WidgetColumn {\n /** What goes in `data.columns`, and the key the row comes back with. */\n key: string;\n label: string;\n kind: \"dimension\" | \"metric\";\n /** Dataset the column belongs to, or null for a model level metric. */\n dataset: string | null;\n /** True when reading it forces a join with another dataset. */\n joined: boolean;\n}\n\nexport interface SemanticSummary {\n datasets: BuilderDataset[];\n relationships: BuilderRelationship[];\n modelMetrics: BuilderModelMetric[];\n}\n\n/**\n * Every column a widget on `datasetId` can ask for.\n *\n * The base dataset contributes its own dimensions and metrics unqualified; a\n * dataset the relationships connect to it contributes `other.metric`, which is\n * the literal key its rows come back with; a model level metric contributes its\n * id, since the engine resolves it against the join.\n */\nexport function widgetColumns(\n datasetId: string | null,\n model: SemanticSummary,\n): WidgetColumn[] {\n const base = model.datasets.find((d) => d.id === datasetId);\n if (!base) return [];\n const columns: WidgetColumn[] = [\n ...base.dimensions.map((dimension) => ({\n key: dimension.id,\n label: dimension.id,\n kind: \"dimension\" as const,\n dataset: base.id,\n joined: false,\n })),\n ...base.metrics.map((metric) => ({\n key: metric.id,\n label: metric.label ?? metric.id,\n kind: \"metric\" as const,\n dataset: base.id,\n joined: false,\n })),\n ];\n\n for (const other of model.datasets) {\n if (other.id === base.id) continue;\n if (!datasetsAreJoined(base.id, other.id, model.relationships)) continue;\n for (const metric of other.metrics) {\n columns.push({\n key: `${other.id}.${metric.id}`,\n label: `${metric.label ?? metric.id} (${other.id})`,\n kind: \"metric\",\n dataset: other.id,\n joined: true,\n });\n }\n }\n\n const taken = new Set(columns.map((column) => column.key));\n for (const metric of model.modelMetrics) {\n if (taken.has(metric.id)) continue;\n columns.push({\n key: metric.id,\n label: metric.label ?? metric.id,\n kind: \"metric\",\n dataset: null,\n joined: true,\n });\n }\n\n return columns;\n}\n\n/** Columns that hold a number, which is what a chart can plot. */\nexport function numericColumns(columns: WidgetColumn[]): WidgetColumn[] {\n return columns.filter((column) => column.kind === \"metric\");\n}\n\n/** Columns that label a point, which is what an axis or a slice reads. */\nexport function labelColumns(columns: WidgetColumn[]): WidgetColumn[] {\n return columns.filter((column) => column.kind === \"dimension\");\n}\n\n/** Where in the widget document a finding belongs, so YAML can underline it. */\nexport type WidgetAnchor =\n | { kind: \"widget\" }\n | { kind: \"id\" }\n | { kind: \"dataset\" }\n | { kind: \"columns\" }\n | { kind: \"column\"; key: string }\n | { kind: \"mapping\"; slot: keyof BuilderWidget[\"mappings\"] }\n | { kind: \"series\"; index: number }\n | { kind: \"pivotRows\" }\n | { kind: \"pivotColumns\" }\n | { kind: \"pivotMeasures\" }\n | { kind: \"pivotMeasure\"; index: number }\n | { kind: \"pivotHeatmap\" }\n | { kind: \"pivotSort\" }\n | { kind: \"pivotTopRows\" };\n\nexport interface WidgetFinding {\n message: string;\n at: WidgetAnchor;\n}\n\n/**\n * Everything that would make this widget render empty, with where it lives.\n *\n * The Builder only needs the wording, but the YAML tab needs to underline the\n * line that causes each one, which is why the location travels with it.\n */\nexport function widgetFindings(\n widget: BuilderWidget,\n model: SemanticSummary,\n): WidgetFinding[] {\n const findings: WidgetFinding[] = [];\n const add = (message: string, at: WidgetAnchor): void => {\n findings.push({ message, at });\n };\n\n if (!widget.id.trim()) add(\"This widget has no id.\", { kind: \"id\" });\n if (!widget.datasetId) {\n add(\"Pick the dataset this widget reads.\", { kind: \"dataset\" });\n return findings;\n }\n const base = model.datasets.find((d) => d.id === widget.datasetId);\n if (!base) {\n add(\n `No dataset called ${widget.datasetId} in the semantic model, so this widget cannot run.`,\n { kind: \"dataset\" },\n );\n return findings;\n }\n if (widget.columns.length === 0) {\n add(\"Pick at least one column, or the query returns nothing.\", {\n kind: \"columns\",\n });\n return findings;\n }\n\n const available = widgetColumns(widget.datasetId, model);\n const availableKeys = new Set(available.map((column) => column.key));\n for (const column of widget.columns) {\n if (availableKeys.has(column)) continue;\n const [prefix] = column.split(\".\");\n if (column.includes(\".\") && model.datasets.some((d) => d.id === prefix)) {\n add(\n `${column} comes from ${prefix}, which no relationship connects to ${base.id}, so the query cannot join it.`,\n { kind: \"column\", key: column },\n );\n } else {\n add(\n `${column} is not a dimension or metric of ${base.id}, so the query would fail.`,\n { kind: \"column\", key: column },\n );\n }\n }\n\n const selected = new Set(widget.columns);\n function checkPoints(\n field: string | null,\n what: string,\n at: WidgetAnchor,\n ): void {\n if (!field) return;\n if (!selected.has(field)) {\n // This is the blank chart: the widget names a column the rows never carry.\n add(\n `${what} reads ${field}, which this widget does not select, so it would draw nothing.`,\n at,\n );\n }\n }\n checkPoints(widget.mappings.x, \"The horizontal axis\", {\n kind: \"mapping\",\n slot: \"x\",\n });\n checkPoints(widget.mappings.category, \"The category\", {\n kind: \"mapping\",\n slot: \"category\",\n });\n checkPoints(widget.mappings.value, \"The value\", {\n kind: \"mapping\",\n slot: \"value\",\n });\n checkPoints(widget.mappings.series, \"The series split\", {\n kind: \"mapping\",\n slot: \"series\",\n });\n checkPoints(widget.mappings.delta, \"The comparison\", {\n kind: \"mapping\",\n slot: \"delta\",\n });\n widget.series.forEach((entry, index) => {\n checkPoints(entry.field, `Series ${entry.name ?? entry.field}`, {\n kind: \"series\",\n index,\n });\n });\n\n if (widget.component === \"echarts\") {\n const axis =\n widget.chartType === \"pie\" ? widget.mappings.category : widget.mappings.x;\n if (!axis) {\n add(\n widget.chartType === \"pie\"\n ? \"Pick the column that names each slice.\"\n : \"Pick the column that runs along the horizontal axis.\",\n {\n kind: \"mapping\",\n slot: widget.chartType === \"pie\" ? \"category\" : \"x\",\n },\n );\n }\n if (!widget.mappings.value && widget.series.length === 0) {\n add(\"Pick the column to plot, or add at least one series.\", {\n kind: \"mapping\",\n slot: \"value\",\n });\n }\n }\n const numericKeys = new Set(numericColumns(available).map((c) => c.key));\n if (\n (widget.component === \"kpi\" || widget.component === \"echarts\") &&\n widget.mappings.value &&\n availableKeys.has(widget.mappings.value) &&\n !numericKeys.has(widget.mappings.value)\n ) {\n add(\n `${widget.mappings.value} is a label rather than a measure, so there is no number to ${\n widget.component === \"kpi\" ? \"show\" : \"plot\"\n }.`,\n { kind: \"mapping\", slot: \"value\" },\n );\n }\n\n if (widget.component === \"kpi\") {\n if (!widget.mappings.value) {\n add(\"Pick the column the number comes from.\", {\n kind: \"mapping\",\n slot: \"value\",\n });\n }\n if (\n widget.mappings.delta &&\n widget.mappings.delta === widget.mappings.value\n ) {\n add(\n \"The comparison reads the same column as the number, so the change would always be zero. Pick another column or leave it unset.\",\n { kind: \"mapping\", slot: \"delta\" },\n );\n }\n // Grouping turns one number into one number per group, and only the first\n // row is shown, so the figure on the card is not the total it looks like.\n const grouping = available.filter(\n (column) => column.kind === \"dimension\" && selected.has(column.key),\n );\n for (const column of grouping) {\n add(\n `A single number cannot group by ${column.label}: the query returns one row per ${column.label} and the card shows only the first. Untick it in step 4.`,\n { kind: \"column\", key: column.key },\n );\n }\n }\n\n if (widget.component === \"pivot_table\") {\n findings.push(...pivotFindings(widget, available));\n }\n\n return findings;\n}\n\n/**\n * What would leave a cross-tab with nothing in it.\n *\n * A pivot names its fields in the layout rather than in the mappings, and the\n * engine adds whatever the layout names to the GROUP BY, so a field is checked\n * against what the dataset can answer rather than against what step 4 ticked.\n * The one thing it cannot recover from is a field the dataset does not have.\n */\nfunction pivotFindings(\n widget: BuilderWidget,\n available: WidgetColumn[],\n): WidgetFinding[] {\n const findings: WidgetFinding[] = [];\n const add = (message: string, at: WidgetAnchor): void => {\n findings.push({ message, at });\n };\n const pivot = widget.pivot;\n const byKey = new Map(available.map((column) => [column.key, column]));\n\n if (pivot.rows.length === 0) {\n add(\"Pick at least one field to run down the side of the pivot.\", {\n kind: \"pivotRows\",\n });\n }\n if (pivot.measures.length === 0) {\n add(\"Add at least one measure, or every cell in the pivot is empty.\", {\n kind: \"pivotMeasures\",\n });\n }\n\n function checkDimension(field: string, where: string, at: WidgetAnchor) {\n const column = byKey.get(field);\n if (!column) {\n add(\n `${field} is not a dimension or metric of ${widget.datasetId}, so the pivot cannot group ${where} by it.`,\n at,\n );\n return;\n }\n if (column.kind !== \"dimension\") {\n add(\n `${field} is a measure rather than a dimension, so it cannot run ${where}. Put it under the measures instead.`,\n at,\n );\n }\n }\n\n for (const field of pivot.rows) {\n checkDimension(field, \"down the side\", { kind: \"pivotRows\" });\n if (pivot.columns.includes(field)) {\n add(\n `${field} runs down the side and across the top at once, so every figure would fall on one diagonal. Pick it in one place.`,\n { kind: \"pivotColumns\" },\n );\n }\n }\n for (const field of pivot.columns) {\n checkDimension(field, \"across the top\", { kind: \"pivotColumns\" });\n }\n if (pivot.columns.length > 2) {\n add(\n \"At most two fields can be nested across the top. A third level generates more columns than a grid can read.\",\n { kind: \"pivotColumns\" },\n );\n }\n\n pivot.measures.forEach((measure, index) => {\n const column = byKey.get(measure.field);\n if (!column) {\n add(\n `${measure.field} is not a dimension or metric of ${widget.datasetId}, so there is no figure to put in the cells.`,\n { kind: \"pivotMeasure\", index },\n );\n return;\n }\n if (column.kind !== \"metric\") {\n add(\n `${measure.field} is a label rather than a measure, so there is no number to total.`,\n { kind: \"pivotMeasure\", index },\n );\n }\n });\n\n const measured = new Set(pivot.measures.map((measure) => measure.field));\n if (pivot.heatmap && !measured.has(pivot.heatmap)) {\n add(\n `The shading reads ${pivot.heatmap}, which is not one of this pivot's measures, so nothing would be shaded.`,\n { kind: \"pivotHeatmap\" },\n );\n }\n if (pivot.sortMeasure && !measured.has(pivot.sortMeasure)) {\n add(\n `The rows are ordered by ${pivot.sortMeasure}, which is not one of this pivot's measures, so the order would fall back to the labels.`,\n { kind: \"pivotSort\" },\n );\n }\n if (pivot.topRowsMeasure && !measured.has(pivot.topRowsMeasure)) {\n add(\n `The biggest rows are picked by ${pivot.topRowsMeasure}, which is not one of this pivot's measures, so nothing would decide which rows are kept.`,\n { kind: \"pivotTopRows\" },\n );\n }\n\n return findings;\n}\n\nexport function widgetIssues(\n widget: BuilderWidget,\n model: SemanticSummary,\n): string[] {\n return widgetFindings(widget, model).map((finding) => finding.message);\n}\n","import { isMap, isSeq, parseDocument } from \"yaml\";\nimport type { YAMLMap } from \"yaml\";\n\n/**\n * What the dashboard YAML editor checks before it lets an author save: that\n * the text parses, calls itself a dashboard, and that every tab names widgets\n * that exist. It reads the raw document rather than the typed spec so a\n * half-written page can still be reported line by line.\n */\nexport interface DashboardOutline {\n id: string | null;\n name: string | null;\n /** Tab ids in authored order. Each tab is one dashboard page. */\n tabIds: string[];\n /** Widget refs across every tab, in page order. */\n widgetRefs: string[];\n /** Why the document cannot be saved, or empty. */\n issues: string[];\n}\n\nfunction text(node: unknown): string | null {\n return typeof node === \"string\" && node.length > 0 ? node : null;\n}\n\nfunction mapAt(parent: YAMLMap, key: string): YAMLMap | null {\n const node = parent.get(key, true);\n return isMap(node) ? node : null;\n}\n\nexport function readDashboardOutline(specYaml: string): DashboardOutline {\n const empty: DashboardOutline = {\n id: null,\n name: null,\n tabIds: [],\n widgetRefs: [],\n issues: [],\n };\n const doc = parseDocument(specYaml);\n const first = doc.errors[0];\n if (first) {\n return {\n ...empty,\n issues: [\n `Line ${String(first.linePos?.[0].line ?? 1)}: ${first.message.trim()}`,\n ],\n };\n }\n if (!isMap(doc.contents)) {\n return { ...empty, issues: [\"A dashboard must be a YAML mapping.\"] };\n }\n const root = doc.contents;\n const issues: string[] = [];\n if (text(root.get(\"kind\")) !== \"dashboard\") {\n issues.push(\"kind must be dashboard.\");\n }\n const metadata = mapAt(root, \"metadata\");\n const id = metadata ? text(metadata.get(\"id\")) : null;\n const name = metadata ? text(metadata.get(\"name\")) : null;\n if (id === null) issues.push(\"metadata.id is required.\");\n if (name === null) issues.push(\"metadata.name is required.\");\n const spec = mapAt(root, \"spec\");\n const tabs = spec ? spec.get(\"tabs\", true) : null;\n const tabIds: string[] = [];\n const widgetRefs: string[] = [];\n if (!isSeq(tabs) || tabs.items.length === 0) {\n issues.push(\"spec.tabs must list at least one page.\");\n } else {\n tabs.items.forEach((tab, index) => {\n if (!isMap(tab)) {\n issues.push(`Tab ${String(index + 1)} must be a mapping.`);\n return;\n }\n const tabId = text(tab.get(\"id\"));\n if (tabId === null) {\n issues.push(`Tab ${String(index + 1)} needs an id.`);\n } else if (tabIds.includes(tabId)) {\n issues.push(`Tab id ${tabId} is used twice.`);\n } else {\n tabIds.push(tabId);\n }\n const widgets = tab.get(\"widgets\", true);\n if (!isSeq(widgets)) return;\n for (const item of widgets.items) {\n const ref = isMap(item) ? text(item.get(\"ref\")) : text(item);\n if (ref === null) {\n issues.push(\n `Tab ${tabId ?? String(index + 1)} has a widget without a ref.`,\n );\n } else {\n widgetRefs.push(ref);\n }\n }\n });\n }\n return { id, name, tabIds, widgetRefs, issues };\n}\n","/**\n * Read and edit a widget as a YAML document, not as an object.\n *\n * Same contract as the semantic model Builder: the widget Builder is a second\n * way to edit one text, never a second source of truth. Every edit goes through\n * the `yaml` Document API and touches only the keys the Builder owns, so\n * comments, interactions, bindings, drilldowns and every ECharts option the\n * Builder has no control for survive an edit untouched.\n */\n\nimport {\n isMap,\n isScalar,\n isSeq,\n parseDocument,\n type Document,\n type YAMLMap,\n type YAMLSeq,\n} from \"yaml\";\n\nimport type { ModelParseError } from \"./model-document.js\";\n\n/** Components the Builder has a form for. Anything else stays YAML only. */\nexport const BUILDER_COMPONENTS = [\n \"echarts\",\n \"table\",\n \"tabulator\",\n \"pivot_table\",\n \"kpi\",\n] as const;\n\nexport type BuilderComponent = (typeof BUILDER_COMPONENTS)[number];\n\n/** Every component a widget can be, so the Builder can switch to any of them. */\nexport const ALL_COMPONENTS = [\n \"echarts\",\n \"table\",\n \"tabulator\",\n \"pivot_table\",\n \"kpi\",\n \"text\",\n \"markdown\",\n \"image\",\n \"filter\",\n] as const;\n\nexport function isBuilderComponent(\n component: string,\n): component is BuilderComponent {\n return (BUILDER_COMPONENTS as readonly string[]).includes(component);\n}\n\n/** Chart shapes the renderer draws from a category and a value column. */\nexport const CHART_TYPES = [\"line\", \"bar\", \"area\", \"pie\", \"scatter\"] as const;\n\nexport type ChartType = (typeof CHART_TYPES)[number];\n\n/** One named line or bar, pointing at a column the query returns. */\nexport interface BuilderSeries {\n name: string | null;\n field: string;\n}\n\n/** Which column each part of the widget reads. */\nexport interface BuilderMappings {\n x: string | null;\n category: string | null;\n value: string | null;\n series: string | null;\n /** The column a KPI compares its number against. */\n delta: string | null;\n}\n\n/** How a KPI prints the change between its number and its comparison column. */\nexport const DELTA_FORMATS = [\"percent\", \"number\", \"currency\"] as const;\n\nexport type DeltaFormat = (typeof DELTA_FORMATS)[number];\n\n/** How a number is printed on a card. */\nexport const NUMBER_FORMATS = [\"number\", \"currency\", \"percent\"] as const;\n\nexport type NumberFormat = (typeof NUMBER_FORMATS)[number];\n\n/** Which way rows are ordered before they are drawn. */\nexport const SORT_ORDERS = [\"none\", \"asc\", \"desc\"] as const;\n\nexport type SortOrder = (typeof SORT_ORDERS)[number];\n\n/**\n * How the widget reads, as opposed to what it reads.\n *\n * One flat block covering every component, because an author switching a KPI\n * to a table should not lose the wording they set. Only the keys that belong\n * to the current component are written, so the YAML never carries a table page\n * size on a chart.\n */\nexport interface BuilderAppearance {\n /** Single number: how the figure is printed. */\n format: NumberFormat;\n /** Printed before the number, for example a currency symbol. */\n prefix: string | null;\n /** Printed after the number, for example hrs or pp. */\n suffix: string | null;\n /** Shorten large numbers, so 1240000 reads 1.24M. */\n compact: boolean;\n /** Fixed decimal places, or null for the format's own default. */\n decimals: number | null;\n /** Whether the caption sits above or below the figure. */\n labelPosition: \"top\" | \"bottom\";\n /** Chart: whether the legend is drawn. */\n showLegend: boolean;\n /** Chart: lay a bar chart on its side, which suits long category names. */\n horizontal: boolean;\n /** Chart: sort the points along the axis before drawing them. */\n sortOrder: SortOrder;\n /** Table: rows per page, or null to show them all. */\n pageSize: number | null;\n /** Table: whether a viewer can sort by clicking a heading. */\n sortable: boolean;\n /** Advanced table: collect rows under a heading per value of this column. */\n groupBy: string | null;\n}\n\n/** How a pivot table totals one column of figures. */\nexport const PIVOT_AGGREGATIONS = [\n \"sum\",\n \"avg\",\n \"min\",\n \"max\",\n \"count\",\n \"count_distinct\",\n] as const;\n\nexport type PivotAggregation = (typeof PIVOT_AGGREGATIONS)[number];\n\n/** Whether the rows under a group carry a line of their own. */\nexport const PIVOT_SUBTOTALS = [\"collapsed\", \"expanded\", \"none\"] as const;\n\nexport type PivotSubtotals = (typeof PIVOT_SUBTOTALS)[number];\n\n/** Which way an ordering reads. */\nexport const PIVOT_DIRECTIONS = [\"asc\", \"desc\"] as const;\n\nexport type PivotDirection = (typeof PIVOT_DIRECTIONS)[number];\n\n/** One figure a pivot table computes at every intersection. */\nexport interface BuilderPivotMeasure {\n field: string;\n agg: PivotAggregation;\n /** What the column is called, or null to use the metric's own label. */\n label: string | null;\n format: NumberFormat | null;\n decimals: number | null;\n}\n\n/**\n * How the cross-tab is laid out.\n *\n * Rows and columns name dataset dimensions, measures name metrics, and the rest\n * is how the grid reads. The engine computes it, so every one of these travels\n * into the workbook and the deck a schedule delivers as well as the screen.\n */\nexport interface BuilderPivot {\n rows: string[];\n columns: string[];\n measures: BuilderPivotMeasure[];\n /** A line per row group, totalling the columns across it. */\n rowTotals: boolean;\n /** A total column beside the columns a dimension generated. */\n columnTotals: boolean;\n /** The one line at the foot totalling everything. */\n grandTotal: boolean;\n subtotals: PivotSubtotals;\n /** What an intersection with no rows behind it prints. */\n emptyValue: string | null;\n /** The measure whose cells are shaded, or null for no shading. */\n heatmap: string | null;\n /**\n * How many row levels start open when the widget is photographed for a PNG\n * or PDF delivery, or null to open the rows the way subtotals says. A\n * picture only carries the rows that are open, while the workbook and the\n * deck always carry the whole cross-tab.\n */\n snapshotExpand: number | null;\n /**\n * How many column levels start open when the widget is photographed for a\n * PNG or PDF delivery, or null to open every column. A spanning header past\n * this level is folded to its own total column in the picture.\n */\n snapshotExpandColumns: number | null;\n /** The measure the rows are ordered by, or null to order by their labels. */\n sortMeasure: string | null;\n /** Which way that ordering reads, or null for biggest or A first. */\n sortDirection: PivotDirection | null;\n /** How many row groups are drawn before the rest becomes one line, or null. */\n topRows: number | null;\n /** The measure that decides the biggest rows, or null for the sort measure. */\n topRowsMeasure: string | null;\n /** Whether the rows left out are carried in an Other line. */\n topRowsOther: boolean;\n /** How many row groups are kept, or null for the engine's own cap. */\n rowGroupLimit: number | null;\n /** How many generated columns are kept, or null for the engine's own cap. */\n columnLimit: number | null;\n /**\n * Whether a reader may rearrange this pivot with the field panel.\n *\n * What they arrange lives in their own browser for as long as they look at it,\n * so this switch decides who may explore, not what anyone else sees: the saved\n * layout is still what a link, a schedule and every export carry.\n */\n explore: boolean;\n}\n\nexport interface BuilderWidget {\n id: string;\n name: string | null;\n component: BuilderComponent;\n chartType: ChartType;\n /** Percent of the comparison, or the plain difference. */\n deltaFormat: DeltaFormat;\n /** `dataset` is the only kind the Builder edits; the rest stay read-only. */\n dataKind: string;\n datasetId: string | null;\n /** Columns asked of the dataset, which are also the keys the rows come back with. */\n columns: string[];\n mappings: BuilderMappings;\n series: BuilderSeries[];\n appearance: BuilderAppearance;\n pivot: BuilderPivot;\n}\n\nexport interface WidgetOutline {\n widget: BuilderWidget | null;\n /** Id, title and component, readable even when the rest is YAML only. */\n identity: { id: string; name: string | null; component: string };\n /** Why the Builder will not edit the rest of this widget, when it will not. */\n readOnlyReason: string | null;\n error: ModelParseError | null;\n}\n\nfunction str(node: unknown): string | null {\n return typeof node === \"string\" && node !== \"\" ? node : null;\n}\n\nfunction mapAt(parent: YAMLMap, key: string): YAMLMap | null {\n const node = parent.get(key, true);\n return isMap(node) ? node : null;\n}\n\nfunction seqAt(parent: YAMLMap, key: string): YAMLSeq | null {\n const node = parent.get(key, true);\n return isSeq(node) ? node : null;\n}\n\nfunction mapsOf(seq: YAMLSeq | null): YAMLMap[] {\n if (!seq) return [];\n return seq.items.filter((item): item is YAMLMap => isMap(item));\n}\n\n/**\n * The columns a dataset source asks for.\n *\n * `columns`, `dimensions` and `metrics` are merged in that order, because that\n * is what the engine does with them, and a widget written by hand may use any\n * of the three.\n */\nfunction readSelectedColumns(data: YAMLMap): string[] {\n const merged = [\n ...stringList(data.get(\"columns\", true)),\n ...stringList(data.get(\"dimensions\", true)),\n ...stringList(data.get(\"metrics\", true)),\n ];\n return [...new Set(merged)];\n}\n\nfunction stringList(node: unknown): string[] {\n if (!isSeq(node)) return [];\n return node.items.flatMap((item) => {\n const value = isScalar(item) ? item.value : item;\n return typeof value === \"string\" ? [value] : [];\n });\n}\n\n/**\n * Write a list of strings, leaving the node alone when the values already match.\n *\n * Rewriting it unconditionally would turn `[business_date, net_sales]` into a\n * block list, which shows up as a diff on a line nobody edited.\n */\nfunction setStringSeq(\n doc: Document,\n map: YAMLMap,\n key: string,\n values: string[],\n): void {\n const current = stringList(map.get(key, true));\n if (\n current.length === values.length &&\n current.every((value, index) => value === values[index])\n ) {\n return;\n }\n map.set(key, doc.createNode(values));\n}\n\nfunction setOrDelete(map: YAMLMap, key: string, value: unknown): void {\n if (value === null || value === undefined || value === \"\") {\n if (map.has(key)) map.delete(key);\n return;\n }\n map.set(key, value);\n}\n\nfunction parseWidgetDocument(specYaml: string): {\n doc: Document | null;\n error: ModelParseError | null;\n} {\n const doc = parseDocument(specYaml);\n const first = doc.errors[0];\n if (first) {\n return {\n doc: null,\n error: { message: first.message, line: first.linePos?.[0].line ?? 1 },\n };\n }\n if (!isMap(doc.contents)) {\n return {\n doc: null,\n error: { message: \"A widget must be a YAML mapping.\", line: 1 },\n };\n }\n return { doc, error: null };\n}\n\nfunction readChartType(display: YAMLMap | null): ChartType {\n const echarts = display ? mapAt(display, \"echarts\") : null;\n const option = echarts ? mapAt(echarts, \"option\") : null;\n const first = mapsOf(option ? seqAt(option, \"series\") : null)[0] ?? null;\n const type = first ? str(first.get(\"type\")) : null;\n if (type === \"line\" && first?.has(\"areaStyle\")) return \"area\";\n return (CHART_TYPES as readonly string[]).includes(type ?? \"\")\n ? (type as ChartType)\n : \"line\";\n}\n\nfunction readDeltaFormat(display: YAMLMap | null): DeltaFormat {\n const kpi = display ? mapAt(display, \"kpi\") : null;\n const delta = kpi ? mapAt(kpi, \"delta\") : null;\n const format = delta ? str(delta.get(\"format\")) : null;\n return (DELTA_FORMATS as readonly string[]).includes(format ?? \"\")\n ? (format as DeltaFormat)\n : \"percent\";\n}\n\nfunction num(node: unknown): number | null {\n return typeof node === \"number\" && Number.isFinite(node) ? node : null;\n}\n\nfunction bool(node: unknown, fallback: boolean): boolean {\n return typeof node === \"boolean\" ? node : fallback;\n}\n\n/** How the widget reads today, with the renderer's own defaults filled in. */\nfunction readAppearance(display: YAMLMap | null): BuilderAppearance {\n const kpi = display ? mapAt(display, \"kpi\") : null;\n const echarts = display ? mapAt(display, \"echarts\") : null;\n const option = echarts ? mapAt(echarts, \"option\") : null;\n const legend = option ? mapAt(option, \"legend\") : null;\n const xSort = echarts ? mapAt(echarts, \"xSort\") : null;\n const table = display\n ? (mapAt(display, \"table\") ?? mapAt(display, \"tabulator\"))\n : null;\n const tabulator = display ? mapAt(display, \"tabulator\") : null;\n const label = kpi ? mapAt(kpi, \"label\") : null;\n const format = kpi ? str(kpi.get(\"format\")) : null;\n const order = xSort ? str(xSort.get(\"order\")) : null;\n const position =\n (label ? str(label.get(\"position\")) : null) ??\n (kpi ? str(kpi.get(\"position\")) : null);\n\n return {\n format: (NUMBER_FORMATS as readonly string[]).includes(format ?? \"\")\n ? (format as NumberFormat)\n : \"number\",\n prefix: kpi ? str(kpi.get(\"prefix\")) : null,\n suffix: kpi ? str(kpi.get(\"suffix\")) : null,\n compact: bool(kpi?.get(\"compact\"), false),\n decimals: kpi ? num(kpi.get(\"decimals\")) : null,\n labelPosition: position === \"bottom\" ? \"bottom\" : \"top\",\n showLegend: bool(legend?.get(\"show\"), true),\n horizontal:\n (echarts ? str(echarts.get(\"orientation\")) : null) === \"horizontal\",\n sortOrder: order === \"asc\" || order === \"desc\" ? order : \"none\",\n pageSize: table ? num(table.get(\"page_size\")) : null,\n sortable: bool(table?.get(\"sortable\"), true),\n groupBy: tabulator ? str(tabulator.get(\"group_by\")) : null,\n };\n}\n\n/**\n * The cross-tab as it is laid out today, with the engine's own defaults filled in.\n *\n * A widget that is not a pivot still reads as one, empty, so switching a table\n * to a pivot table starts from a blank layout rather than from nothing at all.\n */\nfunction readPivot(display: YAMLMap | null): BuilderPivot {\n const pivot = display ? mapAt(display, \"pivot_table\") : null;\n const totals = pivot ? mapAt(pivot, \"totals\") : null;\n const heatmap = pivot ? mapAt(pivot, \"heatmap\") : null;\n const snapshot = pivot ? mapAt(pivot, \"snapshot\") : null;\n const limits = pivot ? mapAt(pivot, \"limits\") : null;\n const sort = pivot ? mapAt(pivot, \"sort\") : null;\n const topRows = pivot ? mapAt(pivot, \"top_rows\") : null;\n const subtotals = pivot ? str(pivot.get(\"subtotals\")) : null;\n const direction = sort ? str(sort.get(\"direction\")) : null;\n\n return {\n rows: stringList(pivot?.get(\"rows\", true)),\n columns: stringList(pivot?.get(\"columns\", true)),\n measures: mapsOf(pivot ? seqAt(pivot, \"measures\") : null).flatMap(\n (entry) => {\n const field = str(entry.get(\"field\"));\n if (!field) return [];\n const agg = str(entry.get(\"agg\"));\n const format = str(entry.get(\"format\"));\n return [\n {\n field,\n agg: (PIVOT_AGGREGATIONS as readonly string[]).includes(agg ?? \"\")\n ? (agg as PivotAggregation)\n : \"sum\",\n label: str(entry.get(\"label\")),\n format: (NUMBER_FORMATS as readonly string[]).includes(format ?? \"\")\n ? (format as NumberFormat)\n : null,\n decimals: num(entry.get(\"decimals\")),\n },\n ];\n },\n ),\n rowTotals: bool(totals?.get(\"row\"), true),\n columnTotals: bool(totals?.get(\"column\"), true),\n grandTotal: bool(totals?.get(\"grand\"), true),\n subtotals: (PIVOT_SUBTOTALS as readonly string[]).includes(subtotals ?? \"\")\n ? (subtotals as PivotSubtotals)\n : \"collapsed\",\n emptyValue: pivot ? str(pivot.get(\"empty_value\")) : null,\n heatmap: heatmap ? str(heatmap.get(\"measure\")) : null,\n snapshotExpand: snapshot ? num(snapshot.get(\"expand\")) : null,\n snapshotExpandColumns: snapshot\n ? num(snapshot.get(\"expand_columns\"))\n : null,\n sortMeasure: sort ? str(sort.get(\"measure\")) : null,\n sortDirection: (PIVOT_DIRECTIONS as readonly string[]).includes(\n direction ?? \"\",\n )\n ? (direction as PivotDirection)\n : null,\n topRows: topRows ? num(topRows.get(\"count\")) : null,\n topRowsMeasure: topRows ? str(topRows.get(\"measure\")) : null,\n topRowsOther: bool(topRows?.get(\"other\"), true),\n rowGroupLimit: limits ? num(limits.get(\"row_groups\")) : null,\n columnLimit: limits ? num(limits.get(\"columns\")) : null,\n explore: bool(pivot?.get(\"explore\"), true),\n };\n}\n\nfunction readSeries(display: YAMLMap | null): BuilderSeries[] {\n const echarts = display ? mapAt(display, \"echarts\") : null;\n return mapsOf(echarts ? seqAt(echarts, \"series\") : null).flatMap((item) => {\n const field = str(item.get(\"field\"));\n if (!field) return [];\n return [{ name: str(item.get(\"name\")), field }];\n });\n}\n\n/** The widget as the Builder shows it, or why it will not show it. */\nexport function readWidgetOutline(specYaml: string): WidgetOutline {\n const { doc, error } = parseWidgetDocument(specYaml);\n if (!doc || !isMap(doc.contents)) {\n return {\n widget: null,\n identity: { id: \"\", name: null, component: \"echarts\" },\n readOnlyReason: null,\n error,\n };\n }\n const root = doc.contents;\n const metadata = mapAt(root, \"metadata\");\n const spec = mapAt(root, \"spec\");\n const identity = {\n id: (metadata ? str(metadata.get(\"id\")) : null) ?? \"\",\n name: metadata ? str(metadata.get(\"name\")) : null,\n component: (spec ? str(spec.get(\"component\")) : null) ?? \"echarts\",\n };\n if (!spec) {\n return {\n widget: null,\n identity,\n readOnlyReason: \"This widget has no spec block yet.\",\n error: null,\n };\n }\n const component = identity.component;\n if (!isBuilderComponent(component)) {\n return {\n widget: null,\n identity,\n readOnlyReason: `A ${component} widget holds content rather than data, so its wording lives in YAML.`,\n error: null,\n };\n }\n const data = mapAt(spec, \"data\");\n const dataKind = data ? (str(data.get(\"kind\")) ?? \"static\") : \"static\";\n const mappings = mapAt(spec, \"mappings\");\n const display = mapAt(spec, \"display\");\n\n return {\n identity,\n widget: {\n id: identity.id,\n name: identity.name,\n component,\n chartType: readChartType(display),\n deltaFormat: readDeltaFormat(display),\n dataKind,\n datasetId: data ? str(data.get(\"dataset\")) : null,\n columns: data ? readSelectedColumns(data) : [],\n mappings: {\n x: mappings ? str(mappings.get(\"x\")) : null,\n category: mappings ? str(mappings.get(\"category\")) : null,\n value: mappings ? str(mappings.get(\"value\")) : null,\n series: mappings ? str(mappings.get(\"series\")) : null,\n delta: mappings ? str(mappings.get(\"delta\")) : null,\n },\n series: readSeries(display),\n appearance: readAppearance(display),\n pivot: readPivot(display),\n },\n readOnlyReason:\n dataKind === \"dataset\" || dataKind === \"static\"\n ? null\n : `This widget reads a ${dataKind} source rather than a dataset, so the Builder leaves it to YAML.`,\n error: null,\n };\n}\n\nfunction ensureMap(doc: Document, parent: YAMLMap, key: string): YAMLMap {\n const existing = mapAt(parent, key);\n if (existing) return existing;\n const created = doc.createNode({});\n if (!isMap(created)) throw new Error(`Could not create ${key}`);\n parent.set(key, created);\n return created;\n}\n\n/** The document back as text, byte for byte apart from the edits made. */\nfunction widgetText(doc: Document): string {\n return doc.toString({ lineWidth: 0, flowCollectionPadding: false });\n}\n\nfunction writeChartType(\n doc: Document,\n display: YAMLMap,\n chartType: ChartType,\n): void {\n const echarts = ensureMap(doc, display, \"echarts\");\n const option = ensureMap(doc, echarts, \"option\");\n const existing = mapsOf(seqAt(option, \"series\"))[0] ?? null;\n const target = existing ?? (doc.createNode({}) as YAMLMap);\n // `area` is a line that fills below itself, which is how ECharts spells it.\n target.set(\"type\", chartType === \"area\" ? \"line\" : chartType);\n if (chartType === \"area\") {\n if (!target.has(\"areaStyle\")) target.set(\"areaStyle\", doc.createNode({}));\n } else if (target.has(\"areaStyle\")) {\n target.delete(\"areaStyle\");\n }\n if (!existing) option.set(\"series\", doc.createNode([target]));\n}\n\nfunction writeSeries(\n doc: Document,\n display: YAMLMap,\n series: BuilderSeries[],\n): void {\n const echarts = mapAt(display, \"echarts\");\n if (series.length === 0) {\n if (echarts?.has(\"series\")) echarts.delete(\"series\");\n return;\n }\n const target = echarts ?? ensureMap(doc, display, \"echarts\");\n target.set(\n \"series\",\n doc.createNode(\n series.map((entry) =>\n entry.name\n ? { name: entry.name, field: entry.field }\n : { field: entry.field },\n ),\n ),\n );\n}\n\n/**\n * Write the widget back, keeping every key the Builder does not own.\n *\n * The columns list is written as it is chosen, because the keys the rows come\n * back with are exactly those strings: that is what lets the Builder guarantee\n * a mapping names a column the query actually returns.\n */\nexport function writeWidget(specYaml: string, widget: BuilderWidget): string {\n const { doc } = parseWidgetDocument(specYaml);\n if (!doc || !isMap(doc.contents)) return specYaml;\n const root = doc.contents;\n\n const metadata = ensureMap(doc, root, \"metadata\");\n if (widget.id) metadata.set(\"id\", widget.id);\n setOrDelete(metadata, \"name\", widget.name);\n\n const spec = ensureMap(doc, root, \"spec\");\n spec.set(\"component\", widget.component);\n\n if (widget.datasetId) {\n const data = ensureMap(doc, spec, \"data\");\n data.set(\"kind\", \"dataset\");\n data.set(\"dataset\", widget.datasetId);\n if (widget.columns.length > 0) {\n setStringSeq(doc, data, \"columns\", widget.columns);\n } else if (data.has(\"columns\")) {\n data.delete(\"columns\");\n }\n // The engine merges these three, so once `columns` holds the whole\n // selection the other two would only be a second place to keep it.\n if (data.has(\"dimensions\")) data.delete(\"dimensions\");\n if (data.has(\"metrics\")) data.delete(\"metrics\");\n }\n\n const mappings = ensureMap(doc, spec, \"mappings\");\n setOrDelete(mappings, \"x\", widget.mappings.x);\n setOrDelete(mappings, \"category\", widget.mappings.category);\n setOrDelete(mappings, \"value\", widget.mappings.value);\n setOrDelete(mappings, \"series\", widget.mappings.series);\n setOrDelete(mappings, \"delta\", widget.mappings.delta);\n if (mappings.items.length === 0) spec.delete(\"mappings\");\n\n if (widget.component === \"echarts\") {\n const display = ensureMap(doc, spec, \"display\");\n writeChartType(doc, display, widget.chartType);\n writeSeries(doc, display, widget.series);\n }\n\n if (widget.component === \"kpi\") {\n writeKpiDelta(doc, spec, widget);\n }\n\n writeAppearance(doc, spec, widget);\n\n return widgetText(doc);\n}\n\n/**\n * Write how the widget reads, only for the component it currently is.\n *\n * Everything is removed when it matches the renderer's own default, so a widget\n * nobody has styled keeps a YAML block free of keys that say nothing.\n */\nfunction writeAppearance(\n doc: Document,\n spec: YAMLMap,\n widget: BuilderWidget,\n): void {\n const look = widget.appearance;\n\n if (widget.component === \"kpi\") {\n const kpi = ensureMap(doc, ensureMap(doc, spec, \"display\"), \"kpi\");\n kpi.set(\"format\", look.format);\n setOrDelete(kpi, \"prefix\", look.prefix);\n setOrDelete(kpi, \"suffix\", look.suffix);\n setOrDelete(kpi, \"compact\", look.compact ? true : null);\n setOrDelete(kpi, \"decimals\", look.decimals);\n // The caption can be a plain string, in which case its position has\n // nowhere to live but the kpi block itself.\n const label = mapAt(kpi, \"label\");\n const target = label ?? kpi;\n setOrDelete(\n target,\n \"position\",\n look.labelPosition === \"bottom\" ? \"bottom\" : null,\n );\n return;\n }\n\n if (widget.component === \"echarts\") {\n const echarts = ensureMap(doc, ensureMap(doc, spec, \"display\"), \"echarts\");\n setOrDelete(echarts, \"orientation\", look.horizontal ? \"horizontal\" : null);\n if (look.sortOrder === \"none\") {\n if (echarts.has(\"xSort\")) echarts.delete(\"xSort\");\n } else {\n const xSort = ensureMap(doc, echarts, \"xSort\");\n setOrDelete(xSort, \"by\", widget.mappings.x ?? widget.mappings.category);\n xSort.set(\"order\", look.sortOrder);\n }\n const option = ensureMap(doc, echarts, \"option\");\n if (look.showLegend) {\n const legend = mapAt(option, \"legend\");\n if (legend?.has(\"show\")) legend.delete(\"show\");\n if (legend && legend.items.length === 0) option.delete(\"legend\");\n } else {\n ensureMap(doc, option, \"legend\").set(\"show\", false);\n }\n if (option.items.length === 0) echarts.delete(\"option\");\n return;\n }\n\n if (widget.component === \"pivot_table\") {\n writePivot(doc, spec, widget.pivot);\n return;\n }\n\n if (widget.component === \"table\" || widget.component === \"tabulator\") {\n const block = ensureMap(\n doc,\n ensureMap(doc, spec, \"display\"),\n widget.component,\n );\n setOrDelete(block, \"page_size\", look.pageSize);\n setOrDelete(block, \"sortable\", look.sortable ? null : false);\n if (widget.component === \"tabulator\") {\n setOrDelete(block, \"group_by\", look.groupBy);\n }\n }\n}\n\n/**\n * Write the cross-tab layout, and only the parts that are not the default.\n *\n * The engine already totals rows, columns and the grand total, prints an empty\n * intersection as a dash and collapses subtotals, so writing those back would\n * only fill the YAML with keys that say what happens anyway. Every key the\n * Builder has no control for, including the caption and the export block, is\n * left exactly as the author or the AI wrote it.\n */\nfunction writePivot(doc: Document, spec: YAMLMap, pivot: BuilderPivot): void {\n const block = ensureMap(doc, ensureMap(doc, spec, \"display\"), \"pivot_table\");\n\n setStringSeq(doc, block, \"rows\", pivot.rows);\n if (pivot.columns.length > 0) {\n setStringSeq(doc, block, \"columns\", pivot.columns);\n } else if (block.has(\"columns\")) {\n block.delete(\"columns\");\n }\n\n block.set(\n \"measures\",\n doc.createNode(\n pivot.measures.map((measure) => ({\n field: measure.field,\n agg: measure.agg,\n ...(measure.label ? { label: measure.label } : {}),\n ...(measure.format ? { format: measure.format } : {}),\n ...(measure.decimals === null ? {} : { decimals: measure.decimals }),\n })),\n ),\n );\n\n const defaultTotals =\n pivot.rowTotals && pivot.columnTotals && pivot.grandTotal;\n if (defaultTotals) {\n if (block.has(\"totals\")) block.delete(\"totals\");\n } else {\n const totals = ensureMap(doc, block, \"totals\");\n totals.set(\"row\", pivot.rowTotals);\n totals.set(\"column\", pivot.columnTotals);\n totals.set(\"grand\", pivot.grandTotal);\n }\n\n setOrDelete(\n block,\n \"subtotals\",\n pivot.subtotals === \"collapsed\" ? null : pivot.subtotals,\n );\n setOrDelete(\n block,\n \"empty_value\",\n pivot.emptyValue === \"-\" ? null : pivot.emptyValue,\n );\n setOrDelete(block, \"explore\", pivot.explore ? null : false);\n\n if (pivot.heatmap) {\n ensureMap(doc, block, \"heatmap\").set(\"measure\", pivot.heatmap);\n } else if (block.has(\"heatmap\")) {\n block.delete(\"heatmap\");\n }\n\n if (pivot.snapshotExpand === null && pivot.snapshotExpandColumns === null) {\n if (block.has(\"snapshot\")) block.delete(\"snapshot\");\n } else {\n const snapshot = ensureMap(doc, block, \"snapshot\");\n setOrDelete(snapshot, \"expand\", pivot.snapshotExpand);\n setOrDelete(snapshot, \"expand_columns\", pivot.snapshotExpandColumns);\n }\n\n if (pivot.sortMeasure === null && pivot.sortDirection === null) {\n if (block.has(\"sort\")) block.delete(\"sort\");\n } else {\n const sort = ensureMap(doc, block, \"sort\");\n setOrDelete(sort, \"measure\", pivot.sortMeasure);\n setOrDelete(sort, \"direction\", pivot.sortDirection);\n }\n\n // Top N and the row group cap are not the same setting: the cap drops the\n // tail and says so, while top N rolls it into a line that still adds up.\n if (pivot.topRows === null) {\n if (block.has(\"top_rows\")) block.delete(\"top_rows\");\n } else {\n const top = ensureMap(doc, block, \"top_rows\");\n top.set(\"count\", pivot.topRows);\n setOrDelete(top, \"measure\", pivot.topRowsMeasure);\n setOrDelete(top, \"other\", pivot.topRowsOther ? null : false);\n }\n\n if (pivot.rowGroupLimit === null && pivot.columnLimit === null) {\n if (block.has(\"limits\")) block.delete(\"limits\");\n } else {\n const limits = ensureMap(doc, block, \"limits\");\n setOrDelete(limits, \"row_groups\", pivot.rowGroupLimit);\n setOrDelete(limits, \"columns\", pivot.columnLimit);\n }\n}\n\n/**\n * Write only a pivot's layout - rows, columns and how each measure is combined -\n * into the widget's YAML, keeping everything else exactly as it is.\n *\n * This is what \"Save this layout to the widget\" does: the shelves an editor\n * arranged become the stored layout, so the dashboard, every link and every\n * scheduled delivery draw it from now on. A measure that was already configured\n * keeps its label, format and decimals; one the editor added starts plain.\n * Totals, sorting, top N, heatmap, captions, interactions and comments are not\n * the layout's to touch, so they survive byte for byte.\n */\nexport function writePivotLayout(\n specYaml: string,\n layout: {\n rows: string[];\n columns: string[];\n measures: { field: string; agg: PivotAggregation }[];\n },\n): string {\n const { doc } = parseWidgetDocument(specYaml);\n if (!doc || !isMap(doc.contents)) return specYaml;\n const spec = ensureMap(doc, doc.contents, \"spec\");\n const block = ensureMap(doc, ensureMap(doc, spec, \"display\"), \"pivot_table\");\n\n setStringSeq(doc, block, \"rows\", layout.rows);\n if (layout.columns.length > 0) {\n setStringSeq(doc, block, \"columns\", layout.columns);\n } else if (block.has(\"columns\")) {\n block.delete(\"columns\");\n }\n\n const existing = new Map<string, YAMLMap>();\n for (const entry of mapsOf(seqAt(block, \"measures\"))) {\n const field = str(entry.get(\"field\"));\n if (field && !existing.has(field)) existing.set(field, entry);\n }\n block.set(\n \"measures\",\n doc.createNode(\n layout.measures.map((measure) => {\n const entry = existing.get(measure.field);\n const label = entry ? str(entry.get(\"label\")) : null;\n const format = entry ? str(entry.get(\"format\")) : null;\n const decimals = entry ? num(entry.get(\"decimals\")) : null;\n return {\n field: measure.field,\n agg: measure.agg,\n ...(label ? { label } : {}),\n ...(format ? { format } : {}),\n ...(decimals === null ? {} : { decimals }),\n };\n }),\n ),\n );\n\n return widgetText(doc);\n}\n\n/**\n * Say plainly what a KPI compares its number against.\n *\n * A comparison column named only in `mappings.delta` leaves the engine no way\n * to tell a ready-made change from a second measure, so it prints the measure\n * itself. Naming it here makes the card show the change and what it is against.\n */\nfunction writeKpiDelta(\n doc: Document,\n spec: YAMLMap,\n widget: BuilderWidget,\n): void {\n const comparison = widget.mappings.delta;\n const display = mapAt(spec, \"display\");\n const kpi = display ? mapAt(display, \"kpi\") : null;\n\n if (!comparison) {\n const delta = kpi ? mapAt(kpi, \"delta\") : null;\n if (!delta) return;\n delta.delete(\"metric\");\n delta.delete(\"compare_label\");\n if (delta.items.length === 0) kpi?.delete(\"delta\");\n if (kpi && kpi.items.length === 0) display?.delete(\"kpi\");\n return;\n }\n\n const kpiMap = ensureMap(doc, ensureMap(doc, spec, \"display\"), \"kpi\");\n const delta = ensureMap(doc, kpiMap, \"delta\");\n delta.set(\"metric\", comparison);\n delta.set(\"format\", widget.deltaFormat);\n delta.set(\"compare_label\", humanizeColumn(comparison));\n}\n\n/** `ly_net_sales` reads as `Ly net sales`, which is what a card should say. */\nexport function humanizeColumn(column: string): string {\n const words = column.replace(/[_.]+/g, \" \").trim();\n if (!words) return column;\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Change what the widget is, without touching anything else.\n *\n * Switching to a component the Builder has no form for is allowed on purpose:\n * the author says what they want here and finishes the wording in YAML, rather\n * than deleting the widget and starting again.\n */\nexport function writeComponent(specYaml: string, component: string): string {\n const { doc } = parseWidgetDocument(specYaml);\n if (!doc || !isMap(doc.contents)) return specYaml;\n ensureMap(doc, doc.contents, \"spec\").set(\"component\", component);\n return widgetText(doc);\n}\n\n/** Rename the widget or change the id the layout references. */\nexport function writeIdentity(\n specYaml: string,\n field: \"id\" | \"name\",\n value: string,\n): string {\n const { doc } = parseWidgetDocument(specYaml);\n if (!doc || !isMap(doc.contents)) return specYaml;\n const metadata = ensureMap(doc, doc.contents, \"metadata\");\n if (field === \"id\") {\n if (value) metadata.set(\"id\", value);\n } else {\n setOrDelete(metadata, \"name\", value);\n }\n return widgetText(doc);\n}\n\n/** The YAML of the whole widget, for a panel that shows the text it produces. */\nexport function widgetFragment(specYaml: string): string {\n const { doc } = parseWidgetDocument(specYaml);\n if (!doc) return \"\";\n return widgetText(doc).trimEnd();\n}\n","/**\n * Ready-to-edit YAML for a brand new widget.\n *\n * A blank widget still has to be a valid document, because the Builder reads it\n * back the moment it is created. Every template therefore carries the metadata\n * block, a layout the grid can place, and the display block the component's\n * renderer reads, with the parts an author fills in left empty rather than\n * absent.\n */\n\n/** Components a blank widget can be created as. */\nexport const TEMPLATE_COMPONENTS = [\n \"kpi\",\n \"filter\",\n \"table\",\n \"tabulator\",\n \"pivot_table\",\n \"text\",\n \"echarts\",\n \"image\",\n \"markdown\",\n] as const;\n\nexport type TemplateComponent = (typeof TEMPLATE_COMPONENTS)[number];\n\n/** The shapes a filter widget can take, which change its data block. */\nexport const FILTER_CONTROLS = [\n \"select\",\n \"date\",\n \"date_range\",\n \"custom\",\n] as const;\n\nexport type FilterControlType = (typeof FILTER_CONTROLS)[number];\n\nconst COMPONENT_LABELS: Record<TemplateComponent, string> = {\n kpi: \"KPI\",\n filter: \"Filter\",\n table: \"Table\",\n tabulator: \"Tabulator\",\n pivot_table: \"Pivot table\",\n text: \"Text\",\n echarts: \"Chart\",\n image: \"Image\",\n markdown: \"Markdown\",\n};\n\nexport function templateComponentLabel(component: TemplateComponent): string {\n return COMPONENT_LABELS[component];\n}\n\nfunction sanitizeId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n}\n\nconst LAYOUT = ` x: 0\\n y: 0\\n w: 2\\n h: 2\\n minW: 2\\n minH: 2\\n unplaced: true`;\n\nexport interface WidgetTemplateOptions {\n /** What the widget is called, which also seeds its id. */\n name?: string;\n /** Only read for a filter widget. */\n filterControl?: FilterControlType;\n /**\n * The tail of the generated id. Passed in by a caller that needs the same\n * text twice, and otherwise drawn at random so two blank widgets created in\n * one sitting do not collide.\n */\n suffix?: string;\n}\n\nfunction randomSuffix(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction filterTemplate(\n id: string,\n widgetName: string,\n control: FilterControlType,\n): string {\n const baseYaml = `version: \"1.0\"\nkind: widget\nmetadata:\n id: ${id}\n name: ${widgetName}\n description: \"\"\n platform:\n scope: dashboard\n roles: []\nspec:\n component: filter\n layout:\n${LAYOUT}`;\n\n switch (control) {\n case \"date\":\n return `${baseYaml}\n data:\n kind: static\n display:\n filter:\n control: date\n default_value: today\n placeholder: Pick a date\n date_format: yyyy-MM-dd\n show_icon: true\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"date_range\":\n return `${baseYaml}\n data:\n kind: static\n display:\n filter:\n control: date_range\n default_value: this month\n placeholder: Pick a range\n date_format: yyyy-MM-dd\n show_icon: true\n presets:\n - today\n - yesterday\n - last 7 days\n - this month\n - last month\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"custom\":\n return `${baseYaml}\n data:\n kind: static\n display:\n filter:\n control: custom\n default_value: \"\"\n placeholder: Enter a value\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"select\":\n return `${baseYaml}\n data:\n kind: static\n options:\n - value: option1\n label: Option 1\n - value: option2\n label: Option 2\n - value: option3\n label: Option 3\n default_value: option1\n display:\n filter:\n control: select\n placeholder: Select...\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n }\n}\n\n/** The YAML of a blank widget of this component. */\nexport function widgetTemplate(\n component: TemplateComponent,\n options: WidgetTemplateOptions = {},\n): string {\n const widgetName = options.name ?? `New ${COMPONENT_LABELS[component]}`;\n const id = `${sanitizeId(widgetName)}_${options.suffix ?? randomSuffix()}`;\n const head = `version: \"1.0\"\nkind: widget\nmetadata:\n id: ${id}\n name: ${widgetName}\n description: \"\"\n platform:\n scope: dashboard\n roles: []\nspec:\n component: ${component}\n layout:\n${LAYOUT}`;\n\n switch (component) {\n case \"kpi\":\n return `${head}\n data:\n kind: dataset\n dataset: \"\"\n dimensions: []\n metrics: []\n filters: []\n params: {}\n mappings:\n value: \"\"\n display:\n kpi:\n format: number\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"filter\":\n return filterTemplate(id, widgetName, options.filterControl ?? \"select\");\n case \"text\":\n return `${head}\n data:\n kind: static\n rows: []\n columns: []\n display:\n text:\n content: ${widgetName}\n markdown: false\n text_align: center\n vertical_align: middle\n label:\n text: \"\"\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"table\":\n return `${head}\n data:\n kind: dataset\n dataset: \"\"\n dimensions: []\n metrics: []\n filters: []\n params: {}\n display:\n table:\n page_size: 10\n export:\n csv: true\n excel: true\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"tabulator\":\n return `${head}\n data:\n kind: dataset\n dataset: \"\"\n dimensions: []\n metrics: []\n filters: []\n params: {}\n display:\n tabulator:\n page_size: 25\n sortable: true\n layout: fitColumns\n export:\n csv: true\n excel: true\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"pivot_table\":\n return `${head}\n data:\n kind: dataset\n dataset: \"\"\n dimensions: []\n metrics: []\n filters: []\n params: {}\n display:\n pivot_table:\n rows: []\n columns: []\n measures: []\n totals:\n row: true\n column: true\n grand: true\n subtotals: collapsed\n empty_value: \"-\"\n export:\n csv: true\n excel: true\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"echarts\":\n return `${head}\n data:\n kind: dataset\n dataset: \"\"\n dimensions: []\n metrics: []\n filters: []\n params: {}\n display:\n echarts:\n option:\n series:\n - type: line\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"image\":\n return `${head}\n data:\n kind: static\n rows: []\n columns: []\n display:\n image:\n url: \"\"\n alt: ${widgetName}\n object_fit: contain\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n case \"markdown\":\n return `${head}\n data:\n kind: static\n rows: []\n columns: []\n display:\n markdown:\n content: \"# ${widgetName}\"\n label:\n text: ${widgetName}\n tooltip: \"\"\n tooltip_icon: info\n`;\n }\n}\n","/**\n * Put widget problems on the line that causes them.\n *\n * Same idea as the semantic model editor: a list of sentences under the editor\n * leaves the reader hunting for the mapping or the column the sentence is about.\n * These helpers find the node each finding belongs to and return an editor marker,\n * so the offending line is underlined where it lives.\n */\n\nimport {\n LineCounter,\n isMap,\n isScalar,\n isSeq,\n parseDocument,\n type Node,\n type YAMLMap,\n} from \"yaml\";\n\nimport type { ModelMarker } from \"./model-yaml-markers.js\";\nimport {\n widgetFindings,\n type SemanticSummary,\n type WidgetAnchor,\n} from \"./widget-builder-checks.js\";\nimport { readWidgetOutline } from \"./widget-document.js\";\n\ninterface NodePosition {\n line: number;\n column: number;\n endColumn: number;\n}\n\nfunction positionOf(\n node: Node | null,\n lineCounter: LineCounter,\n): NodePosition | null {\n if (!node?.range) return null;\n const [start, valueEnd] = node.range;\n const startPos = lineCounter.linePos(start);\n const endPos = lineCounter.linePos(valueEnd);\n return {\n line: startPos.line,\n column: startPos.col,\n endColumn:\n endPos.line === startPos.line ? endPos.col : Number.MAX_SAFE_INTEGER,\n };\n}\n\n/** The node an anchor names, or null when the YAML does not spell it out. */\nfunction anchorNode(specYaml: string, anchor: WidgetAnchor): Node | null {\n const doc = parseDocument(specYaml);\n if (!isMap(doc.contents)) return null;\n const root = doc.contents;\n const spec = root.get(\"spec\", true);\n const specMap = isMap(spec) ? spec : null;\n const data = specMap?.get(\"data\", true);\n const dataMap = isMap(data) ? data : null;\n\n switch (anchor.kind) {\n case \"id\": {\n const metadata = root.get(\"metadata\", true);\n return isMap(metadata)\n ? ((metadata.get(\"id\", true) as Node | undefined) ?? metadata)\n : null;\n }\n case \"dataset\":\n return dataMap\n ? ((dataMap.get(\"dataset\", true) as Node | undefined) ?? dataMap)\n : specMap;\n case \"columns\":\n return dataMap\n ? ((dataMap.get(\"columns\", true) as Node | undefined) ?? dataMap)\n : specMap;\n case \"column\": {\n const columns = dataMap?.get(\"columns\", true);\n if (!isSeq(columns)) return dataMap;\n const item = columns.items.find(\n (entry) => isScalar(entry) && entry.value === anchor.key,\n );\n return (item as Node | undefined) ?? (columns as Node);\n }\n case \"mapping\": {\n const mappings = specMap?.get(\"mappings\", true);\n if (!isMap(mappings)) return specMap;\n return (\n (mappings.get(anchor.slot, true) as Node | undefined) ??\n (mappings as Node)\n );\n }\n case \"series\": {\n const display = specMap?.get(\"display\", true);\n const echarts = isMap(display) ? display.get(\"echarts\", true) : null;\n const series = isMap(echarts) ? echarts.get(\"series\", true) : null;\n if (!isSeq(series)) return specMap;\n return ((series.items[anchor.index] as Node | undefined) ??\n (series as Node)) as Node;\n }\n case \"pivotRows\":\n case \"pivotColumns\":\n case \"pivotMeasures\":\n case \"pivotHeatmap\":\n case \"pivotSort\":\n case \"pivotTopRows\": {\n const pivot = pivotBlock(specMap);\n if (!pivot) return specMap;\n const key = PIVOT_ANCHOR_KEYS[anchor.kind];\n return (pivot.get(key, true) as Node | undefined) ?? (pivot as Node);\n }\n case \"pivotMeasure\": {\n const pivot = pivotBlock(specMap);\n const measures = pivot?.get(\"measures\", true);\n if (!isSeq(measures)) return (pivot as Node | null) ?? specMap;\n return ((measures.items[anchor.index] as Node | undefined) ??\n (measures as Node)) as Node;\n }\n default:\n return null;\n }\n}\n\n/** Which key under `display.pivot_table` a pivot finding points at. */\nconst PIVOT_ANCHOR_KEYS = {\n pivotRows: \"rows\",\n pivotColumns: \"columns\",\n pivotMeasures: \"measures\",\n pivotHeatmap: \"heatmap\",\n pivotSort: \"sort\",\n pivotTopRows: \"top_rows\",\n} as const;\n\n/** The `display.pivot_table` map, when the document has one. */\nfunction pivotBlock(specMap: Node | null): YAMLMap | null {\n if (!isMap(specMap)) return null;\n const display = specMap.get(\"display\", true);\n const pivot = isMap(display) ? display.get(\"pivot_table\", true) : null;\n return isMap(pivot) ? pivot : null;\n}\n\n/**\n * Markers for everything that would make this widget render empty.\n *\n * A syntax error stops the rest: the document cannot be read, so every other\n * finding would be guesswork, and one accurate marker beats a list of noise.\n */\nexport function widgetMarkers(\n specYaml: string,\n model: SemanticSummary,\n): ModelMarker[] {\n const lineCounter = new LineCounter();\n const doc = parseDocument(specYaml, { lineCounter });\n if (doc.errors.length > 0) {\n return doc.errors.map((err) => {\n const start = lineCounter.linePos(err.pos[0]);\n const end = lineCounter.linePos(err.pos[1]);\n return {\n startLineNumber: start.line,\n startColumn: start.col,\n endLineNumber: end.line,\n endColumn: end.col,\n message: err.message,\n severity: \"error\" as const,\n };\n });\n }\n\n const outline = readWidgetOutline(specYaml);\n if (!outline.widget) return [];\n\n return widgetFindings(outline.widget, model).map((finding) => {\n const at = positionOf(anchorNode(specYaml, finding.at), lineCounter) ?? {\n line: 1,\n column: 1,\n endColumn: Number.MAX_SAFE_INTEGER,\n };\n return {\n startLineNumber: at.line,\n startColumn: at.column,\n endLineNumber: at.line,\n endColumn: at.endColumn,\n message: finding.message,\n severity: \"warning\" as const,\n };\n });\n}\n","import type {\n DashboardSpec,\n DashboardTab,\n} from \"@dlh.io/bideux-dashboard-spec\";\n\n/**\n * The widget ids a tab holds. A tab may name its widgets by id, by reference,\n * or inline, so all three shapes collapse to ids here.\n */\nexport function tabWidgetIds(tab: DashboardTab): string[] {\n const entries = tab.widgets ?? [];\n const ids: string[] = [];\n for (const entry of entries) {\n if (typeof entry === \"string\") {\n ids.push(entry);\n continue;\n }\n const ref = entry[\"ref\"];\n if (typeof ref === \"string\") {\n const base = ref.split(\"/\").pop() ?? ref;\n ids.push(base.replace(/\\.ya?ml$/u, \"\"));\n continue;\n }\n const metadata = entry[\"metadata\"];\n if (typeof metadata === \"object\" && metadata !== null) {\n const id = (metadata as { id?: unknown }).id;\n if (typeof id === \"string\") ids.push(id);\n }\n }\n return ids;\n}\n\nexport function dashboardTabs(dashboard: DashboardSpec): DashboardTab[] {\n return dashboard.spec.tabs ?? [];\n}\n\nexport function defaultTabId(tabs: DashboardTab[]): string | undefined {\n const chosen = tabs.find((tab) => tab.default === true) ?? tabs[0];\n return chosen?.id;\n}\n","import type {\n BreakpointConfig,\n DashboardResponsiveConfig,\n DashboardSpec,\n} from \"@dlh.io/bideux-dashboard-spec\";\n\nexport type LayoutKey = \"lg\" | \"md\" | \"sm\" | \"xs\" | \"xxs\";\n\n/** The widths the reader switches layouts at, matching the frozen reader. */\nexport const LAYOUT_BREAKPOINT_WIDTHS: Record<LayoutKey, number> = {\n lg: 1200,\n md: 960,\n sm: 720,\n xs: 480,\n xxs: 0,\n};\n\nconst DEFAULTS: Required<\n Record<\"wide\" | \"desktop\" | \"tablet\" | \"mobile\", BreakpointConfig>\n> = {\n wide: { cols: 24, row_height: 30, margin: [8, 8] },\n desktop: { cols: 24, row_height: 30, margin: [8, 8] },\n tablet: { cols: 24, row_height: 30, margin: [10, 10] },\n mobile: { cols: 24, row_height: 30, margin: [10, 10] },\n};\n\nexport function layoutKeyForWidth(width: number): LayoutKey {\n const keys: LayoutKey[] = [\"lg\", \"md\", \"sm\", \"xs\", \"xxs\"];\n return keys.find((key) => width >= LAYOUT_BREAKPOINT_WIDTHS[key]) ?? \"xxs\";\n}\n\nexport function resolveResponsive(\n dashboard: DashboardSpec,\n): Required<\n Record<\"wide\" | \"desktop\" | \"tablet\" | \"mobile\", BreakpointConfig>\n> {\n const configured: DashboardResponsiveConfig | undefined =\n dashboard.spec.responsive;\n return {\n wide: { ...DEFAULTS.wide, ...(configured?.wide ?? {}) },\n desktop: { ...DEFAULTS.desktop, ...(configured?.desktop ?? {}) },\n tablet: { ...DEFAULTS.tablet, ...(configured?.tablet ?? {}) },\n mobile: { ...DEFAULTS.mobile, ...(configured?.mobile ?? {}) },\n };\n}\n","import {\n BREAKPOINT_MAP,\n DEFAULT_GRID_CONFIG,\n buildBaseLayouts,\n ensureLayoutCoverage,\n filterLayoutsByIds,\n isPanelledControl,\n sanitizeLayouts,\n stackNarrowLayouts,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type {\n Breakpoint,\n LayoutItem,\n ResponsiveLayouts,\n} from \"@dlh.io/bideux-dashboard-core\";\nimport type { DashboardSpec, WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { layoutKeyForWidth, resolveResponsive } from \"./responsive.js\";\nimport type { LayoutKey } from \"./responsive.js\";\nimport type { RendererContext } from \"./types.js\";\n\nexport interface ReaderGridTile {\n widgetId: string;\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport interface ReaderGrid {\n layoutKey: LayoutKey;\n breakpoint: Breakpoint;\n /** The height the tiles need, so a host can size the canvas it draws into. */\n height: number;\n columnCount: number;\n columnWidth: number;\n rowHeight: number;\n tiles: ReaderGridTile[];\n}\n\nexport interface ReaderGridInput {\n dashboard: DashboardSpec;\n widgets: Record<string, WidgetSpec>;\n /** The measured canvas width in pixels. */\n width: number;\n}\n\n/**\n * The reader grid in pixels, from the same layout maths the builder saves.\n *\n * Every UI binding places the tiles this returns, which is why a dashboard reads\n * the same in React, in Angular, in Next.js and in a plain browser page.\n */\nexport function buildReaderGrid(input: ReaderGridInput): ReaderGrid {\n const { dashboard, widgets, width } = input;\n const responsive = resolveResponsive(dashboard);\n const gridConfig = {\n ...DEFAULT_GRID_CONFIG,\n ...(dashboard.spec.config?.grid ?? {}),\n };\n const cols: Record<LayoutKey, number> = {\n lg: responsive.wide.cols ?? 24,\n md: responsive.desktop.cols ?? 24,\n sm: responsive.tablet.cols ?? 24,\n xs: responsive.mobile.cols ?? 24,\n xxs: responsive.mobile.cols ?? 24,\n };\n\n const layoutKey = layoutKeyForWidth(width);\n const breakpoint: Breakpoint = BREAKPOINT_MAP[layoutKey] ?? \"desktop\";\n const gridWidgets = Object.values(widgets).filter(\n (widget) => !isPanelledControl(widget, dashboard),\n );\n\n const configuredMaxRows = gridConfig.maxRows ?? undefined;\n const declared = buildBaseLayouts(\n widgets,\n dashboard,\n {},\n [],\n configuredMaxRows,\n );\n const safe = sanitizeLayouts(declared, cols, configuredMaxRows);\n const covered = ensureLayoutCoverage(\n safe,\n widgets,\n dashboard,\n {},\n [],\n configuredMaxRows,\n );\n const placed = filterLayoutsByIds(\n covered,\n new Set(gridWidgets.map((widget) => widget.metadata.id)),\n );\n // Phones read as a single column.\n const layouts: ResponsiveLayouts = stackNarrowLayouts(placed, {\n xs: cols.xs,\n xxs: cols.xxs,\n });\n\n const breakpointConfig = responsive[breakpoint];\n const margin: number[] = breakpointConfig.margin ?? [8, 8];\n const containerPadding: number[] =\n breakpointConfig.containerPadding ?? gridConfig.containerPadding ?? margin;\n const columnCount = cols[layoutKey];\n const marginX = margin[0] ?? 8;\n const marginY = margin[1] ?? 8;\n const paddingX = containerPadding[0] ?? marginX;\n const paddingY = containerPadding[1] ?? marginY;\n\n const columnWidth =\n (width - 2 * paddingX - marginX * (columnCount - 1)) / columnCount;\n const smallBreakpoint = breakpoint === \"mobile\" || breakpoint === \"tablet\";\n const rowHeightFloor = breakpointConfig.row_height ?? 30;\n // A square cell of a twenty column grid is tiny on a phone, so on the small\n // breakpoints the breakpoint's own row height is the floor.\n const squareHeight = smallBreakpoint\n ? Math.max(columnWidth, rowHeightFloor, 1)\n : Math.max(columnWidth, 1);\n const rowHeight = Math.max(\n 1,\n gridConfig.squareCells === false ? rowHeightFloor : squareHeight,\n );\n\n const items: LayoutItem[] = layouts[layoutKey] ?? [];\n const gridBottom = items.reduce(\n (lowest, item) => Math.max(lowest, item.y + item.h),\n 0,\n );\n\n return {\n layoutKey,\n breakpoint,\n height:\n gridBottom * rowHeight +\n Math.max(0, gridBottom - 1) * marginY +\n 2 * paddingY,\n columnCount,\n columnWidth,\n rowHeight,\n tiles: items\n .filter((item) => widgets[item.i] !== undefined)\n .map((item) => ({\n widgetId: item.i,\n left: paddingX + item.x * (columnWidth + marginX),\n top: paddingY + item.y * (rowHeight + marginY),\n width: item.w * columnWidth + Math.max(0, item.w - 1) * marginX,\n height: item.h * rowHeight + Math.max(0, item.h - 1) * marginY,\n })),\n };\n}\n\n/** The renderer context a dashboard's widget defaults imply, and nothing else. */\nexport function readerRendererContext(\n dashboard: DashboardSpec,\n): RendererContext {\n const widgetDefaults = dashboard.spec.config?.widgetDefaults;\n return widgetDefaults === undefined || widgetDefaults === null\n ? {}\n : {\n widgetDefaults: widgetDefaults as NonNullable<\n RendererContext[\"widgetDefaults\"]\n >,\n };\n}\n","import type { WidgetResult } from \"./types.js\";\n\nexport interface ResultTable {\n columns: string[];\n rows: Record<string, unknown>[];\n}\n\nexport function resultRows(\n result: WidgetResult | undefined,\n): Record<string, unknown>[] {\n const rows = result?.rows;\n if (!Array.isArray(rows)) return [];\n return rows.filter(\n (row): row is Record<string, unknown> =>\n typeof row === \"object\" && row !== null && !Array.isArray(row),\n );\n}\n\nexport function resultColumns(\n result: WidgetResult | undefined,\n rows: Record<string, unknown>[],\n): string[] {\n const columns = result?.columns;\n if (Array.isArray(columns)) {\n const named = columns\n .map((column) =>\n typeof column === \"string\"\n ? column\n : typeof column === \"object\" && column !== null\n ? String((column as Record<string, unknown>).name ?? \"\")\n : \"\",\n )\n .filter((column) => column !== \"\");\n if (named.length > 0) return named;\n }\n const first = rows[0];\n return first === undefined ? [] : Object.keys(first);\n}\n\nexport function cellText(value: unknown): string {\n if (value === null || value === undefined || value === \"\") return \"-\";\n if (typeof value === \"number\") return value.toLocaleString();\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n return String(value);\n}\n\nfunction csvCell(value: unknown): string {\n const text = value === null || value === undefined ? \"\" : String(value);\n return /[\",\\n]/u.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n}\n\n/**\n * The clipboard copy the reader offers. Styled workbook exports belong to the\n * export phase and are not reimplemented here.\n */\nexport function formatTableCsv(table: ResultTable): string {\n const header = table.columns.map(csvCell).join(\",\");\n const body = table.rows.map((row) =>\n table.columns.map((column) => csvCell(row[column])).join(\",\"),\n );\n return [header, ...body].join(\"\\r\\n\");\n}\n"]}