@aintela/bi 0.2.1 → 0.2.3

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 (50) hide show
  1. package/README.md +32 -1
  2. package/dist/ChartCardDefaultsContext-BDRsVljO.js +34 -0
  3. package/dist/ChartCardDefaultsContext-BDRsVljO.js.map +1 -0
  4. package/dist/{GridLayout-BgPzzPiP.js → GridLayout-1gWuIKeZ.js} +3 -4
  5. package/dist/GridLayout-1gWuIKeZ.js.map +1 -0
  6. package/dist/{ScriptDashboardViewerVertical-DKaHcL1o.js → ScriptDashboardViewerVertical-Rr_4adpH.js} +4 -4
  7. package/dist/{ScriptDashboardViewerVertical-DKaHcL1o.js.map → ScriptDashboardViewerVertical-Rr_4adpH.js.map} +1 -1
  8. package/dist/{biModuleSurface-dtnpBMtT.js → biModuleSurface-BdJK7sSL.js} +6 -6
  9. package/dist/{biModuleSurface-dtnpBMtT.js.map → biModuleSurface-BdJK7sSL.js.map} +1 -1
  10. package/dist/cards.js +1 -1
  11. package/dist/composer/index.d.ts +3 -1
  12. package/dist/composer/view/ComposerView.d.ts +20 -1
  13. package/dist/composer/view/SessionVisualizationsPanel.d.ts +19 -0
  14. package/dist/composer.js +73 -71
  15. package/dist/data/ChartCardDefaultsContext.d.ts +9 -0
  16. package/dist/data.js +1 -1
  17. package/dist/grid.js +16 -17
  18. package/dist/grid.js.map +1 -1
  19. package/dist/{index-DeiweWw8.js → index-9LcZjCK0.js} +54 -50
  20. package/dist/index-9LcZjCK0.js.map +1 -0
  21. package/dist/{index-Dz2ulBiy.js → index-BzUugG0A.js} +4 -5
  22. package/dist/{index-Dz2ulBiy.js.map → index-BzUugG0A.js.map} +1 -1
  23. package/dist/index-C4_VSDeU.js +3856 -0
  24. package/dist/index-C4_VSDeU.js.map +1 -0
  25. package/dist/{index-CPHaT2or.js → index-DChE_l-p.js} +2 -2
  26. package/dist/index-DChE_l-p.js.map +1 -0
  27. package/dist/{index-DOpx0R4Y.js → index-Dy6hwDjs.js} +2 -2
  28. package/dist/index-Dy6hwDjs.js.map +1 -0
  29. package/dist/index.js +228 -223
  30. package/dist/index.js.map +1 -1
  31. package/dist/runtime/index.d.ts +2 -0
  32. package/dist/runtime/sessionVisualizations.d.ts +61 -0
  33. package/dist/runtime/version.d.ts +1 -1
  34. package/dist/runtime.js +16 -11
  35. package/dist/runtime.js.map +1 -1
  36. package/dist/style.css +1 -1
  37. package/dist/version-BTc4ElDG.js +122 -0
  38. package/dist/version-BTc4ElDG.js.map +1 -0
  39. package/dist/viewer.js +1 -1
  40. package/package.json +1 -1
  41. package/dist/ChartCardDefaultsContext-Cl5T25H0.js +0 -32
  42. package/dist/ChartCardDefaultsContext-Cl5T25H0.js.map +0 -1
  43. package/dist/GridLayout-BgPzzPiP.js.map +0 -1
  44. package/dist/index-7p-ogAPK.js +0 -3631
  45. package/dist/index-7p-ogAPK.js.map +0 -1
  46. package/dist/index-CPHaT2or.js.map +0 -1
  47. package/dist/index-DOpx0R4Y.js.map +0 -1
  48. package/dist/index-DeiweWw8.js.map +0 -1
  49. package/dist/version-BgIpi4UM.js +0 -84
  50. package/dist/version-BgIpi4UM.js.map +0 -1
package/README.md CHANGED
@@ -218,7 +218,7 @@ the "Abrir" picker body on `DashboardPad` (`renderDashboardPicker`); Markdown fo
218
218
 
219
219
  | export | what it is | key props |
220
220
  |---|---|---|
221
- | `ComposerView` | splash → execution layout, drafts, guided tour | `chatPane` (required), `sessionId`, `routeSessionId`, `renderProgressPanel`, `progressStrip`, `onBeforeSend`, `resolveGuideElement`, `suggestions`, `templates`, `recentSessions`, `onSelectSession`, `onSearchAllSessions`, `onDashboardNameChange`, `datasetControls`, `renderDescription`, `sidePanelWidth` |
221
+ | `ComposerView` | splash → execution layout, drafts, guided tour | `chatPane` (required), `sessionId`, `routeSessionId`, `renderProgressPanel`, `progressStrip`, `onBeforeSend`, `resolveGuideElement`, `suggestions`, `templates`, `recentSessions`, `onSelectSession`, `onSearchAllSessions`, `onDashboardNameChange`, `datasetControls`, `renderDescription`, `sidePanelWidth`, `sidePanel` |
222
222
  | `DashboardPad` | the V1 pad: toolbar (Sketch/Dashboard, ToolBox, Novo/Salvar/Atualizar/Abrir/Compose) + sketch or viewer | `sessionId`, `dashboardId`, `turnOpen`, `onCompose`, `onChange`, `onBack`, `renderDashboardPicker`, `showDebug`, `headerExtra`, `renderDescription` |
223
223
  | `DashboardPadSketch` | the grid of `CardSketch` cells + filter chips (ref: `DashboardPadHandle` = `addGenericCell` / `addTypedCell` / `handleAddFilter`) | `hideInternalHeader`, `hideFiltersInSketch`, `zoomLevel`, `onAddCard`, `headerExtra`, `renderDescription` |
224
224
  | `CardSketch` (alias `CardScketch`), `FilterSketch`, `TitleSketch` (aliases `TextSketh`, `TitleSkath`), `ToolBox`, `HoverButton`, `ClonedComponent` | the pad's pieces | |
@@ -226,12 +226,43 @@ the "Abrir" picker body on `DashboardPad` (`renderDashboardPicker`); Markdown fo
226
226
  | `DatasetParameterizationControls` | admin block: "DataSet Dinâmico" toggle + default dataset + agent picker | `orientation`, `datasets`, `defaultTemplateDataset`, `agents`, `agentId`, `recommendedAgentId`, `onAgentChange` |
227
227
  | `DrawablePrompt` | `PromptV2` with the sketch in its `topSlot` (rail + pad, the sketch chips, the queued-changes chip) | `onCreateSketch`, `onBeforeSend`, `sketchExpanded`, `onSketchExpandedChange`, `seedDraft`, `compact`, `zoomLevel`, `datasetControls` |
