@aintela/bi 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -1
- package/dist/ChartCardDefaultsContext-BDRsVljO.js +34 -0
- package/dist/ChartCardDefaultsContext-BDRsVljO.js.map +1 -0
- package/dist/{ScriptDashboardViewerVertical-CuwnxisJ.js → ScriptDashboardViewerVertical-CHIPRLen.js} +3 -3
- package/dist/{ScriptDashboardViewerVertical-CuwnxisJ.js.map → ScriptDashboardViewerVertical-CHIPRLen.js.map} +1 -1
- package/dist/{biModuleSurface--gLAiZ9Z.js → biModuleSurface-BYtgLreK.js} +7 -7
- package/dist/{biModuleSurface--gLAiZ9Z.js.map → biModuleSurface-BYtgLreK.js.map} +1 -1
- package/dist/cards.js +1 -1
- package/dist/composer/index.d.ts +3 -1
- package/dist/composer/view/ComposerView.d.ts +20 -1
- package/dist/composer/view/SessionVisualizationsPanel.d.ts +19 -0
- package/dist/composer.js +73 -71
- package/dist/data/ChartCardDefaultsContext.d.ts +9 -0
- package/dist/data.js +1 -1
- package/dist/{index-DeiweWw8.js → index-9LcZjCK0.js} +54 -50
- package/dist/index-9LcZjCK0.js.map +1 -0
- package/dist/{index-K50t61iI.js → index-CfKuT0vQ.js} +2 -2
- package/dist/index-CfKuT0vQ.js.map +1 -0
- package/dist/index-DOfnLVhs.js +3853 -0
- package/dist/index-DOfnLVhs.js.map +1 -0
- package/dist/{index-DOpx0R4Y.js → index-Dy6hwDjs.js} +2 -2
- package/dist/index-Dy6hwDjs.js.map +1 -0
- package/dist/index-ZBNoVc5M.js +210 -0
- package/dist/index-ZBNoVc5M.js.map +1 -0
- package/dist/index-zN3LPF6u.js +97 -0
- package/dist/index-zN3LPF6u.js.map +1 -0
- package/dist/index.js +123 -117
- package/dist/inline/Chart.d.ts +0 -9
- package/dist/inline/Metric.d.ts +0 -2
- package/dist/inline/MetricGroup.d.ts +1 -1
- package/dist/inline.js +1 -1
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/sessionVisualizations.d.ts +61 -0
- package/dist/runtime/version.d.ts +1 -1
- package/dist/runtime.js +16 -11
- package/dist/runtime.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme.js +1 -1
- package/dist/version-CbZiTInp.js +122 -0
- package/dist/version-CbZiTInp.js.map +1 -0
- package/dist/viewer.js +1 -1
- package/package.json +1 -1
- package/dist/ChartCardDefaultsContext-Cl5T25H0.js +0 -32
- package/dist/ChartCardDefaultsContext-Cl5T25H0.js.map +0 -1
- package/dist/index-BYc79sSy.js +0 -131
- package/dist/index-BYc79sSy.js.map +0 -1
- package/dist/index-D7Oo_dC-.js +0 -94
- package/dist/index-D7Oo_dC-.js.map +0 -1
- package/dist/index-DOpx0R4Y.js.map +0 -1
- package/dist/index-DULVx84u.js +0 -3630
- package/dist/index-DULVx84u.js.map +0 -1
- package/dist/index-DeiweWw8.js.map +0 -1
- package/dist/index-K50t61iI.js.map +0 -1
- package/dist/version-BpSiNdYv.js +0 -84
- package/dist/version-BpSiNdYv.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DeiweWw8.js","sources":["../src/cards/MetricCard.tsx","../src/cards/MetricGroupCard.tsx","../src/cards/GaugeCard.tsx","../src/cards/GaugeGroup.tsx","../src/cards/licenseGuard.ts","../src/cards/DataTableCard.tsx","../src/cards/ChartCard.tsx","../src/cards/TreeMapCard.tsx","../src/cards/mapUtils.ts","../src/cards/geoLayers.ts","../src/cards/MapBubbles.tsx","../src/cards/MapConnections.tsx","../src/cards/worldMapPath.ts"],"sourcesContent":["import React from 'react';\nimport { Box, Skeleton, Stack, Typography } from '@mui/material';\nimport { formatCompact, percentChange, trendArrow } from '../data/dataUtils';\nimport { useBiPalette } from '../theme/createBiTheme';\nimport { useChartContext } from '../grid/ChartContext';\n\nexport interface MetricCardProps {\n currentValue: number;\n previousValue?: number;\n prefix?: string;\n suffix?: string;\n differenceStyle?: 'percentage' | 'value' | 'absolute';\n description?: string;\n icon?: React.ReactNode;\n label?: string;\n formatValue?: (value: number) => string;\n loading?: boolean;\n}\n\nexport function MetricCard({\n currentValue,\n previousValue,\n prefix = '',\n suffix = '',\n differenceStyle = 'percentage',\n description,\n icon,\n label,\n formatValue,\n loading = false,\n}: MetricCardProps) {\n const bi = useBiPalette();\n const fmt = formatValue ?? formatCompact;\n const { naked } = useChartContext() ?? {};\n\n if (loading) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n <Stack spacing={1} sx={{ height: '100%' }}>\n <Skeleton variant=\"text\" width={100} sx={{ fontSize: '0.75rem' }} />\n <Box sx={{ flex: 1, display: 'flex', alignItems: 'center' }}>\n <Skeleton variant=\"text\" width=\"60%\" sx={{ fontSize: '2.5rem' }} />\n </Box>\n <Skeleton variant=\"text\" width={140} sx={{ fontSize: '0.875rem' }} />\n </Stack>\n </Box>\n );\n }\n\n const change = previousValue != null ? percentChange(previousValue, currentValue) : null;\n const diff = previousValue != null ? currentValue - previousValue : null;\n\n const changeDisplay = change != null\n ? differenceStyle === 'percentage'\n ? `${(change * 100).toFixed(1)}%`\n : `${prefix}${fmt(diff!)}${suffix}`\n : null;\n\n const arrow = diff != null ? trendArrow(diff) : null;\n const changeColor = diff != null ? (diff > 0 ? bi.positive : diff < 0 ? bi.negative : bi.neutral) : undefined;\n\n return (\n <Box className=\"bi-metric-card\" sx={{ height: '100%', p: 1, alignContent: 'center' }}>\n <Stack spacing={1} sx={{ height: '100%' }} alignContent=\"center\">\n {label && naked && (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n {icon && (\n <Box sx={{ color: 'primary.main', display: 'flex', alignItems: 'center' }}>\n <Typography variant=\"body2\">{icon}</Typography>\n </Box>\n )}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ letterSpacing: 0.6, lineHeight: 1.4, overflow: 'clip' }}>\n {label}\n </Typography>\n </Stack>\n )}\n\n <Box sx={{ flex: 1, display: 'flex', alignItems: 'center', minWidth: '100%', justifyContent: 'center' }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 800, fontSize: '28px', letterSpacing: -0.5 }}>\n {prefix}{fmt(currentValue)}{suffix}\n </Typography>\n </Box>\n\n {changeDisplay && (\n <Stack direction=\"row\" spacing={0.5} alignItems=\"center\" justifyContent=\"center\">\n <Typography variant=\"body1\" className=\"bi-metric-change\" sx={{ color: changeColor, fontWeight: 700 }}>\n {arrow} {changeDisplay}\n </Typography>\n {previousValue != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n vs {prefix}{fmt(previousValue)}{suffix}\n </Typography>\n )}\n </Stack>\n )}\n\n {description && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ opacity: 0.8 }}>\n {description}\n </Typography>\n )}\n </Stack>\n </Box>\n );\n}\n\nexport default MetricCard;\n","import React from 'react';\nimport { Box, Skeleton, Stack, Typography } from '@mui/material';\nimport { MetricCard } from './MetricCard';\nimport type { MetricCardProps } from './MetricCard';\n\nexport interface MetricGroupCardProps {\n title?: string;\n metrics: MetricCardProps[];\n columns?: 2 | 3 | 4;\n loading?: boolean;\n}\n\nexport function MetricGroupCard({ title, metrics, columns = 3, loading = false }: MetricGroupCardProps) {\n if (loading) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n {title && <Skeleton variant=\"text\" width={160} sx={{ fontSize: '1.25rem', mb: 2 }} />}\n <Box sx={{ display: 'grid', gridTemplateColumns: `repeat(${columns}, 1fr)`, gap: 2 }}>\n {Array.from({ length: columns }).map((_, i) => (\n <Stack key={i} spacing={1} sx={{ p: 1 }}>\n <Skeleton variant=\"text\" width={80} sx={{ fontSize: '0.75rem' }} />\n <Skeleton variant=\"text\" width=\"70%\" sx={{ fontSize: '2rem' }} />\n <Skeleton variant=\"text\" width={100} sx={{ fontSize: '0.75rem' }} />\n </Stack>\n ))}\n </Box>\n </Box>\n );\n }\n\n return (\n <Box sx={{ height: '100%', p: 2 }}>\n {title && (\n <Typography variant=\"h6\" sx={{ mb: 2 }}>\n {title}\n </Typography>\n )}\n <Box sx={{ display: 'grid', gridTemplateColumns: `repeat(${columns}, 1fr)`, gap: 2 }}>\n {metrics.map((props, i) => (\n <MetricCard key={i} {...props} />\n ))}\n </Box>\n </Box>\n );\n}\n\nexport default MetricGroupCard;\n","import React from 'react';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport { formatCompact } from '../data/dataUtils';\n\nexport interface GaugeThreshold {\n /** Upper bound of the band as a ratio in `[0, 1]`. */\n value: number;\n color: string;\n}\n\nexport interface GaugeCardProps {\n value: number;\n min?: number;\n max?: number;\n label?: string;\n prefix?: string;\n suffix?: string;\n /** Bands from low to high. Defaults to error / warning / success at 33 % / 66 % / 100 %. */\n thresholds?: GaugeThreshold[];\n formatValue?: (value: number) => string;\n loading?: boolean;\n}\n\nconst ARC_START = Math.PI;\nconst ARC_END = 2 * Math.PI;\nconst R = 50;\nconst CX = R + 10;\nconst CY = R + 10;\nconst STROKEWIDTH = 10;\n\nconst viewBoxWidth = 2 * R + STROKEWIDTH + 10;\nconst viewBoxHeight = R + 40;\n\nfunction polarToXY(angle: number): [number, number] {\n return [CX + R * Math.cos(angle), CY + R * Math.sin(angle)];\n}\n\nfunction describeArc(startAngle: number, endAngle: number): string {\n const [sx, sy] = polarToXY(startAngle);\n const [ex, ey] = polarToXY(endAngle);\n const large = endAngle - startAngle > Math.PI ? 1 : 0;\n return `M ${sx} ${sy} A ${R} ${R} 0 ${large} 1 ${ex} ${ey}`;\n}\n\ninterface GaugeSvgProps {\n zones: GaugeThreshold[];\n ratio: number;\n needleColor: string;\n strokeWidth: number;\n textPrimaryColor: string;\n textSecondaryColor: string;\n min: string;\n max: string;\n elementsClass?: string;\n className?: string;\n valueComponent: string;\n strokeLinecap?: 'round' | 'inherit' | 'butt' | 'square';\n}\n\nfunction GaugeSvg({ zones, ratio, needleColor, strokeWidth, textPrimaryColor, textSecondaryColor, elementsClass, min, max, valueComponent, className, strokeLinecap = 'round' }: GaugeSvgProps) {\n const needleAngle = ARC_START + ratio * (ARC_END - ARC_START);\n const [nx, ny] = polarToXY(needleAngle);\n\n return (\n <svg className={className} x=\"0\" y=\"0\" viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`} width=\"100%\" height=\"100%\" preserveAspectRatio=\"xMidYMid meet\">\n {zones.map((zone, i) => {\n const prevVal = Math.min(i > 0 ? zones[i - 1].value : 0, 1);\n const segStart = ARC_START + prevVal * (ARC_END - ARC_START);\n const segEnd = Math.min(ARC_START + zone.value * (ARC_END - ARC_START), ARC_END);\n return (\n <path\n className={elementsClass}\n key={i}\n d={describeArc(segStart, segEnd)}\n fill=\"none\"\n stroke={zone.color}\n strokeWidth={strokeWidth}\n strokeLinecap={i === zones.length - 1 ? 'round' : strokeLinecap}\n />\n );\n })}\n\n {ratio > 0.005 && (\n <path className={elementsClass} d={describeArc(ARC_START, needleAngle)} fill=\"none\" stroke={needleColor} strokeWidth={strokeWidth} strokeLinecap=\"round\" />\n )}\n\n <line className={elementsClass} x1={CX} y1={CY} x2={nx} y2={ny} stroke={textPrimaryColor} strokeWidth={2.5} strokeLinecap=\"round\" />\n <circle className={elementsClass} cx={CX} cy={CY} r={4} fill={textPrimaryColor} />\n\n <text x={CX} y={CY + 20} textAnchor=\"middle\" fill={textPrimaryColor} fontSize=\"14\" fontWeight=\"bold\">\n {valueComponent}\n </text>\n\n <text x={CX - R} y={CY + 12} textAnchor=\"end\" fill={textSecondaryColor} fontSize=\"8\">\n {min}\n </text>\n <text x={CX + R - 10} y={CY + 12} textAnchor=\"start\" fill={textSecondaryColor} fontSize=\"8\">\n {max}\n </text>\n </svg>\n );\n}\n\nexport function GaugeCard({ value, min = 0, max = 100, label, prefix = '', suffix = '', thresholds, formatValue, loading = false }: GaugeCardProps) {\n const theme = useTheme();\n const fmt = formatValue ?? formatCompact;\n\n if (loading) {\n const skeleton = theme.palette.action.disabledBackground;\n return (\n <Box className=\"parallax-wrapper parallax-group\" data-testid=\"loading\" sx={{ height: '100%', p: 0, display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <GaugeSvg\n className=\"parallax-layer layer-fg skeleton-card\"\n elementsClass=\"svgElement\"\n zones={[{ color: skeleton, value: 0.33 }, { color: skeleton, value: 0.7 }, { color: skeleton, value: 1 }]}\n ratio={0.5}\n strokeLinecap=\"butt\"\n needleColor=\"inherit\"\n strokeWidth={20}\n textPrimaryColor={theme.palette.text.disabled}\n textSecondaryColor={theme.palette.text.disabled}\n min=\"\"\n max=\"\"\n valueComponent=\"Loading\"\n />\n </Box>\n );\n }\n\n const range = max - min || 1;\n const ratio = Math.max(0, Math.min(1, (value - min) / range));\n\n const zones = thresholds ?? [\n { value: 0.33, color: theme.palette.error.main },\n { value: 0.66, color: theme.palette.warning.main },\n { value: 1.0, color: theme.palette.success.main },\n ];\n\n let needleColor = zones[zones.length - 1]?.color ?? theme.palette.primary.main;\n for (const z of zones) {\n if (ratio <= z.value) {\n needleColor = z.color;\n break;\n }\n }\n\n return (\n <Box sx={{ position: 'relative', m: 0, height: '100%', p: 0, display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {label && (\n <Box sx={{ position: 'absolute', top: 100, left: 10 }}>\n <Typography variant=\"overline\" color=\"text.secondary\" sx={{ letterSpacing: 0.6 }}>\n {label}\n </Typography>\n </Box>\n )}\n\n <Box sx={{ display: 'inline-flex', mt: 0, alignItems: 'normal', width: '100%', height: 'inherit', alignContent: 'center' }}>\n <GaugeSvg\n zones={zones}\n ratio={ratio}\n needleColor={needleColor}\n strokeWidth={20}\n textPrimaryColor={theme.palette.text.primary}\n textSecondaryColor={theme.palette.text.secondary}\n min={fmt(min)}\n max={fmt(max)}\n valueComponent={`${prefix}${fmt(value)}${suffix}`}\n />\n </Box>\n </Box>\n );\n}\n\nexport default GaugeCard;\n","import React from 'react';\nimport { Stack } from '@mui/material';\nimport type { GaugeCardProps } from './GaugeCard';\n\nexport interface GaugeGroupProps {\n title?: string;\n materialIcon?: string;\n footNote?: string;\n partial?: boolean;\n loading?: boolean;\n gauges: React.ReactElement<GaugeCardProps>[];\n}\n\nexport const GaugeGroup: React.FC<GaugeGroupProps> = (props) => (\n <div style={{ height: '100%' }}>\n <Stack direction=\"row\" gap={1} sx={{ height: '100%' }}>\n {props.gauges.map((g, i) => (\n <div key={g.key ?? i}>{g}</div>\n ))}\n </Stack>\n {props.footNote && (\n <div className=\"ds-card-footer\">\n <small>{props.footNote}</small>\n </div>\n )}\n </div>\n);\n\nexport default GaugeGroup;\n","import { LicenseInfo } from '@mui/x-license';\n\nlet warned = false;\n\n/**\n * `DataTableCard` renders MUI X DataGrid **Pro**, whose licence key must be set\n * by the HOST before first render (`LicenseInfo.setLicenseKey(...)` at boot —\n * this package never ships a key). Without one the grid draws a watermark and\n * logs a licence error; this guard makes the cause obvious once per session.\n */\nexport function warnIfMuiXLicenseMissing(): void {\n if (warned) return;\n warned = true;\n let key: string | undefined;\n try {\n key = LicenseInfo.getLicenseKey?.();\n } catch {\n key = undefined;\n }\n if (!key) {\n console.warn(\n '[@aintela/bi] MUI X licence key not set. DataTableCard uses @mui/x-data-grid-pro; call ' +\n \"LicenseInfo.setLicenseKey('<your key>') (from '@mui/x-license' or '@mui/x-data-grid-pro') in the host \" +\n 'before the first BI render, or the grid renders a watermark.',\n );\n }\n}\n\n/** Test seam. */\nexport function resetMuiXLicenseWarning(): void {\n warned = false;\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Alert, Box, Button, CircularProgress, MenuItem, Snackbar, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport DownloadIcon from '@mui/icons-material/FileDownloadOutlined';\nimport TableViewIcon from '@mui/icons-material/TableViewOutlined';\nimport FilterAltOffIcon from '@mui/icons-material/FilterAltOffOutlined';\n// Pro variant — same surface as the community `DataGrid` plus column pinning\n// and reorder. The licence key is set by the HOST (see licenseGuard.ts).\nimport {\n DataGridPro,\n GridToolbarContainer,\n GridToolbarColumnsButton,\n GridToolbarFilterButton,\n GridToolbarDensitySelector,\n GridToolbarExportContainer,\n getGridSingleSelectOperators,\n gridClasses,\n gridFilterModelSelector,\n useGridApiContext,\n useGridSelector,\n} from '@mui/x-data-grid-pro';\nimport type {\n GridCellClassNamePropType, GridCellParams, GridColDef, GridColumnHeaderParams, GridFilterItem, GridFilterOperator,\n GridRowClassNameParams, GridRowHeightParams, GridRowHeightReturnValue, GridValidRowModel,\n} from '@mui/x-data-grid-pro';\nimport { formatCompact, formatNumber, formatCurrency, formatPercent, formatDate, toStr, formatBoolean, DataResult } from '../data/dataUtils';\nimport { useChartContext } from '../grid/ChartContext';\nimport type { LazyDataResult } from '../hooks/useDashboardLazyData';\nimport { warnIfMuiXLicenseMissing } from './licenseGuard';\n\n// ─── Types ───────────────────────────────────────────────────\n\nexport type ColumnFormats = 'compact' | 'number' | 'currency' | 'check' | 'percent' | 'date';\n\nexport interface DataTableColumn<TModel extends GridValidRowModel = any, T = any> {\n field: string;\n label: string;\n align?: 'left' | 'center' | 'right';\n width?: number;\n minWidth?: number;\n format?: ColumnFormats | ((value: unknown) => string);\n sortable?: boolean;\n filterable?: boolean;\n headerClassName?: string;\n cellClassName?: string | GridCellClassNamePropType<TModel, T>;\n renderHeader?: (params: GridColumnHeaderParams<TModel, T>) => React.ReactNode;\n renderCell?: (params: GridCellParams<TModel, T, string>) => React.ReactNode;\n /** `'singleSelect'` renders a dropdown filter (with {@link valueOptions}). */\n type?: 'singleSelect';\n valueOptions?: ReadonlyArray<unknown>;\n /** `true` → restrict the singleSelect filter to `isAnyOf` (multi-select). */\n multiSelectDropdown?: boolean;\n}\n\nexport interface DataTableCardProps<TModel extends Record<string, any> = Record<string, any>> {\n /** Local mode — full rowset already in memory (`useDashboardData(...).toDataResult(schema)`). */\n data?: DataResult<TModel> | null;\n /** Server mode (mutually exclusive with `data`) — `useDashboardLazyData(viewId, schema)`. */\n lazyData?: LazyDataResult<TModel>;\n /** Column schema (`defineSchema(...)`). Loosely typed on purpose: an untyped `DataResult` + a typed schema is the common LLM pattern. */\n schema?: { build(): DataTableColumn<any>[] };\n title?: string;\n pageSize?: number;\n dense?: boolean;\n striped?: boolean;\n /** Override for the even-row stripe (defaults to `theme.palette.action.hover`). */\n stripedColorEven?: string;\n stripedColorOdd?: string;\n maxHeight?: number | string;\n /** Header background (defaults to a translucent `primary.main`). */\n headerColor?: string;\n loading?: boolean;\n autoFitHeaders?: boolean;\n getRowHeight?: (params: GridRowHeightParams) => GridRowHeightReturnValue;\n getRowClassName?: (params: GridRowClassNameParams<TModel & GridValidRowModel>) => string;\n /** Default pinned columns at first render (`{ left?: string[]; right?: string[] }`). */\n initialPinnedColumns?: { left?: string[]; right?: string[] };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────\n\nfunction resolveFormatter(format: DataTableColumn['format']): ((value: unknown) => string) | undefined {\n if (!format) return undefined;\n if (typeof format === 'function') return format;\n switch (format) {\n case 'compact': return (v) => (v != null && typeof v === 'number' ? formatCompact(v) : toStr(v));\n case 'number': return (v) => (v != null && typeof v === 'number' ? formatNumber(v) : toStr(v));\n case 'currency': return (v) => (v != null && typeof v === 'number' ? formatCurrency(v) : toStr(v));\n case 'percent': return (v) => (v != null && typeof v === 'number' ? formatPercent(v) : toStr(v));\n case 'check': return (v) => (v != null && typeof v === 'boolean' ? formatBoolean(v) : toStr(v));\n case 'date': return (v) => (v instanceof Date ? formatDate(v) : toStr(v));\n }\n}\n\n// ─── Toolbar (server-side export) ────────────────────────────\n// Composed from the legacy toolbar pieces so our server-side CSV / XLSX\n// items sit inside the export menu (see the source app's DataTableCard for\n// why `<GridToolbar />` itself does not work here).\n\ninterface ServerExportToolbarProps {\n onCsvExport?: () => void;\n onXlsxExport?: () => void;\n onClearFilters?: () => void;\n exporting?: boolean;\n}\n\nfunction isActiveFilterItem(item: GridFilterItem): boolean {\n if (item.operator === 'isEmpty' || item.operator === 'isNotEmpty') return true;\n if (Array.isArray(item.value)) return item.value.length > 0;\n return item.value !== undefined && item.value !== null && item.value !== '';\n}\n\nfunction ServerExportToolbar({ onCsvExport, onXlsxExport, onClearFilters, exporting }: ServerExportToolbarProps) {\n const apiRef = useGridApiContext();\n const filterModel = useGridSelector(apiRef, gridFilterModelSelector);\n const hasActiveFilters = (filterModel?.items ?? []).some(isActiveFilterItem) || (filterModel?.quickFilterValues?.length ?? 0) > 0;\n\n return (\n <GridToolbarContainer>\n <GridToolbarColumnsButton />\n <GridToolbarFilterButton />\n <GridToolbarDensitySelector />\n {onClearFilters && hasActiveFilters && (\n <Button size=\"small\" startIcon={<FilterAltOffIcon fontSize=\"small\" />} onClick={onClearFilters} sx={{ textTransform: 'none' }}>\n Limpar filtros\n </Button>\n )}\n <GridToolbarExportContainer>\n {/* Each MenuItem must be a DIRECT child so the container can clone it with `hideMenu`. */}\n {onCsvExport && (\n <MenuItem key=\"server-csv\" disabled={exporting} onClick={onCsvExport}>\n <DownloadIcon fontSize=\"small\" style={{ marginRight: 8 }} />\n Exportar CSV (todos os dados)\n </MenuItem>\n )}\n {onXlsxExport && (\n <MenuItem key=\"server-xlsx\" disabled={exporting} onClick={onXlsxExport}>\n <TableViewIcon fontSize=\"small\" style={{ marginRight: 8 }} />\n Exportar Excel (todos os dados)\n </MenuItem>\n )}\n </GridToolbarExportContainer>\n </GridToolbarContainer>\n );\n}\n\nconst CHAR_WIDTH_PX = 11;\nconst HEADER_PADDING_PX = 30;\nconst MIN_COL_WIDTH = 80;\n\nfunction estimateHeaderWidth(label: string): number {\n return Math.max(MIN_COL_WIDTH, label.length * CHAR_WIDTH_PX + HEADER_PADDING_PX);\n}\n\nfunction toGridColumns(columns: DataTableColumn[], autoFitHeaders: boolean): GridColDef[] {\n return columns.map((col) => {\n const formatter = resolveFormatter(col.format);\n const label = col.label ?? col.field;\n const baseMinWidth = col.minWidth ?? MIN_COL_WIDTH;\n const minWidth = autoFitHeaders ? Math.max(baseMinWidth, estimateHeaderWidth(label)) : baseMinWidth;\n\n const def: GridColDef = {\n field: col.field,\n headerName: label,\n align: col.align,\n headerAlign: col.align,\n headerClassName: col.headerClassName ?? 'bi-datatable--header',\n width: col.width,\n minWidth,\n sortable: col.sortable !== false,\n filterable: col.filterable !== false,\n flex: col.width ? undefined : 1,\n cellClassName: col.cellClassName,\n renderCell: col.renderCell,\n renderHeader: col.renderHeader,\n };\n if (formatter) def.valueFormatter = (value: unknown) => formatter(value);\n if (col.type === 'singleSelect') {\n const selectDef = def as unknown as { type: string; valueOptions: unknown; filterOperators?: GridFilterOperator[] };\n selectDef.type = 'singleSelect';\n selectDef.valueOptions = col.valueOptions;\n if (col.multiSelectDropdown) {\n selectDef.filterOperators = getGridSingleSelectOperators().filter((op: GridFilterOperator) => op.value === 'isAnyOf');\n }\n }\n return def;\n });\n}\n\ntype ExportNotice = { kind: 'progress' | 'success' | 'error'; message: string } | null;\n\nexport function DataTableCard<TModel extends Record<string, any>>({\n data,\n lazyData,\n schema,\n getRowClassName,\n title,\n striped,\n stripedColorEven,\n stripedColorOdd,\n getRowHeight,\n headerColor,\n pageSize,\n dense = true,\n loading = false,\n autoFitHeaders = true,\n initialPinnedColumns,\n}: DataTableCardProps<TModel>) {\n const theme = useTheme();\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const isLazy = !!lazyData;\n\n useEffect(() => { warnIfMuiXLicenseMissing(); }, []);\n\n if (data && lazyData) {\n console.warn('[DataTableCard] Both `data` and `lazyData` were provided. These props are mutually exclusive. Using `lazyData` and ignoring `data`.');\n }\n\n const initialPageSize = pageSize ?? (isLazy ? 50 : 20);\n const [paginationModel, setPaginationModel] = useState({ page: 0, pageSize: initialPageSize });\n\n const columns: DataTableColumn<TModel>[] = useMemo(() => {\n const source = schema ?? lazyData?.columnSchema ?? data?.columnSchema;\n return source ? (source.build() as DataTableColumn<TModel>[]) : [];\n }, [schema, data?.columnSchema, lazyData?.columnSchema]);\n\n // `dataSource` must be a stable reference or the grid re-fetches forever.\n const lazyGetRows = lazyData?.getRows;\n const dataSource = useMemo(() => (lazyGetRows ? { getRows: lazyGetRows } : undefined), [lazyGetRows]);\n\n const { naked } = useChartContext() ?? {};\n const multiplier = naked ? 1 : 0.9;\n const containerHeight = useContainerMeasurements({ containerRef, multiplier, naked, minHeight: 300 });\n\n const gridColumns = useMemo(() => toGridColumns(columns, autoFitHeaders), [columns, autoFitHeaders]);\n\n const downloadCsv = lazyData?.downloadCsv;\n const downloadXlsx = lazyData?.downloadXlsx;\n const isExporting = lazyData?.exporting ?? false;\n\n // Export feedback through a self-contained MUI Snackbar (the legacy card\n // used notistack, which would have been another peer).\n const [notice, setNotice] = useState<ExportNotice>(null);\n\n const runExport = React.useCallback(\n async (format: 'csv' | 'xlsx') => {\n const fn = format === 'xlsx' ? downloadXlsx : downloadCsv;\n if (!fn) return;\n const formatLabel = format === 'xlsx' ? 'Excel' : 'CSV';\n setNotice({ kind: 'progress', message: `Exportando ${formatLabel}…` });\n try {\n await fn();\n setNotice({ kind: 'success', message: `${formatLabel} exportado com sucesso` });\n } catch (err) {\n console.error(`[DataTableCard] ${formatLabel} export failed`, err);\n setNotice({ kind: 'error', message: err instanceof Error ? err.message : `Falha ao exportar ${formatLabel}` });\n }\n },\n [downloadCsv, downloadXlsx],\n );\n\n const onCsvExport = useMemo(() => (downloadCsv ? () => runExport('csv') : undefined), [downloadCsv, runExport]);\n const onXlsxExport = useMemo(() => (downloadXlsx ? () => runExport('xlsx') : undefined), [downloadXlsx, runExport]);\n\n const lazyApiRef = lazyData?.apiRef;\n const onClearFilters = useMemo(\n () => (lazyApiRef ? () => lazyApiRef.current?.setFilterModel({ items: [], quickFilterValues: [] }) : undefined),\n [lazyApiRef],\n );\n\n const toolbarSlotProps: ServerExportToolbarProps | undefined = useMemo(() => {\n if (!onCsvExport && !onXlsxExport && !onClearFilters) return undefined;\n return { onCsvExport, onXlsxExport, onClearFilters, exporting: isExporting };\n }, [onCsvExport, onXlsxExport, onClearFilters, isExporting]);\n\n // Consumed ONCE by DataGridPro on mount (\"seed, then user controls\").\n const initialState = useMemo(() => {\n const state: Record<string, unknown> = { density: dense ? 'compact' : 'standard' };\n if (initialPinnedColumns) state.pinnedColumns = initialPinnedColumns;\n return state;\n }, []);\n\n const rows: GridValidRowModel[] = useMemo(() => {\n if (!data) return [];\n return (data.rows as Record<string, unknown>[]).map((row, i) => ({ id: i, ...row }));\n }, [data]);\n\n const evenStripe = stripedColorEven ?? theme.palette.action.hover;\n const oddStripe = stripedColorOdd ?? 'transparent';\n const headerBg = headerColor ?? alpha(theme.palette.primary.main, theme.palette.mode === 'dark' ? 0.24 : 0.1);\n\n return (\n <Box data-testid={loading ? 'loading' : ''} sx={{ width: '100%', height: '100%', p: dense ? 1 : 2, display: 'flex', flexDirection: 'column', overflow: 'auto' }} ref={containerRef}>\n {title && naked && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <Box\n sx={{\n overflow: 'auto',\n height: `${containerHeight}px`,\n '& .bi-datatable-row-even': { backgroundColor: evenStripe },\n '& .bi-datatable-row-odd': { backgroundColor: oddStripe },\n }}\n >\n <DataGridPro\n {...(isLazy\n ? {\n apiRef: lazyData!.apiRef,\n dataSource,\n onDataSourceError: lazyData!.onError,\n loading: lazyData!.loading || loading,\n }\n : { rows, loading })}\n initialState={initialState}\n showToolbar={!!toolbarSlotProps}\n slots={toolbarSlotProps ? { toolbar: ServerExportToolbar as any } : undefined}\n getRowHeight={getRowHeight}\n columns={gridColumns}\n getRowClassName={(params) => {\n let result = getRowClassName ? getRowClassName(params) : '';\n if (result.length > 0) result += ' ';\n if (striped) result += params.indexRelativeToCurrentPage % 2 === 0 ? 'bi-datatable-row-even' : 'bi-datatable-row-odd';\n return result;\n }}\n disableRowSelectionOnClick\n filterDebounceMs={300}\n pagination\n paginationModel={paginationModel}\n pageSizeOptions={[20, 35, 50, 100]}\n onPaginationModelChange={setPaginationModel}\n slotProps={{\n baseIconButton: { style: { backgroundColor: 'transparent' } },\n ...(toolbarSlotProps ? { toolbar: toolbarSlotProps as any } : {}),\n }}\n sx={{\n fontSize: '14px',\n maxHeight: '100%',\n border: 'none',\n color: 'text.primary',\n [`& .${gridClasses.columnSeparator}`]: { color: 'divider' },\n [`& .${gridClasses.sortIcon}`]: { color: 'text.primary' },\n '& .bi-datatable--header': { backgroundColor: headerBg },\n '& .MuiDataGrid-columnHeaders': { borderColor: 'divider' },\n '& .MuiDataGrid-cell': { borderColor: 'divider' },\n '& .MuiDataGrid-row:hover': { backgroundColor: 'action.selected' },\n '& .MuiDataGrid-footerContainer': { borderTop: 'none' },\n }}\n />\n </Box>\n\n <Snackbar\n open={notice !== null}\n autoHideDuration={notice?.kind === 'progress' ? null : notice?.kind === 'error' ? 6000 : 3000}\n onClose={() => setNotice(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n >\n <Alert\n onClose={() => setNotice(null)}\n severity={notice?.kind === 'error' ? 'error' : notice?.kind === 'success' ? 'success' : 'info'}\n icon={notice?.kind === 'progress' ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n variant=\"outlined\"\n sx={{ bgcolor: 'background.paper' }}\n >\n {notice?.message}\n </Alert>\n </Snackbar>\n </Box>\n );\n}\n\nfunction useContainerMeasurements({ containerRef, multiplier = 1, naked, minHeight = 200 }: {\n containerRef: React.RefObject<HTMLElement | null>;\n multiplier: number;\n naked: boolean | undefined;\n minHeight: number;\n}) {\n const [containerHeight, setContainerHeight] = useState(minHeight);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const getParentGridCard = (element: HTMLElement | null): HTMLElement | null => {\n if (element?.parentElement == null) return null;\n if (element?.classList.contains('ds-card')) return element;\n return getParentGridCard(element?.parentElement ?? null);\n };\n\n useEffect(() => {\n const refElement = containerRef.current;\n if (!refElement || typeof ResizeObserver === 'undefined') return;\n const target = getParentGridCard(refElement);\n\n const observer = new ResizeObserver((entries) => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n const height = Math.floor(entries[0].contentRect.height) * multiplier;\n timeoutRef.current = setTimeout(() => {\n setContainerHeight(() => height);\n timeoutRef.current = null;\n }, 50);\n });\n if (target) observer.observe(target);\n\n if (containerHeight !== 200 && target) {\n setContainerHeight((prev) => prev * multiplier);\n }\n\n return () => observer.disconnect();\n }, [containerRef?.current, naked, multiplier]);\n\n return containerHeight;\n}\n\nexport default DataTableCard;\n","import React, { useMemo, useRef, useState } from 'react';\nimport { Box, Skeleton, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport {\n ResponsiveContainer, CartesianGrid, Tooltip, Legend,\n LineChart, Line,\n BarChart, Bar,\n AreaChart, Area,\n PieChart, Pie, Cell,\n ScatterChart, Scatter,\n ComposedChart,\n XAxis, YAxis,\n} from 'recharts';\nimport type { PieLabelRenderProps } from 'recharts';\nimport type { DataResult } from '../data/dataUtils';\nimport { formatCompact, formatDate } from '../data/dataUtils';\nimport { useChartCardDefaults } from '../data/ChartCardDefaultsContext';\nimport { resolveBiPalette } from '../theme/createBiTheme';\nimport { useChartContext } from '../grid/ChartContext';\nimport { useContainerRectangle } from './useContainerRectangle';\n\n// ─── Types ───────────────────────────────────────────────────\n\nexport interface ChartSeries {\n dataKey: string;\n name?: string;\n color?: string;\n type?: 'line' | 'bar' | 'area';\n}\n\nexport type ChartType = 'line' | 'bar' | 'barH' | 'barV' | 'donut' | 'pie' | 'scatter' | 'area' | 'stackedArea' | 'stackedBar' | 'combo';\n\ntype DomainValue = number | 'auto' | 'dataMin' | 'dataMax';\n\nexport interface AxisConfig {\n hide?: boolean;\n label?: string;\n tickAngle?: number;\n tickCount?: number;\n interval?: number | 'preserveStart' | 'preserveEnd' | 'preserveStartEnd';\n tickSize?: number;\n tickLine?: boolean;\n axisLine?: boolean;\n domain?: [DomainValue, DomainValue];\n unit?: string;\n reversed?: boolean;\n fontSize?: number;\n color?: string;\n width?: number;\n height?: number;\n scale?: 'auto' | 'linear' | 'pow' | 'sqrt' | 'log' | 'time' | 'band' | 'point';\n}\n\nexport interface ChartCardProps<TModel extends Record<string, any> = Record<string, any>> {\n data?: DataResult<TModel> | null;\n type: ChartType;\n xAxis?: string;\n series: ChartSeries[];\n title?: string;\n height?: number;\n stacked?: boolean;\n showLegend?: boolean;\n showGrid?: boolean;\n showTooltip?: boolean;\n formatXAxis?: (value: unknown) => string;\n formatYAxis?: (value: number) => string;\n xAxisConfig?: AxisConfig;\n yAxisConfig?: AxisConfig;\n loading?: boolean;\n /** Max visible slices for pie/donut charts. Smaller slices are grouped into \"Others\". Default 4. */\n maxSlices?: number;\n /** Overrides the palette from chartDefaults / the theme when set. */\n palette?: string[];\n /** Background colour of the chart container (a theme token string is fine). */\n backgroundColor?: string;\n /** Colour of the grid lines; defaults to a translucent `text.primary`. */\n gridColor?: string;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────\n\nfunction defaultXFormatter(v: unknown): string {\n if (v instanceof Date) return formatDate(v, 'MM/DD');\n return String(v ?? '');\n}\n\n/**\n * Modulates the alpha of `baseColor` by `index/total`, returning a colour in\n * `[minAlpha, maxAlpha]`. Used to render mono-shaded bars / slices where every\n * mark shares one hue but varies in intensity. Built on MUI's `alpha()`, so it\n * accepts hex, functional and keyword CSS colours alike.\n */\nexport function chartShade(baseColor: string, index: number, total: number, minAlpha = 0.25, maxAlpha = 1): string {\n if (total <= 1) return baseColor;\n const t = index / Math.max(1, total - 1);\n const a = minAlpha + (maxAlpha - minAlpha) * t;\n try {\n return alpha(baseColor, a);\n } catch {\n return baseColor;\n }\n}\n\n// ─── Component ───────────────────────────────────────────────\n\nexport function ChartCard<TModel extends Record<string, any> = Record<string, any>>({\n data,\n type,\n xAxis,\n series,\n title,\n height = 300,\n stacked = false,\n showLegend = true,\n showGrid = true,\n showTooltip = true,\n formatXAxis,\n formatYAxis,\n xAxisConfig,\n yAxisConfig,\n loading = false,\n maxSlices = 4,\n palette: paletteOverride,\n backgroundColor,\n gridColor: gridColorOverride,\n}: ChartCardProps<TModel>) {\n const theme = useTheme();\n const { naked } = useChartContext() ?? {};\n\n const rows = !data ? [] : Array.isArray(data) ? (data as Record<string, unknown>[]) : data.rows;\n const chartData: Record<string, unknown>[] = useMemo(() => {\n if (!xAxis) return rows;\n return rows.map((row) => ({\n ...row,\n __xLabel: (formatXAxis ?? defaultXFormatter)(row[xAxis]),\n }));\n }, [rows, xAxis, formatXAxis]);\n\n const fmtY = formatYAxis ?? ((v: number) => formatCompact(v, 0));\n const axisColor = theme.palette.text.secondary;\n const gridColor = gridColorOverride ?? alpha(theme.palette.text.primary, 0.12);\n const xKey = xAxis ? '__xLabel' : undefined;\n\n const resolveAxisProps = (cfg: AxisConfig | undefined, defaults: Record<string, unknown>) => {\n if (!cfg) return defaults;\n const props: Record<string, unknown> = { ...defaults };\n const tickFill = cfg.color ?? (defaults.tick as Record<string, unknown>)?.fill ?? axisColor;\n const tickFs = cfg.fontSize ?? (defaults.tick as Record<string, unknown>)?.fontSize ?? 12;\n props.tick = { fill: tickFill, fontSize: tickFs };\n if (cfg.hide !== undefined) props.hide = cfg.hide;\n if (cfg.label !== undefined) props.label = { value: cfg.label, position: 'insideBottom', offset: -4, fill: tickFill, fontSize: tickFs };\n if (cfg.tickAngle !== undefined) {\n (props.tick as Record<string, unknown>).angle = cfg.tickAngle;\n (props.tick as Record<string, unknown>).textAnchor = cfg.tickAngle < 0 ? 'end' : cfg.tickAngle > 0 ? 'start' : 'middle';\n }\n if (cfg.tickCount !== undefined) props.tickCount = cfg.tickCount;\n if (cfg.interval !== undefined) props.interval = cfg.interval;\n if (cfg.tickSize !== undefined) props.tickSize = cfg.tickSize;\n if (cfg.tickLine !== undefined) props.tickLine = cfg.tickLine;\n if (cfg.axisLine !== undefined) props.axisLine = cfg.axisLine;\n if (cfg.domain) props.domain = cfg.domain;\n if (cfg.unit !== undefined) props.unit = cfg.unit;\n if (cfg.reversed !== undefined) props.reversed = cfg.reversed;\n if (cfg.width !== undefined) props.width = cfg.width;\n if (cfg.height !== undefined) props.height = cfg.height;\n if (cfg.scale !== undefined) props.scale = cfg.scale;\n return props;\n };\n\n const MAX_LENGTH_LABEL = 10;\n const truncateLabel = (label: string) => (label.length > MAX_LENGTH_LABEL ? label.slice(0, MAX_LENGTH_LABEL) : label);\n\n const tooltipStyle = {\n contentStyle: {\n background: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n color: theme.palette.text.primary,\n },\n itemStyle: { color: theme.palette.text.primary },\n labelStyle: { color: axisColor },\n // Recharts' default cursor is a hard-coded light grey overlay; give it\n // both `fill` (BarChart hover rectangle) and `stroke` (Line/Area\n // crosshair) from the theme so it belongs to either canvas.\n cursor: {\n fill: theme.palette.action.hover,\n stroke: theme.palette.action.selected,\n strokeWidth: 1,\n },\n };\n\n // Palette resolution: prop → ChartCardDefaults → theme.palette.bi.series.\n const chartDefaults = useChartCardDefaults();\n const palette = paletteOverride ?? chartDefaults.palette ?? resolveBiPalette(theme).series;\n const monoShade = chartDefaults.monoShadePerCategory ?? true;\n const rotateBase = (chartDefaults.rotateBasePerChart ?? true) && palette.length > 0;\n\n const [slotIndex] = useState<number>(() => (rotateBase ? (chartDefaults.allocateChartSlot?.() ?? 0) : 0));\n const pickPaletteColor = (i: number) => palette[((rotateBase ? slotIndex : 0) + i) % palette.length];\n\n const RADIAN = Math.PI / 180;\n const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, fill }: PieLabelRenderProps & { fill?: string }) => {\n if (cx == null || cy == null || innerRadius == null || outerRadius == null) return null;\n const radius = (innerRadius as number) + ((outerRadius as number) - (innerRadius as number)) * 0.5;\n const ncx = Number(cx);\n const x = ncx + radius * Math.cos(-(midAngle ?? 0) * RADIAN);\n const ncy = Number(cy);\n const y = ncy + radius * Math.sin(-(midAngle ?? 0) * RADIAN);\n let labelFill = theme.palette.text.primary;\n if (fill) {\n try { labelFill = theme.palette.getContrastText(fill); } catch { /* keep text.primary */ }\n }\n return (\n <text x={x} y={y} fill={labelFill} fontSize={14} textAnchor={x > ncx ? 'start' : 'end'} dominantBaseline=\"central\">\n {`${((percent ?? 1) * 100).toFixed(0)}%`}\n </text>\n );\n };\n\n const seriesColors = series.map((s, i) => s.color ?? pickPaletteColor(i));\n const useMonoShadeBars = monoShade && series.length === 1;\n\n const pieData = useMemo(() => {\n if (type !== 'pie' && type !== 'donut') return [];\n const raw = chartData.map((row, i) => ({\n name: truncateLabel(xKey ? String(row[xKey] ?? row[xAxis!] ?? i) : `#${i}`),\n value: Number(series[0] ? row[series[0].dataKey] : 0) || 0,\n }));\n if (raw.length <= maxSlices) return raw;\n const sorted = [...raw].sort((a, b) => b.value - a.value);\n const top = sorted.slice(0, maxSlices - 1);\n const othersTotal = sorted.slice(maxSlices - 1).reduce((sum, d) => sum + d.value, 0);\n return [...top, { name: 'Others', value: othersTotal }];\n }, [type, chartData, xKey, xAxis, series, maxSlices]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [, containerHeight] = useContainerRectangle(containerRef);\n\n if (loading || !data) {\n const isPie = type === 'pie' || type === 'donut';\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2, width: '100%', backgroundColor }}>\n {title && naked && <Skeleton variant=\"text\" width={180} sx={{ fontSize: '1.25rem', mb: 1 }} />}\n {isPie ? (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height }}>\n <Skeleton variant=\"circular\" width={Math.min(height * 0.7, 200)} height={Math.min(height * 0.7, 200)} />\n </Box>\n ) : (\n <Skeleton variant=\"rounded\" width=\"100%\" height={height} />\n )}\n </Box>\n );\n }\n\n // ─── Pie / Donut ─────────────────────────────────────────\n if (type === 'pie' || type === 'donut') {\n return (\n <Box ref={containerRef} sx={{ height: '100%', width: '100%', px: 0, backgroundColor }}>\n {title && naked && <Typography variant=\"h6\" sx={{ mb: 0.5 }}>{title}</Typography>}\n <ResponsiveContainer width=\"100%\" height={containerHeight || height}>\n <PieChart>\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={type === 'donut' ? '50%' : 0}\n outerRadius=\"70%\"\n label={renderCustomizedLabel}\n labelLine={false}\n paddingAngle={1}\n >\n {pieData.map((_, i) => (\n <Cell\n key={i}\n fill={monoShade && pieData.length > 1 ? chartShade(pickPaletteColor(0), i, pieData.length) : pickPaletteColor(i)}\n />\n ))}\n {showTooltip && <Tooltip {...tooltipStyle} />}\n </Pie>\n <Legend wrapperStyle={{ color: theme.palette.text.secondary }} />\n </PieChart>\n </ResponsiveContainer>\n </Box>\n );\n }\n\n // ─── Scatter ─────────────────────────────────────────────\n if (type === 'scatter') {\n return (\n <Box sx={{ height: '100%', p: 0, backgroundColor }}>\n {title && naked && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 8, right: 16, bottom: xAxisConfig?.tickAngle ? 24 : 8, left: 0 }}>\n {showGrid && <CartesianGrid stroke={gridColor} />}\n <XAxis dataKey={xAxis} name={xAxis} {...resolveAxisProps(xAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n <YAxis dataKey={series[0]?.dataKey} tickFormatter={fmtY} name={series[0]?.name} {...resolveAxisProps(yAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n {showTooltip && <Tooltip {...tooltipStyle} />}\n {showLegend && <Legend wrapperStyle={{ color: theme.palette.text.secondary }} />}\n {series.map((s, i) => (\n <Scatter key={s.dataKey} name={s.name ?? s.dataKey} data={chartData} fill={seriesColors[i]} />\n ))}\n </ScatterChart>\n </ResponsiveContainer>\n </Box>\n );\n }\n\n // ─── Cartesian ───────────────────────────────────────────\n const chartType: ChartType = type === 'bar' ? 'barH' : type;\n const isHorizontal = chartType === 'barH';\n const forceStacked = chartType === 'stackedArea' || chartType === 'stackedBar';\n\n const ChartComp = chartType === 'combo' ? ComposedChart\n : chartType === 'barH' || chartType === 'barV' || chartType === 'stackedBar' ? BarChart\n : chartType === 'area' || chartType === 'stackedArea' ? AreaChart\n : LineChart;\n\n const layout = isHorizontal ? ('vertical' as const) : ('horizontal' as const);\n const effectiveStacked = stacked || forceStacked;\n\n const resolveSeriesType = (s: ChartSeries): 'line' | 'bar' | 'area' => {\n if (s.type) return s.type;\n if (chartType === 'combo') return 'bar';\n if (chartType === 'barV' || chartType === 'barH' || chartType === 'stackedBar') return 'bar';\n if (chartType === 'area' || chartType === 'stackedArea') return 'area';\n return 'line';\n };\n\n return (\n <Box sx={{ height: '100%', p: 0.3, backgroundColor }} ref={containerRef}>\n {title && naked && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <ChartComp data={chartData} layout={layout} margin={{ top: 0, right: 16, bottom: xAxisConfig?.tickAngle ? 24 : 8, left: 0 }} style={{ maxHeight: '95%' }}>\n {showGrid && <CartesianGrid stroke={gridColor} strokeDasharray=\"3 3\" />}\n\n {isHorizontal ? (\n <>\n <XAxis type=\"number\" tickFormatter={fmtY} {...resolveAxisProps(xAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n <YAxis type=\"category\" dataKey={xKey ?? xAxis} {...resolveAxisProps(yAxisConfig, { tick: { fill: axisColor, fontSize: 12 }, width: 80 })} />\n </>\n ) : (\n <>\n <XAxis dataKey={xKey ?? xAxis} {...resolveAxisProps(xAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n <YAxis tickFormatter={fmtY} {...resolveAxisProps(yAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n </>\n )}\n\n {showTooltip && <Tooltip {...tooltipStyle} />}\n {showLegend && <Legend wrapperStyle={{ color: theme.palette.text.secondary }} />}\n\n {series.map((s, i) => {\n const color = seriesColors[i];\n const seriesType = resolveSeriesType(s);\n\n if (seriesType === 'bar') {\n return (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.name ?? s.dataKey}\n fill={color}\n stackId={effectiveStacked ? 'stack' : undefined}\n radius={isHorizontal ? [0, 4, 4, 0] : [4, 4, 0, 0]}\n maxBarSize={24}\n >\n {useMonoShadeBars && chartData.map((_, ri) => (\n // Bars are typically sorted descending, so invert the shade\n // index: the largest bar gets the strongest alpha.\n <Cell key={ri} fill={chartShade(color, chartData.length - 1 - ri, chartData.length)} />\n ))}\n </Bar>\n );\n }\n if (seriesType === 'area') {\n return (\n <Area\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n name={s.name ?? s.dataKey}\n stroke={color}\n fill={color}\n fillOpacity={effectiveStacked ? 0.6 : 0.15}\n stackId={effectiveStacked ? 'stack' : undefined}\n strokeWidth={2}\n />\n );\n }\n return (\n <Line key={s.dataKey} type=\"monotone\" dataKey={s.dataKey} name={s.name ?? s.dataKey} stroke={color} strokeWidth={2} dot={false} activeDot={{ r: 4 }} />\n );\n })}\n </ChartComp>\n </ResponsiveContainer>\n </Box>\n );\n}\n\nexport default ChartCard;\n","import React, { useMemo } from 'react';\nimport { Box, Skeleton, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport { ResponsiveContainer, Treemap } from 'recharts';\nimport type { DataResult } from '../data/dataUtils';\nimport { formatCompact } from '../data/dataUtils';\nimport { resolveBiPalette } from '../theme/createBiTheme';\n\nexport interface TreeMapCardProps<TModel extends Record<string, any> = Record<string, any>> {\n data?: DataResult<TModel> | null;\n nameKey: keyof TModel & string;\n valueKey: keyof TModel & string;\n title?: string;\n height?: number;\n formatValue?: (value: number) => string;\n loading?: boolean;\n /** Overrides `theme.palette.bi.series`. */\n palette?: readonly string[];\n}\n\ninterface TreeNode {\n name: string;\n size: number;\n fill: string;\n // recharts 3 types `Treemap`'s `data` as `readonly TreemapDataType[]`, which carries a string index\n // signature; recharts 2 constrains it to nothing. Declaring one here typechecks against BOTH majors\n // (see the `recharts` peer range) and costs nothing at runtime — every field a node actually holds is\n // already a string or a number.\n [key: string]: string | number;\n}\n\nfunction CustomContent(props: {\n x?: number; y?: number; width?: number; height?: number;\n name?: string; size?: number; fill?: string;\n formatValue?: (v: number) => string;\n strokeColor: string;\n labelFor: (fill: string) => string;\n}) {\n const { x = 0, y = 0, width = 0, height = 0, name, size, fill, strokeColor, labelFor } = props;\n const fmt = props.formatValue ?? formatCompact;\n if (width < 20 || height < 20) return null;\n const labelColor = fill ? labelFor(fill) : strokeColor;\n\n return (\n <g>\n <rect x={x} y={y} width={width} height={height} rx={4} fill={fill} stroke={strokeColor} strokeWidth={1} />\n {width > 50 && height > 30 && (\n <>\n <text x={x + 6} y={y + 16} fill={labelColor} fontSize={12} fontWeight={600}>\n {(name ?? '').length > width / 7 ? (name ?? '').slice(0, Math.floor(width / 7)) + '…' : name}\n </text>\n {height > 44 && (\n <text x={x + 6} y={y + 32} fill={alpha(labelColor, 0.7)} fontSize={11}>\n {fmt(size ?? 0)}\n </text>\n )}\n </>\n )}\n </g>\n );\n}\n\nexport function TreeMapCard<TModel extends Record<string, any> = Record<string, any>>({\n data,\n nameKey,\n valueKey,\n title,\n height = 300,\n formatValue,\n loading = false,\n palette: paletteOverride,\n}: TreeMapCardProps<TModel>) {\n const theme = useTheme();\n const palette = paletteOverride ?? resolveBiPalette(theme).series;\n\n const treeData: TreeNode[] = useMemo(() => {\n if (!data) return [];\n return (data.rows as Record<string, unknown>[]).map((row, i) => ({\n name: String(row[nameKey] ?? ''),\n size: Math.max(0, Number(row[valueKey]) || 0),\n fill: palette[i % palette.length],\n }));\n }, [data, nameKey, valueKey, palette]);\n\n const labelFor = (fill: string) => {\n try { return theme.palette.getContrastText(fill); } catch { return theme.palette.text.primary; }\n };\n\n if (loading || !data) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n {title && <Skeleton variant=\"text\" width={180} sx={{ fontSize: '1.25rem', mb: 1 }} />}\n <Skeleton variant=\"rounded\" width=\"100%\" height={height} />\n </Box>\n );\n }\n\n return (\n <Box sx={{ height: '100%', p: 2 }}>\n {title && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n {treeData.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">No data</Typography>\n ) : (\n <ResponsiveContainer width=\"100%\" height={height}>\n <Treemap\n data={treeData}\n dataKey=\"size\"\n nameKey=\"name\"\n stroke={theme.palette.background.paper}\n content={<CustomContent formatValue={formatValue} strokeColor={theme.palette.background.paper} labelFor={labelFor} />}\n />\n </ResponsiveContainer>\n )}\n </Box>\n );\n}\n\nexport default TreeMapCard;\n","// Map projection helpers shared by MapBubblesCard and MapConnectionsCard.\n// Geography layer URLs live in `./geoLayers.ts`.\n\nexport const BASE_SCALE = 150;\n\nconst BASE_LNG_SPAN = 300;\nconst BASE_LAT_SPAN = 140;\n\nexport interface MapViewport {\n center: [number, number];\n zoom: number;\n}\n\n/**\n * Computes the projection center and zoom multiplier to best fit a set of\n * coordinates.\n *\n * Priority:\n * 1. Both `center` and `defaultZoom` provided → use them directly.\n * 2. `autoFit` enabled (default) → derive center/zoom from coordinates.\n * 3. `defaultZoom` only → derive center from data, apply the given zoom.\n * 4. `center` only → use it, derive zoom from data.\n */\nexport function computeMapViewport(\n coords: { lat: number; lng: number }[],\n opts: {\n autoFit?: boolean;\n defaultZoom?: number;\n center?: [number, number];\n } = {},\n): MapViewport {\n const { autoFit = true, defaultZoom, center: userCenter } = opts;\n\n if (userCenter && defaultZoom != null) {\n return { center: userCenter, zoom: defaultZoom };\n }\n\n if (!autoFit || coords.length === 0) {\n return {\n center: userCenter ?? [0, 20],\n zoom: defaultZoom ?? 1,\n };\n }\n\n const lats = coords.map(c => c.lat);\n const lngs = coords.map(c => c.lng);\n\n const minLat = Math.min(...lats);\n const maxLat = Math.max(...lats);\n const minLng = Math.min(...lngs);\n const maxLng = Math.max(...lngs);\n\n const center: [number, number] = userCenter ?? [\n (minLng + maxLng) / 2,\n (minLat + maxLat) / 2,\n ];\n\n if (defaultZoom != null) {\n return { center, zoom: defaultZoom };\n }\n\n if (coords.length === 1) {\n return { center, zoom: 4 };\n }\n\n const padding = 1.5;\n const latSpan = Math.max(maxLat - minLat, 5) * padding;\n const lngSpan = Math.max(maxLng - minLng, 5) * padding;\n\n const zoomByLat = BASE_LAT_SPAN / latSpan;\n const zoomByLng = BASE_LNG_SPAN / lngSpan;\n const zoom = Math.max(1, Math.min(zoomByLat, zoomByLng, 20));\n\n return { center, zoom };\n}\n","import { createContext, useContext } from 'react';\n\n/** World countries (world-atlas, ~110 m). */\nexport const GEO_URL_WORLD = 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json';\n\n/** IBGE — Brazilian states at maximum quality (~1 MB). */\nexport const GEO_URL_BRAZIL_STATES =\n 'https://servicodados.ibge.gov.br/api/v3/malhas/paises/BR?formato=application/vnd.geo+json&qualidade=maxima&intrarregiao=UF';\n\n/** IBGE — Brazilian municipalities at minimum quality (~3.5 MB). Use sparingly. */\nexport const GEO_URL_BRAZIL_MUNICIPALITIES =\n 'https://servicodados.ibge.gov.br/api/v3/malhas/paises/BR?formato=application/vnd.geo+json&qualidade=minima&intrarregiao=municipio';\n\n/**\n * The layer set the legacy app used everywhere: world countries as the base\n * fill + Brazilian state boundaries as an overlay. Exported as a *named*\n * default a host opts into (`<GeoLayersProvider layers={brazilGeoLayers}>`\n * or `geoUrl={brazilGeoLayers}`); the cards' built-in default is the world\n * base alone.\n */\nexport const brazilGeoLayers: readonly string[] = [GEO_URL_WORLD, GEO_URL_BRAZIL_STATES];\n\n/** Cards' built-in default when neither a prop nor a provider sets layers. */\nexport const worldGeoLayers: readonly string[] = [GEO_URL_WORLD];\n\nconst GeoLayersContext = createContext<readonly string[] | null>(null);\n\n/** Sets the geography layer URLs for every map card in a subtree. */\nexport const GeoLayersProvider = GeoLayersContext.Provider;\n\n/**\n * Resolves the layers for a map card: explicit prop → nearest provider →\n * {@link worldGeoLayers}.\n */\nexport function useGeoLayers(override?: string | readonly string[]): readonly string[] {\n const fromContext = useContext(GeoLayersContext);\n if (override !== undefined) return Array.isArray(override) ? (override as readonly string[]) : [override as string];\n return fromContext ?? worldGeoLayers;\n}\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { Box, Skeleton, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport { ComposableMap, Geographies, Geography, Marker, ZoomableGroup, useZoomPanContext } from 'react-simple-maps';\nimport { formatCompact } from '../data/dataUtils';\nimport { BASE_SCALE, computeMapViewport } from './mapUtils';\nimport { useGeoLayers } from './geoLayers';\nimport { resolveBiPalette } from '../theme/createBiTheme';\n\nexport interface MapBubble {\n lat: number;\n lng: number;\n value: number;\n label?: string;\n}\n\nexport interface MapBubblesProps {\n data?: { rows: MapBubble[] };\n title?: string;\n height?: number;\n minBubbleSize?: number;\n maxBubbleSize?: number;\n /** Bubble colour; defaults to the first BI series colour. */\n color?: string;\n formatValue?: (value: number) => string;\n loading?: boolean;\n /** Zoom multiplier (1 = whole world). Overrides auto-fit zoom when set. */\n defaultZoom?: number;\n /** Map center as [longitude, latitude]. Overrides auto-fit center when set. */\n center?: [number, number];\n /** When true (default), automatically centers and zooms to fit all bubbles. */\n autoFit?: boolean;\n /**\n * Geography topology URL(s). The first layer is the base (filled); further\n * layers render as boundary overlays. Defaults to the nearest\n * `GeoLayersProvider`, else the world base layer (`worldGeoLayers`).\n * Pass `brazilGeoLayers` for the legacy world + Brazil-states pair.\n */\n geoUrl?: string | readonly string[];\n}\n\nfunction BubbleMarkers({ bubbles, maxVal, minBubbleSize, maxBubbleSize, fillColor, fmt, onHover, onLeave }: {\n bubbles: MapBubble[];\n maxVal: number;\n minBubbleSize: number;\n maxBubbleSize: number;\n fillColor: string;\n fmt: (v: number) => string;\n onHover: (e: React.MouseEvent, text: string) => void;\n onLeave: () => void;\n}) {\n const { k } = useZoomPanContext();\n return (\n <>\n {bubbles.map((b, i) => {\n const ratio = Math.abs(b.value) / maxVal;\n const r = minBubbleSize + ratio * (maxBubbleSize - minBubbleSize);\n const label = `${b.label ?? ''} ${fmt(b.value)}`.trim();\n return (\n <Marker key={i} coordinates={[b.lng, b.lat]}>\n <g transform={`scale(${1 / k})`} style={{ cursor: 'pointer' }} onMouseEnter={(e) => onHover(e, label)} onMouseMove={(e) => onHover(e, label)} onMouseLeave={onLeave}>\n <circle r={r} fill={fillColor} opacity={0.45} />\n <circle r={r * 0.6} fill={fillColor} opacity={0.85} />\n </g>\n </Marker>\n );\n })}\n </>\n );\n}\n\nexport function MapBubblesCard({\n data,\n title,\n height = 340,\n minBubbleSize = 4,\n maxBubbleSize = 28,\n color,\n formatValue,\n loading = false,\n defaultZoom,\n center: centerProp,\n autoFit = true,\n geoUrl,\n}: MapBubblesProps) {\n const theme = useTheme();\n const bubbles = data?.rows ?? [];\n const [tooltip, setTooltip] = useState<{ x: number; y: number; text: string } | null>(null);\n const fmt = formatValue ?? formatCompact;\n const fillColor = color ?? resolveBiPalette(theme).series[0];\n const layers = useGeoLayers(geoUrl);\n\n const landFill = alpha(theme.palette.text.primary, 0.06);\n const landHover = alpha(theme.palette.text.primary, 0.09);\n const landStroke = theme.palette.divider;\n const overlayStroke = theme.palette.text.disabled;\n\n const maxVal = useMemo(() => Math.max(1, ...bubbles.map((b) => Math.abs(b.value))), [bubbles]);\n const viewport = useMemo(() => computeMapViewport(bubbles, { autoFit, defaultZoom, center: centerProp }), [bubbles, autoFit, defaultZoom, centerProp]);\n\n const handleHover = useCallback((e: React.MouseEvent, text: string) => {\n const svg = (e.currentTarget as Element).closest('svg');\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n setTooltip({ x: e.clientX - rect.left, y: e.clientY - rect.top, text });\n }, []);\n const clearTooltip = useCallback(() => setTooltip(null), []);\n\n if (loading) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n {title && <Skeleton variant=\"text\" width={180} sx={{ fontSize: '1.25rem', mb: 1 }} />}\n <Skeleton variant=\"rounded\" width=\"100%\" height={height} />\n </Box>\n );\n }\n\n const noInteraction = { default: { outline: 'none' }, hover: { outline: 'none' }, pressed: { outline: 'none' } } as const;\n\n return (\n <Box sx={{ height: '100%', p: 0.5, overflow: 'auto' }}>\n {title && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <Box sx={{ position: 'relative' }}>\n <ComposableMap\n projection=\"geoMercator\"\n projectionConfig={{ scale: BASE_SCALE }}\n width={800}\n height={500}\n style={{ width: '100%', height: '100%', display: 'block', background: theme.palette.background.default, borderRadius: theme.shape.borderRadius }}\n >\n <ZoomableGroup center={viewport.center} zoom={viewport.zoom} minZoom={1} maxZoom={40}>\n {layers.map((url, idx) =>\n idx === 0 ? (\n <Geographies key={url} geography={url}>\n {({ geographies }) =>\n geographies.map((geo) => (\n <Geography key={geo.rsmKey} geography={geo} fill={landFill} stroke={landStroke} strokeWidth={0.5} style={{ ...noInteraction, hover: { outline: 'none', fill: landHover } }} />\n ))\n }\n </Geographies>\n ) : (\n <Geographies key={url} geography={url}>\n {({ geographies }) =>\n geographies.map((geo) => (\n <Geography key={geo.rsmKey} geography={geo} fill=\"none\" stroke={overlayStroke} strokeWidth={0.3} style={noInteraction} />\n ))\n }\n </Geographies>\n ),\n )}\n\n <BubbleMarkers bubbles={bubbles} maxVal={maxVal} minBubbleSize={minBubbleSize} maxBubbleSize={maxBubbleSize} fillColor={fillColor} fmt={fmt} onHover={handleHover} onLeave={clearTooltip} />\n </ZoomableGroup>\n </ComposableMap>\n\n {tooltip && (\n <Box\n sx={{\n position: 'absolute',\n left: tooltip.x,\n top: tooltip.y - 34,\n transform: 'translateX(-50%)',\n bgcolor: 'background.paper',\n color: 'text.primary',\n px: 1,\n py: 0.5,\n borderRadius: 1,\n fontSize: 12,\n pointerEvents: 'none',\n border: '1px solid',\n borderColor: 'divider',\n whiteSpace: 'nowrap',\n zIndex: 10,\n boxShadow: 2,\n }}\n >\n {tooltip.text}\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n\nexport default MapBubblesCard;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { Box, Skeleton, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport { ComposableMap, Geographies, Geography, Marker, ZoomableGroup, useMapContext, useZoomPanContext } from 'react-simple-maps';\nimport { formatCompact } from '../data/dataUtils';\nimport { BASE_SCALE, computeMapViewport } from './mapUtils';\nimport { useGeoLayers } from './geoLayers';\nimport { resolveBiPalette } from '../theme/createBiTheme';\n\nexport interface MapConnection {\n fromLat: number;\n fromLng: number;\n toLat: number;\n toLng: number;\n value?: number;\n label?: string;\n}\n\nexport interface MapConnectionsProps {\n data?: { rows: MapConnection[] };\n title?: string;\n height?: number;\n /** Arc colour; defaults to the second BI series colour. */\n color?: string;\n showEndpoints?: boolean;\n formatValue?: (value: number) => string;\n loading?: boolean;\n defaultZoom?: number;\n center?: [number, number];\n autoFit?: boolean;\n /** See `MapBubblesProps.geoUrl`. */\n geoUrl?: string | readonly string[];\n}\n\ninterface ProjectedConnection extends MapConnection {\n x1: number; y1: number; x2: number; y2: number;\n width: number;\n d: string;\n}\n\nfunction curvedPath(x1: number, y1: number, x2: number, y2: number): string {\n const mx = (x1 + x2) / 2;\n const my = Math.min(y1, y2) - Math.abs(x2 - x1) * 0.15;\n return `M${x1},${y1} Q${mx},${my} ${x2},${y2}`;\n}\n\nfunction ConnectionArcs({ connections, maxVal, strokeColor, hoveredIdx, onHover, onLeave }: {\n connections: MapConnection[];\n maxVal: number;\n strokeColor: string;\n hoveredIdx: number | null;\n onHover: (i: number, e: React.MouseEvent) => void;\n onLeave: () => void;\n}) {\n const { projection } = useMapContext();\n const { k } = useZoomPanContext();\n\n const lines = useMemo<ProjectedConnection[]>(\n () =>\n connections.map((c) => {\n const from = projection([c.fromLng, c.fromLat]);\n const to = projection([c.toLng, c.toLat]);\n const x1 = from?.[0] ?? 0;\n const y1 = from?.[1] ?? 0;\n const x2 = to?.[0] ?? 0;\n const y2 = to?.[1] ?? 0;\n const ratio = Math.abs(c.value ?? 1) / maxVal;\n const width = 1 + ratio * 3;\n return { ...c, x1, y1, x2, y2, width, d: curvedPath(x1, y1, x2, y2) };\n }),\n [connections, projection, maxVal],\n );\n\n return (\n <g>\n {lines.map((ln, i) => (\n <g key={i} onMouseEnter={(e) => onHover(i, e)} onMouseMove={(e) => onHover(i, e)} onMouseLeave={onLeave} style={{ cursor: 'pointer' }}>\n <path d={ln.d} fill=\"none\" stroke=\"transparent\" strokeWidth={(ln.width + 8) / k} />\n <path d={ln.d} fill=\"none\" stroke={strokeColor} strokeWidth={ln.width / k} opacity={hoveredIdx === i ? 0.9 : 0.4} strokeLinecap=\"round\" />\n </g>\n ))}\n </g>\n );\n}\n\nfunction EndpointMarkers({ connections, strokeColor }: { connections: MapConnection[]; strokeColor: string }) {\n const { k } = useZoomPanContext();\n return (\n <>\n {connections.map((c, i) => (\n <React.Fragment key={i}>\n <Marker coordinates={[c.fromLng, c.fromLat]}>\n <circle r={3 / k} fill={strokeColor} opacity={0.8} />\n </Marker>\n <Marker coordinates={[c.toLng, c.toLat]}>\n <circle r={3 / k} fill={strokeColor} opacity={0.8} />\n </Marker>\n </React.Fragment>\n ))}\n </>\n );\n}\n\nexport function MapConnectionsCard({\n data,\n title,\n height = 340,\n color,\n showEndpoints = true,\n formatValue,\n loading = false,\n defaultZoom,\n center: centerProp,\n autoFit = true,\n geoUrl,\n}: MapConnectionsProps) {\n const theme = useTheme();\n const connections = data?.rows ?? [];\n const [tooltip, setTooltip] = useState<{ x: number; y: number; text: string } | null>(null);\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);\n const fmt = formatValue ?? formatCompact;\n const series = resolveBiPalette(theme).series;\n const strokeColor = color ?? series[1 % series.length];\n const layers = useGeoLayers(geoUrl);\n\n const landFill = alpha(theme.palette.text.primary, 0.06);\n const landHover = alpha(theme.palette.text.primary, 0.09);\n const landStroke = theme.palette.divider;\n const overlayStroke = theme.palette.text.disabled;\n\n const maxVal = useMemo(() => Math.max(1, ...connections.map((c) => Math.abs(c.value ?? 1))), [connections]);\n const allCoords = useMemo(() => connections.flatMap((c) => [{ lat: c.fromLat, lng: c.fromLng }, { lat: c.toLat, lng: c.toLng }]), [connections]);\n const viewport = useMemo(() => computeMapViewport(allCoords, { autoFit, defaultZoom, center: centerProp }), [allCoords, autoFit, defaultZoom, centerProp]);\n\n const handleArcHover = useCallback(\n (i: number, e: React.MouseEvent) => {\n const c = connections[i];\n const text = `${c.label ?? ''} ${c.value != null ? fmt(c.value) : ''}`.trim();\n if (!text) return;\n const svg = (e.currentTarget as Element).closest('svg');\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n setHoveredIdx(i);\n setTooltip({ x: e.clientX - rect.left, y: e.clientY - rect.top, text });\n },\n [connections, fmt],\n );\n const clearTooltip = useCallback(() => {\n setHoveredIdx(null);\n setTooltip(null);\n }, []);\n\n if (loading) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n {title && <Skeleton variant=\"text\" width={180} sx={{ fontSize: '1.25rem', mb: 1 }} />}\n <Skeleton variant=\"rounded\" width=\"100%\" height={height} />\n </Box>\n );\n }\n\n const noInteraction = { default: { outline: 'none' }, hover: { outline: 'none' }, pressed: { outline: 'none' } } as const;\n\n return (\n <Box sx={{ height: '100%', p: 2, overflow: 'auto' }}>\n {title && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <Box sx={{ position: 'relative' }}>\n <ComposableMap\n projection=\"geoMercator\"\n projectionConfig={{ scale: BASE_SCALE }}\n width={800}\n style={{ width: '100%', height: '100%', display: 'block', background: theme.palette.background.default, borderRadius: theme.shape.borderRadius }}\n >\n <ZoomableGroup center={viewport.center} zoom={viewport.zoom} minZoom={1} maxZoom={40}>\n {layers.map((url, idx) =>\n idx === 0 ? (\n <Geographies key={url} geography={url}>\n {({ geographies }) =>\n geographies.map((geo) => (\n <Geography key={geo.rsmKey} geography={geo} fill={landFill} stroke={landStroke} strokeWidth={0.5} style={{ ...noInteraction, hover: { outline: 'none', fill: landHover } }} />\n ))\n }\n </Geographies>\n ) : (\n <Geographies key={url} geography={url}>\n {({ geographies }) =>\n geographies.map((geo) => (\n <Geography key={geo.rsmKey} geography={geo} fill=\"none\" stroke={overlayStroke} strokeWidth={0.3} style={noInteraction} />\n ))\n }\n </Geographies>\n ),\n )}\n\n <ConnectionArcs connections={connections} maxVal={maxVal} strokeColor={strokeColor} hoveredIdx={hoveredIdx} onHover={handleArcHover} onLeave={clearTooltip} />\n {showEndpoints && <EndpointMarkers connections={connections} strokeColor={strokeColor} />}\n </ZoomableGroup>\n </ComposableMap>\n\n {tooltip && (\n <Box\n sx={{\n position: 'absolute',\n left: tooltip.x,\n top: tooltip.y - 34,\n transform: 'translateX(-50%)',\n bgcolor: 'background.paper',\n color: 'text.primary',\n px: 1,\n py: 0.5,\n borderRadius: 1,\n fontSize: 12,\n pointerEvents: 'none',\n border: '1px solid',\n borderColor: 'divider',\n whiteSpace: 'nowrap',\n zIndex: 10,\n boxShadow: 2,\n }}\n >\n {tooltip.text}\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n\nexport default MapConnectionsCard;\n","/**\n * Simplified equirectangular world map for dashboard visualizations.\n * Coordinates: viewBox 0 0 1000 500, where x = (lng+180)/360*1000, y = (90-lat)/180*500.\n */\n\nfunction ll(lat: number, lng: number): [number, number] {\n return [(lng + 180) / 360 * 1000, (90 - lat) / 180 * 500];\n}\n\nfunction toPath(coords: [number, number][]): string {\n return coords.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(0)},${y.toFixed(0)}`).join(' ') + ' Z';\n}\n\nconst northAmerica = toPath([\n ll(70, -165), ll(72, -140), ll(73, -100), ll(70, -80), ll(65, -60),\n ll(50, -55), ll(44, -65), ll(40, -73), ll(30, -80), ll(25, -80),\n ll(18, -88), ll(15, -92), ll(18, -105), ll(25, -110), ll(32, -117),\n ll(48, -125), ll(55, -130), ll(60, -140), ll(60, -165),\n]);\n\nconst southAmerica = toPath([\n ll(12, -75), ll(10, -60), ll(5, -52), ll(0, -50), ll(-5, -35),\n ll(-15, -38), ll(-23, -42), ll(-33, -52), ll(-42, -63), ll(-55, -68),\n ll(-50, -75), ll(-40, -73), ll(-18, -70), ll(-5, -77), ll(5, -77),\n]);\n\nconst europe = toPath([\n ll(36, -10), ll(38, 0), ll(43, 5), ll(48, -5), ll(51, -10),\n ll(55, -7), ll(58, 5), ll(55, 15), ll(56, 25), ll(60, 30),\n ll(70, 30), ll(70, 15), ll(65, 10), ll(56, 10), ll(52, 5),\n ll(48, 5), ll(44, 10), ll(40, 10), ll(38, 0), ll(36, -5),\n]);\n\nconst africa = toPath([\n ll(35, -10), ll(37, 10), ll(32, 32), ll(30, 33), ll(20, 38),\n ll(12, 44), ll(5, 42), ll(-5, 40), ll(-12, 45), ll(-25, 35),\n ll(-35, 20), ll(-34, 18), ll(-25, 15), ll(-15, 12), ll(-5, 10),\n ll(5, -5), ll(10, -15), ll(15, -17), ll(22, -17), ll(28, -13),\n]);\n\nconst asia = toPath([\n ll(70, 30), ll(72, 60), ll(75, 100), ll(72, 130), ll(65, 170),\n ll(55, 165), ll(50, 140), ll(45, 130), ll(35, 130), ll(30, 120),\n ll(22, 115), ll(10, 105), ll(5, 100), ll(8, 80), ll(12, 75),\n ll(25, 68), ll(28, 60), ll(30, 48), ll(32, 36), ll(38, 28),\n ll(42, 28), ll(48, 40), ll(55, 38), ll(60, 30),\n]);\n\nconst australia = toPath([\n ll(-12, 130), ll(-15, 140), ll(-20, 148), ll(-28, 153),\n ll(-35, 150), ll(-38, 145), ll(-35, 137), ll(-32, 130),\n ll(-25, 115), ll(-22, 115), ll(-15, 122),\n]);\n\nexport const CONTINENT_PATHS = [northAmerica, southAmerica, europe, africa, asia, australia];\n\nexport const MAP_VIEWBOX = '0 0 1000 500';\n\nexport function latLngToXY(lat: number, lng: number): [number, number] {\n return ll(lat, lng);\n}\n"],"names":["MetricCard","currentValue","previousValue","prefix","suffix","differenceStyle","description","icon","label","formatValue","loading","bi","useBiPalette","fmt","formatCompact","naked","useChartContext","Box","jsxs","Stack","jsx","Skeleton","change","percentChange","diff","changeDisplay","arrow","trendArrow","changeColor","Typography","__name","MetricGroupCard","title","metrics","columns","_","i","props","ARC_START","ARC_END","R","CX","CY","STROKEWIDTH","viewBoxWidth","viewBoxHeight","polarToXY","angle","describeArc","startAngle","endAngle","sx","sy","ex","ey","large","GaugeSvg","zones","ratio","needleColor","strokeWidth","textPrimaryColor","textSecondaryColor","elementsClass","min","max","valueComponent","className","strokeLinecap","needleAngle","nx","ny","zone","prevVal","segStart","segEnd","GaugeCard","value","thresholds","theme","useTheme","skeleton","range","_a","z","GaugeGroup","g","warned","warnIfMuiXLicenseMissing","key","_b","LicenseInfo","resolveFormatter","format","v","toStr","formatNumber","formatCurrency","formatPercent","formatBoolean","formatDate","isActiveFilterItem","item","ServerExportToolbar","onCsvExport","onXlsxExport","onClearFilters","exporting","apiRef","useGridApiContext","filterModel","useGridSelector","gridFilterModelSelector","hasActiveFilters","GridToolbarContainer","GridToolbarColumnsButton","GridToolbarFilterButton","GridToolbarDensitySelector","Button","FilterAltOffIcon","GridToolbarExportContainer","MenuItem","DownloadIcon","TableViewIcon","CHAR_WIDTH_PX","HEADER_PADDING_PX","MIN_COL_WIDTH","estimateHeaderWidth","toGridColumns","autoFitHeaders","col","formatter","baseMinWidth","minWidth","def","selectDef","getGridSingleSelectOperators","op","DataTableCard","data","lazyData","schema","getRowClassName","striped","stripedColorEven","stripedColorOdd","getRowHeight","headerColor","pageSize","dense","initialPinnedColumns","containerRef","React","isLazy","useEffect","initialPageSize","paginationModel","setPaginationModel","useState","useMemo","source","lazyGetRows","dataSource","containerHeight","useContainerMeasurements","gridColumns","downloadCsv","downloadXlsx","isExporting","notice","setNotice","runExport","fn","formatLabel","err","lazyApiRef","toolbarSlotProps","initialState","state","rows","row","evenStripe","oddStripe","headerBg","alpha","DataGridPro","params","result","gridClasses","Snackbar","Alert","CircularProgress","multiplier","minHeight","setContainerHeight","timeoutRef","useRef","getParentGridCard","element","refElement","target","observer","entries","height","prev","defaultXFormatter","chartShade","baseColor","index","total","minAlpha","maxAlpha","t","a","ChartCard","type","xAxis","series","stacked","showLegend","showGrid","showTooltip","formatXAxis","formatYAxis","xAxisConfig","yAxisConfig","maxSlices","paletteOverride","backgroundColor","gridColorOverride","chartData","fmtY","axisColor","gridColor","xKey","resolveAxisProps","cfg","defaults","tickFill","tickFs","MAX_LENGTH_LABEL","truncateLabel","tooltipStyle","chartDefaults","useChartCardDefaults","palette","resolveBiPalette","monoShade","rotateBase","slotIndex","pickPaletteColor","RADIAN","renderCustomizedLabel","cx","cy","midAngle","innerRadius","outerRadius","percent","fill","radius","ncx","x","y","labelFill","seriesColors","s","useMonoShadeBars","pieData","raw","sorted","b","top","othersTotal","sum","d","useContainerRectangle","ResponsiveContainer","PieChart","Pie","Cell","Tooltip","Legend","ScatterChart","CartesianGrid","XAxis","YAxis","Scatter","chartType","isHorizontal","forceStacked","ChartComp","ComposedChart","BarChart","AreaChart","LineChart","layout","effectiveStacked","resolveSeriesType","Fragment","color","seriesType","Bar","ri","Area","Line","CustomContent","width","name","size","strokeColor","labelFor","labelColor","TreeMapCard","nameKey","valueKey","treeData","Treemap","BASE_SCALE","BASE_LNG_SPAN","BASE_LAT_SPAN","computeMapViewport","coords","opts","autoFit","defaultZoom","userCenter","lats","c","lngs","minLat","maxLat","minLng","maxLng","center","padding","latSpan","lngSpan","zoomByLat","zoomByLng","zoom","GEO_URL_WORLD","GEO_URL_BRAZIL_STATES","GEO_URL_BRAZIL_MUNICIPALITIES","brazilGeoLayers","worldGeoLayers","GeoLayersContext","createContext","GeoLayersProvider","useGeoLayers","override","fromContext","useContext","BubbleMarkers","bubbles","maxVal","minBubbleSize","maxBubbleSize","fillColor","onHover","onLeave","k","useZoomPanContext","r","Marker","e","MapBubblesCard","centerProp","geoUrl","tooltip","setTooltip","layers","landFill","landHover","landStroke","overlayStroke","viewport","handleHover","useCallback","text","svg","rect","clearTooltip","noInteraction","ComposableMap","ZoomableGroup","url","idx","Geographies","geographies","geo","Geography","curvedPath","x1","y1","x2","y2","mx","my","ConnectionArcs","connections","hoveredIdx","projection","useMapContext","lines","from","to","ln","EndpointMarkers","MapConnectionsCard","showEndpoints","setHoveredIdx","allCoords","handleArcHover","ll","lat","lng","toPath","northAmerica","southAmerica","europe","africa","asia","australia","CONTINENT_PATHS","MAP_VIEWBOX","latLngToXY"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-K50t61iI.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
package/dist/version-BpSiNdYv.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
var x = Object.defineProperty;
|
|
2
|
-
var o = (t, n) => x(t, "name", { value: n, configurable: !0 });
|
|
3
|
-
import { extendModuleRegistry as M, extendDefaultScope as _, createUiToolRegistry as y } from "@aintela/chat/components";
|
|
4
|
-
import { getBiModuleSurface as S } from "./biModuleSurface--gLAiZ9Z.js";
|
|
5
|
-
import { s as B } from "./ScriptDashboardViewerVertical-CuwnxisJ.js";
|
|
6
|
-
import { jsx as l } from "react/jsx-runtime";
|
|
7
|
-
import { Box as b } from "@mui/material";
|
|
8
|
-
import { M as m, a as I, C as E, I as R } from "./index-BYc79sSy.js";
|
|
9
|
-
import { B as V } from "./BiClientProvider-CWJochvi.js";
|
|
10
|
-
const f = /* @__PURE__ */ new Set();
|
|
11
|
-
function G(t) {
|
|
12
|
-
const n = { ...S(), ...t.extraScope ?? {} }, r = t.specifiers.filter((a) => !f.has(a));
|
|
13
|
-
for (const a of r)
|
|
14
|
-
M(a, n), f.add(a);
|
|
15
|
-
(r.length > 0 || t.extraScope) && _(n), B(t.specifiers, t.extraHostModules);
|
|
16
|
-
}
|
|
17
|
-
o(G, "registerBiModules");
|
|
18
|
-
function P() {
|
|
19
|
-
f.clear();
|
|
20
|
-
}
|
|
21
|
-
o(P, "resetBiModuleRegistration");
|
|
22
|
-
function h(t) {
|
|
23
|
-
const n = t ?? {}, r = /* @__PURE__ */ o((a) => {
|
|
24
|
-
const c = n[a] ?? n[a.charAt(0).toUpperCase() + a.slice(1)];
|
|
25
|
-
return c == null ? void 0 : String(c);
|
|
26
|
-
}, "g");
|
|
27
|
-
return {
|
|
28
|
-
currentValue: r("currentValue") ?? "",
|
|
29
|
-
previousValue: r("previousValue"),
|
|
30
|
-
prefix: r("prefix"),
|
|
31
|
-
suffix: r("suffix"),
|
|
32
|
-
differenceStyle: r("differenceStyle"),
|
|
33
|
-
description: r("description"),
|
|
34
|
-
icon: r("icon")
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
o(h, "normalizeMetricArgs");
|
|
38
|
-
function g(t, n) {
|
|
39
|
-
let r = t;
|
|
40
|
-
for (let a = 0; a < 2 && typeof r == "string"; a++)
|
|
41
|
-
try {
|
|
42
|
-
r = JSON.parse(r);
|
|
43
|
-
} catch {
|
|
44
|
-
return n;
|
|
45
|
-
}
|
|
46
|
-
return r ?? n;
|
|
47
|
-
}
|
|
48
|
-
o(g, "parseJsonArg");
|
|
49
|
-
function T(t = {}) {
|
|
50
|
-
const { client: n, onExpandChart: r, onExpandIframe: a } = t, c = /* @__PURE__ */ o((e) => {
|
|
51
|
-
const s = /* @__PURE__ */ l(b, { sx: { my: 1 }, children: e });
|
|
52
|
-
return n ? /* @__PURE__ */ l(V, { client: n, children: s }) : s;
|
|
53
|
-
}, "wrap"), p = (t.builder ?? y()).render("present_metric", (e) => {
|
|
54
|
-
const s = h(e);
|
|
55
|
-
return s.currentValue ? c(/* @__PURE__ */ l(m, { partial: !1, ...s })) : null;
|
|
56
|
-
}).render("present_metric_group", (e) => {
|
|
57
|
-
var s;
|
|
58
|
-
return (s = e.metrics) != null && s.length ? c(
|
|
59
|
-
/* @__PURE__ */ l(I, { partial: !1, title: e.title, materialIcon: e.materialIcon, footNote: e.footNote, children: e.metrics.map((u, d) => /* @__PURE__ */ l(m, { partial: !1, ...h(u) }, d)) })
|
|
60
|
-
) : null;
|
|
61
|
-
}).render("present_chart", (e) => e.src ? c(/* @__PURE__ */ l(E, { src: e.src, name: e.name, alt: e.alt, reasoning: e.reasoning, naked: e.naked, onExpand: r })) : null).render("present_iframe", (e) => !e.src || !e.name ? null : c(/* @__PURE__ */ l(R, { partial: !1, src: e.src, name: e.name, onExpand: a }))), i = t.environment;
|
|
62
|
-
return i ? p.action("refresh_dashboard", () => {
|
|
63
|
-
var e;
|
|
64
|
-
(e = i.refreshDashboard) == null || e.call(i);
|
|
65
|
-
}, { status: "Dashboard atualizado" }).action("present_dashboard_pad", (e) => {
|
|
66
|
-
var u, d;
|
|
67
|
-
const s = g(e.definitionJson, {});
|
|
68
|
-
e.mode === "create" ? (u = i.createDashboardPad) == null || u.call(i, s) : (d = i.updateDashboardPad) == null || d.call(i, s);
|
|
69
|
-
}, { status: "Rascunho atualizado" }).action("present_guide", (e) => {
|
|
70
|
-
var u;
|
|
71
|
-
const s = g(e.stepsJson, []);
|
|
72
|
-
Array.isArray(s) && s.length > 0 && ((u = i.showGuide) == null || u.call(i, s));
|
|
73
|
-
}, { status: "Guia iniciado" }) : p;
|
|
74
|
-
}
|
|
75
|
-
o(T, "createBiUiTools");
|
|
76
|
-
const H = "0.2.2";
|
|
77
|
-
export {
|
|
78
|
-
H as B,
|
|
79
|
-
P as a,
|
|
80
|
-
T as c,
|
|
81
|
-
h as n,
|
|
82
|
-
G as r
|
|
83
|
-
};
|
|
84
|
-
//# sourceMappingURL=version-BpSiNdYv.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"version-BpSiNdYv.js","sources":["../src/runtime/registerBiModules.ts","../src/runtime/createBiUiTools.tsx","../src/runtime/version.ts"],"sourcesContent":["import { extendModuleRegistry, extendDefaultScope } from '@aintela/chat/components';\nimport { getBiModuleSurface } from './biModuleSurface';\nimport { seedHostModules } from './loadDashboardBundle';\n\nexport interface RegisterBiModulesOptions {\n /**\n * The module specifiers LLM-emitted code imports from. The compiled\n * snippet does `__scope[\"<specifier>\"].X` and a bundle does\n * `require(\"<specifier>\")`, so every string here must match what the\n * template / instruction files told the model to write.\n *\n * AIA starts clean: `['@aintela/bi']`. Envision must keep resolving the\n * legacy keys forever (persisted sessions + content-hashed bundles):\n * `['@aintela/bi', '@envision/ui-library', '@envision/ui-library/components', …]`.\n */\n specifiers: string[];\n /**\n * Extra values merged into the surface under every specifier AND into the\n * bare-identifier scope — e.g. Envision's `VizLibrary` compat shim, or a\n * host's own components the instructions mention.\n */\n extraScope?: Record<string, unknown>;\n /**\n * Extra `require()` targets for dashboard bundles keyed by specifier\n * (`{ 'date-fns': dateFns, lodash }`). Not in the live-TSX scope.\n */\n extraHostModules?: Record<string, unknown>;\n}\n\nconst registeredKeys = new Set<string>();\n\n/**\n * Makes this library resolvable from LLM-generated code:\n * 1. `extendModuleRegistry(specifier, surface)` once per specifier (live TSX imports);\n * 2. `extendDefaultScope(surface)` once (bare identifiers, no import line);\n * 3. seeds the dashboard-bundle loader's host-module map under the same specifiers.\n *\n * Idempotent per specifier — call it at app start, before the first chat turn\n * or bundle renders.\n */\nexport function registerBiModules(options: RegisterBiModulesOptions): void {\n const surface = { ...getBiModuleSurface(), ...(options.extraScope ?? {}) };\n\n const fresh = options.specifiers.filter((s) => !registeredKeys.has(s));\n for (const specifier of fresh) {\n extendModuleRegistry(specifier, surface);\n registeredKeys.add(specifier);\n }\n if (fresh.length > 0 || options.extraScope) {\n extendDefaultScope(surface);\n }\n seedHostModules(options.specifiers, options.extraHostModules);\n}\n\n/** Test seam. */\nexport function resetBiModuleRegistration(): void {\n registeredKeys.clear();\n}\n","import React from 'react';\nimport { Box } from '@mui/material';\nimport { createUiToolRegistry } from '@aintela/chat/components';\nimport type { UiToolRegistryBuilder } from '@aintela/chat/components';\nimport { Chart, Metric, MetricGroup, IFrame } from '../inline';\nimport type { ChartExpandInfo, IFrameExpandInfo } from '../inline';\nimport { BiClientProvider, type BiClient } from '../client';\nimport type { DashboardEnvironment, GuideStep } from '../composer/environment/types';\n\n/**\n * The explorer's visual vocabulary as `uiTools` registry entries. The chat\n * library owns the plumbing (routing `[KernelUiFunction]` calls, unwrapping\n * args, replay); here we only declare WHAT to draw per tool name.\n *\n * `present_dashboard` and `present_tsx` are deliberately NOT registered — the\n * dashboard hand-off belongs to the dashboard slice and `present_tsx`'s\n * compiled-JS sibling-event plumbing is host policy. Both are added by the\n * host on the returned builder:\n *\n * const uiTools = createBiUiTools({ client })\n * .render('present_dashboard', (a) => <ScriptDashboardViewer dashboardId={a.id} />)\n * .build();\n */\nexport interface CreateBiUiToolsOptions {\n /**\n * Client whose `artifactUrl` / `iframeUrl` resolve the images. When\n * omitted the renderers rely on an ambient `<BiClientProvider>` above the\n * chat pane (which is how a host also passes the session id).\n */\n client?: BiClient;\n /** Expand handlers (a lightbox, an artifact panel). Default: open in a new tab. */\n onExpandChart?: (info: ChartExpandInfo) => void;\n onExpandIframe?: (info: IFrameExpandInfo) => void;\n /** Start from an existing builder to chain more tools before these. */\n builder?: UiToolRegistryBuilder;\n /**\n * The composer's environment (`useComposerEnvironment()` /\n * `environmentFromStore(store)`). When supplied, the three ACTION tools\n * the dashboard agent calls are registered too: `refresh_dashboard`,\n * `present_dashboard_pad` (`definitionJson` + `mode`) and `present_guide`\n * (`stepsJson`). Without it they are left to the host, like `present_dashboard`.\n */\n environment?: Partial<DashboardEnvironment>;\n}\n\n// present_metric uses camelCase params, but present_metric_group's items come\n// from a C# class serialised PascalCase. Read either casing.\nexport interface PresentMetricArgs {\n currentValue: string;\n previousValue?: string;\n prefix?: string;\n suffix?: string;\n differenceStyle?: 'Percentage' | 'Value';\n description?: string;\n icon?: string;\n}\n\nexport function normalizeMetricArgs(raw: unknown): PresentMetricArgs {\n const o = (raw ?? {}) as Record<string, unknown>;\n const g = (k: string): string | undefined => {\n const v = o[k] ?? o[k.charAt(0).toUpperCase() + k.slice(1)];\n return v == null ? undefined : String(v);\n };\n return {\n currentValue: g('currentValue') ?? '',\n previousValue: g('previousValue'),\n prefix: g('prefix'),\n suffix: g('suffix'),\n differenceStyle: g('differenceStyle') as 'Percentage' | 'Value' | undefined,\n description: g('description'),\n icon: g('icon'),\n };\n}\n\nexport interface PresentChartArgs { src?: string; name?: string; alt?: string; reasoning?: string; naked?: boolean }\nexport interface PresentMetricGroupArgs { title?: string; materialIcon?: string; footNote?: string; metrics?: unknown[] }\nexport interface PresentIframeArgs { src?: string; name?: string }\nexport interface PresentDashboardPadArgs { definitionJson?: string; mode?: 'create' | 'update' | string }\nexport interface PresentGuideArgs { stepsJson?: string }\n\n/** JSON text that may have been encoded once or twice on the way through the tool call. */\nfunction parseJsonArg<T>(raw: string | undefined, fallback: T): T {\n let value: unknown = raw;\n for (let i = 0; i < 2 && typeof value === 'string'; i++) {\n try {\n value = JSON.parse(value);\n } catch {\n return fallback;\n }\n }\n return (value ?? fallback) as T;\n}\n\nexport function createBiUiTools(options: CreateBiUiToolsOptions = {}): UiToolRegistryBuilder {\n const { client, onExpandChart, onExpandIframe } = options;\n const wrap = (node: React.ReactNode): React.ReactNode => {\n const boxed = <Box sx={{ my: 1 }}>{node}</Box>;\n return client ? <BiClientProvider client={client}>{boxed}</BiClientProvider> : boxed;\n };\n\n const builder = (options.builder ?? createUiToolRegistry())\n .render<PresentMetricArgs>('present_metric', (args) => {\n const m = normalizeMetricArgs(args);\n if (!m.currentValue) return null;\n return wrap(<Metric partial={false} {...m} />);\n })\n .render<PresentMetricGroupArgs>('present_metric_group', (a) => {\n if (!a.metrics?.length) return null;\n return wrap(\n <MetricGroup partial={false} title={a.title} materialIcon={a.materialIcon} footNote={a.footNote}>\n {a.metrics.map((raw, i) => (\n <Metric key={i} partial={false} {...normalizeMetricArgs(raw)} />\n ))}\n </MetricGroup>,\n );\n })\n .render<PresentChartArgs>('present_chart', (a) => {\n if (!a.src) return null;\n return wrap(<Chart src={a.src} name={a.name} alt={a.alt} reasoning={a.reasoning} naked={a.naked} onExpand={onExpandChart} />);\n })\n .render<PresentIframeArgs>('present_iframe', (a) => {\n if (!a.src || !a.name) return null;\n return wrap(<IFrame partial={false} src={a.src} name={a.name} onExpand={onExpandIframe} />);\n });\n\n const env = options.environment;\n if (!env) return builder;\n\n // Action tools: side effects on the composer, fired once per tool-call id\n // by the chat library; the status chip shows after a successful run.\n return builder\n .action('refresh_dashboard', () => {\n env.refreshDashboard?.();\n }, { status: 'Dashboard atualizado' })\n .action<PresentDashboardPadArgs>('present_dashboard_pad', (a) => {\n const def = parseJsonArg<Record<string, unknown>>(a.definitionJson, {});\n if (a.mode === 'create') env.createDashboardPad?.(def as never);\n else env.updateDashboardPad?.(def as never);\n }, { status: 'Rascunho atualizado' })\n .action<PresentGuideArgs>('present_guide', (a) => {\n const steps = parseJsonArg<GuideStep[]>(a.stepsJson, []);\n if (Array.isArray(steps) && steps.length > 0) env.showGuide?.(steps);\n }, { status: 'Guia iniciado' });\n}\n","/**\n * The package version, so a host can log a mismatch against the server-side\n * `AIntelA.Bi.Agents` version at handshake (the instruction files describe\n * THIS React API). Kept in sync with package.json by `tests/runtime/version.test.ts`.\n */\nexport const BI_RUNTIME_VERSION = '0.2.2';\n"],"names":["registeredKeys","registerBiModules","options","surface","getBiModuleSurface","fresh","s","specifier","extendModuleRegistry","extendDefaultScope","seedHostModules","__name","resetBiModuleRegistration","normalizeMetricArgs","raw","o","g","k","v","parseJsonArg","fallback","value","i","createBiUiTools","client","onExpandChart","onExpandIframe","wrap","node","boxed","Box","jsx","BiClientProvider","builder","createUiToolRegistry","args","m","Metric","a","_a","MetricGroup","Chart","IFrame","env","def","_b","steps","BI_RUNTIME_VERSION"],"mappings":"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"}
|