graphein 0.20.0 → 0.22.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 (319) hide show
  1. package/dist/animation/animate.d.ts +6 -1
  2. package/dist/animation/animate.d.ts.map +1 -1
  3. package/dist/animation/animate.js +2 -2
  4. package/dist/animation/animate.js.map +2 -2
  5. package/dist/animation/env.d.ts +5 -0
  6. package/dist/animation/env.d.ts.map +1 -1
  7. package/dist/animation/env.js +4 -0
  8. package/dist/animation/env.js.map +2 -2
  9. package/dist/animation/index.d.ts +1 -0
  10. package/dist/animation/index.d.ts.map +1 -1
  11. package/dist/animation/index.js +1 -0
  12. package/dist/animation/index.js.map +2 -2
  13. package/dist/animation/stagger.d.ts +13 -0
  14. package/dist/animation/stagger.d.ts.map +1 -0
  15. package/dist/animation/stagger.js +13 -0
  16. package/dist/animation/stagger.js.map +7 -0
  17. package/dist/axes/draw.d.ts +5 -1
  18. package/dist/axes/draw.d.ts.map +1 -1
  19. package/dist/axes/draw.js +13 -1
  20. package/dist/axes/draw.js.map +2 -2
  21. package/dist/axes/morph.d.ts +111 -0
  22. package/dist/axes/morph.d.ts.map +1 -0
  23. package/dist/axes/morph.js +207 -0
  24. package/dist/axes/morph.js.map +7 -0
  25. package/dist/axes/overlay.d.ts.map +1 -1
  26. package/dist/axes/overlay.js +88 -25
  27. package/dist/axes/overlay.js.map +2 -2
  28. package/dist/axes/text.d.ts +2 -0
  29. package/dist/axes/text.d.ts.map +1 -1
  30. package/dist/axes/text.js +1 -0
  31. package/dist/axes/text.js.map +2 -2
  32. package/dist/axes/tickLabels.d.ts +2 -0
  33. package/dist/axes/tickLabels.d.ts.map +1 -1
  34. package/dist/axes/tickLabels.js +2 -2
  35. package/dist/axes/tickLabels.js.map +2 -2
  36. package/dist/charts/annotations.d.ts +9 -3
  37. package/dist/charts/annotations.d.ts.map +1 -1
  38. package/dist/charts/annotations.js +82 -27
  39. package/dist/charts/annotations.js.map +2 -2
  40. package/dist/charts/area.d.ts +37 -1
  41. package/dist/charts/area.d.ts.map +1 -1
  42. package/dist/charts/area.js +35 -17
  43. package/dist/charts/area.js.map +2 -2
  44. package/dist/charts/bar.d.ts +53 -0
  45. package/dist/charts/bar.d.ts.map +1 -1
  46. package/dist/charts/bar.js +117 -83
  47. package/dist/charts/bar.js.map +2 -2
  48. package/dist/charts/box.d.ts +31 -0
  49. package/dist/charts/box.d.ts.map +1 -1
  50. package/dist/charts/box.js +93 -70
  51. package/dist/charts/box.js.map +2 -2
  52. package/dist/charts/bubbleMap.d.ts +20 -0
  53. package/dist/charts/bubbleMap.d.ts.map +1 -0
  54. package/dist/charts/bubbleMap.js +951 -0
  55. package/dist/charts/bubbleMap.js.map +7 -0
  56. package/dist/charts/bullet.d.ts.map +1 -1
  57. package/dist/charts/bullet.js +69 -51
  58. package/dist/charts/bullet.js.map +2 -2
  59. package/dist/charts/calendarHeatmap.d.ts.map +1 -1
  60. package/dist/charts/calendarHeatmap.js +56 -19
  61. package/dist/charts/calendarHeatmap.js.map +2 -2
  62. package/dist/charts/candlestick.d.ts +40 -0
  63. package/dist/charts/candlestick.d.ts.map +1 -0
  64. package/dist/charts/candlestick.js +325 -0
  65. package/dist/charts/candlestick.js.map +7 -0
  66. package/dist/charts/choropleth.d.ts.map +1 -1
  67. package/dist/charts/choropleth.js +46 -67
  68. package/dist/charts/choropleth.js.map +2 -2
  69. package/dist/charts/combo.d.ts.map +1 -1
  70. package/dist/charts/combo.js +127 -27
  71. package/dist/charts/combo.js.map +3 -3
  72. package/dist/charts/dumbbell.d.ts.map +1 -1
  73. package/dist/charts/dumbbell.js +100 -31
  74. package/dist/charts/dumbbell.js.map +2 -2
  75. package/dist/charts/funnel.d.ts.map +1 -1
  76. package/dist/charts/funnel.js +93 -28
  77. package/dist/charts/funnel.js.map +3 -3
  78. package/dist/charts/gantt.d.ts +22 -0
  79. package/dist/charts/gantt.d.ts.map +1 -0
  80. package/dist/charts/gantt.js +564 -0
  81. package/dist/charts/gantt.js.map +7 -0
  82. package/dist/charts/gauge.d.ts.map +1 -1
  83. package/dist/charts/gauge.js +30 -4
  84. package/dist/charts/gauge.js.map +2 -2
  85. package/dist/charts/geo.d.ts +87 -0
  86. package/dist/charts/geo.d.ts.map +1 -0
  87. package/dist/charts/geo.js +140 -0
  88. package/dist/charts/geo.js.map +7 -0
  89. package/dist/charts/geometry.d.ts +20 -0
  90. package/dist/charts/geometry.d.ts.map +1 -0
  91. package/dist/charts/geometry.js +25 -0
  92. package/dist/charts/geometry.js.map +7 -0
  93. package/dist/charts/heatmap.d.ts.map +1 -1
  94. package/dist/charts/heatmap.js +58 -49
  95. package/dist/charts/heatmap.js.map +2 -2
  96. package/dist/charts/histogram.d.ts +1 -1
  97. package/dist/charts/histogram.d.ts.map +1 -1
  98. package/dist/charts/histogram.js +49 -31
  99. package/dist/charts/histogram.js.map +2 -2
  100. package/dist/charts/index.d.ts +35 -1
  101. package/dist/charts/index.d.ts.map +1 -1
  102. package/dist/charts/index.js +12 -0
  103. package/dist/charts/index.js.map +2 -2
  104. package/dist/charts/legibility.d.ts +38 -0
  105. package/dist/charts/legibility.d.ts.map +1 -0
  106. package/dist/charts/legibility.js +72 -0
  107. package/dist/charts/legibility.js.map +7 -0
  108. package/dist/charts/line.d.ts +39 -1
  109. package/dist/charts/line.d.ts.map +1 -1
  110. package/dist/charts/line.js +48 -16
  111. package/dist/charts/line.js.map +2 -2
  112. package/dist/charts/matrix.d.ts +2 -1
  113. package/dist/charts/matrix.d.ts.map +1 -1
  114. package/dist/charts/matrix.js +481 -319
  115. package/dist/charts/matrix.js.map +3 -3
  116. package/dist/charts/morphFrame.d.ts +83 -0
  117. package/dist/charts/morphFrame.d.ts.map +1 -0
  118. package/dist/charts/morphFrame.js +128 -0
  119. package/dist/charts/morphFrame.js.map +7 -0
  120. package/dist/charts/pie.d.ts.map +1 -1
  121. package/dist/charts/pie.js +89 -26
  122. package/dist/charts/pie.js.map +2 -2
  123. package/dist/charts/pieState.d.ts +27 -0
  124. package/dist/charts/pieState.d.ts.map +1 -0
  125. package/dist/charts/pieState.js +55 -0
  126. package/dist/charts/pieState.js.map +7 -0
  127. package/dist/charts/radar.d.ts +62 -0
  128. package/dist/charts/radar.d.ts.map +1 -0
  129. package/dist/charts/radar.js +912 -0
  130. package/dist/charts/radar.js.map +7 -0
  131. package/dist/charts/radialBar.d.ts +60 -0
  132. package/dist/charts/radialBar.d.ts.map +1 -0
  133. package/dist/charts/radialBar.js +708 -0
  134. package/dist/charts/radialBar.js.map +7 -0
  135. package/dist/charts/sankey.d.ts.map +1 -1
  136. package/dist/charts/sankey.js +223 -57
  137. package/dist/charts/sankey.js.map +3 -3
  138. package/dist/charts/scatter.d.ts +31 -0
  139. package/dist/charts/scatter.d.ts.map +1 -1
  140. package/dist/charts/scatter.js +48 -12
  141. package/dist/charts/scatter.js.map +2 -2
  142. package/dist/charts/slope.d.ts.map +1 -1
  143. package/dist/charts/slope.js +55 -3
  144. package/dist/charts/slope.js.map +2 -2
  145. package/dist/charts/sunburst.d.ts +14 -0
  146. package/dist/charts/sunburst.d.ts.map +1 -0
  147. package/dist/charts/sunburst.js +885 -0
  148. package/dist/charts/sunburst.js.map +7 -0
  149. package/dist/charts/table.d.ts +2 -1
  150. package/dist/charts/table.d.ts.map +1 -1
  151. package/dist/charts/table.js +214 -224
  152. package/dist/charts/table.js.map +3 -3
  153. package/dist/charts/tableView/canvas.d.ts +16 -1
  154. package/dist/charts/tableView/canvas.d.ts.map +1 -1
  155. package/dist/charts/tableView/canvas.js +361 -252
  156. package/dist/charts/tableView/canvas.js.map +3 -3
  157. package/dist/charts/tableView/conditional.d.ts +66 -40
  158. package/dist/charts/tableView/conditional.d.ts.map +1 -1
  159. package/dist/charts/tableView/conditional.js +163 -256
  160. package/dist/charts/tableView/conditional.js.map +3 -3
  161. package/dist/charts/tableView/dom.d.ts +26 -2
  162. package/dist/charts/tableView/dom.d.ts.map +1 -1
  163. package/dist/charts/tableView/dom.js +609 -269
  164. package/dist/charts/tableView/dom.js.map +3 -3
  165. package/dist/charts/tableView/layout.d.ts +22 -0
  166. package/dist/charts/tableView/layout.d.ts.map +1 -0
  167. package/dist/charts/tableView/layout.js +246 -0
  168. package/dist/charts/tableView/layout.js.map +7 -0
  169. package/dist/charts/tableView/sketch.d.ts +3 -2
  170. package/dist/charts/tableView/sketch.d.ts.map +1 -1
  171. package/dist/charts/tableView/sketch.js +2 -2
  172. package/dist/charts/tableView/sketch.js.map +2 -2
  173. package/dist/charts/tableView/sketchBar.d.ts +7 -0
  174. package/dist/charts/tableView/sketchBar.d.ts.map +1 -0
  175. package/dist/charts/tableView/sketchBar.js +32 -0
  176. package/dist/charts/tableView/sketchBar.js.map +7 -0
  177. package/dist/charts/tableView/sort.d.ts +9 -0
  178. package/dist/charts/tableView/sort.d.ts.map +1 -0
  179. package/dist/charts/tableView/sort.js +70 -0
  180. package/dist/charts/tableView/sort.js.map +7 -0
  181. package/dist/charts/tableView/sparkline.d.ts +30 -0
  182. package/dist/charts/tableView/sparkline.d.ts.map +1 -0
  183. package/dist/charts/tableView/sparkline.js +63 -0
  184. package/dist/charts/tableView/sparkline.js.map +7 -0
  185. package/dist/charts/tableView/style.d.ts +67 -0
  186. package/dist/charts/tableView/style.d.ts.map +1 -0
  187. package/dist/charts/tableView/style.js +131 -0
  188. package/dist/charts/tableView/style.js.map +7 -0
  189. package/dist/charts/tableView/types.d.ts +69 -46
  190. package/dist/charts/tableView/types.d.ts.map +1 -1
  191. package/dist/charts/tableView/types.js +22 -87
  192. package/dist/charts/tableView/types.js.map +2 -2
  193. package/dist/charts/tableView.d.ts +10 -5
  194. package/dist/charts/tableView.d.ts.map +1 -1
  195. package/dist/charts/tableView.js +12 -8
  196. package/dist/charts/tableView.js.map +2 -2
  197. package/dist/charts/treemap.d.ts.map +1 -1
  198. package/dist/charts/treemap.js +177 -68
  199. package/dist/charts/treemap.js.map +3 -3
  200. package/dist/charts/trendline.d.ts +13 -5
  201. package/dist/charts/trendline.d.ts.map +1 -1
  202. package/dist/charts/trendline.js +205 -56
  203. package/dist/charts/trendline.js.map +2 -2
  204. package/dist/charts/waterfall.d.ts.map +1 -1
  205. package/dist/charts/waterfall.js +76 -5
  206. package/dist/charts/waterfall.js.map +2 -2
  207. package/dist/index.d.ts +1 -1
  208. package/dist/index.js +1 -1
  209. package/dist/index.js.map +1 -1
  210. package/dist/interaction/cartesian.d.ts +4 -1
  211. package/dist/interaction/cartesian.d.ts.map +1 -1
  212. package/dist/interaction/cartesian.js +104 -34
  213. package/dist/interaction/cartesian.js.map +2 -2
  214. package/dist/interaction/controller.d.ts +29 -1
  215. package/dist/interaction/controller.d.ts.map +1 -1
  216. package/dist/interaction/controller.js +131 -8
  217. package/dist/interaction/controller.js.map +2 -2
  218. package/dist/interaction/focus.d.ts +23 -0
  219. package/dist/interaction/focus.d.ts.map +1 -0
  220. package/dist/interaction/focus.js +65 -0
  221. package/dist/interaction/focus.js.map +7 -0
  222. package/dist/interaction/tooltip.d.ts +6 -0
  223. package/dist/interaction/tooltip.d.ts.map +1 -1
  224. package/dist/interaction/tooltip.js +41 -16
  225. package/dist/interaction/tooltip.js.map +2 -2
  226. package/dist/interaction/types.d.ts +19 -0
  227. package/dist/interaction/types.d.ts.map +1 -1
  228. package/dist/interaction/veil.d.ts +25 -0
  229. package/dist/interaction/veil.d.ts.map +1 -0
  230. package/dist/interaction/veil.js +35 -0
  231. package/dist/interaction/veil.js.map +7 -0
  232. package/dist/pivot/pivot.d.ts +18 -0
  233. package/dist/pivot/pivot.d.ts.map +1 -1
  234. package/dist/pivot/pivot.js +46 -34
  235. package/dist/pivot/pivot.js.map +2 -2
  236. package/dist/render/chromeMotion.d.ts +65 -0
  237. package/dist/render/chromeMotion.d.ts.map +1 -0
  238. package/dist/render/chromeMotion.js +79 -0
  239. package/dist/render/chromeMotion.js.map +7 -0
  240. package/dist/render/pathSample.d.ts +24 -0
  241. package/dist/render/pathSample.d.ts.map +1 -0
  242. package/dist/render/pathSample.js +76 -0
  243. package/dist/render/pathSample.js.map +7 -0
  244. package/dist/render/transient.d.ts +18 -0
  245. package/dist/render/transient.d.ts.map +1 -0
  246. package/dist/render/transient.js +19 -0
  247. package/dist/render/transient.js.map +7 -0
  248. package/dist/runtime/candlestick.d.ts +112 -0
  249. package/dist/runtime/candlestick.d.ts.map +1 -0
  250. package/dist/runtime/candlestick.js +531 -0
  251. package/dist/runtime/candlestick.js.map +7 -0
  252. package/dist/runtime/cartesian.d.ts +14 -3
  253. package/dist/runtime/cartesian.d.ts.map +1 -1
  254. package/dist/runtime/cartesian.js.map +2 -2
  255. package/dist/runtime/chartAnimation.d.ts +54 -7
  256. package/dist/runtime/chartAnimation.d.ts.map +1 -1
  257. package/dist/runtime/chartAnimation.js +146 -28
  258. package/dist/runtime/chartAnimation.js.map +2 -2
  259. package/dist/runtime/chartRuntime.d.ts +42 -0
  260. package/dist/runtime/chartRuntime.d.ts.map +1 -1
  261. package/dist/runtime/chartRuntime.js +196 -30
  262. package/dist/runtime/chartRuntime.js.map +2 -2
  263. package/dist/runtime/dashboardDom.d.ts.map +1 -1
  264. package/dist/runtime/dashboardDom.js +45 -0
  265. package/dist/runtime/dashboardDom.js.map +2 -2
  266. package/dist/runtime/facet.d.ts +1 -1
  267. package/dist/runtime/facet.d.ts.map +1 -1
  268. package/dist/runtime/gantt.d.ts +137 -0
  269. package/dist/runtime/gantt.d.ts.map +1 -0
  270. package/dist/runtime/gantt.js +647 -0
  271. package/dist/runtime/gantt.js.map +7 -0
  272. package/dist/runtime/morph.d.ts +33 -0
  273. package/dist/runtime/morph.d.ts.map +1 -0
  274. package/dist/runtime/morph.js +332 -0
  275. package/dist/runtime/morph.js.map +7 -0
  276. package/dist/runtime/radar.d.ts +75 -0
  277. package/dist/runtime/radar.d.ts.map +1 -0
  278. package/dist/runtime/radar.js +201 -0
  279. package/dist/runtime/radar.js.map +7 -0
  280. package/dist/runtime/radialBar.d.ts +81 -0
  281. package/dist/runtime/radialBar.d.ts.map +1 -0
  282. package/dist/runtime/radialBar.js +125 -0
  283. package/dist/runtime/radialBar.js.map +7 -0
  284. package/dist/runtime/report/constants.d.ts +2 -2
  285. package/dist/runtime/report/constants.d.ts.map +1 -1
  286. package/dist/runtime/runtimeShared.d.ts +3 -3
  287. package/dist/runtime/runtimeShared.d.ts.map +1 -1
  288. package/dist/runtime/sunburst.d.ts +74 -0
  289. package/dist/runtime/sunburst.d.ts.map +1 -0
  290. package/dist/runtime/sunburst.js +150 -0
  291. package/dist/runtime/sunburst.js.map +7 -0
  292. package/dist/runtime/wire.d.ts.map +1 -1
  293. package/dist/runtime/wire.js +3 -1
  294. package/dist/runtime/wire.js.map +2 -2
  295. package/dist/shape/arc.d.ts +15 -2
  296. package/dist/shape/arc.d.ts.map +1 -1
  297. package/dist/shape/arc.js +204 -32
  298. package/dist/shape/arc.js.map +2 -2
  299. package/dist/spec/chartDefinitions.d.ts +6 -0
  300. package/dist/spec/chartDefinitions.d.ts.map +1 -1
  301. package/dist/spec/chartDefinitions.js +7 -1
  302. package/dist/spec/chartDefinitions.js.map +2 -2
  303. package/dist/spec/templates.d.ts.map +1 -1
  304. package/dist/spec/templates.js +177 -2
  305. package/dist/spec/templates.js.map +2 -2
  306. package/dist/spec/types.d.ts +258 -6
  307. package/dist/spec/types.d.ts.map +1 -1
  308. package/dist/spec/types.js +6 -0
  309. package/dist/spec/types.js.map +2 -2
  310. package/dist/spec/validate/charts.js +147 -15
  311. package/dist/spec/validate/charts.js.map +2 -2
  312. package/dist/spec/validate/common.d.ts +6 -0
  313. package/dist/spec/validate/common.d.ts.map +1 -1
  314. package/dist/spec/validate/overlays.js +2 -2
  315. package/dist/spec/validate/overlays.js.map +2 -2
  316. package/dist/spec/validate.data.d.ts.map +1 -1
  317. package/dist/spec/validate.data.js +8 -3
  318. package/dist/spec/validate.data.js.map +2 -2
  319. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/runtime/dashboardDom.ts"],