228
228
  | `EntryEmptyState`, `SpotlightOverlay`, `DashboardSidePanel`, `DashboardPin` | the splash, the tour, the two dashboard surfaces | `suggestions`/`templates`/`onSearchAllSessions`; `steps`/`resolveElement`; `width`/`defaultCollapsed` |
229
+ | `SessionVisualizationsPanel` | side panel listing the session's charts/KPIs that have scrolled OUT of the transcript | `width`, `title`, `footerAction`, `headerActions` |
229
230
  | `CardTypeIconsProvider` / `useCardTypeIcons` | swap the pad's icons (`category` / `specificType` / `filterType` maps; MUI defaults) | |
230
231
 
231
232
  Data that used to be hardcoded is now a default you can replace: `defaultComposerSuggestions` (`{ label, prompt }[]`),
232
233
  `defaultComposerTemplates` (+ `seedFromTemplate`, `TEMPLATE_KIND_TO_SKETCH`), `CARD_TYPE_CATALOG`, `FILTER_TYPE_CATALOG` —
233
234
  all Portuguese travel-BI text.
234
235
 
236
+ ### The side panel is a SLOT
237
+
238
+ `ComposerView`'s `sidePanel` prop takes a node, or a function of `{ hasDashboard, turnOpen }`. Omit it and you get
239
+ `DashboardSidePanel`, which is what every host had before the prop existed; pass `null` for no panel at all.
240
+
241
+ It is a slot rather than a `'dashboard' | 'visualizations'` enum on purpose. **A host changing its layout or its
242
+ colours must not need a change in here** — an enum makes every new panel a release of this package, which is the
243
+ coupling that rule exists to avoid. The same reasoning is why `SessionVisualizationsPanel` reads a PUBLIC hook: a
244
+ host that wants a different panel writes one against `useSessionVisualizations()` and never forks this file.
245
+
246
+ ### Session visualizations (`@aintela/bi/runtime`)
247
+
248
+ What the conversation has DRAWN, and which of it is currently on screen. The rule the panel implements: the charts
249
+ live in the chat, and the panel lists only the ones that have scrolled out of view — listing all of them would be a
250
+ second copy of the transcript, listing none would leave the column empty.
251
+
252
+ | export | what it is |
253
+ |---|---|
254
+ | `SessionVisualizationsProvider` | holds the registry for one conversation. Mount it around the transcript AND whatever reads the list |
255
+ | `VisualizationFrame` | wraps one drawn thing: registers it, stamps `data-viz="<callId>"`, watches its own intersection with the scroller. Adds no styling of its own |
256
+ | `useSessionVisualizations()` | `{ items, offscreen, scrollTo(id), setScroller(el) }` |
257
+
258
+ `createBiUiTools` already wraps `present_chart`, `present_metric`, `present_metric_group` and `present_iframe` in a
259
+ frame, with the chart's own image as the panel's thumbnail. Outside a provider every piece is inert and the frame
260
+ renders its child unchanged, so a host that does not want the feature sees no difference.
261
+
262
+ `ComposerView` finds the transcript's scroller inside the `chatPane` you gave it and publishes it, so the
263
+ composer needs no wiring beyond the provider. A flash is drawn by the host: the frame sets `data-viz-focus` for
264
+ two seconds and styling it is a CSS rule, not a prop.
265
+
235
266
  ### Store — `ComposerProvider`, `useComposer()`
236
267
 
237
268
  `ComposerProvider` creates one zustand store (`createComposerStore`) per mount; `useComposer(selector)` subscribes,
@@ -0,0 +1,34 @@
1
+ var f = Object.defineProperty;
2
+ var e = (t, r) => f(t, "name", { value: r, configurable: !0 });
3
+ import { jsx as C } from "react/jsx-runtime";
4
+ import { createContext as l, useRef as x, useMemo as i, useContext as m } from "react";
5
+ const o = l({});
6
+ function h() {
7
+ return m(o);
8
+ }
9
+ e(h, "useChartCardDefaults");
10
+ const p = /* @__PURE__ */ e(({
11
+ palette: t,
12
+ monoShadePerCategory: r,
13
+ rotateBasePerChart: s,
14
+ gridColor: u,
15
+ children: a
16
+ }) => {
17
+ const n = x(0), c = i(
18
+ () => ({
19
+ palette: t,
20
+ monoShadePerCategory: r,
21
+ rotateBasePerChart: s,
22
+ gridColor: u,
23
+ allocateChartSlot: /* @__PURE__ */ e(() => n.current++, "allocateChartSlot")
24
+ }),
25
+ [t, r, s, u]
26
+ );
27
+ return /* @__PURE__ */ C(o.Provider, { value: c, children: a });
28
+ }, "ChartCardDefaultsProvider");
29
+ export {
30
+ o as C,
31
+ p as a,
32
+ h as u
33
+ };
34
+ //# sourceMappingURL=ChartCardDefaultsContext-BDRsVljO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartCardDefaultsContext-BDRsVljO.js","sources":["../src/data/ChartCardDefaultsContext.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo, useRef } from 'react';\n\n/**\n * Chart defaults — a host (or a dashboard viewer) can override the series\n * palette for a subtree and turn on \"mono-shade per category\" so single-series\n * bar charts use shades of one hue instead of the categorical palette.\n *\n * `palette` is the per-dashboard override; when absent, charts read\n * `theme.palette.bi.series` (see `useBiPalette`).\n */\nexport interface ChartCardDefaults {\n /** Replaces `theme.palette.bi.series` for series and pie / donut slice colours. */\n palette?: readonly string[];\n /**\n * When true, single-series bar charts colour each *category* (data row)\n * with a different opacity of the base series colour.\n */\n monoShadePerCategory?: boolean;\n /**\n * When true, each ChartCard mounted under the provider gets a different\n * primer colour from the palette in round-robin mount order.\n */\n rotateBasePerChart?: boolean;\n /**\n * Gridline colour for every chart under the provider. Without it a chart\n * derives one from `text.primary` at 12%, which is right on a neutral\n * canvas and too heavy on a warm one — and the alternative was the\n * per-card `gridColor` prop, i.e. a host repeating one decision on every\n * card of every dashboard.\n */\n gridColor?: string;\n /**\n * Internal: provider-supplied counter used by ChartCard to claim a slot\n * index on first mount. Use `ChartCardDefaultsProvider` rather than\n * setting this directly.\n */\n allocateChartSlot?: () => number;\n}\n\nexport const ChartCardDefaultsContext = createContext<ChartCardDefaults>({});\n\nexport function useChartCardDefaults(): ChartCardDefaults {\n return useContext(ChartCardDefaultsContext);\n}\n\nexport interface ChartCardDefaultsProviderProps {\n palette?: readonly string[];\n monoShadePerCategory?: boolean;\n rotateBasePerChart?: boolean;\n gridColor?: string;\n children: React.ReactNode;\n}\n\n/**\n * Wraps a subtree in a `ChartCardDefaultsContext`. Keeps a monotonically\n * increasing counter across child ChartCard mounts so each captures a stable\n * slot index on first render (not reset on parent re-renders).\n */\nexport const ChartCardDefaultsProvider: React.FC<ChartCardDefaultsProviderProps> = ({\n palette,\n monoShadePerCategory,\n rotateBasePerChart,\n gridColor,\n children,\n}) => {\n const counterRef = useRef(0);\n const value = useMemo<ChartCardDefaults>(\n () => ({\n palette,\n monoShadePerCategory,\n rotateBasePerChart,\n gridColor,\n allocateChartSlot: () => counterRef.current++,\n }),\n [palette, monoShadePerCategory, rotateBasePerChart, gridColor],\n );\n return <ChartCardDefaultsContext.Provider value={value}>{children}</ChartCardDefaultsContext.Provider>;\n};\n"],"names":["ChartCardDefaultsContext","createContext","useChartCardDefaults","useContext","__name","ChartCardDefaultsProvider","palette","monoShadePerCategory","rotateBasePerChart","gridColor","children","counterRef","useRef","value","useMemo","jsx"],"mappings":";;;;AAuCO,MAAMA,IAA2BC,EAAiC,CAAA,CAAE;AAEpE,SAASC,IAA0C;AACtD,SAAOC,EAAWH,CAAwB;AAC9C;AAFgBI,EAAAF,GAAA;AAiBT,MAAMG,IAAsE,gBAAAD,EAAA,CAAC;AAAA,EAChF,SAAAE;AAAA,EACA,sBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AACJ,MAAM;AACF,QAAMC,IAAaC,EAAO,CAAC,GACrBC,IAAQC;AAAA,IACV,OAAO;AAAA,MACH,SAAAR;AAAA,MACA,sBAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,WAAAC;AAAA,MACA,mBAAmB,gBAAAL,EAAA,MAAMO,EAAW,WAAjB;AAAA,IAAiB;AAAA,IAExC,CAACL,GAASC,GAAsBC,GAAoBC,CAAS;AAAA,EAAA;AAEjE,SAAO,gBAAAM,EAACf,EAAyB,UAAzB,EAAkC,OAAAa,GAAe,UAAAH,EAAA,CAAS;AACtE,GAnBmF;"}
@@ -6,7 +6,6 @@ import { jsxs as N, jsx as s, Fragment as te } from "react/jsx-runtime";
6
6
  import ne, { forwardRef as ie, useCallback as W, useRef as Q, useEffect as ae, useMemo as q } from "react";
