@aintela/bi 0.2.4 → 0.2.6
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/dist/{GridLayout-1gWuIKeZ.js → GridLayout-BQcuPzng.js} +2 -2
- package/dist/GridLayout-BQcuPzng.js.map +1 -0
- package/dist/{ScriptDashboardViewerVertical-CHIPRLen.js → ScriptDashboardViewerVertical-Db2sFEEl.js} +42 -26
- package/dist/{ScriptDashboardViewerVertical-CHIPRLen.js.map → ScriptDashboardViewerVertical-Db2sFEEl.js.map} +1 -1
- package/dist/{biModuleSurface-BYtgLreK.js → biModuleSurface-SpadZ11I.js} +4 -4
- package/dist/{biModuleSurface-BYtgLreK.js.map → biModuleSurface-SpadZ11I.js.map} +1 -1
- package/dist/composer/index.d.ts +1 -1
- package/dist/composer/models/utils.d.ts +11 -0
- package/dist/composer.js +33 -32
- package/dist/grid.js +2 -2
- package/dist/{index-BzUugG0A.js → index-D6-YxBjl.js} +2 -2
- package/dist/{index-BzUugG0A.js.map → index-D6-YxBjl.js.map} +1 -1
- package/dist/{index-DOfnLVhs.js → index-DrS3V1Ke.js} +880 -849
- package/dist/index-DrS3V1Ke.js.map +1 -0
- package/dist/{index-CfKuT0vQ.js → index-DwUXZzTn.js} +2 -2
- package/dist/index-DwUXZzTn.js.map +1 -0
- package/dist/index.js +53 -52
- package/dist/runtime/version.d.ts +1 -1
- package/dist/runtime.js +7 -7
- package/dist/{version-CbZiTInp.js → version-BNrlEAG1.js} +5 -5
- package/dist/{version-CbZiTInp.js.map → version-BNrlEAG1.js.map} +1 -1
- package/dist/viewer.js +1 -1
- package/package.json +1 -1
- package/dist/GridLayout-1gWuIKeZ.js.map +0 -1
- package/dist/index-CfKuT0vQ.js.map +0 -1
- package/dist/index-DOfnLVhs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptDashboardViewerVertical-CHIPRLen.js","sources":["../src/viewer/cardMetadata.ts","../src/runtime/loadDashboardBundle.ts","../src/viewer/useDashboardBundle.ts","../src/viewer/ScriptDashboardViewer.tsx","../src/viewer/ScriptDashboardViewerVertical.tsx"],"sourcesContent":["import type { GridCardColor } from '../grid/GridCard';\nimport type { DashboardCardDefinition } from '../runtime/IDashboardDefinition';\nimport type { CardCategory, CardSpecificType, Dashboard } from './models';\n\n/** Card category → GridCard accent variant. */\nexport const CATEGORY_PREFIXES: Record<CardCategory, GridCardColor> = {\n Generic: 'custom',\n Métrica: 'kpi',\n Tabela: 'table',\n Gráfico: 'chart',\n Mapa: 'iframe',\n Árvore: 'chart',\n Medidor: 'chart',\n};\n\n/**\n * Per-card metadata: the sketch (`dashboard.cards[i]`) overrides the bundle's\n * hardcoded title / specificType / category; the bundle's values are the\n * fallback.\n */\nexport function resolveCardMetadata(\n card: DashboardCardDefinition,\n dashboard: Dashboard | undefined,\n): { title: string | undefined; specificType: CardSpecificType | undefined; category: CardCategory | undefined } {\n const related = dashboard?.cards?.find((i) => i.i === card.key) ?? null;\n const title = related?.name !== card.title ? related?.name : card.title;\n const specificType = (related?.specificType !== card.specificType ? related?.specificType : card.specificType) as CardSpecificType | undefined;\n const category = (related?.category !== card.category ? related?.category : card.category) as CardCategory | undefined;\n return { title, specificType, category };\n}\n","// Static imports stay to what every host already has (React, Emotion,\n// @mui/material/styles, dayjs). The heavy namespaces — @mui/material,\n// @mui/icons-material, recharts — are dynamic imports so a host bundler\n// code-splits them into chunks fetched only when a dashboard bundle actually\n// resolves a `require('@mui/material')` at runtime.\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as ReactDOMClient from 'react-dom/client';\nimport * as jsxRuntime from 'react/jsx-runtime';\nimport * as EmotionReact from '@emotion/react';\nimport * as EmotionStyled from '@emotion/styled';\nimport * as dayjs from 'dayjs';\nimport * as MuiMaterialStyles from '@mui/material/styles';\n\nimport type { BiClient } from '../client';\nimport type { DashboardCardDefinition, IDashboardDefinition } from './IDashboardDefinition';\n// NOT a static import, deliberately. `biModuleSurface` does `import * as Viewer from '../viewer'`, the\n// viewer's `useDashboardBundle` imports `instantiateDashboardBundle` from THIS file, and this file needs\n// the surface — a real cycle. Unbundled ESM tolerates it, because a namespace object is materialised\n// lazily; the BUNDLE does not. Rollup put the whole loop in one chunk and built the viewer's frozen\n// namespace eagerly, so importing `@aintela/bi`, `/runtime`, `/viewer` or `/composer` from the published\n// package threw `ReferenceError: Cannot access '_e' before initialization` before a single line of app\n// code ran. The surface is only needed inside `getHostModules`, which is already async, so deferring the\n// import to call time breaks the static cycle and costs nothing. Keep it dynamic.\n\n// ── Host-module map ────────────────────────────────────────────────────\n// `require(spec)` inside a CJS bundle resolves against this map. The BI\n// specifiers are seeded by `registerBiModules({ specifiers })` — the same\n// strings the live-TSX `__scope` registry uses — so a bundle compiled against\n// `@aintela/bi` (or a legacy `@envision/ui-library`) finds the same object.\nconst registeredSpecifiers = new Set<string>();\nlet extraHostModules: Record<string, unknown> = {};\nlet hostModulesCache: Record<string, unknown> | null = null;\n\n/** Called by `registerBiModules`. Invalidates the resolved map so the next bundle load rebuilds it. */\nexport function seedHostModules(specifiers: string[], extra?: Record<string, unknown>): void {\n for (const s of specifiers) registeredSpecifiers.add(s);\n if (extra) extraHostModules = { ...extraHostModules, ...extra };\n hostModulesCache = null;\n}\n\n/** Specifiers `registerBiModules` has seeded so far (test/diagnostic seam). */\nexport function getRegisteredSpecifiers(): string[] {\n return [...registeredSpecifiers];\n}\n\nexport async function getHostModules(): Promise<Record<string, unknown>> {\n if (hostModulesCache) return hostModulesCache;\n\n const [MuiMaterial, MuiIconsMaterial, Recharts] = await Promise.all([\n import('@mui/material'),\n import('@mui/icons-material'),\n import('recharts'),\n ]);\n\n const { getBiModuleSurface } = await import('./biModuleSurface');\n const surface = getBiModuleSurface();\n const map: Record<string, unknown> = {\n react: React,\n 'react/jsx-runtime': jsxRuntime,\n 'react-dom': ReactDOM,\n 'react-dom/client': ReactDOMClient,\n '@mui/material': MuiMaterial,\n '@mui/icons-material': MuiIconsMaterial,\n '@mui/material/styles': MuiMaterialStyles,\n '@emotion/react': EmotionReact,\n '@emotion/styled': EmotionStyled,\n recharts: Recharts,\n dayjs,\n ...extraHostModules,\n };\n for (const spec of registeredSpecifiers) map[spec] = surface;\n\n hostModulesCache = map;\n return map;\n}\n\n// ── Compiled-bundle cache (bounded LRU) ────────────────────────────────\n// The expensive step is the `new Function(code)` compile. Keyed by\n// `${sessionId}::${scriptName}` with a content hash so identical bytes reuse\n// the compiled module and regenerated bytes (same filename) recompile.\nconst MAX_CACHED_BUNDLES = 6;\ninterface CompiledBundleEntry { hash: string; module: unknown }\nconst compiledBundleCache = new Map<string, CompiledBundleEntry>();\n\n/** FNV-1a 32-bit + length. Not cryptographic; only detects a changed bundle. */\nexport function hashBundleCode(code: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < code.length; i++) {\n h ^= code.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return `${(h >>> 0).toString(36)}:${code.length}`;\n}\n\n/** Test seam. */\nexport function clearBundleCaches(): void {\n compiledBundleCache.clear();\n hostModulesCache = null;\n}\n\n/**\n * Evaluates CJS bundle code against the host-module map and returns its\n * default export (or the whole `exports` object). Exposed so a host with its\n * own transport can skip `loadDashboardBundle`.\n */\nexport async function evaluateDashboardBundle(code: string, cacheKey?: string): Promise<unknown> {\n const HOST_MODULES = await getHostModules();\n\n const hash = hashBundleCode(code);\n if (cacheKey) {\n const cached = compiledBundleCache.get(cacheKey);\n if (cached && cached.hash === hash) {\n compiledBundleCache.delete(cacheKey);\n compiledBundleCache.set(cacheKey, cached);\n return cached.module;\n }\n }\n\n const moduleShim = { exports: {} as Record<string, unknown> };\n const requireShim = (name: string) => {\n const mod = HOST_MODULES[name];\n if (mod !== undefined) return mod;\n // Subpath imports (e.g. `@mui/icons-material/ArrowDownward`) resolve to\n // the named export of the matching host module.\n for (const [key, hostMod] of Object.entries(HOST_MODULES)) {\n if (name.startsWith(key + '/') && hostMod && typeof hostMod === 'object') {\n const exported = (hostMod as Record<string, unknown>)[name.slice(key.length + 1)];\n if (exported !== undefined) return { default: exported, __esModule: true };\n }\n }\n throw new Error(`Dashboard bundle requires unknown module: \"${name}\". Register it with registerBiModules({ specifiers | extraHostModules }).`);\n };\n\n new Function('require', 'module', 'exports', code)(requireShim, moduleShim, moduleShim.exports);\n\n const moduleExport = moduleShim.exports.default ?? moduleShim.exports;\n\n if (cacheKey) {\n compiledBundleCache.delete(cacheKey);\n compiledBundleCache.set(cacheKey, { hash, module: moduleExport });\n if (compiledBundleCache.size > MAX_CACHED_BUNDLES) {\n const oldestKey = compiledBundleCache.keys().next().value;\n if (oldestKey !== undefined) compiledBundleCache.delete(oldestKey);\n }\n }\n return moduleExport;\n}\n\n/**\n * Fetches a CJS dashboard bundle through the client and executes it in a\n * sandboxed scope with the host's React and this library.\n *\n * @returns the bundle's default export (typically a class implementing `IDashboardDefinition`)\n */\nexport async function loadDashboardBundle(client: BiClient, sessionId: string, dashboardId: string): Promise<unknown> {\n const [code] = await Promise.all([client.fetchDashboardBundle(sessionId, dashboardId), getHostModules()]);\n return evaluateDashboardBundle(code, `${sessionId}::${dashboardId}`);\n}\n\nexport interface DashboardBundleResult {\n instance: IDashboardDefinition;\n cards: DashboardCardDefinition[];\n style: React.ReactNode;\n}\n\n/** Loads a bundle, instantiates the class it exports, returns cards + style node. */\nexport async function instantiateDashboardBundle(client: BiClient, sessionId: string, scriptFileName: string): Promise<DashboardBundleResult> {\n const DashboardClass = (await loadDashboardBundle(client, sessionId, scriptFileName)) as new () => IDashboardDefinition;\n const instance = new DashboardClass();\n return {\n instance,\n cards: [...instance.getCardsList()],\n style: instance.getDashboardStyle(),\n };\n}\n","// Shared data-loading machinery for ScriptDashboardViewer and\n// ScriptDashboardViewerVertical — HEADLESS: no router, no app store, no\n// scheduling service. It reads a dashboard model (passed in or fetched by id\n// through the BiClient), instantiates the JS bundle, builds the filter\n// components, drives the parameters, and optionally polls a sub-agent while\n// it generates the dashboard. Layout / chrome belong to the viewers.\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { MutableRefObject, ReactNode, Dispatch, SetStateAction } from 'react';\nimport type { LayoutItem } from 'react-grid-layout';\nimport type { SubAgentDto } from '@aintela/chat/models';\nimport { isSubAgentTerminalStatus } from '@aintela/chat/models';\n\nimport { useBiClientOptional, type BiClient } from '../client';\nimport { instantiateDashboardBundle } from '../runtime/loadDashboardBundle';\nimport type { DashboardCardDefinition } from '../runtime/IDashboardDefinition';\nimport { createFilterComponent } from '../filters/filterFactory';\nimport { useContainerRectangle } from '../cards/useContainerRectangle';\nimport type { Dashboard } from './models';\n\nexport interface DashboardWaitingOptions {\n /** Id of the SubAgent currently generating this dashboard. */\n subAgentId: string;\n /**\n * Chat session the sub-agent runs in. Falls back to\n * `dashboard.originalSessionId` (undefined while the dashboard is still\n * being generated — pass it explicitly for the waiting case).\n */\n sessionId?: string;\n /** Polling interval in ms while the sub-agent is running. Minimum / default 10000. */\n pollIntervalMs?: number;\n}\n\nexport interface UseDashboardBundleOptions {\n /** Defaults to the ambient `BiClientProvider`. */\n client?: BiClient;\n dashboardId?: string;\n parameters?: Record<string, string | string[]>;\n dashboard?: Dashboard;\n dashboardWaiting?: DashboardWaitingOptions;\n /**\n * Re-instantiation trigger: bump ONLY when the bundle CODE is (re)generated,\n * loaded or explicitly refreshed. Not for per-edit layout commits — the\n * agent-emitted JS only changes on a rebuild, and the server derives the\n * filename from the dashboard NAME so `jsFileName` cannot signal one.\n */\n codeGeneration?: number;\n onDashloadLoaded?: (dashboard: Dashboard) => void;\n onFiltersChanged?: (filters: Record<string, unknown>) => void;\n /** Keep `isResizable` on layout items (read-only viewers leave it false). */\n editable?: boolean;\n /** Print / read-only preview (was the `?printPreview=true` URL flag). */\n isPrintPreview?: boolean;\n}\n\nexport interface DashboardBundleSnackbarState {\n open: boolean;\n message: string;\n severity: 'success' | 'error';\n}\n\nexport interface DashboardBundleResult {\n dashboard: Dashboard | undefined;\n cards: DashboardCardDefinition[] | null;\n style: ReactNode | null;\n loading: boolean;\n error: string | null;\n setError: (e: string | null) => void;\n\n filters: ReactNode;\n filterOptions: { onChange: (key: string, value: string | string[]) => void; parameters: Record<string, string | string[]>; readonly: boolean };\n stateParameters: Record<string, string | string[]>;\n handleParameterChange: (key: string, value: string | string[]) => void;\n\n containerRef: MutableRefObject<HTMLDivElement | null>;\n containerWidth: number;\n rawLayoutDefinition: LayoutItem[] | undefined;\n layoutDefinition: LayoutItem[] | undefined;\n\n effectiveDashboardId: string | undefined;\n isPrintPreview: boolean;\n\n snackbar: DashboardBundleSnackbarState;\n setSnackbar: Dispatch<SetStateAction<DashboardBundleSnackbarState>>;\n\n subAgentStatus: SubAgentDto | null;\n isSubAgentTracked: boolean;\n subAgentDone: boolean;\n subAgentFailed: boolean;\n}\n\nexport function useDashboardBundle(options: UseDashboardBundleOptions): DashboardBundleResult {\n const ambientClient = useBiClientOptional();\n const resolvedClient = options.client ?? ambientClient;\n if (!resolvedClient) {\n throw new Error('[@aintela/bi] useDashboardBundle needs a BiClient: pass `client` or mount <BiClientProvider>.');\n }\n const client: BiClient = resolvedClient;\n\n // `props.dashboard ?? localDashboard` is the canonical read; never mirror the prop into state.\n const [localDashboard, setLocalDashboard] = useState<Dashboard | undefined>(options.dashboard);\n const dashboard = options.dashboard ?? localDashboard;\n\n // Latest host callbacks in refs so inline lambdas do not re-run the effects.\n const onDashLoadedRef = useRef(options.onDashloadLoaded);\n onDashLoadedRef.current = options.onDashloadLoaded;\n const onFiltersChangedRef = useRef(options.onFiltersChanged);\n onFiltersChangedRef.current = options.onFiltersChanged;\n\n const [cards, setCards] = useState<DashboardCardDefinition[] | null>(null);\n const [style, setStyle] = useState<ReactNode | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isPrintPreview = options.isPrintPreview ?? false;\n const [stateParameters, setStateParameters] = useState<Record<string, string | string[]>>(options.parameters ?? {});\n\n const handleParameterChange = useCallback((key: string, value: string | string[]) => {\n setStateParameters((prev) => {\n if (!value || (Array.isArray(value) && value.length === 0)) {\n const { [key]: _removed, ...rest } = prev;\n return rest;\n }\n const next = { ...prev, [key]: value };\n onFiltersChangedRef.current?.(next);\n return next;\n });\n }, []);\n\n // Host-supplied parameters are the authoritative external source. Memoised\n // structurally so a fresh object per render does not re-fire the merge.\n const optionsParametersKey = JSON.stringify(options.parameters ?? {});\n const reportParameters = useMemo<Record<string, string | string[]>>(\n () => ({ ...(options.parameters ?? {}) }),\n [optionsParametersKey],\n );\n\n // Defined on the very first render so filter components mounted with a\n // sync `dashboard` prop have a real onChange from their first mount.\n const filterOptions = useMemo(\n () => ({ onChange: handleParameterChange, parameters: reportParameters, readonly: isPrintPreview }),\n [reportParameters, isPrintPreview, handleParameterChange],\n );\n\n useEffect(() => {\n setStateParameters((prev) => ({ ...prev, ...reportParameters }));\n }, [reportParameters]);\n\n const effectiveDashboardId = options.dashboardId ?? dashboard?.id;\n\n // Container width — re-measured when the dashboard arrives, because the\n // spinner branch does not mount the element that owns `containerRef`.\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [containerWidth] = useContainerRectangle(containerRef, 0, 0, `${effectiveDashboardId}-${dashboard?.id ?? 'pending'}`);\n\n const [snackbar, setSnackbar] = useState<DashboardBundleSnackbarState>({ open: false, message: '', severity: 'success' });\n\n // Sub-agent polling (only when the host opts in).\n const [subAgentStatus, setSubAgentStatus] = useState<SubAgentDto | null>(null);\n const waitingSubAgentId = options.dashboardWaiting?.subAgentId;\n const isSubAgentTracked = Boolean(waitingSubAgentId);\n const subAgentDone = !isSubAgentTracked || isSubAgentTerminalStatus(subAgentStatus?.status);\n const subAgentFailed = subAgentStatus?.status === 'Failed' || subAgentStatus?.status === 'Cancelled';\n const pollSessionId = options.dashboardWaiting?.sessionId ?? dashboard?.originalSessionId ?? undefined;\n const pollIntervalMs = options.dashboardWaiting?.pollIntervalMs;\n\n useEffect(() => {\n if (!isSubAgentTracked || !waitingSubAgentId || !pollSessionId) {\n setSubAgentStatus(null);\n return;\n }\n const intervalMs = Math.max(pollIntervalMs ?? 0, 10000);\n let cancelled = false;\n let timeoutHandle: ReturnType<typeof setTimeout> | null = null;\n\n const poll = async () => {\n try {\n const status = await client.getSubAgentStatus<SubAgentDto>(pollSessionId, waitingSubAgentId);\n if (cancelled) return;\n setSubAgentStatus(status);\n if (status && isSubAgentTerminalStatus(status.status)) return;\n } catch (err) {\n if (cancelled) return;\n console.error('Failed to poll sub-agent status:', err);\n }\n if (!cancelled) timeoutHandle = setTimeout(poll, intervalMs);\n };\n\n poll();\n return () => {\n cancelled = true;\n if (timeoutHandle) clearTimeout(timeoutHandle);\n };\n }, [isSubAgentTracked, waitingSubAgentId, pollSessionId, pollIntervalMs, client]);\n\n // Metadata fetch (when no `dashboard` prop).\n useEffect(() => {\n let cancelled = false;\n async function loadMetadata() {\n if (options.dashboard) return;\n if (!effectiveDashboardId) return;\n try {\n const dash = await client.getDashboard<Dashboard>(effectiveDashboardId);\n if (cancelled) return;\n setLocalDashboard(dash);\n onDashLoadedRef.current?.(dash);\n } catch (err) {\n if (!cancelled) setError(err instanceof Error ? err.message : 'Failed to load dashboard');\n }\n }\n loadMetadata();\n return () => {\n cancelled = true;\n };\n }, [effectiveDashboardId, options.dashboard, client]);\n\n // Bundle instantiation — depends on the bundle IDENTITY fields only, not\n // the whole `dashboard` object, so layout-only edits do not re-instantiate.\n const codeGeneration = options.codeGeneration;\n const dashboardIdField = dashboard?.id;\n const dashboardJsFileName = dashboard?.jsFileName;\n const dashboardSessionId = dashboard?.originalSessionId;\n useEffect(() => {\n let cancelled = false;\n async function loadBundle() {\n if (isSubAgentTracked && !subAgentDone) return;\n if (isSubAgentTracked && subAgentFailed) {\n setLoading(false);\n setError(subAgentStatus?.error ?? 'A geração do dashboard falhou.');\n return;\n }\n if (!effectiveDashboardId && !dashboardIdField) return;\n if (dashboardIdField !== undefined && !dashboardSessionId) {\n console.error('Dashboard has no originalSessionId');\n setError('Dashboard has no originalSessionId');\n return;\n }\n\n setError(null);\n setLoading(true);\n try {\n const scriptName = dashboardJsFileName ?? `${dashboardIdField ?? effectiveDashboardId}.js`;\n if (!dashboardSessionId) return;\n const result = await instantiateDashboardBundle(client, dashboardSessionId, scriptName);\n if (cancelled) return;\n setCards(result.cards);\n setStyle(result.style);\n } catch (err) {\n if (!cancelled) {\n console.error(err instanceof Error ? err.message : 'Failed to load dashboard');\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n loadBundle();\n return () => {\n cancelled = true;\n };\n // `subAgentStatus?.error` is intentionally omitted — only read behind `subAgentFailed`.\n }, [effectiveDashboardId, dashboardIdField, dashboardJsFileName, dashboardSessionId, isSubAgentTracked, subAgentDone, subAgentFailed, codeGeneration, client]);\n\n const filters = useMemo<ReactNode>(() => {\n if (!dashboard) return null;\n return dashboard.filters?.map((f) => createFilterComponent(dashboard.id!, f, filterOptions));\n }, [dashboard, filterOptions]);\n\n // Layout — memoised against the `dashboard.cards` REFERENCE, so\n // `<GridLayout layouts>` keeps a stable identity across unrelated renders\n // (RGL otherwise fills default {w:1,h:1} placeholders on the second pass).\n const editable = options.editable ?? false;\n const rawLayoutDefinition = useMemo<LayoutItem[] | undefined>(() => {\n if (!dashboard?.cards) return undefined;\n return [...dashboard.cards] as LayoutItem[];\n }, [dashboard?.cards]);\n const layoutDefinition = useMemo<LayoutItem[] | undefined>(() => {\n if (!rawLayoutDefinition) return undefined;\n return rawLayoutDefinition.map((item) => ({ ...item, isResizable: editable, isDraggable: true }));\n }, [rawLayoutDefinition, editable]);\n\n return {\n dashboard,\n cards,\n style,\n loading,\n error,\n setError,\n filters,\n filterOptions,\n stateParameters,\n handleParameterChange,\n containerRef,\n containerWidth,\n rawLayoutDefinition,\n layoutDefinition,\n effectiveDashboardId,\n isPrintPreview,\n snackbar,\n setSnackbar,\n subAgentStatus,\n isSubAgentTracked,\n subAgentDone,\n subAgentFailed,\n };\n}\n","import React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { CloseOutlined, ImportExportOutlined, RebaseEdit, Schedule as ScheduleIcon } from '@mui/icons-material';\nimport { Stack, Box, CircularProgress, Typography, IconButton, Alert, Button, Slider, Snackbar, LinearProgress, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport type { SubAgentDto } from '@aintela/chat/models';\nimport type { Layout, LayoutItem } from 'react-grid-layout';\nimport type { SvgIconComponent } from '@mui/icons-material';\n\nimport { GridCard } from '../grid/GridCard';\nimport { GridLayout } from '../grid/GridLayout';\nimport { DashboardParametersProvider } from '../hooks/DashboardParametersContext';\nimport { ChartCardDefaultsProvider } from '../data/ChartCardDefaultsContext';\nimport type { BiClient } from '../client';\nimport type { Dashboard, CardSpecificType } from './models';\nimport { CATEGORY_PREFIXES, resolveCardMetadata } from './cardMetadata';\nimport { useDashboardBundle, type DashboardWaitingOptions } from './useDashboardBundle';\n\nexport type { DashboardWaitingOptions };\n\nexport interface ScriptDashboardExportArgs {\n dashboard: Dashboard;\n /** Current filter values, as the cards see them. */\n parameters: Record<string, string | string[]>;\n datasetOverride?: string;\n}\n\nexport interface ScriptDashboardHeaderRenderArgs {\n name?: string;\n iconName?: string;\n /** Already-built filter elements ready to drop into the host's chrome. */\n filters: React.ReactNode | null;\n hasFilters: boolean;\n /** Trigger the host's PDF export (`onExportPdf`), or `undefined` when none was given. */\n onExportPdf?: () => void;\n /** Open the host's schedule UI (`onSchedule`), or `undefined`. */\n onSchedule?: () => void;\n /** Navigate to the host's editor (`onEdit`), or `undefined`. */\n onEdit?: () => void;\n exporting: boolean;\n readonly: boolean;\n canEdit: boolean;\n canSchedule: boolean;\n dashboard: Dashboard | null;\n /** The host's dataset control (`datasetOverrideControl` prop), `null` unless admin + parameterised. */\n datasetOverrideControl: React.ReactNode | null;\n}\n\nexport interface ScriptDashboardViewerProps {\n /** Defaults to the ambient `BiClientProvider`. */\n client?: BiClient;\n dashboardId?: string;\n parameters?: Record<string, string | string[]>;\n height?: number | string;\n dragLocked?: boolean;\n /** Provide the dashboard document directly instead of fetching it. */\n dashboard?: Dashboard;\n /** When true, layout items are resizable and `onLayoutCommit` receives user edits. */\n editable?: boolean;\n /** Render the classic title row + buttons + filters bar instead of the compact filters-only bar. */\n useClassicHeader?: boolean;\n onDashloadLoaded?: (dashboard: Dashboard) => void;\n onFiltersChanged?: (filters: Record<string, unknown>) => void;\n /** Replace the built-in header with a host-rendered bar. Receives the built filters + handlers. */\n headerRender?: (args: ScriptDashboardHeaderRenderArgs) => React.ReactNode;\n /** Show the \"waiting for generation\" overlay and poll the sub-agent. */\n dashboardWaiting?: DashboardWaitingOptions;\n /** Data-refresh tick → cards refetch with `noCache`. Does NOT re-instantiate the bundle. */\n llmRenderCount?: number;\n /** Bundle re-instantiation trigger — bump only on real code (re)generation. */\n codeGeneration?: number;\n /** Print / read-only preview (was the `?printPreview=true` URL flag). */\n isPrintPreview?: boolean;\n\n // ── Host callbacks (the legacy viewer called the PDF endpoint, the\n // scheduling service and the composer store itself; now the host does).\n /** Export the dashboard (e.g. call your PDF endpoint). The viewer tracks the `exporting` state around it. */\n onExportPdf?: (args: ScriptDashboardExportArgs) => Promise<void> | void;\n /** Open your scheduling UI. */\n onSchedule?: () => void;\n scheduleLabel?: string;\n /** Navigate to your editor. */\n onEdit?: () => void;\n /** User finished a resize / drag (never fired on prop syncs). */\n onLayoutCommit?: (layout: Layout, oldItem: LayoutItem, newItem: LayoutItem) => void;\n /** Admin-only runtime dataset override threaded into every data fetch. */\n datasetOverride?: string;\n /** Whether the viewer is shown to an admin (gates `datasetOverrideControl`). */\n isAdmin?: boolean;\n /** A ready-to-render dataset picker the host owns; shown when `isAdmin` and the dashboard is parameterised. */\n datasetOverrideControl?: React.ReactNode;\n /** Icon for a card's header, by its specific type. Default: no icon. */\n resolveCardIcon?: (specificType: CardSpecificType) => string | SvgIconComponent | undefined;\n /** Series palette for every chart in this dashboard (defaults to `theme.palette.bi.series`). */\n chartPalette?: readonly string[];\n /** Show the floating zoom slider (default true outside print preview). */\n showZoomControl?: boolean;\n}\n\nconst SubAgentWaitingOverlay: React.FC<{ subAgent: SubAgentDto | null }> = ({ subAgent }) => {\n const theme = useTheme();\n const todoList = subAgent?.todoList;\n const items = todoList?.items ?? [];\n const completedCount = items.filter((i) => i.status === 'Completed').length;\n const totalCount = items.length;\n\n const rawPercent = todoList?.percentComplete;\n const fraction = typeof rawPercent === 'number' && Number.isFinite(rawPercent) ? rawPercent : totalCount > 0 ? completedCount / totalCount : 0;\n const percent = Math.max(0, Math.min(100, fraction * 100));\n const hasProgress = totalCount > 0 || percent > 0;\n\n return (\n <Box\n sx={{\n position: 'relative',\n width: '100%',\n zIndex: 1500,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 2,\n px: 4,\n minHeight: '300px',\n backgroundColor: alpha(theme.palette.background.default, 0.85),\n backdropFilter: 'blur(2px)',\n }}\n >\n <Stack spacing={2} alignItems=\"center\" sx={{ width: '100%', maxWidth: 480 }}>\n <Typography variant=\"h6\" sx={{ color: 'text.primary', textAlign: 'center' }}>\n Aguardando a geração do dashboard\n </Typography>\n {subAgent?.name && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', textAlign: 'center' }}>\n {subAgent.name}\n </Typography>\n )}\n <Box sx={{ width: '100%' }}>\n <LinearProgress variant={hasProgress ? 'determinate' : 'indeterminate'} value={hasProgress ? percent : undefined} sx={{ height: 10, borderRadius: 5 }} />\n <Stack direction=\"row\" justifyContent=\"space-between\" sx={{ mt: 1 }}>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {totalCount > 0 ? `${completedCount} de ${totalCount} tarefas` : 'Inicializando...'}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.primary', fontWeight: 600 }}>\n {`${percent.toFixed(1)}%`}\n </Typography>\n </Stack>\n </Box>\n </Stack>\n </Box>\n );\n};\n\n// Smooths the loading → dashboard hand-off: keeps both layers mounted while the\n// wrapper's inline height animates from the pre-content height to the\n// dashboard's, cross-fading the two.\ntype DashboardBodyPhase = 'pre' | 'arriving' | 'final';\nconst DASHBOARD_BODY_TRANSITION_MS = 520;\n\nconst DashboardBodyTransition: React.FC<{ showPre: boolean; preContent: React.ReactNode; finalContent: React.ReactNode }> = ({ showPre, preContent, finalContent }) => {\n const [phase, setPhase] = useState<DashboardBodyPhase>(() => (showPre ? 'pre' : 'final'));\n const wrapperRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (phase === 'pre' && !showPre) {\n const wrapper = wrapperRef.current;\n const H1 = wrapper?.offsetHeight ?? 0;\n if (wrapper && H1 > 0) wrapper.style.height = `${H1}px`;\n setPhase('arriving');\n } else if (phase !== 'pre' && showPre) {\n const wrapper = wrapperRef.current;\n if (wrapper) {\n wrapper.style.height = '';\n wrapper.style.transition = '';\n }\n setPhase('pre');\n }\n }, [phase, showPre]);\n\n useLayoutEffect(() => {\n if (phase !== 'arriving') return;\n const wrapper = wrapperRef.current;\n const content = contentRef.current;\n if (!wrapper || !content) return;\n const H2 = content.offsetHeight;\n void wrapper.offsetHeight;\n wrapper.style.transition = `height ${DASHBOARD_BODY_TRANSITION_MS}ms cubic-bezier(0.16, 1, 0.3, 1)`;\n wrapper.style.height = `${H2}px`;\n const t = window.setTimeout(() => {\n const w = wrapperRef.current;\n if (w) {\n w.style.height = '';\n w.style.transition = '';\n }\n setPhase('final');\n }, DASHBOARD_BODY_TRANSITION_MS + 40);\n return () => window.clearTimeout(t);\n }, [phase]);\n\n return (\n <Box\n ref={wrapperRef}\n sx={{\n position: 'relative',\n overflow: phase === 'final' ? 'auto' : 'hidden',\n width: '100%',\n flex: 1,\n minHeight: 0,\n '@keyframes dashboardArriveGrow': {\n '0%': { opacity: 0, transform: 'scale(0.97)' },\n '100%': { opacity: 1, transform: 'scale(1)' },\n },\n }}\n >\n {(phase === 'pre' || phase === 'arriving') && (\n <div\n key=\"pre-layer\"\n style={{\n position: phase === 'arriving' ? 'absolute' : 'relative',\n top: 0,\n left: 0,\n right: 0,\n opacity: phase === 'arriving' ? 0 : 1,\n transition: phase === 'arriving' ? 'opacity 360ms ease-out' : 'none',\n pointerEvents: phase === 'arriving' ? 'none' : 'auto',\n width: '100%',\n }}\n >\n {preContent}\n </div>\n )}\n {(phase === 'arriving' || phase === 'final') && (\n <Box\n key=\"content-layer\"\n ref={contentRef}\n sx={{\n width: '100%',\n animation: phase === 'arriving' ? `dashboardArriveGrow ${DASHBOARD_BODY_TRANSITION_MS}ms 60ms cubic-bezier(0.16, 1, 0.3, 1) both` : 'none',\n '@media (prefers-reduced-motion: reduce)': { animation: 'none' },\n }}\n >\n {finalContent}\n </Box>\n )}\n </Box>\n );\n};\n\nexport const ScriptDashboardViewer: React.FC<ScriptDashboardViewerProps> = (props) => {\n const useClassicHeader = props.useClassicHeader ?? false;\n const editable = props.editable ?? false;\n\n const bundle = useDashboardBundle({\n client: props.client,\n dashboardId: props.dashboardId,\n parameters: props.parameters,\n dashboard: props.dashboard,\n dashboardWaiting: props.dashboardWaiting,\n codeGeneration: props.codeGeneration,\n onDashloadLoaded: props.onDashloadLoaded,\n onFiltersChanged: props.onFiltersChanged,\n editable,\n isPrintPreview: props.isPrintPreview,\n });\n\n const {\n dashboard, cards, style, loading, error, setError, filters, filterOptions, stateParameters,\n containerRef, containerWidth, layoutDefinition, effectiveDashboardId, isPrintPreview,\n snackbar, setSnackbar, subAgentStatus, isSubAgentTracked, subAgentDone,\n } = bundle;\n\n const [exporting, setExporting] = useState(false);\n const [zoomLevel, setZoomLevel] = useState<number>(1.03);\n\n const isDashboardParameterized = dashboard?.isDatasetParameterized ?? false;\n const datasetOverrideControl = useMemo<React.ReactNode | null>(() => {\n if (isPrintPreview || !props.isAdmin || !isDashboardParameterized) return null;\n return props.datasetOverrideControl ?? null;\n }, [isPrintPreview, props.isAdmin, isDashboardParameterized, props.datasetOverrideControl]);\n\n const exportPdf = props.onExportPdf\n ? async () => {\n if (!dashboard) return;\n setExporting(true);\n try {\n await props.onExportPdf!({ dashboard, parameters: stateParameters, datasetOverride: props.datasetOverride });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'PDF export failed');\n } finally {\n setExporting(false);\n }\n }\n : undefined;\n\n const canEdit = !!props.onEdit;\n const canSchedule = !!props.onSchedule && !filterOptions.readonly;\n\n const header = props.headerRender ? (\n props.headerRender({\n name: dashboard?.name,\n iconName: dashboard?.muiIconName,\n dashboard: dashboard ?? null,\n filters: filters ?? null,\n hasFilters: (dashboard?.filters?.length ?? 0) > 0,\n onExportPdf: exportPdf,\n onSchedule: props.onSchedule,\n onEdit: props.onEdit,\n exporting,\n readonly: !!filterOptions.readonly,\n canEdit,\n canSchedule,\n datasetOverrideControl,\n })\n ) : !useClassicHeader ? (\n (dashboard?.filters?.length ?? 0) > 0 ? (\n <Stack direction=\"row\" gap={2} sx={{ flexWrap: 'wrap', minWidth: '100%', px: 1.25, py: 1, justifyContent: 'flex-end', alignItems: 'flex-start' }}>\n {filters}\n </Stack>\n ) : null\n ) : (\n <>\n <Stack direction=\"row\" gap={0} sx={{ padding: '5px', marginLeft: '10px', display: 'inline-flex', color: 'text.secondary', alignItems: 'center', marginBottom: '10px', minWidth: '100%' }}>\n <Box sx={{ display: 'inline-flex', flexWrap: 'wrap', minWidth: '100%', alignItems: 'center' }}>\n <Box sx={{ display: 'inline-flex', width: '50%', alignItems: 'center', gap: 1 }}>\n <span className=\"material-icons\" style={{ maxWidth: '24px' }}>{dashboard?.muiIconName ?? 'dashboard'}</span>\n <Typography component=\"h2\" variant=\"h6\" sx={{ m: 0, color: 'text.primary' }}>{dashboard?.name ?? ''}</Typography>\n {datasetOverrideControl}\n </Box>\n <Stack direction=\"row\" gap={3} sx={{ width: '50%', display: 'inline-flex', pr: 2, justifyContent: 'right', alignItems: 'center' }}>\n {canEdit && (\n <Button onClick={props.onEdit} size=\"small\" disabled={exporting} variant=\"outlined\" sx={{ maxWidth: '200px', p: 1 }}>\n <Stack direction=\"row\" gap={0.5} alignItems=\"center\">\n <Typography variant=\"body2\">Edit</Typography>\n <RebaseEdit fontSize=\"small\" sx={{ ml: 1 }} />\n </Stack>\n </Button>\n )}\n {!filterOptions.readonly && (\n <>\n {canSchedule && (\n <Button onClick={props.onSchedule} size=\"small\" variant=\"outlined\" sx={{ maxHeight: '45px', maxWidth: '200px', p: 1 }}>\n <Stack direction=\"row\" gap={0.5} alignItems=\"center\" sx={{ maxHeight: '30px' }}>\n <Typography variant=\"body2\">{props.scheduleLabel ?? 'Agendar'}</Typography>\n <ScheduleIcon sx={{ ml: 1, fontSize: '16px' }} fontSize=\"small\" />\n </Stack>\n </Button>\n )}\n {exportPdf && (\n <Button onClick={exportPdf} size=\"small\" disabled={exporting} variant=\"outlined\" sx={{ maxHeight: '45px', maxWidth: '200px', p: 1 }}>\n <Stack direction=\"row\" gap={0.5} alignItems=\"center\" sx={{ maxHeight: '30px' }}>\n <Typography variant=\"body2\">{exporting ? 'Gerando PDF...' : 'Exportar PDF'}</Typography>\n {exporting ? <CircularProgress size={16} sx={{ ml: 1 }} /> : <ImportExportOutlined sx={{ ml: 1, fontSize: '16px' }} fontSize=\"small\" />}\n </Stack>\n </Button>\n )}\n </>\n )}\n </Stack>\n </Box>\n </Stack>\n\n {(dashboard?.filters?.length ?? 0) > 0 && (\n <Stack\n direction=\"row\"\n gap={2}\n sx={{\n flexWrap: 'wrap',\n width: '100%',\n paddingTop: filterOptions.readonly ? '10px' : '20px',\n paddingBottom: '10px',\n paddingRight: '10px',\n justifyContent: 'flex-end',\n alignItems: 'flex-start',\n backgroundColor: 'action.hover',\n }}\n >\n {filters}\n </Stack>\n )}\n </>\n );\n\n // User-driven boundaries only (RGL's resize-stop / drag-stop). A null\n // old/new item means RGL's internal sync, not a gesture — skip it.\n const commitUserLayoutEdit = (layout: Layout, oldItem: LayoutItem | null, newItem: LayoutItem | null): void => {\n if (!editable) return;\n if (!oldItem || !newItem) return;\n props.onLayoutCommit?.(layout, oldItem, newItem);\n };\n\n const cardsNode = useMemo(() => {\n if (!cards) return undefined;\n const cardViewType = dashboard?.layoutType ?? 'Boxed';\n return cards.map((card) => {\n const { title, specificType, category } = resolveCardMetadata(card, dashboard);\n return (\n <GridCard\n dragLocked={props.dragLocked ?? false}\n viewType={cardViewType}\n key={card.key}\n zoomLevel={1}\n header={{ title: title ?? '', icon: specificType ? props.resolveCardIcon?.(specificType) : undefined }}\n color={CATEGORY_PREFIXES[category ?? 'Generic']}\n >\n {card.element}\n </GridCard>\n );\n });\n }, [cards, dashboard, props.dragLocked, props.resolveCardIcon]);\n\n if (!dashboard && effectiveDashboardId) {\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', gap: 2 }}>\n <CircularProgress />\n <Typography color=\"text.secondary\">Loading dashboard...</Typography>\n </Box>\n );\n }\n if (!dashboard) return null;\n\n const showZoom = (props.showZoomControl ?? true) && !isPrintPreview;\n\n return (\n <ChartCardDefaultsProvider palette={props.chartPalette} rotateBasePerChart>\n <DashboardParametersProvider\n values={{\n dashboardId: dashboard.id ?? effectiveDashboardId ?? '',\n parameters: stateParameters,\n refreshTick: props.llmRenderCount ?? 0,\n datasetOverride: props.datasetOverride,\n }}\n >\n <Stack\n ref={(ref) => {\n containerRef.current = !containerRef.current && ref ? ref : containerRef.current;\n }}\n className=\"bi-dashboard-viewer\"\n sx={{\n height: isPrintPreview ? '100vh' : props.height ?? '100%',\n minHeight: '300px',\n display: 'inline-flex',\n backgroundColor: 'background.default',\n color: 'text.primary',\n overflow: 'hidden',\n width: '100%',\n maxWidth: isPrintPreview ? '1000px' : '100%',\n '& .grid-card::after': { borderRight: 'none', borderBottom: 'none' },\n '& .cardDragHandle': { display: 'none' },\n }}\n >\n <div style={{ position: 'relative', padding: 0, width: '100%', left: -3, height: '100%', maxHeight: '100%', display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}>\n {showZoom && (\n <Box\n sx={{\n position: 'absolute',\n left: '8px',\n bottom: '50px',\n zIndex: 1000,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n px: 1.25,\n py: 0.75,\n borderRadius: 999,\n backgroundColor: 'background.paper',\n border: '1px solid',\n borderColor: 'divider',\n boxShadow: 4,\n minWidth: 180,\n }}\n >\n <Typography variant=\"caption\" sx={{ color: 'text.secondary', textTransform: 'uppercase', letterSpacing: 0.6, fontWeight: 500 }}>\n Zoom\n </Typography>\n <Slider\n value={zoomLevel}\n onChange={(_event, value) => setZoomLevel(value as number)}\n min={0.3}\n max={2}\n step={0.01}\n sx={{ flex: 1, minWidth: 80, color: 'primary.main', height: 3, py: '12px !important', '& .MuiSlider-thumb': { width: 12, height: 12, boxShadow: 'none' }, '& .MuiSlider-rail': { opacity: 0.25 } }}\n />\n <Typography variant=\"caption\" sx={{ color: 'text.primary', fontFamily: 'monospace', minWidth: 32, textAlign: 'right', fontVariantNumeric: 'tabular-nums' }}>\n {Math.round(zoomLevel * 100)}%\n </Typography>\n </Box>\n )}\n\n {header && (\n <Stack direction=\"row\" gap={0} sx={{ display: 'inline-flex', minWidth: '100%', flexWrap: 'wrap', alignItems: 'flex-start', mt: 1, flexShrink: 0 }}>\n {header}\n </Stack>\n )}\n\n {error && (\n <Box sx={{ p: 1, position: 'relative', width: '100%' }}>\n <IconButton size=\"small\" onClick={() => setError(null)} sx={{ position: 'absolute', right: 10, top: 10 }}>\n <CloseOutlined fontSize=\"small\" />\n </IconButton>\n <Alert severity=\"error\">\n <Typography variant=\"subtitle1\" fontWeight=\"bold\">Dashboard load failed</Typography>\n <Typography variant=\"body2\">{error}</Typography>\n </Alert>\n </Box>\n )}\n\n <DashboardBodyTransition\n showPre={(isSubAgentTracked && !subAgentDone) || loading || containerWidth === 0 || !layoutDefinition || !cardsNode}\n preContent={\n isSubAgentTracked && !subAgentDone ? (\n <SubAgentWaitingOverlay subAgent={subAgentStatus} />\n ) : loading ? (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', minHeight: 300, width: '100%', gap: 2 }}>\n <CircularProgress />\n <Typography color=\"text.secondary\">Loading dashboard...</Typography>\n </Box>\n ) : null\n }\n finalContent={\n <div id=\"renderedDashboard\" style={{ paddingTop: 2, alignContent: 'center', minHeight: '100vh', overflow: 'auto', width: '100%' }}>\n <GridLayout\n rowAwareResize={{ defaultOn: true }}\n config={{ rows: [] }}\n cols={{ lg: 10, md: 8, sm: 4, xs: 4, xxs: 4 }}\n breakpoints={{ lg: 920, md: 600, sm: 400, xs: 400, xxs: 0 }}\n zoomLevel={zoomLevel}\n responsive={false}\n rowHeight={isPrintPreview ? 18 : 20}\n dragLocked={props.dragLocked ?? false}\n rowMultiplier={1}\n maxRows={200}\n onResizeStop={commitUserLayoutEdit}\n onDragStop={commitUserLayoutEdit}\n manualWidth={containerWidth}\n layouts={layoutDefinition}\n >\n {cardsNode}\n </GridLayout>\n {style}\n </div>\n }\n />\n </div>\n\n <Snackbar open={snackbar.open} autoHideDuration={4000} onClose={() => setSnackbar((prev) => ({ ...prev, open: false }))} anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}>\n <Alert onClose={() => setSnackbar((prev) => ({ ...prev, open: false }))} severity={snackbar.severity} variant=\"filled\">\n {snackbar.message}\n </Alert>\n </Snackbar>\n </Stack>\n </DashboardParametersProvider>\n </ChartCardDefaultsProvider>\n );\n};\n\nexport default ScriptDashboardViewer;\n","// Vertical dashboard viewer: stacks cards in a portrait column instead of a\n// grid (a collapsed side panel). Data loading is shared via useDashboardBundle;\n// this file owns only the layout (no header, no zoom pill).\nimport React, { useMemo } from 'react';\nimport { CloseOutlined } from '@mui/icons-material';\nimport type { SvgIconComponent } from '@mui/icons-material';\nimport { Stack, Box, CircularProgress, Typography, IconButton, Alert, Snackbar } from '@mui/material';\nimport { GridCard } from '../grid/GridCard';\nimport { DashboardParametersProvider } from '../hooks/DashboardParametersContext';\nimport type { BiClient } from '../client';\nimport type { Dashboard, CardSpecificType } from './models';\nimport { resolveCardMetadata } from './cardMetadata';\nimport { useDashboardBundle, type DashboardWaitingOptions } from './useDashboardBundle';\n\nexport interface ScriptDashboardViewerVerticalProps {\n client?: BiClient;\n dashboardId?: string;\n parameters?: Record<string, string | string[]>;\n height?: number | string;\n dashboard?: Dashboard;\n onDashloadLoaded?: (dashboard: Dashboard) => void;\n onFiltersChanged?: (filters: Record<string, unknown>) => void;\n dashboardWaiting?: DashboardWaitingOptions;\n /** Data-refresh tick → `refreshTick` (cards refetch). Does NOT re-instantiate the bundle. */\n llmRenderCount?: number;\n /** Bundle re-instantiation trigger — bump only on real code (re)generation. */\n codeGeneration?: number;\n isPrintPreview?: boolean;\n datasetOverride?: string;\n resolveCardIcon?: (specificType: CardSpecificType) => string | SvgIconComponent | undefined;\n}\n\nexport const ScriptDashboardViewerVertical: React.FC<ScriptDashboardViewerVerticalProps> = (props) => {\n const bundle = useDashboardBundle({\n client: props.client,\n dashboardId: props.dashboardId,\n parameters: props.parameters,\n dashboard: props.dashboard,\n dashboardWaiting: props.dashboardWaiting,\n codeGeneration: props.codeGeneration,\n onDashloadLoaded: props.onDashloadLoaded,\n onFiltersChanged: props.onFiltersChanged,\n isPrintPreview: props.isPrintPreview,\n });\n\n const { dashboard, cards, loading, error, setError, stateParameters, containerRef, containerWidth, layoutDefinition, effectiveDashboardId, isPrintPreview, snackbar, setSnackbar } = bundle;\n\n // Fixed-height cards (160px metric/gauge, 250px otherwise), slightly zoomed\n // to fit the narrow column, hairline divider when the layout is `Naked`.\n const cardsNode = useMemo(() => {\n if (!cards) return undefined;\n const cardViewType = dashboard?.layoutType ?? 'Boxed';\n return cards.map((card) => {\n const { title, specificType } = resolveCardMetadata(card, dashboard);\n const isMetric = specificType === 'MetricComparison' || specificType === 'Gauge' || specificType == undefined;\n return (\n <Box\n key={card.key}\n sx={{\n height: isMetric ? '160px' : '250px',\n maxWidth: '100%',\n mx: 0.5,\n borderBottom: dashboard?.layoutType === 'Naked' ? '1px solid' : 'unset',\n borderColor: 'divider',\n }}\n >\n <GridCard dragLocked noBorder viewType={cardViewType} zoomLevel={isMetric ? 0.9 : 0.7} header={{ title: title ?? '', icon: specificType ? props.resolveCardIcon?.(specificType) : undefined }}>\n {card.element}\n </GridCard>\n </Box>\n );\n });\n }, [cards, dashboard, props.resolveCardIcon]);\n\n if (!dashboard && effectiveDashboardId) {\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', gap: 2 }}>\n <CircularProgress />\n <Typography color=\"text.secondary\">Loading dashboard...</Typography>\n </Box>\n );\n }\n if (!dashboard) return null;\n\n return (\n <Stack\n ref={(ref) => {\n containerRef.current = !containerRef.current && ref ? ref : containerRef.current;\n }}\n className=\"bi-dashboard-viewer-vertical\"\n sx={{\n height: isPrintPreview ? '100vh' : props.height ?? 'unset',\n display: 'inline-flex',\n backgroundColor: 'background.default',\n color: 'text.primary',\n minHeight: '300px',\n overflow: 'auto',\n width: '100%',\n maxWidth: isPrintPreview ? '1000px' : '100%',\n '& .grid-card::after': { borderRight: 'none', borderBottom: 'none' },\n '& .cardDragHandle': { display: 'none' },\n }}\n >\n <div style={{ position: 'relative', width: '100%', height: '100%', maxHeight: '100%', display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}>\n {loading && (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', gap: 2 }}>\n <CircularProgress />\n <Typography color=\"text.secondary\">Loading dashboard...</Typography>\n </Box>\n )}\n\n {error && (\n <Box sx={{ p: 1, position: 'relative', width: '100%' }}>\n <IconButton size=\"small\" onClick={() => setError(null)} sx={{ position: 'absolute', right: 10, top: 10 }}>\n <CloseOutlined fontSize=\"small\" />\n </IconButton>\n <Alert severity=\"error\">\n <Typography variant=\"subtitle1\" fontWeight=\"bold\">Dashboard load failed</Typography>\n <Typography variant=\"body2\">{error}</Typography>\n </Alert>\n </Box>\n )}\n\n {!loading && containerWidth !== 0 && layoutDefinition && cardsNode && (\n <DashboardParametersProvider\n values={{\n dashboardId: dashboard.id ?? effectiveDashboardId ?? '',\n parameters: stateParameters ?? {},\n refreshTick: props.llmRenderCount ?? 0,\n datasetOverride: props.datasetOverride,\n }}\n >\n <Stack sx={{ width: '100%' }} gap={1}>\n {cardsNode}\n </Stack>\n </DashboardParametersProvider>\n )}\n <Box sx={{ minHeight: '70px', minWidth: '100%' }} />\n </div>\n\n <Snackbar open={snackbar.open} autoHideDuration={4000} onClose={() => setSnackbar((prev) => ({ ...prev, open: false }))} anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}>\n <Alert onClose={() => setSnackbar((prev) => ({ ...prev, open: false }))} severity={snackbar.severity} variant=\"filled\">\n {snackbar.message}\n </Alert>\n </Snackbar>\n </Stack>\n );\n};\n\nexport default ScriptDashboardViewerVertical;\n"],"names":["CATEGORY_PREFIXES","resolveCardMetadata","card","dashboard","related","_a","i","title","specificType","category","__name","registeredSpecifiers","extraHostModules","hostModulesCache","seedHostModules","specifiers","extra","s","getRegisteredSpecifiers","getHostModules","MuiMaterial","MuiIconsMaterial","Recharts","getBiModuleSurface","surface","map","React","jsxRuntime","ReactDOM","ReactDOMClient","MuiMaterialStyles","EmotionReact","EmotionStyled","dayjs","spec","MAX_CACHED_BUNDLES","compiledBundleCache","hashBundleCode","code","h","clearBundleCaches","evaluateDashboardBundle","cacheKey","HOST_MODULES","hash","cached","moduleShim","requireShim","name","mod","key","hostMod","exported","moduleExport","oldestKey","loadDashboardBundle","client","sessionId","dashboardId","instantiateDashboardBundle","scriptFileName","DashboardClass","instance","useDashboardBundle","options","ambientClient","useBiClientOptional","resolvedClient","localDashboard","setLocalDashboard","useState","onDashLoadedRef","useRef","onFiltersChangedRef","cards","setCards","style","setStyle","loading","setLoading","error","setError","isPrintPreview","stateParameters","setStateParameters","handleParameterChange","useCallback","value","prev","_removed","rest","next","optionsParametersKey","reportParameters","useMemo","filterOptions","useEffect","effectiveDashboardId","containerRef","containerWidth","useContainerRectangle","snackbar","setSnackbar","subAgentStatus","setSubAgentStatus","waitingSubAgentId","isSubAgentTracked","subAgentDone","isSubAgentTerminalStatus","subAgentFailed","pollSessionId","_b","pollIntervalMs","_c","intervalMs","cancelled","timeoutHandle","poll","status","err","loadMetadata","dash","codeGeneration","dashboardIdField","dashboardJsFileName","dashboardSessionId","loadBundle","scriptName","result","filters","f","createFilterComponent","editable","rawLayoutDefinition","layoutDefinition","item","SubAgentWaitingOverlay","subAgent","theme","useTheme","todoList","items","completedCount","totalCount","rawPercent","fraction","percent","hasProgress","jsx","Box","alpha","jsxs","Stack","Typography","LinearProgress","DASHBOARD_BODY_TRANSITION_MS","DashboardBodyTransition","showPre","preContent","finalContent","phase","setPhase","wrapperRef","contentRef","useLayoutEffect","wrapper","H1","content","H2","t","w","ScriptDashboardViewer","props","useClassicHeader","bundle","exporting","setExporting","zoomLevel","setZoomLevel","isDashboardParameterized","datasetOverrideControl","exportPdf","canEdit","canSchedule","header","Fragment","Button","RebaseEdit","ScheduleIcon","CircularProgress","ImportExportOutlined","commitUserLayoutEdit","layout","oldItem","newItem","cardsNode","cardViewType","GridCard","showZoom","ChartCardDefaultsProvider","DashboardParametersProvider","ref","Slider","_event","IconButton","CloseOutlined","Alert","GridLayout","Snackbar","ScriptDashboardViewerVertical","isMetric"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScriptDashboardViewerVertical-Db2sFEEl.js","sources":["../src/viewer/cardMetadata.ts","../src/runtime/loadDashboardBundle.ts","../src/viewer/useDashboardBundle.ts","../src/viewer/ScriptDashboardViewer.tsx","../src/viewer/ScriptDashboardViewerVertical.tsx"],"sourcesContent":["import type { GridCardColor } from '../grid/GridCard';\nimport type { DashboardCardDefinition } from '../runtime/IDashboardDefinition';\nimport type { CardCategory, CardSpecificType, Dashboard } from './models';\n\n/** Card category → GridCard accent variant. */\nexport const CATEGORY_PREFIXES: Record<CardCategory, GridCardColor> = {\n Generic: 'custom',\n Métrica: 'kpi',\n Tabela: 'table',\n Gráfico: 'chart',\n Mapa: 'iframe',\n Árvore: 'chart',\n Medidor: 'chart',\n};\n\n/**\n * Per-card metadata: the sketch (`dashboard.cards[i]`) overrides the bundle's\n * hardcoded title / specificType / category; the bundle's values are the\n * fallback.\n */\nexport function resolveCardMetadata(\n card: DashboardCardDefinition,\n dashboard: Dashboard | undefined,\n): { title: string | undefined; specificType: CardSpecificType | undefined; category: CardCategory | undefined } {\n const related = dashboard?.cards?.find((i) => i.i === card.key) ?? null;\n const title = related?.name !== card.title ? related?.name : card.title;\n const specificType = (related?.specificType !== card.specificType ? related?.specificType : card.specificType) as CardSpecificType | undefined;\n const category = (related?.category !== card.category ? related?.category : card.category) as CardCategory | undefined;\n return { title, specificType, category };\n}\n","// Static imports stay to what every host already has (React, Emotion,\n// @mui/material/styles, dayjs). The heavy namespaces — @mui/material,\n// @mui/icons-material, recharts — are dynamic imports so a host bundler\n// code-splits them into chunks fetched only when a dashboard bundle actually\n// resolves a `require('@mui/material')` at runtime.\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as ReactDOMClient from 'react-dom/client';\nimport * as jsxRuntime from 'react/jsx-runtime';\nimport * as EmotionReact from '@emotion/react';\nimport * as EmotionStyled from '@emotion/styled';\nimport * as dayjs from 'dayjs';\nimport * as MuiMaterialStyles from '@mui/material/styles';\n\nimport type { BiClient } from '../client';\nimport type { DashboardCardDefinition, IDashboardDefinition } from './IDashboardDefinition';\n// NOT a static import, deliberately. `biModuleSurface` does `import * as Viewer from '../viewer'`, the\n// viewer's `useDashboardBundle` imports `instantiateDashboardBundle` from THIS file, and this file needs\n// the surface — a real cycle. Unbundled ESM tolerates it, because a namespace object is materialised\n// lazily; the BUNDLE does not. Rollup put the whole loop in one chunk and built the viewer's frozen\n// namespace eagerly, so importing `@aintela/bi`, `/runtime`, `/viewer` or `/composer` from the published\n// package threw `ReferenceError: Cannot access '_e' before initialization` before a single line of app\n// code ran. The surface is only needed inside `getHostModules`, which is already async, so deferring the\n// import to call time breaks the static cycle and costs nothing. Keep it dynamic.\n\n// ── Host-module map ────────────────────────────────────────────────────\n// `require(spec)` inside a CJS bundle resolves against this map. The BI\n// specifiers are seeded by `registerBiModules({ specifiers })` — the same\n// strings the live-TSX `__scope` registry uses — so a bundle compiled against\n// `@aintela/bi` (or a legacy `@envision/ui-library`) finds the same object.\nconst registeredSpecifiers = new Set<string>();\nlet extraHostModules: Record<string, unknown> = {};\nlet hostModulesCache: Record<string, unknown> | null = null;\n\n/** Called by `registerBiModules`. Invalidates the resolved map so the next bundle load rebuilds it. */\nexport function seedHostModules(specifiers: string[], extra?: Record<string, unknown>): void {\n for (const s of specifiers) registeredSpecifiers.add(s);\n if (extra) extraHostModules = { ...extraHostModules, ...extra };\n hostModulesCache = null;\n}\n\n/** Specifiers `registerBiModules` has seeded so far (test/diagnostic seam). */\nexport function getRegisteredSpecifiers(): string[] {\n return [...registeredSpecifiers];\n}\n\nexport async function getHostModules(): Promise<Record<string, unknown>> {\n if (hostModulesCache) return hostModulesCache;\n\n const [MuiMaterial, MuiIconsMaterial, Recharts] = await Promise.all([\n import('@mui/material'),\n import('@mui/icons-material'),\n import('recharts'),\n ]);\n\n const { getBiModuleSurface } = await import('./biModuleSurface');\n const surface = getBiModuleSurface();\n const map: Record<string, unknown> = {\n react: React,\n 'react/jsx-runtime': jsxRuntime,\n 'react-dom': ReactDOM,\n 'react-dom/client': ReactDOMClient,\n '@mui/material': MuiMaterial,\n '@mui/icons-material': MuiIconsMaterial,\n '@mui/material/styles': MuiMaterialStyles,\n '@emotion/react': EmotionReact,\n '@emotion/styled': EmotionStyled,\n recharts: Recharts,\n dayjs,\n ...extraHostModules,\n };\n for (const spec of registeredSpecifiers) map[spec] = surface;\n\n hostModulesCache = map;\n return map;\n}\n\n// ── Compiled-bundle cache (bounded LRU) ────────────────────────────────\n// The expensive step is the `new Function(code)` compile. Keyed by\n// `${sessionId}::${scriptName}` with a content hash so identical bytes reuse\n// the compiled module and regenerated bytes (same filename) recompile.\nconst MAX_CACHED_BUNDLES = 6;\ninterface CompiledBundleEntry { hash: string; module: unknown }\nconst compiledBundleCache = new Map<string, CompiledBundleEntry>();\n\n/** FNV-1a 32-bit + length. Not cryptographic; only detects a changed bundle. */\nexport function hashBundleCode(code: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < code.length; i++) {\n h ^= code.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return `${(h >>> 0).toString(36)}:${code.length}`;\n}\n\n/** Test seam. */\nexport function clearBundleCaches(): void {\n compiledBundleCache.clear();\n hostModulesCache = null;\n}\n\n/**\n * Evaluates CJS bundle code against the host-module map and returns its\n * default export (or the whole `exports` object). Exposed so a host with its\n * own transport can skip `loadDashboardBundle`.\n */\nexport async function evaluateDashboardBundle(code: string, cacheKey?: string): Promise<unknown> {\n const HOST_MODULES = await getHostModules();\n\n const hash = hashBundleCode(code);\n if (cacheKey) {\n const cached = compiledBundleCache.get(cacheKey);\n if (cached && cached.hash === hash) {\n compiledBundleCache.delete(cacheKey);\n compiledBundleCache.set(cacheKey, cached);\n return cached.module;\n }\n }\n\n const moduleShim = { exports: {} as Record<string, unknown> };\n const requireShim = (name: string) => {\n const mod = HOST_MODULES[name];\n if (mod !== undefined) return mod;\n // Subpath imports (e.g. `@mui/icons-material/ArrowDownward`) resolve to\n // the named export of the matching host module.\n for (const [key, hostMod] of Object.entries(HOST_MODULES)) {\n if (name.startsWith(key + '/') && hostMod && typeof hostMod === 'object') {\n const exported = (hostMod as Record<string, unknown>)[name.slice(key.length + 1)];\n if (exported !== undefined) return { default: exported, __esModule: true };\n }\n }\n throw new Error(`Dashboard bundle requires unknown module: \"${name}\". Register it with registerBiModules({ specifiers | extraHostModules }).`);\n };\n\n new Function('require', 'module', 'exports', code)(requireShim, moduleShim, moduleShim.exports);\n\n const moduleExport = moduleShim.exports.default ?? moduleShim.exports;\n\n if (cacheKey) {\n compiledBundleCache.delete(cacheKey);\n compiledBundleCache.set(cacheKey, { hash, module: moduleExport });\n if (compiledBundleCache.size > MAX_CACHED_BUNDLES) {\n const oldestKey = compiledBundleCache.keys().next().value;\n if (oldestKey !== undefined) compiledBundleCache.delete(oldestKey);\n }\n }\n return moduleExport;\n}\n\n/**\n * Fetches a CJS dashboard bundle through the client and executes it in a\n * sandboxed scope with the host's React and this library.\n *\n * @returns the bundle's default export (typically a class implementing `IDashboardDefinition`)\n */\nexport async function loadDashboardBundle(client: BiClient, sessionId: string, dashboardId: string): Promise<unknown> {\n const [code] = await Promise.all([client.fetchDashboardBundle(sessionId, dashboardId), getHostModules()]);\n return evaluateDashboardBundle(code, `${sessionId}::${dashboardId}`);\n}\n\nexport interface DashboardBundleResult {\n instance: IDashboardDefinition;\n cards: DashboardCardDefinition[];\n style: React.ReactNode;\n}\n\n/** Loads a bundle, instantiates the class it exports, returns cards + style node. */\nexport async function instantiateDashboardBundle(client: BiClient, sessionId: string, scriptFileName: string): Promise<DashboardBundleResult> {\n const DashboardClass = (await loadDashboardBundle(client, sessionId, scriptFileName)) as new () => IDashboardDefinition;\n const instance = new DashboardClass();\n return {\n instance,\n cards: [...instance.getCardsList()],\n style: instance.getDashboardStyle(),\n };\n}\n","// Shared data-loading machinery for ScriptDashboardViewer and\n// ScriptDashboardViewerVertical — HEADLESS: no router, no app store, no\n// scheduling service. It reads a dashboard model (passed in or fetched by id\n// through the BiClient), instantiates the JS bundle, builds the filter\n// components, drives the parameters, and optionally polls a sub-agent while\n// it generates the dashboard. Layout / chrome belong to the viewers.\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { MutableRefObject, ReactNode, Dispatch, SetStateAction } from 'react';\nimport type { LayoutItem } from 'react-grid-layout';\nimport type { SubAgentDto } from '@aintela/chat/models';\nimport { isSubAgentTerminalStatus } from '@aintela/chat/models';\n\nimport { useBiClientOptional, type BiClient } from '../client';\nimport { instantiateDashboardBundle } from '../runtime/loadDashboardBundle';\nimport type { DashboardCardDefinition } from '../runtime/IDashboardDefinition';\nimport { createFilterComponent } from '../filters/filterFactory';\nimport { useContainerRectangle } from '../cards/useContainerRectangle';\nimport type { Dashboard } from './models';\n\nexport interface DashboardWaitingOptions {\n /** Id of the SubAgent currently generating this dashboard. */\n subAgentId: string;\n /**\n * Chat session the sub-agent runs in. Falls back to\n * `dashboard.originalSessionId` (undefined while the dashboard is still\n * being generated — pass it explicitly for the waiting case).\n */\n sessionId?: string;\n /** Polling interval in ms while the sub-agent is running. Minimum / default 10000. */\n pollIntervalMs?: number;\n}\n\nexport interface UseDashboardBundleOptions {\n /** Defaults to the ambient `BiClientProvider`. */\n client?: BiClient;\n dashboardId?: string;\n parameters?: Record<string, string | string[]>;\n dashboard?: Dashboard;\n dashboardWaiting?: DashboardWaitingOptions;\n /**\n * Re-instantiation trigger: bump ONLY when the bundle CODE is (re)generated,\n * loaded or explicitly refreshed. Not for per-edit layout commits — the\n * agent-emitted JS only changes on a rebuild, and the server derives the\n * filename from the dashboard NAME so `jsFileName` cannot signal one.\n */\n codeGeneration?: number;\n onDashloadLoaded?: (dashboard: Dashboard) => void;\n onFiltersChanged?: (filters: Record<string, unknown>) => void;\n /** Keep `isResizable` on layout items (read-only viewers leave it false). */\n editable?: boolean;\n /** Print / read-only preview (was the `?printPreview=true` URL flag). */\n isPrintPreview?: boolean;\n}\n\nexport interface DashboardBundleSnackbarState {\n open: boolean;\n message: string;\n severity: 'success' | 'error';\n}\n\nexport interface DashboardBundleResult {\n dashboard: Dashboard | undefined;\n cards: DashboardCardDefinition[] | null;\n style: ReactNode | null;\n loading: boolean;\n error: string | null;\n setError: (e: string | null) => void;\n\n filters: ReactNode;\n filterOptions: { onChange: (key: string, value: string | string[]) => void; parameters: Record<string, string | string[]>; readonly: boolean };\n stateParameters: Record<string, string | string[]>;\n handleParameterChange: (key: string, value: string | string[]) => void;\n\n containerRef: MutableRefObject<HTMLDivElement | null>;\n containerWidth: number;\n rawLayoutDefinition: LayoutItem[] | undefined;\n layoutDefinition: LayoutItem[] | undefined;\n\n effectiveDashboardId: string | undefined;\n isPrintPreview: boolean;\n\n snackbar: DashboardBundleSnackbarState;\n setSnackbar: Dispatch<SetStateAction<DashboardBundleSnackbarState>>;\n\n subAgentStatus: SubAgentDto | null;\n isSubAgentTracked: boolean;\n subAgentDone: boolean;\n subAgentFailed: boolean;\n}\n\nexport function useDashboardBundle(options: UseDashboardBundleOptions): DashboardBundleResult {\n const ambientClient = useBiClientOptional();\n const resolvedClient = options.client ?? ambientClient;\n if (!resolvedClient) {\n throw new Error('[@aintela/bi] useDashboardBundle needs a BiClient: pass `client` or mount <BiClientProvider>.');\n }\n const client: BiClient = resolvedClient;\n\n // `props.dashboard ?? localDashboard` is the canonical read; never mirror the prop into state.\n const [localDashboard, setLocalDashboard] = useState<Dashboard | undefined>(options.dashboard);\n const dashboard = options.dashboard ?? localDashboard;\n\n // Latest host callbacks in refs so inline lambdas do not re-run the effects.\n const onDashLoadedRef = useRef(options.onDashloadLoaded);\n onDashLoadedRef.current = options.onDashloadLoaded;\n const onFiltersChangedRef = useRef(options.onFiltersChanged);\n onFiltersChangedRef.current = options.onFiltersChanged;\n\n const [cards, setCards] = useState<DashboardCardDefinition[] | null>(null);\n const [style, setStyle] = useState<ReactNode | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isPrintPreview = options.isPrintPreview ?? false;\n const [stateParameters, setStateParameters] = useState<Record<string, string | string[]>>(options.parameters ?? {});\n\n const handleParameterChange = useCallback((key: string, value: string | string[]) => {\n setStateParameters((prev) => {\n if (!value || (Array.isArray(value) && value.length === 0)) {\n const { [key]: _removed, ...rest } = prev;\n return rest;\n }\n const next = { ...prev, [key]: value };\n onFiltersChangedRef.current?.(next);\n return next;\n });\n }, []);\n\n // Host-supplied parameters are the authoritative external source. Memoised\n // structurally so a fresh object per render does not re-fire the merge.\n const optionsParametersKey = JSON.stringify(options.parameters ?? {});\n const reportParameters = useMemo<Record<string, string | string[]>>(\n () => ({ ...(options.parameters ?? {}) }),\n [optionsParametersKey],\n );\n\n // Defined on the very first render so filter components mounted with a\n // sync `dashboard` prop have a real onChange from their first mount.\n const filterOptions = useMemo(\n () => ({ onChange: handleParameterChange, parameters: reportParameters, readonly: isPrintPreview }),\n [reportParameters, isPrintPreview, handleParameterChange],\n );\n\n useEffect(() => {\n setStateParameters((prev) => ({ ...prev, ...reportParameters }));\n }, [reportParameters]);\n\n const effectiveDashboardId = options.dashboardId ?? dashboard?.id;\n\n // Container width — re-measured when the dashboard arrives, because the\n // spinner branch does not mount the element that owns `containerRef`.\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [containerWidth] = useContainerRectangle(containerRef, 0, 0, `${effectiveDashboardId}-${dashboard?.id ?? 'pending'}`);\n\n const [snackbar, setSnackbar] = useState<DashboardBundleSnackbarState>({ open: false, message: '', severity: 'success' });\n\n // Sub-agent polling (only when the host opts in).\n const [subAgentStatus, setSubAgentStatus] = useState<SubAgentDto | null>(null);\n const waitingSubAgentId = options.dashboardWaiting?.subAgentId;\n const isSubAgentTracked = Boolean(waitingSubAgentId);\n const subAgentDone = !isSubAgentTracked || isSubAgentTerminalStatus(subAgentStatus?.status);\n const subAgentFailed = subAgentStatus?.status === 'Failed' || subAgentStatus?.status === 'Cancelled';\n const pollSessionId = options.dashboardWaiting?.sessionId ?? dashboard?.originalSessionId ?? undefined;\n const pollIntervalMs = options.dashboardWaiting?.pollIntervalMs;\n\n useEffect(() => {\n if (!isSubAgentTracked || !waitingSubAgentId || !pollSessionId) {\n setSubAgentStatus(null);\n return;\n }\n const intervalMs = Math.max(pollIntervalMs ?? 0, 10000);\n let cancelled = false;\n let timeoutHandle: ReturnType<typeof setTimeout> | null = null;\n\n const poll = async () => {\n try {\n const status = await client.getSubAgentStatus<SubAgentDto>(pollSessionId, waitingSubAgentId);\n if (cancelled) return;\n setSubAgentStatus(status);\n if (status && isSubAgentTerminalStatus(status.status)) return;\n } catch (err) {\n if (cancelled) return;\n console.error('Failed to poll sub-agent status:', err);\n }\n if (!cancelled) timeoutHandle = setTimeout(poll, intervalMs);\n };\n\n poll();\n return () => {\n cancelled = true;\n if (timeoutHandle) clearTimeout(timeoutHandle);\n };\n }, [isSubAgentTracked, waitingSubAgentId, pollSessionId, pollIntervalMs, client]);\n\n // Metadata fetch (when no `dashboard` prop).\n useEffect(() => {\n let cancelled = false;\n async function loadMetadata() {\n if (options.dashboard) return;\n if (!effectiveDashboardId) return;\n try {\n const dash = await client.getDashboard<Dashboard>(effectiveDashboardId);\n if (cancelled) return;\n setLocalDashboard(dash);\n onDashLoadedRef.current?.(dash);\n } catch (err) {\n if (!cancelled) setError(err instanceof Error ? err.message : 'Failed to load dashboard');\n }\n }\n loadMetadata();\n return () => {\n cancelled = true;\n };\n }, [effectiveDashboardId, options.dashboard, client]);\n\n // Bundle instantiation — depends on the bundle IDENTITY fields only, not\n // the whole `dashboard` object, so layout-only edits do not re-instantiate.\n const codeGeneration = options.codeGeneration;\n const dashboardIdField = dashboard?.id;\n const dashboardJsFileName = dashboard?.jsFileName;\n const dashboardSessionId = dashboard?.originalSessionId;\n useEffect(() => {\n let cancelled = false;\n async function loadBundle() {\n if (isSubAgentTracked && !subAgentDone) return;\n if (isSubAgentTracked && subAgentFailed) {\n setLoading(false);\n setError(subAgentStatus?.error ?? 'A geração do dashboard falhou.');\n return;\n }\n if (!effectiveDashboardId && !dashboardIdField) return;\n if (dashboardIdField !== undefined && !dashboardSessionId) {\n console.error('Dashboard has no originalSessionId');\n setError('Dashboard has no originalSessionId');\n return;\n }\n\n setError(null);\n setLoading(true);\n try {\n const scriptName = dashboardJsFileName ?? `${dashboardIdField ?? effectiveDashboardId}.js`;\n if (!dashboardSessionId) return;\n const result = await instantiateDashboardBundle(client, dashboardSessionId, scriptName);\n if (cancelled) return;\n setCards(result.cards);\n setStyle(result.style);\n } catch (err) {\n if (!cancelled) {\n console.error(err instanceof Error ? err.message : 'Failed to load dashboard');\n setError(err instanceof Error ? err.message : 'Failed to load dashboard');\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n loadBundle();\n return () => {\n cancelled = true;\n };\n // `subAgentStatus?.error` is intentionally omitted — only read behind `subAgentFailed`.\n }, [effectiveDashboardId, dashboardIdField, dashboardJsFileName, dashboardSessionId, isSubAgentTracked, subAgentDone, subAgentFailed, codeGeneration, client]);\n\n const filters = useMemo<ReactNode>(() => {\n if (!dashboard) return null;\n return dashboard.filters?.map((f) => createFilterComponent(dashboard.id!, f, filterOptions));\n }, [dashboard, filterOptions]);\n\n // Layout — memoised against the `dashboard.cards` REFERENCE, so\n // `<GridLayout layouts>` keeps a stable identity across unrelated renders\n // (RGL otherwise fills default {w:1,h:1} placeholders on the second pass).\n const editable = options.editable ?? false;\n const rawLayoutDefinition = useMemo<LayoutItem[] | undefined>(() => {\n if (!dashboard?.cards) return undefined;\n return [...dashboard.cards] as LayoutItem[];\n }, [dashboard?.cards]);\n const layoutDefinition = useMemo<LayoutItem[] | undefined>(() => {\n if (!rawLayoutDefinition) return undefined;\n return rawLayoutDefinition.map((item) => ({ ...item, isResizable: editable, isDraggable: true }));\n }, [rawLayoutDefinition, editable]);\n\n return {\n dashboard,\n cards,\n style,\n loading,\n error,\n setError,\n filters,\n filterOptions,\n stateParameters,\n handleParameterChange,\n containerRef,\n containerWidth,\n rawLayoutDefinition,\n layoutDefinition,\n effectiveDashboardId,\n isPrintPreview,\n snackbar,\n setSnackbar,\n subAgentStatus,\n isSubAgentTracked,\n subAgentDone,\n subAgentFailed,\n };\n}\n","import React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { CloseOutlined, ImportExportOutlined, RebaseEdit, Schedule as ScheduleIcon } from '@mui/icons-material';\nimport { Stack, Box, CircularProgress, Typography, IconButton, Alert, Button, Slider, Snackbar, LinearProgress, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport type { SubAgentDto } from '@aintela/chat/models';\nimport type { Layout, LayoutItem } from 'react-grid-layout';\nimport type { SvgIconComponent } from '@mui/icons-material';\n\nimport { GridCard } from '../grid/GridCard';\nimport { GridLayout } from '../grid/GridLayout';\nimport { DashboardParametersProvider } from '../hooks/DashboardParametersContext';\nimport { ChartCardDefaultsProvider } from '../data/ChartCardDefaultsContext';\nimport type { BiClient } from '../client';\nimport type { Dashboard, CardSpecificType } from './models';\nimport { CATEGORY_PREFIXES, resolveCardMetadata } from './cardMetadata';\nimport { useDashboardBundle, type DashboardWaitingOptions } from './useDashboardBundle';\n\nexport type { DashboardWaitingOptions };\n\nexport interface ScriptDashboardExportArgs {\n dashboard: Dashboard;\n /** Current filter values, as the cards see them. */\n parameters: Record<string, string | string[]>;\n datasetOverride?: string;\n}\n\nexport interface ScriptDashboardHeaderRenderArgs {\n name?: string;\n iconName?: string;\n /** Already-built filter elements ready to drop into the host's chrome. */\n filters: React.ReactNode | null;\n hasFilters: boolean;\n /** Trigger the host's PDF export (`onExportPdf`), or `undefined` when none was given. */\n onExportPdf?: () => void;\n /** Open the host's schedule UI (`onSchedule`), or `undefined`. */\n onSchedule?: () => void;\n /** Navigate to the host's editor (`onEdit`), or `undefined`. */\n onEdit?: () => void;\n exporting: boolean;\n readonly: boolean;\n canEdit: boolean;\n canSchedule: boolean;\n dashboard: Dashboard | null;\n /** The host's dataset control (`datasetOverrideControl` prop), `null` unless admin + parameterised. */\n datasetOverrideControl: React.ReactNode | null;\n}\n\nexport interface ScriptDashboardViewerProps {\n /** Defaults to the ambient `BiClientProvider`. */\n client?: BiClient;\n dashboardId?: string;\n parameters?: Record<string, string | string[]>;\n height?: number | string;\n dragLocked?: boolean;\n /** Provide the dashboard document directly instead of fetching it. */\n dashboard?: Dashboard;\n /** When true, layout items are resizable and `onLayoutCommit` receives user edits. */\n editable?: boolean;\n /** Render the classic title row + buttons + filters bar instead of the compact filters-only bar. */\n useClassicHeader?: boolean;\n onDashloadLoaded?: (dashboard: Dashboard) => void;\n onFiltersChanged?: (filters: Record<string, unknown>) => void;\n /** Replace the built-in header with a host-rendered bar. Receives the built filters + handlers. */\n headerRender?: (args: ScriptDashboardHeaderRenderArgs) => React.ReactNode;\n /** Show the \"waiting for generation\" overlay and poll the sub-agent. */\n dashboardWaiting?: DashboardWaitingOptions;\n /** Data-refresh tick → cards refetch with `noCache`. Does NOT re-instantiate the bundle. */\n llmRenderCount?: number;\n /** Bundle re-instantiation trigger — bump only on real code (re)generation. */\n codeGeneration?: number;\n /** Print / read-only preview (was the `?printPreview=true` URL flag). */\n isPrintPreview?: boolean;\n\n // ── Host callbacks (the legacy viewer called the PDF endpoint, the\n // scheduling service and the composer store itself; now the host does).\n /** Export the dashboard (e.g. call your PDF endpoint). The viewer tracks the `exporting` state around it. */\n onExportPdf?: (args: ScriptDashboardExportArgs) => Promise<void> | void;\n /** Open your scheduling UI. */\n onSchedule?: () => void;\n scheduleLabel?: string;\n /** Navigate to your editor. */\n onEdit?: () => void;\n /** User finished a resize / drag (never fired on prop syncs). */\n onLayoutCommit?: (layout: Layout, oldItem: LayoutItem, newItem: LayoutItem) => void;\n /** Admin-only runtime dataset override threaded into every data fetch. */\n datasetOverride?: string;\n /** Whether the viewer is shown to an admin (gates `datasetOverrideControl`). */\n isAdmin?: boolean;\n /** A ready-to-render dataset picker the host owns; shown when `isAdmin` and the dashboard is parameterised. */\n datasetOverrideControl?: React.ReactNode;\n /** Icon for a card's header, by its specific type. Default: no icon. */\n resolveCardIcon?: (specificType: CardSpecificType) => string | SvgIconComponent | undefined;\n /** Series palette for every chart in this dashboard (defaults to `theme.palette.bi.series`). */\n chartPalette?: readonly string[];\n /** Show the floating zoom slider (default true outside print preview). */\n showZoomControl?: boolean;\n}\n\nconst SubAgentWaitingOverlay: React.FC<{ subAgent: SubAgentDto | null }> = ({ subAgent }) => {\n const theme = useTheme();\n const todoList = subAgent?.todoList;\n const items = todoList?.items ?? [];\n const completedCount = items.filter((i) => i.status === 'Completed').length;\n const totalCount = items.length;\n\n const rawPercent = todoList?.percentComplete;\n const fraction = typeof rawPercent === 'number' && Number.isFinite(rawPercent) ? rawPercent : totalCount > 0 ? completedCount / totalCount : 0;\n const percent = Math.max(0, Math.min(100, fraction * 100));\n const hasProgress = totalCount > 0 || percent > 0;\n\n return (\n <Box\n sx={{\n position: 'relative',\n width: '100%',\n zIndex: 1500,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 2,\n px: 4,\n minHeight: '300px',\n backgroundColor: alpha(theme.palette.background.default, 0.85),\n backdropFilter: 'blur(2px)',\n }}\n >\n <Stack spacing={2} alignItems=\"center\" sx={{ width: '100%', maxWidth: 480 }}>\n <Typography variant=\"h6\" sx={{ color: 'text.primary', textAlign: 'center' }}>\n Aguardando a geração do dashboard\n </Typography>\n {subAgent?.name && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', textAlign: 'center' }}>\n {subAgent.name}\n </Typography>\n )}\n <Box sx={{ width: '100%' }}>\n <LinearProgress variant={hasProgress ? 'determinate' : 'indeterminate'} value={hasProgress ? percent : undefined} sx={{ height: 10, borderRadius: 5 }} />\n <Stack direction=\"row\" justifyContent=\"space-between\" sx={{ mt: 1 }}>\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {totalCount > 0 ? `${completedCount} de ${totalCount} tarefas` : 'Inicializando...'}\n </Typography>\n <Typography variant=\"caption\" sx={{ color: 'text.primary', fontWeight: 600 }}>\n {`${percent.toFixed(1)}%`}\n </Typography>\n </Stack>\n </Box>\n </Stack>\n </Box>\n );\n};\n\n// Smooths the loading → dashboard hand-off: keeps both layers mounted while the\n// wrapper's inline height animates from the pre-content height to the\n// dashboard's, cross-fading the two.\ntype DashboardBodyPhase = 'pre' | 'arriving' | 'final';\nconst DASHBOARD_BODY_TRANSITION_MS = 520;\n\nconst DashboardBodyTransition: React.FC<{ showPre: boolean; preContent: React.ReactNode; finalContent: React.ReactNode }> = ({ showPre, preContent, finalContent }) => {\n const [phase, setPhase] = useState<DashboardBodyPhase>(() => (showPre ? 'pre' : 'final'));\n const wrapperRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (phase === 'pre' && !showPre) {\n const wrapper = wrapperRef.current;\n const H1 = wrapper?.offsetHeight ?? 0;\n if (wrapper && H1 > 0) wrapper.style.height = `${H1}px`;\n setPhase('arriving');\n } else if (phase !== 'pre' && showPre) {\n const wrapper = wrapperRef.current;\n if (wrapper) {\n wrapper.style.height = '';\n wrapper.style.transition = '';\n }\n setPhase('pre');\n }\n }, [phase, showPre]);\n\n useLayoutEffect(() => {\n if (phase !== 'arriving') return;\n const wrapper = wrapperRef.current;\n const content = contentRef.current;\n if (!wrapper || !content) return;\n const H2 = content.offsetHeight;\n void wrapper.offsetHeight;\n wrapper.style.transition = `height ${DASHBOARD_BODY_TRANSITION_MS}ms cubic-bezier(0.16, 1, 0.3, 1)`;\n wrapper.style.height = `${H2}px`;\n const t = window.setTimeout(() => {\n const w = wrapperRef.current;\n if (w) {\n w.style.height = '';\n w.style.transition = '';\n }\n setPhase('final');\n }, DASHBOARD_BODY_TRANSITION_MS + 40);\n return () => window.clearTimeout(t);\n }, [phase]);\n\n return (\n <Box\n ref={wrapperRef}\n sx={{\n position: 'relative',\n overflow: phase === 'final' ? 'auto' : 'hidden',\n width: '100%',\n flex: 1,\n minHeight: 0,\n '@keyframes dashboardArriveGrow': {\n '0%': { opacity: 0, transform: 'scale(0.97)' },\n '100%': { opacity: 1, transform: 'scale(1)' },\n },\n }}\n >\n {(phase === 'pre' || phase === 'arriving') && (\n <div\n key=\"pre-layer\"\n style={{\n position: phase === 'arriving' ? 'absolute' : 'relative',\n top: 0,\n left: 0,\n right: 0,\n opacity: phase === 'arriving' ? 0 : 1,\n transition: phase === 'arriving' ? 'opacity 360ms ease-out' : 'none',\n pointerEvents: phase === 'arriving' ? 'none' : 'auto',\n width: '100%',\n }}\n >\n {preContent}\n </div>\n )}\n {(phase === 'arriving' || phase === 'final') && (\n <Box\n key=\"content-layer\"\n ref={contentRef}\n sx={{\n width: '100%',\n animation: phase === 'arriving' ? `dashboardArriveGrow ${DASHBOARD_BODY_TRANSITION_MS}ms 60ms cubic-bezier(0.16, 1, 0.3, 1) both` : 'none',\n '@media (prefers-reduced-motion: reduce)': { animation: 'none' },\n }}\n >\n {finalContent}\n </Box>\n )}\n </Box>\n );\n};\n\nexport const ScriptDashboardViewer: React.FC<ScriptDashboardViewerProps> = (props) => {\n const useClassicHeader = props.useClassicHeader ?? false;\n const editable = props.editable ?? false;\n\n const bundle = useDashboardBundle({\n client: props.client,\n dashboardId: props.dashboardId,\n parameters: props.parameters,\n dashboard: props.dashboard,\n dashboardWaiting: props.dashboardWaiting,\n codeGeneration: props.codeGeneration,\n onDashloadLoaded: props.onDashloadLoaded,\n onFiltersChanged: props.onFiltersChanged,\n editable,\n isPrintPreview: props.isPrintPreview,\n });\n\n const {\n dashboard, cards, style, loading, error, setError, filters, filterOptions, stateParameters,\n containerRef, containerWidth, layoutDefinition, effectiveDashboardId, isPrintPreview,\n snackbar, setSnackbar, subAgentStatus, isSubAgentTracked, subAgentDone,\n } = bundle;\n\n const [exporting, setExporting] = useState(false);\n const [zoomLevel, setZoomLevel] = useState<number>(1.03);\n\n const isDashboardParameterized = dashboard?.isDatasetParameterized ?? false;\n const datasetOverrideControl = useMemo<React.ReactNode | null>(() => {\n if (isPrintPreview || !props.isAdmin || !isDashboardParameterized) return null;\n return props.datasetOverrideControl ?? null;\n }, [isPrintPreview, props.isAdmin, isDashboardParameterized, props.datasetOverrideControl]);\n\n const exportPdf = props.onExportPdf\n ? async () => {\n if (!dashboard) return;\n setExporting(true);\n try {\n await props.onExportPdf!({ dashboard, parameters: stateParameters, datasetOverride: props.datasetOverride });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'PDF export failed');\n } finally {\n setExporting(false);\n }\n }\n : undefined;\n\n const canEdit = !!props.onEdit;\n const canSchedule = !!props.onSchedule && !filterOptions.readonly;\n\n const header = props.headerRender ? (\n props.headerRender({\n name: dashboard?.name,\n iconName: dashboard?.muiIconName,\n dashboard: dashboard ?? null,\n filters: filters ?? null,\n hasFilters: (dashboard?.filters?.length ?? 0) > 0,\n onExportPdf: exportPdf,\n onSchedule: props.onSchedule,\n onEdit: props.onEdit,\n exporting,\n readonly: !!filterOptions.readonly,\n canEdit,\n canSchedule,\n datasetOverrideControl,\n })\n ) : !useClassicHeader ? (\n (dashboard?.filters?.length ?? 0) > 0 ? (\n <Stack direction=\"row\" gap={2} sx={{ flexWrap: 'wrap', minWidth: '100%', px: 1.25, py: 1, justifyContent: 'flex-end', alignItems: 'flex-start' }}>\n {filters}\n </Stack>\n ) : null\n ) : (\n <>\n <Stack direction=\"row\" gap={0} sx={{ padding: '5px', marginLeft: '10px', display: 'inline-flex', color: 'text.secondary', alignItems: 'center', marginBottom: '10px', minWidth: '100%' }}>\n <Box sx={{ display: 'inline-flex', flexWrap: 'wrap', minWidth: '100%', alignItems: 'center' }}>\n <Box sx={{ display: 'inline-flex', width: '50%', alignItems: 'center', gap: 1 }}>\n <span className=\"material-icons\" style={{ maxWidth: '24px' }}>{dashboard?.muiIconName ?? 'dashboard'}</span>\n <Typography component=\"h2\" variant=\"h6\" sx={{ m: 0, color: 'text.primary' }}>{dashboard?.name ?? ''}</Typography>\n {datasetOverrideControl}\n </Box>\n <Stack direction=\"row\" gap={3} sx={{ width: '50%', display: 'inline-flex', pr: 2, justifyContent: 'right', alignItems: 'center' }}>\n {canEdit && (\n <Button onClick={props.onEdit} size=\"small\" disabled={exporting} variant=\"outlined\" sx={{ maxWidth: '200px', p: 1 }}>\n <Stack direction=\"row\" gap={0.5} alignItems=\"center\">\n <Typography variant=\"body2\">Edit</Typography>\n <RebaseEdit fontSize=\"small\" sx={{ ml: 1 }} />\n </Stack>\n </Button>\n )}\n {!filterOptions.readonly && (\n <>\n {canSchedule && (\n <Button onClick={props.onSchedule} size=\"small\" variant=\"outlined\" sx={{ maxHeight: '45px', maxWidth: '200px', p: 1 }}>\n <Stack direction=\"row\" gap={0.5} alignItems=\"center\" sx={{ maxHeight: '30px' }}>\n <Typography variant=\"body2\">{props.scheduleLabel ?? 'Agendar'}</Typography>\n <ScheduleIcon sx={{ ml: 1, fontSize: '16px' }} fontSize=\"small\" />\n </Stack>\n </Button>\n )}\n {exportPdf && (\n <Button onClick={exportPdf} size=\"small\" disabled={exporting} variant=\"outlined\" sx={{ maxHeight: '45px', maxWidth: '200px', p: 1 }}>\n <Stack direction=\"row\" gap={0.5} alignItems=\"center\" sx={{ maxHeight: '30px' }}>\n <Typography variant=\"body2\">{exporting ? 'Gerando PDF...' : 'Exportar PDF'}</Typography>\n {exporting ? <CircularProgress size={16} sx={{ ml: 1 }} /> : <ImportExportOutlined sx={{ ml: 1, fontSize: '16px' }} fontSize=\"small\" />}\n </Stack>\n </Button>\n )}\n </>\n )}\n </Stack>\n </Box>\n </Stack>\n\n {(dashboard?.filters?.length ?? 0) > 0 && (\n <Stack\n direction=\"row\"\n gap={2}\n sx={{\n flexWrap: 'wrap',\n width: '100%',\n paddingTop: filterOptions.readonly ? '10px' : '20px',\n paddingBottom: '10px',\n paddingRight: '10px',\n justifyContent: 'flex-end',\n alignItems: 'flex-start',\n backgroundColor: 'action.hover',\n }}\n >\n {filters}\n </Stack>\n )}\n </>\n );\n\n // User-driven boundaries only (RGL's resize-stop / drag-stop). A null\n // old/new item means RGL's internal sync, not a gesture — skip it.\n const commitUserLayoutEdit = (layout: Layout, oldItem: LayoutItem | null, newItem: LayoutItem | null): void => {\n if (!editable) return;\n if (!oldItem || !newItem) return;\n props.onLayoutCommit?.(layout, oldItem, newItem);\n };\n\n const cardsNode = useMemo(() => {\n if (!cards) return undefined;\n const cardViewType = dashboard?.layoutType ?? 'Boxed';\n return cards.map((card) => {\n const { title, specificType, category } = resolveCardMetadata(card, dashboard);\n return (\n <GridCard\n dragLocked={props.dragLocked ?? false}\n viewType={cardViewType}\n key={card.key}\n zoomLevel={1}\n header={{ title: title ?? '', icon: specificType ? props.resolveCardIcon?.(specificType) : undefined }}\n color={CATEGORY_PREFIXES[category ?? 'Generic']}\n >\n {card.element}\n </GridCard>\n );\n });\n }, [cards, dashboard, props.dragLocked, props.resolveCardIcon]);\n\n if (!dashboard && effectiveDashboardId) {\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', gap: 2 }}>\n <CircularProgress />\n <Typography color=\"text.secondary\">Loading dashboard...</Typography>\n </Box>\n );\n }\n if (!dashboard) return null;\n\n const showZoom = (props.showZoomControl ?? true) && !isPrintPreview;\n\n return (\n <ChartCardDefaultsProvider palette={props.chartPalette} rotateBasePerChart>\n <DashboardParametersProvider\n values={{\n dashboardId: dashboard.id ?? effectiveDashboardId ?? '',\n parameters: stateParameters,\n refreshTick: props.llmRenderCount ?? 0,\n datasetOverride: props.datasetOverride,\n }}\n >\n <Stack\n ref={(ref) => {\n containerRef.current = !containerRef.current && ref ? ref : containerRef.current;\n }}\n className=\"bi-dashboard-viewer\"\n sx={{\n height: isPrintPreview ? '100vh' : props.height ?? '100%',\n minHeight: '300px',\n display: 'inline-flex',\n backgroundColor: 'background.default',\n color: 'text.primary',\n overflow: 'hidden',\n width: '100%',\n maxWidth: isPrintPreview ? '1000px' : '100%',\n '& .grid-card::after': { borderRight: 'none', borderBottom: 'none' },\n '& .cardDragHandle': { display: 'none' },\n }}\n >\n <div style={{ position: 'relative', padding: 0, width: '100%', left: -3, height: '100%', maxHeight: '100%', display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}>\n {showZoom && (\n <Box\n sx={{\n position: 'absolute',\n left: '8px',\n bottom: '50px',\n zIndex: 1000,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n px: 1.25,\n py: 0.75,\n borderRadius: 999,\n backgroundColor: 'background.paper',\n border: '1px solid',\n borderColor: 'divider',\n boxShadow: 4,\n minWidth: 180,\n }}\n >\n <Typography variant=\"caption\" sx={{ color: 'text.secondary', textTransform: 'uppercase', letterSpacing: 0.6, fontWeight: 500 }}>\n Zoom\n </Typography>\n <Slider\n value={zoomLevel}\n onChange={(_event, value) => setZoomLevel(value as number)}\n min={0.3}\n max={2}\n step={0.01}\n sx={{ flex: 1, minWidth: 80, color: 'primary.main', height: 3, py: '12px !important', '& .MuiSlider-thumb': { width: 12, height: 12, boxShadow: 'none' }, '& .MuiSlider-rail': { opacity: 0.25 } }}\n />\n <Typography variant=\"caption\" sx={{ color: 'text.primary', fontFamily: 'monospace', minWidth: 32, textAlign: 'right', fontVariantNumeric: 'tabular-nums' }}>\n {Math.round(zoomLevel * 100)}%\n </Typography>\n </Box>\n )}\n\n {header && (\n <Stack direction=\"row\" gap={0} sx={{ display: 'inline-flex', minWidth: '100%', flexWrap: 'wrap', alignItems: 'flex-start', mt: 1, flexShrink: 0 }}>\n {header}\n </Stack>\n )}\n\n {error && (\n <Box sx={{ p: 1, position: 'relative', width: '100%' }}>\n <IconButton size=\"small\" onClick={() => setError(null)} sx={{ position: 'absolute', right: 10, top: 10 }}>\n <CloseOutlined fontSize=\"small\" />\n </IconButton>\n <Alert severity=\"error\">\n <Typography variant=\"subtitle1\" fontWeight=\"bold\">Dashboard load failed</Typography>\n <Typography variant=\"body2\">{error}</Typography>\n </Alert>\n </Box>\n )}\n\n <DashboardBodyTransition\n showPre={(isSubAgentTracked && !subAgentDone) || loading || containerWidth === 0 || !layoutDefinition || !cardsNode}\n preContent={\n isSubAgentTracked && !subAgentDone ? (\n <SubAgentWaitingOverlay subAgent={subAgentStatus} />\n ) : loading ? (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', minHeight: 300, width: '100%', gap: 2 }}>\n <CircularProgress />\n <Typography color=\"text.secondary\">Loading dashboard...</Typography>\n </Box>\n ) : null\n }\n finalContent={\n /*\n `minHeight: '100%'`, and NO `alignContent`.\n\n It was `minHeight: '100vh'` with `alignContent: 'center'`, which put a\n short dashboard in the middle of a viewport-tall box: a large empty band\n above the first card and a scrollbar for space nothing occupies. Two\n separate faults. `100vh` ignores that the viewer is EMBEDDED — there is a\n top bar above it and a prompt below — so it always overruns by that chrome.\n And `alignContent` is what pushed the content down: it did nothing on a\n block container until Chrome 123 shipped block-level box alignment, so the\n declaration sat here inert for as long as it took browsers to catch up, and\n then started centring. Measured in a panel with a definite height: 300px of\n gap with either `100vh` or `100%` while `center` remained, 0 without it.\n */\n <div id=\"renderedDashboard\" style={{ paddingTop: 2, minHeight: '100%', overflow: 'auto', width: '100%' }}>\n <GridLayout\n rowAwareResize={{ defaultOn: true }}\n config={{ rows: [] }}\n cols={{ lg: 10, md: 8, sm: 4, xs: 4, xxs: 4 }}\n breakpoints={{ lg: 920, md: 600, sm: 400, xs: 400, xxs: 0 }}\n zoomLevel={zoomLevel}\n responsive={false}\n rowHeight={isPrintPreview ? 18 : 20}\n dragLocked={props.dragLocked ?? false}\n rowMultiplier={1}\n maxRows={200}\n onResizeStop={commitUserLayoutEdit}\n onDragStop={commitUserLayoutEdit}\n manualWidth={containerWidth}\n layouts={layoutDefinition}\n >\n {cardsNode}\n </GridLayout>\n {style}\n </div>\n }\n />\n </div>\n\n <Snackbar open={snackbar.open} autoHideDuration={4000} onClose={() => setSnackbar((prev) => ({ ...prev, open: false }))} anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}>\n <Alert onClose={() => setSnackbar((prev) => ({ ...prev, open: false }))} severity={snackbar.severity} variant=\"filled\">\n {snackbar.message}\n </Alert>\n </Snackbar>\n </Stack>\n </DashboardParametersProvider>\n </ChartCardDefaultsProvider>\n );\n};\n\nexport default ScriptDashboardViewer;\n","// Vertical dashboard viewer: stacks cards in a portrait column instead of a\n// grid (a collapsed side panel). Data loading is shared via useDashboardBundle;\n// this file owns only the layout (no header, no zoom pill).\nimport React, { useMemo } from 'react';\nimport { CloseOutlined } from '@mui/icons-material';\nimport type { SvgIconComponent } from '@mui/icons-material';\nimport { Stack, Box, CircularProgress, Typography, IconButton, Alert, Snackbar } from '@mui/material';\nimport { GridCard } from '../grid/GridCard';\nimport { DashboardParametersProvider } from '../hooks/DashboardParametersContext';\nimport type { BiClient } from '../client';\nimport type { Dashboard, CardSpecificType } from './models';\nimport { resolveCardMetadata } from './cardMetadata';\nimport { useDashboardBundle, type DashboardWaitingOptions } from './useDashboardBundle';\n\nexport interface ScriptDashboardViewerVerticalProps {\n client?: BiClient;\n dashboardId?: string;\n parameters?: Record<string, string | string[]>;\n height?: number | string;\n dashboard?: Dashboard;\n onDashloadLoaded?: (dashboard: Dashboard) => void;\n onFiltersChanged?: (filters: Record<string, unknown>) => void;\n dashboardWaiting?: DashboardWaitingOptions;\n /** Data-refresh tick → `refreshTick` (cards refetch). Does NOT re-instantiate the bundle. */\n llmRenderCount?: number;\n /** Bundle re-instantiation trigger — bump only on real code (re)generation. */\n codeGeneration?: number;\n isPrintPreview?: boolean;\n datasetOverride?: string;\n resolveCardIcon?: (specificType: CardSpecificType) => string | SvgIconComponent | undefined;\n}\n\nexport const ScriptDashboardViewerVertical: React.FC<ScriptDashboardViewerVerticalProps> = (props) => {\n const bundle = useDashboardBundle({\n client: props.client,\n dashboardId: props.dashboardId,\n parameters: props.parameters,\n dashboard: props.dashboard,\n dashboardWaiting: props.dashboardWaiting,\n codeGeneration: props.codeGeneration,\n onDashloadLoaded: props.onDashloadLoaded,\n onFiltersChanged: props.onFiltersChanged,\n isPrintPreview: props.isPrintPreview,\n });\n\n const { dashboard, cards, loading, error, setError, stateParameters, containerRef, containerWidth, layoutDefinition, effectiveDashboardId, isPrintPreview, snackbar, setSnackbar } = bundle;\n\n // Fixed-height cards (160px metric/gauge, 250px otherwise), slightly zoomed\n // to fit the narrow column, hairline divider when the layout is `Naked`.\n const cardsNode = useMemo(() => {\n if (!cards) return undefined;\n const cardViewType = dashboard?.layoutType ?? 'Boxed';\n return cards.map((card) => {\n const { title, specificType } = resolveCardMetadata(card, dashboard);\n const isMetric = specificType === 'MetricComparison' || specificType === 'Gauge' || specificType == undefined;\n return (\n <Box\n key={card.key}\n sx={{\n height: isMetric ? '160px' : '250px',\n maxWidth: '100%',\n mx: 0.5,\n borderBottom: dashboard?.layoutType === 'Naked' ? '1px solid' : 'unset',\n borderColor: 'divider',\n }}\n >\n <GridCard dragLocked noBorder viewType={cardViewType} zoomLevel={isMetric ? 0.9 : 0.7} header={{ title: title ?? '', icon: specificType ? props.resolveCardIcon?.(specificType) : undefined }}>\n {card.element}\n </GridCard>\n </Box>\n );\n });\n }, [cards, dashboard, props.resolveCardIcon]);\n\n if (!dashboard && effectiveDashboardId) {\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', gap: 2 }}>\n <CircularProgress />\n <Typography color=\"text.secondary\">Loading dashboard...</Typography>\n </Box>\n );\n }\n if (!dashboard) return null;\n\n return (\n <Stack\n ref={(ref) => {\n containerRef.current = !containerRef.current && ref ? ref : containerRef.current;\n }}\n className=\"bi-dashboard-viewer-vertical\"\n sx={{\n height: isPrintPreview ? '100vh' : props.height ?? 'unset',\n display: 'inline-flex',\n backgroundColor: 'background.default',\n color: 'text.primary',\n minHeight: '300px',\n overflow: 'auto',\n width: '100%',\n maxWidth: isPrintPreview ? '1000px' : '100%',\n '& .grid-card::after': { borderRight: 'none', borderBottom: 'none' },\n '& .cardDragHandle': { display: 'none' },\n }}\n >\n <div style={{ position: 'relative', width: '100%', height: '100%', maxHeight: '100%', display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}>\n {loading && (\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', gap: 2 }}>\n <CircularProgress />\n <Typography color=\"text.secondary\">Loading dashboard...</Typography>\n </Box>\n )}\n\n {error && (\n <Box sx={{ p: 1, position: 'relative', width: '100%' }}>\n <IconButton size=\"small\" onClick={() => setError(null)} sx={{ position: 'absolute', right: 10, top: 10 }}>\n <CloseOutlined fontSize=\"small\" />\n </IconButton>\n <Alert severity=\"error\">\n <Typography variant=\"subtitle1\" fontWeight=\"bold\">Dashboard load failed</Typography>\n <Typography variant=\"body2\">{error}</Typography>\n </Alert>\n </Box>\n )}\n\n {!loading && containerWidth !== 0 && layoutDefinition && cardsNode && (\n <DashboardParametersProvider\n values={{\n dashboardId: dashboard.id ?? effectiveDashboardId ?? '',\n parameters: stateParameters ?? {},\n refreshTick: props.llmRenderCount ?? 0,\n datasetOverride: props.datasetOverride,\n }}\n >\n <Stack sx={{ width: '100%' }} gap={1}>\n {cardsNode}\n </Stack>\n </DashboardParametersProvider>\n )}\n <Box sx={{ minHeight: '70px', minWidth: '100%' }} />\n </div>\n\n <Snackbar open={snackbar.open} autoHideDuration={4000} onClose={() => setSnackbar((prev) => ({ ...prev, open: false }))} anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}>\n <Alert onClose={() => setSnackbar((prev) => ({ ...prev, open: false }))} severity={snackbar.severity} variant=\"filled\">\n {snackbar.message}\n </Alert>\n </Snackbar>\n </Stack>\n );\n};\n\nexport default ScriptDashboardViewerVertical;\n"],"names":["CATEGORY_PREFIXES","resolveCardMetadata","card","dashboard","related","_a","i","title","specificType","category","__name","registeredSpecifiers","extraHostModules","hostModulesCache","seedHostModules","specifiers","extra","s","getRegisteredSpecifiers","getHostModules","MuiMaterial","MuiIconsMaterial","Recharts","getBiModuleSurface","surface","map","React","jsxRuntime","ReactDOM","ReactDOMClient","MuiMaterialStyles","EmotionReact","EmotionStyled","dayjs","spec","MAX_CACHED_BUNDLES","compiledBundleCache","hashBundleCode","code","h","clearBundleCaches","evaluateDashboardBundle","cacheKey","HOST_MODULES","hash","cached","moduleShim","requireShim","name","mod","key","hostMod","exported","moduleExport","oldestKey","loadDashboardBundle","client","sessionId","dashboardId","instantiateDashboardBundle","scriptFileName","DashboardClass","instance","useDashboardBundle","options","ambientClient","useBiClientOptional","resolvedClient","localDashboard","setLocalDashboard","useState","onDashLoadedRef","useRef","onFiltersChangedRef","cards","setCards","style","setStyle","loading","setLoading","error","setError","isPrintPreview","stateParameters","setStateParameters","handleParameterChange","useCallback","value","prev","_removed","rest","next","optionsParametersKey","reportParameters","useMemo","filterOptions","useEffect","effectiveDashboardId","containerRef","containerWidth","useContainerRectangle","snackbar","setSnackbar","subAgentStatus","setSubAgentStatus","waitingSubAgentId","isSubAgentTracked","subAgentDone","isSubAgentTerminalStatus","subAgentFailed","pollSessionId","_b","pollIntervalMs","_c","intervalMs","cancelled","timeoutHandle","poll","status","err","loadMetadata","dash","codeGeneration","dashboardIdField","dashboardJsFileName","dashboardSessionId","loadBundle","scriptName","result","filters","f","createFilterComponent","editable","rawLayoutDefinition","layoutDefinition","item","SubAgentWaitingOverlay","subAgent","theme","useTheme","todoList","items","completedCount","totalCount","rawPercent","fraction","percent","hasProgress","jsx","Box","alpha","jsxs","Stack","Typography","LinearProgress","DASHBOARD_BODY_TRANSITION_MS","DashboardBodyTransition","showPre","preContent","finalContent","phase","setPhase","wrapperRef","contentRef","useLayoutEffect","wrapper","H1","content","H2","t","w","ScriptDashboardViewer","props","useClassicHeader","bundle","exporting","setExporting","zoomLevel","setZoomLevel","isDashboardParameterized","datasetOverrideControl","exportPdf","canEdit","canSchedule","header","Fragment","Button","RebaseEdit","ScheduleIcon","CircularProgress","ImportExportOutlined","commitUserLayoutEdit","layout","oldItem","newItem","cardsNode","cardViewType","GridCard","showZoom","ChartCardDefaultsProvider","DashboardParametersProvider","ref","Slider","_event","IconButton","CloseOutlined","Alert","GridLayout","Snackbar","ScriptDashboardViewerVertical","isMetric"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAKO,MAAMA,KAAyD;AAAA,EAClE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AACb;AAOO,SAASC,GACZC,GACAC,GAC6G;;AAC7G,QAAMC,MAAUC,IAAAF,KAAA,gBAAAA,EAAW,UAAX,gBAAAE,EAAkB,KAAK,CAACC,MAAMA,EAAE,MAAMJ,EAAK,SAAQ,MAC7DK,KAAQH,KAAA,gBAAAA,EAAS,UAASF,EAAK,QAAQE,KAAA,gBAAAA,EAAS,OAAOF,EAAK,OAC5DM,KAAgBJ,KAAA,gBAAAA,EAAS,kBAAiBF,EAAK,eAAeE,KAAA,gBAAAA,EAAS,eAAeF,EAAK,cAC3FO,KAAYL,KAAA,gBAAAA,EAAS,cAAaF,EAAK,WAAWE,KAAA,gBAAAA,EAAS,WAAWF,EAAK;AACjF,SAAO,EAAE,OAAAK,GAAO,cAAAC,GAAc,UAAAC,EAAA;AAClC;AATgBC,EAAAT,IAAA;ACUhB,MAAMU,yBAA2B,IAAA;AACjC,IAAIC,KAA4C,CAAA,GAC5CC,KAAmD;AAGhD,SAASC,GAAgBC,GAAsBC,GAAuC;AACzF,aAAWC,KAAKF,EAAY,CAAAJ,GAAqB,IAAIM,CAAC;AACtD,EAAID,MAAOJ,KAAmB,EAAE,GAAGA,IAAkB,GAAGI,EAAA,IACxDH,KAAmB;AACvB;AAJgBH,EAAAI,IAAA;AAOT,SAASI,KAAoC;AAChD,SAAO,CAAC,GAAGP,EAAoB;AACnC;AAFgBD,EAAAQ,IAAA;AAIhB,eAAsBC,KAAmD;AACrE,MAAIN,GAAkB,QAAOA;AAE7B,QAAM,CAACO,GAAaC,GAAkBC,CAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAChE,OAAO,eAAe;AAAA,IACtB,OAAO,qBAAqB;AAAA,IAC5B,OAAO,UAAU;AAAA,EAAA,CACpB,GAEK,EAAE,oBAAAC,EAAA,IAAuB,MAAM,OAAO,+BAAmB,GACzDC,IAAUD,EAAA,GACVE,IAA+B;AAAA,IACjC,OAAOC;AAAA,IACP,qBAAqBC;AAAA,IACrB,aAAaC;AAAA,IACb,oBAAoBC;AAAA,IACpB,iBAAiBT;AAAA,IACjB,uBAAuBC;AAAA,IACvB,wBAAwBS;AAAA,IACxB,kBAAkBC;AAAA,IAClB,mBAAmBC;AAAA,IACnB,UAAUV;AAAA,IACV,OAAAW;AAAA,IACA,GAAGrB;AAAA,EAAA;AAEP,aAAWsB,KAAQvB,GAAsB,CAAAc,EAAIS,CAAI,IAAIV;AAErD,SAAAX,KAAmBY,GACZA;AACX;AA7BsBf,EAAAS,IAAA;AAmCtB,MAAMgB,KAAqB,GAErBC,wBAA0B,IAAA;AAGzB,SAASC,GAAeC,GAAsB;AACjD,MAAIC,IAAI;AACR,WAASjC,IAAI,GAAGA,IAAIgC,EAAK,QAAQhC;AAC7B,IAAAiC,KAAKD,EAAK,WAAWhC,CAAC,GACtBiC,IAAI,KAAK,KAAKA,GAAG,QAAU;AAE/B,SAAO,IAAIA,MAAM,GAAG,SAAS,EAAE,CAAC,IAAID,EAAK,MAAM;AACnD;AAPgB5B,EAAA2B,IAAA;AAUT,SAASG,KAA0B;AACtC,EAAAJ,EAAoB,MAAA,GACpBvB,KAAmB;AACvB;AAHgBH,EAAA8B,IAAA;AAUhB,eAAsBC,GAAwBH,GAAcI,GAAqC;AAC7F,QAAMC,IAAe,MAAMxB,GAAA,GAErByB,IAAOP,GAAeC,CAAI;AAChC,MAAII,GAAU;AACV,UAAMG,IAAST,EAAoB,IAAIM,CAAQ;AAC/C,QAAIG,KAAUA,EAAO,SAASD;AAC1B,aAAAR,EAAoB,OAAOM,CAAQ,GACnCN,EAAoB,IAAIM,GAAUG,CAAM,GACjCA,EAAO;AAAA,EAEtB;AAEA,QAAMC,IAAa,EAAE,SAAS,GAAC,GACzBC,IAAc,gBAAArC,EAAA,CAACsC,MAAiB;AAClC,UAAMC,IAAMN,EAAaK,CAAI;AAC7B,QAAIC,MAAQ,OAAW,QAAOA;AAG9B,eAAW,CAACC,GAAKC,CAAO,KAAK,OAAO,QAAQR,CAAY;AACpD,UAAIK,EAAK,WAAWE,IAAM,GAAG,KAAKC,KAAW,OAAOA,KAAY,UAAU;AACtE,cAAMC,IAAYD,EAAoCH,EAAK,MAAME,EAAI,SAAS,CAAC,CAAC;AAChF,YAAIE,MAAa,OAAW,QAAO,EAAE,SAASA,GAAU,YAAY,GAAA;AAAA,MACxE;AAEJ,UAAM,IAAI,MAAM,8CAA8CJ,CAAI,2EAA2E;AAAA,EACjJ,GAZoB;AAcpB,MAAI,SAAS,WAAW,UAAU,WAAWV,CAAI,EAAES,GAAaD,GAAYA,EAAW,OAAO;AAE9F,QAAMO,IAAeP,EAAW,QAAQ,WAAWA,EAAW;AAE9D,MAAIJ,MACAN,EAAoB,OAAOM,CAAQ,GACnCN,EAAoB,IAAIM,GAAU,EAAE,MAAAE,GAAM,QAAQS,GAAc,GAC5DjB,EAAoB,OAAOD,KAAoB;AAC/C,UAAMmB,IAAYlB,EAAoB,KAAA,EAAO,OAAO;AACpD,IAAIkB,MAAc,UAAWlB,EAAoB,OAAOkB,CAAS;AAAA,EACrE;AAEJ,SAAOD;AACX;AAzCsB3C,EAAA+B,IAAA;AAiDtB,eAAsBc,GAAoBC,GAAkBC,GAAmBC,GAAuC;AAClH,QAAM,CAACpB,CAAI,IAAI,MAAM,QAAQ,IAAI,CAACkB,EAAO,qBAAqBC,GAAWC,CAAW,GAAGvC,GAAA,CAAgB,CAAC;AACxG,SAAOsB,GAAwBH,GAAM,GAAGmB,CAAS,KAAKC,CAAW,EAAE;AACvE;AAHsBhD,EAAA6C,IAAA;AAYtB,eAAsBI,GAA2BH,GAAkBC,GAAmBG,GAAwD;AAC1I,QAAMC,IAAkB,MAAMN,GAAoBC,GAAQC,GAAWG,CAAc,GAC7EE,IAAW,IAAID,EAAA;AACrB,SAAO;AAAA,IACH,UAAAC;AAAA,IACA,OAAO,CAAC,GAAGA,EAAS,cAAc;AAAA,IAClC,OAAOA,EAAS,kBAAA;AAAA,EAAkB;AAE1C;AARsBpD,EAAAiD,IAAA;AC5Ef,SAASI,GAAmBC,GAA2D;;AAC1F,QAAMC,IAAgBC,GAAA,GAChBC,IAAiBH,EAAQ,UAAUC;AACzC,MAAI,CAACE;AACD,UAAM,IAAI,MAAM,+FAA+F;AAEnH,QAAMX,IAAmBW,GAGnB,CAACC,GAAgBC,CAAiB,IAAIC,EAAgCN,EAAQ,SAAS,GACvF7D,IAAY6D,EAAQ,aAAaI,GAGjCG,IAAkBC,GAAOR,EAAQ,gBAAgB;AACvD,EAAAO,EAAgB,UAAUP,EAAQ;AAClC,QAAMS,IAAsBD,GAAOR,EAAQ,gBAAgB;AAC3D,EAAAS,EAAoB,UAAUT,EAAQ;AAEtC,QAAM,CAACU,GAAOC,CAAQ,IAAIL,EAA2C,IAAI,GACnE,CAACM,GAAOC,CAAQ,IAAIP,EAA2B,IAAI,GACnD,CAACQ,GAASC,CAAU,IAAIT,EAAS,EAAK,GACtC,CAACU,GAAOC,CAAQ,IAAIX,EAAwB,IAAI,GAEhDY,IAAiBlB,EAAQ,kBAAkB,IAC3C,CAACmB,GAAiBC,CAAkB,IAAId,EAA4CN,EAAQ,cAAc,EAAE,GAE5GqB,IAAwBC,GAAY,CAACpC,GAAaqC,MAA6B;AACjF,IAAAH,EAAmB,CAACI,MAAS;;AACzB,UAAI,CAACD,KAAU,MAAM,QAAQA,CAAK,KAAKA,EAAM,WAAW,GAAI;AACxD,cAAM,EAAE,CAACrC,CAAG,GAAGuC,IAAU,GAAGC,OAASF;AACrC,eAAOE;AAAA,MACX;AACA,YAAMC,IAAO,EAAE,GAAGH,GAAM,CAACtC,CAAG,GAAGqC,EAAA;AAC/B,cAAAlF,IAAAoE,EAAoB,YAApB,QAAApE,EAAA,KAAAoE,GAA8BkB,IACvBA;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE,GAICC,IAAuB,KAAK,UAAU5B,EAAQ,cAAc,CAAA,CAAE,GAC9D6B,IAAmBC;AAAA,IACrB,OAAO,EAAE,GAAI9B,EAAQ,cAAc,CAAA,EAAC;AAAA,IACpC,CAAC4B,CAAoB;AAAA,EAAA,GAKnBG,IAAgBD;AAAA,IAClB,OAAO,EAAE,UAAUT,GAAuB,YAAYQ,GAAkB,UAAUX;IAClF,CAACW,GAAkBX,GAAgBG,CAAqB;AAAA,EAAA;AAG5D,EAAAW,GAAU,MAAM;AACZ,IAAAZ,EAAmB,CAACI,OAAU,EAAE,GAAGA,GAAM,GAAGK,IAAmB;AAAA,EACnE,GAAG,CAACA,CAAgB,CAAC;AAErB,QAAMI,IAAuBjC,EAAQ,gBAAe7D,KAAA,gBAAAA,EAAW,KAIzD+F,IAAe1B,GAA8B,IAAI,GACjD,CAAC2B,EAAc,IAAIC,GAAsBF,GAAc,GAAG,GAAG,GAAGD,CAAoB,KAAI9F,KAAA,gBAAAA,EAAW,OAAM,SAAS,EAAE,GAEpH,CAACkG,IAAUC,EAAW,IAAIhC,EAAuC,EAAE,MAAM,IAAO,SAAS,IAAI,UAAU,UAAA,CAAW,GAGlH,CAACiC,GAAgBC,CAAiB,IAAIlC,EAA6B,IAAI,GACvEmC,KAAoBpG,KAAA2D,EAAQ,qBAAR,gBAAA3D,GAA0B,YAC9CqG,IAAoB,EAAQD,GAC5BE,IAAe,CAACD,KAAqBE,GAAyBL,KAAA,gBAAAA,EAAgB,MAAM,GACpFM,KAAiBN,KAAA,gBAAAA,EAAgB,YAAW,aAAYA,KAAA,gBAAAA,EAAgB,YAAW,aACnFO,MAAgBC,KAAA/C,EAAQ,qBAAR,gBAAA+C,GAA0B,eAAa5G,KAAA,gBAAAA,EAAW,sBAAqB,QACvF6G,KAAiBC,KAAAjD,EAAQ,qBAAR,gBAAAiD,GAA0B;AAEjD,EAAAjB,GAAU,MAAM;AACZ,QAAI,CAACU,KAAqB,CAACD,KAAqB,CAACK,GAAe;AAC5D,MAAAN,EAAkB,IAAI;AACtB;AAAA,IACJ;AACA,UAAMU,IAAa,KAAK,IAAIF,KAAkB,GAAG,GAAK;AACtD,QAAIG,IAAY,IACZC,IAAsD;AAE1D,UAAMC,IAAO,gBAAA3G,EAAA,YAAY;AACrB,UAAI;AACA,cAAM4G,IAAS,MAAM9D,EAAO,kBAA+BsD,GAAeL,CAAiB;AAG3F,YAFIU,MACJX,EAAkBc,CAAM,GACpBA,KAAUV,GAAyBU,EAAO,MAAM,GAAG;AAAA,MAC3D,SAASC,GAAK;AACV,YAAIJ,EAAW;AACf,gBAAQ,MAAM,oCAAoCI,CAAG;AAAA,MACzD;AACA,MAAKJ,MAAWC,IAAgB,WAAWC,GAAMH,CAAU;AAAA,IAC/D,GAXa;AAab,WAAAG,EAAA,GACO,MAAM;AACT,MAAAF,IAAY,IACRC,kBAA4BA,CAAa;AAAA,IACjD;AAAA,EACJ,GAAG,CAACV,GAAmBD,GAAmBK,GAAeE,GAAgBxD,CAAM,CAAC,GAGhFwC,GAAU,MAAM;AACZ,QAAImB,IAAY;AAChB,mBAAeK,IAAe;;AAC1B,UAAI,CAAAxD,EAAQ,aACPiC;AACL,YAAI;AACA,gBAAMwB,IAAO,MAAMjE,EAAO,aAAwByC,CAAoB;AACtE,cAAIkB,EAAW;AACf,UAAA9C,EAAkBoD,CAAI,IACtBpH,IAAAkE,EAAgB,YAAhB,QAAAlE,EAAA,KAAAkE,GAA0BkD;AAAA,QAC9B,SAASF,GAAK;AACV,UAAKJ,KAAWlC,EAASsC,aAAe,QAAQA,EAAI,UAAU,0BAA0B;AAAA,QAC5F;AAAA,IACJ;AAXe,WAAA7G,EAAA8G,GAAA,iBAYfA,EAAA,GACO,MAAM;AACT,MAAAL,IAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAClB,GAAsBjC,EAAQ,WAAWR,CAAM,CAAC;AAIpD,QAAMkE,KAAiB1D,EAAQ,gBACzB2D,IAAmBxH,KAAA,gBAAAA,EAAW,IAC9ByH,IAAsBzH,KAAA,gBAAAA,EAAW,YACjC0H,IAAqB1H,KAAA,gBAAAA,EAAW;AACtC,EAAA6F,GAAU,MAAM;AACZ,QAAImB,IAAY;AAChB,mBAAeW,IAAa;AACxB,UAAI,EAAApB,KAAqB,CAACC,IAC1B;AAAA,YAAID,KAAqBG,GAAgB;AACrC,UAAA9B,EAAW,EAAK,GAChBE,GAASsB,KAAA,gBAAAA,EAAgB,UAAS,gCAAgC;AAClE;AAAA,QACJ;AACA,YAAI,GAACN,KAAwB,CAAC0B,IAC9B;AAAA,cAAIA,MAAqB,UAAa,CAACE,GAAoB;AACvD,oBAAQ,MAAM,oCAAoC,GAClD5C,EAAS,oCAAoC;AAC7C;AAAA,UACJ;AAEA,UAAAA,EAAS,IAAI,GACbF,EAAW,EAAI;AACf,cAAI;AACA,kBAAMgD,IAAaH,KAAuB,GAAGD,KAAoB1B,CAAoB;AACrF,gBAAI,CAAC4B,EAAoB;AACzB,kBAAMG,IAAS,MAAMrE,GAA2BH,GAAQqE,GAAoBE,CAAU;AACtF,gBAAIZ,EAAW;AACf,YAAAxC,EAASqD,EAAO,KAAK,GACrBnD,EAASmD,EAAO,KAAK;AAAA,UACzB,SAAST,GAAK;AACV,YAAKJ,MACD,QAAQ,MAAMI,aAAe,QAAQA,EAAI,UAAU,0BAA0B,GAC7EtC,EAASsC,aAAe,QAAQA,EAAI,UAAU,0BAA0B;AAAA,UAEhF,UAAA;AACI,YAAKJ,KAAWpC,EAAW,EAAK;AAAA,UACpC;AAAA;AAAA;AAAA,IACJ;AA/Be,WAAArE,EAAAoH,GAAA,eAgCfA,EAAA,GACO,MAAM;AACT,MAAAX,IAAY;AAAA,IAChB;AAAA,EAEJ,GAAG,CAAClB,GAAsB0B,GAAkBC,GAAqBC,GAAoBnB,GAAmBC,GAAcE,GAAgBa,IAAgBlE,CAAM,CAAC;AAE7J,QAAMyE,IAAUnC,EAAmB,MAAM;;AACrC,WAAK3F,KACEE,IAAAF,EAAU,YAAV,gBAAAE,EAAmB,IAAI,CAAC6H,MAAMC,GAAsBhI,EAAU,IAAK+H,GAAGnC,CAAa,KADnE;AAAA,EAE3B,GAAG,CAAC5F,GAAW4F,CAAa,CAAC,GAKvBqC,IAAWpE,EAAQ,YAAY,IAC/BqE,IAAsBvC,EAAkC,MAAM;AAChE,QAAK3F,KAAA,QAAAA,EAAW;AAChB,aAAO,CAAC,GAAGA,EAAU,KAAK;AAAA,EAC9B,GAAG,CAACA,KAAA,gBAAAA,EAAW,KAAK,CAAC,GACfmI,KAAmBxC,EAAkC,MAAM;AAC7D,QAAKuC;AACL,aAAOA,EAAoB,IAAI,CAACE,OAAU,EAAE,GAAGA,GAAM,aAAaH,GAAU,aAAa,GAAA,EAAO;AAAA,EACpG,GAAG,CAACC,GAAqBD,CAAQ,CAAC;AAElC,SAAO;AAAA,IACH,WAAAjI;AAAA,IACA,OAAAuE;AAAA,IACA,OAAAE;AAAA,IACA,SAAAE;AAAA,IACA,OAAAE;AAAA,IACA,UAAAC;AAAA,IACA,SAAAgD;AAAA,IACA,eAAAlC;AAAA,IACA,iBAAAZ;AAAA,IACA,uBAAAE;AAAA,IACA,cAAAa;AAAA,IACA,gBAAAC;AAAA,IACA,qBAAAkC;AAAA,IACA,kBAAAC;AAAA,IACA,sBAAArC;AAAA,IACA,gBAAAf;AAAA,IACA,UAAAmB;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAG;AAAA,IACA,cAAAC;AAAA,IACA,gBAAAE;AAAA,EAAA;AAER;AAtNgBnG,EAAAqD,IAAA;ACOhB,MAAMyE,KAAqE,gBAAA9H,EAAA,CAAC,EAAE,UAAA+H,QAAe;AACzF,QAAMC,IAAQC,GAAA,GACRC,IAAWH,KAAA,gBAAAA,EAAU,UACrBI,KAAQD,KAAA,gBAAAA,EAAU,UAAS,CAAA,GAC3BE,IAAiBD,EAAM,OAAO,CAACvI,MAAMA,EAAE,WAAW,WAAW,EAAE,QAC/DyI,IAAaF,EAAM,QAEnBG,IAAaJ,KAAA,gBAAAA,EAAU,iBACvBK,IAAW,OAAOD,KAAe,YAAY,OAAO,SAASA,CAAU,IAAIA,IAAaD,IAAa,IAAID,IAAiBC,IAAa,GACvIG,IAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKD,IAAW,GAAG,CAAC,GACnDE,IAAcJ,IAAa,KAAKG,IAAU;AAEhD,SACI,gBAAAE;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,IAAI;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,iBAAiBC,GAAMZ,EAAM,QAAQ,WAAW,SAAS,IAAI;AAAA,QAC7D,gBAAgB;AAAA,MAAA;AAAA,MAGpB,UAAA,gBAAAa,EAACC,GAAA,EAAM,SAAS,GAAG,YAAW,UAAS,IAAI,EAAE,OAAO,QAAQ,UAAU,IAAA,GAClE,UAAA;AAAA,QAAA,gBAAAJ,EAACK,GAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,OAAO,gBAAgB,WAAW,SAAA,GAAY,UAAA,oCAAA,CAE7E;AAAA,SACChB,KAAA,gBAAAA,EAAU,SACP,gBAAAW,EAACK,GAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,kBAAkB,WAAW,SAAA,GACjE,YAAS,MACd;AAAA,0BAEHJ,GAAA,EAAI,IAAI,EAAE,OAAO,UACd,UAAA;AAAA,UAAA,gBAAAD,EAACM,IAAA,EAAe,SAASP,IAAc,gBAAgB,iBAAiB,OAAOA,IAAcD,IAAU,QAAW,IAAI,EAAE,QAAQ,IAAI,cAAc,KAAK;AAAA,UACvJ,gBAAAK,EAACC,GAAA,EAAM,WAAU,OAAM,gBAAe,iBAAgB,IAAI,EAAE,IAAI,EAAA,GAC5D,UAAA;AAAA,YAAA,gBAAAJ,EAACK,GAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,OAAO,oBACtC,UAAAV,IAAa,IAAI,GAAGD,CAAc,OAAOC,CAAU,aAAa,oBACrE;AAAA,8BACCU,GAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,OAAO,gBAAgB,YAAY,IAAA,GAClE,UAAA,GAAGP,EAAQ,QAAQ,CAAC,CAAC,IAAA,CAC1B;AAAA,UAAA,EAAA,CACJ;AAAA,QAAA,EAAA,CACJ;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA;AAAA,EAAA;AAGZ,GApD2E,2BA0DrES,KAA+B,KAE/BC,KAAsH,gBAAAlJ,EAAA,CAAC,EAAE,SAAAmJ,GAAS,YAAAC,GAAY,cAAAC,QAAmB;AACnK,QAAM,CAACC,GAAOC,CAAQ,IAAI3F,EAA6B,MAAOuF,IAAU,QAAQ,OAAQ,GAClFK,IAAa1F,GAAuB,IAAI,GACxC2F,IAAa3F,GAAuB,IAAI;AAE9C,SAAA4F,GAAgB,MAAM;AAClB,QAAIJ,MAAU,SAAS,CAACH,GAAS;AAC7B,YAAMQ,IAAUH,EAAW,SACrBI,KAAKD,KAAA,gBAAAA,EAAS,iBAAgB;AACpC,MAAIA,KAAWC,IAAK,QAAW,MAAM,SAAS,GAAGA,CAAE,OACnDL,EAAS,UAAU;AAAA,IACvB,WAAWD,MAAU,SAASH,GAAS;AACnC,YAAMQ,IAAUH,EAAW;AAC3B,MAAIG,MACAA,EAAQ,MAAM,SAAS,IACvBA,EAAQ,MAAM,aAAa,KAE/BJ,EAAS,KAAK;AAAA,IAClB;AAAA,EACJ,GAAG,CAACD,GAAOH,CAAO,CAAC,GAEnBO,GAAgB,MAAM;AAClB,QAAIJ,MAAU,WAAY;AAC1B,UAAMK,IAAUH,EAAW,SACrBK,IAAUJ,EAAW;AAC3B,QAAI,CAACE,KAAW,CAACE,EAAS;AAC1B,UAAMC,IAAKD,EAAQ;AACnB,IAAKF,EAAQ,cACbA,EAAQ,MAAM,aAAa,UAAUV,EAA4B,oCACjEU,EAAQ,MAAM,SAAS,GAAGG,CAAE;AAC5B,UAAMC,IAAI,OAAO,WAAW,MAAM;AAC9B,YAAMC,IAAIR,EAAW;AACrB,MAAIQ,MACAA,EAAE,MAAM,SAAS,IACjBA,EAAE,MAAM,aAAa,KAEzBT,EAAS,OAAO;AAAA,IACpB,GAAGN,KAA+B,EAAE;AACpC,WAAO,MAAM,OAAO,aAAac,CAAC;AAAA,EACtC,GAAG,CAACT,CAAK,CAAC,GAGN,gBAAAT;AAAA,IAACF;AAAA,IAAA;AAAA,MACG,KAAKa;AAAA,MACL,IAAI;AAAA,QACA,UAAU;AAAA,QACV,UAAUF,MAAU,UAAU,SAAS;AAAA,QACvC,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW;AAAA,QACX,kCAAkC;AAAA,UAC9B,MAAM,EAAE,SAAS,GAAG,WAAW,cAAA;AAAA,UAC/B,QAAQ,EAAE,SAAS,GAAG,WAAW,WAAA;AAAA,QAAW;AAAA,MAChD;AAAA,MAGF,UAAA;AAAA,SAAAA,MAAU,SAASA,MAAU,eAC3B,gBAAAZ;AAAA,UAAC;AAAA,UAAA;AAAA,YAEG,OAAO;AAAA,cACH,UAAUY,MAAU,aAAa,aAAa;AAAA,cAC9C,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,SAASA,MAAU,aAAa,IAAI;AAAA,cACpC,YAAYA,MAAU,aAAa,2BAA2B;AAAA,cAC9D,eAAeA,MAAU,aAAa,SAAS;AAAA,cAC/C,OAAO;AAAA,YAAA;AAAA,YAGV,UAAAF;AAAA,UAAA;AAAA,UAZG;AAAA,QAAA;AAAA,SAeVE,MAAU,cAAcA,MAAU,YAChC,gBAAAZ;AAAA,UAACC;AAAA,UAAA;AAAA,YAEG,KAAKc;AAAA,YACL,IAAI;AAAA,cACA,OAAO;AAAA,cACP,WAAWH,MAAU,aAAa,uBAAuBL,EAA4B,+CAA+C;AAAA,cACpI,2CAA2C,EAAE,WAAW,OAAA;AAAA,YAAO;AAAA,YAGlE,UAAAI;AAAA,UAAA;AAAA,UARG;AAAA,QAAA;AAAA,MASR;AAAA,IAAA;AAAA,EAAA;AAIhB,GAxF4H,4BA0F/GY,KAA8D,gBAAAjK,EAAA,CAACkK,MAAU;;AAClF,QAAMC,IAAmBD,EAAM,oBAAoB,IAC7CxC,IAAWwC,EAAM,YAAY,IAE7BE,IAAS/G,GAAmB;AAAA,IAC9B,QAAQ6G,EAAM;AAAA,IACd,aAAaA,EAAM;AAAA,IACnB,YAAYA,EAAM;AAAA,IAClB,WAAWA,EAAM;AAAA,IACjB,kBAAkBA,EAAM;AAAA,IACxB,gBAAgBA,EAAM;AAAA,IACtB,kBAAkBA,EAAM;AAAA,IACxB,kBAAkBA,EAAM;AAAA,IACxB,UAAAxC;AAAA,IACA,gBAAgBwC,EAAM;AAAA,EAAA,CACzB,GAEK;AAAA,IACF,WAAAzK;AAAA,IAAW,OAAAuE;AAAA,IAAO,OAAAE;AAAA,IAAO,SAAAE;AAAA,IAAS,OAAAE;AAAA,IAAO,UAAAC;AAAA,IAAU,SAAAgD;AAAA,IAAS,eAAAlC;AAAA,IAAe,iBAAAZ;AAAA,IAC3E,cAAAe;AAAA,IAAc,gBAAAC;AAAA,IAAgB,kBAAAmC;AAAA,IAAkB,sBAAArC;AAAA,IAAsB,gBAAAf;AAAA,IACtE,UAAAmB;AAAA,IAAU,aAAAC;AAAA,IAAa,gBAAAC;AAAA,IAAgB,mBAAAG;AAAA,IAAmB,cAAAC;AAAA,EAAA,IAC1DmE,GAEE,CAACC,GAAWC,CAAY,IAAI1G,EAAS,EAAK,GAC1C,CAAC2G,GAAWC,EAAY,IAAI5G,EAAiB,IAAI,GAEjD6G,MAA2BhL,KAAA,gBAAAA,EAAW,2BAA0B,IAChEiL,KAAyBtF,EAAgC,MACvDZ,KAAkB,CAAC0F,EAAM,WAAW,CAACO,KAAiC,OACnEP,EAAM,0BAA0B,MACxC,CAAC1F,GAAgB0F,EAAM,SAASO,IAA0BP,EAAM,sBAAsB,CAAC,GAEpFS,IAAYT,EAAM,cAClB,YAAY;AACV,QAAKzK,GACL;AAAA,MAAA6K,EAAa,EAAI;AACjB,UAAI;AACA,cAAMJ,EAAM,YAAa,EAAE,WAAAzK,GAAW,YAAYgF,GAAiB,iBAAiByF,EAAM,iBAAiB;AAAA,MAC/G,SAASrD,GAAK;AACV,QAAAtC,EAASsC,aAAe,QAAQA,EAAI,UAAU,mBAAmB;AAAA,MACrE,UAAA;AACI,QAAAyD,EAAa,EAAK;AAAA,MACtB;AAAA;AAAA,EACJ,IACE,QAEAM,IAAU,CAAC,CAACV,EAAM,QAClBW,IAAc,CAAC,CAACX,EAAM,cAAc,CAAC7E,EAAc,UAEnDyF,IAASZ,EAAM,eACjBA,EAAM,aAAa;AAAA,IACf,MAAMzK,KAAA,gBAAAA,EAAW;AAAA,IACjB,UAAUA,KAAA,gBAAAA,EAAW;AAAA,IACrB,WAAWA,KAAa;AAAA,IACxB,SAAS8H,KAAW;AAAA,IACpB,eAAa5H,IAAAF,KAAA,gBAAAA,EAAW,YAAX,gBAAAE,EAAoB,WAAU,KAAK;AAAA,IAChD,aAAagL;AAAA,IACb,YAAYT,EAAM;AAAA,IAClB,QAAQA,EAAM;AAAA,IACd,WAAAG;AAAA,IACA,UAAU,CAAC,CAAChF,EAAc;AAAA,IAC1B,SAAAuF;AAAA,IACA,aAAAC;AAAA,IACA,wBAAAH;AAAA,EAAA,CACH,IACAP,IAOD,gBAAAtB,EAAAkC,IAAA,EACI,UAAA;AAAA,IAAA,gBAAArC,EAACI,GAAA,EAAM,WAAU,OAAM,KAAK,GAAG,IAAI,EAAE,SAAS,OAAO,YAAY,QAAQ,SAAS,eAAe,OAAO,kBAAkB,YAAY,UAAU,cAAc,QAAQ,UAAU,OAAA,GAC5K,UAAA,gBAAAD,EAACF,KAAI,IAAI,EAAE,SAAS,eAAe,UAAU,QAAQ,UAAU,QAAQ,YAAY,YAC/E,UAAA;AAAA,MAAA,gBAAAE,EAACF,GAAA,EAAI,IAAI,EAAE,SAAS,eAAe,OAAO,OAAO,YAAY,UAAU,KAAK,EAAA,GACxE,UAAA;AAAA,QAAA,gBAAAD,EAAC,QAAA,EAAK,WAAU,kBAAiB,OAAO,EAAE,UAAU,OAAA,GAAW,WAAAjJ,KAAA,gBAAAA,EAAW,gBAAe,YAAA,CAAY;AAAA,QACrG,gBAAAiJ,EAACK,GAAA,EAAW,WAAU,MAAK,SAAQ,MAAK,IAAI,EAAE,GAAG,GAAG,OAAO,eAAA,GAAmB,WAAAtJ,KAAA,gBAAAA,EAAW,SAAQ,IAAG;AAAA,QACnGiL;AAAA,MAAA,GACL;AAAA,wBACC5B,GAAA,EAAM,WAAU,OAAM,KAAK,GAAG,IAAI,EAAE,OAAO,OAAO,SAAS,eAAe,IAAI,GAAG,gBAAgB,SAAS,YAAY,YAClH,UAAA;AAAA,QAAA8B,KACG,gBAAAlC,EAACsC,IAAA,EAAO,SAASd,EAAM,QAAQ,MAAK,SAAQ,UAAUG,GAAW,SAAQ,YAAW,IAAI,EAAE,UAAU,SAAS,GAAG,EAAA,GAC5G,UAAA,gBAAAxB,EAACC,GAAA,EAAM,WAAU,OAAM,KAAK,KAAK,YAAW,UACxC,UAAA;AAAA,UAAA,gBAAAJ,EAACK,GAAA,EAAW,SAAQ,SAAQ,UAAA,QAAI;AAAA,UAChC,gBAAAL,EAACuC,MAAW,UAAS,SAAQ,IAAI,EAAE,IAAI,IAAE,CAAG;AAAA,QAAA,EAAA,CAChD,EAAA,CACJ;AAAA,QAEH,CAAC5F,EAAc,YACZ,gBAAAwD,EAAAkC,IAAA,EACK,UAAA;AAAA,UAAAF,KACG,gBAAAnC,EAACsC,IAAA,EAAO,SAASd,EAAM,YAAY,MAAK,SAAQ,SAAQ,YAAW,IAAI,EAAE,WAAW,QAAQ,UAAU,SAAS,GAAG,EAAA,GAC9G,UAAA,gBAAArB,EAACC,GAAA,EAAM,WAAU,OAAM,KAAK,KAAK,YAAW,UAAS,IAAI,EAAE,WAAW,UAClE,UAAA;AAAA,YAAA,gBAAAJ,EAACK,GAAA,EAAW,SAAQ,SAAS,UAAAmB,EAAM,iBAAiB,WAAU;AAAA,YAC9D,gBAAAxB,EAACwC,IAAA,EAAa,IAAI,EAAE,IAAI,GAAG,UAAU,OAAA,GAAU,UAAS,QAAA,CAAQ;AAAA,UAAA,EAAA,CACpE,EAAA,CACJ;AAAA,UAEHP,KACG,gBAAAjC,EAACsC,IAAA,EAAO,SAASL,GAAW,MAAK,SAAQ,UAAUN,GAAW,SAAQ,YAAW,IAAI,EAAE,WAAW,QAAQ,UAAU,SAAS,GAAG,EAAA,GAC5H,UAAA,gBAAAxB,EAACC,GAAA,EAAM,WAAU,OAAM,KAAK,KAAK,YAAW,UAAS,IAAI,EAAE,WAAW,UAClE,UAAA;AAAA,YAAA,gBAAAJ,EAACK,GAAA,EAAW,SAAQ,SAAS,UAAAsB,IAAY,mBAAmB,gBAAe;AAAA,YAC1EA,sBAAac,IAAA,EAAiB,MAAM,IAAI,IAAI,EAAE,IAAI,IAAE,CAAG,IAAK,gBAAAzC,EAAC0C,IAAA,EAAqB,IAAI,EAAE,IAAI,GAAG,UAAU,OAAA,GAAU,UAAS,QAAA,CAAQ;AAAA,UAAA,EAAA,CACzI,EAAA,CACJ;AAAA,QAAA,EAAA,CAER;AAAA,MAAA,EAAA,CAER;AAAA,IAAA,EAAA,CACJ,EAAA,CACJ;AAAA,OAEE7E,IAAA9G,KAAA,gBAAAA,EAAW,YAAX,gBAAA8G,EAAoB,WAAU,KAAK,KACjC,gBAAAmC;AAAA,MAACI;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,KAAK;AAAA,QACL,IAAI;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,YAAYzD,EAAc,WAAW,SAAS;AAAA,UAC9C,eAAe;AAAA,UACf,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,iBAAiB;AAAA,QAAA;AAAA,QAGpB,UAAAkC;AAAA,MAAA;AAAA,IAAA;AAAA,EACL,GAER,OAjEClB,KAAA5G,KAAA,gBAAAA,EAAW,YAAX,gBAAA4G,GAAoB,WAAU,KAAK,IAChC,gBAAAqC,EAACI,GAAA,EAAM,WAAU,OAAM,KAAK,GAAG,IAAI,EAAE,UAAU,QAAQ,UAAU,QAAQ,IAAI,MAAM,IAAI,GAAG,gBAAgB,YAAY,YAAY,aAAA,GAC7H,UAAAvB,GACL,IACA,MAkEF8D,IAAuB,gBAAArL,EAAA,CAACsL,GAAgBC,GAA4BC,MAAqC;;AAC3G,IAAK9D,MACD,CAAC6D,KAAW,CAACC,MACjB7L,IAAAuK,EAAM,mBAAN,QAAAvK,EAAA,KAAAuK,GAAuBoB,GAAQC,GAASC;AAAA,EAC5C,GAJ6B,yBAMvBC,IAAYrG,EAAQ,MAAM;AAC5B,QAAI,CAACpB,EAAO;AACZ,UAAM0H,KAAejM,KAAA,gBAAAA,EAAW,eAAc;AAC9C,WAAOuE,EAAM,IAAI,CAACxE,MAAS;;AACvB,YAAM,EAAE,OAAAK,GAAO,cAAAC,GAAc,UAAAC,MAAaR,GAAoBC,GAAMC,CAAS;AAC7E,aACI,gBAAAiJ;AAAA,QAACiD;AAAA,QAAA;AAAA,UACG,YAAYzB,EAAM,cAAc;AAAA,UAChC,UAAUwB;AAAA,UAEV,WAAW;AAAA,UACX,QAAQ,EAAE,OAAO7L,KAAS,IAAI,MAAMC,KAAeH,KAAAuK,EAAM,oBAAN,gBAAAvK,GAAA,KAAAuK,GAAwBpK,KAAgB,OAAA;AAAA,UAC3F,OAAOR,GAAkBS,KAAY,SAAS;AAAA,UAE7C,UAAAP,EAAK;AAAA,QAAA;AAAA,QALDA,EAAK;AAAA,MAAA;AAAA,IAQtB,CAAC;AAAA,EACL,GAAG,CAACwE,GAAOvE,GAAWyK,EAAM,YAAYA,EAAM,eAAe,CAAC;AAE9D,MAAI,CAACzK,KAAa8F;AACd,6BACKoD,GAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,gBAAgB,UAAU,QAAQ,QAAQ,OAAO,QAAQ,KAAK,KACrI,UAAA;AAAA,MAAA,gBAAAD,EAACyC,IAAA,EAAiB;AAAA,MAClB,gBAAAzC,EAACK,GAAA,EAAW,OAAM,kBAAiB,UAAA,uBAAA,CAAoB;AAAA,IAAA,GAC3D;AAGR,MAAI,CAACtJ,EAAW,QAAO;AAEvB,QAAMmM,KAAY1B,EAAM,mBAAmB,OAAS,CAAC1F;AAErD,2BACKqH,IAAA,EAA0B,SAAS3B,EAAM,cAAc,oBAAkB,IACtE,UAAA,gBAAAxB;AAAA,IAACoD;AAAA,IAAA;AAAA,MACG,QAAQ;AAAA,QACJ,aAAarM,EAAU,MAAM8F,KAAwB;AAAA,QACrD,YAAYd;AAAA,QACZ,aAAayF,EAAM,kBAAkB;AAAA,QACrC,iBAAiBA,EAAM;AAAA,MAAA;AAAA,MAG3B,UAAA,gBAAArB;AAAA,QAACC;AAAA,QAAA;AAAA,UACG,KAAK,gBAAA9I,EAAA,CAAC+L,MAAQ;AACV,YAAAvG,EAAa,UAAU,CAACA,EAAa,WAAWuG,IAAMA,IAAMvG,EAAa;AAAA,UAC7E,GAFK;AAAA,UAGL,WAAU;AAAA,UACV,IAAI;AAAA,YACA,QAAQhB,IAAiB,UAAU0F,EAAM,UAAU;AAAA,YACnD,WAAW;AAAA,YACX,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,UAAU;AAAA,YACV,OAAO;AAAA,YACP,UAAU1F,IAAiB,WAAW;AAAA,YACtC,uBAAuB,EAAE,aAAa,QAAQ,cAAc,OAAA;AAAA,YAC5D,qBAAqB,EAAE,SAAS,OAAA;AAAA,UAAO;AAAA,UAG3C,UAAA;AAAA,YAAA,gBAAAqE,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,SAAS,GAAG,OAAO,QAAQ,MAAM,IAAI,QAAQ,QAAQ,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,YAAY,aAAA,GAC7J,UAAA;AAAA,cAAA+C,KACG,gBAAA/C;AAAA,gBAACF;AAAA,gBAAA;AAAA,kBACG,IAAI;AAAA,oBACA,UAAU;AAAA,oBACV,MAAM;AAAA,oBACN,QAAQ;AAAA,oBACR,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,IAAI;AAAA,oBACJ,IAAI;AAAA,oBACJ,cAAc;AAAA,oBACd,iBAAiB;AAAA,oBACjB,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb,WAAW;AAAA,oBACX,UAAU;AAAA,kBAAA;AAAA,kBAGd,UAAA;AAAA,oBAAA,gBAAAD,EAACK,GAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,OAAO,kBAAkB,eAAe,aAAa,eAAe,KAAK,YAAY,OAAO,UAAA,QAEhI;AAAA,oBACA,gBAAAL;AAAA,sBAACsD;AAAA,sBAAA;AAAA,wBACG,OAAOzB;AAAA,wBACP,UAAU,gBAAAvK,EAAA,CAACiM,GAAQpH,MAAU2F,GAAa3F,CAAe,GAA/C;AAAA,wBACV,KAAK;AAAA,wBACL,KAAK;AAAA,wBACL,MAAM;AAAA,wBACN,IAAI,EAAE,MAAM,GAAG,UAAU,IAAI,OAAO,gBAAgB,QAAQ,GAAG,IAAI,mBAAmB,sBAAsB,EAAE,OAAO,IAAI,QAAQ,IAAI,WAAW,UAAU,qBAAqB,EAAE,SAAS,KAAA,EAAK;AAAA,sBAAE;AAAA,oBAAA;AAAA,sCAEpMkE,GAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,OAAO,gBAAgB,YAAY,aAAa,UAAU,IAAI,WAAW,SAAS,oBAAoB,kBACrI,UAAA;AAAA,sBAAA,KAAK,MAAMwB,IAAY,GAAG;AAAA,sBAAE;AAAA,oBAAA,EAAA,CACjC;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIPO,uBACIhC,GAAA,EAAM,WAAU,OAAM,KAAK,GAAG,IAAI,EAAE,SAAS,eAAe,UAAU,QAAQ,UAAU,QAAQ,YAAY,cAAc,IAAI,GAAG,YAAY,EAAA,GACzI,UAAAgC,EAAA,CACL;AAAA,cAGHxG,KACG,gBAAAuE,EAACF,GAAA,EAAI,IAAI,EAAE,GAAG,GAAG,UAAU,YAAY,OAAO,OAAA,GAC1C,UAAA;AAAA,gBAAA,gBAAAD,EAACwD,IAAA,EAAW,MAAK,SAAQ,SAAS,gBAAAlM,EAAA,MAAMuE,EAAS,IAAI,GAAnB,YAAsB,IAAI,EAAE,UAAU,YAAY,OAAO,IAAI,KAAK,GAAA,GAChG,UAAA,gBAAAmE,EAACyD,IAAA,EAAc,UAAS,QAAA,CAAQ,EAAA,CACpC;AAAA,gBACA,gBAAAtD,EAACuD,IAAA,EAAM,UAAS,SACZ,UAAA;AAAA,kBAAA,gBAAA1D,EAACK,GAAA,EAAW,SAAQ,aAAY,YAAW,QAAO,UAAA,yBAAqB;AAAA,kBACvE,gBAAAL,EAACK,GAAA,EAAW,SAAQ,SAAS,UAAAzE,EAAA,CAAM;AAAA,gBAAA,EAAA,CACvC;AAAA,cAAA,GACJ;AAAA,cAGJ,gBAAAoE;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACG,SAAUlD,KAAqB,CAACC,KAAiB7B,KAAWqB,MAAmB,KAAK,CAACmC,KAAoB,CAAC6D;AAAA,kBAC1G,YACIzF,KAAqB,CAACC,IAClB,gBAAAyC,EAACZ,IAAA,EAAuB,UAAUjC,EAAA,CAAgB,IAClDzB,IACA,gBAAAyE,EAACF,GAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,gBAAgB,UAAU,QAAQ,QAAQ,WAAW,KAAK,OAAO,QAAQ,KAAK,KACrJ,UAAA;AAAA,oBAAA,gBAAAD,EAACyC,IAAA,EAAiB;AAAA,oBAClB,gBAAAzC,EAACK,GAAA,EAAW,OAAM,kBAAiB,UAAA,uBAAA,CAAoB;AAAA,kBAAA,EAAA,CAC3D,IACA;AAAA,kBAER;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAeI,gBAAAF,EAAC,OAAA,EAAI,IAAG,qBAAoB,OAAO,EAAE,YAAY,GAAG,WAAW,QAAQ,UAAU,QAAQ,OAAO,UAC5F,UAAA;AAAA,sBAAA,gBAAAH;AAAA,wBAAC2D;AAAA,wBAAA;AAAA,0BACG,gBAAgB,EAAE,WAAW,GAAA;AAAA,0BAC7B,QAAQ,EAAE,MAAM,GAAC;AAAA,0BACjB,MAAM,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAA;AAAA,0BAC1C,aAAa,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,EAAA;AAAA,0BACxD,WAAA9B;AAAA,0BACA,YAAY;AAAA,0BACZ,WAAW/F,IAAiB,KAAK;AAAA,0BACjC,YAAY0F,EAAM,cAAc;AAAA,0BAChC,eAAe;AAAA,0BACf,SAAS;AAAA,0BACT,cAAcmB;AAAA,0BACd,YAAYA;AAAA,0BACZ,aAAa5F;AAAA,0BACb,SAASmC;AAAA,0BAER,UAAA6D;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEJvH;AAAA,oBAAA,EAAA,CACL;AAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAER,GACJ;AAAA,YAEA,gBAAAwE,EAAC4D,MAAS,MAAM3G,EAAS,MAAM,kBAAkB,KAAM,SAAS,gBAAA3F,EAAA,MAAM4F,EAAY,CAACd,OAAU,EAAE,GAAGA,GAAM,MAAM,KAAQ,GAAtD,YAAyD,cAAc,EAAE,UAAU,UAAU,YAAY,SAAA,GACrK,4BAACsH,IAAA,EAAM,SAAS,gBAAApM,EAAA,MAAM4F,EAAY,CAACd,OAAU,EAAE,GAAGA,GAAM,MAAM,GAAA,EAAQ,GAAtD,YAAyD,UAAUa,EAAS,UAAU,SAAQ,UACzG,UAAAA,EAAS,QAAA,CACd,EAAA,CACJ;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACJ;AAAA,EAAA,GAER;AAER,GA/T2E,0BCxN9D4G,KAA8E,gBAAAvM,EAAA,CAACkK,MAAU;AAClG,QAAME,IAAS/G,GAAmB;AAAA,IAC9B,QAAQ6G,EAAM;AAAA,IACd,aAAaA,EAAM;AAAA,IACnB,YAAYA,EAAM;AAAA,IAClB,WAAWA,EAAM;AAAA,IACjB,kBAAkBA,EAAM;AAAA,IACxB,gBAAgBA,EAAM;AAAA,IACtB,kBAAkBA,EAAM;AAAA,IACxB,kBAAkBA,EAAM;AAAA,IACxB,gBAAgBA,EAAM;AAAA,EAAA,CACzB,GAEK,EAAE,WAAAzK,GAAW,OAAAuE,GAAO,SAAAI,GAAS,OAAAE,GAAO,UAAAC,GAAU,iBAAAE,GAAiB,cAAAe,GAAc,gBAAAC,GAAgB,kBAAAmC,GAAkB,sBAAArC,GAAsB,gBAAAf,GAAgB,UAAAmB,GAAU,aAAAC,MAAgBwE,GAI/KqB,IAAYrG,EAAQ,MAAM;AAC5B,QAAI,CAACpB,EAAO;AACZ,UAAM0H,KAAejM,KAAA,gBAAAA,EAAW,eAAc;AAC9C,WAAOuE,EAAM,IAAI,CAACxE,MAAS;;AACvB,YAAM,EAAE,OAAAK,GAAO,cAAAC,EAAA,IAAiBP,GAAoBC,GAAMC,CAAS,GAC7D+M,IAAW1M,MAAiB,sBAAsBA,MAAiB,WAAWA,KAAgB;AACpG,aACI,gBAAA4I;AAAA,QAACC;AAAA,QAAA;AAAA,UAEG,IAAI;AAAA,YACA,QAAQ6D,IAAW,UAAU;AAAA,YAC7B,UAAU;AAAA,YACV,IAAI;AAAA,YACJ,eAAc/M,KAAA,gBAAAA,EAAW,gBAAe,UAAU,cAAc;AAAA,YAChE,aAAa;AAAA,UAAA;AAAA,UAGjB,UAAA,gBAAAiJ,EAACiD,IAAA,EAAS,YAAU,IAAC,UAAQ,IAAC,UAAUD,GAAc,WAAWc,IAAW,MAAM,KAAK,QAAQ,EAAE,OAAO3M,KAAS,IAAI,MAAMC,KAAeH,IAAAuK,EAAM,oBAAN,gBAAAvK,EAAA,KAAAuK,GAAwBpK,KAAgB,OAAA,GAC7K,UAAAN,EAAK,QAAA,CACV;AAAA,QAAA;AAAA,QAXKA,EAAK;AAAA,MAAA;AAAA,IActB,CAAC;AAAA,EACL,GAAG,CAACwE,GAAOvE,GAAWyK,EAAM,eAAe,CAAC;AAE5C,SAAI,CAACzK,KAAa8F,sBAEToD,GAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,gBAAgB,UAAU,QAAQ,QAAQ,OAAO,QAAQ,KAAK,KACrI,UAAA;AAAA,IAAA,gBAAAD,EAACyC,IAAA,EAAiB;AAAA,IAClB,gBAAAzC,EAACK,GAAA,EAAW,OAAM,kBAAiB,UAAA,uBAAA,CAAoB;AAAA,EAAA,GAC3D,IAGHtJ,IAGD,gBAAAoJ;AAAA,IAACC;AAAA,IAAA;AAAA,MACG,KAAK,gBAAA9I,EAAA,CAAC+L,MAAQ;AACV,QAAAvG,EAAa,UAAU,CAACA,EAAa,WAAWuG,IAAMA,IAAMvG,EAAa;AAAA,MAC7E,GAFK;AAAA,MAGL,WAAU;AAAA,MACV,IAAI;AAAA,QACA,QAAQhB,IAAiB,UAAU0F,EAAM,UAAU;AAAA,QACnD,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU1F,IAAiB,WAAW;AAAA,QACtC,uBAAuB,EAAE,aAAa,QAAQ,cAAc,OAAA;AAAA,QAC5D,qBAAqB,EAAE,SAAS,OAAA;AAAA,MAAO;AAAA,MAG3C,UAAA;AAAA,QAAA,gBAAAqE,EAAC,SAAI,OAAO,EAAE,UAAU,YAAY,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,YAAY,gBACvI,UAAA;AAAA,UAAAzE,uBACIuE,GAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,gBAAgB,UAAU,QAAQ,QAAQ,OAAO,QAAQ,KAAK,KACrI,UAAA;AAAA,YAAA,gBAAAD,EAACyC,IAAA,EAAiB;AAAA,YAClB,gBAAAzC,EAACK,GAAA,EAAW,OAAM,kBAAiB,UAAA,uBAAA,CAAoB;AAAA,UAAA,GAC3D;AAAA,UAGHzE,KACG,gBAAAuE,EAACF,GAAA,EAAI,IAAI,EAAE,GAAG,GAAG,UAAU,YAAY,OAAO,OAAA,GAC1C,UAAA;AAAA,YAAA,gBAAAD,EAACwD,IAAA,EAAW,MAAK,SAAQ,SAAS,gBAAAlM,EAAA,MAAMuE,EAAS,IAAI,GAAnB,YAAsB,IAAI,EAAE,UAAU,YAAY,OAAO,IAAI,KAAK,GAAA,GAChG,UAAA,gBAAAmE,EAACyD,IAAA,EAAc,UAAS,QAAA,CAAQ,EAAA,CACpC;AAAA,YACA,gBAAAtD,EAACuD,IAAA,EAAM,UAAS,SACZ,UAAA;AAAA,cAAA,gBAAA1D,EAACK,GAAA,EAAW,SAAQ,aAAY,YAAW,QAAO,UAAA,yBAAqB;AAAA,cACvE,gBAAAL,EAACK,GAAA,EAAW,SAAQ,SAAS,UAAAzE,EAAA,CAAM;AAAA,YAAA,EAAA,CACvC;AAAA,UAAA,GACJ;AAAA,UAGH,CAACF,KAAWqB,MAAmB,KAAKmC,KAAoB6D,KACrD,gBAAA/C;AAAA,YAACoD;AAAA,YAAA;AAAA,cACG,QAAQ;AAAA,gBACJ,aAAarM,EAAU,MAAM8F,KAAwB;AAAA,gBACrD,YAAYd,KAAmB,CAAA;AAAA,gBAC/B,aAAayF,EAAM,kBAAkB;AAAA,gBACrC,iBAAiBA,EAAM;AAAA,cAAA;AAAA,cAG3B,UAAA,gBAAAxB,EAACI,KAAM,IAAI,EAAE,OAAO,OAAA,GAAU,KAAK,GAC9B,UAAA2C,EAAA,CACL;AAAA,YAAA;AAAA,UAAA;AAAA,UAGR,gBAAA/C,EAACC,KAAI,IAAI,EAAE,WAAW,QAAQ,UAAU,SAAO,CAAG;AAAA,QAAA,GACtD;AAAA,QAEA,gBAAAD,EAAC4D,MAAS,MAAM3G,EAAS,MAAM,kBAAkB,KAAM,SAAS,gBAAA3F,EAAA,MAAM4F,EAAY,CAACd,OAAU,EAAE,GAAGA,GAAM,MAAM,KAAQ,GAAtD,YAAyD,cAAc,EAAE,UAAU,UAAU,YAAY,SAAA,GACrK,4BAACsH,IAAA,EAAM,SAAS,gBAAApM,EAAA,MAAM4F,EAAY,CAACd,OAAU,EAAE,GAAGA,GAAM,MAAM,GAAA,EAAQ,GAAtD,YAAyD,UAAUa,EAAS,UAAU,SAAQ,UACzG,UAAAA,EAAS,QAAA,CACd,EAAA,CACJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IA9De;AAiE3B,GAnH2F;"}
|
|
@@ -3,13 +3,13 @@ var o = (m, t) => i(m, "name", { value: t, configurable: !0 });
|
|
|
3
3
|
import { D as a } from "./index-Dy6hwDjs.js";
|
|
4
4
|
import { b as e } from "./index-ZBNoVc5M.js";
|
|
5
5
|
import { p as s } from "./index-9LcZjCK0.js";
|
|
6
|
-
import { G as f } from "./index-
|
|
6
|
+
import { G as f } from "./index-D6-YxBjl.js";
|
|
7
7
|
import { H as p } from "./index-D3OoOPjl.js";
|
|
8
8
|
import { F as n } from "./index-BRx4bRbe.js";
|
|
9
9
|
import { T as l } from "./index-zN3LPF6u.js";
|
|
10
10
|
import { C as u } from "./index-CZbCaXMC.js";
|
|
11
|
-
import { V as c } from "./index-
|
|
12
|
-
import {
|
|
11
|
+
import { V as c } from "./index-DwUXZzTn.js";
|
|
12
|
+
import { aH as d } from "./index-DrS3V1Ke.js";
|
|
13
13
|
let r = null;
|
|
14
14
|
function w() {
|
|
15
15
|
return r || (r = {
|
|
@@ -31,4 +31,4 @@ o(w, "getBiModuleSurface");
|
|
|
31
31
|
export {
|
|
32
32
|
w as getBiModuleSurface
|
|
33
33
|
};
|
|
34
|
-
//# sourceMappingURL=biModuleSurface-
|
|
34
|
+
//# sourceMappingURL=biModuleSurface-SpadZ11I.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"biModuleSurface-
|
|
1
|
+
{"version":3,"file":"biModuleSurface-SpadZ11I.js","sources":["../src/runtime/biModuleSurface.ts"],"sourcesContent":["// The flat namespace LLM-emitted code imports from `@aintela/bi` (and from\n// whatever legacy specifiers a host registers). Built from the subpath barrels\n// directly — NOT from `src/index.ts` — so the runtime does not import itself.\nimport * as Data from '../data';\nimport * as Inline from '../inline';\nimport * as Cards from '../cards';\nimport * as Grid from '../grid';\nimport * as Hooks from '../hooks';\nimport * as Filters from '../filters';\nimport * as Theme from '../theme';\nimport * as Client from '../client';\nimport * as Viewer from '../viewer';\nimport * as Composer from '../composer';\n\nlet cached: Record<string, unknown> | null = null;\n\n/** Every runtime export of the package, merged into one object (later spreads win on a name clash). */\nexport function getBiModuleSurface(): Record<string, unknown> {\n if (cached) return cached;\n cached = {\n ...Data,\n ...Theme,\n ...Client,\n ...Hooks,\n ...Grid,\n ...Cards,\n ...Filters,\n ...Inline,\n ...Viewer,\n // The LLM-facing pad surface (ExamplePad, ExampleCardSketh, useDashboardPad, c, dateRange, …)\n // plus the authoring components, so old bundles and the composer agent's instructions resolve.\n ...Composer,\n };\n return cached;\n}\n"],"names":["cached","getBiModuleSurface","Data","Theme","Client","Hooks","Grid","Cards","Filters","Inline","Viewer","Composer","__name"],"mappings":";;;;;;;;;;;;AAcA,IAAIA,IAAyC;AAGtC,SAASC,IAA8C;AAC1D,SAAID,MACJA,IAAS;AAAA,IACL,GAAGE;AAAA,IACH,GAAGC;AAAA,IACH,GAAGC;AAAA,IACH,GAAGC;AAAA,IACH,GAAGC;AAAA,IACH,GAAGC;AAAA,IACH,GAAGC;AAAA,IACH,GAAGC;AAAA,IACH,GAAGC;AAAA;AAAA;AAAA,IAGH,GAAGC;AAAA,EAAA,GAEAX;AACX;AAjBgBY,EAAAX,GAAA;"}
|
package/dist/composer/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { DEFAULT_PAD_HEIGHT_PX, joinClientSideChanges } from './models/sketchMod
|
|
|
10
10
|
export type { SketchedFilterPad, PadConfig, SimplePadDefinition, ComposerDashboard, PromptDashboardCard, PromptDashboardContainer, PromptDashboardScreenData, PromptDashboardBoxData, DashboardFolder, DashboardFolderHierarchy, DashboardHierarchy, } from './models/sketchModels';
|
|
11
11
|
export { CARD_TYPE_CATALOG, FILTER_TYPE_CATALOG, groupCardCatalog, validateSketch, padConfigToDashboard, isSimplePadDefinition, sketchCardItemComparer, sketchFilterComparer, categoryPrefix } from './models/catalog';
|
|
12
12
|
export type { CardTypeDefinition, FilterTypeDefinition } from './models/catalog';
|
|
13
|
-
export { sanitizeToJsVariable, randomId } from './models/utils';
|
|
13
|
+
export { sanitizeToJsVariable, sanitizeToJsxComponentName, randomId } from './models/utils';
|
|
14
14
|
export { CATEGORY_ICONS, SPECIFIC_TYPE_ICONS, SPECIFIC_TYPE_ICON_NAMES, FILTER_TYPE_ICONS, COLOR_MAP, defaultCardTypeIcons, CardTypeIconsProvider, useCardTypeIcons } from './icons/cardTypeIcons';
|
|
15
15
|
export type { CardTypeIconSet, CardTypeIconsProviderProps, SvgIconComponent } from './icons/cardTypeIcons';
|
|
16
16
|
export { DashboardPad } from './pad/DashboardPad';
|
|
@@ -5,5 +5,16 @@
|
|
|
5
5
|
* sanitizer the server applies to card keys.
|
|
6
6
|
*/
|
|
7
7
|
export declare function sanitizeToJsVariable(name: string): string;
|
|
8
|
+
/**
|
|
9
|
+
* A valid JSX COMPONENT name — `sanitizeToJsVariable` plus an upper-case first letter.
|
|
10
|
+
*
|
|
11
|
+
* <p>The difference matters and cost a broken dashboard: a card's key is used verbatim by the server's
|
|
12
|
+
* `DashboardScriptBuilder` as the React identifier, and a JSX tag that starts lowercase is an intrinsic
|
|
13
|
+
* HTML element, not a component. `sanitizeToJsVariable` is right for a variable and keeps the first
|
|
14
|
+
* letter's case, so a card named "kpi 1" minted `kpi1_…` and rendered as `<kpi1_… />` — nothing.</p>
|
|
15
|
+
*
|
|
16
|
+
* <p>This mirrors `Dashboard.SanitizeToJsxComponentName` in AIA.Bi.Models. Keep the two in step.</p>
|
|
17
|
+
*/
|
|
18
|
+
export declare function sanitizeToJsxComponentName(name: string): string;
|
|
8
19
|
/** A random id (RFC 4122 v4 when `crypto.randomUUID` exists, a hex fallback otherwise). */
|
|
9
20
|
export declare function randomId(): string;
|