4
- "sourcesContent": ["import type { DashboardSpec, DashboardView } from '../spec/dashboard';\nimport type { SelectionValue } from '../spec/selection';\nimport { resolveTheme, type ThemeTokens } from '../theme';\nimport { createSelectionStore, type SelectionStore } from '../interaction/store';\nimport { render, type ChartInstance, type SelectionChangeListener } from './render';\nimport { createInspector, type Inspector } from './inspect';\nimport { validateSpec } from '../spec/validate';\nimport { wireViews, isSlicerType } from './wire';\nimport { DEFAULT_BREAKPOINTS, partitionDashboardViews } from './dashboardLayout';\nimport { aggregateDashboardReports, type DashboardRenderReport, type RenderDiagnostic, type RenderReport } from './report';\nimport { LabelLedger, recordDomLabels, type LabelRole } from '../render/labelLedger';\nimport {\n DASHBOARD_CELL_CLASS,\n DASHBOARD_CLASS,\n dashboardStyles,\n inheritInto,\n stripCellHeight,\n} from './dashboardChrome';\nimport {\n placeViews,\n resolveDashboardLayout,\n resolveDashboardSections,\n type DashboardCell,\n type ResolvedLayout,\n type WiredView,\n} from './dashboardPlacement';\nimport { coalescedStore, SourceCellRegistry, type CoalescedSelectionStore } from './dashboardSelection';\nimport type { DashboardInstance, RenderDashboardOptions } from './dashboard';\n\n/** DOM label/chrome element recorded for dashboard-level reporting. */\ninterface ChromeRecord { el: HTMLElement; role: LabelRole; path: string; background: string }\n/** Mounted child chart instance plus its dashboard identity. */\ninterface MountedView { instance: ChartInstance; id: string; index: number; host: HTMLElement }\n/** Child mount deferred until its host is attached and has a final size. */\ninterface DeferredMount { el: HTMLElement; view: WiredView; mounted: boolean }\n/** Per-build resolved theme/layout state shared by DOM construction steps. */\ninterface BuildState {\n tokens: ThemeTokens;\n layout: ResolvedLayout;\n baseCols: number;\n breakpoints: { maxWidth: number; cols: number }[];\n pagePadding: number;\n}\n\n/** Resolve a dashboard target element from either a DOM node or selector. */\nexport function resolveDashboardContainer(target: HTMLElement | string): HTMLElement {\n if (typeof target === 'string') {\n const el = document.querySelector(target);\n if (!el) throw new Error(`Graphein: no element matches selector \"${target}\"`);\n return el as HTMLElement;\n }\n return target;\n}\n\n/** Create a browser dashboard instance bound to an already-resolved container. */\nexport function createDashboardInstance(\n container: HTMLElement,\n spec: DashboardSpec,\n options?: RenderDashboardOptions,\n): DashboardInstance {\n const runtime = new DashboardRuntime(container, spec, options);\n return runtime.start();\n}\n\nclass DashboardRuntime {\n private currentSpec: DashboardSpec;\n private readonly store: SelectionStore;\n private readonly childStore: CoalescedSelectionStore;\n private readonly instances: ChartInstance[] = [];\n private readonly mounted: MountedView[] = [];\n private readonly mountErrors: Array<{ host: HTMLElement; diagnostic: RenderDiagnostic }> = [];\n private readonly layoutDiagnostics: RenderDiagnostic[] = [];\n private readonly chrome: ChromeRecord[] = [];\n private readonly hostListeners = new Set<SelectionChangeListener>();\n private readonly sourceCells = new SourceCellRegistry();\n private root: HTMLElement | undefined;\n private resizeObs: ResizeObserver | undefined;\n // Publishes the dashboard config to the DOM and rebuilds on external edits.\n // Recreated each build() (the root is rebuilt); disconnected in teardown().\n private dashboardInspector: Inspector | undefined;\n private destroyed = false;\n private unsubscribe: (() => void) | undefined;\n\n constructor(\n private readonly container: HTMLElement,\n spec: DashboardSpec,\n private readonly options?: RenderDashboardOptions,\n ) {\n this.currentSpec = spec;\n this.store = options?.store ?? createSelectionStore();\n this.childStore = coalescedStore(this.store);\n }\n\n start(): DashboardInstance {\n this.unsubscribe = this.store.subscribe((name, value) => {\n this.sourceCells.sync(name, value);\n for (const listener of [...this.hostListeners]) listener(name, value);\n });\n this.build();\n return this.instance();\n }\n\n private instance(): DashboardInstance {\n const runtimeSpec = () => this.currentSpec;\n return {\n get spec() { return runtimeSpec(); },\n store: this.store,\n views: this.instances,\n report: () => this.report(),\n getSelection: (name?: string) => name === undefined ? this.store.all() : this.store.get(name),\n setSelection: (name: string, value: SelectionValue | null): void => {\n this.store.set(name, value); this.childStore.flush();\n },\n clearSelection: (name?: string): void => {\n this.store.clear(name); this.childStore.flush();\n },\n on: (_event: 'selectionchange', listener: SelectionChangeListener): (() => void) => {\n this.hostListeners.add(listener); return () => this.hostListeners.delete(listener);\n },\n off: (_event: 'selectionchange', listener: SelectionChangeListener): void => {\n this.hostListeners.delete(listener);\n },\n update: (next: DashboardSpec): void => {\n if (this.destroyed) return;\n this.teardown(); this.currentSpec = next; this.build();\n },\n resize: (): void => {\n for (const inst of this.instances) inst.resize();\n },\n destroy: (): void => this.destroy(),\n };\n }\n\n private build(): void {\n const state = this.createBuildState();\n // Seed dashboard-level initial param values (without clobbering live ones).\n this.seedParams();\n this.sourceCells.clear();\n this.root = this.createRoot(state);\n this.appendHeader(state);\n const wired = wireViews(this.currentSpec.views as DashboardView[], this.currentSpec.interactions ?? 'auto') as WiredView[];\n // ---- Partition: top-strip navigators vs grid views ---------------------\n const { stripViews, gridViews } = partitionDashboardViews(wired, { ...state.layout, navigators: state.layout.navigators ?? 'top' });\n const deferred: DeferredMount[] = [];\n const groups = this.appendContent(stripViews, gridViews, state, deferred);\n this.attachAndLayout(state, groups, deferred);\n this.installInspector();\n }\n\n private createBuildState(): BuildState {\n const tokens = resolveTheme(this.currentSpec.theme);\n const layout = resolveDashboardLayout(this.currentSpec.layout);\n return {\n tokens,\n layout,\n baseCols: Math.max(1, layout.cols),\n breakpoints: (layout.breakpoints ?? DEFAULT_BREAKPOINTS).slice().sort((a, b) => a.maxWidth - b.maxWidth),\n pagePadding: layout.padding ?? Math.round(layout.gap * 1.4),\n };\n }\n\n private createRoot({ tokens, layout, pagePadding }: BuildState): HTMLElement {\n const root = document.createElement('div');\n root.className = DASHBOARD_CLASS;\n Object.assign(root.style, {\n boxSizing: 'border-box',\n width: this.currentSpec.dimensions?.width ? `${this.currentSpec.dimensions.width}px` : '100%',\n maxWidth: layout.maxWidth ? `${layout.maxWidth}px` : '',\n margin: layout.maxWidth ? '0 auto' : '',\n background: this.currentSpec.background ?? tokens.color.background,\n color: tokens.color.text,\n fontFamily: tokens.font.family,\n padding: `${pagePadding}px`,\n display: 'flex',\n flexDirection: 'column',\n gap: `${layout.gap}px`,\n } as Partial<CSSStyleDeclaration>);\n const style = document.createElement('style');\n style.setAttribute('data-graphein-dashboard-style', '');\n style.textContent = dashboardStyles(tokens);\n root.appendChild(style);\n return root;\n }\n\n private appendHeader({ tokens }: BuildState): void {\n const titleText = typeof this.currentSpec.title === 'string' ? this.currentSpec.title : this.currentSpec.title?.text;\n if (!this.root || (!titleText && !this.currentSpec.subtitle)) return;\n // ---- Header: accent rule + title + subtitle ----------------------------\n const header = document.createElement('div');\n Object.assign(header.style, { display: 'flex', alignItems: 'center', gap: `${tokens.spacing.md}px`, padding: `0 ${tokens.spacing.xs}px` });\n const accent = document.createElement('div');\n Object.assign(accent.style, {\n flex: '0 0 auto', width: '5px', alignSelf: 'stretch', minHeight: '34px',\n borderRadius: '3px', background: tokens.color.accent,\n } as Partial<CSSStyleDeclaration>);\n const titles = document.createElement('div');\n Object.assign(titles.style, { display: 'flex', flexDirection: 'column', gap: '3px' } as Partial<CSSStyleDeclaration>);\n if (titleText) titles.appendChild(this.chromeText(titleText, 'title', tokens, '/title'));\n if (this.currentSpec.subtitle) titles.appendChild(this.chromeText(this.currentSpec.subtitle, 'subtitle', tokens, '/subtitle'));\n header.appendChild(accent);\n header.appendChild(titles);\n this.root.appendChild(header);\n }\n\n private chromeText(text: string, role: LabelRole, tokens: ThemeTokens, path: string): HTMLElement {\n const el = document.createElement('div');\n el.textContent = text;\n const isTitle = role === 'title';\n Object.assign(el.style, {\n font: `${isTitle ? tokens.font.weight.bold : tokens.font.weight.normal} ${isTitle ? tokens.font.size.title : tokens.font.size.small}px ${tokens.font.family}`,\n color: isTitle ? tokens.color.text : tokens.color.textMuted,\n ...(isTitle ? { letterSpacing: '-0.01em', lineHeight: '1.15' } : {}),\n } as Partial<CSSStyleDeclaration>);\n this.chrome.push({ el, role, path, background: this.currentSpec.background ?? tokens.color.background });\n return el;\n }\n\n private appendContent(stripViews: WiredView[], gridViews: WiredView[], state: BuildState, deferred: DeferredMount[]) {\n const groups: { grid: HTMLElement; cells: DashboardCell[]; baseCols: number }[] = [];\n if (stripViews.length) this.appendNavigator(stripViews, state, deferred);\n for (const plan of resolveDashboardSections(gridViews, state.layout)) {\n const { parent } = this.appendSectionShell(plan, state, deferred);\n const grid = document.createElement('div');\n Object.assign(grid.style, { display: 'grid', gridAutoRows: `${plan.rowHeight}px`, gap: `${state.layout.gap}px` });\n parent.appendChild(grid);\n const cells = placeViews(plan.views, plan.cols, state.layout.preset ?? 'auto');\n for (const cellInfo of cells) this.appendGridCell(grid, cellInfo, state, deferred);\n groups.push({ grid, cells, baseCols: plan.cols });\n }\n return groups;\n }\n\n private appendNavigator(views: WiredView[], { layout }: BuildState, deferred: DeferredMount[]): void {\n // ---- Navigator strip ---------------------------------------------------\n const strip = document.createElement('div');\n Object.assign(strip.style, { display: 'flex', flexWrap: 'wrap', alignItems: 'flex-start', gap: `${layout.gap}px` });\n for (const view of views) {\n const { cell, host } = this.createCard(view);\n this.registerSourceCell(view, cell);\n Object.assign(cell.style, {\n flex: '1 1 220px', minWidth: '200px', height: `${stripCellHeight(view, layout.rowHeight)}px`,\n } as Partial<CSSStyleDeclaration>);\n strip.appendChild(cell);\n deferred.push({ el: host, view, mounted: false });\n }\n this.root!.appendChild(strip);\n }\n\n private appendGridCell(grid: HTMLElement, cellInfo: DashboardCell, state: BuildState, deferred: DeferredMount[]): void {\n if (cellInfo.placement) {\n const index = this.currentSpec.views.findIndex((v) => v.id === cellInfo.view.id);\n this.layoutDiagnostics.push({ ...cellInfo.placement, severity: 'warning', viewId: cellInfo.view.id, path: `/views/${index}` });\n }\n const { cell, host } = this.createCard(cellInfo.view);\n this.registerSourceCell(cellInfo.view, cell);\n grid.appendChild(cell);\n cellInfo.el = cell;\n deferred.push({ el: host, view: cellInfo.view, mounted: false });\n void state;\n }\n\n private appendSectionShell(plan: ReturnType<typeof resolveDashboardSections>[number], state: BuildState, deferred: DeferredMount[]) {\n // ---- Responsive tile grids / optional sections -------------------------\n let parent: HTMLElement = this.root!;\n if (!plan.explicit) return { parent };\n const section = document.createElement('section');\n section.className = 'graphein-dashboard-section';\n if (plan.section?.id) section.setAttribute('data-section-id', plan.section.id);\n Object.assign(section.style, { display: 'flex', flexDirection: 'column', gap: `${state.layout.gap}px` });\n const body = document.createElement('div');\n const header = this.createSectionHeader(plan, state, () => {\n this.applyAllLayouts();\n this.mountDeferred(deferred);\n for (const inst of this.instances) inst.resize();\n });\n section.appendChild(header.button);\n Object.assign(body.style, { display: plan.collapsed ? 'none' : 'block' });\n section.appendChild(body);\n this.root!.appendChild(section);\n parent = body;\n return { parent };\n }\n\n private createSectionHeader(plan: ReturnType<typeof resolveDashboardSections>[number], state: BuildState, onOpen: () => void) {\n const { tokens } = state;\n const button = document.createElement('button');\n button.type = 'button';\n Object.assign(button.style, {\n appearance: 'none', border: '0', borderBottom: `1px solid ${tokens.color.border}`,\n background: plan.section?.background ?? 'transparent', color: tokens.color.text,\n padding: `${tokens.spacing.sm}px ${tokens.spacing.xs}px`, display: 'flex',\n alignItems: 'center', justifyContent: 'space-between', gap: `${tokens.spacing.sm}px`,\n textAlign: 'left', cursor: 'pointer', borderRadius: `${tokens.radius.md}px ${tokens.radius.md}px 0 0`,\n fontFamily: tokens.font.family,\n } as Partial<CSSStyleDeclaration>);\n const titles = this.sectionTitles(plan, state);\n const marker = document.createElement('span');\n marker.textContent = plan.collapsed ? '+' : '\u2212';\n Object.assign(marker.style, { color: tokens.color.accent, fontWeight: String(tokens.font.weight.bold) });\n button.appendChild(titles);\n button.appendChild(marker);\n button.addEventListener('click', () => {\n const body = button.nextElementSibling as HTMLElement | null;\n if (!body) return;\n const nextCollapsed = body.style.display !== 'none';\n body.style.display = nextCollapsed ? 'none' : 'block';\n marker.textContent = nextCollapsed ? '+' : '\u2212';\n if (!nextCollapsed) onOpen();\n });\n return { button };\n }\n\n private sectionTitles(plan: ReturnType<typeof resolveDashboardSections>[number], { tokens, layout }: BuildState): HTMLElement {\n const titles = document.createElement('span');\n Object.assign(titles.style, { display: 'flex', flexDirection: 'column', gap: '2px' });\n const sectionIndex = layout.sections?.indexOf(plan.section!);\n const add = (text: string, role: LabelRole, path: string, upper = false): void => {\n const el = document.createElement('span');\n el.textContent = text;\n Object.assign(el.style, {\n color: tokens.color.textMuted, fontSize: `${tokens.font.size.small}px`,\n ...(upper ? { fontWeight: String(tokens.font.weight.medium), letterSpacing: '0.06em', textTransform: 'uppercase' } : {}),\n } as Partial<CSSStyleDeclaration>);\n titles.appendChild(el);\n this.chrome.push({ el, role, path, background: plan.section?.background ?? this.currentSpec.background ?? tokens.color.background });\n };\n if (plan.section?.title) add(plan.section.title, 'title', `/layout/sections/${sectionIndex}/title`, true);\n if (plan.section?.subtitle) add(plan.section.subtitle, 'subtitle', `/layout/sections/${sectionIndex}/subtitle`);\n if (!plan.section?.title && !plan.section?.subtitle) add('Section', 'title', `/layout/sections/${sectionIndex}/title`);\n return titles;\n }\n\n private createCard(view: WiredView): { cell: HTMLElement; host: HTMLElement } {\n const tokens = resolveTheme(this.currentSpec.theme);\n const cell = document.createElement('div');\n this.applyCellChrome(cell, view, tokens);\n cell.classList.add(DASHBOARD_CELL_CLASS);\n cell.setAttribute('data-view-id', view.id);\n const hasCardChrome = !!(view.title || view.subtitle || view.accent || view.background || view.frame === false || view.padding === 'none');\n if (!hasCardChrome) return { cell, host: cell };\n Object.assign(cell.style, { display: 'flex', flexDirection: 'column' });\n // Remember the intended display so the responsive pass in applyLayout can\n // restore it after toggling visibility (it must not clobber `flex`).\n cell.dataset.cardDisplay = 'flex';\n this.appendCardAccent(cell, view);\n this.appendCardHeader(cell, view, tokens);\n const host = document.createElement('div');\n const inset = view.padding === 'none' ? 0 : tokens.spacing.sm;\n Object.assign(host.style, {\n flex: '1 1 auto', minWidth: '0', minHeight: '0', padding: `${inset}px`, boxSizing: 'border-box',\n } as Partial<CSSStyleDeclaration>);\n cell.appendChild(host);\n return { cell, host };\n }\n\n private applyCellChrome(cell: HTMLElement, view: WiredView, tokens: ThemeTokens): void {\n const framed = view.frame ?? true;\n cell.dataset.framed = framed ? 'true' : 'false';\n Object.assign(cell.style, {\n minWidth: '0', minHeight: '0', overflow: 'hidden', position: 'relative', boxSizing: 'border-box',\n borderRadius: framed ? `${tokens.radius.lg}px` : '0',\n border: framed ? `1px solid ${tokens.color.border}` : '0',\n background: view.background ?? (framed ? tokens.color.surface : 'transparent'),\n } as Partial<CSSStyleDeclaration>);\n }\n\n private appendCardAccent(cell: HTMLElement, view: WiredView): void {\n if (!view.accent) return;\n const accent = document.createElement('div');\n Object.assign(accent.style, {\n position: 'absolute', left: '0', top: '0', bottom: '0', width: '5px', background: view.accent, pointerEvents: 'none',\n } as Partial<CSSStyleDeclaration>);\n cell.appendChild(accent);\n }\n\n private appendCardHeader(cell: HTMLElement, view: WiredView, tokens: ThemeTokens): void {\n if (!view.title && !view.subtitle) return;\n const header = document.createElement('div');\n Object.assign(header.style, {\n flex: '0 0 auto', padding: `${tokens.spacing.sm}px ${tokens.spacing.md}px ${tokens.spacing.xs}px ${tokens.spacing.md}px`,\n display: 'flex', flexDirection: 'column', gap: '2px', borderBottom: `1px solid ${tokens.color.border}`,\n } as Partial<CSSStyleDeclaration>);\n if (view.title) this.appendCardText(header, view, view.title, 'title', tokens);\n if (view.subtitle) this.appendCardText(header, view, view.subtitle, 'subtitle', tokens);\n cell.appendChild(header);\n }\n\n private appendCardText(header: HTMLElement, view: WiredView, value: string, role: LabelRole, tokens: ThemeTokens): void {\n const el = document.createElement('div');\n el.textContent = value;\n Object.assign(el.style, {\n font: `${role === 'title' ? tokens.font.weight.medium : tokens.font.weight.normal} ${role === 'title' ? tokens.font.size.base : tokens.font.size.small}px ${tokens.font.family}`,\n color: role === 'title' ? tokens.color.text : tokens.color.textMuted,\n ...(role === 'title' ? { letterSpacing: '-0.01em' } : {}),\n } as Partial<CSSStyleDeclaration>);\n header.appendChild(el);\n this.chrome.push({\n el, role, path: `/views/${this.currentSpec.views.findIndex((v) => v.id === view.id)}/${role}`,\n background: view.background ?? tokens.color.surface,\n });\n }\n\n private registerSourceCell(view: WiredView, cell: HTMLElement): void {\n for (const name of this.publishingParams(view)) this.sourceCells.add(name, cell, this.store.get(name));\n }\n\n private publishingParams(view: WiredView): string[] {\n const names = new Set<string>();\n for (const param of view.spec.params ?? []) if (param?.name) names.add(param.name);\n if (isSlicerType(view.spec.type)) {\n const slicer = view.spec as { field?: unknown; param?: unknown };\n const name = typeof slicer.param === 'string' ? slicer.param : typeof slicer.field === 'string' ? slicer.field : undefined;\n if (name) names.add(name);\n }\n return [...names];\n }\n\n private attachAndLayout(state: BuildState, groups: { grid: HTMLElement; cells: DashboardCell[]; baseCols: number }[], deferred: DeferredMount[]): void {\n // Attach, set every grid's columns/spans, THEN mount \u2014 so each cell already\n // has its final size and every view draws correctly on first paint (no\n // mount-at-wrong-size churn, no reliance on a later resize to correct it).\n this.container.appendChild(this.root!);\n this.applyLayout(this.measure(state.baseCols), state, groups);\n this.mountDeferred(deferred);\n if (typeof ResizeObserver !== 'undefined' && this.root) {\n this.resizeObs = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? this.measure(state.baseCols);\n this.applyLayout(Math.round(w), state, groups);\n this.mountDeferred(deferred);\n });\n this.resizeObs.observe(this.root);\n }\n }\n\n private applyAllLayouts(): void {\n for (const inst of this.instances) inst.resize();\n }\n\n private applyLayout(width: number, state: BuildState, groups: { grid: HTMLElement; cells: DashboardCell[]; baseCols: number }[]): void {\n // ---- Layout engine: reflow tile spans/columns by available width -------\n for (const group of groups) {\n const gridWidth = Math.round(group.grid.getBoundingClientRect().width || width);\n const effCols = this.effectiveCols(gridWidth, group.baseCols, state.breakpoints);\n group.grid.style.gridTemplateColumns = `repeat(${effCols}, minmax(0, 1fr))`;\n const placements = placeViews(group.cells.map((cell) => cell.view), group.baseCols, state.layout.preset, {\n columns: effCols, width: gridWidth,\n });\n const byView = new Map(placements.map((cell) => [cell.view.id, cell]));\n for (const c of group.cells) this.applyCellPlacement(c, byView.get(c.view.id)!);\n }\n }\n\n private applyCellPlacement(c: DashboardCell, placed: DashboardCell): void {\n c.el.style.display = placed.hidden ? 'none' : (c.el.dataset.cardDisplay ?? '');\n if (placed.hidden) return;\n c.el.style.gridColumn = `${placed.x} / span ${placed.w}`;\n c.el.style.gridRow = `${placed.y} / span ${placed.h}`;\n }\n\n private effectiveCols(width: number, cols: number, breakpoints: BuildState['breakpoints']): number {\n for (const bp of breakpoints) if (width <= bp.maxWidth) return Math.max(1, Math.min(bp.cols, cols));\n return cols;\n }\n\n private measure(baseCols: number): number {\n return Math.round(this.root?.getBoundingClientRect().width || this.container.clientWidth || baseCols * 80);\n }\n\n private mountDeferred(deferred: DeferredMount[]): void {\n // Views are mounted via `render()`, which measures the host to size its\n // canvas/overlay. A host that is still detached measures 0 and falls back to\n // a 640px default \u2014 and because ResizeObserver delivers no initial callback\n // for a detached element, the corrective post-attach resize is skipped, so\n // the view stays at 640px (overflowing/clipping its cell \u2014 most visibly a\n // slicer whose right handle is clipped). So we build the skeleton first and\n // defer every mount until after the root is in the document.\n for (const m of deferred) {\n if (!m.mounted && this.root?.contains(m.el) && this.isVisibleForInitialMount(m.el)) {\n this.mount(m.el, m.view);\n m.mounted = true;\n }\n }\n }\n\n private isVisibleForInitialMount(el: HTMLElement): boolean {\n for (let cur: HTMLElement | null = el; cur && cur !== this.root; cur = cur.parentElement) {\n if (cur.style.display === 'none') return false;\n }\n return true;\n }\n\n private mount(host: HTMLElement, view: WiredView): void {\n const tokens = resolveTheme(this.currentSpec.theme);\n const finalSpec = inheritInto(view.spec, this.currentSpec, tokens, !!(view.title || view.subtitle));\n const index = this.currentSpec.views.findIndex((v) => v.id === view.id);\n const optionsRef = this.options;\n try {\n const instance = render(host, finalSpec, {\n store: this.childStore, frame: view.frame ?? true, inspect: this.options?.inspect,\n get synchronous() { return optionsRef?.synchronous; },\n });\n this.instances.push(instance);\n this.mounted.push({ instance, id: view.id, index, host });\n } catch (err) {\n host.textContent = String(err);\n this.mountErrors.push({ host, diagnostic: {\n code: 'view-render-error', severity: 'error', viewId: view.id, path: `/views/${index}`,\n message: `View \"${view.id}\" failed to render: ${String(err)}`,\n details: { viewId: view.id, viewType: view.spec.type },\n } });\n }\n }\n\n private installInspector(): void {\n if (this.options?.inspect === false || !this.root) return;\n this.dashboardInspector = createInspector(this.root, { onExternalEdit: (config) => this.applyExternalEdit(config) });\n this.dashboardInspector.write(this.currentSpec);\n }\n\n private applyExternalEdit(config: Record<string, unknown>): void {\n // External DOM edit of the dashboard's data-graphein-spec: merge with in-memory\n // data, validate, then rebuild. Invalid edits are ignored (last good kept).\n if (this.destroyed) return;\n const merged = { ...config, data: this.currentSpec.data } as DashboardSpec;\n if (validateSpec(merged).errors.length > 0) return;\n this.teardown();\n this.currentSpec = merged;\n this.build();\n }\n\n private seedParams(): void {\n for (const param of this.currentSpec.params ?? []) {\n if (param.value !== undefined && this.store.get(param.name) == null) this.store.set(param.name, param.value ?? null);\n }\n }\n\n private visible(element: HTMLElement): boolean {\n for (let el: HTMLElement | null = element; el && el !== this.root; el = el.parentElement) {\n if (el.style.display === 'none' || el.style.visibility === 'hidden') return false;\n }\n return true;\n }\n\n private report(): DashboardRenderReport {\n const rect = this.root?.getBoundingClientRect();\n const size = {\n width: rect?.width || this.currentSpec.dimensions?.width || this.container.clientWidth || 640,\n height: rect?.height || this.currentSpec.dimensions?.height || this.container.clientHeight || 400,\n };\n const ledger = new LabelLedger();\n let measured = true;\n for (const item of this.chrome) {\n if (!this.visible(item.el)) continue;\n if (!recordDomLabels(ledger, item.el, { x: rect?.left ?? 0, y: rect?.top ?? 0 }, item.background, item.role, item.path)) measured = false;\n }\n const diagnostics = [...this.layoutDiagnostics, ...this.mountErrors.filter((e) => this.visible(e.host)).map((e) => e.diagnostic)];\n const reports = this.childReports(rect, diagnostics);\n return aggregateDashboardReports({ spec: this.currentSpec, size, views: reports, labels: ledger.records, chromeMeasured: measured, diagnostics });\n }\n\n private childReports(rect: DOMRect | undefined, diagnostics: RenderDiagnostic[]): NonNullable<RenderReport['views']> {\n const reports: NonNullable<RenderReport['views']> = [];\n for (const mountedView of this.mounted) {\n if (!this.visible(mountedView.host)) continue;\n let report = mountedView.instance.report();\n if (rect && rect.width > 0 && rect.height > 0) {\n report = this.withCardClipping(report, mountedView, diagnostics);\n }\n reports.push({ id: mountedView.id, index: mountedView.index, report });\n }\n return reports;\n }\n\n private withCardClipping(report: RenderReport, mountedView: MountedView, diagnostics: RenderDiagnostic[]): RenderReport {\n const viewport = mountedView.instance.surface.root.getBoundingClientRect();\n const card = mountedView.host.closest(`.${DASHBOARD_CELL_CLASS}`)?.getBoundingClientRect();\n const availableW = card ? Math.max(0, Math.min(viewport.right, card.right) - Math.max(viewport.left, card.left)) : viewport.width;\n const availableH = card ? Math.max(0, Math.min(viewport.bottom, card.bottom) - Math.max(viewport.top, card.top)) : viewport.height;\n const collapsed = availableW <= 1 || availableH <= 1;\n if (!collapsed && availableW + 1 >= report.size.width && availableH + 1 >= report.size.height) return report;\n diagnostics.push({\n code: collapsed ? 'empty-view' : 'view-clipped',\n severity: collapsed ? 'error' : 'warning',\n viewId: mountedView.id, path: `/views/${mountedView.index}`,\n message: `View \"${mountedView.id}\" has only ${roundPx(availableW)}\u00D7${roundPx(availableH)}px of visible card content for its ${report.size.width}\u00D7${report.size.height}px render.`,\n details: { viewId: mountedView.id, visibleWidth: availableW, visibleHeight: availableH },\n });\n if (!report.evidence) return report;\n const evidence = report.evidence;\n return { ...report, evidence: { ...evidence,\n marks: collapsed ? { ...evidence.marks, visible: 0,\n byKind: Object.fromEntries(Object.entries(evidence.marks.byKind).map(([kind, count]) => [kind, { ...count, visible: 0 }])) } : evidence.marks,\n coverage: { ...evidence.coverage, geometry: 'partial', marks: collapsed ? evidence.coverage.marks : 'partial' },\n } };\n }\n\n private teardown(): void {\n this.resizeObs?.disconnect();\n this.resizeObs = undefined;\n this.dashboardInspector?.destroy();\n this.dashboardInspector = undefined;\n for (const inst of this.instances) inst.destroy();\n this.instances.length = 0;\n this.mounted.length = 0;\n this.mountErrors.length = 0;\n this.layoutDiagnostics.length = 0;\n this.chrome.length = 0;\n if (this.root?.parentNode) this.root.parentNode.removeChild(this.root);\n this.root = undefined;\n this.sourceCells.clear();\n }\n\n private destroy(): void {\n this.destroyed = true;\n this.unsubscribe?.();\n this.childStore.destroy();\n this.hostListeners.clear();\n this.teardown();\n }\n}\n\nfunction roundPx(value: number): number {\n return Math.round(value * 100) / 100;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { DashboardSpec, DashboardView } from '../spec/dashboard';\nimport type { SelectionValue } from '../spec/selection';\nimport { resolveTheme, type ThemeTokens } from '../theme';\nimport { createSelectionStore, type SelectionStore } from '../interaction/store';\nimport { render, type ChartInstance, type SelectionChangeListener } from './render';\nimport { createInspector, type Inspector } from './inspect';\nimport { validateSpec } from '../spec/validate';\nimport { wireViews, isSlicerType } from './wire';\nimport { DEFAULT_BREAKPOINTS, partitionDashboardViews } from './dashboardLayout';\nimport { aggregateDashboardReports, type DashboardRenderReport, type RenderDiagnostic, type RenderReport } from './report';\nimport { LabelLedger, recordDomLabels, type LabelRole } from '../render/labelLedger';\nimport {\n DASHBOARD_CELL_CLASS,\n DASHBOARD_CLASS,\n dashboardStyles,\n inheritInto,\n stripCellHeight,\n} from './dashboardChrome';\nimport {\n placeViews,\n resolveDashboardLayout,\n resolveDashboardSections,\n type DashboardCell,\n type ResolvedLayout,\n type WiredView,\n} from './dashboardPlacement';\nimport { coalescedStore, SourceCellRegistry, type CoalescedSelectionStore } from './dashboardSelection';\nimport type { DashboardInstance, RenderDashboardOptions } from './dashboard';\n\n/** DOM label/chrome element recorded for dashboard-level reporting. */\ninterface ChromeRecord { el: HTMLElement; role: LabelRole; path: string; background: string }\n/** Mounted child chart instance plus its dashboard identity. */\ninterface MountedView { instance: ChartInstance; id: string; index: number; host: HTMLElement }\n/** Child mount deferred until its host is attached and has a final size. */\ninterface DeferredMount { el: HTMLElement; view: WiredView; mounted: boolean }\n\n/**\n * Everything about a dashboard that shapes its DOM \u2014 page chrome, layout,\n * params, and each view's card and wiring identity \u2014 but not its data or the\n * rest of each view's spec. Equal keys mean an update can re-render the mounted\n * views in place (so their marks morph) instead of rebuilding the page.\n */\nfunction dashboardStructureKey(spec: DashboardSpec): string {\n const { data: _data, views, ...page } = spec as DashboardSpec & { data?: unknown };\n return JSON.stringify({\n ...page,\n views: views.map(({ spec: view, ...card }) => {\n const slicer = view as { field?: unknown; param?: unknown };\n return { ...card, type: view.type, params: view.params, field: slicer.field, param: slicer.param };\n }),\n });\n}\n/** Per-build resolved theme/layout state shared by DOM construction steps. */\ninterface BuildState {\n tokens: ThemeTokens;\n layout: ResolvedLayout;\n baseCols: number;\n breakpoints: { maxWidth: number; cols: number }[];\n pagePadding: number;\n}\n\n/** Resolve a dashboard target element from either a DOM node or selector. */\nexport function resolveDashboardContainer(target: HTMLElement | string): HTMLElement {\n if (typeof target === 'string') {\n const el = document.querySelector(target);\n if (!el) throw new Error(`Graphein: no element matches selector \"${target}\"`);\n return el as HTMLElement;\n }\n return target;\n}\n\n/** Create a browser dashboard instance bound to an already-resolved container. */\nexport function createDashboardInstance(\n container: HTMLElement,\n spec: DashboardSpec,\n options?: RenderDashboardOptions,\n): DashboardInstance {\n const runtime = new DashboardRuntime(container, spec, options);\n return runtime.start();\n}\n\nclass DashboardRuntime {\n private currentSpec: DashboardSpec;\n private readonly store: SelectionStore;\n private readonly childStore: CoalescedSelectionStore;\n private readonly instances: ChartInstance[] = [];\n private readonly mounted: MountedView[] = [];\n private readonly mountErrors: Array<{ host: HTMLElement; diagnostic: RenderDiagnostic }> = [];\n private readonly layoutDiagnostics: RenderDiagnostic[] = [];\n private readonly chrome: ChromeRecord[] = [];\n private readonly hostListeners = new Set<SelectionChangeListener>();\n private readonly sourceCells = new SourceCellRegistry();\n // Mounts still waiting for their host to become visible (collapsed sections,\n // hidden breakpoints); in-place updates retarget them at the latest view spec.\n private deferred: DeferredMount[] = [];\n private root: HTMLElement | undefined;\n private resizeObs: ResizeObserver | undefined;\n // Publishes the dashboard config to the DOM and rebuilds on external edits.\n // Recreated each build() (the root is rebuilt); disconnected in teardown().\n private dashboardInspector: Inspector | undefined;\n private destroyed = false;\n private unsubscribe: (() => void) | undefined;\n\n constructor(\n private readonly container: HTMLElement,\n spec: DashboardSpec,\n private readonly options?: RenderDashboardOptions,\n ) {\n this.currentSpec = spec;\n this.store = options?.store ?? createSelectionStore();\n this.childStore = coalescedStore(this.store);\n }\n\n start(): DashboardInstance {\n this.unsubscribe = this.store.subscribe((name, value) => {\n this.sourceCells.sync(name, value);\n for (const listener of [...this.hostListeners]) listener(name, value);\n });\n this.build();\n return this.instance();\n }\n\n private instance(): DashboardInstance {\n const runtimeSpec = () => this.currentSpec;\n return {\n get spec() { return runtimeSpec(); },\n store: this.store,\n views: this.instances,\n report: () => this.report(),\n getSelection: (name?: string) => name === undefined ? this.store.all() : this.store.get(name),\n setSelection: (name: string, value: SelectionValue | null): void => {\n this.store.set(name, value); this.childStore.flush();\n },\n clearSelection: (name?: string): void => {\n this.store.clear(name); this.childStore.flush();\n },\n on: (_event: 'selectionchange', listener: SelectionChangeListener): (() => void) => {\n this.hostListeners.add(listener); return () => this.hostListeners.delete(listener);\n },\n off: (_event: 'selectionchange', listener: SelectionChangeListener): void => {\n this.hostListeners.delete(listener);\n },\n update: (next: DashboardSpec): void => {\n if (this.destroyed) return;\n if (this.updateInPlace(next)) return;\n this.teardown(); this.currentSpec = next; this.build();\n },\n resize: (): void => {\n for (const inst of this.instances) inst.resize();\n },\n destroy: (): void => this.destroy(),\n };\n }\n\n private build(): void {\n const state = this.createBuildState();\n // Seed dashboard-level initial param values (without clobbering live ones).\n this.seedParams();\n this.sourceCells.clear();\n this.root = this.createRoot(state);\n this.appendHeader(state);\n const wired = wireViews(this.currentSpec.views as DashboardView[], this.currentSpec.interactions ?? 'auto') as WiredView[];\n // ---- Partition: top-strip navigators vs grid views ---------------------\n const { stripViews, gridViews } = partitionDashboardViews(wired, { ...state.layout, navigators: state.layout.navigators ?? 'top' });\n const deferred: DeferredMount[] = [];\n this.deferred = deferred;\n const groups = this.appendContent(stripViews, gridViews, state, deferred);\n this.attachAndLayout(state, groups, deferred);\n this.installInspector();\n }\n\n /**\n * Apply `next` to the live page when only data or view specs changed: every\n * mounted view is updated in place, so its marks morph, its numbers roll, and\n * its values tween \u2014 instead of the whole page being rebuilt and every view\n * replaying its entrance. Every view gets its newly wired spec (rows may have\n * been edited in place, and a peer's change can rewire its filters); unchanged\n * frames morph invisibly. Returns false when the page must be rebuilt: its\n * structure changed, or a view failed to update (the rebuild reports it).\n */\n private updateInPlace(next: DashboardSpec): boolean {\n if (!this.root || this.mountErrors.length > 0) return false;\n if (dashboardStructureKey(next) !== dashboardStructureKey(this.currentSpec)) return false;\n this.currentSpec = next;\n const tokens = resolveTheme(next.theme);\n const wired = wireViews(next.views as DashboardView[], next.interactions ?? 'auto') as WiredView[];\n const byId = new Map(wired.map((view) => [view.id, view]));\n for (const pending of this.deferred) pending.view = byId.get(pending.view.id) ?? pending.view;\n try {\n for (const mountedView of this.mounted) {\n const view = byId.get(mountedView.id);\n if (view) mountedView.instance.update(inheritInto(view.spec, next, tokens, !!(view.title || view.subtitle)));\n }\n } catch {\n return false;\n }\n this.dashboardInspector?.write(next);\n return true;\n }\n\n private createBuildState(): BuildState {\n const tokens = resolveTheme(this.currentSpec.theme);\n const layout = resolveDashboardLayout(this.currentSpec.layout);\n return {\n tokens,\n layout,\n baseCols: Math.max(1, layout.cols),\n breakpoints: (layout.breakpoints ?? DEFAULT_BREAKPOINTS).slice().sort((a, b) => a.maxWidth - b.maxWidth),\n pagePadding: layout.padding ?? Math.round(layout.gap * 1.4),\n };\n }\n\n private createRoot({ tokens, layout, pagePadding }: BuildState): HTMLElement {\n const root = document.createElement('div');\n root.className = DASHBOARD_CLASS;\n Object.assign(root.style, {\n boxSizing: 'border-box',\n width: this.currentSpec.dimensions?.width ? `${this.currentSpec.dimensions.width}px` : '100%',\n maxWidth: layout.maxWidth ? `${layout.maxWidth}px` : '',\n margin: layout.maxWidth ? '0 auto' : '',\n background: this.currentSpec.background ?? tokens.color.background,\n color: tokens.color.text,\n fontFamily: tokens.font.family,\n padding: `${pagePadding}px`,\n display: 'flex',\n flexDirection: 'column',\n gap: `${layout.gap}px`,\n } as Partial<CSSStyleDeclaration>);\n const style = document.createElement('style');\n style.setAttribute('data-graphein-dashboard-style', '');\n style.textContent = dashboardStyles(tokens);\n root.appendChild(style);\n return root;\n }\n\n private appendHeader({ tokens }: BuildState): void {\n const titleText = typeof this.currentSpec.title === 'string' ? this.currentSpec.title : this.currentSpec.title?.text;\n if (!this.root || (!titleText && !this.currentSpec.subtitle)) return;\n // ---- Header: accent rule + title + subtitle ----------------------------\n const header = document.createElement('div');\n Object.assign(header.style, { display: 'flex', alignItems: 'center', gap: `${tokens.spacing.md}px`, padding: `0 ${tokens.spacing.xs}px` });\n const accent = document.createElement('div');\n Object.assign(accent.style, {\n flex: '0 0 auto', width: '5px', alignSelf: 'stretch', minHeight: '34px',\n borderRadius: '3px', background: tokens.color.accent,\n } as Partial<CSSStyleDeclaration>);\n const titles = document.createElement('div');\n Object.assign(titles.style, { display: 'flex', flexDirection: 'column', gap: '3px' } as Partial<CSSStyleDeclaration>);\n if (titleText) titles.appendChild(this.chromeText(titleText, 'title', tokens, '/title'));\n if (this.currentSpec.subtitle) titles.appendChild(this.chromeText(this.currentSpec.subtitle, 'subtitle', tokens, '/subtitle'));\n header.appendChild(accent);\n header.appendChild(titles);\n this.root.appendChild(header);\n }\n\n private chromeText(text: string, role: LabelRole, tokens: ThemeTokens, path: string): HTMLElement {\n const el = document.createElement('div');\n el.textContent = text;\n const isTitle = role === 'title';\n Object.assign(el.style, {\n font: `${isTitle ? tokens.font.weight.bold : tokens.font.weight.normal} ${isTitle ? tokens.font.size.title : tokens.font.size.small}px ${tokens.font.family}`,\n color: isTitle ? tokens.color.text : tokens.color.textMuted,\n ...(isTitle ? { letterSpacing: '-0.01em', lineHeight: '1.15' } : {}),\n } as Partial<CSSStyleDeclaration>);\n this.chrome.push({ el, role, path, background: this.currentSpec.background ?? tokens.color.background });\n return el;\n }\n\n private appendContent(stripViews: WiredView[], gridViews: WiredView[], state: BuildState, deferred: DeferredMount[]) {\n const groups: { grid: HTMLElement; cells: DashboardCell[]; baseCols: number }[] = [];\n if (stripViews.length) this.appendNavigator(stripViews, state, deferred);\n for (const plan of resolveDashboardSections(gridViews, state.layout)) {\n const { parent } = this.appendSectionShell(plan, state, deferred);\n const grid = document.createElement('div');\n Object.assign(grid.style, { display: 'grid', gridAutoRows: `${plan.rowHeight}px`, gap: `${state.layout.gap}px` });\n parent.appendChild(grid);\n const cells = placeViews(plan.views, plan.cols, state.layout.preset ?? 'auto');\n for (const cellInfo of cells) this.appendGridCell(grid, cellInfo, state, deferred);\n groups.push({ grid, cells, baseCols: plan.cols });\n }\n return groups;\n }\n\n private appendNavigator(views: WiredView[], { layout }: BuildState, deferred: DeferredMount[]): void {\n // ---- Navigator strip ---------------------------------------------------\n const strip = document.createElement('div');\n Object.assign(strip.style, { display: 'flex', flexWrap: 'wrap', alignItems: 'flex-start', gap: `${layout.gap}px` });\n for (const view of views) {\n const { cell, host } = this.createCard(view);\n this.registerSourceCell(view, cell);\n Object.assign(cell.style, {\n flex: '1 1 220px', minWidth: '200px', height: `${stripCellHeight(view, layout.rowHeight)}px`,\n } as Partial<CSSStyleDeclaration>);\n strip.appendChild(cell);\n deferred.push({ el: host, view, mounted: false });\n }\n this.root!.appendChild(strip);\n }\n\n private appendGridCell(grid: HTMLElement, cellInfo: DashboardCell, state: BuildState, deferred: DeferredMount[]): void {\n if (cellInfo.placement) {\n const index = this.currentSpec.views.findIndex((v) => v.id === cellInfo.view.id);\n this.layoutDiagnostics.push({ ...cellInfo.placement, severity: 'warning', viewId: cellInfo.view.id, path: `/views/${index}` });\n }\n const { cell, host } = this.createCard(cellInfo.view);\n this.registerSourceCell(cellInfo.view, cell);\n grid.appendChild(cell);\n cellInfo.el = cell;\n deferred.push({ el: host, view: cellInfo.view, mounted: false });\n void state;\n }\n\n private appendSectionShell(plan: ReturnType<typeof resolveDashboardSections>[number], state: BuildState, deferred: DeferredMount[]) {\n // ---- Responsive tile grids / optional sections -------------------------\n let parent: HTMLElement = this.root!;\n if (!plan.explicit) return { parent };\n const section = document.createElement('section');\n section.className = 'graphein-dashboard-section';\n if (plan.section?.id) section.setAttribute('data-section-id', plan.section.id);\n Object.assign(section.style, { display: 'flex', flexDirection: 'column', gap: `${state.layout.gap}px` });\n const body = document.createElement('div');\n const header = this.createSectionHeader(plan, state, () => {\n this.applyAllLayouts();\n this.mountDeferred(deferred);\n for (const inst of this.instances) inst.resize();\n });\n section.appendChild(header.button);\n Object.assign(body.style, { display: plan.collapsed ? 'none' : 'block' });\n section.appendChild(body);\n this.root!.appendChild(section);\n parent = body;\n return { parent };\n }\n\n private createSectionHeader(plan: ReturnType<typeof resolveDashboardSections>[number], state: BuildState, onOpen: () => void) {\n const { tokens } = state;\n const button = document.createElement('button');\n button.type = 'button';\n Object.assign(button.style, {\n appearance: 'none', border: '0', borderBottom: `1px solid ${tokens.color.border}`,\n background: plan.section?.background ?? 'transparent', color: tokens.color.text,\n padding: `${tokens.spacing.sm}px ${tokens.spacing.xs}px`, display: 'flex',\n alignItems: 'center', justifyContent: 'space-between', gap: `${tokens.spacing.sm}px`,\n textAlign: 'left', cursor: 'pointer', borderRadius: `${tokens.radius.md}px ${tokens.radius.md}px 0 0`,\n fontFamily: tokens.font.family,\n } as Partial<CSSStyleDeclaration>);\n const titles = this.sectionTitles(plan, state);\n const marker = document.createElement('span');\n marker.textContent = plan.collapsed ? '+' : '\u2212';\n Object.assign(marker.style, { color: tokens.color.accent, fontWeight: String(tokens.font.weight.bold) });\n button.appendChild(titles);\n button.appendChild(marker);\n button.addEventListener('click', () => {\n const body = button.nextElementSibling as HTMLElement | null;\n if (!body) return;\n const nextCollapsed = body.style.display !== 'none';\n body.style.display = nextCollapsed ? 'none' : 'block';\n marker.textContent = nextCollapsed ? '+' : '\u2212';\n if (!nextCollapsed) onOpen();\n });\n return { button };\n }\n\n private sectionTitles(plan: ReturnType<typeof resolveDashboardSections>[number], { tokens, layout }: BuildState): HTMLElement {\n const titles = document.createElement('span');\n Object.assign(titles.style, { display: 'flex', flexDirection: 'column', gap: '2px' });\n const sectionIndex = layout.sections?.indexOf(plan.section!);\n const add = (text: string, role: LabelRole, path: string, upper = false): void => {\n const el = document.createElement('span');\n el.textContent = text;\n Object.assign(el.style, {\n color: tokens.color.textMuted, fontSize: `${tokens.font.size.small}px`,\n ...(upper ? { fontWeight: String(tokens.font.weight.medium), letterSpacing: '0.06em', textTransform: 'uppercase' } : {}),\n } as Partial<CSSStyleDeclaration>);\n titles.appendChild(el);\n this.chrome.push({ el, role, path, background: plan.section?.background ?? this.currentSpec.background ?? tokens.color.background });\n };\n if (plan.section?.title) add(plan.section.title, 'title', `/layout/sections/${sectionIndex}/title`, true);\n if (plan.section?.subtitle) add(plan.section.subtitle, 'subtitle', `/layout/sections/${sectionIndex}/subtitle`);\n if (!plan.section?.title && !plan.section?.subtitle) add('Section', 'title', `/layout/sections/${sectionIndex}/title`);\n return titles;\n }\n\n private createCard(view: WiredView): { cell: HTMLElement; host: HTMLElement } {\n const tokens = resolveTheme(this.currentSpec.theme);\n const cell = document.createElement('div');\n this.applyCellChrome(cell, view, tokens);\n cell.classList.add(DASHBOARD_CELL_CLASS);\n cell.setAttribute('data-view-id', view.id);\n const hasCardChrome = !!(view.title || view.subtitle || view.accent || view.background || view.frame === false || view.padding === 'none');\n if (!hasCardChrome) return { cell, host: cell };\n Object.assign(cell.style, { display: 'flex', flexDirection: 'column' });\n // Remember the intended display so the responsive pass in applyLayout can\n // restore it after toggling visibility (it must not clobber `flex`).\n cell.dataset.cardDisplay = 'flex';\n this.appendCardAccent(cell, view);\n this.appendCardHeader(cell, view, tokens);\n const host = document.createElement('div');\n const inset = view.padding === 'none' ? 0 : tokens.spacing.sm;\n Object.assign(host.style, {\n flex: '1 1 auto', minWidth: '0', minHeight: '0', padding: `${inset}px`, boxSizing: 'border-box',\n } as Partial<CSSStyleDeclaration>);\n cell.appendChild(host);\n return { cell, host };\n }\n\n private applyCellChrome(cell: HTMLElement, view: WiredView, tokens: ThemeTokens): void {\n const framed = view.frame ?? true;\n cell.dataset.framed = framed ? 'true' : 'false';\n Object.assign(cell.style, {\n minWidth: '0', minHeight: '0', overflow: 'hidden', position: 'relative', boxSizing: 'border-box',\n borderRadius: framed ? `${tokens.radius.lg}px` : '0',\n border: framed ? `1px solid ${tokens.color.border}` : '0',\n background: view.background ?? (framed ? tokens.color.surface : 'transparent'),\n } as Partial<CSSStyleDeclaration>);\n }\n\n private appendCardAccent(cell: HTMLElement, view: WiredView): void {\n if (!view.accent) return;\n const accent = document.createElement('div');\n Object.assign(accent.style, {\n position: 'absolute', left: '0', top: '0', bottom: '0', width: '5px', background: view.accent, pointerEvents: 'none',\n } as Partial<CSSStyleDeclaration>);\n cell.appendChild(accent);\n }\n\n private appendCardHeader(cell: HTMLElement, view: WiredView, tokens: ThemeTokens): void {\n if (!view.title && !view.subtitle) return;\n const header = document.createElement('div');\n Object.assign(header.style, {\n flex: '0 0 auto', padding: `${tokens.spacing.sm}px ${tokens.spacing.md}px ${tokens.spacing.xs}px ${tokens.spacing.md}px`,\n display: 'flex', flexDirection: 'column', gap: '2px', borderBottom: `1px solid ${tokens.color.border}`,\n } as Partial<CSSStyleDeclaration>);\n if (view.title) this.appendCardText(header, view, view.title, 'title', tokens);\n if (view.subtitle) this.appendCardText(header, view, view.subtitle, 'subtitle', tokens);\n cell.appendChild(header);\n }\n\n private appendCardText(header: HTMLElement, view: WiredView, value: string, role: LabelRole, tokens: ThemeTokens): void {\n const el = document.createElement('div');\n el.textContent = value;\n Object.assign(el.style, {\n font: `${role === 'title' ? tokens.font.weight.medium : tokens.font.weight.normal} ${role === 'title' ? tokens.font.size.base : tokens.font.size.small}px ${tokens.font.family}`,\n color: role === 'title' ? tokens.color.text : tokens.color.textMuted,\n ...(role === 'title' ? { letterSpacing: '-0.01em' } : {}),\n } as Partial<CSSStyleDeclaration>);\n header.appendChild(el);\n this.chrome.push({\n el, role, path: `/views/${this.currentSpec.views.findIndex((v) => v.id === view.id)}/${role}`,\n background: view.background ?? tokens.color.surface,\n });\n }\n\n private registerSourceCell(view: WiredView, cell: HTMLElement): void {\n for (const name of this.publishingParams(view)) this.sourceCells.add(name, cell, this.store.get(name));\n }\n\n private publishingParams(view: WiredView): string[] {\n const names = new Set<string>();\n for (const param of view.spec.params ?? []) if (param?.name) names.add(param.name);\n if (isSlicerType(view.spec.type)) {\n const slicer = view.spec as { field?: unknown; param?: unknown };\n const name = typeof slicer.param === 'string' ? slicer.param : typeof slicer.field === 'string' ? slicer.field : undefined;\n if (name) names.add(name);\n }\n return [...names];\n }\n\n private attachAndLayout(state: BuildState, groups: { grid: HTMLElement; cells: DashboardCell[]; baseCols: number }[], deferred: DeferredMount[]): void {\n // Attach, set every grid's columns/spans, THEN mount \u2014 so each cell already\n // has its final size and every view draws correctly on first paint (no\n // mount-at-wrong-size churn, no reliance on a later resize to correct it).\n this.container.appendChild(this.root!);\n this.applyLayout(this.measure(state.baseCols), state, groups);\n this.mountDeferred(deferred);\n if (typeof ResizeObserver !== 'undefined' && this.root) {\n this.resizeObs = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? this.measure(state.baseCols);\n this.applyLayout(Math.round(w), state, groups);\n this.mountDeferred(deferred);\n });\n this.resizeObs.observe(this.root);\n }\n }\n\n private applyAllLayouts(): void {\n for (const inst of this.instances) inst.resize();\n }\n\n private applyLayout(width: number, state: BuildState, groups: { grid: HTMLElement; cells: DashboardCell[]; baseCols: number }[]): void {\n // ---- Layout engine: reflow tile spans/columns by available width -------\n for (const group of groups) {\n const gridWidth = Math.round(group.grid.getBoundingClientRect().width || width);\n const effCols = this.effectiveCols(gridWidth, group.baseCols, state.breakpoints);\n group.grid.style.gridTemplateColumns = `repeat(${effCols}, minmax(0, 1fr))`;\n const placements = placeViews(group.cells.map((cell) => cell.view), group.baseCols, state.layout.preset, {\n columns: effCols, width: gridWidth,\n });\n const byView = new Map(placements.map((cell) => [cell.view.id, cell]));\n for (const c of group.cells) this.applyCellPlacement(c, byView.get(c.view.id)!);\n }\n }\n\n private applyCellPlacement(c: DashboardCell, placed: DashboardCell): void {\n c.el.style.display = placed.hidden ? 'none' : (c.el.dataset.cardDisplay ?? '');\n if (placed.hidden) return;\n c.el.style.gridColumn = `${placed.x} / span ${placed.w}`;\n c.el.style.gridRow = `${placed.y} / span ${placed.h}`;\n }\n\n private effectiveCols(width: number, cols: number, breakpoints: BuildState['breakpoints']): number {\n for (const bp of breakpoints) if (width <= bp.maxWidth) return Math.max(1, Math.min(bp.cols, cols));\n return cols;\n }\n\n private measure(baseCols: number): number {\n return Math.round(this.root?.getBoundingClientRect().width || this.container.clientWidth || baseCols * 80);\n }\n\n private mountDeferred(deferred: DeferredMount[]): void {\n // Views are mounted via `render()`, which measures the host to size its\n // canvas/overlay. A host that is still detached measures 0 and falls back to\n // a 640px default \u2014 and because ResizeObserver delivers no initial callback\n // for a detached element, the corrective post-attach resize is skipped, so\n // the view stays at 640px (overflowing/clipping its cell \u2014 most visibly a\n // slicer whose right handle is clipped). So we build the skeleton first and\n // defer every mount until after the root is in the document.\n for (const m of deferred) {\n if (!m.mounted && this.root?.contains(m.el) && this.isVisibleForInitialMount(m.el)) {\n this.mount(m.el, m.view);\n m.mounted = true;\n }\n }\n }\n\n private isVisibleForInitialMount(el: HTMLElement): boolean {\n for (let cur: HTMLElement | null = el; cur && cur !== this.root; cur = cur.parentElement) {\n if (cur.style.display === 'none') return false;\n }\n return true;\n }\n\n private mount(host: HTMLElement, view: WiredView): void {\n const tokens = resolveTheme(this.currentSpec.theme);\n const finalSpec = inheritInto(view.spec, this.currentSpec, tokens, !!(view.title || view.subtitle));\n const index = this.currentSpec.views.findIndex((v) => v.id === view.id);\n const optionsRef = this.options;\n try {\n const instance = render(host, finalSpec, {\n store: this.childStore, frame: view.frame ?? true, inspect: this.options?.inspect,\n get synchronous() { return optionsRef?.synchronous; },\n });\n this.instances.push(instance);\n this.mounted.push({ instance, id: view.id, index, host });\n } catch (err) {\n host.textContent = String(err);\n this.mountErrors.push({ host, diagnostic: {\n code: 'view-render-error', severity: 'error', viewId: view.id, path: `/views/${index}`,\n message: `View \"${view.id}\" failed to render: ${String(err)}`,\n details: { viewId: view.id, viewType: view.spec.type },\n } });\n }\n }\n\n private installInspector(): void {\n if (this.options?.inspect === false || !this.root) return;\n this.dashboardInspector = createInspector(this.root, { onExternalEdit: (config) => this.applyExternalEdit(config) });\n this.dashboardInspector.write(this.currentSpec);\n }\n\n private applyExternalEdit(config: Record<string, unknown>): void {\n // External DOM edit of the dashboard's data-graphein-spec: merge with in-memory\n // data, validate, then rebuild. Invalid edits are ignored (last good kept).\n if (this.destroyed) return;\n const merged = { ...config, data: this.currentSpec.data } as DashboardSpec;\n if (validateSpec(merged).errors.length > 0) return;\n if (this.updateInPlace(merged)) return;\n this.teardown();\n this.currentSpec = merged;\n this.build();\n }\n\n private seedParams(): void {\n for (const param of this.currentSpec.params ?? []) {\n if (param.value !== undefined && this.store.get(param.name) == null) this.store.set(param.name, param.value ?? null);\n }\n }\n\n private visible(element: HTMLElement): boolean {\n for (let el: HTMLElement | null = element; el && el !== this.root; el = el.parentElement) {\n if (el.style.display === 'none' || el.style.visibility === 'hidden') return false;\n }\n return true;\n }\n\n private report(): DashboardRenderReport {\n const rect = this.root?.getBoundingClientRect();\n const size = {\n width: rect?.width || this.currentSpec.dimensions?.width || this.container.clientWidth || 640,\n height: rect?.height || this.currentSpec.dimensions?.height || this.container.clientHeight || 400,\n };\n const ledger = new LabelLedger();\n let measured = true;\n for (const item of this.chrome) {\n if (!this.visible(item.el)) continue;\n if (!recordDomLabels(ledger, item.el, { x: rect?.left ?? 0, y: rect?.top ?? 0 }, item.background, item.role, item.path)) measured = false;\n }\n const diagnostics = [...this.layoutDiagnostics, ...this.mountErrors.filter((e) => this.visible(e.host)).map((e) => e.diagnostic)];\n const reports = this.childReports(rect, diagnostics);\n return aggregateDashboardReports({ spec: this.currentSpec, size, views: reports, labels: ledger.records, chromeMeasured: measured, diagnostics });\n }\n\n private childReports(rect: DOMRect | undefined, diagnostics: RenderDiagnostic[]): NonNullable<RenderReport['views']> {\n const reports: NonNullable<RenderReport['views']> = [];\n for (const mountedView of this.mounted) {\n if (!this.visible(mountedView.host)) continue;\n let report = mountedView.instance.report();\n if (rect && rect.width > 0 && rect.height > 0) {\n report = this.withCardClipping(report, mountedView, diagnostics);\n }\n reports.push({ id: mountedView.id, index: mountedView.index, report });\n }\n return reports;\n }\n\n private withCardClipping(report: RenderReport, mountedView: MountedView, diagnostics: RenderDiagnostic[]): RenderReport {\n const viewport = mountedView.instance.surface.root.getBoundingClientRect();\n const card = mountedView.host.closest(`.${DASHBOARD_CELL_CLASS}`)?.getBoundingClientRect();\n const availableW = card ? Math.max(0, Math.min(viewport.right, card.right) - Math.max(viewport.left, card.left)) : viewport.width;\n const availableH = card ? Math.max(0, Math.min(viewport.bottom, card.bottom) - Math.max(viewport.top, card.top)) : viewport.height;\n const collapsed = availableW <= 1 || availableH <= 1;\n if (!collapsed && availableW + 1 >= report.size.width && availableH + 1 >= report.size.height) return report;\n diagnostics.push({\n code: collapsed ? 'empty-view' : 'view-clipped',\n severity: collapsed ? 'error' : 'warning',\n viewId: mountedView.id, path: `/views/${mountedView.index}`,\n message: `View \"${mountedView.id}\" has only ${roundPx(availableW)}\u00D7${roundPx(availableH)}px of visible card content for its ${report.size.width}\u00D7${report.size.height}px render.`,\n details: { viewId: mountedView.id, visibleWidth: availableW, visibleHeight: availableH },\n });\n if (!report.evidence) return report;\n const evidence = report.evidence;\n return { ...report, evidence: { ...evidence,\n marks: collapsed ? { ...evidence.marks, visible: 0,\n byKind: Object.fromEntries(Object.entries(evidence.marks.byKind).map(([kind, count]) => [kind, { ...count, visible: 0 }])) } : evidence.marks,\n coverage: { ...evidence.coverage, geometry: 'partial', marks: collapsed ? evidence.coverage.marks : 'partial' },\n } };\n }\n\n private teardown(): void {\n this.resizeObs?.disconnect();\n this.resizeObs = undefined;\n this.dashboardInspector?.destroy();\n this.dashboardInspector = undefined;\n for (const inst of this.instances) inst.destroy();\n this.instances.length = 0;\n this.mounted.length = 0;\n this.mountErrors.length = 0;\n this.layoutDiagnostics.length = 0;\n this.chrome.length = 0;\n this.deferred = [];\n if (this.root?.parentNode) this.root.parentNode.removeChild(this.root);\n this.root = undefined;\n this.sourceCells.clear();\n }\n\n private destroy(): void {\n this.destroyed = true;\n this.unsubscribe?.();\n this.childStore.destroy();\n this.hostListeners.clear();\n this.teardown();\n }\n}\n\nfunction roundPx(value: number): number {\n return Math.round(value * 100) / 100;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -24,7 +24,7 @@ import { type RenderReport } from './report.js';
24
24
  import { type RenderEvidence } from '../render/evidence.js';
25
25
  import { type LabelRecord, type SuppressedLabel } from '../render/labelLedger.js';
26
26
  /** Cartesian chart kinds that can be split into a facet grid. */
27
- export declare const FACETABLE_TYPES: ReadonlySet<"search" | "area" | "table" | "range" | "line" | "bar" | "scatter" | "combo" | "histogram" | "pie" | "heatmap" | "funnel" | "kpi" | "treemap" | "gauge" | "bullet" | "calendarHeatmap" | "waterfall" | "slope" | "dumbbell" | "matrix" | "box" | "sankey" | "choropleth" | "dropdown" | "list" | "dateRange">;
27
+ export declare const FACETABLE_TYPES: ReadonlySet<"search" | "area" | "table" | "range" | "line" | "bar" | "scatter" | "combo" | "histogram" | "pie" | "heatmap" | "funnel" | "kpi" | "treemap" | "gauge" | "bullet" | "calendarHeatmap" | "waterfall" | "slope" | "dumbbell" | "radar" | "gantt" | "sunburst" | "candlestick" | "bubbleMap" | "radialBar" | "matrix" | "box" | "sankey" | "choropleth" | "dropdown" | "list" | "dateRange">;
28
28
  /** One panel of a facet grid: its facet value plus the resolved model. */
29
29
  export interface FacetPanel {
30
30
  value: string;
@@ -1 +1 @@
1
- {"version":3,"file":"facet.d.ts","sourceRoot":"","sources":["../../src/runtime/facet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAS,IAAI,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,eAAe,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAEL,KAAK,KAAK,EAGV,KAAK,oBAAoB,EAE1B,MAAM,WAAW,CAAC;AACnB,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAU5F,iEAAiE;AACjE,eAAO,MAAM,eAAe,2TAAwD,CAAC;AAMrF,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;CAChC;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,UAAU,EAAE,KAAK,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAQlD;AA6LD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,IAAI,EACV,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAC9B,WAAW,GAAG,IAAI,CA2BpB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,GAClB,IAAI,CAgFN;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,IAAI,GACT,YAAY,CAmFd"}
1
+ {"version":3,"file":"facet.d.ts","sourceRoot":"","sources":["../../src/runtime/facet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAS,IAAI,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,eAAe,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAEL,KAAK,KAAK,EAGV,KAAK,oBAAoB,EAE1B,MAAM,WAAW,CAAC;AACnB,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAU5F,iEAAiE;AACjE,eAAO,MAAM,eAAe,wYAAwD,CAAC;AAMrF,0EAA0E;AAC1E,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;CAChC;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,UAAU,EAAE,KAAK,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAQlD;AA6LD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,IAAI,EACV,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAC9B,WAAW,GAAG,IAAI,CA2BpB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,GAClB,IAAI,CAgFN;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,IAAI,GACT,YAAY,CAmFd"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Gantt model builder.
3
+ *
4
+ * A `gantt` reads tidy rows of `{ task, start, end, group?, progress? }` and lays
5
+ * one bar per row along a shared time (or numeric) axis, in one lane per distinct
6
+ * task. Rows whose start/end are missing, invalid or reversed are skipped and
7
+ * counted — never reordered or invented — and a row whose end equals its start
8
+ * is a milestone. Like the waterfall / histogram builders it resolves a synthetic
9
+ * vertical `base` {@link CartesianModel}: x is the time axis and y the task lanes,
10
+ * so the shared chrome (`drawAxesUnderlay` / `drawOverlay`, annotations) renders
11
+ * time gridlines, tick labels, task names in the left gutter, titles and the
12
+ * group legend unchanged. `drawGantt` paints the lanes, bars and milestones.
13
+ */
14
+ import type { Datum, Rect } from '../types.js';
15
+ import type { ThemeTokens } from '../theme/index.js';
16
+ import type { GanttSpec } from '../spec/types.js';
17
+ import { type ContinuousScale } from '../scales/index.js';
18
+ import { type Frame } from '../layout/index.js';
19
+ import { type ResolvedSketch } from '../spec/sketch.js';
20
+ import type { BuildOptions, CartesianModel } from './cartesian.js';
21
+ /** Whether the shared axis measures dates (epoch ms) or abstract numeric units. */
22
+ export type GanttScaleKind = 'time' | 'linear';
23
+ export interface GanttGroup {
24
+ key: string;
25
+ label: string;
26
+ raw: unknown;
27
+ color: string;
28
+ }
29
+ /** One drawable row: a bar from `start` to `end`, or a milestone when they are equal. */
30
+ export interface GanttTask {
31
+ /** Lane identity (the canonical task key). */
32
+ key: string;
33
+ /** Raw task value, published by click selections. */
34
+ raw: unknown;
35
+ label: string;
36
+ /** Epoch milliseconds on a time axis, numeric units on a linear one. */
37
+ start: number;
38
+ end: number;
39
+ milestone: boolean;
40
+ groupKey?: string;
41
+ groupLabel?: string;
42
+ groupRaw?: unknown;
43
+ color: string;
44
+ /** Completed fraction, clamped to 0..1; absent when not encoded or unusable. */
45
+ progress?: number;
46
+ sourceIndex: number;
47
+ row: Datum;
48
+ /** Lane index after sorting (top to bottom). */
49
+ lane: number;
50
+ /** Bar rect, or the milestone diamond's bounding box, in pixels. */
51
+ rect: Rect;
52
+ }
53
+ export interface GanttLane {
54
+ key: string;
55
+ raw: unknown;
56
+ label: string;
57
+ index: number;
58
+ top: number;
59
+ height: number;
60
+ center: number;
61
+ tasks: GanttTask[];
62
+ }
63
+ export interface GanttModel {
64
+ spec: GanttSpec;
65
+ tokens: ThemeTokens;
66
+ frame: Frame;
67
+ plot: Rect;
68
+ kind: GanttScaleKind;
69
+ /** Drawable rows in data order. */
70
+ tasks: GanttTask[];
71
+ lanes: GanttLane[];
72
+ /** Groups present among drawable rows, in color-domain order. */
73
+ groups: GanttGroup[];
74
+ grouped: boolean;
75
+ /** Axis domain (the data extent, snapped out to nearby ticks). */
76
+ domain: [number, number];
77
+ /** The drawable rows' own extent (plus annotated instants). */
78
+ extent: [number, number];
79
+ xScale: ContinuousScale;
80
+ laneHeight: number;
81
+ barHeight: number;
82
+ milestoneRadius: number;
83
+ cornerRadius: number;
84
+ showLabels: boolean;
85
+ /** Task names are drawn in the left gutter (so bar labels show details instead). */
86
+ laneAxis: boolean;
87
+ /** Input rows that could not be drawn (missing / invalid / reversed bounds). */
88
+ skipped: number;
89
+ base: CartesianModel;
90
+ sketch: ResolvedSketch | null;
91
+ }
92
+ export interface GanttBuildOptions extends BuildOptions {
93
+ /** Unfiltered rows, so group colors stay stable while a cross-filter subsets the data. */
94
+ colorSource?: readonly Datum[];
95
+ }
96
+ /**
97
+ * A quantitative start/end (declared, or inferred from numeric values) selects a
98
+ * linear axis of abstract units; everything else is a time axis.
99
+ */
100
+ export declare function ganttScaleKind(spec: GanttSpec, data: readonly Datum[]): GanttScaleKind;
101
+ /** Parse a start/end/annotation value onto the axis (NaN when unusable). */
102
+ export declare function ganttValue(kind: GanttScaleKind, value: unknown): number;
103
+ /**
104
+ * Multi-scale time tick labels: years for yearly steps, month names with the
105
+ * year where it changes, day dates for daily/weekly steps, and clock times with
106
+ * the date at midnight for intraday steps.
107
+ */
108
+ export declare function ganttTimeTickLabels(values: readonly number[], format?: string): string[];
109
+ /** Font size of a mark's label: small type once lanes (milestones) or bars are roomy. */
110
+ export declare function ganttLabelSize(tokens: ThemeTokens, extent: number): number;
111
+ /** First index whose value is ≥ `value` in ascending `values`. */
112
+ export declare function lowerBound(values: readonly number[], value: number): number;
113
+ /**
114
+ * Build a {@link GanttModel} from a {@link GanttSpec}. Pure: depends only on the
115
+ * spec, theme tokens and target size (plus the optional unfiltered color source).
116
+ */
117
+ export declare function buildGanttModel(spec: GanttSpec, tokens: ThemeTokens, opts: GanttBuildOptions): GanttModel;
118
+ /** A task's length: `{ short: '18d', long: '18 days' }` on a time axis, units otherwise. */
119
+ export declare function ganttDuration(model: Pick<GanttModel, 'kind' | 'spec'>, task: Pick<GanttTask, 'start' | 'end'>): {
120
+ short: string;
121
+ long: string;
122
+ };
123
+ /** A full instant for tooltips (`Jan 2, 2024`, or a formatted number on a linear axis). */
124
+ export declare function ganttInstant(model: Pick<GanttModel, 'kind' | 'spec'>, value: number, which: 'start' | 'end'): string;
125
+ /**
126
+ * A compact instant for milestone labels: `Mar 20` (with the year only when a
127
+ * long plan crosses one), plus the clock time when it is not midnight — or just
128
+ * the time within a plan of a day or two.
129
+ */
130
+ export declare function ganttShortInstant(model: Pick<GanttModel, 'kind' | 'spec' | 'extent'>, value: number): string;
131
+ /**
132
+ * The text a mark carries. Beside a task axis the gutter already names the lane,
133
+ * so a bar shows its completed share (or its duration) and a milestone its date;
134
+ * without one, every lane is named on its bars.
135
+ */
136
+ export declare function ganttLabelText(model: Pick<GanttModel, 'laneAxis' | 'kind' | 'spec' | 'extent'>, task: Pick<GanttTask, 'label' | 'milestone' | 'start' | 'end' | 'progress'>): string;
137
+ //# sourceMappingURL=gantt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt.d.ts","sourceRoot":"","sources":["../../src/runtime/gantt.ts"],"names":[],"mappings":"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"}