7
7
  import { useTheme as se, alpha as ee } from "@mui/material/styles";
8
8
  import { C as de } from "./ChartContext-C_f_6khG.js";
9
- import "react-grid-layout/css/styles.css";
10
9
  import { useContainerWidth as oe, Responsive as le, ReactGridLayout as ce } from "react-grid-layout";
11
10
  import { gridBounds as ue, minMaxSize as fe } from "react-grid-layout/core";
12
11
  const X = class X extends ne.Component {
@@ -146,7 +145,7 @@ function be(e, r, a, E) {
146
145
  return !0;
147
146
  }
148
147
  y(be, "areLayoutsEqual");
149
- const Oe = /* @__PURE__ */ y(({
148
+ const Se = /* @__PURE__ */ y(({
150
149
  config: e,
151
150
  layouts: r,
152
151
  responsive: a = !0,
@@ -344,6 +343,6 @@ export {
344
343
  xe as b,
345
344
  ge as c,
346
345
  we as d,
347
- Oe as e
346
+ Se as e
348
347
  };
349
- //# sourceMappingURL=GridLayout-BgPzzPiP.js.map
348
+ //# sourceMappingURL=GridLayout-1gWuIKeZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridLayout-1gWuIKeZ.js","sources":["../src/grid/BiErrorBoundary.tsx","../src/grid/GridCard.tsx","../src/grid/types.ts","../src/grid/GridLayout.tsx"],"sourcesContent":["import React from 'react';\n\nexport interface BiErrorBoundaryProps {\n fallback: (error: Error) => React.ReactNode;\n /** Reset the boundary when this value changes (e.g. the card key or a render generation). */\n resetKey?: unknown;\n onError?: (error: Error, info: React.ErrorInfo) => void;\n children?: React.ReactNode;\n}\n\ninterface State {\n error: Error | null;\n}\n\n/**\n * Minimal error boundary for grid cards. A local copy rather than the chat\n * library's `JsxErrorBoundary`, so `@aintela/bi/grid` has no runtime import\n * from `@aintela/chat` (only `@aintela/bi/runtime` talks to the chat library).\n */\nexport class BiErrorBoundary extends React.Component<BiErrorBoundaryProps, State> {\n state: State = { error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { error };\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo): void {\n this.props.onError?.(error, info);\n }\n\n componentDidUpdate(prev: BiErrorBoundaryProps): void {\n if (this.state.error && prev.resetKey !== this.props.resetKey) {\n this.setState({ error: null });\n }\n }\n\n render(): React.ReactNode {\n if (this.state.error) return this.props.fallback(this.state.error);\n return this.props.children;\n }\n}\n\nexport default BiErrorBoundary;\n","import React, { forwardRef } from 'react';\nimport type { HTMLAttributes, ReactNode, CSSProperties } from 'react';\nimport type { SvgIconComponent } from '@mui/icons-material';\nimport type { OverridableComponent } from '@mui/material/OverridableComponent';\nimport type { SvgIconTypeMap } from '@mui/material/SvgIcon';\nimport { useTheme } from '@mui/material/styles';\nimport { alpha } from '@mui/material/styles';\nimport { BiErrorBoundary } from './BiErrorBoundary';\nimport { ChartContextProvider } from './ChartContext';\nimport './GridLayout.css';\n\n/** Header configuration for GridCard */\nexport interface GridCardHeader {\n title: string;\n /** Material Icons ligature name (host loads the font) or an MUI icon component */\n icon?: string | SvgIconComponent;\n}\n\n/** Predefined accent variants for the card */\nexport type GridCardColor = 'kpi' | 'chart' | 'table' | 'info' | 'iframe' | 'details' | 'custom';\n\nexport type GridCardContentDisplay = 'default' | 'grid';\n\n/**\n * - \"Boxed\": default look with header, border accents, etc.\n * - \"Naked\": no header, no border accents, blends with the background; only\n * subtle drag/resize handles on hover.\n */\nexport type GridCardViewType = 'Boxed' | 'Naked';\n\nexport interface GridCardProps extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n variant?: 'default' | 'elevated';\n viewType?: GridCardViewType;\n header?: GridCardHeader;\n /** Custom header render function; overrides the default header. */\n renderHeader?: (header: GridCardHeader) => ReactNode;\n /** Accent variant. */\n color?: GridCardColor;\n /** Custom accent (used when color=\"custom\"): any CSS colour, e.g. a theme token you resolved. */\n customColor?: string;\n contentDisplay?: GridCardContentDisplay;\n contentStyle?: CSSProperties;\n contentClassName?: string;\n noBorder?: boolean;\n /** Raw CSS injected in a `<style>` next to the card (dashboard bundles emit per-card styles). */\n htmlStyle?: string;\n dragLocked?: boolean;\n zoomLevel?: number;\n isResizable?: boolean;\n}\n\n/**\n * GridCard — a card usable directly as a react-grid-layout item. Forwards the\n * ref and the mouse/touch props RGL needs; use it as a direct child of\n * `GridLayout` with a `key`.\n */\nexport const GridCard = forwardRef<HTMLDivElement, GridCardProps>(\n (\n {\n style,\n htmlStyle,\n className,\n onMouseDown,\n onMouseUp,\n onTouchEnd,\n children,\n variant = 'default',\n viewType = 'Boxed',\n header,\n renderHeader,\n dragLocked = false,\n noBorder = false,\n color,\n zoomLevel = 0.9,\n customColor,\n contentDisplay = 'default',\n contentStyle,\n contentClassName,\n isResizable = false,\n ...props\n },\n ref,\n ) => {\n const theme = useTheme();\n const isNaked = viewType === 'Naked';\n const variantClass = variant === 'elevated' ? 'grid-card-elevated' : '';\n const hasHeader = !!header && !isNaked;\n const colorClass = isNaked ? '' : color ? `grid-card-${color}` : '';\n const nakedClass = isNaked ? 'grid-card-naked' : '';\n const displayClass = contentDisplay === 'grid' ? 'grid-card-content-grid' : '';\n\n const HeaderIcon = header?.icon as OverridableComponent<SvgIconTypeMap<{}, 'svg'>>;\n\n const cardStyle: CSSProperties = {\n position: 'relative',\n cursor: dragLocked ? 'pointer' : 'grab',\n border: noBorder ? '0px' : '',\n height: '100%',\n zoom: `${zoomLevel} !important`,\n ...style,\n ...(color === 'custom' && customColor\n ? ({\n '--grid-card-accent': customColor,\n '--grid-card-accent-light': safeAlpha(customColor, 0.4),\n '--grid-card-accent-dark': safeAlpha(customColor, 0.2),\n } as CSSProperties)\n : {}),\n };\n\n const innerWidth = parseInt(String(style?.height ?? '0'));\n\n const headerElement = header && !isNaked ? (\n renderHeader ? (\n renderHeader(header)\n ) : (\n <div className=\"grid-card-header\">\n <h4 className=\"grid-card-title\">{header.title}</h4>\n {header.icon && (\n <div className=\"grid-card-icon\">\n {typeof header.icon === 'string' ? <i className=\"material-icons\">{header.icon}</i> : <HeaderIcon fontSize=\"small\" sx={{ fontSize: '16px' }} />}\n </div>\n )}\n </div>\n )\n ) : null;\n\n const errorFallback = (err: Error) => (\n <div\n className=\"grid-card-error\"\n style={{\n border: `1px solid ${theme.palette.error.main}`,\n borderRadius: 6,\n padding: '12px 16px',\n margin: '8px 0',\n height: '95%',\n backgroundColor: alpha(theme.palette.error.main, 0.06),\n }}\n >\n <div style={{ color: theme.palette.error.main, fontSize: '0.85em', fontWeight: 500, marginBottom: 6 }}>Card render error: {err.message}</div>\n </div>\n );\n\n const contentClasses = [isNaked ? 'grid-card-content-naked' : 'grid-card-content', displayClass, contentClassName].filter(Boolean).join(' ');\n\n return (\n <>\n {htmlStyle && <style>{htmlStyle}</style>}\n\n <div\n ref={ref}\n style={cardStyle}\n className={`${isResizable ? 'grid-card' : 'grid-card-nohandle'} ds-card ${variantClass} ${colorClass} ${nakedClass} ${hasHeader ? 'grid-card-with-header' : ''} ${className ?? ''}`.trim()}\n onMouseDown={onMouseDown}\n onMouseUp={onMouseUp}\n onTouchEnd={onTouchEnd}\n {...props}\n >\n {/* Flex column: pinned header slot + a content area that owns the scroll boundary\n (`flex: 1; min-height: 0`), so `height: 100%` inside children resolves to the\n content area and not header + content. */}\n <div style={{ paddingLeft: `${innerWidth * (1 - zoomLevel)}px`, zoom: zoomLevel, height: 'inherit', width: 'inherit', display: 'flex', flexDirection: 'column' }}>\n {headerElement && <div style={{ flexShrink: 0 }}>{headerElement}</div>}\n <div className={contentClasses} style={{ alignItems: 'center', flex: 1, minHeight: 0, overflow: 'hidden', ...contentStyle }}>\n <ChartContextProvider value={{ naked: isNaked }}>\n <BiErrorBoundary fallback={errorFallback}>{children}</BiErrorBoundary>\n </ChartContextProvider>\n </div>\n {isNaked && <div className=\"grid-card-naked-resize-handle\" aria-hidden=\"true\" />}\n </div>\n {isNaked && <div className=\"grid-card-naked-resize-handle\" aria-hidden=\"true\" />}\n </div>\n </>\n );\n },\n);\n\nGridCard.displayName = 'GridCard';\n\nfunction safeAlpha(color: string, a: number): string {\n try {\n return alpha(color, a);\n } catch {\n return color;\n }\n}\n\nexport default GridCard;\n","import type { Layout } from 'react-grid-layout';\nimport type { GridConfig } from './gridModels';\n\nexport type { CellConfig, RowConfig, GridConfig } from './gridModels';\n\n/** Breakpoint names supported by the grid */\nexport type BreakpointName = 'lg' | 'md' | 'sm' | 'xs' | 'xxs';\n\n/** Responsive grid configuration — a GridConfig per breakpoint */\nexport interface ResponsiveGridConfig {\n lg?: GridConfig;\n md?: GridConfig;\n sm?: GridConfig;\n xs?: GridConfig;\n xxs?: GridConfig;\n rowMultipler?: number;\n}\n\n/** Responsive layouts (native react-grid-layout format) */\nexport type ResponsiveLayouts = {\n [K in BreakpointName]?: Layout;\n};\n\nexport const DEFAULT_BREAKPOINTS: Record<BreakpointName, number> = {\n lg: 920,\n md: 600,\n sm: 400,\n xs: 400,\n xxs: 0,\n};\n\nexport const DEFAULT_COLS: Record<BreakpointName, number> = { lg: 12, md: 9, sm: 4, xs: 4, xxs: 4 };\n\nexport const DEFAULT_ROW_HEIGHT = 20;\nexport const DEFAULT_ROW_MULTIPLIER = 3;\nexport const DEFAULT_MAX_ROWS = 36;\n","import React, { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { ReactGridLayout, Responsive, useContainerWidth } from \"react-grid-layout\";\nimport { gridBounds, minMaxSize } from \"react-grid-layout/core\";\nimport type {\n Layout,\n LayoutItem,\n ResponsiveLayouts as RGLResponsiveLayouts,\n} from \"react-grid-layout\";\nimport type { LayoutConstraint } from \"react-grid-layout/core\";\nimport type {\n GridConfig,\n ResponsiveGridConfig,\n ResponsiveLayouts,\n BreakpointName,\n} from \"./types\";\nimport {\n DEFAULT_BREAKPOINTS,\n DEFAULT_COLS,\n DEFAULT_MAX_ROWS,\n DEFAULT_ROW_HEIGHT,\n DEFAULT_ROW_MULTIPLIER,\n} from \"./types\";\nimport type { AutoResponsiveStrategy } from \"./useGridConfigTranslator\";\n\nimport './GridLayout.css';\n\n/**\n * Props for the GridLayout component\n */\nexport interface GridLayoutProps {\n /**\n * Grid configuration abstraction (rows/cells)\n * Used to generate the initial layout\n */\n config?: GridConfig | ResponsiveGridConfig;\n\n /**\n * Optional override layouts (native format)\n * When provided, these are used instead of translating config\n * Use this for persisted user modifications\n */\n layouts?: Layout | ResponsiveLayouts;\n\n /**\n * Whether to automatically generate responsive layouts for different breakpoints.\n * When true (default), a single GridConfig is automatically adapted for all screen sizes.\n * When false, the same layout is used for all breakpoints (only scaled by column count).\n * @default true\n */\n responsive?: boolean;\n\n /**\n * Strategy for auto-responsive layout generation.\n * - \"scale\": Proportionally scale widths (items may become narrow)\n * - \"stack\": Stack items vertically on small screens (full width)\n * - \"hybrid\": Scale for medium screens, stack for small screens (default)\n * Only applies when `responsive` is true and a single GridConfig is provided.\n * @default \"hybrid\"\n */\n autoResponsiveStrategy?: AutoResponsiveStrategy;\n\n dragLocked?: boolean\n\n /**\n * Row height in pixels\n * @default 25\n */\n rowHeight?: number;\n\n /**\n * Row height in pixels\n * @default 50\n */\n rowMultiplier?: number;\n\n /**\n * Breakpoint definitions (name → min-width)\n * @default { lg: 1200, md: 900, sm: 768, xs: 480, xxs: 0 }\n */\n breakpoints?: Record<BreakpointName, number>;\n\n /**\n * Column counts per breakpoint\n * @default { lg: 12, md: 12, sm: 12, xs: 4, xxs: 2 }\n */\n cols?: Record<BreakpointName, number>;\n\n /**\n * Maximum number of rows\n * @default Infinity\n */\n maxRows?: number;\n\n /**\n * Called when layout changes (after drag or resize ends)\n * Only fires when layout actually changed\n */\n onLayoutChange?: (layout: Layout, allLayouts: ResponsiveLayouts) => void;\n\n /**\n * User-driven boundaries. RGL fires these only at the end of a real\n * resize / drag interaction — *not* on prop syncs or layout reflows.\n * Use these (instead of `onLayoutChange`) when the consumer needs a\n * \"the user committed a change\" signal that shouldn't fire when a\n * fresh `layouts` prop comes in from above.\n */\n onResizeStop?: (\n layout: Layout,\n oldItem: LayoutItem | null,\n newItem: LayoutItem | null,\n ) => void;\n onDragStop?: (\n layout: Layout,\n oldItem: LayoutItem | null,\n newItem: LayoutItem | null,\n ) => void;\n\n /**\n * Children components (must have key prop matching cell keys)\n */\n children: React.ReactNode;\n\n zoomLevel?: number;\n\n /**\n * Additional class name for the container\n */\n className?: string;\n\n /**\n * Additional styles for the container\n */\n style?: React.CSSProperties;\n\n onDrop?: (data: any, item?: LayoutItem) => void;\n\n manualWidth?: number\n\n /**\n * Row-aware resize.\n *\n * When configured, dragging a card's resize handle adjusts the height\n * of every \"row sibling\" — items whose top edge (`y`) matches the\n * resized item's `y` — together. The width of the resized item is\n * unaffected, and so are widths/heights of any items NOT in the row.\n *\n * - Pass `true` for the default policy: a modifier (Shift) must be\n * held to opt into row-aware behaviour for a given drag.\n * - Pass an object to invert the default (`defaultOn: true` makes\n * row-aware the no-modifier behaviour and the modifier turns it\n * OFF for that drag) and/or to pick a different modifier key.\n * - Pass `false` (or omit the prop) to disable entirely.\n */\n rowAwareResize?: boolean | RowAwareResizeConfig;\n}\n\nexport interface RowAwareResizeConfig {\n /** Master switch. Defaults to `true` when this object is supplied. */\n enabled?: boolean;\n /**\n * When `true`, row-aware resize is the DEFAULT and holding the\n * modifier inverts it (i.e. the modifier disables row-aware for that\n * drag). When `false` (default), the user must hold the modifier to\n * opt into row-aware for that drag.\n */\n defaultOn?: boolean;\n /** Modifier key that flips the default behaviour. */\n modifierKey?: 'Shift' | 'Alt' | 'Ctrl' | 'Meta';\n}\n\ninterface NormalisedRowAwareResize {\n enabled: boolean;\n defaultOn: boolean;\n modifierKey: 'Shift' | 'Alt' | 'Ctrl' | 'Meta';\n}\n\nfunction normaliseRowAwareResize(\n cfg: boolean | RowAwareResizeConfig | undefined,\n): NormalisedRowAwareResize {\n if (cfg === true) return { enabled: true, defaultOn: false, modifierKey: 'Shift' };\n if (!cfg) return { enabled: false, defaultOn: false, modifierKey: 'Shift' };\n return {\n enabled: cfg.enabled ?? true,\n defaultOn: cfg.defaultOn ?? false,\n modifierKey: cfg.modifierKey ?? 'Shift',\n };\n}\n\n/**\n * Compare two layouts to check if they are equal\n */\nfunction areLayoutsEqual(a: Layout, b: Layout, _rowMultipler: number, _zoomLevel: number): boolean {\n if (a.length !== b.length) return false;\n\n for (let i = 0; i < a.length; i++) {\n const itemA = a[i];\n const itemB = b.find((item: LayoutItem) => item.i === itemA.i);\n if (!itemB) {\n return false\n }\n if (\n itemA.x !== itemB.x ||\n itemA.y !== itemB.y ||\n itemA.w !== itemB.w ||\n itemA.h !== itemB.h\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * GridLayout component\n *\n * A wrapper around react-grid-layout's Responsive component that accepts\n * a simplified row/cell configuration and translates it to the native format.\n *\n * @example\n * ```tsx\n * const config: GridConfig = {\n * rows: [\n * { height: 1, cells: [{ key: \"header\", width: 12 }] },\n * { height: 3, cells: [\n * { key: \"chart1\", width: 6 },\n * { key: \"chart2\", width: 6 }\n * ]}\n * ]\n * };\n *\n * <GridLayout config={config} onLayoutChange={handleChange}>\n * <div key=\"header\">Header</div>\n * <div key=\"chart1\">Chart 1</div>\n * <div key=\"chart2\">Chart 2</div>\n * </GridLayout>\n * ```\n */\nexport const GridLayout: React.FC<GridLayoutProps> = ({\n config,\n layouts,\n responsive = true,\n autoResponsiveStrategy: _autoResponsiveStrategy = \"scale\",\n rowHeight = DEFAULT_ROW_HEIGHT,\n rowMultiplier = DEFAULT_ROW_MULTIPLIER,\n breakpoints = DEFAULT_BREAKPOINTS,\n cols = DEFAULT_COLS,\n zoomLevel = 0.98,\n maxRows = DEFAULT_MAX_ROWS,\n dragLocked = false,\n onLayoutChange,\n \n onResizeStop,\n onDragStop,\n onDrop,\n manualWidth,\n children,\n className,\n rowAwareResize,\n}) => {\n // The two pass-through callbacks come straight from RGL's own\n // resize-stop / drag-stop events. We unwrap RGL's 6-arg signature\n // (oldItem, newItem, placeholder, e, element) into a leaner shape\n // matching `onLayoutChange` so the consumer doesn't have to know\n // RGL's internals.\n const handleResizeStopPassthrough = useCallback(\n (\n layout: Layout,\n oldItem: LayoutItem | null,\n newItem: LayoutItem | null,\n ) => {\n onResizeStop?.(layout, oldItem, newItem);\n },\n [onResizeStop],\n );\n const handleDragStopPassthrough = useCallback(\n (\n layout: Layout,\n oldItem: LayoutItem | null,\n newItem: LayoutItem | null,\n ) => {\n onDragStop?.(layout, oldItem, newItem);\n },\n [onDragStop],\n );\n const rowAwareCfg = normaliseRowAwareResize(rowAwareResize);\n // Modifier-key state is read globally rather than from the RGL\n // resize event because the constraint API doesn't pass the event\n // through. We listen on `window` so the state is fresh by the time\n // RGL invokes our constraint mid-drag.\n const modifierHeldRef = useRef(false);\n useEffect(() => {\n if (!rowAwareCfg.enabled) return;\n const update = (e: { shiftKey?: boolean; altKey?: boolean; ctrlKey?: boolean; metaKey?: boolean }) => {\n switch (rowAwareCfg.modifierKey) {\n case 'Shift': modifierHeldRef.current = !!e.shiftKey; return;\n case 'Alt': modifierHeldRef.current = !!e.altKey; return;\n case 'Ctrl': modifierHeldRef.current = !!e.ctrlKey; return;\n case 'Meta': modifierHeldRef.current = !!e.metaKey; return;\n }\n };\n const h = update as unknown as EventListener;\n window.addEventListener('keydown', h);\n window.addEventListener('keyup', h);\n window.addEventListener('mousemove', h);\n window.addEventListener('mousedown', h);\n return () => {\n window.removeEventListener('keydown', h);\n window.removeEventListener('keyup', h);\n window.removeEventListener('mousemove', h);\n window.removeEventListener('mousedown', h);\n };\n }, [rowAwareCfg.enabled, rowAwareCfg.modifierKey]);\n\n // Custom constraint that mutates the row siblings' `h` directly on\n // RGL's internal `layoutRef.current` (handed to us as\n // `context.layout`). RGL's `onResize` internal handler immediately\n // afterwards does `layout.map(item => item.i === id ? newItem : item)`\n // — siblings are returned by reference, so our mutations flow into\n // the new layout that gets handed to `compactor.compact` (which\n // clones items, baking the new heights into the next state). This is\n // the only path that survives RGL 2.x's prop-sync drag bail-out:\n // we're working WITH RGL's state pipeline, not feeding it from props.\n const rowAwareConstraint = useMemo<LayoutConstraint>(() => ({\n name: 'rowAwareResize',\n constrainSize(item, w, h, _handle, context) {\n if (!rowAwareCfg.enabled) return { w, h };\n const modifierHeld = modifierHeldRef.current;\n const shouldApply = rowAwareCfg.defaultOn ? !modifierHeld : modifierHeld;\n if (!shouldApply) return { w, h };\n const rowY = item.y ?? 0;\n for (const sibling of context.layout) {\n if (sibling.i === item.i) continue;\n if ((sibling.y ?? 0) !== rowY) continue;\n (sibling as { h: number }).h = h;\n }\n // Dragged item itself unchanged — RGL applies our returned\n // (w, h) as-is to it.\n return { w, h };\n },\n }), [rowAwareCfg.enabled, rowAwareCfg.defaultOn]);\n\n // RGL replaces its built-in defaults wholesale when `constraints` is\n // passed, so we explicitly bundle them in. When row-aware is\n // disabled we hand back `undefined` so RGL keeps its own defaults.\n const mergedConstraints = useMemo<LayoutConstraint[] | undefined>(() => {\n if (!rowAwareCfg.enabled) return undefined;\n return [gridBounds, minMaxSize, rowAwareConstraint];\n }, [rowAwareCfg.enabled, rowAwareConstraint]);\n const { width, containerRef, mounted } = useContainerWidth();\n const newWidth = manualWidth ?? (width);\n\n zoomLevel = zoomLevel ? zoomLevel * 0.95 : 0.98 * 0.95;\n\n // Last layouts we handed to RGL / received back from it, in *zoomed*\n // space. We compare incoming `onLayoutChange` payloads against this in\n // the same coordinate space so structurally-identical layouts dedupe\n // cleanly — without this the upward emission and the parent's\n // re-feeding form a loop.\n const lastRGLLayoutRef = useRef<ResponsiveLayouts | null>(null);\n\n if (config)\n config.rowMultipler = rowMultiplier ?? 1;\n\n // Pass-through. We used to multiply `h` by `unZoomLevel` here to\n // reverse the per-item h-scaling done in the effect — but that\n // scaling was redundant (the CSS `zoom: zoomLevel` on the wrapper\n // div already shrinks the rendered grid visually) AND the\n // round-trip was lossy due to rounding:\n // 6 → round(6*0.76)=5 → round(5*1.316)=7\n // so every store write came back with `h=7` instead of `h=6`,\n // which then re-zoomed to `h=5`, and any emit RGL fired (e.g.\n // collision compaction on a second card) ping-ponged forever\n // because the h field was effectively non-deterministic.\n //\n // Returning the layouts unchanged makes the round-trip identity:\n // whatever RGL hands us is what we send to the parent, and the\n // parent's next render feeds the exact same values back. RGL\n // settles in one cycle.\n const unZoomLayout = useCallback((internal: Layout | ResponsiveLayouts): ResponsiveLayouts => {\n const incoming: ResponsiveLayouts = Array.isArray(internal)\n ? ({ lg: internal, md: internal, sm: internal, xs: internal, xxs: internal } as ResponsiveLayouts)\n : (internal as ResponsiveLayouts);\n\n const result: ResponsiveLayouts = {} as ResponsiveLayouts;\n for (const bp of Object.keys(incoming) as BreakpointName[]) {\n const layout = incoming[bp];\n if (!layout) continue;\n // Spread each item so the parent gets a fresh object it can\n // mutate without aliasing back into our refs.\n result[bp] = layout.map((item) => ({ ...item }));\n }\n return result;\n }, []);\n\n\n // Translate config to layouts (memoized)\n // const translatedLayouts = useMemo(() => {\n // if (!config) return;\n\n // // If it's a simple GridConfig (has rows)\n // if (\"rows\" in config) {\n // const gridConfig = config as GridConfig;\n\n // if (responsive) {\n // // Auto-generate responsive layouts for all breakpoints\n // const translated = translateGridConfigAutoResponsive(\n // gridConfig,\n // cols,\n // autoResponsiveStrategy\n // );\n\n // return translated;\n // } else {\n // // Use same layout for all breakpoints (just scaled by cols)\n // return translateResponsiveGridConfig({ lg: gridConfig }, cols);\n // }\n // }\n\n // // Otherwise it's a ResponsiveGridConfig - use as-is\n // return translateResponsiveGridConfig(config as ResponsiveGridConfig, cols);\n // }, [config, cols, responsive, autoResponsiveStrategy]);\n\n if (responsive) {\n if (Array.isArray(layouts)) {\n layouts = {\n \"lg\": [...layouts] as Layout,\n \"md\": [...layouts] as Layout,\n \"sm\": [...layouts] as Layout,\n \"xs\": [...layouts] as Layout,\n \"xxs\": [...layouts] as Layout,\n } as ResponsiveLayouts;\n }\n }\n\n\n\n // Wrap the incoming layouts into a ResponsiveLayouts during render\n // (NOT inside a useEffect that calls setActiveLayouts). The\n // previous implementation lagged by one render: the effect set\n // `activeLayouts` *after* RGL had already rendered with the stale\n // value, so when the parent added a card RGL's children-prop saw\n // the new card while RGL's `propsLayout` was still the previous\n // render's. RGL's `synchronizeLayoutWithChildren` then created a\n // default placeholder ({w:1, h:1}) for the missing item and\n // emitted it back upward, which the parent wrote into the store,\n // which fed back as the new `propsLayout` — but by then RGL's\n // internal state was already (1,1), so it bounced to the new\n // (4,6) on the next render. Forever.\n //\n // Computing this with `useMemo` makes `activeLayouts` available\n // synchronously in the same render as the new `layouts` prop,\n // eliminating the one-render lag.\n const activeLayouts = useMemo<ResponsiveLayouts | null>(() => {\n if (!layouts) return null;\n if (Array.isArray(layouts)) {\n return {\n lg: layouts,\n md: layouts,\n sm: layouts,\n xs: layouts,\n xxs: layouts,\n } as ResponsiveLayouts;\n }\n return layouts as ResponsiveLayouts;\n }, [layouts]);\n\n // Sync the dedup baseline during render — refs can be safely\n // updated here (they don't trigger renders) and this guarantees\n // that when RGL fires `onLayoutChange` from one of its effects,\n // our handler compares against the SAME layout we just handed it,\n // not a stale value from the previous render.\n if (activeLayouts) {\n lastRGLLayoutRef.current = activeLayouts;\n }\n\n const handleDrop = (_layout: Layout, item?: LayoutItem, e?: Event) => {\n if (!onDrop) return;\n\n const dragEvent = e as unknown as React.DragEvent | undefined;\n const strData = dragEvent?.dataTransfer.getData(\"text/json\");\n let objData = null;\n if (strData) {\n objData = JSON.parse(strData);\n }\n onDrop(objData, item)\n }\n\n // Capture row-aware intent at the moment the resize finishes. RGL\n // fires `onResizeStop` BEFORE its `onLayoutChange`, so we record the\n // row's `y` and the new `h` here and apply the cascade to siblings\n // when `handleLayoutChange` runs immediately after.\n //\n // The modifier-key state is read directly off the native event RGL\n // hands us. If row-aware mode is configured as `defaultOn`, holding\n // the modifier *disables* the cascade for that drag; otherwise the\n // modifier is required to enable it. When the active policy doesn't\n // ask for row-aware on this drag, we leave `pendingRowAwareRef` null\n // and the layout flows through unchanged.\n // Handle layout change - only emit when layout actually changed.\n //\n // Comparison is done in *zoomed* (RGL-output) space, against the last\n // zoomed layouts we sent to or received from RGL. This is critical:\n // the previous implementation compared zoomed-vs-unzoomed, so equal\n // layouts always read as different and fed an upward emission on\n // every render — which, when the parent writes back into the store\n // and re-feeds `layouts`, closes a render loop.\n const handleLayoutChange = useCallback(\n (currentLayout: Layout, allLayouts?: RGLResponsiveLayouts<BreakpointName>) => {\n if (!onLayoutChange) return;\n\n // Row-aware cascade is applied INSIDE RGL via the\n // `rowAwareConstraint` above (pluggable constraints API), so\n // the layout RGL hands us here already has every row sibling\n // at the new height. Nothing extra to do at this boundary.\n const incoming: ResponsiveLayouts = (allLayouts ?? { lg: currentLayout }) as ResponsiveLayouts;\n\n const last = lastRGLLayoutRef.current;\n\n // Same-space comparison. If we have a baseline and every\n // breakpoint matches, this is a no-op — bail before touching\n // any state.\n if (last) {\n let hasChanged = false;\n for (const bp of Object.keys(incoming) as BreakpointName[]) {\n const newLayout = incoming[bp];\n const oldLayout = last[bp];\n if (!newLayout || !oldLayout) continue;\n if (!areLayoutsEqual(newLayout, oldLayout, config?.rowMultipler ?? 1, zoomLevel)) {\n hasChanged = true;\n break;\n }\n }\n if (!hasChanged) return;\n }\n\n // Update baseline in zoomed space *before* unzooming, so any\n // re-render triggered by the parent's response sees a\n // consistent ref.\n lastRGLLayoutRef.current = incoming;\n\n // Unzoom for the parent — restores the original `h` values\n // RGL scaled down for the visual zoom.\n const unzoomed = unZoomLayout(incoming);\n onLayoutChange(unzoomed[\"lg\"]!, unzoomed as ResponsiveLayouts);\n },\n [onLayoutChange, unZoomLayout, config?.rowMultipler, zoomLevel]\n );\n\n if (!activeLayouts) return null;\n\n for (const key of Object.keys(activeLayouts) as BreakpointName[]) {\n const bp = activeLayouts[key];\n\n if(bp) {\n bp.forEach(c => {\n c.isDraggable = !dragLocked;\n c.isResizable = !dragLocked;\n });\n }\n }\n\n\n return (\n <div\n ref={containerRef as React.RefObject<HTMLDivElement>}\n className={className}\n style={{ minHeight: \"100%\", paddingBottom: '200px', minWidth: '100%', paddingLeft: `${(1 - (zoomLevel)) / 2 * 100}%`, zoom: zoomLevel, overflow: 'auto' }}\n >\n {mounted &&\n responsive ?\n <Responsive\n onDrop={handleDrop}\n dropConfig={{\n enabled: !dragLocked,\n defaultItem: {\n h: 2,\n w: 2\n },\n }}\n dragConfig={{\n enabled: !dragLocked\n }}\n layouts={{ ...activeLayouts } as ResponsiveLayouts}\n breakpoints={breakpoints}\n cols={cols}\n rowHeight={rowHeight}\n maxRows={(maxRows ?? 24) * (config?.rowMultipler ?? 1)}\n width={newWidth}\n containerPadding={[0, 0]}\n\n onLayoutChange={handleLayoutChange}\n onResizeStop={handleResizeStopPassthrough}\n onDragStop={handleDragStopPassthrough}\n constraints={mergedConstraints}\n >\n {children}\n </Responsive>\n : <ReactGridLayout\n onDrop={handleDrop}\n dropConfig={{\n enabled: !dragLocked,\n defaultItem: {\n h: 1,\n w: 3\n },\n }}\n gridConfig={{ cols: 12, rowHeight: rowHeight, maxRows: 100, containerPadding: [0, 0], margin: [0, 2] }}\n dragConfig={{\n enabled: !dragLocked,\n bounded: true,\n }}\n\n layout={activeLayouts[\"lg\"] as Layout}\n autoSize={true}\n width={newWidth}\n onLayoutChange={handleLayoutChange}\n onResizeStop={handleResizeStopPassthrough}\n onDragStop={handleDragStopPassthrough}\n constraints={mergedConstraints}\n >\n {children}\n </ReactGridLayout>\n\n }\n </div >\n );\n};\n\nexport default GridLayout;\n"],"names":["_BiErrorBoundary","React","__publicField","error","info","_b","_a","prev","__name","BiErrorBoundary","GridCard","forwardRef","style","htmlStyle","className","onMouseDown","onMouseUp","onTouchEnd","children","variant","viewType","header","renderHeader","dragLocked","noBorder","color","zoomLevel","customColor","contentDisplay","contentStyle","contentClassName","isResizable","props","ref","theme","useTheme","isNaked","variantClass","hasHeader","colorClass","nakedClass","displayClass","HeaderIcon","cardStyle","safeAlpha","innerWidth","headerElement","jsxs","jsx","errorFallback","err","alpha","contentClasses","Fragment","ChartContextProvider","a","DEFAULT_BREAKPOINTS","DEFAULT_COLS","DEFAULT_ROW_HEIGHT","DEFAULT_ROW_MULTIPLIER","DEFAULT_MAX_ROWS","normaliseRowAwareResize","cfg","areLayoutsEqual","b","_rowMultipler","_zoomLevel","i","itemA","itemB","item","GridLayout","config","layouts","responsive","_autoResponsiveStrategy","rowHeight","rowMultiplier","breakpoints","cols","maxRows","onLayoutChange","onResizeStop","onDragStop","onDrop","manualWidth","rowAwareResize","handleResizeStopPassthrough","useCallback","layout","oldItem","newItem","handleDragStopPassthrough","rowAwareCfg","modifierHeldRef","useRef","useEffect","h","e","rowAwareConstraint","useMemo","w","_handle","context","modifierHeld","rowY","sibling","mergedConstraints","gridBounds","minMaxSize","width","containerRef","mounted","useContainerWidth","newWidth","lastRGLLayoutRef","unZoomLayout","internal","incoming","result","bp","activeLayouts","handleDrop","_layout","dragEvent","strData","objData","handleLayoutChange","currentLayout","allLayouts","last","hasChanged","newLayout","oldLayout","unzoomed","key","c","Responsive","ReactGridLayout"],"mappings":"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"}
@@ -8,9 +8,9 @@ import { RebaseEdit as Be, Schedule as Re, ImportExportOutlined as Le, CloseOutl
8
8
  import { Stack as k, Box as w, Typography as f, Button as ce, CircularProgress as te, Slider as ze, IconButton as we, Alert as se, Snackbar as Ce, useTheme as Oe, LinearProgress as Fe } from "@mui/material";
9
9
  import * as je from "@mui/material/styles";
10
10
  import { alpha as Ne } from "@mui/material/styles";
11
- import { G as De, e as Ae } from "./GridLayout-BgPzzPiP.js";
11
+ import { G as De, e as Ae } from "./GridLayout-1gWuIKeZ.js";
12
12
  import { a as Se } from "./DashboardParametersContext-Clv--79U.js";
13
- import { a as Ge } from "./ChartCardDefaultsContext-Cl5T25H0.js";
13
+ import { a as Ge } from "./ChartCardDefaultsContext-BDRsVljO.js";
14
14
  import { isSubAgentTerminalStatus as ve } from "@aintela/chat/models";
15
15
  import { a as $e } from "./BiClientProvider-CWJochvi.js";
16
16
  import * as _e from "react-dom";
@@ -52,7 +52,7 @@ async function ke() {
52
52
  import("@mui/material"),
53
53
  import("@mui/icons-material"),
54
54
  import("recharts")
55
- ]), { getBiModuleSurface: a } = await import("./biModuleSurface-dtnpBMtT.js"), i = a(), d = {
55
+ ]), { getBiModuleSurface: a } = await import("./biModuleSurface-BdJK7sSL.js"), i = a(), d = {
56
56
  react: Te,
57
57
  "react/jsx-runtime": Ee,
58
58
  "react-dom": _e,
@@ -710,4 +710,4 @@ export {
710
710
  vt as s,
711
711
  Pe as u
712
712
  };
713
- //# sourceMappingURL=ScriptDashboardViewerVertical-DKaHcL1o.js.map
713
+ //# sourceMappingURL=ScriptDashboardViewerVertical-Rr_4adpH.js.map