@aintela/bi 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +32 -1
  2. package/dist/ChartCardDefaultsContext-BDRsVljO.js +34 -0
  3. package/dist/ChartCardDefaultsContext-BDRsVljO.js.map +1 -0
  4. package/dist/{GridLayout-BgPzzPiP.js → GridLayout-1gWuIKeZ.js} +3 -4
  5. package/dist/GridLayout-1gWuIKeZ.js.map +1 -0
  6. package/dist/{ScriptDashboardViewerVertical-DKaHcL1o.js → ScriptDashboardViewerVertical-Rr_4adpH.js} +4 -4
  7. package/dist/{ScriptDashboardViewerVertical-DKaHcL1o.js.map → ScriptDashboardViewerVertical-Rr_4adpH.js.map} +1 -1
  8. package/dist/{biModuleSurface-dtnpBMtT.js → biModuleSurface-BdJK7sSL.js} +6 -6
  9. package/dist/{biModuleSurface-dtnpBMtT.js.map → biModuleSurface-BdJK7sSL.js.map} +1 -1
  10. package/dist/cards.js +1 -1
  11. package/dist/composer/index.d.ts +3 -1
  12. package/dist/composer/view/ComposerView.d.ts +20 -1
  13. package/dist/composer/view/SessionVisualizationsPanel.d.ts +19 -0
  14. package/dist/composer.js +73 -71
  15. package/dist/data/ChartCardDefaultsContext.d.ts +9 -0
  16. package/dist/data.js +1 -1
  17. package/dist/grid.js +16 -17
  18. package/dist/grid.js.map +1 -1
  19. package/dist/{index-DeiweWw8.js → index-9LcZjCK0.js} +54 -50
  20. package/dist/index-9LcZjCK0.js.map +1 -0
  21. package/dist/{index-Dz2ulBiy.js → index-BzUugG0A.js} +4 -5
  22. package/dist/{index-Dz2ulBiy.js.map → index-BzUugG0A.js.map} +1 -1
  23. package/dist/index-C4_VSDeU.js +3856 -0
  24. package/dist/index-C4_VSDeU.js.map +1 -0
  25. package/dist/{index-CPHaT2or.js → index-DChE_l-p.js} +2 -2
  26. package/dist/index-DChE_l-p.js.map +1 -0
  27. package/dist/{index-DOpx0R4Y.js → index-Dy6hwDjs.js} +2 -2
  28. package/dist/index-Dy6hwDjs.js.map +1 -0
  29. package/dist/index.js +228 -223
  30. package/dist/index.js.map +1 -1
  31. package/dist/runtime/index.d.ts +2 -0
  32. package/dist/runtime/sessionVisualizations.d.ts +61 -0
  33. package/dist/runtime/version.d.ts +1 -1
  34. package/dist/runtime.js +16 -11
  35. package/dist/runtime.js.map +1 -1
  36. package/dist/style.css +1 -1
  37. package/dist/version-BTc4ElDG.js +122 -0
  38. package/dist/version-BTc4ElDG.js.map +1 -0
  39. package/dist/viewer.js +1 -1
  40. package/package.json +1 -1
  41. package/dist/ChartCardDefaultsContext-Cl5T25H0.js +0 -32
  42. package/dist/ChartCardDefaultsContext-Cl5T25H0.js.map +0 -1
  43. package/dist/GridLayout-BgPzzPiP.js.map +0 -1
  44. package/dist/index-7p-ogAPK.js +0 -3631
  45. package/dist/index-7p-ogAPK.js.map +0 -1
  46. package/dist/index-CPHaT2or.js.map +0 -1
  47. package/dist/index-DOpx0R4Y.js.map +0 -1
  48. package/dist/index-DeiweWw8.js.map +0 -1
  49. package/dist/version-BgIpi4UM.js +0 -84
  50. package/dist/version-BgIpi4UM.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-7p-ogAPK.js","sources":["../src/composer/models/utils.ts","../src/composer/models/sketchModels.ts","../src/composer/models/catalog.ts","../src/composer/environment/environmentDom.ts","../src/composer/pad/ClonedComponent.tsx","../src/composer/store/drafts.ts","../src/composer/store/createComposerStore.tsx","../src/composer/store/ComposerProvider.tsx","../src/composer/icons/cardTypeIcons.tsx","../src/composer/pad/CardSketch.tsx","../src/composer/pad/FilterSketch.tsx","../src/composer/pad/TitleSketch.tsx","../src/composer/pad/DashboardPadSketch.tsx","../src/composer/pad/HoverButton.tsx","../src/composer/pad/ToolBox.tsx","../src/composer/pad/DashboardPad.tsx","../src/composer/pad/DashboardPadEditor.tsx","../src/composer/pad/DatasetParameterizationControls.tsx","../src/composer/llm/ExamplePad.tsx","../src/composer/llm/ExampleCardSketch.tsx","../src/composer/llm/PrototypePad.tsx","../src/composer/llm/useDashboardPad.tsx","../src/composer/view/composerAnimations.ts","../src/composer/view/data/templates.ts","../src/composer/view/surfaces.ts","../src/composer/view/DashboardSidePanel.tsx","../src/composer/view/DrawablePrompt.tsx","../src/composer/view/data/suggestions.ts","../src/composer/view/EntryEmptyState.tsx","../src/composer/view/SpotlightOverlay.tsx","../src/composer/view/ComposerView.tsx","../src/composer/view/useComposerChatBridge.ts","../src/composer/view/ComposerChatBinding.tsx","../src/composer/view/DashboardPin.tsx"],"sourcesContent":["/**\n * Sanitizes an arbitrary string into a valid JS/TS identifier. Separators\n * (spaces, dashes, dots, …) become camelCase boundaries, diacritics are\n * folded to ASCII, a leading digit gets an underscore. Mirrors the C#\n * sanitizer the server applies to card keys.\n */\nexport function sanitizeToJsVariable(name: string): string {\n if (!name?.trim()) return '_';\n\n const cleaned = name\n .normalize('NFD')\n .replace(/\\p{Mn}/gu, '')\n .replace(/(?<=[a-zA-Z0-9_$])[^a-zA-Z0-9_$]+([a-zA-Z_$])/g, (_, c: string) => c.toUpperCase())\n .replace(/[^a-zA-Z0-9_$]+/g, '');\n\n if (!cleaned) return '_';\n return /^\\d/.test(cleaned) ? `_${cleaned}` : cleaned;\n}\n\n/** A random id (RFC 4122 v4 when `crypto.randomUUID` exists, a hex fallback otherwise). */\nexport function randomId(): string {\n const c = typeof globalThis.crypto !== 'undefined' ? globalThis.crypto : undefined;\n if (c && typeof c.randomUUID === 'function') return c.randomUUID();\n let out = '';\n for (let i = 0; i < 32; i++) out += Math.floor(Math.random() * 16).toString(16);\n return out;\n}\n","/**\n * Sketch-pad models. The card / filter / dashboard document types are the\n * viewer's (`viewer/models.ts`, `filters/filterFactory.tsx`) — re-exported\n * here for convenience, never redeclared.\n */\nimport type React from 'react';\nimport type { CardCategory, CardSpecificType, Dashboard, SketchCardItem } from '../../viewer/models';\nimport type { FilterType, SketchedFilter } from '../../filters/filterFactory';\n\nexport type { CardCategory, CardSpecificType, Dashboard, SketchCardItem, FilterType, SketchedFilter };\n\nexport const DEFAULT_PAD_HEIGHT_PX = 300;\n\n/** A sketched filter as the C# `JsSimplePadDefinition.Filters` emits it — always carries its parameter names. */\nexport interface SketchedFilterPad extends SketchedFilter {\n parametersNames: string[];\n}\n\n/** A single item in a pad layout (used by `ExamplePad`, `PrototypePad` and `SimplePadDefinition`). */\nexport interface PadConfig {\n /** Column span (1–12). */\n size: number;\n /** Card height in pixels. Applied as CSS in `ExamplePad`; converted to grid units in `padConfigToDashboard`. */\n height?: number;\n /** The card content — any React node. Use `ExampleCardSketch` for descriptor-style previews, or a custom component. */\n card: React.ReactNode;\n /** Metadata used by `padConfigToDashboard` when `card` is a custom node (name / type cannot be read from props). */\n id?: string;\n name?: string;\n specificType?: CardSpecificType;\n description?: string;\n}\n\n/**\n * Single source of truth for `ExamplePad` visuals + `env.createDashboardPad()`.\n * `filters` is the wider {@link SketchedFilterPad} because the runtime objects\n * emitted by the server always include `parametersNames`.\n */\nexport interface SimplePadDefinition {\n id?: string;\n name: string;\n filters?: SketchedFilterPad[];\n config: PadConfig[];\n}\n\n/**\n * The dashboard document as the composer edits it: the viewer's `Dashboard`\n * plus the transient, per-turn `clientSideChanges` accumulator. The\n * accumulator is NEVER persisted (`toDraftPayload` strips it); it is\n * flattened into the prompt by `joinClientSideChanges` and cleared after.\n */\nexport interface ComposerDashboard extends Dashboard {\n /**\n * Keyed by `entity:id:operation` (`card:abc:layout`, `filter:xyz:edit`,\n * `dashboard:name`) so repeated edits to one entity collapse to one entry.\n */\n clientSideChanges?: Record<string, string>;\n}\n\n/** Bullet list the agent receives; `undefined` when there is nothing to say. */\nexport function joinClientSideChanges(map: Record<string, string> | undefined): string | undefined {\n if (!map) return undefined;\n const entries = Object.values(map).filter((v) => v && v.trim().length > 0);\n if (entries.length === 0) return undefined;\n return entries.map((v) => `- ${v}`).join('\\n');\n}\n\n// ── The prompt envelope (`onRenderPrompt` → the dashboard agent) ──\n\nexport interface PromptDashboardBoxData {\n widthPx: number;\n heightPx: number;\n}\n\nexport interface PromptDashboardScreenData {\n chatBox?: PromptDashboardBoxData;\n dashboardPreviewBox?: PromptDashboardBoxData;\n dashboardVisualizationBox?: PromptDashboardBoxData;\n gridRowHeightPixelsPerUnit: number;\n gridColumnWidthPixelsPerUnit: number;\n gridColumnWidthPixelsPerUnitFullView: number;\n notes?: string;\n}\n\nexport interface PromptDashboardCard extends SketchCardItem {\n widthPx?: number;\n heightPx?: number;\n}\n\n/** What every composer prompt carries besides the user's text (mirrors the C# `ClientDashboardMessage`). */\nexport interface PromptDashboardContainer {\n id: string;\n name: string;\n cards: PromptDashboardCard[];\n filters: SketchedFilter[];\n layoutType?: 'Naked' | 'Boxed';\n remarks?: string;\n userPrompt?: string;\n screenData?: PromptDashboardScreenData;\n filterValues?: Record<string, unknown>;\n isDatasetParameterized?: boolean;\n defaultDatasetName?: string;\n /** `joinClientSideChanges(dashboard.clientSideChanges)`. */\n clientSideChanges?: string;\n}\n\n// ── Folders (the `/DashboardFolder/*` routes) ──\n\nexport interface DashboardFolder {\n id: string;\n name: string;\n description?: string | null;\n createdAt?: Date | null;\n updatedAt?: Date | null;\n userId?: string | null;\n accountId?: string | null;\n}\n\nexport interface DashboardFolderHierarchy extends DashboardFolder {\n dashboards: Dashboard[];\n}\n\nexport interface DashboardHierarchy {\n userFolders: DashboardFolderHierarchy[];\n companyFolders: DashboardFolderHierarchy[];\n userRootDashboards: Dashboard[];\n companyRootDashboards: Dashboard[];\n /** Admin-published \"Padrão\" dashboards — `userId` and `accountId` both null. */\n defaultDashboards: Dashboard[];\n}\n","import React from 'react';\nimport { CATEGORY_PREFIXES } from '../../viewer/cardMetadata';\nimport { sanitizeToJsVariable } from './utils';\nimport {\n DEFAULT_PAD_HEIGHT_PX,\n type CardCategory,\n type CardSpecificType,\n type ComposerDashboard,\n type FilterType,\n type SimplePadDefinition,\n type SketchCardItem,\n type SketchedFilter,\n} from './sketchModels';\n\nexport interface CardTypeDefinition {\n label: string;\n category: CardCategory;\n specificType: CardSpecificType;\n}\n\n/** Every card type the pad's pickers offer, in display order. Labels are the product's Portuguese. */\nexport const CARD_TYPE_CATALOG: readonly CardTypeDefinition[] = [\n { label: 'Métrica (Comparação)', category: 'Métrica', specificType: 'MetricComparison' },\n { label: 'Tabela (Auto)', category: 'Tabela', specificType: 'TableAuto' },\n { label: 'Tabela (Com barras)', category: 'Tabela', specificType: 'TableBars' },\n { label: 'Tabela (Com mapa de calor)', category: 'Tabela', specificType: 'TableHeatmap' },\n { label: 'Tabela (Grande)', category: 'Tabela', specificType: 'TableLarge' },\n { label: 'Gráfico (Auto)', category: 'Gráfico', specificType: 'ChartAuto' },\n { label: 'Gráfico (Linhas)', category: 'Gráfico', specificType: 'ChartLine' },\n { label: 'Gráfico (Barras) (H)', category: 'Gráfico', specificType: 'ChartBarH' },\n { label: 'Gráfico (Barras) (V)', category: 'Gráfico', specificType: 'ChartBarV' },\n { label: 'Gráfico (Area)', category: 'Gráfico', specificType: 'ChartArea' },\n { label: 'Gráfico (Area Empilhada)', category: 'Gráfico', specificType: 'ChartStackedArea' },\n { label: 'Gráfico (Barras Empilhadas)', category: 'Gráfico', specificType: 'ChartStackedBar' },\n { label: 'Gráfico (Combo)', category: 'Gráfico', specificType: 'ChartCombo' },\n { label: 'Gráfico (Pizza)', category: 'Gráfico', specificType: 'ChartPie' },\n { label: 'Gráfico (Donnut)', category: 'Gráfico', specificType: 'ChartDonut' },\n { label: 'Mapa (Bubbles)', category: 'Mapa', specificType: 'MapBubbles' },\n { label: 'Mapa (Conexões)', category: 'Mapa', specificType: 'MapConnections' },\n { label: 'Árvore (Distribuição)', category: 'Árvore', specificType: 'Treemap' },\n { label: 'Medidor (Gauge)', category: 'Medidor', specificType: 'Gauge' },\n];\n\n/** The catalog grouped by category (insertion order preserved) — what the pickers render. */\nexport function groupCardCatalog(catalog: readonly CardTypeDefinition[] = CARD_TYPE_CATALOG): Record<string, CardTypeDefinition[]> {\n return catalog.reduce<Record<string, CardTypeDefinition[]>>((acc, item) => {\n (acc[item.category] ??= []).push(item);\n return acc;\n }, {});\n}\n\nexport interface FilterTypeDefinition {\n label: string;\n filterType: FilterType;\n}\n\nexport const FILTER_TYPE_CATALOG: readonly FilterTypeDefinition[] = [\n { label: 'Período (Date Range)', filterType: 'DateRangePicker' },\n { label: 'Data (Date Picker)', filterType: 'DatePicker' },\n { label: 'Auto Complete', filterType: 'AutoComplete' },\n];\n\nexport const sketchCardItemComparer = (a: SketchCardItem, b: SketchCardItem): boolean =>\n a.actionDescription == b.actionDescription && a.category == b.category &&\n a.name == b.name && a.color == b.color && a.specificType == b.specificType;\n\nexport const sketchFilterComparer = (a: SketchedFilter, b: SketchedFilter): boolean => JSON.stringify(a) == JSON.stringify(b);\n\n/**\n * Pre-compose validation: clears every card's `todoItem` and returns the\n * (Portuguese) error message when the sketch cannot be sent — duplicate\n * card names, or no card at all. `null` when it is fine.\n */\nexport function validateSketch(dash: ComposerDashboard): string | null {\n const seen = new Set<string | undefined>();\n let hasDuplicate = false;\n for (const card of dash.cards ?? []) {\n card.todoItem = undefined;\n if (seen.has(card.name)) hasDuplicate = true;\n else seen.add(card.name);\n }\n\n let errorMessage: string | null = null;\n if (hasDuplicate) errorMessage = 'Os nomes dos cards precisam ser únicos';\n if ((dash.cards?.length ?? 0) == 0) errorMessage = 'Inclua pelo menos um card no rascunho';\n return errorMessage;\n}\n\nconst ROW_HEIGHT_PX = 20;\n\n/**\n * Converts a `SimplePadDefinition` (flat linear config) into a dashboard\n * document using a 12-column flow-fill. Card metadata is read from the\n * config item first and from an `ExampleCardSketch` element's props second.\n */\nexport function padConfigToDashboard(def: SimplePadDefinition): ComposerDashboard {\n const cards: SketchCardItem[] = [];\n let currentX = 0;\n let currentY = 0;\n let rowH = 0;\n\n let index = 0;\n for (const item of def.config) {\n const { size, height, card } = item;\n const h = Math.max(1, Math.round((height ?? DEFAULT_PAD_HEIGHT_PX) / ROW_HEIGHT_PX));\n\n if (currentX + size > 12) {\n currentX = 0;\n currentY += rowH;\n rowH = 0;\n }\n\n let actionDescription: string | undefined = item.description;\n let name: string | undefined = item.name;\n let specificType: CardSpecificType | undefined = item.specificType;\n let id: string | undefined = item.id;\n let category: CardCategory | undefined;\n\n if (React.isValidElement(card)) {\n const p = (card.props ?? {}) as Record<string, unknown>;\n actionDescription = actionDescription ?? (p.description as string | undefined) ?? '';\n name = name ?? (p.name as string | undefined);\n id = id ?? (p.id as string | undefined) ?? sanitizeToJsVariable(`${name ?? ''}${index}`);\n specificType = specificType ?? (p.specificType as CardSpecificType | undefined);\n category = (p.category as CardCategory | undefined) ?? CARD_TYPE_CATALOG.find((c) => c.specificType === specificType)?.category;\n } else if (name === undefined && specificType === undefined) {\n // No element and no top-level metadata — nothing to materialise.\n continue;\n } else {\n id = id ?? sanitizeToJsVariable(`${name}${index}`);\n category = CARD_TYPE_CATALOG.find((c) => c.specificType === specificType)?.category;\n }\n\n cards.push({\n i: id ?? 'not_defined',\n x: currentX,\n y: currentY,\n w: size,\n h,\n name: name ?? CARD_TYPE_CATALOG.find((c) => c.specificType === specificType)?.label,\n actionDescription,\n specificType,\n category,\n });\n\n currentX += size;\n rowH = Math.max(rowH, h);\n index++;\n }\n\n return {\n id: def.id,\n name: def.name,\n cards,\n filters: def.filters ?? [],\n };\n}\n\n/** `true` for the flat pad shape (`{ config: [...] }`), `false` for a dashboard document. */\nexport function isSimplePadDefinition(d: unknown): d is SimplePadDefinition {\n return typeof d === 'object' && d !== null && 'config' in d && Array.isArray((d as Record<string, unknown>).config);\n}\n\n/** Next unique auto-name for a category (`chart3`, `kpi1`, …) given how many exist. */\nexport function categoryPrefix(category: CardCategory): string {\n return CATEGORY_PREFIXES[category] ?? CATEGORY_PREFIXES.Generic;\n}\n","import type { EnvironmentTarget, GuideStep } from './types';\n\n/** Class the environment API toggles on highlighted nodes (styled in `composer.css`). */\nexport const ENV_HIGHLIGHT_CLASS = 'llm-env-highlight-active';\n\ntype QueryRoot = Pick<ParentNode, 'querySelectorAll'>;\n\nfunction defaultRoot(): QueryRoot | null {\n return typeof document === 'undefined' ? null : document;\n}\n\nexport function escapeCssValue(value: string): string {\n if (typeof CSS !== 'undefined' && CSS.escape) return CSS.escape(value);\n return value.replace(/[\"\\\\]/g, '\\\\$&');\n}\n\nexport function looksLikeSelector(value: string): boolean {\n return value.startsWith('.') ||\n value.startsWith('#') ||\n value.startsWith('[') ||\n value.includes(' ') ||\n value.includes(':') ||\n value.includes('>');\n}\n\n/**\n * Every selector an `EnvironmentTarget` may denote, in priority order. A\n * plain identifier fans out to the `data-env-*` attributes first so an\n * LLM naming a card by its `i` finds the sketch node, not a stray class.\n */\nexport function toSelectorList(target: EnvironmentTarget): string[] {\n const selectors = new Set<string>();\n const appendByIdentifier = (identifier: string) => {\n const escaped = escapeCssValue(identifier);\n selectors.add(`[data-env-id=\"${escaped}\"]`);\n selectors.add(`[data-env-key=\"${escaped}\"]`);\n selectors.add(`[data-env-name=\"${escaped}\"]`);\n selectors.add(`#${escaped}`);\n selectors.add(`.${escaped}`);\n };\n const appendByClassName = (className: string) => {\n className\n .split(/\\s+/)\n .map((item) => item.trim())\n .filter(Boolean)\n .forEach((item) => selectors.add(`.${escapeCssValue(item)}`));\n };\n\n if (typeof target === 'string') {\n const trimmed = target.trim();\n if (!trimmed) return [];\n if (looksLikeSelector(trimmed)) selectors.add(trimmed);\n else appendByIdentifier(trimmed);\n return [...selectors];\n }\n\n if (target.selector?.trim()) selectors.add(target.selector.trim());\n if (target.className?.trim()) appendByClassName(target.className);\n if (target.identifier?.trim()) appendByIdentifier(target.identifier.trim());\n return [...selectors];\n}\n\n/** All nodes matching any selector of `target` under `root` (default `document`). */\nexport function resolveEnvironmentElements(target: EnvironmentTarget, root: QueryRoot | null = defaultRoot()): { selectors: string[]; elements: HTMLElement[] } {\n if (!root) return { selectors: [], elements: [] };\n const selectors = toSelectorList(target);\n const found = new Set<HTMLElement>();\n\n selectors.forEach((selector) => {\n try {\n root.querySelectorAll<HTMLElement>(selector).forEach((element) => found.add(element));\n } catch (error) {\n console.warn('[@aintela/bi composer] Invalid selector:', selector, error);\n }\n });\n\n return { selectors, elements: [...found] };\n}\n\nexport function isElementVisible(element: HTMLElement): boolean {\n const rect = element.getBoundingClientRect();\n if (!(rect.width > 0 && rect.height > 0)) return false;\n if (typeof window === 'undefined' || !window.getComputedStyle) return true;\n const style = window.getComputedStyle(element);\n return style.display !== 'none' && style.visibility !== 'hidden';\n}\n\n/** First visible match, else the first match; `includeHidden` skips the visibility test. */\nexport function pickBestElement(elements: HTMLElement[], includeHidden = false): HTMLElement | null {\n if (elements.length === 0) return null;\n if (includeHidden) return elements[0];\n for (const element of elements) if (isElementVisible(element)) return element;\n return elements[0];\n}\n\n/**\n * The spotlight's resolver: the first VISIBLE element the target denotes,\n * or `null`. Collapsed / zero-size nodes are rejected so a tour never pins\n * itself to something the user cannot see.\n */\nexport function resolveGuideElement(target: EnvironmentTarget, root: QueryRoot | null = defaultRoot()): HTMLElement | null {\n const { elements } = resolveEnvironmentElements(target, root);\n for (const el of elements) if (isElementVisible(el)) return el;\n return null;\n}\n\n// Pad-internal identifiers — when a guide step targets any of these the\n// sketch must be expanded BEFORE the overlay tries to resolve the target,\n// otherwise the element does not exist in the DOM.\nexport const PAD_INTERNAL_IDS: ReadonlySet<string> = new Set<string>([\n 'dashboardpad-add-card',\n 'dashboardpad-add-card-dropdown',\n 'dashboardpad-add-filter',\n 'dashboard-pad-layout-toggle',\n 'dashboard-pad-layout-boxed',\n 'dashboard-pad-layout-naked',\n]);\nexport const PAD_INTERNAL_CLASSES: ReadonlySet<string> = new Set<string>([\n 'llm-env-card',\n 'llm-env-filter',\n 'llm-env-layout-toggle',\n 'llm-env-card-sketch',\n 'llm-env-card-sketch-wrapper',\n 'llm-env-filter-sketch',\n]);\n\n// UUID-ish heuristic: the agent emits per-card / per-filter `i` values that\n// look like UUIDs (or at least dash-separated hex). Anything matching is\n// almost certainly a pad-internal node.\nconst UUIDISH_RE = /^[0-9a-fA-F]{8,}(-[0-9a-fA-F]{4,})+$/;\n\nexport function targetSuggestsPadInternal(t: EnvironmentTarget): boolean {\n const checkId = (id: string) => {\n const trimmed = id.trim();\n if (!trimmed) return false;\n if (PAD_INTERNAL_IDS.has(trimmed)) return true;\n return UUIDISH_RE.test(trimmed);\n };\n const checkClass = (cls: string) => cls.split(/\\s+/).filter(Boolean).some((c) => PAD_INTERNAL_CLASSES.has(c));\n\n if (typeof t === 'string') {\n const trimmed = t.trim();\n if (!looksLikeSelector(trimmed)) return checkId(trimmed);\n return false;\n }\n if (t.identifier && checkId(t.identifier)) return true;\n if (t.className && checkClass(t.className)) return true;\n return false;\n}\n\nexport function guideStepsRequireSketch(steps: GuideStep[]): boolean {\n return steps.some((s) => targetSuggestsPadInternal(s.target));\n}\n","import React from 'react';\nimport Box from '@mui/material/Box';\nimport type { CloneComponentResult, EnvironmentTarget } from '../environment/types';\nimport { ENV_HIGHLIGHT_CLASS } from '../environment/environmentDom';\n\nexport interface ClonedComponentProps {\n entry: CloneComponentResult;\n /** Fired on hover with the clone's source selector — the store's `highlightComponent`. */\n onHover?: (target: EnvironmentTarget) => void;\n}\n\n/**\n * The inline mirror `env.cloneComponent()` hands back to a live-TSX block:\n * hovering highlights the original node on the page, clicking clicks it.\n */\nexport const ClonedComponent: React.FC<ClonedComponentProps> = ({ entry, onHover }) => (\n <Box\n onClick={() => entry.source?.click()}\n onMouseOver={() => onHover?.(entry.sourceSelector)}\n sx={{ '& :hover': { cursor: 'pointer' } }}\n >\n <div\n style={{ width: `${entry.width}px`, height: `${entry.height}px` }}\n dangerouslySetInnerHTML={{ __html: entry.html?.replaceAll(ENV_HIGHLIGHT_CLASS, '') ?? '' }}\n />\n </Box>\n);\n\nexport default ClonedComponent;\n","import type { BiClient } from '../../client';\nimport type { ComposerDashboard, SketchCardItem, SketchedFilter } from '../models/sketchModels';\n\n/**\n * The upsert body the server expects: document metadata at the top level,\n * the editable part under `draft`. `clientSideChanges` is the transient\n * per-turn hint and never leaves the client.\n */\nexport function toDraftPayload(dashboard: ComposerDashboard): Record<string, unknown> {\n const {\n cards, filters, layoutType, remarks, userPrompt,\n grid_definition, updated_grid_definition, filter_components,\n // Parameterised-dataset fields live on `Dashboard.Draft` server-side;\n // at the top level the deserialiser drops them on the floor.\n isDatasetParameterized, defaultDatasetName,\n clientSideChanges: _clientSideChanges,\n ...metadata\n } = dashboard;\n\n return {\n ...metadata,\n draft: {\n cards: cards ?? [],\n filters: filters ?? [],\n remarks,\n userPrompt,\n layoutType,\n grid_definition: grid_definition ?? null,\n updated_grid_definition: updated_grid_definition ?? null,\n filter_components: filter_components ?? [],\n isDatasetParameterized: isDatasetParameterized ?? false,\n defaultDatasetName,\n },\n };\n}\n\n/** Flattens the server's `{ ...metadata, draft | committed }` document back into a `ComposerDashboard`. */\nexport function fromUpsertResponse(resp: unknown): ComposerDashboard {\n const r = (resp ?? {}) as Record<string, any>;\n const draft = r.draft ?? r.committed;\n return {\n ...(r as ComposerDashboard),\n cards: draft?.cards ?? r.cards ?? [],\n filters: draft?.filters ?? r.filters ?? [],\n remarks: draft?.remarks ?? r.remarks,\n userPrompt: draft?.userPrompt ?? r.userPrompt,\n layoutType: draft?.layoutType ?? r.layoutType,\n grid_definition: draft?.gridDefinition ?? draft?.grid_definition ?? r.grid_definition ?? null,\n updated_grid_definition: draft?.upadatedGridDefinition ?? draft?.updated_grid_definition ?? r.updated_grid_definition ?? null,\n filter_components: draft?.filterComponents ?? draft?.filter_components ?? r.filter_components ?? [],\n isDatasetParameterized: draft?.isDatasetParameterized ?? r.isDatasetParameterized,\n defaultDatasetName: draft?.defaultDatasetName ?? r.defaultDatasetName,\n };\n}\n\n/** POST the draft; resolves to the server's flattened document. */\nexport async function upsertDashboardDraft(client: BiClient, dashboard: ComposerDashboard): Promise<ComposerDashboard> {\n const resp = await client.upsertDashboard(toDraftPayload(dashboard));\n return fromUpsertResponse(resp);\n}\n\nexport interface DraftSeed {\n name?: string;\n cards?: SketchCardItem[];\n filters?: SketchedFilter[];\n layoutType?: 'Naked' | 'Boxed';\n}\n\n/** A fresh server-side draft bound to `sessionId` (the `originalSessionId` autosave needs). */\nexport async function createDashboardDraft(client: BiClient, sessionId: string, seed?: DraftSeed & Partial<ComposerDashboard>): Promise<ComposerDashboard> {\n return upsertDashboardDraft(client, {\n name: seed?.name ?? 'Sem título',\n filters: seed?.filters ?? [],\n cards: seed?.cards ?? [],\n ...seed,\n id: undefined,\n originalSessionId: sessionId,\n });\n}\n","import React from 'react';\nimport { createStore, type StoreApi } from 'zustand/vanilla';\nimport type { TodoItem, TodoList } from '@aintela/chat/models';\nimport type { BiClient } from '../../client';\nimport type { ComposerDashboard, SimplePadDefinition } from '../models/sketchModels';\nimport { isSimplePadDefinition, padConfigToDashboard } from '../models/catalog';\nimport { randomId } from '../models/utils';\nimport type {\n CloneComponentOptions,\n CloneComponentResult,\n EnvironmentCloneEntry,\n EnvironmentTarget,\n GuideOptions,\n GuideStep,\n HighlightOptions,\n} from '../environment/types';\nimport { ENV_HIGHLIGHT_CLASS, pickBestElement, resolveEnvironmentElements } from '../environment/environmentDom';\nimport { ClonedComponent } from '../pad/ClonedComponent';\nimport { upsertDashboardDraft } from './drafts';\n\n/**\n * How long the viewer waits after the most-recent sketch edit before\n * catching up to the live state. Generous by design — a sketch drag /\n * resize / rename must not cascade into the heavy dashboard viewer.\n */\nexport const VIEWER_COMMIT_DEBOUNCE_MS = 3000;\n/** Autosave debounce after the last `updateDashboard`. */\nexport const DRAFT_SAVE_DEBOUNCE_MS = 800;\n/** `showGuide` publishes its steps after this delay so the DOM can settle first. */\nexport const GUIDE_SHOW_DELAY_MS = 500;\nconst DEFAULT_HIGHLIGHT_MS = 1800;\n\nexport type ComposerViewType = 'Sketch' | 'Generated';\n\nexport interface ComposerViewport {\n width: number;\n height: number;\n}\n\nexport interface ComposerState {\n /** The live sketch the pad edits. */\n dashboardDefinition: ComposerDashboard | null;\n /**\n * \"Published\" snapshot read-only surfaces (the side panel's viewer)\n * render from. Advances on a debounced timer after edits (skipped while\n * a turn is open), immediately on `commitForSend()`, and at hydration /\n * agent boundaries.\n */\n publishedDashboard: ComposerDashboard | null;\n /** Snapshot at the last real send — the \"queued changes\" chip diffs against it. */\n lastSentDashboard: ComposerDashboard | null;\n dashboardId: string | null;\n viewType: ComposerViewType;\n scriptLoadOnMount: boolean;\n /** Bumped when the bundle CODE changes (generated / loaded / refreshed) — the viewer's `codeGeneration`. */\n renderGeneration: number;\n turnOpen: boolean;\n currentSessionId: string | null;\n /** Bumped on viewer commits, refreshes and agent updates — the viewer's `llmRenderCount`. */\n llmCounter: number;\n /** Bumped ONLY when the agent touched the sketch (`updateDashboardPad`, `dashboardGenerated`). */\n agentPulseTick: number;\n todosByCardKey: Record<string, { todo: TodoItem; turnOpen: boolean }>;\n\n // ── View state shared by ComposerView and the chat bridge ──\n sketchExpanded: boolean;\n hasCompletedOnce: boolean;\n producedDashboardId: string | null;\n viewport: ComposerViewport;\n\n guideSteps: GuideStep[] | null;\n guideOptions: GuideOptions | null;\n\n // ── Internals ──\n _client: BiClient | null;\n _draftSaveTimer: ReturnType<typeof setTimeout> | null;\n _draftSavePromise: Promise<void> | null;\n _viewerCommitTimer: ReturnType<typeof setTimeout> | null;\n _guideShowTimer: ReturnType<typeof setTimeout> | null;\n\n setClient: (client: BiClient | null) => void;\n flushDraft: () => Promise<void>;\n\n /** Agent tool events (`dashboardGenerated`, `todolistUpdated`) — the chat bridge forwards them here. */\n ingestToolEvent: (eventName: string, eventData: string) => void;\n setTurnOpen: (open: boolean) => void;\n onTurnOpened: () => void;\n onTurnClosed: () => void;\n setDashboardId: (id: string | null) => void;\n setCurrentSessionId: (sessionId: string | null) => void;\n setViewType: (v: ComposerViewType) => void;\n /** Merge `fields` into the live sketch; `undefined` wipes it (and both snapshots). */\n updateDashboard: (fields?: Partial<ComposerDashboard>) => void;\n loadDashboard: (dashboard: ComposerDashboard) => void;\n /** One entry into the per-turn `clientSideChanges` hint (last write per key wins). Does not trigger a save. */\n recordSketchChange: (key: string, text: string) => void;\n clearClientSideChanges: () => void;\n /** The user is sending: both snapshots advance, the pending viewer commit is cancelled. */\n commitForSend: () => void;\n /** A layout edit made inside the preview viewer: align `publishedDashboard` now, keep `lastSentDashboard`. */\n commitDashboardLayout: () => void;\n\n setSketchExpanded: (next: boolean | ((prev: boolean) => boolean)) => void;\n setHasCompletedOnce: (next: boolean) => void;\n setProducedDashboardId: (id: string | null) => void;\n setViewport: (viewport: ComposerViewport) => void;\n\n highlightComponent: (target: EnvironmentTarget, options?: HighlightOptions) => number;\n cloneComponent: (target: EnvironmentTarget, options?: CloneComponentOptions) => CloneComponentResult | null;\n createDashboardPad: (dashboard: ComposerDashboard | SimplePadDefinition) => void;\n updateDashboardPad: (dashboard: ComposerDashboard | SimplePadDefinition) => void;\n refreshDashboard: () => void;\n showGuide: (steps: GuideStep[], options?: GuideOptions) => void;\n dismissGuide: () => void;\n\n /** Reset for a (possibly different) dashboard, or to an empty composer. */\n openComposer: (dashboard?: ComposerDashboard) => void;\n}\n\nexport type ComposerStoreApi = StoreApi<ComposerState>;\n\nexport interface CreateComposerStoreOptions {\n /** Autosave transport. `null` disables the debounced draft save (the pad still works). */\n client?: BiClient | null;\n viewerCommitDebounceMs?: number;\n draftSaveDebounceMs?: number;\n /** Called when the autosave POST fails (default: `console.warn`). */\n onDraftSaveError?: (error: unknown) => void;\n}\n\n/**\n * One composer = one store. `ComposerProvider` calls this per instance;\n * nothing here is module-level, so two composers on one page (or two tests)\n * never share state.\n */\nexport function createComposerStore(options: CreateComposerStoreOptions = {}): ComposerStoreApi {\n const viewerDebounce = options.viewerCommitDebounceMs ?? VIEWER_COMMIT_DEBOUNCE_MS;\n const draftDebounce = options.draftSaveDebounceMs ?? DRAFT_SAVE_DEBOUNCE_MS;\n const onDraftSaveError = options.onDraftSaveError ?? ((err: unknown) => console.warn('[@aintela/bi composer] draft save failed:', err));\n\n return createStore<ComposerState>()((set, get) => {\n const _saveDraft = async (): Promise<void> => {\n const client = get()._client;\n const def = get().dashboardDefinition;\n if (!client) return;\n if (!def?.id) return; // nothing to autosave until `ensureDraft` created the server document\n if (!def.originalSessionId) return;\n\n const promise = upsertDashboardDraft(client, def).then(() => undefined).catch(onDraftSaveError);\n set({ _draftSavePromise: promise });\n await promise;\n set((s) => (s._draftSavePromise === promise ? { _draftSavePromise: null } : {}));\n };\n\n const _scheduleDraftSave = () => {\n const prev = get()._draftSaveTimer;\n if (prev) clearTimeout(prev);\n const timer = setTimeout(() => {\n void _saveDraft();\n }, draftDebounce);\n set({ _draftSaveTimer: timer });\n };\n\n const _scheduleViewerCommit = () => {\n if (get().turnOpen) return;\n const prev = get()._viewerCommitTimer;\n if (prev) clearTimeout(prev);\n const timer = setTimeout(() => {\n if (get().turnOpen) return;\n const live = get().dashboardDefinition;\n set((s) => ({ publishedDashboard: live, llmCounter: s.llmCounter + 1, _viewerCommitTimer: null }));\n }, viewerDebounce);\n set({ _viewerCommitTimer: timer });\n };\n\n const _cancelViewerCommit = () => {\n const prev = get()._viewerCommitTimer;\n if (prev) {\n clearTimeout(prev);\n set({ _viewerCommitTimer: null });\n }\n };\n\n const internalUpdateDashboardPad = async (dashboard: ComposerDashboard | SimplePadDefinition) => {\n // Defer to the next microtask so `set()` never fires during another\n // component's render (live-TSX may call this synchronously).\n await Promise.resolve();\n const current = get().dashboardDefinition;\n const sessionId = get().currentSessionId || null;\n const isTurnOpen = get().turnOpen;\n const incomingId = dashboard.id;\n\n // Bundle re-mount echo guard: a reloaded bundle's `useDashboardPad`\n // replays the pad definition FROZEN at generation time, while the\n // document already holds the user's later edits. Outside a turn,\n // same id, cards present → no-op.\n if (!isTurnOpen && current?.id && incomingId && current.id === incomingId && (current.cards?.length ?? 0) > 0) {\n return;\n }\n\n const resolved: ComposerDashboard = isSimplePadDefinition(dashboard) ? padConfigToDashboard(dashboard) : { ...dashboard };\n resolved.originalSessionId = sessionId;\n\n const merged: ComposerDashboard = {\n ...current,\n ...resolved,\n id: incomingId ?? current?.id,\n originalSessionId: resolved.originalSessionId,\n jsFileName: resolved.jsFileName ?? current?.jsFileName,\n name: resolved.name || current?.name || '',\n layoutType: 'Naked',\n };\n\n get().updateDashboard(merged);\n set((s) => ({ viewType: 'Sketch', llmCounter: s.llmCounter + 1, agentPulseTick: s.agentPulseTick + 1 }));\n };\n\n return {\n dashboardDefinition: null,\n publishedDashboard: null,\n lastSentDashboard: null,\n dashboardId: null,\n viewType: 'Sketch',\n scriptLoadOnMount: false,\n renderGeneration: 0,\n turnOpen: false,\n currentSessionId: null,\n llmCounter: 0,\n agentPulseTick: 0,\n todosByCardKey: {},\n\n sketchExpanded: false,\n hasCompletedOnce: false,\n producedDashboardId: null,\n viewport: { width: 0, height: 0 },\n\n guideSteps: null,\n guideOptions: null,\n\n _client: options.client ?? null,\n _draftSaveTimer: null,\n _draftSavePromise: null,\n _viewerCommitTimer: null,\n _guideShowTimer: null,\n\n setClient: (client) => set({ _client: client }),\n\n flushDraft: async () => {\n const timer = get()._draftSaveTimer;\n if (timer) {\n clearTimeout(timer);\n set({ _draftSaveTimer: null });\n }\n const inflight = get()._draftSavePromise;\n if (inflight) await inflight;\n await _saveDraft();\n },\n\n ingestToolEvent: (eventName, eventData) => {\n if (eventName === 'dashboardGenerated') {\n const current = get().dashboardDefinition;\n const dashboardDefinition: ComposerDashboard = {\n ...current,\n name: current?.name || 'Untitled',\n jsFileName: eventData,\n };\n _cancelViewerCommit();\n set((s) => ({\n dashboardDefinition,\n publishedDashboard: dashboardDefinition,\n lastSentDashboard: dashboardDefinition,\n viewType: 'Generated',\n scriptLoadOnMount: false,\n renderGeneration: s.renderGeneration + 1,\n llmCounter: s.llmCounter + 1,\n agentPulseTick: s.agentPulseTick + 1,\n }));\n _scheduleDraftSave();\n return;\n }\n\n if (eventName === 'todolistUpdated') {\n try {\n const todoList: TodoList = JSON.parse(eventData);\n set((s) => {\n const next = { ...s.todosByCardKey };\n let changed = false;\n for (const item of todoList.items ?? []) {\n next[item.key] = { todo: item, turnOpen: s.turnOpen };\n changed = true;\n }\n return changed ? { todosByCardKey: next } : {};\n });\n } catch {\n console.warn('[@aintela/bi composer] Failed to parse todolistUpdated:', eventData);\n }\n }\n },\n\n setTurnOpen: (open) => set({ turnOpen: open }),\n onTurnOpened: () => set({ turnOpen: true, viewType: 'Sketch' }),\n onTurnClosed: () => {\n set({ turnOpen: false, todosByCardKey: {} });\n _scheduleDraftSave();\n },\n\n setDashboardId: (id) => set({ dashboardId: id }),\n setCurrentSessionId: (sessionId) => set({ currentSessionId: sessionId }),\n setViewType: (v) => set({ viewType: v }),\n\n updateDashboard: (fields) => {\n if (!fields) {\n _cancelViewerCommit();\n set({ dashboardDefinition: null, publishedDashboard: null, lastSentDashboard: null });\n return;\n }\n\n const current = get().dashboardDefinition ?? { name: '' };\n const newDefinition: ComposerDashboard = { ...current, ...fields };\n\n // First population is the implicit baseline for both snapshots.\n const isFirstPopulation = !get().publishedDashboard && !get().lastSentDashboard;\n set({\n dashboardDefinition: newDefinition,\n ...(isFirstPopulation ? { publishedDashboard: newDefinition, lastSentDashboard: newDefinition } : {}),\n });\n\n if (!isFirstPopulation) _scheduleViewerCommit();\n _scheduleDraftSave();\n },\n\n loadDashboard: (dashboard) => {\n const hasScript = !!dashboard.jsFileName;\n const snapshot = { ...dashboard };\n _cancelViewerCommit();\n set({\n dashboardDefinition: snapshot,\n publishedDashboard: snapshot,\n lastSentDashboard: snapshot,\n dashboardId: dashboard.id ?? null,\n currentSessionId: dashboard.originalSessionId ?? null,\n viewType: hasScript ? 'Generated' : 'Sketch',\n scriptLoadOnMount: hasScript,\n renderGeneration: get().renderGeneration + 1,\n });\n },\n\n recordSketchChange: (key, text) => {\n const trimmedKey = key.trim();\n const trimmedText = text.trim();\n if (!trimmedKey || !trimmedText) return;\n set((s) => {\n const def = s.dashboardDefinition;\n if (!def) return {};\n const prev = def.clientSideChanges ?? {};\n if (prev[trimmedKey] === trimmedText) return {};\n return { dashboardDefinition: { ...def, clientSideChanges: { ...prev, [trimmedKey]: trimmedText } } };\n });\n },\n\n clearClientSideChanges: () => {\n set((s) => {\n const def = s.dashboardDefinition;\n const existing = def?.clientSideChanges;\n if (!def || !existing || Object.keys(existing).length === 0) return {};\n return { dashboardDefinition: { ...def, clientSideChanges: undefined } };\n });\n },\n\n commitForSend: () => {\n _cancelViewerCommit();\n const live = get().dashboardDefinition;\n set({ publishedDashboard: live, lastSentDashboard: live });\n },\n\n commitDashboardLayout: () => {\n _cancelViewerCommit();\n set({ publishedDashboard: get().dashboardDefinition });\n },\n\n setSketchExpanded: (next) => set((s) => ({ sketchExpanded: typeof next === 'function' ? next(s.sketchExpanded) : next })),\n setHasCompletedOnce: (next) => set({ hasCompletedOnce: next }),\n setProducedDashboardId: (id) => set({ producedDashboardId: id }),\n setViewport: (viewport) => set((s) => (s.viewport.width === viewport.width && s.viewport.height === viewport.height ? {} : { viewport })),\n\n highlightComponent: (target, opts) => {\n const durationMs = opts?.durationMs ?? DEFAULT_HIGHLIGHT_MS;\n const { elements } = resolveEnvironmentElements(target);\n if (elements.length === 0) return 0;\n\n elements.forEach((element, index) => {\n element.classList.add(ENV_HIGHLIGHT_CLASS);\n setTimeout(() => element.classList.remove(ENV_HIGHLIGHT_CLASS), durationMs);\n if (index === 0 && opts?.scrollIntoView && typeof element.scrollIntoView === 'function') {\n element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });\n }\n });\n return elements.length;\n },\n\n cloneComponent: (target, opts) => {\n const { selectors, elements } = resolveEnvironmentElements(target);\n const source = pickBestElement(elements, opts?.includeHidden ?? false);\n if (!source) return null;\n\n const rect = source.getBoundingClientRect();\n const entry: EnvironmentCloneEntry = {\n id: randomId(),\n sourceSelector: selectors.join(',') || (typeof target === 'string' ? target : target.identifier ?? ''),\n source: target,\n html: source.outerHTML\n .replaceAll('data-env-id', 'd-env-id')\n .replaceAll('data-env-key', 'd-env-key')\n .replaceAll('data-env-name', 'd-env-name')\n .replaceAll('llm-env-target', '')\n .replaceAll('llm-env-dashboard-action', ''),\n width: Math.max(1, Math.round(rect.width)),\n height: Math.max(1, Math.round(rect.height)),\n createdAt: Date.now(),\n };\n\n const response: CloneComponentResult = {\n cloneId: entry.id,\n width: entry.width,\n height: entry.height,\n sourceSelector: entry.sourceSelector,\n html: entry.html,\n source,\n };\n response.component = <ClonedComponent entry={response} onHover={(t) => get().highlightComponent(t)} />;\n return response;\n },\n\n createDashboardPad: (dashboard) => {\n void internalUpdateDashboardPad(dashboard);\n },\n updateDashboardPad: (dashboard) => {\n void internalUpdateDashboardPad(dashboard);\n },\n\n showGuide: (steps, guideOptions) => {\n if (!Array.isArray(steps) || steps.length === 0) {\n console.warn('[@aintela/bi composer] showGuide called with empty or non-array `steps`; tour will not be shown.', { steps, guideOptions });\n return;\n }\n const invalid = steps.findIndex((s) => !s || s.target === undefined || s.target === null);\n if (invalid >= 0) {\n console.warn(`[@aintela/bi composer] showGuide: step ${invalid} is missing \\`target\\`; tour will not be shown.`, { steps });\n return;\n }\n const prev = get()._guideShowTimer;\n if (prev) clearTimeout(prev);\n const timer = setTimeout(() => {\n set({ guideSteps: steps, guideOptions: guideOptions ?? null, _guideShowTimer: null });\n }, GUIDE_SHOW_DELAY_MS);\n set({ _guideShowTimer: timer });\n },\n\n dismissGuide: () => {\n const prev = get()._guideShowTimer;\n if (prev) clearTimeout(prev);\n const opts = get().guideOptions;\n set({ guideSteps: null, guideOptions: null, _guideShowTimer: null });\n opts?.onComplete?.();\n },\n\n refreshDashboard: () => {\n const current = get().dashboardDefinition;\n if (!current?.id) return;\n const dashboardDefinition: ComposerDashboard = {\n ...current,\n name: current.name || 'Untitled',\n jsFileName: current.jsFileName ?? `${current.id}.js`,\n };\n _cancelViewerCommit();\n set((s) => ({\n dashboardDefinition,\n publishedDashboard: dashboardDefinition,\n lastSentDashboard: dashboardDefinition,\n viewType: 'Generated',\n scriptLoadOnMount: false,\n renderGeneration: s.renderGeneration + 1,\n llmCounter: s.llmCounter + 1,\n }));\n },\n\n openComposer: (dashboard) => {\n _cancelViewerCommit();\n if (dashboard) {\n const hasScript = !!dashboard.jsFileName;\n const snapshot = { ...dashboard };\n set({\n dashboardDefinition: snapshot,\n publishedDashboard: snapshot,\n lastSentDashboard: snapshot,\n dashboardId: dashboard.id ?? null,\n currentSessionId: dashboard.originalSessionId ?? null,\n viewType: hasScript ? 'Generated' : 'Sketch',\n scriptLoadOnMount: hasScript,\n renderGeneration: get().renderGeneration + 1,\n turnOpen: false,\n todosByCardKey: {},\n });\n } else {\n set({\n dashboardDefinition: null,\n publishedDashboard: null,\n lastSentDashboard: null,\n dashboardId: null,\n currentSessionId: null,\n viewType: 'Sketch',\n scriptLoadOnMount: false,\n renderGeneration: get().renderGeneration + 1,\n turnOpen: false,\n todosByCardKey: {},\n });\n }\n },\n };\n });\n}\n","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { useStore } from 'zustand';\nimport { useShallow } from 'zustand/react/shallow';\nimport { useBiClientOptional, type BiClient } from '../../client';\nimport type { DashboardEnvironment } from '../environment/types';\nimport { createComposerStore, type ComposerState, type ComposerStoreApi, type CreateComposerStoreOptions } from './createComposerStore';\n\nconst ComposerStoreContext = createContext<ComposerStoreApi | null>(null);\n\nexport interface ComposerProviderProps extends Omit<CreateComposerStoreOptions, 'client'> {\n /** Autosave client. Defaults to the ambient `BiClientProvider`; `null` disables autosave. */\n client?: BiClient | null;\n /** Bring your own store (tests, or sharing one composer across two mount points). */\n store?: ComposerStoreApi;\n children: React.ReactNode;\n}\n\n/**\n * Owns one composer store. Everything under it — `ComposerView`,\n * `DashboardPad`, `useComposer()`, `useComposerEnvironment()` — reads that\n * store; a second `ComposerProvider` elsewhere on the page is fully independent.\n */\nexport const ComposerProvider: React.FC<ComposerProviderProps> = ({ client, store, children, ...options }) => {\n const ambient = useBiClientOptional();\n const resolvedClient = client === undefined ? ambient : client;\n const [api] = useState<ComposerStoreApi>(() => store ?? createComposerStore({ ...options, client: resolvedClient }));\n\n useEffect(() => {\n if (api.getState()._client !== resolvedClient) api.getState().setClient(resolvedClient);\n }, [api, resolvedClient]);\n\n return <ComposerStoreContext.Provider value={api}>{children}</ComposerStoreContext.Provider>;\n};\n\n/** The store API (`getState()` / `setState()` / `subscribe()`) — for handlers that must read the latest state without subscribing. */\nexport function useComposerStore(): ComposerStoreApi {\n const api = useContext(ComposerStoreContext);\n if (!api) {\n throw new Error('[@aintela/bi] No composer store in scope. Wrap the composer surface in <ComposerProvider>.');\n }\n return api;\n}\n\n/** Same as {@link useComposerStore} but `null` instead of throwing. */\nexport function useComposerStoreOptional(): ComposerStoreApi | null {\n return useContext(ComposerStoreContext);\n}\n\n/**\n * Subscribe to the ambient composer store. Select a primitive whenever you\n * can: the live definition is re-allocated on every agent partial.\n */\nexport function useComposer(): ComposerState;\nexport function useComposer<T>(selector: (state: ComposerState) => T): T;\nexport function useComposer<T>(selector?: (state: ComposerState) => T): T | ComposerState {\n const api = useComposerStore();\n return useStore(api, selector ?? ((s: ComposerState) => s as unknown as T));\n}\n\n/**\n * The `DashboardEnvironment` bound to this composer — pass it to the chat\n * library's `EnvironmentProvider` and to `createBiUiTools({ environment })`.\n * Shallow-stable: the actions are store methods, so the object only changes\n * when the store does.\n */\nexport function useComposerEnvironment(): DashboardEnvironment {\n const api = useComposerStore();\n return useStore(\n api,\n useShallow((s) => ({\n highlightComponent: s.highlightComponent,\n cloneComponent: s.cloneComponent,\n createDashboardPad: s.createDashboardPad,\n updateDashboardPad: s.updateDashboardPad,\n refreshDashboard: s.refreshDashboard,\n showGuide: s.showGuide,\n dismissGuide: s.dismissGuide,\n })),\n );\n}\n\n/** Build the environment object from a store outside React (tests, the bridge). */\nexport function environmentFromStore(api: ComposerStoreApi): DashboardEnvironment {\n const s = api.getState();\n return {\n highlightComponent: s.highlightComponent,\n cloneComponent: s.cloneComponent,\n createDashboardPad: s.createDashboardPad,\n updateDashboardPad: s.updateDashboardPad,\n refreshDashboard: s.refreshDashboard,\n showGuide: s.showGuide,\n dismissGuide: s.dismissGuide,\n };\n}\n","import React, { createContext, useContext, useMemo } from 'react';\nimport {\n TagOutlined,\n TableChartOutlined,\n BarChartOutlined,\n ShowChartOutlined,\n PieChartOutlined,\n DonutLargeOutlined,\n AreaChartOutlined,\n MapOutlined,\n GridViewOutlined,\n SpeedOutlined,\n DashboardOutlined,\n BubbleChartOutlined,\n TimelineOutlined,\n ViewColumnOutlined,\n AlignHorizontalLeftOutlined,\n HeatPumpOutlined,\n StackedLineChartOutlined,\n StackedBarChartOutlined,\n MultilineChartOutlined,\n ScatterPlotOutlined,\n TableRowsOutlined,\n DateRangeOutlined,\n CalendarTodayOutlined,\n ManageSearchOutlined,\n} from '@mui/icons-material';\nimport type SvgIcon from '@mui/material/SvgIcon';\nimport type { CardCategory, CardSpecificType, FilterType } from '../models/sketchModels';\n\nexport type SvgIconComponent = typeof SvgIcon;\n\nexport const CATEGORY_ICONS: Record<CardCategory, SvgIconComponent> = {\n Generic: DashboardOutlined,\n Métrica: TagOutlined,\n Tabela: TableChartOutlined,\n Gráfico: BarChartOutlined,\n Mapa: MapOutlined,\n Árvore: GridViewOutlined,\n Medidor: SpeedOutlined,\n};\n\n/** Legacy `SketchCardItem.color` token per category (a name, not a colour). */\nexport const COLOR_MAP: Record<CardCategory, string> = {\n Generic: 'info',\n Métrica: 'kpi',\n Tabela: 'table',\n Gráfico: 'chart',\n Mapa: 'map',\n Árvore: 'chart',\n Medidor: 'chart',\n};\n\nexport const SPECIFIC_TYPE_ICONS: Record<CardSpecificType, SvgIconComponent> = {\n Generic: DashboardOutlined,\n MetricComparison: TagOutlined,\n TableAuto: TableChartOutlined,\n TableBars: ViewColumnOutlined,\n TableHeatmap: HeatPumpOutlined,\n TableLarge: TableRowsOutlined,\n ChartAuto: BarChartOutlined,\n ChartLine: ShowChartOutlined,\n ChartBarH: AlignHorizontalLeftOutlined,\n ChartBarV: BarChartOutlined,\n ChartArea: AreaChartOutlined,\n ChartStackedArea: StackedLineChartOutlined,\n ChartStackedBar: StackedBarChartOutlined,\n ChartCombo: MultilineChartOutlined,\n ChartPie: PieChartOutlined,\n Scatter: ScatterPlotOutlined,\n ChartDonut: DonutLargeOutlined,\n MapBubbles: BubbleChartOutlined,\n MapConnections: TimelineOutlined,\n Treemap: GridViewOutlined,\n Gauge: SpeedOutlined,\n};\n\n/** `@mui/icons-material` export name per type — what `SketchCardItem.muiIconName` stores. */\nexport const SPECIFIC_TYPE_ICON_NAMES: Record<CardSpecificType, string> = {\n Generic: 'DashboardOutlined',\n MetricComparison: 'TagOutlined',\n TableAuto: 'TableChartOutlined',\n TableBars: 'ViewColumnOutlined',\n TableHeatmap: 'HeatPumpOutlined',\n TableLarge: 'TableRowsOutlined',\n ChartAuto: 'BarChartOutlined',\n ChartLine: 'ShowChartOutlined',\n ChartBarH: 'AlignHorizontalLeftOutlined',\n ChartBarV: 'BarChartOutlined',\n ChartArea: 'AreaChartOutlined',\n ChartStackedArea: 'StackedLineChartOutlined',\n ChartStackedBar: 'StackedBarChartOutlined',\n ChartCombo: 'MultilineChartOutlined',\n ChartPie: 'PieChartOutlined',\n Scatter: 'ScatterPlotOutlined',\n ChartDonut: 'DonutLargeOutlined',\n MapBubbles: 'BubbleChartOutlined',\n MapConnections: 'TimelineOutlined',\n Treemap: 'GridViewOutlined',\n Gauge: 'SpeedOutlined',\n};\n\nexport const FILTER_TYPE_ICONS: Record<FilterType, SvgIconComponent> = {\n DateRangePicker: DateRangeOutlined,\n DatePicker: CalendarTodayOutlined,\n AutoComplete: ManageSearchOutlined,\n};\n\n/** The three icon maps the pad draws with. */\nexport interface CardTypeIconSet {\n category: Record<CardCategory, SvgIconComponent>;\n specificType: Record<CardSpecificType, SvgIconComponent>;\n filterType: Record<FilterType, SvgIconComponent>;\n}\n\nexport const defaultCardTypeIcons: CardTypeIconSet = {\n category: CATEGORY_ICONS,\n specificType: SPECIFIC_TYPE_ICONS,\n filterType: FILTER_TYPE_ICONS,\n};\n\nconst CardTypeIconsContext = createContext<CardTypeIconSet>(defaultCardTypeIcons);\n\nexport interface CardTypeIconsProviderProps {\n /** Any subset; unspecified entries keep the MUI defaults. */\n icons: {\n category?: Partial<Record<CardCategory, SvgIconComponent>>;\n specificType?: Partial<Record<CardSpecificType, SvgIconComponent>>;\n filterType?: Partial<Record<FilterType, SvgIconComponent>>;\n };\n children: React.ReactNode;\n}\n\n/** Lets a host swap the pad's icons (its own set, or a different MUI style) without forking the pad. */\nexport const CardTypeIconsProvider: React.FC<CardTypeIconsProviderProps> = ({ icons, children }) => {\n const parent = useContext(CardTypeIconsContext);\n const value = useMemo<CardTypeIconSet>(\n () => ({\n category: { ...parent.category, ...(icons.category ?? {}) },\n specificType: { ...parent.specificType, ...(icons.specificType ?? {}) },\n filterType: { ...parent.filterType, ...(icons.filterType ?? {}) },\n }),\n [parent, icons],\n );\n return <CardTypeIconsContext.Provider value={value}>{children}</CardTypeIconsContext.Provider>;\n};\n\n/** The icon set in scope (MUI defaults when no provider is mounted). */\nexport function useCardTypeIcons(): CardTypeIconSet {\n return useContext(CardTypeIconsContext);\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CheckCircle, DeleteOutline, Pending } from '@mui/icons-material';\nimport {\n Box,\n CircularProgress,\n ClickAwayListener,\n Divider,\n Grow,\n IconButton,\n ListItemIcon,\n ListItemText,\n MenuItem,\n MenuList,\n Paper,\n Popper,\n Stack,\n TextField,\n Typography,\n} from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport type { TodoItem } from '@aintela/chat/models';\nimport type { CardCategory, CardSpecificType, SketchCardItem } from '../models/sketchModels';\nimport { CARD_TYPE_CATALOG, groupCardCatalog } from '../models/catalog';\nimport { CATEGORY_PREFIXES } from '../../viewer/cardMetadata';\nimport { COLOR_MAP, SPECIFIC_TYPE_ICON_NAMES, useCardTypeIcons } from '../icons/cardTypeIcons';\nimport { sanitizeToJsVariable } from '../models/utils';\n\nexport interface CardSketchProps {\n cellConfig: SketchCardItem;\n todoItem?: TodoItem;\n turnOpen?: boolean;\n onDelete?: (cardKey: string) => void;\n onDataEdit: (data: SketchCardItem) => void;\n /**\n * Draws the description when not editing. Default: plain text with line\n * breaks preserved. The legacy pad rendered Markdown — pass\n * `(text) => <Markdown>{text}</Markdown>` to keep that.\n */\n renderDescription?: (text: string) => React.ReactNode;\n}\n\nconst MAX_NAME_LENGTH = 60;\nconst groupedCatalog = groupCardCatalog(CARD_TYPE_CATALOG);\n\nfunction useElementHeight(ref: React.RefObject<HTMLElement | null>): number {\n const [height, setHeight] = useState(0);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const measure = () => setHeight(el.getBoundingClientRect().height);\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref]);\n return height;\n}\n\n/**\n * One card on the sketch: type icon (opens the type picker), click-to-edit\n * name and description, delete, and — while a turn is open — the agent's\n * todo status overlaid on the card.\n */\nexport const CardSketch: React.FC<CardSketchProps> = (props) => {\n const icons = useCardTypeIcons();\n const [name, setName] = useState(props.cellConfig.name ?? '[Card Name]');\n const [description, setDescription] = useState(props.cellConfig.actionDescription ?? '[Card Description]');\n const [editingName, setEditingName] = useState(false);\n const [localCellData, setLocalCellData] = useState<SketchCardItem>(props.cellConfig);\n const [editingDescription, setEditingDescription] = useState(false);\n const [typeMenuOpen, setTypeMenuOpen] = useState(false);\n const textFieldRef = useRef<HTMLInputElement>(null);\n const typeIconRef = useRef<HTMLButtonElement>(null);\n const descriptionBoxRef = useRef<HTMLDivElement>(null);\n const descHeight = useElementHeight(descriptionBoxRef);\n\n const currentType = props.cellConfig.specificType ?? 'Generic';\n const currentCategory = props.cellConfig.category ?? 'Generic';\n const TypeIcon = icons.specificType[currentType] ?? icons.specificType.Generic;\n\n useEffect(() => {\n setLocalCellData(props.cellConfig);\n }, [props.cellConfig]);\n\n useEffect(() => {\n const t = setTimeout(() => {\n if (!textFieldRef.current) return;\n let inputField: HTMLInputElement | HTMLTextAreaElement | null = textFieldRef.current.getElementsByTagName('input').item(0);\n if (!inputField) inputField = textFieldRef.current.getElementsByTagName('textarea').item(0);\n if (!inputField) return;\n inputField.focus();\n inputField.selectionStart = 0;\n inputField.selectionEnd = inputField.value.length;\n }, 50);\n return () => clearTimeout(t);\n }, [editingName, editingDescription]);\n\n const handleKeyPress = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if ((!event.shiftKey && event.key === 'Enter') || event.key === 'Escape') {\n setEditingDescription(false);\n setEditingName(false);\n props.onDataEdit(localCellData);\n }\n };\n\n const handleChange = (\n setter: React.Dispatch<React.SetStateAction<string>>,\n sender: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n const value = sender.target.value;\n if (setter === setName && sanitizeToJsVariable(value).length > MAX_NAME_LENGTH) return;\n\n setter(value);\n const newData = { ...props.cellConfig };\n if (setter === setName) newData.name = value;\n else newData.actionDescription = value;\n setLocalCellData(newData);\n };\n\n const handleTypeChange = (category: CardCategory, specificType: CardSpecificType) => {\n setTypeMenuOpen(false);\n const newData: SketchCardItem = { ...props.cellConfig, category, specificType };\n newData.muiIconName = SPECIFIC_TYPE_ICON_NAMES[specificType];\n newData.color = COLOR_MAP[category];\n const prefix = CATEGORY_PREFIXES[category];\n if (!newData.name || newData.name.startsWith('[Card') || Object.values(CATEGORY_PREFIXES).some((p) => newData.name?.match(new RegExp(`^${p}\\\\d+$`)))) {\n newData.name = prefix;\n setName(prefix);\n }\n props.onDataEdit(newData);\n };\n\n const todoStatus = props.todoItem?.status;\n const stop = { onMouseDown: (e: React.SyntheticEvent) => e.stopPropagation(), onTouchStart: (e: React.SyntheticEvent) => e.stopPropagation() };\n const renderDescription = props.renderDescription ?? ((text: string) => <span style={{ whiteSpace: 'pre-wrap' }}>{text}</span>);\n\n return (\n <Box\n className=\"llm-env-target llm-env-card llm-env-card-sketch\"\n data-env-id={props.cellConfig.i}\n data-env-key={props.cellConfig.i}\n data-env-name={props.cellConfig.name ?? ''}\n data-env-kind=\"sketch-card\"\n sx={{ height: '100%', position: 'relative', overflow: 'hidden' }}\n >\n {/* Type watermark — a large, faint silhouette of the card's type. */}\n {!(props.todoItem && props.turnOpen) && (\n <Box\n aria-hidden\n sx={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n color: 'text.primary',\n opacity: 0.06,\n zIndex: 0,\n '& > svg': { width: '70%', height: '70%', maxWidth: '180px', maxHeight: '180px' },\n }}\n >\n <TypeIcon />\n </Box>\n )}\n <Box sx={{ position: 'absolute', top: '15px', right: '-5px', display: 'flex', gap: 0, zIndex: 2 }}>\n <Stack {...stop}>\n <IconButton size=\"small\" onClick={() => props.onDelete?.(props.cellConfig.i)} aria-label=\"Remover card\">\n <DeleteOutline fontSize=\"small\" />\n </IconButton>\n </Stack>\n </Box>\n {props.todoItem && props.turnOpen && (\n <Box\n sx={(theme) => ({\n position: 'absolute',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 'calc(100% + 11px)',\n minWidth: 'calc(100% + 10px)',\n top: -6,\n left: -7,\n gap: 2,\n py: 0.4,\n borderRadius: '10px',\n backgroundColor: alpha(theme.palette.common.black, 0.4),\n opacity: todoStatus == 'completed' ? 0.6 : 1,\n })}\n >\n <Box sx={{ mt: '1px', flexShrink: 0, color: todoStatus == 'completed' ? 'success.main' : todoStatus === 'in_progress' ? 'primary.main' : 'text.disabled' }}>\n {todoStatus == 'completed'\n ? <CheckCircle sx={{ fontSize: '0.95rem' }} />\n : todoStatus === 'in_progress'\n ? <Pending sx={{ fontSize: '0.95rem' }} />\n : <CircularProgress size={20} sx={{ fontSize: '0.95rem' }} />}\n </Box>\n <Box sx={{ textAlign: 'left' }}>\n <Typography variant=\"caption\" sx={{ display: 'block', fontSize: '0.78rem', lineHeight: 1.3, textDecoration: todoStatus === 'completed' ? 'line-through' : 'none' }}>\n {props.todoItem.label}\n </Typography>\n {props.todoItem.detail && (\n <Typography variant=\"caption\" sx={{ display: 'block', fontSize: '0.7rem', color: 'text.secondary', lineHeight: 1.3 }}>\n {props.todoItem.detail}\n </Typography>\n )}\n </Box>\n </Box>\n )}\n\n <Popper open={typeMenuOpen} anchorEl={typeIconRef.current} placement=\"bottom-start\" transition sx={{ zIndex: 1300 }}>\n {({ TransitionProps }) => (\n <Grow {...TransitionProps}>\n <Paper elevation={8} sx={{ maxHeight: 380, overflow: 'auto', minWidth: 240 }}>\n <ClickAwayListener onClickAway={() => setTypeMenuOpen(false)}>\n <MenuList dense>\n {Object.entries(groupedCatalog).map(([category, items], gi) => {\n const CatIcon = icons.category[category as CardCategory];\n return (\n <Box key={category}>\n {gi > 0 && <Divider />}\n <Typography variant=\"overline\" sx={{ px: 2, pt: 1, display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CatIcon fontSize=\"inherit\" />\n {category}\n </Typography>\n {items.map((item) => {\n const Icon = icons.specificType[item.specificType];\n return (\n <MenuItem key={item.specificType} selected={item.specificType === currentType} onClick={() => handleTypeChange(item.category, item.specificType)}>\n <ListItemIcon>\n <Icon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{item.label}</ListItemText>\n </MenuItem>\n );\n })}\n </Box>\n );\n })}\n </MenuList>\n </ClickAwayListener>\n </Paper>\n </Grow>\n )}\n </Popper>\n\n <Box sx={{ minHeight: '20%', textAlign: 'left', position: 'relative', zIndex: 1 }}>\n <Stack direction=\"row\">\n <IconButton\n {...stop}\n ref={typeIconRef}\n size=\"small\"\n onClick={() => setTypeMenuOpen((prev) => !prev)}\n title={`Tipo: ${currentCategory} / ${currentType}`}\n sx={{ color: 'primary.main', mr: 0 }}\n >\n <TypeIcon fontSize=\"small\" />\n </IconButton>\n {!editingName && (\n <Box\n {...stop}\n onClick={() => {\n setEditingName(true);\n setEditingDescription(false);\n }}\n sx={{ color: 'text.primary', minWidth: '50%', maxWidth: '80%', maxHeight: '30px', cursor: 'pointer', display: 'inline-flex', alignItems: 'center', gap: 0.5, overflow: 'clip', textWrap: 'nowrap' }}\n >\n {name}\n </Box>\n )}\n {editingName && (\n <TextField\n size=\"small\"\n ref={textFieldRef}\n {...stop}\n onChange={(sender) => handleChange(setName, sender)}\n onBlur={(sender) => handleChange(setName, sender)}\n onKeyDown={handleKeyPress}\n value={name}\n sx={(theme) => ({\n fontSize: '0.75rem',\n width: '82%',\n '& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline': { border: '0px' },\n '& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline': { border: '0px', pl: 3, p: 0, backgroundColor: alpha(theme.palette.text.primary, 0.08) },\n })}\n slotProps={{\n root: { style: { padding: '2px 0px 0px 0px', border: '0px' } },\n input: { style: { padding: '2px 0px 0px 0px', border: '0px' } },\n }}\n />\n )}\n </Stack>\n </Box>\n <Box ref={descriptionBoxRef} sx={{ textAlign: 'left', position: 'relative', zIndex: 1, minHeight: '80%' }} {...stop}>\n {!editingDescription && (\n <Box\n {...stop}\n onClick={() => {\n setEditingDescription(true);\n setEditingName(false);\n }}\n sx={{ fontSize: '0.85rem', cursor: 'pointer', color: 'text.primary', width: '100%', minHeight: '30%', pb: '20px' }}\n >\n {renderDescription(description)}\n </Box>\n )}\n {editingDescription && (\n <TextField\n slotProps={{\n root: { style: { padding: '0px', border: '0px' } },\n input: { style: { padding: '0px 0px 5px 0px', border: '0px', height: Math.max(0, descHeight - 2.5), alignContent: 'start', flexWrap: 'wrap', fontSize: '0.8rem' } },\n }}\n multiline\n ref={textFieldRef}\n sx={(theme) => ({\n minHeight: '100%',\n alignContent: 'start',\n width: '92%',\n '& .MuiOutlinedInput-root:hover .MuiOutlinedInput-notchedOutline': { border: '0px' },\n '& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline': { border: '0px', backgroundColor: alpha(theme.palette.text.primary, 0.08) },\n })}\n onChange={(sender) => {\n sender.stopPropagation();\n handleChange(setDescription, sender);\n }}\n onBlur={(sender) => handleChange(setDescription, sender)}\n onKeyDown={handleKeyPress}\n value={description}\n />\n )}\n </Box>\n </Box>\n );\n};\n\n/** @deprecated legacy spelling — use {@link CardSketch}. */\nexport const CardScketch = CardSketch;\n\nexport default CardSketch;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, IconButton, Switch, TextField, Tooltip, Typography } from '@mui/material';\nimport { DeleteOutline } from '@mui/icons-material';\nimport type { SketchedFilter } from '../models/sketchModels';\nimport { useCardTypeIcons } from '../icons/cardTypeIcons';\n\nexport interface FilterSketchProps {\n filter: SketchedFilter;\n onEdit: (filter: SketchedFilter) => void;\n onDelete: (filterId: string) => void;\n}\n\n/** One sketched filter chip: icon, click-to-rename, mandatory / multi-select toggle, delete. */\nexport const FilterSketch: React.FC<FilterSketchProps> = ({ filter, onEdit, onDelete }) => {\n const [editingName, setEditingName] = useState(false);\n const [name, setName] = useState(filter.name);\n const inputRef = useRef<HTMLInputElement>(null);\n const Icon = useCardTypeIcons().filterType[filter.filterType];\n\n useEffect(() => {\n if (editingName && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [editingName]);\n\n useEffect(() => {\n setName(filter.name);\n }, [filter.name]);\n\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed && trimmed !== filter.name) onEdit({ ...filter, name: trimmed });\n else setName(filter.name);\n setEditingName(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') commitName();\n if (e.key === 'Escape') {\n setName(filter.name);\n setEditingName(false);\n }\n };\n\n return (\n <Box\n className=\"llm-env-target llm-env-filter llm-env-filter-sketch\"\n data-env-id={filter.i}\n data-env-key={filter.i}\n data-env-name={filter.name}\n data-env-kind=\"sketch-filter\"\n sx={(theme) => ({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n flexWrap: 'wrap',\n border: `1px dashed ${theme.palette.divider}`,\n borderRadius: '10px',\n maxHeight: '90%',\n px: 1,\n py: 0.5,\n backgroundColor: theme.palette.background.default,\n maxWidth: 260,\n })}\n >\n <Icon sx={{ fontSize: 16, color: 'primary.main', flexShrink: 0 }} />\n\n {editingName ? (\n <TextField\n inputRef={inputRef}\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={handleKeyDown}\n variant=\"standard\"\n size=\"small\"\n slotProps={{\n input: { disableUnderline: true, sx: { fontSize: '0.75rem', pl: 1, height: 20 } },\n root: { style: { width: '80%' } },\n }}\n />\n ) : (\n <Typography\n variant=\"caption\"\n noWrap\n onClick={() => setEditingName(true)}\n sx={{\n cursor: 'pointer',\n fontSize: '0.75rem',\n color: 'text.primary',\n pl: 1,\n width: '80%',\n minWidth: '90px',\n '&:hover': { textDecoration: 'underline' },\n }}\n >\n {filter.name}\n </Typography>\n )}\n\n {filter.filterType !== 'AutoComplete' && (\n <Tooltip title={filter.mandatory ? 'Mandatory filter' : 'Optional filter'} arrow>\n <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0 }}>\n <Typography variant=\"caption\" sx={{ fontSize: '0.6rem', color: 'text.secondary', minWidth: '55px', whiteSpace: 'nowrap' }}>\n {filter.mandatory ? 'Obrigatório' : 'Opcional'}\n </Typography>\n <Switch\n size=\"small\"\n checked={filter.mandatory}\n onChange={(_, checked) => onEdit({ ...filter, mandatory: checked })}\n sx={{ transform: 'scale(0.7)', ml: -0.5, mr: -1 }}\n />\n </Box>\n </Tooltip>\n )}\n\n {filter.filterType === 'AutoComplete' && (\n <Tooltip title={filter.multipleSelection ? 'Multiple selection' : 'Single selection'} arrow>\n <Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 0 }}>\n <Typography variant=\"caption\" sx={{ fontSize: '0.6rem', color: 'text.secondary', whiteSpace: 'wrap', minWidth: '43px' }}>\n {filter.multipleSelection ? 'Multiple' : 'Single'}\n </Typography>\n <Switch\n size=\"small\"\n checked={filter.multipleSelection ?? false}\n onChange={(_, checked) => onEdit({ ...filter, multipleSelection: checked })}\n sx={{ transform: 'scale(0.7)', ml: -0.5, mr: -1 }}\n />\n </Box>\n </Tooltip>\n )}\n\n <IconButton size=\"small\" onClick={() => onDelete(filter.i)} sx={{ p: 0.2, ml: 'auto' }} aria-label=\"Remover filtro\">\n <DeleteOutline sx={{ fontSize: 14 }} />\n </IconButton>\n </Box>\n );\n};\n\nexport default FilterSketch;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, TextField } from '@mui/material';\n\nexport interface TitleSketchProps {\n onEdit: (text: string) => void;\n multiline?: boolean;\n text: string;\n placeHolderText: string;\n /** Font size of the label / input (px). The V1 pad used 14.4 (0.9rem), the V2 rail 12. */\n fontSize?: number;\n}\n\n/**\n * Click-to-edit text (the dashboard name, the notes). Enter commits, Escape\n * reverts, blur commits. Was `TitleSkath.tsx` / `TitleSkathV2.tsx`.\n */\nexport const TitleSketch: React.FC<TitleSketchProps> = (props) => {\n const [editingText, setEditingText] = useState(false);\n const [text, setText] = useState<string | undefined>(props.text);\n const inputRef = useRef<HTMLInputElement>(null);\n const fontSize = props.fontSize ?? 12;\n\n useEffect(() => {\n if (editingText && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n setText(props.text);\n }, [editingText, props.text]);\n\n const commit = () => {\n const trimmed = text?.trim() ?? '';\n if (trimmed !== props.text) props.onEdit(trimmed);\n setText(trimmed);\n setEditingText(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !(props.multiline && e.shiftKey)) commit();\n if (e.key === 'Escape') {\n setText(props.text);\n setEditingText(false);\n }\n };\n\n return (\n <Box\n sx={(theme) => ({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n px: 1,\n py: 0.5,\n mb: 0.5,\n backgroundColor: theme.palette.background.paper,\n width: '100%',\n })}\n >\n {editingText ? (\n <TextField\n inputRef={inputRef}\n value={text}\n onChange={(e) => setText(e.target.value)}\n onBlur={commit}\n onKeyDown={handleKeyDown}\n multiline={props.multiline}\n variant=\"standard\"\n size=\"small\"\n sx={{ width: '100%', overflow: 'hidden' }}\n slotProps={{\n input: {\n disableUnderline: true,\n sx: (theme) => ({ minWidth: '100px', color: theme.palette.text.primary, fontSize, margin: 0, padding: 0, pl: 1 }),\n },\n root: {\n sx: {\n overflow: 'hidden',\n alignContent: 'center',\n padding: '0px',\n width: props.multiline ? '90%' : 'unset',\n margin: 0,\n height: props.multiline ? '35px' : 'unset',\n },\n },\n }}\n />\n ) : (\n <Box\n onClick={() => setEditingText(true)}\n sx={(theme) => ({\n cursor: 'pointer',\n fontFamily: theme.typography.fontFamily,\n fontSize,\n color: theme.palette.text.primary,\n pl: 1,\n minWidth: '100px',\n height: '100%',\n minHeight: '20px',\n overflow: 'clip',\n whiteSpace: props.multiline ? 'pre-wrap' : 'nowrap',\n '&:hover': { textDecoration: 'underline' },\n })}\n >\n {!text || text.length == 0 ? props.placeHolderText : text}\n </Box>\n )}\n </Box>\n );\n};\n\n/** @deprecated legacy spelling — use {@link TitleSketch}. */\nexport const TextSketh = TitleSketch;\n/** @deprecated legacy spelling — use {@link TitleSketch}. */\nexport const TitleSkath = TitleSketch;\n\nexport default TitleSketch;\n","import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { Box, Stack, ToggleButton, ToggleButtonGroup, Typography } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport { BorderClearOutlined, ViewQuiltOutlined } from '@mui/icons-material';\nimport type { Layout, LayoutItem, ResponsiveLayouts } from 'react-grid-layout';\nimport { GridLayout, GridCardPlaceHolder } from '../../grid';\nimport { DateRangeFilterBeginSuffix, DateRangeFilterEndSuffix } from '../../filters/filterFactory';\nimport { CATEGORY_PREFIXES } from '../../viewer/cardMetadata';\nimport type { CardCategory, CardSpecificType, FilterType, SketchCardItem, SketchedFilter } from '../models/sketchModels';\nimport { randomId, sanitizeToJsVariable } from '../models/utils';\nimport { useComposer, useComposerStore } from '../store/ComposerProvider';\nimport { CardSketch } from './CardSketch';\nimport { FilterSketch } from './FilterSketch';\nimport { TitleSketch } from './TitleSketch';\nimport './composer.css';\n\nexport interface DashboardPadSketchProps {\n /** Forces the width observer to re-measure when it changes. */\n renderId?: string;\n /** Hide the in-sketch filter chip row (the V2 composer shows filters in its rail instead). */\n hideFiltersInSketch?: boolean;\n /** Hide the built-in top bar (dashboard name + Boxed/Naked toggle). */\n hideInternalHeader?: boolean;\n zoomLevel?: number;\n /** The empty-state CTA (\"Clique aqui para adicionar um novo card\"). */\n onAddCard?: () => void;\n /** Extra controls in the internal header (the legacy admin dataset / agent block). */\n headerExtra?: React.ReactNode;\n /** Forwarded to every `CardSketch`. */\n renderDescription?: (text: string) => React.ReactNode;\n}\n\n/** What `DashboardPad` / the composer rail drive through a ref. */\nexport interface DashboardPadHandle {\n addGenericCell: () => void;\n addTypedCell: (category: CardCategory, specificType: CardSpecificType, label: string) => void;\n handleAddFilter: (filterType: FilterType) => void;\n}\n\ntype WindowSize = 'Mobile' | 'Tablet' | 'Desktop' | 'Large';\n\nconst widthConfig: Record<WindowSize, number> = { Large: 4, Desktop: 4, Tablet: 4, Mobile: 4 };\nconst sizeConfig: Record<WindowSize, number> = { Large: 12, Desktop: 12, Tablet: 12, Mobile: 12 };\nconst DEFAULT_H = 6;\n\nfunction useContainerWidth(ref: React.RefObject<HTMLElement | null>, renderId: string | undefined, initialWidth = 0): number {\n const [width, setWidth] = useState(initialWidth);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n setWidth(el.getBoundingClientRect().width);\n if (typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setWidth(entry.contentRect.width);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref, renderId]);\n return width;\n}\n\nconst makeNameUnique = (name: string): string => {\n const timeSuffix = Math.round(Date.now() * Math.pow(10, -6));\n return `${sanitizeToJsVariable(name)}_${timeSuffix}`;\n};\n\n/**\n * The sketch surface: a `GridLayout` of `CardSketch` cells plus the filter\n * chips and (optionally) the name / layout header. Reads and writes the\n * ambient composer store; every user gesture also records a\n * `clientSideChanges` hint for the agent.\n */\nexport const DashboardPadSketch = forwardRef<DashboardPadHandle, DashboardPadSketchProps>((props, ref) => {\n const store = useComposerStore();\n const cards = useComposer((s) => s.dashboardDefinition?.cards) ?? EMPTY_CARDS;\n const filters = useComposer((s) => s.dashboardDefinition?.filters) ?? EMPTY_FILTERS;\n const dashboardName = useComposer((s) => s.dashboardDefinition?.name ?? '');\n const layoutType = useComposer((s) => s.dashboardDefinition?.layoutType ?? 'Boxed');\n const dashboardId = useComposer((s) => s.dashboardDefinition?.id);\n const turnOpen = useComposer((s) => s.turnOpen);\n const todosByCardKey = useComposer((s) => s.todosByCardKey);\n\n const [nativeConfig, setNativeConfig] = useState<SketchCardItem[]>([]);\n const containerRef = useRef<HTMLDivElement>(null);\n const containerWidth = useContainerWidth(containerRef, props.renderId);\n const [sizeType, setSizeType] = useState<WindowSize | null>(null);\n const [defaultWidth, setDefaultWidth] = useState<number>(0);\n const countersRef = useRef<Record<string, number>>({});\n const filterCounterRef = useRef(0);\n const prevDashboardIdRef = useRef<string | undefined>(undefined);\n const theme = useTheme();\n const effectiveZoomLevel = props.zoomLevel ?? 0.8;\n\n const handleLayoutTypeChange = useCallback((_: React.MouseEvent<HTMLElement>, v: 'Naked' | 'Boxed' | null) => {\n if (!v) return;\n store.getState().recordSketchChange('dashboard:layoutType', `Set layout type to ${v}`);\n store.getState().updateDashboard({ layoutType: v });\n }, [store]);\n\n // Re-seed the auto-name counters when a different dashboard is loaded.\n useEffect(() => {\n if (dashboardId === prevDashboardIdRef.current) return;\n prevDashboardIdRef.current = dashboardId;\n if (!dashboardId) return;\n const def = store.getState().dashboardDefinition;\n const loadedCards = def?.cards ?? [];\n countersRef.current = {};\n loadedCards.forEach((card) => {\n const prefix = CATEGORY_PREFIXES[(card.category ?? 'Generic') as CardCategory];\n countersRef.current[prefix] = (countersRef.current[prefix] ?? 0) + 1;\n });\n filterCounterRef.current = (def?.filters ?? []).length;\n setNativeConfig(loadedCards);\n }, [dashboardId, store]);\n\n const getNextName = useCallback((category: CardCategory): string => {\n const prefix = CATEGORY_PREFIXES[category];\n const next = (countersRef.current[prefix] ?? 0) + 1;\n countersRef.current[prefix] = next;\n return makeNameUnique(`${prefix}${next}`);\n }, []);\n\n // Local-only sync — tells `computeNewPosition` where the next card lands. Never writes the store.\n const handleLayoutChange = useCallback((layout: Layout, _responsive: ResponsiveLayouts) => {\n setNativeConfig(layout as SketchCardItem[]);\n }, []);\n\n // User-driven writeback — ONLY on resize-stop / drag-stop. RGL's internal\n // prop-sync passes hand out `{w:1,h:1}` placeholders that must never reach\n // the store (they used to persist as h:1 cards).\n const commitUserLayoutEdit = useCallback((layout: Layout, oldItem: LayoutItem | null, newItem: LayoutItem | null) => {\n if (!oldItem || !newItem) return;\n const currentCards = store.getState().dashboardDefinition?.cards ?? [];\n let changed = false;\n const synced = currentCards.map((card) => {\n const layoutItem = layout.find((l) => l.i === card.i);\n if (layoutItem && (card.w !== layoutItem.w || card.h !== layoutItem.h || card.x !== layoutItem.x || card.y !== layoutItem.y)) {\n changed = true;\n return { ...card, w: layoutItem.w, h: layoutItem.h, x: layoutItem.x, y: layoutItem.y };\n }\n return card;\n });\n if (!changed) return;\n\n const touchedCard = currentCards.find((c) => c.i === newItem.i);\n const label = touchedCard?.name ?? newItem.i;\n const sizeChanged = oldItem.w !== newItem.w || oldItem.h !== newItem.h;\n const moveChanged = oldItem.x !== newItem.x || oldItem.y !== newItem.y;\n const layoutKey = `card:${newItem.i}:layout`;\n if (sizeChanged && moveChanged) {\n store.getState().recordSketchChange(layoutKey, `Resized and moved card '${label}' to (w:${newItem.w}, h:${newItem.h}, x:${newItem.x}, y:${newItem.y})`);\n } else if (sizeChanged) {\n store.getState().recordSketchChange(layoutKey, `Resized card '${label}' to (w:${newItem.w}, h:${newItem.h})`);\n } else if (moveChanged) {\n store.getState().recordSketchChange(layoutKey, `Moved card '${label}' to (x:${newItem.x}, y:${newItem.y})`);\n }\n store.getState().updateDashboard({ cards: synced });\n }, [store]);\n\n const handleRemoveCard = useCallback((cardKey: string) => {\n const currentCards = store.getState().dashboardDefinition?.cards ?? [];\n const target = currentCards.find((c) => c.i === cardKey);\n store.getState().recordSketchChange(`card:${cardKey}:delete`, `Deleted card '${target?.name ?? cardKey}'`);\n store.getState().updateDashboard({ cards: currentCards.filter((c) => c.i !== cardKey) });\n }, [store]);\n\n const getSketchCell = useCallback((category: CardCategory = 'Generic', specificType: CardSpecificType = 'Generic'): SketchCardItem => {\n const name = getNextName(category);\n return {\n i: sanitizeToJsVariable(name),\n h: DEFAULT_H,\n w: defaultWidth,\n y: Infinity,\n x: 0,\n isDraggable: undefined,\n isResizable: true,\n category,\n specificType,\n name,\n };\n }, [defaultWidth, getNextName]);\n\n const handleNameChange = useCallback((paramName: string) => {\n const name = paramName.length === 0 ? 'Untitled Dashboard' : paramName;\n store.getState().recordSketchChange('dashboard:name', `Renamed dashboard to '${name}'`);\n store.getState().updateDashboard({ name });\n }, [store]);\n\n const handleEditData = useCallback((data: SketchCardItem) => {\n const currentCards = store.getState().dashboardDefinition?.cards ?? [];\n const nativeItem = nativeConfig.find((n) => n.i === data.i);\n const prevCard = currentCards.find((c) => c.i === data.i);\n\n const updatedCards = currentCards.map((card) => {\n if (card.i !== data.i) return card;\n return {\n ...card,\n ...(nativeItem ? { w: nativeItem.w, h: nativeItem.h, x: nativeItem.x, y: nativeItem.y } : {}),\n name: data.name,\n actionDescription: data.actionDescription,\n category: data.category,\n specificType: data.specificType,\n muiIconName: data.muiIconName,\n };\n });\n\n const diffs: string[] = [];\n if (prevCard) {\n if (prevCard.name !== data.name) diffs.push(`name → '${data.name}'`);\n if (prevCard.actionDescription !== data.actionDescription) diffs.push('description');\n if (prevCard.category !== data.category) diffs.push(`category → '${data.category}'`);\n if (prevCard.specificType !== data.specificType) diffs.push(`type → '${data.specificType}'`);\n if (prevCard.muiIconName !== data.muiIconName) diffs.push('icon');\n }\n if (diffs.length > 0) {\n store.getState().recordSketchChange(`card:${data.i}:edit`, `Edited card '${prevCard?.name ?? data.name}' (${diffs.join(', ')})`);\n }\n store.getState().updateDashboard({ cards: updatedCards });\n }, [nativeConfig, store]);\n\n const computeNewPosition = useCallback(() => {\n const currentMaxWidth = sizeType ? sizeConfig[sizeType] : 10;\n const last = nativeConfig.length > 0 ? nativeConfig[nativeConfig.length - 1] : null;\n let x = 0;\n let y = 0;\n if (last) {\n y = last.y;\n if (last.x + last.w > currentMaxWidth - defaultWidth) {\n y += 1;\n x = 0;\n } else {\n x = last.x + last.w;\n }\n }\n return { x, y };\n }, [sizeType, nativeConfig, defaultWidth]);\n\n const appendCard = useCallback((cell: SketchCardItem, note: string) => {\n const currentCards = store.getState().dashboardDefinition?.cards ?? [];\n store.getState().recordSketchChange(`card:${cell.i}:add`, note);\n store.getState().updateDashboard({ cards: [...currentCards, cell] });\n }, [store]);\n\n const handleDrop = useCallback((data: any, item?: LayoutItem) => {\n const category: CardCategory = data?.category ?? 'Generic';\n const specificType: CardSpecificType = data?.specificType ?? 'Generic';\n const cell = getSketchCell(category, specificType);\n cell.actionDescription = data?.description;\n if (item) {\n cell.h = DEFAULT_H;\n cell.w = defaultWidth;\n cell.y = item.y;\n cell.x = item.x;\n }\n appendCard(cell, `Added card '${cell.name}' (category: ${category}, type: ${specificType})`);\n }, [getSketchCell, defaultWidth, appendCard]);\n\n const addGenericCell = useCallback(() => {\n if (defaultWidth === 0) return;\n const newCell = getSketchCell('Generic', 'Generic');\n const pos = computeNewPosition();\n newCell.x = pos.x;\n newCell.y = pos.y;\n appendCard(newCell, `Added card '${newCell.name}'`);\n }, [defaultWidth, getSketchCell, computeNewPosition, appendCard]);\n\n const addTypedCell = useCallback((category: CardCategory, specificType: CardSpecificType, _label: string) => {\n const newCell = getSketchCell(category, specificType);\n const pos = computeNewPosition();\n newCell.x = pos.x;\n newCell.y = pos.y;\n newCell.w = defaultWidth;\n newCell.h = DEFAULT_H;\n appendCard(newCell, `Added card '${newCell.name}' (category: ${category}, type: ${specificType})`);\n }, [defaultWidth, getSketchCell, computeNewPosition, appendCard]);\n\n useEffect(() => {\n if (containerWidth == 0) return;\n let type: WindowSize = 'Desktop';\n if (containerWidth >= 920) type = 'Large';\n if (containerWidth < 920) type = 'Desktop';\n if (containerWidth < 750) type = 'Tablet';\n if (containerWidth < 600) type = 'Mobile';\n setSizeType(type);\n setDefaultWidth(widthConfig[type]);\n }, [containerWidth]);\n\n const handleAddFilter = useCallback((filterType: FilterType) => {\n filterCounterRef.current += 1;\n const filterName = `Filter${filterCounterRef.current}`;\n const parametersNames: string[] = [];\n let mandatory = false;\n if (filterType == 'DateRangePicker') {\n mandatory = true;\n parametersNames.push(`${filterName}${DateRangeFilterBeginSuffix}`, `${filterName}${DateRangeFilterEndSuffix}`);\n } else {\n parametersNames.push(filterName);\n }\n const id = randomId();\n const newFilter: SketchedFilter = { i: id, name: filterName, filterType, mandatory, multipleSelection: true };\n const currentFilters = store.getState().dashboardDefinition?.filters ?? [];\n store.getState().recordSketchChange(`filter:${id}:add`, `Added filter '${newFilter.name}' (type: ${filterType})`);\n store.getState().updateDashboard({ filters: [...currentFilters, newFilter] });\n }, [store]);\n\n const handleEditFilter = useCallback((updated: SketchedFilter) => {\n const currentFilters = store.getState().dashboardDefinition?.filters ?? [];\n store.getState().recordSketchChange(\n `filter:${updated.i}:edit`,\n `Edited filter '${updated.name}' - ${updated.mandatory ? 'Mandatório' : 'Opcional'} - ${updated.multipleSelection ? 'MultipleSelection' : 'SingleValue'}`,\n );\n store.getState().updateDashboard({ filters: currentFilters.map((f) => (f.i === updated.i ? { ...updated } : f)) });\n }, [store]);\n\n const handleDeleteFilter = useCallback((filterId: string) => {\n const currentFilters = store.getState().dashboardDefinition?.filters ?? [];\n const target = currentFilters.find((f) => f.i === filterId);\n store.getState().recordSketchChange(`filter:${filterId}:delete`, `Deleted filter '${target?.name ?? filterId}'`);\n store.getState().updateDashboard({ filters: currentFilters.filter((f) => f.i !== filterId) });\n }, [store]);\n\n useImperativeHandle(ref, () => ({ addGenericCell, addTypedCell, handleAddFilter }), [addGenericCell, addTypedCell, handleAddFilter]);\n\n const toggleSx = (selected: boolean) => ({ border: selected ? '0px' : `1px solid ${theme.palette.divider}`, px: 1, py: 0, gap: 0.5, textTransform: 'none' as const });\n const toggleLabelSx = (selected: boolean) => ({\n fontSize: '0.75rem',\n lineHeight: 1,\n maxWidth: selected ? 60 : 0,\n overflow: 'hidden',\n opacity: selected ? 1 : 0,\n whiteSpace: 'nowrap' as const,\n transition: 'max-width 0.25s ease, opacity 0.2s ease',\n });\n\n return (\n <Stack ref={containerRef} className=\"bi-dashboard-pad-sketch\" sx={{ height: '100%', overflow: 'hidden' }}>\n {!props.hideInternalHeader && (\n <Box sx={{ display: 'inline-flex', alignItems: 'center', flexWrap: 'nowrap', gap: 1, pt: 0.5, pb: 0, pr: 1, pl: 1, borderBottom: `1px solid ${theme.palette.divider}` }}>\n <Box sx={{ display: 'inline-flex', width: '75%' }}>\n <Box sx={{ width: '75%' }}>\n <TitleSketch placeHolderText=\"Untitled Dashboard\" onEdit={handleNameChange} text={dashboardName} fontSize={14.4} />\n </Box>\n </Box>\n <Box sx={{ position: 'relative', display: 'inline-flex', width: '25%', gap: 1, top: -2, justifyContent: 'center', alignItems: 'center' }}>\n <Typography component=\"span\" sx={{ color: 'text.secondary' }}>Layout:</Typography>\n <ToggleButtonGroup\n value={layoutType}\n exclusive\n onChange={handleLayoutTypeChange}\n size=\"small\"\n className=\"llm-env-target llm-env-layout-toggle\"\n data-env-id=\"dashboard-pad-layout-toggle\"\n sx={{ height: 24, border: '0px', '& .Mui-selected': { border: `1px solid ${theme.palette.divider}` } }}\n >\n <ToggleButton value=\"Boxed\" data-env-id=\"dashboard-pad-layout-boxed\" sx={toggleSx(layoutType === 'Boxed')}>\n <ViewQuiltOutlined sx={{ fontSize: 18 }} />\n <Typography component=\"span\" sx={toggleLabelSx(layoutType === 'Boxed')}>Boxed</Typography>\n </ToggleButton>\n <ToggleButton value=\"Naked\" data-env-id=\"dashboard-pad-layout-naked\" sx={toggleSx(layoutType === 'Naked')}>\n <BorderClearOutlined sx={{ fontSize: 18 }} />\n <Typography component=\"span\" sx={toggleLabelSx(layoutType === 'Naked')}>Naked</Typography>\n </ToggleButton>\n </ToggleButtonGroup>\n {props.headerExtra}\n </Box>\n </Box>\n )}\n\n {filters.length > 0 && !props.hideFiltersInSketch && (\n <Box sx={{ display: 'inline-flex', justifyContent: 'flex-end', flexWrap: 'wrap', gap: 1, pt: 0.5, pb: 0, pr: 1, pl: 1, borderBottom: `1px solid ${theme.palette.divider}` }}>\n {filters.map((f) => (\n <FilterSketch key={f.i} filter={f} onEdit={handleEditFilter} onDelete={handleDeleteFilter} />\n ))}\n </Box>\n )}\n\n <div style={{ maxHeight: '100%', height: '100%', overflow: 'auto' }}>\n {containerWidth !== 0 && cards.length > 0 && (\n <div style={{ display: 'inline-flex', flex: 1, alignItems: 'center', justifyContent: 'center', paddingBottom: props.hideInternalHeader ? '50px' : '80px', overflow: 'auto', width: '100%' }}>\n <GridLayout\n rowAwareResize={{ defaultOn: true }}\n key={dashboardId}\n onLayoutChange={handleLayoutChange}\n onResizeStop={commitUserLayoutEdit}\n onDragStop={commitUserLayoutEdit}\n onDrop={handleDrop}\n config={{}}\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 rowHeight={10}\n dragLocked={false}\n zoomLevel={effectiveZoomLevel}\n responsive={false}\n maxRows={200}\n rowMultiplier={1}\n manualWidth={containerWidth}\n layouts={cards}\n >\n {cards.map((r) => (\n <GridCardPlaceHolder\n key={r.i}\n className=\"llm-env-target llm-env-card llm-env-card-sketch-wrapper\"\n data-env-id={r.i}\n naked={layoutType == 'Naked'}\n data-env-key={r.i}\n data-env-name={r.name ?? ''}\n data-env-kind=\"sketch-card-wrapper\"\n >\n <CardSketch\n turnOpen={turnOpen ?? false}\n todoItem={todosByCardKey[r.i]?.todo}\n cellConfig={r}\n onDataEdit={handleEditData}\n onDelete={handleRemoveCard}\n renderDescription={props.renderDescription}\n />\n </GridCardPlaceHolder>\n ))}\n </GridLayout>\n </div>\n )}\n {containerWidth !== 0 && cards.length == 0 && (\n <Box\n sx={(theme) => ({\n background: 'transparent',\n border: 'none',\n textAlign: 'left',\n padding: '6px 0',\n height: '100%',\n color: theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamily,\n display: 'inline-flex',\n width: '100%',\n justifyContent: 'center',\n alignItems: 'center',\n '&:hover': { color: theme.palette.text.primary },\n })}\n >\n <Stack direction=\"row\" gap={1} sx={{ '&:hover': { cursor: 'pointer' } }} onClick={() => props.onAddCard?.()}>\n <Box component=\"span\" sx={(theme) => ({ color: theme.palette.text.disabled })}>↗</Box>\n <Typography sx={(theme) => ({ fontSize: 20, fontWeight: 600, color: theme.palette.text.primary, margin: 0, lineHeight: 1.2, letterSpacing: -0.4 })}>\n Clique aqui para adicionar um novo card\n </Typography>\n </Stack>\n </Box>\n )}\n </div>\n </Stack>\n );\n});\n\nDashboardPadSketch.displayName = 'DashboardPadSketch';\n\nconst EMPTY_CARDS: SketchCardItem[] = [];\nconst EMPTY_FILTERS: SketchedFilter[] = [];\n\nexport default DashboardPadSketch;\n","import React from 'react';\nimport { Box, Typography } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\n\nexport interface HoverButtonProps {\n onClick?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n icon: React.ReactNode | (() => React.ReactNode);\n /** Always show the label (instead of revealing it on hover). */\n fixed?: boolean;\n label: string;\n maxWidth?: number;\n}\n\n/** Icon button whose label slides out on hover — the pad toolbar's action style. */\nexport const HoverButton: React.FC<HoverButtonProps> = (props) => {\n const theme = useTheme();\n const calcMaxWidth = props.maxWidth ?? 30;\n\n return (\n <Box\n sx={{\n '& .action-btn': {\n display: 'inline-flex',\n alignItems: 'center',\n height: 28,\n borderRadius: 1,\n px: 0.75,\n cursor: 'pointer',\n overflow: 'hidden',\n transition: 'background-color 0.2s',\n '&:hover': { borderRadius: 1, px: 1.5, backgroundColor: theme.palette.action.hover },\n '&:hover .action-label': { maxWidth: calcMaxWidth, opacity: 1, ml: 0.5 },\n },\n '& .action-btn-fixed': {\n display: 'inline-flex',\n alignItems: 'center',\n height: 28,\n borderRadius: 1,\n px: 0.75,\n cursor: 'pointer',\n '&:hover': { bgcolor: theme.palette.success.light },\n },\n '& .action-label': {\n maxWidth: 0,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n opacity: 0,\n ml: 0,\n transition: 'max-width 0.3s ease, opacity 0.15s ease 0.1s, margin 0.3s ease',\n fontSize: '0.7rem',\n lineHeight: 1,\n },\n '& .action-label-fixed': {\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n ml: 0,\n fontSize: '0.7rem',\n lineHeight: 1,\n marginRight: 1,\n },\n }}\n >\n <Box className={props.fixed ? 'action-btn-fixed' : 'action-btn'} onClick={(event) => props.onClick?.(event)} sx={{ color: 'text.secondary' }}>\n {typeof props.icon == 'function' ? props.icon() : props.icon}\n <Typography className={props.fixed ? 'action-label-fixed' : 'action-label'} component=\"span\">\n {props.label}\n </Typography>\n </Box>\n </Box>\n );\n};\n\nexport default HoverButton;\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Box,\n Button,\n ClickAwayListener,\n Divider,\n Grow,\n IconButton,\n ListItemIcon,\n ListItemText,\n MenuItem,\n MenuList,\n Paper,\n Popper,\n Tooltip,\n} from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport type { Theme } from '@mui/material/styles';\nimport { AddOutlined, ArrowDropDownOutlined, DragIndicatorOutlined, FilterListOutlined } from '@mui/icons-material';\nimport { CARD_TYPE_CATALOG, FILTER_TYPE_CATALOG, groupCardCatalog, type CardTypeDefinition } from '../models/catalog';\nimport type { CardCategory, CardSpecificType, FilterType } from '../models/sketchModels';\nimport { useCardTypeIcons } from '../icons/cardTypeIcons';\n\nexport interface ToolBoxProps {\n onAddGeneric: () => void;\n onAddTyped: (category: CardCategory, specificType: CardSpecificType, label: string) => void;\n /** When omitted the \"Filtro\" button is not rendered. */\n onAddFilter?: (filterType: FilterType) => void;\n}\n\nconst groupedCatalog = groupCardCatalog(CARD_TYPE_CATALOG);\n\n/** The drag ghost for \"drag a type onto the pad\" — colours from the theme, never spelled. */\nfunction createDragPreview(theme: Theme, iconSvgHtml: string, label: string): HTMLElement {\n const el = document.createElement('div');\n el.style.cssText = [\n 'display:flex', 'align-items:center', 'gap:6px',\n 'padding:6px 12px',\n `border:2px dashed ${theme.palette.secondary.main}`, 'border-radius:6px',\n `background-color:${theme.palette.background.paper}`, `color:${theme.palette.secondary.main}`,\n `font-family:${theme.typography.fontFamily ?? 'inherit'}`, 'font-size:13px', 'font-weight:500',\n 'white-space:nowrap',\n 'position:fixed', 'top:-200px', 'left:-200px',\n 'z-index:99999', 'pointer-events:none',\n ].join(';');\n el.innerHTML = `${iconSvgHtml}<span>${label}</span>`;\n document.body.appendChild(el);\n return el;\n}\n\n/** The pad's toolbar: drag-to-add handle, \"+ Card\" (with a typed dropdown) and \"Filtro\". */\nexport const ToolBox: React.FC<ToolBoxProps> = ({ onAddGeneric, onAddTyped, onAddFilter }) => {\n const theme = useTheme();\n const icons = useCardTypeIcons();\n const [menuOpen, setMenuOpen] = useState(false);\n const [filterMenuOpen, setFilterMenuOpen] = useState(false);\n const anchorRef = useRef<HTMLButtonElement>(null);\n const filterAnchorRef = useRef<HTMLButtonElement>(null);\n const dragPreviewRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => () => dragPreviewRef.current?.remove(), []);\n\n const cleanupDragPreview = useCallback(() => {\n dragPreviewRef.current?.remove();\n dragPreviewRef.current = null;\n }, []);\n\n const handleDragStart = (e: React.DragEvent, item?: CardTypeDefinition) => {\n const data = item\n ? { category: item.category, specificType: item.specificType, label: item.label }\n : { category: 'Generic', specificType: 'Generic', label: 'Generic' };\n\n e.dataTransfer.setData('text/json', JSON.stringify(data));\n e.dataTransfer.effectAllowed = 'copy';\n cleanupDragPreview();\n\n const iconEl = (e.currentTarget as HTMLElement).querySelector('svg');\n const iconHtml = iconEl ? iconEl.outerHTML.replace(/width=\"[^\"]*\"/, 'width=\"18\"').replace(/height=\"[^\"]*\"/, 'height=\"18\"') : '';\n const preview = createDragPreview(theme, iconHtml, item?.label ?? 'Generic');\n dragPreviewRef.current = preview;\n e.dataTransfer.setDragImage(preview, 0, 0);\n };\n\n const handleMenuItemClick = (item: CardTypeDefinition) => {\n onAddTyped(item.category, item.specificType, item.label);\n setMenuOpen(false);\n };\n\n return (\n <Box sx={{ display: 'inline-flex', gap: 0.5, alignItems: 'center' }}>\n <Tooltip title=\"Drag to add card\">\n <Box\n className=\"action-btn llm-env-target llm-env-dashboard-action\"\n data-env-id=\"dashboardpad-drag-to-add-card\"\n draggable\n onDragStart={(e) => handleDragStart(e)}\n onDragEnd={cleanupDragPreview}\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 28,\n height: 28,\n border: '1.5px dashed',\n borderColor: 'secondary.main',\n borderRadius: 0.5,\n cursor: 'grab',\n '&:hover': { bgcolor: 'action.hover' },\n '&:active': { cursor: 'grabbing' },\n }}\n >\n <DragIndicatorOutlined sx={{ fontSize: 16 }} color=\"secondary\" />\n </Box>\n </Tooltip>\n\n <Box sx={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>\n <Tooltip title=\"Add card\">\n <Button\n className=\"action-btn llm-env-target llm-env-dashboard-action\"\n data-env-id=\"dashboardpad-add-card\"\n variant=\"outlined\"\n size=\"small\"\n color=\"secondary\"\n startIcon={<AddOutlined sx={{ m: 0.2, p: 0 }} />}\n onClick={onAddGeneric}\n sx={{ height: 28, fontSize: '0.7rem', pr: 1, gap: 0, minWidth: '80px', textTransform: 'none', justifyContent: 'left' }}\n >\n Card\n </Button>\n </Tooltip>\n <IconButton\n className=\"action-btn llm-env-target llm-env-dashboard-action\"\n data-env-id=\"dashboardpad-add-card-dropdown\"\n ref={anchorRef}\n size=\"small\"\n onClick={() => setMenuOpen((prev) => !prev)}\n sx={{ position: 'absolute', right: 0, height: 28, width: 20 }}\n aria-label=\"Tipos de card\"\n >\n <ArrowDropDownOutlined color=\"secondary\" sx={{ fontSize: 18, mr: 0.5 }} />\n </IconButton>\n </Box>\n\n <Popper open={menuOpen} anchorEl={anchorRef.current} placement=\"bottom-start\" transition sx={{ zIndex: 1300 }}>\n {({ TransitionProps }) => (\n <Grow {...TransitionProps}>\n <Paper elevation={8} sx={{ maxHeight: 420, overflow: 'auto', minWidth: 260 }}>\n <ClickAwayListener onClickAway={() => setMenuOpen(false)}>\n <MenuList dense>\n {Object.entries(groupedCatalog).map(([category, items], gi) => {\n const CategoryIcon = icons.category[category as CardCategory];\n return (\n <Box key={category}>\n {gi > 0 && <Divider />}\n <Box component=\"span\" sx={{ px: 2, pt: 1, display: 'flex', alignItems: 'center', gap: 0.5, typography: 'overline' }}>\n <CategoryIcon fontSize=\"inherit\" />\n {category}\n </Box>\n {items.map((item) => {\n const Icon = icons.specificType[item.specificType];\n return (\n <MenuItem key={item.specificType} onClick={() => handleMenuItemClick(item)} draggable onDragStart={(e) => handleDragStart(e, item)} onDragEnd={cleanupDragPreview}>\n <ListItemIcon>\n <Icon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{item.label}</ListItemText>\n </MenuItem>\n );\n })}\n </Box>\n );\n })}\n </MenuList>\n </ClickAwayListener>\n </Paper>\n </Grow>\n )}\n </Popper>\n\n {onAddFilter && (\n <>\n <Tooltip title=\"Add filter\">\n <Button\n className=\"action-btn llm-env-target llm-env-dashboard-action\"\n data-env-id=\"dashboardpad-add-filter\"\n ref={filterAnchorRef}\n variant=\"outlined\"\n size=\"small\"\n color=\"secondary\"\n startIcon={<FilterListOutlined />}\n endIcon={<ArrowDropDownOutlined />}\n onClick={() => setFilterMenuOpen((prev) => !prev)}\n sx={{ height: 28, fontSize: '0.7rem', minWidth: 0, textTransform: 'none' }}\n >\n Filtro\n </Button>\n </Tooltip>\n\n <Popper open={filterMenuOpen} anchorEl={filterAnchorRef.current} placement=\"bottom-start\" transition sx={{ zIndex: 1300 }}>\n {({ TransitionProps }) => (\n <Grow {...TransitionProps}>\n <Paper elevation={8} sx={{ minWidth: 220 }}>\n <ClickAwayListener onClickAway={() => setFilterMenuOpen(false)}>\n <MenuList dense>\n {FILTER_TYPE_CATALOG.map((ft) => {\n const FIcon = icons.filterType[ft.filterType];\n return (\n <MenuItem\n key={ft.filterType}\n onClick={() => {\n onAddFilter(ft.filterType);\n setFilterMenuOpen(false);\n }}\n >\n <ListItemIcon>\n <FIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>{ft.label}</ListItemText>\n </MenuItem>\n );\n })}\n </MenuList>\n </ClickAwayListener>\n </Paper>\n </Grow>\n )}\n </Popper>\n </>\n )}\n </Box>\n );\n};\n\nexport default ToolBox;\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, CircularProgress, ClickAwayListener, Divider, Grow, Paper, Popper, Stack, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport { ArrowBack, DashboardOutlined, FolderOpenOutlined, ArrowDropDownOutlined, NoteAddOutlined, PreviewRounded, RefreshOutlined, SaveOutlined, StartRounded } from '@mui/icons-material';\nimport { useBiClientOptional } from '../../client';\nimport { ScriptDashboardViewer } from '../../viewer/ScriptDashboardViewer';\nimport type { ComposerDashboard, Dashboard, DashboardHierarchy } from '../models/sketchModels';\nimport { validateSketch } from '../models/catalog';\nimport { useComposer, useComposerStore } from '../store/ComposerProvider';\nimport { createDashboardDraft, fromUpsertResponse, upsertDashboardDraft } from '../store/drafts';\nimport { DashboardPadSketch, type DashboardPadHandle } from './DashboardPadSketch';\nimport { HoverButton } from './HoverButton';\nimport { ToolBox } from './ToolBox';\nimport './composer.css';\n\nexport interface DashboardPickerRenderArgs {\n hierarchy: DashboardHierarchy | null;\n loading: boolean;\n selectedDashboardId: string | null;\n onSelect: (dashboard: Dashboard) => void;\n}\n\nexport interface DashboardPadProps {\n /** Chat session the draft is bound to (`originalSessionId`). */\n sessionId: string;\n /** Load this dashboard into the pad on mount / when it changes. */\n dashboardId?: string;\n turnOpen: boolean;\n /** \"Compose\": the validated sketch, ready to be sent to the agent. */\n onCompose?: (dashboardDefinition: ComposerDashboard) => void;\n /** After a save / load / new. */\n onChange?: (sketchDashboard: ComposerDashboard) => void;\n onBack?: () => void;\n /**\n * The \"Abrir\" picker body (the legacy `DashboardListViewer` lives in the\n * host app). Without it the Abrir button is not rendered.\n */\n renderDashboardPicker?: (args: DashboardPickerRenderArgs) => React.ReactNode;\n /** Debug panel with the sketch JSON. */\n showDebug?: boolean;\n headerExtra?: React.ReactNode;\n renderDescription?: (text: string) => React.ReactNode;\n}\n\n/**\n * The V1 pad: toolbar (Sketch/Dashboard toggle, `ToolBox`, Novo / Salvar /\n * Atualizar / Abrir / Compose) over a `DashboardPadSketch`, or over a\n * `ScriptDashboardViewer` of the published dashboard in Dashboard view.\n * Needs a `ComposerProvider`; the REST calls go through the ambient\n * `BiClient` (buttons that need one are hidden without it).\n */\nexport const DashboardPad: React.FC<DashboardPadProps> = (props) => {\n const client = useBiClientOptional();\n const store = useComposerStore();\n const definition = useComposer((s) => s.dashboardDefinition);\n const published = useComposer((s) => s.publishedDashboard);\n const viewType = useComposer((s) => s.viewType);\n const renderGeneration = useComposer((s) => s.renderGeneration);\n const llmCounter = useComposer((s) => s.llmCounter);\n const dashboardId = definition?.id ?? null;\n\n const [createError, setCreateError] = useState<string | null>(null);\n const [composerError, setComposerError] = useState<string | undefined>();\n const [saving, setSaving] = useState(false);\n const [loadOpen, setLoadOpen] = useState(false);\n const [hierarchy, setHierarchy] = useState<DashboardHierarchy | null>(null);\n const [hierarchyLoading, setHierarchyLoading] = useState(false);\n const loadAnchorRef = useRef<HTMLDivElement>(null);\n const padHandleRef = useRef<DashboardPadHandle | null>(null);\n const inflightRef = useRef<Promise<unknown> | null>(null);\n const lastLoadedDashboardId = useRef<string | null>(null);\n const theme = useTheme();\n const renderId = useMemo(() => `pad-${Math.random().toString(36).slice(2)}`, []);\n\n useEffect(() => {\n if (props.turnOpen) return;\n const def = store.getState().dashboardDefinition;\n if (def?.cards?.some((c) => c.todoItem)) {\n store.getState().updateDashboard({ cards: def.cards.map((item) => ({ ...item, todoItem: undefined })) });\n }\n }, [props.turnOpen, store]);\n\n const compose = useCallback(() => {\n const def = store.getState().dashboardDefinition;\n if (!def || !props.onCompose) return;\n const errorMessage = validateSketch(def);\n if (errorMessage) {\n setComposerError(errorMessage);\n setTimeout(() => setComposerError(undefined), 2000);\n return;\n }\n props.onCompose(def);\n }, [props.onCompose, store]);\n\n const applyDashboardOnPad = useCallback((loaded: ComposerDashboard) => {\n lastLoadedDashboardId.current = loaded.id ?? null;\n validateSketch(loaded);\n store.getState().updateDashboard(loaded);\n props.onChange?.(loaded);\n }, [props.onChange, store]);\n\n const handleSave = useCallback(async () => {\n const def = store.getState().dashboardDefinition;\n if (!def?.id || !client) return;\n setSaving(true);\n try {\n await upsertDashboardDraft(client, def);\n props.onChange?.(def);\n } catch (error) {\n console.error('[@aintela/bi composer] Error saving dashboard:', error);\n } finally {\n setSaving(false);\n }\n }, [client, props.onChange, store]);\n\n useEffect(() => {\n if (!client || !props.dashboardId || inflightRef.current || lastLoadedDashboardId.current === props.dashboardId) return;\n setCreateError(null);\n store.getState().updateDashboard(undefined);\n const promise = client.getDashboard<unknown>(props.dashboardId);\n inflightRef.current = promise;\n promise\n .then((loaded) => applyDashboardOnPad(fromUpsertResponse(loaded)))\n .catch((error: unknown) => setCreateError(String(error)))\n .finally(() => {\n inflightRef.current = null;\n });\n }, [applyDashboardOnPad, client, props.dashboardId, store]);\n\n const handleNew = useCallback(async () => {\n if (!client) return;\n try {\n applyDashboardOnPad(await createDashboardDraft(client, props.sessionId));\n } catch (error) {\n console.error('[@aintela/bi composer] Error creating new dashboard:', error);\n }\n }, [applyDashboardOnPad, client, props.sessionId]);\n\n const handleRefresh = useCallback(() => {\n store.getState().refreshDashboard();\n }, [store]);\n\n const handleLoadToggle = useCallback(async () => {\n const willOpen = !loadOpen;\n setLoadOpen(willOpen);\n if (willOpen && client) {\n setHierarchyLoading(true);\n try {\n setHierarchy(await client.getDashboardHierarchy<DashboardHierarchy>());\n } catch (error) {\n console.error('[@aintela/bi composer] Error fetching hierarchy:', error);\n } finally {\n setHierarchyLoading(false);\n }\n }\n }, [client, loadOpen]);\n\n const handleLoadDashboard = useCallback(async (dashboard: Dashboard) => {\n if (!dashboard.id || !client) return;\n setLoadOpen(false);\n try {\n applyDashboardOnPad(fromUpsertResponse(await client.getDashboard<unknown>(dashboard.id)));\n } catch (error) {\n console.error('[@aintela/bi composer] Error loading dashboard:', error);\n }\n }, [applyDashboardOnPad, client]);\n\n const renderDashboardPicker = props.renderDashboardPicker;\n const envIcon = (id: string, node: React.ReactElement) => React.cloneElement(node, { className: 'llm-env-target llm-env-dashboard-action', 'data-env-id': id, sx: { fontSize: 18 } } as Record<string, unknown>);\n const viewToggleSx = (selected: boolean) => ({ border: selected ? '0px' : `1px solid ${theme.palette.divider}`, px: 1, py: 0, gap: 0.5, textTransform: 'none' as const });\n const viewLabelSx = (selected: boolean, max: number) => ({ fontSize: '0.7rem', lineHeight: 1, maxWidth: selected ? max : 0, overflow: 'hidden', opacity: selected ? 1 : 0, whiteSpace: 'nowrap' as const, transition: 'max-width 0.25s ease, opacity 0.2s ease' });\n\n return (\n <Stack className=\"bi-dashboard-pad\" sx={{ height: '100%', minHeight: 0 }}>\n <Box sx={{ display: 'flex', py: 0.5, backgroundColor: theme.palette.background.paper, borderBottom: `1px solid ${theme.palette.divider}`, px: 1 }}>\n <Stack direction=\"row\" gap={0.5} sx={{ alignItems: 'center', width: '100%', px: 1 }}>\n {!definition && !createError && (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <CircularProgress size={16} />\n <Typography color=\"text.secondary\">Carregando dashboard</Typography>\n </Stack>\n )}\n {createError && <Typography color=\"error\">Error creating dashboard: {createError}</Typography>}\n {definition && (\n <>\n {props.onBack && <HoverButton onClick={props.onBack} icon={envIcon('dashboard-pad-back', <ArrowBack />)} label=\"Voltar\" />}\n <ToggleButtonGroup\n value={viewType}\n exclusive\n onChange={(_, v) => v && store.getState().setViewType(v)}\n size=\"small\"\n className=\"llm-env-target llm-env-view-toggle\"\n data-env-id=\"dashboard-pad-view-toggle\"\n sx={{ height: 24, border: '0px', '& .Mui-selected': { border: `1px solid ${theme.palette.divider}` } }}\n >\n <ToggleButton value=\"Sketch\" className=\"llm-env-target llm-env-action-sketch\" data-env-id=\"dashboard-pad-view-sketch\" sx={viewToggleSx(viewType == 'Sketch')}>\n <DashboardOutlined sx={{ fontSize: 18 }} />\n <Typography component=\"span\" sx={viewLabelSx(viewType === 'Sketch', 50)}>Sketch</Typography>\n </ToggleButton>\n <ToggleButton value=\"Generated\" className=\"llm-env-target llm-env-action-generated\" data-env-id=\"dashboard-pad-view-generated\" sx={viewToggleSx(viewType == 'Generated')}>\n <PreviewRounded sx={{ fontSize: 18 }} />\n <Typography component=\"span\" sx={viewLabelSx(viewType === 'Generated', 70)}>Dashboard</Typography>\n </ToggleButton>\n </ToggleButtonGroup>\n\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n\n <Box sx={{ flex: 1, display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <ToolBox\n onAddGeneric={() => padHandleRef.current?.addGenericCell()}\n onAddTyped={(cat, spec, label) => padHandleRef.current?.addTypedCell(cat, spec, label)}\n onAddFilter={(filterType) => padHandleRef.current?.handleAddFilter(filterType)}\n />\n </Box>\n\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n\n <Stack direction=\"row\" gap={0.25} alignItems=\"center\">\n {client && <HoverButton onClick={handleNew} icon={envIcon('dashboard-pad-new', <NoteAddOutlined />)} label=\"Novo\" />}\n {client && (\n <HoverButton\n onClick={!saving ? handleSave : undefined}\n icon={() => (saving ? <CircularProgress size={14} /> : envIcon('dashboard-pad-save', <SaveOutlined />))}\n label=\"Salvar\"\n />\n )}\n <HoverButton onClick={handleRefresh} icon={envIcon('dashboard-pad-refresh', <RefreshOutlined />)} label=\"Atualizar\" />\n {client && renderDashboardPicker && (\n <div ref={loadAnchorRef}>\n <HoverButton\n onClick={handleLoadToggle}\n icon={\n <Stack direction=\"row\" alignItems=\"center\" data-env-id=\"dashboard-pad-load\" className=\"llm-env-target llm-env-dashboard-action\">\n <FolderOpenOutlined sx={{ fontSize: 18 }} />\n <ArrowDropDownOutlined sx={{ fontSize: 14, ml: -0.25 }} />\n </Stack>\n }\n label=\"Abrir\"\n />\n </div>\n )}\n\n <Tooltip open={!!composerError} title={composerError ?? ''} placement=\"bottom\" slotProps={{ tooltip: { sx: { backgroundColor: 'error.dark' } } }}>\n <Box\n className=\"action-btn-fixed\"\n onClick={compose}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n height: 28,\n borderRadius: 1,\n px: 0.75,\n cursor: 'pointer',\n color: theme.palette.success.contrastText,\n backgroundColor: theme.palette.success.main,\n '&:hover': { bgcolor: theme.palette.success.light },\n }}\n >\n <Typography component=\"span\" sx={{ whiteSpace: 'nowrap', fontSize: '0.7rem', lineHeight: 1, mr: 1 }}>Compose</Typography>\n {envIcon('dashboard-pad-compose', <StartRounded />)}\n </Box>\n </Tooltip>\n </Stack>\n </>\n )}\n </Stack>\n </Box>\n\n {renderDashboardPicker && (\n <Popper open={loadOpen} anchorEl={loadAnchorRef.current} placement=\"bottom-end\" transition sx={{ zIndex: 1300 }}>\n {({ TransitionProps }) => (\n <Grow {...TransitionProps}>\n <Paper elevation={8} sx={{ overflow: 'hidden', minWidth: 320, maxWidth: 380 }}>\n <ClickAwayListener onClickAway={() => setLoadOpen(false)}>\n <Box sx={{ width: 360, maxWidth: '100%', height: 420 }}>\n {renderDashboardPicker({ hierarchy, loading: hierarchyLoading, selectedDashboardId: dashboardId, onSelect: (d) => void handleLoadDashboard(d) })}\n </Box>\n </ClickAwayListener>\n </Paper>\n </Grow>\n )}\n </Popper>\n )}\n\n {viewType == 'Sketch' && (\n <Stack sx={{ flex: 1, minHeight: 0 }}>\n {props.showDebug && (\n <Paper variant=\"outlined\" sx={{ maxHeight: 200, p: 1, overflow: 'auto', '& pre': { bgcolor: 'background.default', p: 1, borderRadius: 1, overflow: 'auto', fontSize: 11, m: 0 } }}>\n <pre>{JSON.stringify(definition, undefined, 2)}</pre>\n </Paper>\n )}\n <div style={{ minHeight: '300px', flex: 1 }}>\n <DashboardPadSketch ref={padHandleRef} renderId={renderId} headerExtra={props.headerExtra} renderDescription={props.renderDescription} />\n </div>\n </Stack>\n )}\n {viewType == 'Generated' && published?.id && (\n <Box sx={{ flex: 1, minHeight: 0, overflow: 'auto' }}>\n <ScriptDashboardViewer key={published.id} dashboard={published} codeGeneration={renderGeneration} llmRenderCount={llmCounter} dragLocked={false} editable onLayoutCommit={() => store.getState().commitDashboardLayout()} />\n </Box>\n )}\n </Stack>\n );\n};\n\nDashboardPad.displayName = 'DashboardPad';\n\nexport default DashboardPad;\n","import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { Box, IconButton, ListItemIcon, ListItemText, Menu, MenuItem, TextField, Typography } from '@mui/material';\nimport { Add as AddIcon, Close as CloseIcon, InsertDriveFileOutlined as FileIcon } from '@mui/icons-material';\nimport { randomId } from '../models/utils';\n\nexport interface EditorTab {\n id: string;\n name: string;\n contentType: string;\n sourceId?: string;\n}\n\nexport interface AddMenuItem {\n label: string;\n icon?: ReactNode;\n contentType: string;\n disabled?: boolean;\n dividerBefore?: boolean;\n}\n\nexport interface DashboardPadEditorHandle {\n focusTab: (tabName: string) => void;\n createTab: (contentType?: string, name?: string) => string;\n closeTab: (tabName: string) => void;\n getActiveTab: () => EditorTab | null;\n getTabs: () => EditorTab[];\n}\n\nexport interface DashboardPadEditorProps {\n defaultContentType?: string;\n addMenuItems?: AddMenuItem[];\n renderContent: (tab: EditorTab) => ReactNode;\n renderTabIcon?: (tab: EditorTab) => ReactNode;\n onTabChange?: (tab: EditorTab) => void;\n onTabClose?: (tab: EditorTab) => void;\n onTabCreate?: (tab: EditorTab) => void;\n onTabRename?: (tab: EditorTab, previousName: string) => void;\n tabs?: EditorTab[];\n}\n\nconst TAB_HEIGHT = 40;\nconst TAB_MIN_WIDTH = 100;\nconst TAB_MAX_WIDTH = 150;\n\n/** Multi-tab shell (rename on double-click, close, \"+\" with an optional typed menu); every panel stays mounted. */\nexport const DashboardPadEditor = forwardRef<DashboardPadEditorHandle, DashboardPadEditorProps>((props, ref) => {\n const defaultType = props.defaultContentType ?? 'default';\n const untitledCounter = useRef(0);\n const nextUntitledName = useCallback((): string => {\n untitledCounter.current += 1;\n return `Untitled-${untitledCounter.current}`;\n }, []);\n\n const [tabs, setTabs] = useState<EditorTab[]>(() => props.tabs ?? [{ name: nextUntitledName(), contentType: defaultType, id: randomId() }]);\n const [activeTabName, setActiveTabName] = useState<string>(() => tabs[0].name);\n const [editingTabName, setEditingTabName] = useState<string | null>(null);\n const [editValue, setEditValue] = useState('');\n const [addMenuAnchor, setAddMenuAnchor] = useState<HTMLElement | null>(null);\n const editInputRef = useRef<HTMLInputElement>(null);\n\n const activeTab = tabs.find((t) => t.name === activeTabName) ?? tabs[0] ?? null;\n\n const resolveUniqueName = useCallback((desired: string, exclude?: string): string => {\n let candidate = desired;\n let suffix = 1;\n while (tabs.some((t) => t.name === candidate && t.name !== exclude)) {\n suffix += 1;\n candidate = `${desired} (${suffix})`;\n }\n return candidate;\n }, [tabs]);\n\n const focusTab = useCallback((tabName: string) => {\n if (tabs.some((t) => t.name === tabName)) setActiveTabName(tabName);\n }, [tabs]);\n\n const createTab = useCallback((contentType?: string, name?: string): string => {\n const resolvedName = resolveUniqueName(name ?? nextUntitledName());\n const newTab: EditorTab = { id: randomId(), name: resolvedName, contentType: contentType ?? defaultType };\n setTabs((prev) => [...prev, newTab]);\n setActiveTabName(resolvedName);\n props.onTabCreate?.(newTab);\n return resolvedName;\n }, [defaultType, resolveUniqueName, props.onTabCreate, nextUntitledName]);\n\n const closeTab = useCallback((tabName: string) => {\n setTabs((prev) => {\n const idx = prev.findIndex((t) => t.name === tabName);\n if (idx === -1) return prev;\n const closing = prev[idx];\n const next = prev.filter((t) => t.name !== tabName);\n if (next.length === 0) {\n const fallback: EditorTab = { name: nextUntitledName(), contentType: defaultType, id: randomId() };\n setActiveTabName(fallback.name);\n props.onTabClose?.(closing);\n return [fallback];\n }\n if (activeTabName === tabName) setActiveTabName(next[Math.min(idx, next.length - 1)].name);\n props.onTabClose?.(closing);\n return next;\n });\n }, [activeTabName, defaultType, props.onTabClose, nextUntitledName]);\n\n useImperativeHandle(ref, () => ({ focusTab, createTab, closeTab, getActiveTab: () => activeTab, getTabs: () => tabs }), [focusTab, createTab, closeTab, activeTab, tabs]);\n\n useEffect(() => {\n if (activeTab) props.onTabChange?.(activeTab);\n }, [activeTabName]);\n\n const startRename = (tab: EditorTab) => {\n setEditingTabName(tab.name);\n setEditValue(tab.name);\n };\n\n const commitRename = () => {\n if (!editingTabName) return;\n const trimmed = editValue.trim();\n if (trimmed && trimmed !== editingTabName) {\n const uniqueName = resolveUniqueName(trimmed, editingTabName);\n const previousName = editingTabName;\n setTabs((prev) => prev.map((t) => (t.name === editingTabName ? { ...t, name: uniqueName } : t)));\n if (activeTabName === editingTabName) setActiveTabName(uniqueName);\n const renamed = tabs.find((t) => t.name === editingTabName);\n if (renamed) props.onTabRename?.({ ...renamed, name: uniqueName }, previousName);\n }\n setEditingTabName(null);\n };\n\n const handleRenameKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') commitRename();\n else if (e.key === 'Escape') setEditingTabName(null);\n };\n\n useEffect(() => {\n if (editingTabName && editInputRef.current) {\n editInputRef.current.focus();\n editInputRef.current.select();\n }\n }, [editingTabName]);\n\n const handleAddMenuOpen = (e: React.MouseEvent<HTMLElement>) => {\n if (props.addMenuItems?.length) setAddMenuAnchor(e.currentTarget);\n else createTab();\n };\n\n const defaultTabIcon = <FileIcon sx={{ fontSize: 15, color: 'text.secondary', flexShrink: 0 }} />;\n\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', height: '100%', overflow: 'hidden' }}>\n <Box sx={{ display: 'flex', alignItems: 'center', borderBottom: '1px solid', borderColor: 'divider', backgroundColor: 'background.paper', minHeight: TAB_HEIGHT, maxHeight: TAB_HEIGHT, overflow: 'hidden' }}>\n <Box sx={{ display: 'flex', alignItems: 'center', flex: 1, overflow: 'auto', backgroundColor: 'background.default', '&::-webkit-scrollbar': { height: 0 } }}>\n {tabs.map((tab) => {\n const isActive = tab.name === activeTabName;\n const isEditing = tab.name === editingTabName;\n return (\n <Box\n key={tab.name}\n onClick={() => {\n if (!isEditing) setActiveTabName(tab.name);\n }}\n onDoubleClick={() => startRename(tab)}\n sx={(theme) => ({\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n minWidth: TAB_MIN_WIDTH,\n maxWidth: TAB_MAX_WIDTH,\n height: TAB_HEIGHT,\n px: 1.5,\n cursor: 'pointer',\n userSelect: 'none',\n borderBottom: '2px solid',\n borderColor: isActive ? 'primary.main' : 'transparent',\n backgroundColor: isActive ? theme.palette.action.selected : theme.palette.background.paper,\n '&:hover': { backgroundColor: isActive ? theme.palette.action.selected : theme.palette.action.hover },\n transition: 'background-color 0.15s, border-color 0.15s',\n })}\n >\n {props.renderTabIcon?.(tab) ?? defaultTabIcon}\n {isEditing ? (\n <TextField\n inputRef={editInputRef}\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={commitRename}\n onKeyDown={handleRenameKeyDown}\n variant=\"standard\"\n size=\"small\"\n slotProps={{\n input: { disableUnderline: true, style: { fontSize: '0.75rem', fontWeight: 500, padding: '0px', height: 20, border: '0px' } },\n root: { style: { padding: '2px 0px 0px 0px', border: '0px' } },\n }}\n sx={{ minWidth: '30px', maxWidth: '80%' }}\n onClick={(e) => e.stopPropagation()}\n />\n ) : (\n <Typography variant=\"caption\" noWrap sx={{ minWidth: '60px', fontWeight: isActive ? 600 : 400, color: isActive ? 'text.primary' : 'text.secondary', fontSize: '0.75rem' }}>\n {tab.name}\n </Typography>\n )}\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n closeTab(tab.name);\n }}\n sx={{ p: 0.2, opacity: isActive ? 0.7 : 0, '&:hover': { opacity: 1 }, transition: 'opacity 0.15s' }}\n aria-label=\"Fechar aba\"\n >\n <CloseIcon sx={{ fontSize: 14 }} />\n </IconButton>\n </Box>\n );\n })}\n </Box>\n\n <IconButton size=\"small\" onClick={handleAddMenuOpen} sx={{ mx: 0.5, flexShrink: 0 }} title=\"Adicionar aba\">\n <AddIcon sx={{ fontSize: 18 }} />\n </IconButton>\n\n {props.addMenuItems && (\n <Menu anchorEl={addMenuAnchor} open={Boolean(addMenuAnchor)} onClose={() => setAddMenuAnchor(null)} anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }} transformOrigin={{ vertical: 'top', horizontal: 'left' }}>\n {props.addMenuItems.map((item, i) => [\n item.dividerBefore && <Box key={`div-${i}`} component=\"li\" sx={{ borderTop: '1px solid', borderColor: 'divider' }} />,\n <MenuItem\n key={item.label}\n onClick={() => {\n createTab(item.contentType);\n setAddMenuAnchor(null);\n }}\n disabled={item.disabled}\n >\n {item.icon && <ListItemIcon>{item.icon}</ListItemIcon>}\n <ListItemText>{item.label}</ListItemText>\n </MenuItem>,\n ])}\n </Menu>\n )}\n </Box>\n\n {tabs.map((tab) => (\n <Box key={tab.id} sx={{ flex: 1, overflow: 'auto', pr: 0, display: tab.name === activeTabName ? 'flex' : 'none', flexDirection: 'column' }}>\n {props.renderContent(tab)}\n </Box>\n ))}\n </Box>\n );\n});\n\nDashboardPadEditor.displayName = 'DashboardPadEditor';\n\nexport default DashboardPadEditor;\n","import React from 'react';\nimport { Box, MenuItem, Select, Stack, Switch, Typography } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport { useComposer, useComposerStore } from '../store/ComposerProvider';\n\nexport interface DatasetOption {\n /** The BigQuery dataset id (`BI_Acme`). */\n dataSetId: string;\n name: string;\n isTemplate?: boolean;\n}\n\nexport interface AgentOption {\n id: string;\n name: string;\n}\n\nexport interface DatasetParameterizationControlsProps {\n /** `'row'` packs the controls inline (the V1 header); `'column'` stacks them (the V2 rail). */\n orientation?: 'row' | 'column';\n /** Datasets the default-dataset picker offers (include the template dataset). */\n datasets: DatasetOption[];\n /** Dataset preselected when the toggle is switched on and none is stored yet. */\n defaultTemplateDataset?: string;\n /** Agents for the agent picker. Omit `agents` to hide the picker. */\n agents?: AgentOption[];\n /** The live agent id (the host's `agentContext.agentConfig.id`). */\n agentId?: string;\n /** Recommended agent while the host has not picked one — shown, never written. */\n recommendedAgentId?: (isDatasetParameterized: boolean) => string | undefined;\n onAgentChange?: (agent: AgentOption) => void;\n}\n\n/**\n * The admin block: \"DataSet Dinâmico\" toggle (writes `isDatasetParameterized`\n * / `defaultDatasetName` on the sketch), the default-dataset picker, and the\n * agent picker (host state — the composer never chooses an agent itself).\n * Render it only for admins; it does not check permissions.\n */\nexport const DatasetParameterizationControls: React.FC<DatasetParameterizationControlsProps> = ({\n orientation = 'row',\n datasets,\n defaultTemplateDataset = 'BI_TemplateModel',\n agents,\n agentId,\n recommendedAgentId,\n onAgentChange,\n}) => {\n const theme = useTheme();\n const store = useComposerStore();\n const isDatasetParameterized = useComposer((s) => s.dashboardDefinition?.isDatasetParameterized ?? false);\n const defaultDatasetName = useComposer((s) => s.dashboardDefinition?.defaultDatasetName);\n\n const handleToggle = (_: unknown, checked: boolean) => {\n store.getState().updateDashboard({\n isDatasetParameterized: checked,\n defaultDatasetName: checked ? (defaultDatasetName ?? defaultTemplateDataset) : undefined,\n });\n };\n\n const visualAgentId = agentId ?? recommendedAgentId?.(isDatasetParameterized) ?? '';\n const isColumn = orientation === 'column';\n\n return (\n <Stack\n direction={isColumn ? 'column' : 'row'}\n alignItems={isColumn ? 'stretch' : 'center'}\n gap={isColumn ? 0.75 : 1}\n sx={isColumn ? {} : { px: 1, py: 0.25, borderLeft: `1px solid ${theme.palette.divider}` }}\n >\n <Stack direction=\"row\" alignItems=\"center\" gap={0.5}>\n <Switch size=\"small\" checked={isDatasetParameterized} onChange={handleToggle} data-env-id=\"dashboard-pad-dataset-parameterized\" />\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', whiteSpace: 'nowrap', fontSize: isColumn ? 11.5 : undefined }}>\n DataSet Dinâmico\n </Typography>\n </Stack>\n\n {isDatasetParameterized && (\n <Select\n size=\"small\"\n value={defaultDatasetName ?? ''}\n onChange={(e) => store.getState().updateDashboard({ defaultDatasetName: e.target.value })}\n displayEmpty\n fullWidth={isColumn}\n sx={{ minWidth: isColumn ? undefined : 160, fontSize: '0.8rem', '& .MuiSelect-select': { py: 0.5 } }}\n renderValue={(v) => (v ? datasets.find((c) => c.dataSetId === v)?.name ?? v : 'Default…')}\n >\n {datasets.map((c) => (\n <MenuItem key={c.dataSetId} value={c.dataSetId} sx={{ fontSize: '0.8rem' }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <span>{c.name}</span>\n {c.isTemplate && (\n <Typography variant=\"caption\" sx={{ color: 'text.disabled' }}>\n (template)\n </Typography>\n )}\n </Box>\n </MenuItem>\n ))}\n </Select>\n )}\n\n {agents && (\n <Box sx={isColumn ? {} : { borderLeft: `1px solid ${theme.palette.divider}`, pl: 1 }}>\n <Select\n size=\"small\"\n value={visualAgentId}\n onChange={(e) => {\n const picked = agents.find((a) => a.id === e.target.value);\n if (picked) onAgentChange?.(picked);\n }}\n displayEmpty\n fullWidth={isColumn}\n sx={{ minWidth: isColumn ? undefined : 180, fontSize: '0.8rem', '& .MuiSelect-select': { py: 0.5 } }}\n renderValue={(v) => agents.find((a) => a.id === v)?.name ?? 'Agent…'}\n data-env-id=\"dashboard-pad-agent-picker\"\n >\n {agents.map((a) => (\n <MenuItem key={a.id} value={a.id} sx={{ fontSize: '0.8rem' }}>\n {a.name}\n </MenuItem>\n ))}\n </Select>\n </Box>\n )}\n </Stack>\n );\n};\n\nexport default DatasetParameterizationControls;\n","import React from 'react';\nimport { Box, Grid, Stack, Typography } from '@mui/material';\nimport { DEFAULT_PAD_HEIGHT_PX, type PadConfig } from '../models/sketchModels';\nimport '../pad/composer.css';\n\nexport interface ExamplePadProps {\n /** Optional surface colour for the pad (a theme token is used when omitted). */\n backgroundColor?: string;\n /** Width of the pad inside its frame (default `'80%'`). */\n width?: string;\n title?: string;\n config: PadConfig[];\n zoom?: number;\n}\n\n/**\n * The agent's sketch preview inside the chat: a 12-column grid of\n * `PadConfig` cells at a reduced zoom. Metric / gauge cells render at a\n * fixed 100px; everything else at its configured height.\n */\nexport const ExamplePad: React.FC<ExamplePadProps> = ({ backgroundColor, zoom = 0.7, width = '80%', title, config }) => (\n <Box sx={(theme) => ({ display: 'inline-flex', justifyContent: 'left', width: '100%', border: `1px solid ${theme.palette.divider}`, borderRadius: '10px', p: 2, maxHeight: '500px', overflow: 'auto' })}>\n <Stack gap={2} sx={(theme) => ({ p: 1, borderRadius: 2, backgroundColor: backgroundColor ?? theme.palette.background.paper, width, zoom })}>\n {title && <Typography variant=\"body1\">{title}</Typography>}\n <Grid container spacing={1}>\n {config.map((c, index) => (\n <Grid key={`example-pad-card-${index}`} size={c.size} maxHeight={300}>\n <Box sx={{ width: '100%', height: c.specificType == 'Gauge' || c.specificType == 'MetricComparison' ? '100px' : `${Math.max(c.height ?? 0, DEFAULT_PAD_HEIGHT_PX)}px` }}>\n {c.card}\n </Box>\n </Grid>\n ))}\n </Grid>\n </Stack>\n </Box>\n);\n\nexport default ExamplePad;\n","import React from 'react';\nimport { Box, Typography } from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport type { CardCategory, CardSpecificType } from '../models/sketchModels';\nimport { useCardTypeIcons } from '../icons/cardTypeIcons';\n\nexport interface ExampleCardSketchProps {\n description?: string;\n name?: string;\n id?: string;\n sx?: SxProps<Theme>;\n category?: CardCategory;\n specificType?: CardSpecificType;\n}\n\n/**\n * Descriptor-style card preview the agent places in an `ExamplePad`\n * (`[name] - description` with the type icon). `padConfigToDashboard`\n * reads its props back when the pad is turned into a sketch.\n */\nexport const ExampleCardSketch: React.FC<ExampleCardSketchProps> = (props) => {\n const icons = useCardTypeIcons();\n const currentType = props.specificType ?? 'Generic';\n const TypeIcon = icons.specificType[currentType] ?? icons.specificType.Generic;\n\n return (\n <Box sx={{ ...(props.sx as object), width: '100%', height: '100%', p: 1, gap: 0.2, textAlign: 'justify' }} className=\"react-grid-placeholder-example\">\n <TypeIcon fontSize=\"small\" sx={{ float: 'left', shapeOutside: 'margin-box', mr: 0.5 }} />\n <Typography sx={{ fontSize: '14px' }}>{`[${props.name}] - ${props.description}`}</Typography>\n </Box>\n );\n};\n\n/** @deprecated legacy spelling the agent instructions still emit — use {@link ExampleCardSketch}. */\nexport const ExampleCardSketh = ExampleCardSketch;\n/** @deprecated legacy spelling — use {@link ExampleCardSketch}. */\nexport const ExampleCardSkath = ExampleCardSketch;\n\nexport default ExampleCardSketch;\n","import React from 'react';\nimport { Box, Grid, Stack, Typography } from '@mui/material';\nimport { DEFAULT_PAD_HEIGHT_PX, type PadConfig } from '../models/sketchModels';\n\nexport interface PrototypePadProps {\n /** Optional surface colour (a theme token is used when omitted). */\n backgroundColor?: string;\n width?: string;\n title?: string;\n config: PadConfig[];\n zoom?: number;\n}\n\n/** Like `ExamplePad`, but for REAL card components: each cell gets its configured height and a 500px cap. */\nexport const PrototypePad: React.FC<PrototypePadProps> = ({ backgroundColor, zoom = 0.8, width = '100%', title, config }) => (\n <Stack gap={2} sx={(theme) => ({ p: 1, borderRadius: 2, backgroundColor: backgroundColor ?? theme.palette.background.paper, width, maxHeight: '1400px' })}>\n {title && <Typography variant=\"body1\">{title}</Typography>}\n <Grid container spacing={1} sx={{ zoom }}>\n {config.map((c, index) => (\n <Grid key={`prototype-pad-card-${index}`} size={c.size}>\n <Box sx={{ width: '100%', height: c.height ?? DEFAULT_PAD_HEIGHT_PX, '& > *': { width: '100%', maxHeight: '500px' } }}>{c.card}</Box>\n </Grid>\n ))}\n </Grid>\n </Stack>\n);\n\nexport default PrototypePad;\n","import React, { useEffect } from 'react';\nimport { useEnvironment } from '@aintela/chat/components';\nimport type { CardSpecificType, PadConfig, SimplePadDefinition, SketchedFilterPad } from '../models/sketchModels';\nimport type { DashboardEnvironment } from '../environment/types';\nimport { ExampleCardSketch } from './ExampleCardSketch';\n\nexport type CardSize = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\n// ─── Card helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Builds one pad cell. Three forms:\n * - `c(size, height, name, specificType, description?)` → an `ExampleCardSketch` preview.\n * - `c(size, height, name, specificType, node)` → metadata kept, `node` drawn.\n * - `c(size, height, node)` → just the node, no metadata.\n */\nexport function c(size: CardSize, height: number, node: React.ReactNode): PadConfig;\nexport function c(size: CardSize, height: number, name: string, specificType: CardSpecificType, description?: string): PadConfig;\nexport function c(size: CardSize, height: number, name: string, specificType: CardSpecificType, node: React.ReactElement): PadConfig;\nexport function c(\n size: CardSize,\n height: number,\n nameOrNode: string | React.ReactNode,\n specificType?: CardSpecificType,\n descriptionOrNode?: string | React.ReactElement,\n): PadConfig {\n if (specificType === undefined) return { size, height, card: nameOrNode as React.ReactNode };\n\n const name = nameOrNode as string;\n if (descriptionOrNode !== undefined && typeof descriptionOrNode !== 'string') {\n return { size, height, name, specificType, card: descriptionOrNode };\n }\n return {\n size,\n height,\n name,\n specificType,\n description: descriptionOrNode,\n card: <ExampleCardSketch name={name} specificType={specificType} description={descriptionOrNode} />,\n };\n}\n\n// ─── Filter helpers ───────────────────────────────────────────────────────────\n\n/** Date-range filter (mandatory by default) — the most common one. */\nexport const dateRange = (i: string, name: string): SketchedFilterPad => ({\n i,\n name,\n filterType: 'DateRangePicker',\n mandatory: true,\n parametersNames: [`${name}_inicio`, `${name}_fim`],\n});\n\n/** Single-date filter. */\nexport const datePicker = (i: string, name: string, mandatory = false): SketchedFilterPad => ({\n i,\n name,\n filterType: 'DatePicker',\n mandatory,\n parametersNames: [name],\n});\n\n/** Auto-complete filter (single or multiple selection). */\nexport const autoComplete = (i: string, name: string, multiple = true, mandatory = false): SketchedFilterPad => ({\n i,\n name,\n filterType: 'AutoComplete',\n mandatory,\n multipleSelection: multiple,\n parametersNames: [name],\n});\n\n/**\n * Pushes `def` into the host's sketch pad on mount, through the ambient\n * `DashboardEnvironment` (`EnvironmentProvider value={useComposerEnvironment()}`).\n * Inside a replayed message the chat library's `InertEnvironmentProvider`\n * turns this into a no-op.\n */\nexport function useDashboardPad(def: SimplePadDefinition, type: 'update' | 'create'): void {\n const env = useEnvironment<Partial<DashboardEnvironment>>();\n useEffect(() => {\n if (type == 'update') env.updateDashboardPad?.(def);\n else env.createDashboardPad?.(def);\n }, []);\n}\n","// Framer-motion variants for the composer's empty → generating morph.\n// Timings come from the design hand-off's transition storyboard — keep\n// them within ±50 ms when iterating. Colours never appear here.\nimport type { Transition, Variants } from 'framer-motion';\n\n/** Hero + suggestions + templates fade. Storyboard 0–180 ms. */\nexport const ambientVariants: Variants = {\n visible: { opacity: 1, y: 0, transition: { duration: 0.18, ease: 'easeOut' } },\n hidden: { opacity: 0, y: -12, transition: { duration: 0.18, ease: 'easeOut' } },\n};\n\n/** Right-side activity panel slide-in. Storyboard 220–320 ms. */\nexport const activityPanelVariants: Variants = {\n hidden: { opacity: 0, x: 16, transition: { duration: 0.1, ease: 'easeOut' } },\n visible: { opacity: 1, x: 0, transition: { duration: 0.32, ease: 'easeOut', delay: 0.22 } },\n};\n\n/** The shared-`layoutId` morph of the prompt between the centred and the docked position. Storyboard 0–280 ms. */\nexport const composerLayoutTransition: Transition = { duration: 0.28, ease: 'easeOut' };\n\n/** Reduced-motion fallbacks — flat 150 ms cross-fades, no transforms. */\nexport const ambientVariantsReduced: Variants = {\n visible: { opacity: 1, transition: { duration: 0.15 } },\n hidden: { opacity: 0, transition: { duration: 0.15 } },\n};\n\nexport const activityPanelVariantsReduced: Variants = {\n hidden: { opacity: 0, transition: { duration: 0.15 } },\n visible: { opacity: 1, transition: { duration: 0.15 } },\n};\n\nexport const composerLayoutTransitionReduced: Transition = { duration: 0.15, ease: 'linear' };\n","import type { CardCategory, CardSpecificType, SketchCardItem } from '../../models/sketchModels';\n\nexport type TemplateCardKind = 'kpi' | 'line' | 'bars' | 'table' | 'donut' | 'heatmap';\n\n/** Template card kind → the sketch's category / specific type. */\nexport const TEMPLATE_KIND_TO_SKETCH: Record<TemplateCardKind, { category: CardCategory; specificType: CardSpecificType }> = {\n kpi: { category: 'Métrica', specificType: 'MetricComparison' },\n line: { category: 'Gráfico', specificType: 'ChartLine' },\n bars: { category: 'Gráfico', specificType: 'ChartBarV' },\n table: { category: 'Tabela', specificType: 'TableAuto' },\n donut: { category: 'Gráfico', specificType: 'ChartDonut' },\n heatmap: { category: 'Tabela', specificType: 'TableHeatmap' },\n};\n\n/** One template cell; `x/y/w/h` are 12-column grid units, as the pad uses them. */\nexport interface TemplateCellSeed {\n name: string;\n kind: TemplateCardKind;\n description: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface ComposerTemplate {\n id: string;\n name: string;\n desc: string;\n /** Highlighted as the recommended pick. */\n recommended?: boolean;\n /** Empty → \"start blank\": no draft is created, the layout just switches to execution mode. */\n cells: TemplateCellSeed[];\n}\n\nexport function templateKinds(t: ComposerTemplate): TemplateCardKind[] {\n return t.cells.map((c) => c.kind);\n}\n\n/** Convert a template into ready-to-store `SketchCardItem`s. */\nexport function seedFromTemplate(template: ComposerTemplate, idPrefix?: string): SketchCardItem[] {\n const prefix = idPrefix ?? `${template.id}-${Date.now()}`;\n return template.cells.map((cell, idx) => {\n const mapped = TEMPLATE_KIND_TO_SKETCH[cell.kind];\n return {\n i: `${prefix}-${idx}`,\n x: cell.x,\n y: cell.y,\n w: cell.w,\n h: cell.h,\n isResizable: true,\n category: mapped.category,\n specificType: mapped.specificType,\n name: cell.name,\n actionDescription: cell.description,\n } as SketchCardItem;\n });\n}\n\n/** The product's default starter templates (Portuguese). Replace through `ComposerView.templates`. */\nexport const defaultComposerTemplates: readonly ComposerTemplate[] = [\n {\n id: 't1',\n name: 'Visão executiva',\n desc: 'KPIs principais + tendência mensal',\n recommended: true,\n cells: [\n { name: 'Receita Total', kind: 'kpi', description: 'Receita acumulada no período vs. período anterior', x: 0, y: 0, w: 4, h: 4 },\n { name: 'Ticket Médio', kind: 'kpi', description: 'Valor médio por pedido', x: 4, y: 0, w: 4, h: 4 },\n { name: 'Conversão', kind: 'kpi', description: '% de leads que viraram clientes', x: 8, y: 0, w: 4, h: 4 },\n { name: 'Tendência Mensal', kind: 'line', description: 'Evolução de receita mês a mês', x: 0, y: 4, w: 12, h: 7 },\n { name: 'Top 10 Clientes', kind: 'table', description: 'Ranking dos clientes com maior receita', x: 0, y: 11, w: 7, h: 7 },\n { name: 'Receita por Canal', kind: 'donut', description: 'Distribuição percentual da receita por canal de venda', x: 7, y: 11, w: 5, h: 7 },\n ],\n },\n {\n id: 't2',\n name: 'Análise comercial',\n desc: 'Funil de vendas + receita por canal',\n cells: [\n { name: 'Pipeline', kind: 'kpi', description: 'Valor total do pipeline aberto', x: 0, y: 0, w: 6, h: 4 },\n { name: 'Win Rate', kind: 'kpi', description: '% de oportunidades fechadas vs. perdidas', x: 6, y: 0, w: 6, h: 4 },\n { name: 'Receita Semanal', kind: 'line', description: 'Receita semanal nos últimos 90 dias', x: 0, y: 4, w: 7, h: 6 },\n { name: 'Vendas por Vendedor', kind: 'bars', description: 'Volume de vendas por representante comercial', x: 7, y: 4, w: 5, h: 6 },\n { name: 'Funil de Vendas', kind: 'line', description: 'Conversão por estágio do funil', x: 0, y: 10, w: 5, h: 6 },\n { name: 'Top Oportunidades', kind: 'table', description: 'Maiores oportunidades em aberto, ordenadas por valor', x: 5, y: 10, w: 7, h: 6 },\n { name: 'Receita por Canal', kind: 'donut', description: 'Distribuição da receita por canal de venda', x: 0, y: 16, w: 5, h: 6 },\n { name: 'Atividade da Equipe', kind: 'heatmap', description: 'Heatmap de atividade por vendedor por dia', x: 5, y: 16, w: 7, h: 6 },\n ],\n },\n {\n id: 't3',\n name: 'Operação',\n desc: 'Volume, ocupação e cancelamentos',\n cells: [\n { name: 'Volume Diário', kind: 'kpi', description: 'Total de operações no dia atual', x: 0, y: 0, w: 4, h: 4 },\n { name: 'Ocupação', kind: 'kpi', description: '% de capacidade utilizada', x: 4, y: 0, w: 4, h: 4 },\n { name: 'Cancelamentos', kind: 'kpi', description: '% de operações canceladas no período', x: 8, y: 0, w: 4, h: 4 },\n { name: 'Volume por Origem', kind: 'bars', description: 'Top origens por volume de operações', x: 0, y: 4, w: 7, h: 6 },\n { name: 'SLA', kind: 'line', description: 'Tempo médio de processamento ao longo do dia', x: 7, y: 4, w: 5, h: 6 },\n { name: 'Pendências', kind: 'table', description: 'Operações pendentes ordenadas por SLA', x: 0, y: 10, w: 7, h: 6 },\n { name: 'Status', kind: 'donut', description: 'Distribuição percentual dos status (Aberto, Em andamento, Concluído)', x: 7, y: 10, w: 5, h: 6 },\n ],\n },\n {\n id: 't4',\n name: 'Em branco',\n desc: 'Comece do zero — adicione cards conforme pensa',\n cells: [],\n },\n];\n\n/** @deprecated legacy name — use {@link defaultComposerTemplates}. */\nexport const STARTER_TEMPLATES = defaultComposerTemplates;\n","import type { Theme } from '@mui/material/styles';\n\n/** The few extra surface tokens the composer chrome uses beyond MUI's standard palette. */\nexport interface ComposerSurfaces {\n /** Raised chip / popover surface. */\n raised: string;\n /** Hover wash. */\n hover: string;\n /** Soft border between rail sections. */\n borderSoft: string;\n /** Monospace family for counters. */\n fontFamilyMono: string;\n}\n\ntype ExtendedPalette = Theme['palette'] & {\n surface?: { raised?: string; hover?: string };\n border?: { soft?: string; default?: string };\n};\n\n/**\n * Reads the chat library's v2 theme extension (`palette.surface`,\n * `palette.border`, `typography.fontFamilyMono`) when the host theme\n * carries it, and falls back to standard MUI tokens when it does not — so\n * the composer renders the same under a plain `createTheme()`.\n */\nexport function resolveComposerSurfaces(theme: Theme): ComposerSurfaces {\n const p = theme.palette as ExtendedPalette;\n const mono = (theme.typography as { fontFamilyMono?: string }).fontFamilyMono;\n return {\n raised: p.surface?.raised ?? p.background.paper,\n hover: p.surface?.hover ?? p.action.hover,\n borderSoft: p.border?.soft ?? p.divider,\n fontFamilyMono: mono ?? 'ui-monospace, SFMono-Regular, Menlo, monospace',\n };\n}\n","import React, { useEffect, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Dialog from '@mui/material/Dialog';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport { Fullscreen, RefreshOutlined } from '@mui/icons-material';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { CloseIcon, DashboardIcon, PanelIcon } from '@aintela/chat/components';\nimport { ScriptDashboardViewer } from '../../viewer/ScriptDashboardViewer';\nimport { ScriptDashboardViewerVertical } from '../../viewer/ScriptDashboardViewerVertical';\nimport { useComposer, useComposerStore } from '../store/ComposerProvider';\nimport { resolveComposerSurfaces } from './surfaces';\n\nexport interface DashboardSidePanelProps {\n /** Share of the execution layout when expanded (`'70%'`). */\n width: string;\n defaultCollapsed?: boolean;\n onCollapseChange?: (collapsed: boolean) => void;\n}\n\nfunction useWindowSize(): { width: number; height: number } {\n const read = () => (typeof window === 'undefined' ? { width: 0, height: 0 } : { width: window.innerWidth, height: window.innerHeight });\n const [size, setSize] = useState(read);\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const onResize = () => setSize(read());\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n return size;\n}\n\nconst pad2 = (n: number) => n.toString().padStart(2, '0');\nconst isoDate = (d: Date) => `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n\n/**\n * The vertical dashboard surface between the chat column and the progress\n * panel. Mounts once the PUBLISHED snapshot carries a `jsFileName`; renders\n * `ScriptDashboardViewer` (expanded, editable) or the vertical viewer\n * (collapsed), plus a fullscreen dialog.\n */\nconst DashboardSidePanelInner: React.FC<DashboardSidePanelProps> = (props) => {\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const store = useComposerStore();\n // Subscribe to the published snapshot, never the live definition the sketch mutates on every drag.\n const jsFileName = useComposer((s) => s.publishedDashboard?.jsFileName ?? null);\n const dashboardDefinition = useComposer((s) => s.publishedDashboard);\n const llmRenderCount = useComposer((s) => s.llmCounter);\n const renderGeneration = useComposer((s) => s.renderGeneration);\n const dashboardId = useComposer((s) => s.publishedDashboard?.id ?? null);\n const dashboardName = useComposer((s) => s.publishedDashboard?.name || 'Dashboard');\n const cardCount = useComposer((s) => s.publishedDashboard?.cards?.length ?? 0);\n\n const [refreshTick, setRefreshTick] = useState(0);\n const [fullscreen, setFullscreen] = useState(false);\n const [collapsed, setCollapsed] = useState(props.defaultCollapsed ?? false);\n const [dashboardParameters, setDashboardParameters] = useState<Record<string, string | string[]>>({});\n\n // Default the mandatory date filters to \"last 30 days\" so the collapsed viewer can run.\n useEffect(() => {\n if (!dashboardDefinition) return;\n const params: Record<string, string | string[]> = {};\n const now = new Date();\n const begin = new Date(now.getTime() - 1000 * 3600 * 24 * 30);\n for (const f of dashboardDefinition.filters ?? []) {\n if (!f.mandatory) continue;\n if (f.filterType == 'DateRangePicker') {\n params[`${f.name}_inicio`] = isoDate(begin);\n params[`${f.name}_fim`] = isoDate(now);\n } else if (f.filterType == 'DatePicker') {\n params[f.name] = isoDate(now);\n }\n }\n setDashboardParameters(params);\n }, [dashboardDefinition?.filters, dashboardDefinition]);\n\n const changeCollapse = (next: boolean) => {\n props.onCollapseChange?.(next);\n setCollapsed(next);\n };\n\n useEffect(() => {\n changeCollapse(props.defaultCollapsed ?? false);\n }, [props.defaultCollapsed]);\n\n const panelWidth = !collapsed ? props.width : '25%';\n const { width: ww, height: wh } = useWindowSize();\n const factorW = ww > wh ? 1.7 : 1;\n const factorH = wh > ww ? 1.7 : 1;\n const expandedWidth = Math.min(ww, wh) * factorW;\n const expandedHeight = Math.min(ww, wh) * factorH;\n const visible = !!jsFileName;\n\n const headerButtonSx = { color: theme.palette.text.secondary, p: 0.5, '&:hover': { color: theme.palette.text.primary, backgroundColor: surfaces.hover } };\n\n return (\n <AnimatePresence initial={false}>\n {visible && dashboardDefinition && (\n <motion.aside\n key=\"dashboard-side-panel\"\n initial={{ width: 0, opacity: 0 }}\n animate={{ width: panelWidth, opacity: 1 }}\n exit={{ width: 0, opacity: 0 }}\n transition={{ duration: 0.32, ease: [0.22, 0.8, 0.32, 1] }}\n style={{ overflow: 'hidden', display: 'inline-flex', flexDirection: 'column', borderLeft: `1px solid ${theme.palette.divider}`, backgroundColor: theme.palette.background.default, minHeight: 0 }}\n >\n <motion.div initial={{ opacity: 0, y: 6 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.28, delay: 0.08, ease: 'easeOut' }} style={{ display: 'inline-flex', flexDirection: 'column', minHeight: 0, position: 'relative', height: '100%' }}>\n <Box sx={{ display: 'inline-flex', alignItems: 'center', width: '100%', gap: 1, px: 1.75, py: 1.25, borderBottom: `1px solid ${theme.palette.divider}`, backgroundColor: theme.palette.background.paper }}>\n <Box sx={{ color: theme.palette.primary.main, display: 'inline-flex' }}>\n <DashboardIcon size={15} />\n </Box>\n <Typography sx={{ color: theme.palette.text.primary, fontWeight: 500, fontSize: 12.5, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{dashboardName}</Typography>\n {!collapsed && (\n <>\n <Typography sx={{ color: theme.palette.text.disabled, fontSize: 11, flexShrink: 0 }}>·</Typography>\n <Typography sx={{ fontFamily: surfaces.fontFamilyMono, color: theme.palette.text.secondary, fontSize: 11, flexShrink: 0 }}>\n {cardCount} {cardCount === 1 ? 'card' : 'cards'}\n </Typography>\n </>\n )}\n <Box sx={{ flex: 1 }} />\n <Tooltip title=\"Atualizar dados (ignora cache)\" placement=\"top\">\n <IconButton size=\"small\" onClick={() => setRefreshTick((c) => c + 1)} sx={headerButtonSx} aria-label=\"Atualizar dados\">\n <RefreshOutlined sx={{ fontSize: 18 }} />\n </IconButton>\n </Tooltip>\n <Tooltip title={collapsed ? 'Expandir' : 'Diminuir'} placement=\"top\">\n <IconButton size=\"small\" onClick={() => changeCollapse(!collapsed)} sx={headerButtonSx} aria-label={collapsed ? 'Expandir' : 'Diminuir'}>\n <PanelIcon size={14} />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Tela cheia\" placement=\"top\">\n <IconButton size=\"small\" onClick={() => setFullscreen(true)} sx={headerButtonSx} aria-label=\"Abrir em tela cheia\">\n <Fullscreen sx={{ fontSize: '18px' }} />\n </IconButton>\n </Tooltip>\n </Box>\n\n <Box sx={{ display: 'inline-flex', height: '100%', width: '100%', minHeight: 0, overflow: 'auto', backgroundColor: theme.palette.background.default }}>\n {dashboardId && !collapsed && (\n <ScriptDashboardViewer\n key={dashboardId}\n dragLocked={false}\n llmRenderCount={llmRenderCount + refreshTick}\n codeGeneration={renderGeneration}\n dashboard={dashboardDefinition}\n editable\n onLayoutCommit={() => store.getState().commitDashboardLayout()}\n onFiltersChanged={(params) => setDashboardParameters(params as Record<string, string>)}\n />\n )}\n {dashboardId && collapsed && (\n <ScriptDashboardViewerVertical key={dashboardId} llmRenderCount={llmRenderCount + refreshTick} codeGeneration={renderGeneration} dashboard={dashboardDefinition} parameters={dashboardParameters} />\n )}\n </Box>\n </motion.div>\n\n <Dialog open={fullscreen} onClose={() => setFullscreen(false)} maxWidth={false} fullScreen slotProps={{ paper: { sx: { backgroundColor: theme.palette.background.default, backgroundImage: 'none', color: theme.palette.text.primary } } }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, px: 2, py: 1.25, borderBottom: `1px solid ${theme.palette.divider}`, backgroundColor: theme.palette.background.paper, flexShrink: 0 }}>\n <Box sx={{ color: theme.palette.primary.main, display: 'inline-flex' }}>\n <DashboardIcon size={16} />\n </Box>\n <Typography sx={{ color: theme.palette.text.primary, fontWeight: 500, fontSize: 13.5 }}>{dashboardName}</Typography>\n <Typography sx={{ color: theme.palette.text.disabled, fontSize: 12 }}>·</Typography>\n <Typography sx={{ fontFamily: surfaces.fontFamilyMono, color: theme.palette.text.secondary, fontSize: 12 }}>\n {cardCount} {cardCount === 1 ? 'card' : 'cards'}\n </Typography>\n <Box sx={{ flex: 1 }} />\n <Tooltip title=\"Fechar\" placement=\"left\">\n <IconButton size=\"small\" onClick={() => setFullscreen(false)} sx={{ ...headerButtonSx, p: 0.75 }} aria-label=\"Fechar\">\n <CloseIcon size={14} />\n </IconButton>\n </Tooltip>\n </Box>\n <Box sx={{ width: '100%', justifyContent: 'center', display: 'inline-flex' }}>\n <Box sx={{ minHeight: 0, overflow: 'hidden', width: expandedWidth, height: expandedHeight, backgroundColor: theme.palette.background.default }}>\n {dashboardId && <ScriptDashboardViewer dragLocked={false} llmRenderCount={llmRenderCount} codeGeneration={renderGeneration} key={dashboardId} dashboard={dashboardDefinition} />}\n </Box>\n </Box>\n </Dialog>\n </motion.aside>\n )}\n </AnimatePresence>\n );\n};\n\nDashboardSidePanelInner.displayName = 'DashboardSidePanel';\n\n/** memo — the panel reads its own store fields, so parent re-renders must not re-mount the heavy viewer. */\nexport const DashboardSidePanel = React.memo(DashboardSidePanelInner);\n\nexport default DashboardSidePanel;\n","// DrawablePrompt — the sketch-shaped `topSlot` over the chat library's\n// `PromptV2` pill. The pill (textarea, send, options) is PromptV2's; this\n// file owns what sits ABOVE it in three states:\n// - no sketch → \"+ Adicionar sketch\" chip\n// - sketch expanded → [LeftRail | DashboardPadSketch]\n// - sketch collapsed → the sketch chip\n// All sketch state lives in the composer store; primitives are selected so\n// zustand bails cheaply during agent streaming.\nimport React, { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport MenuItem from '@mui/material/MenuItem';\nimport MenuList from '@mui/material/MenuList';\nimport Popover from '@mui/material/Popover';\nimport ToggleButton from '@mui/material/ToggleButton';\nimport ToggleButtonGroup from '@mui/material/ToggleButtonGroup';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport EditIcon from '@mui/icons-material/EditOutlined';\nimport { useTheme } from '@mui/material/styles';\nimport type { Theme } from '@mui/material/styles';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { PanelIcon, PlusIcon, PromptV2, SearchIcon } from '@aintela/chat/components';\n\nimport { CARD_TYPE_CATALOG, FILTER_TYPE_CATALOG, groupCardCatalog } from '../models/catalog';\nimport type { CardCategory, CardSpecificType, FilterType, SketchedFilter } from '../models/sketchModels';\nimport { joinClientSideChanges } from '../models/sketchModels';\nimport { useCardTypeIcons } from '../icons/cardTypeIcons';\nimport { useComposer, useComposerStore } from '../store/ComposerProvider';\nimport { DashboardPadSketch, type DashboardPadHandle } from '../pad/DashboardPadSketch';\nimport { FilterSketch } from '../pad/FilterSketch';\nimport { TitleSketch } from '../pad/TitleSketch';\nimport { resolveComposerSurfaces, type ComposerSurfaces } from './surfaces';\n\nexport interface DrawablePromptProps {\n /** The \"+ Adicionar sketch\" CTA — the view creates a server draft. */\n onCreateSketch?: () => void;\n zoomLevel: number;\n /** Runs before `PromptV2` sends (the view ensures a draft exists). */\n onBeforeSend?: (text: string) => void | Promise<void>;\n /** Controlled expand / collapse. */\n sketchExpanded?: boolean;\n onSketchExpandedChange?: (next: boolean) => void;\n /** Fills the textarea (no auto-send). */\n seedDraft?: string | null;\n /** Compact textarea (execution layout). */\n compact?: boolean;\n bottomSlot?: React.ReactNode;\n /** Rendered at the bottom of the rail (the admin dataset / agent block). */\n datasetControls?: React.ReactNode;\n renderDescription?: (text: string) => React.ReactNode;\n}\n\nconst groupedCatalog = groupCardCatalog(CARD_TYPE_CATALOG);\nconst EMPTY_FILTERS: SketchedFilter[] = [];\n\nconst RailSectionLabel: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <Typography sx={(theme) => ({ fontSize: 9.5, color: theme.palette.text.disabled, textTransform: 'uppercase', letterSpacing: 0.6, fontWeight: 500, lineHeight: 1.6 })}>{children}</Typography>\n);\n\nfunction diffById<T extends { i: string }>(live: ReadonlyArray<T>, published: ReadonlyArray<T>): { added: number; removed: number; modified: number } {\n const liveById = new Map(live.map((it) => [it.i, it] as const));\n const pubById = new Map(published.map((it) => [it.i, it] as const));\n let added = 0, removed = 0, modified = 0;\n for (const [id, item] of liveById) {\n const prev = pubById.get(id);\n if (!prev) added++;\n else if (JSON.stringify(item) !== JSON.stringify(prev)) modified++;\n }\n for (const id of pubById.keys()) if (!liveById.has(id)) removed++;\n return { added, removed, modified };\n}\n\nfunction railActionPill(theme: Theme, surfaces: ComposerSurfaces, disabled: boolean) {\n return {\n background: surfaces.raised,\n border: `1px solid ${theme.palette.divider}`,\n color: theme.palette.text.primary,\n fontFamily: theme.typography.fontFamily,\n fontSize: 11,\n fontWeight: 500,\n px: 1,\n py: 0.625,\n borderRadius: 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.45 : 1,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: 0.625,\n transition: 'filter .12s, background-color .12s, border-color .12s, color .12s',\n '&:hover': disabled ? undefined : { backgroundColor: surfaces.hover },\n };\n}\n\n// ── Left rail — name, actions, filters, layout ──\ninterface LeftRailProps {\n locked: boolean;\n name: string;\n onNameChange: (name: string) => void;\n layoutType: 'Boxed' | 'Naked';\n onLayoutTypeChange: (next: 'Boxed' | 'Naked') => void;\n onAddGenericCard: () => void;\n onAddTypedCard: (category: CardCategory, specificType: CardSpecificType) => void;\n onAddFilter: (filterType: FilterType) => void;\n cardsOpened?: boolean;\n filters: SketchedFilter[];\n onEditFilter: (updated: SketchedFilter) => void;\n onDeleteFilter: (filterId: string) => void;\n datasetControls?: React.ReactNode;\n}\n\nconst LeftRail: React.FC<LeftRailProps> = ({ locked, name, onNameChange, layoutType, onLayoutTypeChange, onAddGenericCard, onAddTypedCard, onAddFilter, cardsOpened, filters, onEditFilter, onDeleteFilter, datasetControls }) => {\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const icons = useCardTypeIcons();\n const [cardAnchor, setCardAnchor] = useState<HTMLElement | null>(null);\n const [filterAnchor, setFilterAnchor] = useState<HTMLElement | null>(null);\n const cardRef = useRef<HTMLButtonElement>(null);\n const [railCollapsed, setRailCollapsed] = useState(false);\n\n useEffect(() => {\n if (cardRef.current && cardsOpened) cardRef.current.click();\n }, [cardsOpened]);\n\n const sectionSx = { display: 'flex', flexDirection: 'column' as const, gap: 0.5, px: 1, pt: 1, pb: 0.875, borderBottom: `1px solid ${surfaces.borderSoft}` };\n const menuItemSx = { fontSize: 12, color: theme.palette.text.primary, '&:hover': { backgroundColor: surfaces.hover } };\n const popoverPaperSx = { backgroundColor: surfaces.raised, border: `1px solid ${theme.palette.divider}`, ml: 0.5, minWidth: 260, maxHeight: 420, overflow: 'auto' };\n\n return (\n <motion.aside\n animate={{ width: railCollapsed ? 44 : '12vw' }}\n transition={{ duration: 0.22, ease: [0.22, 0.8, 0.32, 1] }}\n style={{ flexShrink: 0, display: 'flex', flexDirection: 'column', borderRight: `1px solid ${surfaces.borderSoft}`, backgroundColor: theme.palette.background.paper, overflow: 'hidden', minHeight: 0 }}\n >\n <Box sx={{ flexShrink: 0, display: 'flex', alignItems: 'center', gap: 0.625, pl: 1, pr: 1, py: 1.5, borderBottom: `1px solid ${surfaces.borderSoft}` }}>\n <Tooltip title={railCollapsed ? 'Expandir painel' : 'Recolher painel'} placement=\"right\">\n <IconButton size=\"small\" onClick={() => setRailCollapsed((v) => !v)} sx={{ color: theme.palette.text.primary, p: 0.5, flexShrink: 0, '&:hover': { color: theme.palette.primary.main } }} aria-label={railCollapsed ? 'Expandir painel' : 'Recolher painel'}>\n <PanelIcon size={13} />\n </IconButton>\n </Tooltip>\n {!railCollapsed && (\n <Typography sx={{ color: theme.palette.text.primary, fontWeight: 500, fontSize: 11.5, lineHeight: 1.2, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>Desenhe seu prompt</Typography>\n )}\n </Box>\n\n {!railCollapsed && (\n <Box sx={{ flex: 1, minHeight: 0, overflowY: 'auto', display: 'flex', flexDirection: 'column' }}>\n <Box sx={{ ...sectionSx, gap: 0.25 }}>\n <RailSectionLabel>Nome</RailSectionLabel>\n <Box sx={{ color: theme.palette.text.primary, fontFamily: theme.typography.fontFamily, fontSize: 12 }}>\n <TitleSketch placeHolderText=\"novo dashboard\" onEdit={onNameChange} text={name} fontSize={12} />\n </Box>\n </Box>\n\n <Box sx={{ ...sectionSx, p: 1 }}>\n <Box\n ref={cardRef}\n component=\"button\"\n onClick={(e) => setCardAnchor(e.currentTarget as HTMLElement)}\n disabled={locked}\n data-env-id=\"dashboardpad-add-card\"\n data-env-key=\"dashboardpad-add-card-dropdown\"\n className=\"llm-env-target llm-env-dashboard-action\"\n sx={railActionPill(theme, surfaces, locked)}\n >\n <PlusIcon size={11} />\n <Box component=\"span\">Card</Box>\n </Box>\n <Box component=\"button\" onClick={(e) => setFilterAnchor(e.currentTarget as HTMLElement)} disabled={locked} data-env-id=\"dashboardpad-add-filter\" className=\"llm-env-target llm-env-dashboard-action\" sx={railActionPill(theme, surfaces, locked)}>\n <SearchIcon size={11} />\n <Box component=\"span\">Filtro</Box>\n </Box>\n </Box>\n\n {filters.length > 0 ? (\n <Box sx={{ p: 1, display: 'flex', flexDirection: 'column', gap: 0.625 }}>\n <RailSectionLabel>Filtros · {filters.length}</RailSectionLabel>\n {filters.map((f) => (\n <FilterSketch key={f.i} filter={f} onEdit={onEditFilter} onDelete={onDeleteFilter} />\n ))}\n </Box>\n ) : (\n <Box sx={{ p: 1, display: 'flex', alignItems: 'flex-start' }}>\n <Typography sx={{ fontSize: 10, color: theme.palette.text.disabled, fontStyle: 'italic', lineHeight: 1.4 }}>\n Nenhum filtro ainda. Use <b>+ Filtro</b> para adicionar.\n </Typography>\n </Box>\n )}\n\n <Box sx={{ ...sectionSx, borderBottom: 'none', borderTop: `1px solid ${surfaces.borderSoft}` }}>\n <RailSectionLabel>Layout</RailSectionLabel>\n <ToggleButtonGroup\n exclusive\n size=\"small\"\n value={layoutType}\n onChange={(_, v: 'Boxed' | 'Naked' | null) => v && onLayoutTypeChange(v)}\n disabled={locked}\n data-env-id=\"dashboard-pad-layout-toggle\"\n className=\"llm-env-target llm-env-layout-toggle\"\n sx={{\n height: 24,\n '& .MuiToggleButton-root': {\n flex: 1,\n px: 0.875,\n py: 0,\n fontSize: 10.5,\n textTransform: 'none',\n color: theme.palette.text.secondary,\n border: `1px solid ${theme.palette.divider}`,\n '&.Mui-selected': { color: theme.palette.text.primary, backgroundColor: surfaces.hover },\n '&.Mui-selected:hover': { backgroundColor: surfaces.hover },\n },\n }}\n >\n <ToggleButton value=\"Boxed\" data-env-id=\"dashboard-pad-layout-boxed\">Boxed</ToggleButton>\n <ToggleButton value=\"Naked\" data-env-id=\"dashboard-pad-layout-naked\">Naked</ToggleButton>\n </ToggleButtonGroup>\n </Box>\n\n {datasetControls && (\n <Box sx={{ ...sectionSx, borderBottom: 'none', borderTop: `1px solid ${surfaces.borderSoft}` }}>\n <RailSectionLabel>Dataset / Agent</RailSectionLabel>\n {datasetControls}\n </Box>\n )}\n </Box>\n )}\n\n <Popover open={Boolean(cardAnchor)} anchorEl={cardAnchor} onClose={() => setCardAnchor(null)} anchorOrigin={{ vertical: 'top', horizontal: 'right' }} transformOrigin={{ vertical: 'top', horizontal: 'left' }} slotProps={{ paper: { sx: popoverPaperSx } }}>\n <MenuList dense>\n <MenuItem\n onClick={() => {\n onAddGenericCard();\n setCardAnchor(null);\n }}\n sx={menuItemSx}\n >\n <ListItemIcon sx={{ color: theme.palette.primary.main, minWidth: 28 }}>\n <PlusIcon size={14} />\n </ListItemIcon>\n <ListItemText primaryTypographyProps={{ fontSize: 12, fontWeight: 500 }} secondaryTypographyProps={{ fontSize: 10.5, color: theme.palette.text.disabled }} primary=\"Genérico\" secondary=\"Card sem tipo definido — você ou o agente preenche depois\" />\n </MenuItem>\n <Divider sx={{ borderColor: surfaces.borderSoft }} />\n {Object.entries(groupedCatalog).map(([category, items], gi) => {\n const CategoryIcon = icons.category[category as CardCategory];\n return (\n <Box key={category}>\n {gi > 0 && <Divider sx={{ borderColor: surfaces.borderSoft }} />}\n <Typography sx={{ px: 2, pt: 1, pb: 0.5, fontSize: 10, textTransform: 'uppercase', letterSpacing: 0.6, color: theme.palette.text.disabled, display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <CategoryIcon fontSize=\"inherit\" /> {category}\n </Typography>\n {items.map((item) => {\n const Icon = icons.specificType[item.specificType];\n return (\n <MenuItem\n key={item.specificType}\n onClick={() => {\n onAddTypedCard(item.category, item.specificType);\n setCardAnchor(null);\n }}\n sx={menuItemSx}\n >\n <ListItemIcon sx={{ color: theme.palette.text.secondary, minWidth: 28 }}>\n <Icon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primaryTypographyProps={{ fontSize: 12 }}>{item.label}</ListItemText>\n </MenuItem>\n );\n })}\n </Box>\n );\n })}\n </MenuList>\n </Popover>\n\n <Popover open={Boolean(filterAnchor)} anchorEl={filterAnchor} onClose={() => setFilterAnchor(null)} anchorOrigin={{ vertical: 'top', horizontal: 'right' }} transformOrigin={{ vertical: 'top', horizontal: 'left' }} slotProps={{ paper: { sx: { ...popoverPaperSx, minWidth: 220, maxHeight: undefined } } }}>\n <MenuList dense>\n {FILTER_TYPE_CATALOG.map((ft) => {\n const FIcon = icons.filterType[ft.filterType];\n return (\n <MenuItem\n key={ft.filterType}\n onClick={() => {\n onAddFilter(ft.filterType);\n setFilterAnchor(null);\n }}\n sx={menuItemSx}\n >\n <ListItemIcon sx={{ color: theme.palette.text.secondary, minWidth: 28 }}>\n <FIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primaryTypographyProps={{ fontSize: 12 }}>{ft.label}</ListItemText>\n </MenuItem>\n );\n })}\n </MenuList>\n </Popover>\n </motion.aside>\n );\n};\n\n// ── Sketch chips ──\ninterface SketchChipProps {\n cardCount: number;\n expanded?: boolean;\n locked: boolean;\n onToggle?: () => void;\n onCreate?: () => void;\n /** Bumped when the agent modified the sketch — replays the pulse + tooltip. */\n pulseTick?: number;\n}\n\nfunction usePulseTooltip(pulseTick: number): boolean {\n const [tooltipOpen, setTooltipOpen] = useState(false);\n const firstPulseRef = useRef(true);\n useEffect(() => {\n if (firstPulseRef.current) {\n firstPulseRef.current = false;\n return;\n }\n setTooltipOpen(pulseTick > 0);\n const timer = window.setTimeout(() => setTooltipOpen(false), 2500);\n return () => window.clearTimeout(timer);\n }, [pulseTick]);\n return tooltipOpen;\n}\n\nconst chipMotionProps = (theme: Theme, surfaces: ComposerSurfaces, pulseTick: number) => ({\n initial: pulseTick > 0 ? { scale: 1.18, backgroundColor: theme.palette.primary.main, borderColor: theme.palette.primary.main } : false,\n animate: { scale: 1, backgroundColor: surfaces.raised, borderColor: theme.palette.divider },\n transition: { duration: 2, ease: [0.22, 0.8, 0.32, 1] as [number, number, number, number] },\n style: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n backgroundColor: surfaces.raised,\n borderStyle: 'solid',\n borderWidth: 1,\n borderColor: theme.palette.divider,\n borderRadius: 999,\n paddingLeft: 10,\n paddingRight: 4,\n paddingTop: 3,\n paddingBottom: 3,\n fontSize: 11,\n color: theme.palette.text.primary,\n transformOrigin: 'center center',\n } as React.CSSProperties,\n});\n\nconst ChipHead: React.FC<{ cardCount: number; surfaces: ComposerSurfaces }> = ({ cardCount, surfaces }) => (\n <>\n <Box sx={(theme) => ({ color: theme.palette.primary.main, display: 'inline-flex' })}>\n <PanelIcon size={12} />\n </Box>\n <Box component=\"span\" sx={{ fontWeight: 500 }}>Sketch</Box>\n <Box component=\"span\" sx={(theme) => ({ color: theme.palette.text.disabled })}>·</Box>\n <Box component=\"span\" sx={(theme) => ({ fontFamily: surfaces.fontFamilyMono, color: theme.palette.text.secondary })}>\n {cardCount} {cardCount === 1 ? 'card' : 'cards'}\n </Box>\n </>\n);\n\nconst SketchChip: React.FC<SketchChipProps> = ({ cardCount, expanded, locked, onToggle, pulseTick = 0 }) => {\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const tooltipOpen = usePulseTooltip(pulseTick);\n return (\n <Tooltip\n title=\"O agente atualizou o sketch — clique em editar para ver\"\n placement=\"top-end\"\n arrow\n slotProps={{ popper: { modifiers: [{ name: 'offset', options: { offset: [0, 5] } }] }, tooltip: { sx: { backgroundColor: surfaces.raised, border: `1px solid ${theme.palette.primary.dark}`, color: theme.palette.primary.dark } } }}\n open={tooltipOpen}\n disableHoverListener\n disableFocusListener\n disableTouchListener\n >\n <motion.div key={pulseTick + locked.toString()} {...chipMotionProps(theme, surfaces, pulseTick)}>\n <ChipHead cardCount={cardCount} surfaces={surfaces} />\n <Tooltip title={expanded ? 'Recolher sketch' : 'Editar sketch'} placement=\"top\">\n <Box\n component=\"button\"\n onClick={onToggle}\n disabled={locked}\n sx={{\n background: surfaces.raised,\n border: `1px solid ${theme.palette.divider}`,\n color: theme.palette.text.primary,\n fontFamily: theme.typography.fontFamily,\n fontSize: 11.5,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.625,\n pl: 1,\n pr: 1.25,\n py: 0.625,\n borderRadius: 999,\n cursor: locked ? 'not-allowed' : 'pointer',\n opacity: locked ? 0.45 : 1,\n transition: 'background-color 2s, border-color 2s',\n '&:hover': locked ? undefined : { backgroundColor: surfaces.hover, borderColor: theme.palette.primary.main },\n }}\n >\n {expanded ? <PanelIcon size={13} /> : <EditIcon sx={{ fontSize: 14 }} />}\n </Box>\n </Tooltip>\n </motion.div>\n </Tooltip>\n );\n};\n\nconst AddSketchChip: React.FC<SketchChipProps> = ({ cardCount, locked, onCreate, pulseTick = 0 }) => {\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const tooltipOpen = usePulseTooltip(pulseTick);\n const disabled = locked || !onCreate;\n return (\n <Tooltip\n title=\"O agente atualizou o sketch — clique em editar para ver\"\n placement=\"top\"\n slotProps={{ popper: { modifiers: [{ name: 'offset', options: { offset: [0, 5] } }] }, tooltip: { sx: { backgroundColor: surfaces.raised, color: theme.palette.primary.main } } }}\n open={tooltipOpen}\n disableHoverListener\n disableFocusListener\n disableTouchListener\n >\n <motion.div key={pulseTick} {...chipMotionProps(theme, surfaces, pulseTick)}>\n <ChipHead cardCount={cardCount} surfaces={surfaces} />\n <Box\n component=\"button\"\n onClick={onCreate}\n disabled={disabled}\n data-env-id=\"dashboard-pad-new\"\n className=\"llm-env-target llm-env-dashboard-action\"\n sx={{\n background: surfaces.raised,\n border: 'none',\n color: theme.palette.text.primary,\n fontFamily: theme.typography.fontFamily,\n fontSize: 11.5,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.625,\n pl: 1,\n pr: 1.25,\n py: 0.625,\n borderRadius: 999,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.45 : 1,\n transition: 'background-color .12s, border-color .12s',\n '&:hover': disabled ? undefined : { backgroundColor: surfaces.hover, borderColor: theme.palette.primary.main },\n }}\n >\n <Box sx={{ color: theme.palette.primary.main, display: 'inline-flex', backgroundColor: theme.palette.background.default, borderRadius: 999, p: 0.25, border: `1px solid ${surfaces.borderSoft}` }}>\n <PlusIcon size={11} />\n </Box>\n <Box component=\"span\" sx={{ fontWeight: 500 }}>Adicionar sketch</Box>\n <Box component=\"span\" sx={{ color: theme.palette.text.disabled, fontFamily: surfaces.fontFamilyMono, fontSize: 10.5 }}>desenhe o layout antes de pedir</Box>\n </Box>\n </motion.div>\n </Tooltip>\n );\n};\n\n// ── The prompt ──\nconst DrawablePromptInner = forwardRef<HTMLDivElement, DrawablePromptProps>(({ onCreateSketch, onBeforeSend, sketchExpanded: sketchExpandedProp, bottomSlot: _bottomSlot, zoomLevel, onSketchExpandedChange, seedDraft, compact, datasetControls, renderDescription }, ref) => {\n const store = useComposerStore();\n const [iSeedDraft, setISeedDraft] = useState(seedDraft);\n useEffect(() => {\n setISeedDraft(seedDraft);\n }, [seedDraft]);\n\n const padHandleRef = useRef<DashboardPadHandle | null>(null);\n const agentPulseTick = useComposer((s) => s.agentPulseTick);\n const dashboardId = useComposer((s) => s.dashboardDefinition?.id ?? null);\n const dashboardName = useComposer((s) => s.dashboardDefinition?.name ?? '');\n const cardCount = useComposer((s) => s.dashboardDefinition?.cards?.length ?? 0);\n const filterCount = useComposer((s) => s.dashboardDefinition?.filters?.length ?? 0);\n const sessionId = useComposer((s) => s.currentSessionId);\n const filters = useComposer((s) => s.dashboardDefinition?.filters) ?? EMPTY_FILTERS;\n const layoutType = useComposer((s) => (s.dashboardDefinition?.layoutType ?? 'Boxed') as 'Boxed' | 'Naked');\n const turnOpen = useComposer((s) => s.turnOpen);\n const clientSideChanges = useComposer((s) => s.dashboardDefinition?.clientSideChanges ?? null);\n const liveDashboard = useComposer((s) => s.dashboardDefinition);\n const lastSentDashboard = useComposer((s) => s.lastSentDashboard);\n const [cardsOpened, setCardOpened] = useState(false);\n\n // Content diff against the LAST SENT snapshot (not the lazily published one) — the chip must survive the viewer's debounce.\n const queuedDiff = useMemo<{ hasAny: boolean; text: string | null }>(() => {\n if (!liveDashboard && !lastSentDashboard) return { hasAny: false, text: null };\n if (!liveDashboard || !lastSentDashboard) return { hasAny: true, text: 'Sketch alterado' };\n const cards = diffById(liveDashboard.cards ?? [], lastSentDashboard.cards ?? []);\n const fl = diffById(liveDashboard.filters ?? [], lastSentDashboard.filters ?? []);\n const nameChanged = (liveDashboard.name ?? '') !== (lastSentDashboard.name ?? '');\n const layoutChanged = (liveDashboard.layoutType ?? 'Boxed') !== (lastSentDashboard.layoutType ?? 'Boxed');\n const itemTotal = cards.added + cards.removed + cards.modified + fl.added + fl.removed + fl.modified;\n if (itemTotal === 0 && !nameChanged && !layoutChanged) return { hasAny: false, text: null };\n\n const parts: string[] = [];\n if (cards.added) parts.push(`+${cards.added} ${cards.added === 1 ? 'card' : 'cards'}`);\n if (cards.removed) parts.push(`-${cards.removed} ${cards.removed === 1 ? 'card' : 'cards'}`);\n if (cards.modified) parts.push(`${cards.modified} ${cards.modified === 1 ? 'card alterado' : 'cards alterados'}`);\n if (fl.added) parts.push(`+${fl.added} ${fl.added === 1 ? 'filtro' : 'filtros'}`);\n if (fl.removed) parts.push(`-${fl.removed} ${fl.removed === 1 ? 'filtro' : 'filtros'}`);\n if (fl.modified) parts.push(`${fl.modified} ${fl.modified === 1 ? 'filtro alterado' : 'filtros alterados'}`);\n if (parts.length === 0) parts.push('Sketch alterado');\n return { hasAny: true, text: parts.join(' · ') };\n }, [liveDashboard, lastSentDashboard]);\n\n const hasUnsentChanges = queuedDiff.hasAny;\n const queuedChangesText = queuedDiff.text;\n const hasSketch = !!dashboardId || cardCount > 0 || filterCount > 0;\n\n const handleOnBefore = async (text: string) => {\n setISeedDraft('');\n store.getState().commitForSend();\n if (onBeforeSend) await onBeforeSend(text);\n };\n\n const sketchExpanded = sketchExpandedProp ?? false;\n const setSketchExpanded = (next: boolean) => onSketchExpandedChange?.(next);\n\n const handleForceOpenCard = () => {\n setCardOpened(true);\n setTimeout(() => setCardOpened(false), 1000);\n };\n\n const handleNameChange = (name: string) => {\n const finalName = name.length === 0 ? 'Untitled Dashboard' : name;\n store.getState().recordSketchChange('dashboard:name', `Renamed dashboard to '${finalName}'`);\n store.getState().updateDashboard({ name: finalName });\n };\n const handleLayoutTypeChange = (next: 'Boxed' | 'Naked') => {\n store.getState().recordSketchChange('dashboard:layoutType', `Set layout type to ${next}`);\n store.getState().updateDashboard({ layoutType: next });\n };\n const handleAddGenericCard = () => padHandleRef.current?.addGenericCell();\n const handleAddTypedCard = (cat: CardCategory, spec: CardSpecificType) => padHandleRef.current?.addTypedCell(cat, spec, '');\n const handleAddFilter = (ft: FilterType) => padHandleRef.current?.handleAddFilter(ft);\n\n const handleEditFilter = (updated: SketchedFilter) => {\n const current = store.getState().dashboardDefinition?.filters ?? [];\n store.getState().recordSketchChange(`filter:${updated.i}:edit`, `Edited filter '${updated.name}'`);\n store.getState().updateDashboard({ filters: current.map((f) => (f.i === updated.i ? { ...updated } : f)) });\n };\n const handleDeleteFilter = (filterId: string) => {\n const current = store.getState().dashboardDefinition?.filters ?? [];\n const target = current.find((f) => f.i === filterId);\n store.getState().recordSketchChange(`filter:${filterId}:delete`, `Deleted filter '${target?.name ?? filterId}'`);\n store.getState().updateDashboard({ filters: current.filter((f) => f.i !== filterId) });\n };\n\n const topSlot = (\n <Box sx={{ display: 'flex', flexDirection: 'column' }}>\n <AnimatePresence mode=\"wait\" initial={false}>\n {!hasSketch && !sketchExpanded && (\n <motion.div key=\"add-sketch\" initial={{ opacity: 0, height: 0 }} animate={{ opacity: 1, height: 'auto' }} exit={{ opacity: 0, height: 0 }} transition={{ duration: 0.18, ease: 'easeOut' }}>\n <Box sx={{ px: 1.25, py: 1, display: 'flex', alignItems: 'center' }}>\n <AddSketchChip onCreate={onCreateSketch} locked={turnOpen} cardCount={cardCount} pulseTick={agentPulseTick} />\n </Box>\n </motion.div>\n )}\n\n {sketchExpanded && (\n <motion.div key=\"sketch-expanded\" style={{ overflow: 'hidden' }} initial={{ opacity: 0, height: 0 }} animate={{ opacity: 1, height: 'auto' }} exit={{ opacity: 0, height: 0 }} transition={{ duration: 0.25, ease: 'easeOut' }}>\n <Box sx={(theme) => ({ flexShrink: 0, height: 'min(50vh, 300px)', minHeight: 280, display: 'flex', flexDirection: 'row', overflow: 'auto', background: theme.palette.background.default })}>\n <LeftRail\n locked={turnOpen}\n name={dashboardName}\n onNameChange={handleNameChange}\n layoutType={layoutType}\n onLayoutTypeChange={handleLayoutTypeChange}\n onAddGenericCard={handleAddGenericCard}\n onAddTypedCard={handleAddTypedCard}\n onAddFilter={handleAddFilter}\n cardsOpened={cardsOpened}\n filters={filters}\n onEditFilter={handleEditFilter}\n onDeleteFilter={handleDeleteFilter}\n datasetControls={datasetControls}\n />\n <Box sx={{ flex: 1, pt: 1, minWidth: 0, display: 'flex', flexDirection: 'column' }}>\n <DashboardPadSketch ref={padHandleRef} zoomLevel={zoomLevel} onAddCard={handleForceOpenCard} renderId=\"composer-pad\" hideInternalHeader hideFiltersInSketch renderDescription={renderDescription} />\n </Box>\n </Box>\n </motion.div>\n )}\n </AnimatePresence>\n\n {hasSketch && (\n <motion.div\n // Stable key — never key on `turnOpen` (a re-mount mid-exit re-anchors the tooltip portal at 0,0).\n key=\"filled-sketch\"\n initial={{ opacity: sketchExpanded ? 0 : 1, height: 0, display: sketchExpanded ? 'flex' : 'none' }}\n animate={{ opacity: sketchExpanded ? 0 : 1, height: 'auto', display: sketchExpanded ? 'none' : 'flex' }}\n exit={{ opacity: hasSketch ? 1 : 0, height: 0, display: 'flex' }}\n transition={{ duration: 0.5, ease: 'easeInOut' }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, px: 1.25, py: 0.875 }}>\n <SketchChip cardCount={cardCount} expanded={sketchExpanded} locked={turnOpen} onToggle={() => setSketchExpanded(!sketchExpanded)} pulseTick={agentPulseTick} />\n <Typography sx={(theme) => ({ color: theme.palette.text.primary, fontWeight: 500, fontSize: 11.5, lineHeight: 1.2, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' })}>{dashboardName}</Typography>\n </Box>\n </motion.div>\n )}\n </Box>\n );\n\n const submitTooltipTitle = useMemo(() => {\n const header = 'Será enviado junto com a mensagem';\n const body = joinClientSideChanges(clientSideChanges ?? undefined);\n return body ? `${header}:\\n\\n${body}` : header;\n }, [clientSideChanges]);\n\n const submitAdornment = queuedChangesText ? (\n <Tooltip placement=\"top\" title={submitTooltipTitle} slotProps={{ tooltip: { sx: { whiteSpace: 'pre-line', maxWidth: 360, fontSize: 11.5, lineHeight: 1.4, fontFamily: (theme) => theme.typography.fontFamily } } }}>\n <Box sx={(theme) => ({ display: 'inline-flex', alignItems: 'center', gap: 0.5, px: 0.875, py: 0.25, mr: 0.75, borderRadius: 999, border: `1px solid ${theme.palette.primary.dark}`, color: theme.palette.primary.main, fontFamily: theme.typography.fontFamily, fontSize: 10.5, lineHeight: 1.2, whiteSpace: 'nowrap', pointerEvents: 'auto' })}>\n {queuedChangesText}\n </Box>\n </Tooltip>\n ) : null;\n\n return (\n <PromptV2\n ref={ref}\n key={sessionId ?? 'no-session'}\n seedDraft={iSeedDraft}\n showLastPrompts={false}\n topSlot={topSlot}\n topSlotCollapsible={hasSketch || sketchExpanded}\n topSlotExpanded={sketchExpanded}\n onTopSlotExpandedChange={setSketchExpanded}\n onBeforeSend={handleOnBefore}\n sendButtonProps={{ 'data-env-id': 'dashboard-pad-compose', className: 'llm-env-target llm-env-dashboard-action' } as React.ButtonHTMLAttributes<HTMLButtonElement>}\n allowEmptyDraft={hasUnsentChanges}\n submitAdornment={submitAdornment}\n inputMinHeight={sketchExpanded || compact ? 40 : 120}\n />\n );\n});\n\nDrawablePromptInner.displayName = 'DrawablePrompt';\n\n/** The composer's prompt: `PromptV2` with the sketch pad riding in its `topSlot`. Needs `ComposerProvider` and the host's `AiChatProvider`. */\nexport const DrawablePrompt = React.memo(DrawablePromptInner);\n\nexport default DrawablePrompt;\n","/** One splash suggestion: the short label shown, and the fuller prompt a click drops into the textarea. */\nexport interface ComposerSuggestion {\n label: string;\n prompt: string;\n}\n\n/**\n * The product's default suggestions (Portuguese, travel BI). Pass your own\n * through `ComposerView.suggestions` / `EntryEmptyState.suggestions`.\n */\nexport const defaultComposerSuggestions: readonly ComposerSuggestion[] = [\n {\n label: 'Compare vendas e reservas por semana, focando em rotas internacionais',\n prompt: 'Crie uma sugestão de dashboard de vendas e reservas por semana, focando em rotas nacionais. Envie um rascunho pronto para carregar na minha interface.',\n },\n {\n label: 'Me ajude a entender como o Dashboard Composer funciona',\n prompt: 'Me ajude a entender como o Dashboard Composer funciona. Apresente os tipos de gráficos e depois envie um guia ao vivo, do passo a passo da interface',\n },\n];\n","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport { defaultComposerSuggestions, type ComposerSuggestion } from './data/suggestions';\nimport { defaultComposerTemplates, templateKinds, type ComposerTemplate, type TemplateCardKind } from './data/templates';\nimport type { RecentSessionItem } from './composerTypes';\nimport { resolveComposerSurfaces } from './surfaces';\n\n/** Tiny grid preview inside a template card. */\nfunction TemplatePreview({ kinds, accent }: { kinds: TemplateCardKind[]; accent?: boolean }) {\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const stroke = accent ? theme.palette.primary.main : theme.palette.text.disabled;\n if (kinds.length === 0) {\n return (\n <Box sx={{ width: '100%', height: 56, display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 0.375 }}>\n {Array.from({ length: 6 }).map((_, i) => (\n <Box key={i} sx={{ background: theme.palette.background.default, border: `1px dashed ${surfaces.borderSoft}`, borderRadius: 0.5 }} />\n ))}\n </Box>\n );\n }\n return (\n <Box sx={{ width: '100%', height: 56, display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 0.375 }}>\n {kinds.slice(0, 6).map((k, i) => (\n <Box\n key={`Template${i}`}\n sx={{\n background: theme.palette.background.default,\n border: `1px solid ${accent ? theme.palette.primary.main : surfaces.borderSoft}`,\n borderRadius: 0.5,\n p: 0.5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: stroke,\n }}\n >\n {k === 'kpi' && <Box sx={{ fontSize: 8, fontWeight: 600 }}>R$ ··</Box>}\n {k === 'line' && (\n <svg width=\"100%\" height=\"14\" viewBox=\"0 0 40 14\" preserveAspectRatio=\"none\">\n <path d=\"M0 11 L8 7 L16 9 L24 4 L32 6 L40 2\" stroke={stroke} strokeWidth=\"1\" fill=\"none\" />\n </svg>\n )}\n {k === 'bars' && (\n <svg width=\"100%\" height=\"14\" viewBox=\"0 0 40 14\" preserveAspectRatio=\"none\">\n {[3, 7, 5, 9, 6, 11, 8, 12].map((h, j) => (\n <rect key={j} x={j * 5 + 0.5} y={14 - h} width={3.5} height={h} fill={stroke} />\n ))}\n </svg>\n )}\n {k === 'table' && (\n <Box sx={{ width: '90%', display: 'flex', flexDirection: 'column', gap: '1px' }}>\n {[0, 1, 2].map((j) => (\n <Box key={j} sx={{ height: 1.5, background: stroke, borderRadius: '0.5px' }} />\n ))}\n </Box>\n )}\n {k === 'donut' && (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" stroke={stroke} strokeWidth=\"2\" fill=\"none\" strokeDasharray=\"20 30\" />\n </svg>\n )}\n {k === 'heatmap' && (\n <Box sx={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: '0.5px', width: '70%' }}>\n {Array.from({ length: 8 }).map((_, j) => (\n <Box key={j} sx={{ aspectRatio: '1', background: stroke, opacity: 0.2 + (j / 8) * 0.7 }} />\n ))}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n );\n}\n\nexport interface EntryEmptyStateProps {\n /** A suggestion click drops its `prompt` here (no auto-send). */\n onDraftPromptChange: (next: string) => void;\n onApplyTemplate: (template: ComposerTemplate) => void;\n /** The prompt node (the parent wraps it in a `motion.div` with the shared `layoutId`). */\n composerSlot: React.ReactNode;\n /** Wrapper for the ambient blocks (hero / suggestions / templates) — the morph injects motion variants here. */\n ambientWrapper?: (children: React.ReactNode, key: string) => React.ReactNode;\n recentSessions?: RecentSessionItem[];\n onSelectSession?: (sessionId: string) => void;\n /** \"Buscar todas as sessões\" — the host opens its own search. Hidden when omitted. */\n onSearchAllSessions?: () => void;\n suggestions?: readonly ComposerSuggestion[];\n templates?: readonly ComposerTemplate[];\n}\n\nfunction formatRelativeTime(ts?: number): string {\n if (!ts) return '';\n const diff = Date.now() - ts;\n const min = 60_000;\n const hr = 60 * min;\n const day = 24 * hr;\n if (diff < min) return 'agora';\n if (diff < hr) return `${Math.floor(diff / min)}m`;\n if (diff < day) return `${Math.floor(diff / hr)}h`;\n if (diff < 7 * day) return `${Math.floor(diff / day)}d`;\n return `${Math.floor(diff / (7 * day))}sem`;\n}\n\n/** The composer's splash: hero, the prompt, suggestions + recent sessions, starter templates. */\nexport const EntryEmptyState: React.FC<EntryEmptyStateProps> = ({\n onDraftPromptChange,\n onApplyTemplate,\n composerSlot,\n ambientWrapper,\n recentSessions,\n onSelectSession,\n onSearchAllSessions,\n suggestions = defaultComposerSuggestions,\n templates = defaultComposerTemplates,\n}) => {\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const wrap = ambientWrapper ?? ((children: React.ReactNode) => children);\n const linkButtonSx = {\n background: 'transparent',\n border: 'none',\n textAlign: 'left' as const,\n padding: '6px 0',\n color: theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamily,\n fontSize: 13,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n '&:hover': { color: theme.palette.text.primary },\n };\n const eyebrowSx = { fontSize: 11, color: theme.palette.text.disabled, textTransform: 'uppercase' as const, letterSpacing: 0.5, mb: 1 };\n\n return (\n <Box sx={{ flex: 1, minHeight: 0, overflow: 'auto', display: 'flex', flexDirection: 'column', gap: 3.5, padding: { xs: 3, md: '40px 56px' }, background: theme.palette.background.default }}>\n {wrap(\n <Box>\n <Typography sx={{ fontSize: 11, color: theme.palette.primary.main, textTransform: 'uppercase', letterSpacing: 0.8, mb: 1, fontWeight: 500 }}>Novo dashboard</Typography>\n <Typography component=\"h1\" sx={{ fontSize: 30, fontWeight: 600, color: theme.palette.text.primary, margin: 0, lineHeight: 1.2, letterSpacing: -0.4 }}>\n Descreva o que você quer, peça ajuda{' '}\n <Box component=\"span\" sx={{ color: theme.palette.text.disabled }}>ou comece de um template.</Box>\n </Typography>\n </Box>,\n 'hero',\n )}\n\n {composerSlot}\n\n {wrap(\n <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' }, gap: { xs: 3, md: 5 } }}>\n <Box>\n <Typography sx={eyebrowSx}>Sugestões</Typography>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}>\n {suggestions.map((s) => (\n <Box key={s.label} component=\"button\" onClick={() => onDraftPromptChange(s.prompt)} sx={linkButtonSx}>\n <Box component=\"span\" sx={{ color: theme.palette.text.disabled }}>↗</Box>\n <span>{s.label}</span>\n </Box>\n ))}\n </Box>\n </Box>\n\n <Box>\n <Typography sx={eyebrowSx}>Sessões recentes</Typography>\n {!recentSessions || recentSessions.length === 0 ? (\n <Typography sx={{ fontSize: 12, color: theme.palette.text.disabled, fontStyle: 'italic', py: 0.5 }}>\n Você ainda não tem sessões salvas. Crie um novo dashboard acima.\n </Typography>\n ) : (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}>\n {recentSessions.map((s, index) => (\n <Box\n key={s.sessionId + index}\n component=\"button\"\n onClick={() => onSelectSession?.(s.sessionId)}\n disabled={!onSelectSession}\n sx={{ ...linkButtonSx, minWidth: 0, cursor: onSelectSession ? 'pointer' : 'default', '&:hover': onSelectSession ? linkButtonSx['&:hover'] : undefined }}\n >\n <Box component=\"span\" sx={{ color: theme.palette.text.disabled, flexShrink: 0 }}>↺</Box>\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{s.name}</Box>\n <Box component=\"span\" sx={{ color: theme.palette.text.disabled, fontFamily: surfaces.fontFamilyMono, fontSize: 11, flexShrink: 0 }}>\n {s.cardCount} {s.cardCount === 1 ? 'card' : 'cards'}\n {s.updatedAt ? ` · ${formatRelativeTime(s.updatedAt)}` : ''}\n </Box>\n </Box>\n ))}\n {onSearchAllSessions && (\n <Box component=\"button\" onClick={onSearchAllSessions} sx={{ ...linkButtonSx, color: theme.palette.primary.main, fontSize: 12.5, mt: 0.5, '&:hover': { filter: 'brightness(1.1)' } }}>\n <Box component=\"span\" sx={{ color: theme.palette.text.disabled }}>⌕</Box>\n <span>Buscar todas as sessões</span>\n </Box>\n )}\n </Box>\n )}\n </Box>\n </Box>,\n 'suggestions',\n )}\n\n {wrap(\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1.25, fontSize: 11, color: theme.palette.text.disabled, textTransform: 'uppercase', letterSpacing: 0.5 }}>\n <span>ou comece de um template</span>\n <Box sx={{ flex: 1, height: '1px', background: surfaces.borderSoft }} />\n </Box>\n <Box sx={{ display: 'grid', gridTemplateColumns: { xs: '1fr 1fr', md: 'repeat(4, 1fr)' }, gap: 1.25 }}>\n {templates.map((t) => (\n <Box\n key={t.id}\n component=\"button\"\n onClick={() => onApplyTemplate(t)}\n sx={{\n background: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 1.25,\n padding: 1.5,\n cursor: 'pointer',\n textAlign: 'left',\n fontFamily: theme.typography.fontFamily,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n transition: 'border-color .15s, transform .15s',\n '&:hover': { borderColor: theme.palette.primary.main, transform: 'translateY(-1px)' },\n }}\n >\n <TemplatePreview kinds={templateKinds(t)} accent={t.recommended} />\n <Box>\n <Typography sx={{ fontSize: 12.5, color: theme.palette.text.primary, fontWeight: 500 }}>{t.name}</Typography>\n <Typography sx={{ fontSize: 10.5, color: theme.palette.text.secondary, mt: 0.25, lineHeight: 1.4 }}>{t.desc}</Typography>\n <Typography sx={{ fontSize: 10, color: theme.palette.text.disabled, fontFamily: surfaces.fontFamilyMono, mt: 0.5 }}>\n {t.cells.length === 0 ? 'em branco' : `${t.cells.length} cards`}\n </Typography>\n </Box>\n </Box>\n ))}\n </Box>\n </Box>,\n 'templates',\n )}\n </Box>\n );\n};\n\nEntryEmptyState.displayName = 'EntryEmptyState';\n\nexport default EntryEmptyState;\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport { CloseIcon } from '@aintela/chat/components';\nimport type { GuideStep } from '../environment/types';\nimport { resolveGuideElement } from '../environment/environmentDom';\nimport { resolveComposerSurfaces } from './surfaces';\n\nexport interface SpotlightOverlayProps {\n steps: GuideStep[];\n /** Backdrop opacity (default 0.6). */\n overlayOpacity?: number;\n /** Let clicks through the backdrop to the page. */\n allowInteraction?: boolean;\n onComplete?: () => void;\n onDismiss: () => void;\n /** Target → element. Defaults to the package resolver (first visible `data-env-*` / selector match). */\n resolveElement?: (target: GuideStep['target']) => HTMLElement | null;\n}\n\ninterface TargetRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nconst SPOTLIGHT_PADDING = 6;\nconst TOOLTIP_GAP = 12;\nconst TOOLTIP_MAX_WIDTH = 320;\nconst TOOLTIP_MIN_WIDTH = 220;\nconst RETRY_INTERVAL_MS = 150;\nconst MAX_WAIT_MS = 3000;\n\nfunction computePlacement(placement: GuideStep['placement'], targetRect: TargetRect, tooltipWidth: number, tooltipHeight: number) {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const candidates: Array<'top' | 'bottom' | 'left' | 'right'> = placement && placement !== 'auto' ? [placement] : ['bottom', 'top', 'right', 'left'];\n\n for (const side of candidates) {\n let top = 0;\n let left = 0;\n switch (side) {\n case 'bottom':\n top = targetRect.top + targetRect.height + SPOTLIGHT_PADDING + TOOLTIP_GAP;\n left = targetRect.left + targetRect.width / 2 - tooltipWidth / 2;\n break;\n case 'top':\n top = targetRect.top - SPOTLIGHT_PADDING - TOOLTIP_GAP - tooltipHeight;\n left = targetRect.left + targetRect.width / 2 - tooltipWidth / 2;\n break;\n case 'right':\n top = targetRect.top + targetRect.height / 2 - tooltipHeight / 2;\n left = targetRect.left + targetRect.width + SPOTLIGHT_PADDING + TOOLTIP_GAP;\n break;\n case 'left':\n top = targetRect.top + targetRect.height / 2 - tooltipHeight / 2;\n left = targetRect.left - SPOTLIGHT_PADDING - TOOLTIP_GAP - tooltipWidth;\n break;\n }\n left = Math.max(8, Math.min(left, vw - tooltipWidth - 8));\n top = Math.max(8, Math.min(top, vh - tooltipHeight - 8));\n const fits = top >= 0 && top + tooltipHeight <= vh && left >= 0 && left + tooltipWidth <= vw;\n if (fits || side === candidates[candidates.length - 1]) return { top, left, resolvedPlacement: side };\n }\n return { top: targetRect.top + targetRect.height + TOOLTIP_GAP, left: targetRect.left, resolvedPlacement: 'bottom' as const };\n}\n\n/**\n * The guided tour `env.showGuide()` drives: a dimmed backdrop with a\n * cut-out around the current target, an accent ring, and a tooltip with\n * Anterior / Próximo / Concluir. → / Enter advance, ← retreats, Esc closes.\n * A target that never resolves within 3 s is skipped (logged), not fatal.\n */\nexport const SpotlightOverlay: React.FC<SpotlightOverlayProps> = ({ steps, overlayOpacity = 0.6, allowInteraction = false, onComplete, onDismiss, resolveElement = resolveGuideElement }) => {\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const [currentIndex, setCurrentIndex] = useState(0);\n const [targetRect, setTargetRect] = useState<TargetRect | null>(null);\n const [tooltipSize, setTooltipSize] = useState({ width: TOOLTIP_MAX_WIDTH, height: 120 });\n const tooltipRef = useRef<HTMLDivElement>(null);\n const animFrameRef = useRef(0);\n\n const step = steps[currentIndex];\n const isFirst = currentIndex === 0;\n const isLast = currentIndex === steps.length - 1;\n\n const updateTargetRect = useCallback(() => {\n if (!step) return;\n const el = resolveElement(step.target);\n if (el) {\n const rect = el.getBoundingClientRect();\n setTargetRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });\n el.scrollIntoView?.({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });\n } else {\n setTargetRect(null);\n }\n }, [step, resolveElement]);\n\n // Resolve-with-retry on step change: targets are often mid-mount or\n // mid-animation when a tour starts (the sketch expanding, a drawer opening).\n useEffect(() => {\n if (!step) return;\n let cancelled = false;\n let elapsed = 0;\n let timeoutId: number | undefined;\n\n const giveUpOnStep = () => {\n console.warn(`[@aintela/bi SpotlightOverlay] Step ${currentIndex + 1}/${steps.length} could not resolve its target within ${MAX_WAIT_MS} ms; skipping.`, { target: step.target, title: step.title });\n if (currentIndex < steps.length - 1) setCurrentIndex((i) => i + 1);\n else {\n console.warn('[@aintela/bi SpotlightOverlay] All steps failed to resolve; dismissing tour.');\n onDismiss();\n }\n };\n\n const attempt = () => {\n if (cancelled) return;\n const el = resolveElement(step.target);\n if (el) {\n const rect = el.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n setTargetRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });\n el.scrollIntoView?.({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });\n return;\n }\n }\n elapsed += RETRY_INTERVAL_MS;\n if (elapsed >= MAX_WAIT_MS) {\n giveUpOnStep();\n return;\n }\n timeoutId = window.setTimeout(attempt, RETRY_INTERVAL_MS);\n };\n\n attempt();\n\n const onScroll = () => {\n cancelAnimationFrame(animFrameRef.current);\n animFrameRef.current = requestAnimationFrame(updateTargetRect);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onScroll);\n return () => {\n cancelled = true;\n if (timeoutId !== undefined) window.clearTimeout(timeoutId);\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onScroll);\n cancelAnimationFrame(animFrameRef.current);\n };\n }, [step, resolveElement, onDismiss, updateTargetRect, currentIndex, steps.length]);\n\n useEffect(() => {\n if (tooltipRef.current) {\n const { offsetWidth, offsetHeight } = tooltipRef.current;\n setTooltipSize({ width: offsetWidth, height: offsetHeight });\n }\n }, [currentIndex, targetRect]);\n\n const handleNext = useCallback(() => {\n if (isLast) {\n onComplete?.();\n onDismiss();\n } else {\n setCurrentIndex((i) => i + 1);\n }\n }, [isLast, onComplete, onDismiss]);\n\n const handlePrev = useCallback(() => {\n if (!isFirst) setCurrentIndex((i) => i - 1);\n }, [isFirst]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onDismiss();\n else if (e.key === 'ArrowRight' || e.key === 'Enter') handleNext();\n else if (e.key === 'ArrowLeft') handlePrev();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onDismiss, handleNext, handlePrev]);\n\n if (!step || typeof document === 'undefined') return null;\n\n const spotlightClip = targetRect\n ? `polygon(\n 0% 0%, 0% 100%, 100% 100%, 100% 0%, 0% 0%,\n ${targetRect.left - SPOTLIGHT_PADDING}px ${targetRect.top - SPOTLIGHT_PADDING}px,\n ${targetRect.left + targetRect.width + SPOTLIGHT_PADDING}px ${targetRect.top - SPOTLIGHT_PADDING}px,\n ${targetRect.left + targetRect.width + SPOTLIGHT_PADDING}px ${targetRect.top + targetRect.height + SPOTLIGHT_PADDING}px,\n ${targetRect.left - SPOTLIGHT_PADDING}px ${targetRect.top + targetRect.height + SPOTLIGHT_PADDING}px,\n ${targetRect.left - SPOTLIGHT_PADDING}px ${targetRect.top - SPOTLIGHT_PADDING}px\n )`\n : undefined;\n\n const tooltipPos = targetRect ? computePlacement(step.placement, targetRect, tooltipSize.width, tooltipSize.height) : null;\n\n const buttonBase = {\n fontFamily: theme.typography.fontFamily,\n fontSize: 11.5,\n fontWeight: 500,\n px: 1.25,\n py: 0.625,\n borderRadius: 1,\n cursor: 'pointer',\n transition: 'filter .12s, background-color .12s, border-color .12s',\n border: '1px solid transparent',\n } as const;\n\n return createPortal(\n <Box className=\"llm-guide-overlay-root\" sx={{ position: 'fixed', inset: 0, zIndex: 9999 }}>\n {targetRect && (\n <Box\n onClick={!allowInteraction ? undefined : onDismiss}\n sx={{\n position: 'absolute',\n inset: 0,\n backgroundColor: alpha(theme.palette.common.black, overlayOpacity),\n clipPath: spotlightClip,\n transition: 'clip-path 0.3s ease',\n pointerEvents: allowInteraction ? 'none' : 'auto',\n }}\n />\n )}\n\n {targetRect && (\n <Box\n className=\"llm-guide-spotlight-ring\"\n sx={{\n position: 'absolute',\n top: targetRect.top - SPOTLIGHT_PADDING,\n left: targetRect.left - SPOTLIGHT_PADDING,\n width: targetRect.width + SPOTLIGHT_PADDING * 2,\n height: targetRect.height + SPOTLIGHT_PADDING * 2,\n borderRadius: '6px',\n border: `2px solid ${theme.palette.primary.main}`,\n boxShadow: `0 0 0 4px ${alpha(theme.palette.primary.main, 0.2)}, 0 8px 24px ${alpha(theme.palette.primary.main, 0.13)}`,\n transition: 'all 0.3s ease',\n pointerEvents: 'none',\n }}\n />\n )}\n\n {tooltipPos && (\n <Box\n ref={tooltipRef}\n sx={{\n position: 'absolute',\n top: tooltipPos.top,\n left: tooltipPos.left,\n maxWidth: TOOLTIP_MAX_WIDTH,\n minWidth: TOOLTIP_MIN_WIDTH,\n p: 2,\n borderRadius: 1.5,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n boxShadow: theme.shadows[8],\n transition: 'top 0.3s ease, left 0.3s ease',\n pointerEvents: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: 1.25,\n fontFamily: theme.typography.fontFamily,\n }}\n >\n <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', gap: 1 }}>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography sx={{ fontSize: 10, color: theme.palette.primary.main, textTransform: 'uppercase', letterSpacing: 0.6, fontWeight: 500, mb: step.title ? 0.5 : 0 }}>\n Guia · {currentIndex + 1} / {steps.length}\n </Typography>\n {step.title && <Typography sx={{ fontSize: 13.5, fontWeight: 600, color: theme.palette.text.primary, lineHeight: 1.3, mb: 0.5 }}>{step.title}</Typography>}\n <Typography sx={{ fontSize: 12.5, color: theme.palette.text.secondary, lineHeight: 1.5 }}>{step.description}</Typography>\n </Box>\n <Box component=\"button\" onClick={onDismiss} aria-label=\"Fechar guia\" sx={{ ...buttonBase, background: 'transparent', border: 'none', color: theme.palette.text.disabled, p: 0.5, display: 'inline-flex', '&:hover': { color: theme.palette.text.primary } }}>\n <CloseIcon size={12} />\n </Box>\n </Box>\n\n <Box sx={{ display: 'flex', justifyContent: 'flex-end', alignItems: 'center', gap: 0.75 }}>\n {!isFirst && (\n <Box component=\"button\" onClick={handlePrev} sx={{ ...buttonBase, background: 'transparent', color: theme.palette.text.secondary, '&:hover': { color: theme.palette.text.primary, backgroundColor: surfaces.raised } }}>\n Anterior\n </Box>\n )}\n <Box component=\"button\" onClick={handleNext} sx={{ ...buttonBase, background: theme.palette.primary.main, color: theme.palette.primary.contrastText, fontWeight: 600, '&:hover': { filter: 'brightness(1.05)' } }}>\n {isLast ? 'Concluir' : 'Próximo'}\n </Box>\n </Box>\n </Box>\n )}\n </Box>,\n document.body,\n );\n};\n\nexport default SpotlightOverlay;\n","// ComposerView — the authoring screen: splash (hero + prompt + templates),\n// then the execution layout (chat column with the docked drawable prompt,\n// the dashboard side panel, the host's progress panel). The chat itself is\n// the host's: it mounts `AiChatProvider` around this view, renders the\n// transcript it passes as `chatPane`, and wires `useComposerChatBridge()`.\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport { useTheme } from '@mui/material/styles';\nimport { AnimatePresence, motion, useReducedMotion } from 'framer-motion';\nimport { useBiClientOptional } from '../../client';\nimport type { EnvironmentTarget } from '../environment/types';\nimport { guideStepsRequireSketch, resolveGuideElement } from '../environment/environmentDom';\nimport type { ComposerDashboard, SketchCardItem, SketchedFilter } from '../models/sketchModels';\nimport { useComposer, useComposerStore } from '../store/ComposerProvider';\nimport { createDashboardDraft, fromUpsertResponse } from '../store/drafts';\nimport { activityPanelVariants, activityPanelVariantsReduced, ambientVariants, ambientVariantsReduced, composerLayoutTransition, composerLayoutTransitionReduced } from './composerAnimations';\nimport type { ComposerMode, RecentSessionItem } from './composerTypes';\nimport type { ComposerSuggestion } from './data/suggestions';\nimport { seedFromTemplate, type ComposerTemplate } from './data/templates';\nimport { DashboardSidePanel } from './DashboardSidePanel';\nimport { DrawablePrompt } from './DrawablePrompt';\nimport { EntryEmptyState } from './EntryEmptyState';\nimport { SpotlightOverlay } from './SpotlightOverlay';\nimport { resolveComposerSurfaces } from './surfaces';\n\nconst COMPOSER_LAYOUT_ID = 'aintela-bi-composer';\nconst RECENT_SESSIONS_LIMIT = 2;\n\nexport interface ComposerProgressPanelArgs {\n hasDashboard: boolean;\n dashboardCollapsed: boolean;\n turnOpen: boolean;\n}\n\nexport interface ComposerViewProps {\n /** The live chat session id (the host's AiChat store). `null` until the handshake binds one. */\n sessionId?: string | null;\n /** The session in the route (`/composer/:sessionId`) — hydrates the dashboard bound to it and skips the splash. */\n routeSessionId?: string;\n /** The transcript — the host renders `<AiChatV2Pane hideHeader />` (or its own). */\n chatPane: React.ReactNode;\n /** The right-hand activity panel (`RunProgressPanelV2`), sized by the host from the args. */\n renderProgressPanel?: (args: ComposerProgressPanelArgs) => React.ReactNode;\n /** Rendered under the prompt on the splash (`RunProgressStripV2`). */\n progressStrip?: React.ReactNode;\n /** Runs before every send, after the view ensured a server draft exists. */\n onBeforeSend?: (text: string) => void | Promise<void>;\n /** Spotlight target resolver (default: first visible `data-env-*` / selector match). */\n resolveGuideElement?: (target: EnvironmentTarget) => HTMLElement | null;\n suggestions?: readonly ComposerSuggestion[];\n templates?: readonly ComposerTemplate[];\n /** Recent sessions for the splash. When omitted (and a client is in scope) the view lists dashboards itself. */\n recentSessions?: RecentSessionItem[];\n onSelectSession?: (sessionId: string) => void;\n onSearchAllSessions?: () => void;\n /** The sketch's name (or `null` when there is none) — for a breadcrumb. */\n onDashboardNameChange?: (name: string | null) => void;\n /** The admin dataset / agent block in the rail (`<DatasetParameterizationControls orientation=\"column\" …/>`). */\n datasetControls?: React.ReactNode;\n /** Card description renderer (Markdown in the legacy app). */\n renderDescription?: (text: string) => React.ReactNode;\n /** Side panel width when expanded (default `'70%'`). */\n sidePanelWidth?: string;\n /** Chat column width when a dashboard is showing (default `'80%'`). */\n chatColumnWidthWithDashboard?: string;\n}\n\ninterface InnerProps extends ComposerViewProps {\n composerMode: ComposerMode;\n onForceExecutionMode: () => void;\n recentSessionsResolved: RecentSessionItem[];\n}\n\nconst ComposerInner: React.FC<InnerProps> = (props) => {\n const { sessionId = null, routeSessionId, composerMode, onForceExecutionMode, recentSessionsResolved } = props;\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const store = useComposerStore();\n const client = useBiClientOptional();\n\n const jsFileName = useComposer((s) => s.dashboardDefinition?.jsFileName ?? null);\n const composerDashboardName = useComposer((s) => s.dashboardDefinition?.name ?? null);\n const turnOpen = useComposer((s) => s.turnOpen);\n const sketchExpanded = useComposer((s) => s.sketchExpanded);\n const setSketchExpanded = useCallback((next: boolean) => store.getState().setSketchExpanded(next), [store]);\n\n const [draftPrompt, setDraftPrompt] = useState<string>('');\n const [prevJsFileName, setPrevJsFileName] = useState<string | undefined>(undefined);\n const [dashboardCollapseState, setDashboardCollapseState] = useState(false);\n const [jsFileNameChange, setJsFileNameChange] = useState(false);\n const hasDashboard = jsFileName !== null;\n const dashboardLoadedSessionRef = useRef<string | null>(null);\n\n useEffect(() => {\n const trimmed = composerDashboardName?.trim();\n props.onDashboardNameChange?.(trimmed ? trimmed : null);\n return () => props.onDashboardNameChange?.(null);\n }, [composerDashboardName]);\n\n // Mirror the live chat session into the store (autosave needs it on `originalSessionId`).\n useEffect(() => {\n if (store.getState().currentSessionId !== sessionId) store.getState().setCurrentSessionId(sessionId);\n }, [sessionId, store]);\n\n useEffect(() => {\n if (turnOpen) setJsFileNameChange(false);\n }, [turnOpen]);\n\n useEffect(() => {\n if ((jsFileName || undefined) !== prevJsFileName) setJsFileNameChange(true);\n setPrevJsFileName(jsFileName ?? undefined);\n }, [jsFileName]);\n\n // Route-driven hydration: `/composer/:sessionId` → the dashboard whose `originalSessionId` matches.\n useEffect(() => {\n const def = store.getState().dashboardDefinition;\n const dashSid = def?.originalSessionId ?? null;\n if (dashSid && dashSid !== (routeSessionId ?? null)) {\n store.getState().updateDashboard(undefined);\n dashboardLoadedSessionRef.current = null;\n }\n if (!routeSessionId && dashSid) {\n store.getState().updateDashboard(undefined);\n dashboardLoadedSessionRef.current = null;\n }\n if (!routeSessionId || !client) return;\n if (dashboardLoadedSessionRef.current === routeSessionId) return;\n if (store.getState().dashboardDefinition?.id) {\n dashboardLoadedSessionRef.current = routeSessionId;\n return;\n }\n let cancelled = false;\n (async () => {\n try {\n const full = await client.getDashboardBySession<unknown>(routeSessionId);\n if (cancelled) return;\n if (store.getState().dashboardDefinition?.id) {\n dashboardLoadedSessionRef.current = routeSessionId;\n return;\n }\n if (!full) {\n console.warn('[@aintela/bi composer] no dashboard found for session', routeSessionId);\n dashboardLoadedSessionRef.current = routeSessionId;\n return;\n }\n store.getState().loadDashboard(fromUpsertResponse(full));\n dashboardLoadedSessionRef.current = routeSessionId;\n } catch (err) {\n console.error('[@aintela/bi composer] failed to load dashboard for session', err);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [routeSessionId, client, store]);\n\n // Ensure a server-side draft exists so autosave has an id + `originalSessionId`.\n const ensureDraft = useCallback(\n async (seed?: { name?: string; cards?: SketchCardItem[]; filters?: SketchedFilter[]; layoutType?: 'Naked' | 'Boxed' }): Promise<void> => {\n const sid = sessionId;\n let existing = store.getState().dashboardDefinition;\n\n // A dashboard is \"fresh\" when its session matches the live chat OR the route.\n if (existing?.id && existing.originalSessionId && existing.originalSessionId !== sid && existing.originalSessionId !== routeSessionId) {\n store.getState().updateDashboard(undefined);\n existing = store.getState().dashboardDefinition;\n }\n\n if (existing?.id) {\n if (seed) {\n store.getState().updateDashboard({\n originalSessionId: routeSessionId !== store.getState().currentSessionId ? store.getState().currentSessionId : existing.originalSessionId,\n ...(seed.name !== undefined && { name: seed.name }),\n ...(seed.cards !== undefined && { cards: seed.cards }),\n ...(seed.filters !== undefined && { filters: seed.filters }),\n });\n }\n return;\n }\n\n if (!sid || !client) {\n // No session (or no client) yet — show the cards locally; the server draft is created on the next call.\n if (seed) {\n store.getState().updateDashboard({ name: seed.name ?? 'Untitled Dashboard', cards: seed.cards ?? [], filters: seed.filters ?? [] });\n setSketchExpanded(true);\n } else {\n // No client, or a client but no session id yet (a composer opened before the first chat\n // turn). Either way the pad opens on a LOCAL definition; the server draft is created by the\n // next call — `inheritedSeed` below carries these cards into it. Before, only the no-client\n // case did this and the no-session case merely warned, which is what made \"Adicionar sketch\"\n // look dead on a freshly opened composer.\n store.getState().updateDashboard({ name: 'Untitled Dashboard', cards: [], filters: [] });\n setSketchExpanded(true);\n }\n return;\n }\n\n try {\n const inheritedSeed =\n !seed && existing && ((existing.cards?.length ?? 0) > 0 || (existing.filters?.length ?? 0) > 0)\n ? { name: existing.name, cards: existing.cards, filters: existing.filters, layoutType: existing.layoutType }\n : undefined;\n const seedToSend = seed ?? inheritedSeed;\n if (seedToSend && !seedToSend.layoutType) seedToSend.layoutType = 'Naked';\n\n const created: ComposerDashboard = await createDashboardDraft(client, sid, seedToSend);\n const seeded = store.getState().dashboardDefinition;\n store.getState().updateDashboard({\n ...created,\n name: seedToSend?.name ?? seeded?.name ?? created.name,\n cards: seedToSend?.cards ?? (seeded?.cards?.length ? seeded.cards : created.cards),\n filters: seedToSend?.filters ?? (seeded?.filters?.length ? seeded.filters : created.filters),\n });\n setSketchExpanded(true);\n } catch (err) {\n console.error('[@aintela/bi composer] createDraft failed', err);\n }\n },\n [client, sessionId, routeSessionId, setSketchExpanded, store],\n );\n\n // The chip's job is to OPEN the pad; `ensureDraft` only decides whether a draft has to be created. Opening\n // here rather than relying on ensureDraft's branches is what makes the chip work when a draft already\n // exists — that path returns early and never expanded anything.\n const handleCreateSketch = useCallback(() => {\n setSketchExpanded(true);\n void ensureDraft();\n }, [ensureDraft, setSketchExpanded]);\n const handleBeforeSend = useCallback(async (text: string) => {\n await ensureDraft();\n await props.onBeforeSend?.(text);\n }, [ensureDraft, props.onBeforeSend]);\n\n const handleApplyTemplate = useCallback((template: ComposerTemplate) => {\n if (template.cells.length === 0) {\n onForceExecutionMode();\n return;\n }\n void ensureDraft({ name: template.name, cards: seedFromTemplate(template), filters: [] });\n }, [ensureDraft, onForceExecutionMode]);\n\n const reduce = useReducedMotion();\n const ambient = reduce ? ambientVariantsReduced : ambientVariants;\n const activityVariants = reduce ? activityPanelVariantsReduced : activityPanelVariants;\n const layoutTransition = reduce ? composerLayoutTransitionReduced : composerLayoutTransition;\n\n const ambientWrapper = useCallback(\n (children: React.ReactNode, key: string) => (\n <motion.div key={key} variants={ambient} initial=\"hidden\" animate=\"visible\" exit=\"hidden\">\n {children}\n </motion.div>\n ),\n [ambient],\n );\n\n // Each branch declares its own `motion.div` with the shared `layoutId` — framer morphs between them.\n const renderPromptForBranch = () => (\n <motion.div layoutId={COMPOSER_LAYOUT_ID} transition={layoutTransition} style={{ display: 'flex', flexDirection: 'column' }}>\n <DrawablePrompt\n onCreateSketch={handleCreateSketch}\n onBeforeSend={handleBeforeSend}\n sketchExpanded={sketchExpanded}\n onSketchExpandedChange={setSketchExpanded}\n seedDraft={draftPrompt}\n zoomLevel={hasDashboard ? 0.8 : 0.95}\n compact={composerMode !== 'empty'}\n bottomSlot={composerMode === 'empty' ? props.progressStrip : undefined}\n datasetControls={props.datasetControls}\n renderDescription={props.renderDescription}\n />\n </motion.div>\n );\n\n return (\n <AnimatePresence mode=\"popLayout\" initial={false}>\n {composerMode === 'empty' ? (\n <motion.div key=\"empty-layout\" initial={{ opacity: 1 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} transition={{ duration: 0.2, ease: 'easeOut' }} style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n <EntryEmptyState\n onDraftPromptChange={setDraftPrompt}\n onApplyTemplate={handleApplyTemplate}\n composerSlot={renderPromptForBranch()}\n ambientWrapper={ambientWrapper}\n recentSessions={recentSessionsResolved}\n onSelectSession={props.onSelectSession}\n onSearchAllSessions={props.onSearchAllSessions}\n suggestions={props.suggestions}\n templates={props.templates}\n />\n </motion.div>\n ) : (\n <motion.div key=\"execution-layout\" initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} transition={{ duration: 0.2, ease: 'easeOut' }} style={{ minHeight: 0, width: '100%', height: '100%', display: 'flex', background: theme.palette.background.default }}>\n <Stack direction=\"row\" sx={{ display: 'inline-flex', width: '100%', height: '100%', flexWrap: 'nowrap' }}>\n <Stack\n sx={{\n minWidth: '20%',\n width: hasDashboard ? (props.chatColumnWidthWithDashboard ?? '80%') : '100%',\n minHeight: 0,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n '& [data-message-role=\"user\"]': { backgroundColor: `${surfaces.hover} !important`, border: `1px solid ${surfaces.borderSoft} !important`, borderRadius: '12px !important' },\n '& [data-message-role=\"user\"], & [data-message-role=\"user\"] span, & [data-message-role=\"user\"] p': { fontSize: '12.5px', lineHeight: 1.55 },\n }}\n >\n {/* MUST stay `display: flex; flex-direction: column` — the chat pane claims its height with `flex: 1`. */}\n <Box className=\"bi-composer-chat-pane\" sx={{ minHeight: 0, width: '100%', flex: 5, overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>\n {props.chatPane}\n </Box>\n <motion.div variants={activityVariants} initial=\"hidden\" animate=\"visible\" exit=\"hidden\" style={{ width: '100%', flex: 1 }}>\n <Box sx={{ backgroundColor: theme.palette.background.default, flex: 1 }}>{renderPromptForBranch()}</Box>\n </motion.div>\n </Stack>\n\n <DashboardSidePanel width={props.sidePanelWidth ?? '70%'} defaultCollapsed={!jsFileNameChange} onCollapseChange={setDashboardCollapseState} />\n\n {props.renderProgressPanel?.({ hasDashboard, dashboardCollapsed: dashboardCollapseState, turnOpen })}\n </Stack>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n\n/**\n * The composer screen. Mount it under `ComposerProvider`, `BiClientProvider`\n * (for drafts) and the host's `AiChatProvider` + `EnvironmentProvider`; the\n * host wires `useComposerChatBridge()` into that provider.\n */\nexport const ComposerView: React.FC<ComposerViewProps> = (props) => {\n const store = useComposerStore();\n const client = useBiClientOptional();\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // Publish the container size for the prompt envelope (`screenData`).\n useEffect(() => {\n const el = containerRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const publish = () => {\n const rect = el.getBoundingClientRect();\n store.getState().setViewport({ width: rect.width, height: rect.height });\n };\n publish();\n const ro = new ResizeObserver(publish);\n ro.observe(el);\n return () => ro.disconnect();\n }, [store]);\n\n // Recent sessions: the prop wins; otherwise list dashboards through the client (once per route change).\n const [fetchedRecent, setFetchedRecent] = useState<RecentSessionItem[]>([]);\n useEffect(() => {\n if (props.recentSessions || !client) return;\n let cancelled = false;\n (async () => {\n try {\n const list = await client.listDashboards<ComposerDashboard>();\n if (cancelled) return;\n const items = list\n .filter((d) => !!d.originalSessionId)\n .map((d) => {\n const ts = d.updatedAt ? (d.updatedAt instanceof Date ? d.updatedAt.getTime() : Date.parse(String(d.updatedAt))) : 0;\n return { sessionId: d.originalSessionId as string, name: d.name || 'Dashboard', cardCount: d.cards?.length ?? 0, updatedAt: Number.isFinite(ts) ? ts : 0 };\n });\n items.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n setFetchedRecent(items.slice(0, RECENT_SESSIONS_LIMIT));\n } catch (err) {\n console.error('[@aintela/bi composer] failed to list dashboards', err);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [client, props.recentSessions, props.routeSessionId]);\n const recentSessionsResolved = props.recentSessions ?? fetchedRecent;\n\n const turnOpen = useComposer((s) => s.turnOpen);\n const hasCompletedOnce = useComposer((s) => s.hasCompletedOnce);\n const producedDashboardId = useComposer((s) => s.producedDashboardId);\n const hasJsFile = useComposer((s) => !!s.dashboardDefinition?.jsFileName);\n const dashboardId = useComposer((s) => s.dashboardDefinition?.id ?? null);\n const cardsLen = useComposer((s) => s.dashboardDefinition?.cards?.length ?? 0);\n const filtersLen = useComposer((s) => s.dashboardDefinition?.filters?.length ?? 0);\n\n // Auto-expand the sketch when it just gained content (a draft id, first cards, first filters) outside a turn.\n const prevAutoExpand = useRef({ id: dashboardId, cards: cardsLen, filters: filtersLen, firstTime: true });\n useEffect(() => {\n if (turnOpen) return;\n const prev = prevAutoExpand.current;\n const idAppeared = !prev.id && !!dashboardId;\n const cardsAppeared = prev.cards === 0 && cardsLen > 0;\n const filtersAppeared = prev.filters === 0 && filtersLen > 0;\n const wasFirst = prev.firstTime;\n prevAutoExpand.current = { id: dashboardId, cards: cardsLen, filters: filtersLen, firstTime: false };\n if (!wasFirst && (idAppeared || cardsAppeared || filtersAppeared)) store.getState().setSketchExpanded(true);\n }, [dashboardId, cardsLen, filtersLen, turnOpen, store]);\n\n // Guided tour: expand the sketch first when a step targets a pad-internal node.\n const guideSteps = useComposer((s) => s.guideSteps);\n const guideOptions = useComposer((s) => s.guideOptions);\n const dismissGuide = useComposer((s) => s.dismissGuide);\n useEffect(() => {\n if (guideSteps && guideSteps.length > 0 && guideStepsRequireSketch(guideSteps)) store.getState().setSketchExpanded(true);\n }, [guideSteps, store]);\n\n const composerMode: ComposerMode = useMemo(() => {\n if (turnOpen) return 'generating';\n if (!hasCompletedOnce && !props.routeSessionId) return 'empty';\n return producedDashboardId || hasJsFile ? 'done-dashboard' : 'done-text';\n }, [turnOpen, hasCompletedOnce, producedDashboardId, hasJsFile, props.routeSessionId]);\n\n const handleForceExecutionMode = useCallback(() => {\n store.getState().setHasCompletedOnce(true);\n store.getState().setSketchExpanded(false);\n }, [store]);\n\n return (\n <>\n <div className=\"bi-composer-root\" ref={containerRef} style={{ display: 'inherit', height: '100%' }}>\n <ComposerInner {...props} composerMode={composerMode} onForceExecutionMode={handleForceExecutionMode} recentSessionsResolved={recentSessionsResolved} />\n </div>\n {/* Sibling of the morphing layout so a tour survives the splash ↔ execution switch. */}\n {guideSteps && guideSteps.length > 0 && (\n <SpotlightOverlay steps={guideSteps} overlayOpacity={guideOptions?.overlayOpacity} allowInteraction={guideOptions?.allowInteraction} onComplete={guideOptions?.onComplete} onDismiss={dismissGuide} resolveElement={props.resolveGuideElement ?? resolveGuideElement} />\n )}\n </>\n );\n};\n\nComposerView.displayName = 'ComposerView';\n\nexport default ComposerView;\n","import { useCallback, useMemo } from 'react';\nimport { joinClientSideChanges, type PromptDashboardCard, type PromptDashboardContainer, type SketchCardItem } from '../models/sketchModels';\nimport { useComposerEnvironment, useComposerStore } from '../store/ComposerProvider';\nimport type { DashboardEnvironment } from '../environment/types';\n\n/** Same constants the pad uses to project sketch w/h to pixels for the agent. */\nexport const GRID_ROW_HEIGHT_PX = 20;\nconst RAIL_WIDTH = 60;\n\n/** The subset of the chat library's `Interaction` the bridge reads — structurally compatible with the real one. */\nexport interface TurnCompleteInfo {\n artifactData?: ReadonlyArray<{ type?: string; id?: string } | null | undefined>;\n}\n\nexport interface ComposerPromptEnvelope {\n /** What the transcript shows for the user's message. */\n promptAsString: string;\n /** The JSON the agent receives (`PromptDashboardContainer`). */\n json: string;\n}\n\nexport interface ComposerChatBridge {\n /** `AiChatProvider.onRenderPrompt` — wraps the text in the dashboard envelope and drains `clientSideChanges`. */\n onRenderPrompt: (prompt: string) => ComposerPromptEnvelope;\n /** `AiChatProvider.onTurnOpen`. */\n onTurnOpen: () => void;\n /** `AiChatProvider.onTurnComplete`. */\n onTurnComplete: (interaction: TurnCompleteInfo) => void;\n /** Agent tool events (`eventBusService.gatewayOnToolEvent`). */\n ingestToolEvent: (eventName: string, eventData: string) => void;\n /** The live chat session id — call when the host's AiChat session binds / changes. */\n setSessionId: (sessionId: string | null) => void;\n /** For `EnvironmentProvider value={…}` and `createBiUiTools({ environment })`. */\n environment: DashboardEnvironment;\n}\n\nfunction detectProducedDashboardId(interaction: TurnCompleteInfo): string | null {\n for (const a of interaction.artifactData ?? []) {\n if (a?.type === 'Dashboard' && a.id) return a.id;\n }\n return null;\n}\n\n/**\n * Everything the host wires between its `AiChatProvider` and the composer\n * store. The composer never mounts the chat itself; the host does, and\n * passes these handlers:\n *\n * const bridge = useComposerChatBridge();\n * <AiChatProvider onRenderPrompt={bridge.onRenderPrompt} onTurnOpen={bridge.onTurnOpen}\n * onTurnComplete={bridge.onTurnComplete} uiTools={uiTools} hidePromptInput …>\n * <EnvironmentProvider value={bridge.environment}>\n * <ComposerChatBinding /> {/* or wire sessionId + tool events by hand *\\/}\n * <ComposerView … />\n */\nexport function useComposerChatBridge(): ComposerChatBridge {\n const store = useComposerStore();\n const environment = useComposerEnvironment();\n\n const onRenderPrompt = useCallback((prompt: string): ComposerPromptEnvelope => {\n const { viewport, dashboardDefinition: def } = store.getState();\n const roundedHeight = Math.round(viewport.height);\n const dashPreviewBoxWidth = viewport.width === 0 ? 0 : Math.round(viewport.width / 2 - RAIL_WIDTH);\n const chatBoxWidth = dashPreviewBoxWidth;\n const dashFullViewBoxWidth = Math.round(1080 * 0.9);\n const gridColumnWidth = Math.round(dashFullViewBoxWidth / 12);\n\n const cards: PromptDashboardCard[] = (def?.cards ?? []).map((card: SketchCardItem) => ({\n ...card,\n widthPx: typeof card.w === 'number' && gridColumnWidth > 0 ? Math.round(gridColumnWidth * card.w * 0.95) : undefined,\n heightPx: typeof card.h === 'number' ? Math.round(card.h * GRID_ROW_HEIGHT_PX * 0.95) : undefined,\n }));\n\n // The prompt may itself be a serialised container (a re-send); read a display string out of it.\n let descFromPrompt: string | undefined;\n try {\n const parsed = JSON.parse(prompt) as Partial<PromptDashboardContainer>;\n const typed = (parsed?.userPrompt?.trim()?.length ?? 0) > 0 ? parsed.userPrompt : undefined;\n const cardsCount = parsed?.cards?.length ?? 0;\n const filterCount = parsed?.filters?.length ?? 0;\n const cardsDesc = cardsCount > 0 ? `${cardsCount} card(s) ` : '';\n const filterDesc = filterCount > 0 ? ` - ${filterCount} filter(s) ` : '';\n descFromPrompt = typed ?? `${cardsDesc}${filterDesc}(${parsed?.layoutType ?? ''})`;\n } catch {\n descFromPrompt = undefined;\n }\n\n const wrapped: PromptDashboardContainer = {\n id: def?.id ?? '',\n name: def?.name ?? '',\n cards,\n filters: def?.filters ?? [],\n layoutType: def?.layoutType ?? 'Boxed',\n remarks: def?.remarks,\n userPrompt: prompt,\n screenData: {\n chatBox: { heightPx: roundedHeight, widthPx: chatBoxWidth },\n dashboardPreviewBox: { heightPx: roundedHeight, widthPx: dashPreviewBoxWidth },\n dashboardVisualizationBox: { heightPx: roundedHeight, widthPx: dashFullViewBoxWidth },\n gridRowHeightPixelsPerUnit: GRID_ROW_HEIGHT_PX,\n gridColumnWidthPixelsPerUnit: gridColumnWidth,\n gridColumnWidthPixelsPerUnitFullView: gridColumnWidth,\n },\n isDatasetParameterized: def?.isDatasetParameterized ?? false,\n defaultDatasetName: def?.defaultDatasetName,\n clientSideChanges: joinClientSideChanges(def?.clientSideChanges),\n };\n if (def?.clientSideChanges && Object.keys(def.clientSideChanges).length > 0) store.getState().clearClientSideChanges();\n return { promptAsString: descFromPrompt ?? '', json: JSON.stringify(wrapped) };\n }, [store]);\n\n const onTurnOpen = useCallback(() => {\n const s = store.getState();\n s.setTurnOpen(true);\n // Tear down a leftover tour: its target may be gone by the time the new turn renders.\n s.dismissGuide();\n s.setHasCompletedOnce(false);\n s.setProducedDashboardId(null);\n s.setSketchExpanded(false);\n }, [store]);\n\n const onTurnComplete = useCallback((interaction: TurnCompleteInfo) => {\n const s = store.getState();\n // React-visible state first, then `turnOpen`, so the derived mode never lands on 'empty' for a frame.\n s.setProducedDashboardId(detectProducedDashboardId(interaction));\n s.setHasCompletedOnce(true);\n s.setTurnOpen(false);\n }, [store]);\n\n const ingestToolEvent = useCallback((eventName: string, eventData: string) => store.getState().ingestToolEvent(eventName, eventData), [store]);\n const setSessionId = useCallback((sessionId: string | null) => {\n if (store.getState().currentSessionId !== sessionId) store.getState().setCurrentSessionId(sessionId);\n }, [store]);\n\n return useMemo(() => ({ onRenderPrompt, onTurnOpen, onTurnComplete, ingestToolEvent, setSessionId, environment }), [onRenderPrompt, onTurnOpen, onTurnComplete, ingestToolEvent, setSessionId, environment]);\n}\n","import React, { useEffect } from 'react';\nimport { useAiChatServices, useAiChatSessionStore } from '@aintela/chat/components';\nimport { useComposerChatBridge } from './useComposerChatBridge';\n\ntype ToolEventHandler = (eventName: string, eventData: string) => void | Promise<void>;\ninterface ToolEventBus {\n gatewayOnToolEvent?: (handler: ToolEventHandler) => void;\n gatewayOffToolEvent?: (handler: ToolEventHandler) => void;\n}\n\n/**\n * Optional glue, mounted INSIDE the host's `AiChatProvider`: mirrors the live\n * chat session id into the composer store and forwards the gateway's tool\n * events (`dashboardGenerated`, `todolistUpdated`). A host that prefers to\n * wire these itself uses `useComposerChatBridge().setSessionId` /\n * `.ingestToolEvent` instead.\n */\nexport const ComposerChatBinding: React.FC = () => {\n const bridge = useComposerChatBridge();\n const sessionId = useAiChatSessionStore((s) => s.session?.id ?? null);\n const { eventBusService } = useAiChatServices();\n\n useEffect(() => {\n bridge.setSessionId(sessionId);\n }, [sessionId, bridge]);\n\n useEffect(() => {\n const bus = eventBusService as unknown as ToolEventBus;\n if (!bus?.gatewayOnToolEvent) return;\n const handler: ToolEventHandler = (name, data) => bridge.ingestToolEvent(name, data);\n bus.gatewayOnToolEvent(handler);\n return () => bus.gatewayOffToolEvent?.(handler);\n }, [eventBusService, bridge]);\n\n return null;\n};\n\nexport default ComposerChatBinding;\n","import React, { useEffect, useState } from 'react';\nimport Box from '@mui/material/Box';\nimport Dialog from '@mui/material/Dialog';\nimport IconButton from '@mui/material/IconButton';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { ChevronIcon, CloseIcon, DashboardIcon, PanelIcon } from '@aintela/chat/components';\nimport { ScriptDashboardViewer } from '../../viewer/ScriptDashboardViewer';\nimport { useComposer } from '../store/ComposerProvider';\nimport { resolveComposerSurfaces } from './surfaces';\n\nconst PIN_HEIGHT_FR = '0 0 40%';\n\ntype PinState = 'expanded' | 'minimized';\n\n/**\n * The pinned-at-top dashboard preview (the side panel's predecessor):\n * hidden until the live definition has a `jsFileName`, then an expanded\n * viewer at ~40% of the column or a one-line chip, with a fullscreen dialog.\n */\nconst DashboardPinInner: React.FC = () => {\n const theme = useTheme();\n const surfaces = resolveComposerSurfaces(theme);\n const jsFileName = useComposer((s) => s.dashboardDefinition?.jsFileName ?? null);\n const dashboardId = useComposer((s) => s.dashboardDefinition?.id ?? null);\n const dashboardName = useComposer((s) => s.dashboardDefinition?.name || 'Dashboard');\n const cardCount = useComposer((s) => s.dashboardDefinition?.cards?.length ?? 0);\n const [state, setState] = useState<PinState>('expanded');\n const [fullscreen, setFullscreen] = useState(false);\n\n const visible = !!jsFileName && !!dashboardId;\n const [showReadyToast, setShowReadyToast] = useState(false);\n useEffect(() => {\n if (!visible) {\n setShowReadyToast(false);\n return;\n }\n setShowReadyToast(true);\n const timer = window.setTimeout(() => setShowReadyToast(false), 2500);\n return () => window.clearTimeout(timer);\n }, [visible]);\n\n if (!visible || !dashboardId) return null;\n\n const headerButtonSx = { color: theme.palette.text.secondary, p: 0.5, '&:hover': { color: theme.palette.text.primary, backgroundColor: surfaces.hover } };\n const counter = (\n <>\n <Typography sx={{ color: theme.palette.text.disabled, fontSize: 11 }}>·</Typography>\n <Typography sx={{ fontFamily: surfaces.fontFamilyMono, color: theme.palette.text.secondary, fontSize: 11 }}>\n {cardCount} {cardCount === 1 ? 'card' : 'cards'}\n </Typography>\n </>\n );\n\n if (state === 'minimized') {\n return (\n <Box sx={{ flexShrink: 0, px: 1.5, py: 1, borderBottom: `1px solid ${surfaces.borderSoft}`, backgroundColor: theme.palette.background.paper }}>\n <Box\n role=\"button\"\n tabIndex={0}\n onClick={() => setState('expanded')}\n onKeyDown={(e) => {\n if (e.key === 'Enter') setState('expanded');\n }}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n px: 1.25,\n py: 0.5,\n borderRadius: 999,\n cursor: 'pointer',\n backgroundColor: surfaces.raised,\n border: `1px solid ${theme.palette.divider}`,\n color: theme.palette.text.primary,\n fontFamily: theme.typography.fontFamily,\n fontSize: 11.5,\n transition: 'background-color .12s, border-color .12s',\n '&:hover': { backgroundColor: surfaces.hover, borderColor: theme.palette.primary.main },\n }}\n >\n <Box sx={{ color: theme.palette.primary.main, display: 'inline-flex' }}>\n <DashboardIcon size={13} />\n </Box>\n <Box component=\"span\" sx={{ fontWeight: 500 }}>{dashboardName}</Box>\n {counter}\n <Box component=\"span\" sx={{ color: theme.palette.text.disabled, mx: 0.25 }}>|</Box>\n <Box component=\"span\" sx={{ color: theme.palette.primary.main, fontWeight: 500 }}>expandir</Box>\n </Box>\n </Box>\n );\n }\n\n return (\n <>\n <motion.div initial={{ opacity: 0, y: -8, scaleY: 0.96 }} animate={{ opacity: 1, y: 0, scaleY: 1 }} transition={{ duration: 0.32, ease: [0.22, 0.8, 0.32, 1] }} style={{ transformOrigin: 'top center', flex: PIN_HEIGHT_FR, minHeight: 200, display: 'flex', flexDirection: 'column' }}>\n <Box sx={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column', borderBottom: `1px solid ${surfaces.borderSoft}`, backgroundColor: theme.palette.background.default, overflow: 'hidden', position: 'relative' }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, px: 1.5, py: 0.875, borderBottom: `1px solid ${surfaces.borderSoft}`, backgroundColor: theme.palette.background.paper, flexShrink: 0 }}>\n <Box sx={{ color: theme.palette.primary.main, display: 'inline-flex' }}>\n <DashboardIcon size={14} />\n </Box>\n <Typography sx={{ color: theme.palette.text.primary, fontWeight: 500, fontSize: 12 }}>{dashboardName}</Typography>\n {counter}\n <Box sx={{ flex: 1 }} />\n <Tooltip title=\"Tela cheia\" placement=\"top\">\n <IconButton size=\"small\" onClick={() => setFullscreen(true)} sx={headerButtonSx} aria-label=\"Abrir em tela cheia\">\n <PanelIcon size={13} />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Minimizar\" placement=\"top\">\n <IconButton size=\"small\" onClick={() => setState('minimized')} sx={{ ...headerButtonSx, transform: 'rotate(180deg)' }} aria-label=\"Minimizar\">\n <ChevronIcon size={13} />\n </IconButton>\n </Tooltip>\n </Box>\n\n <AnimatePresence>\n {showReadyToast && (\n <motion.div\n initial={{ opacity: 0, y: -6 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.25, ease: 'easeOut' }}\n style={{\n position: 'absolute',\n top: 8,\n right: 12,\n zIndex: 2,\n pointerEvents: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n background: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n fontFamily: theme.typography.fontFamily,\n fontSize: 11,\n fontWeight: 600,\n padding: '4px 10px 4px 8px',\n borderRadius: 999,\n boxShadow: `0 4px 14px ${alpha(theme.palette.primary.main, 0.35)}`,\n }}\n >\n <DashboardIcon size={11} />\n Dashboard pronto\n </motion.div>\n )}\n </AnimatePresence>\n\n <Box sx={{ flex: 1, minHeight: 0, overflow: 'auto' }}>\n <ScriptDashboardViewer dashboardId={dashboardId} />\n </Box>\n </Box>\n </motion.div>\n\n <Dialog open={fullscreen} onClose={() => setFullscreen(false)} maxWidth={false} fullScreen slotProps={{ paper: { sx: { backgroundColor: theme.palette.background.default, backgroundImage: 'none', color: theme.palette.text.primary } } }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, px: 2, py: 1.25, borderBottom: `1px solid ${theme.palette.divider}`, backgroundColor: theme.palette.background.paper, flexShrink: 0 }}>\n <Box sx={{ color: theme.palette.primary.main, display: 'inline-flex' }}>\n <DashboardIcon size={16} />\n </Box>\n <Typography sx={{ color: theme.palette.text.primary, fontWeight: 500, fontSize: 13.5 }}>{dashboardName}</Typography>\n {counter}\n <Box sx={{ flex: 1 }} />\n <Tooltip title=\"Fechar\" placement=\"left\">\n <IconButton size=\"small\" onClick={() => setFullscreen(false)} sx={{ ...headerButtonSx, p: 0.75 }} aria-label=\"Fechar\">\n <CloseIcon size={14} />\n </IconButton>\n </Tooltip>\n </Box>\n <Box sx={{ flex: 1, minHeight: 0, overflow: 'auto' }}>\n <ScriptDashboardViewer dashboardId={dashboardId} />\n </Box>\n </Dialog>\n </>\n );\n};\n\nDashboardPinInner.displayName = 'DashboardPin';\n\nexport const DashboardPin = React.memo(DashboardPinInner);\n\nexport default DashboardPin;\n"],"names":["sanitizeToJsVariable","name","cleaned","_","c","__name","randomId","out","DEFAULT_PAD_HEIGHT_PX","joinClientSideChanges","map","entries","v","CARD_TYPE_CATALOG","groupCardCatalog","catalog","acc","item","_a","FILTER_TYPE_CATALOG","sketchCardItemComparer","a","b","sketchFilterComparer","validateSketch","dash","seen","hasDuplicate","card","errorMessage","ROW_HEIGHT_PX","padConfigToDashboard","def","cards","currentX","currentY","rowH","index","size","height","h","actionDescription","specificType","id","category","React","p","_b","_c","isSimplePadDefinition","d","categoryPrefix","CATEGORY_PREFIXES","ENV_HIGHLIGHT_CLASS","defaultRoot","escapeCssValue","value","looksLikeSelector","toSelectorList","target","selectors","appendByIdentifier","identifier","escaped","appendByClassName","className","trimmed","resolveEnvironmentElements","root","found","selector","element","error","isElementVisible","rect","style","pickBestElement","elements","includeHidden","resolveGuideElement","el","PAD_INTERNAL_IDS","PAD_INTERNAL_CLASSES","UUIDISH_RE","targetSuggestsPadInternal","t","checkId","checkClass","cls","guideStepsRequireSketch","steps","s","ClonedComponent","entry","onHover","jsx","Box","toDraftPayload","dashboard","filters","layoutType","remarks","userPrompt","grid_definition","updated_grid_definition","filter_components","isDatasetParameterized","defaultDatasetName","_clientSideChanges","metadata","fromUpsertResponse","resp","r","draft","upsertDashboardDraft","client","createDashboardDraft","sessionId","seed","VIEWER_COMMIT_DEBOUNCE_MS","DRAFT_SAVE_DEBOUNCE_MS","GUIDE_SHOW_DELAY_MS","DEFAULT_HIGHLIGHT_MS","createComposerStore","options","viewerDebounce","draftDebounce","onDraftSaveError","err","createStore","set","get","_saveDraft","promise","_scheduleDraftSave","prev","timer","_scheduleViewerCommit","live","_cancelViewerCommit","internalUpdateDashboardPad","current","isTurnOpen","incomingId","resolved","merged","inflight","eventName","eventData","dashboardDefinition","todoList","next","changed","open","fields","newDefinition","isFirstPopulation","hasScript","snapshot","key","text","trimmedKey","trimmedText","existing","viewport","opts","durationMs","source","response","guideOptions","invalid","ComposerStoreContext","createContext","ComposerProvider","store","children","ambient","useBiClientOptional","resolvedClient","api","useState","useEffect","useComposerStore","useContext","useComposerStoreOptional","useComposer","useStore","useComposerEnvironment","useShallow","environmentFromStore","CATEGORY_ICONS","DashboardOutlined","TagOutlined","TableChartOutlined","BarChartOutlined","MapOutlined","GridViewOutlined","SpeedOutlined","COLOR_MAP","SPECIFIC_TYPE_ICONS","ViewColumnOutlined","HeatPumpOutlined","TableRowsOutlined","ShowChartOutlined","AlignHorizontalLeftOutlined","AreaChartOutlined","StackedLineChartOutlined","StackedBarChartOutlined","MultilineChartOutlined","PieChartOutlined","ScatterPlotOutlined","DonutLargeOutlined","BubbleChartOutlined","TimelineOutlined","SPECIFIC_TYPE_ICON_NAMES","FILTER_TYPE_ICONS","DateRangeOutlined","CalendarTodayOutlined","ManageSearchOutlined","defaultCardTypeIcons","CardTypeIconsContext","CardTypeIconsProvider","icons","parent","useMemo","useCardTypeIcons","MAX_NAME_LENGTH","groupedCatalog","useElementHeight","ref","setHeight","measure","ro","CardSketch","props","setName","description","setDescription","editingName","setEditingName","localCellData","setLocalCellData","editingDescription","setEditingDescription","typeMenuOpen","setTypeMenuOpen","textFieldRef","useRef","typeIconRef","descriptionBoxRef","descHeight","currentType","currentCategory","TypeIcon","inputField","handleKeyPress","event","handleChange","setter","sender","newData","handleTypeChange","prefix","todoStatus","stop","e","renderDescription","jsxs","Stack","IconButton","DeleteOutline","theme","alpha","CheckCircle","Pending","CircularProgress","Typography","Popper","TransitionProps","Grow","Paper","ClickAwayListener","MenuList","items","gi","CatIcon","Divider","Icon","MenuItem","ListItemIcon","ListItemText","TextField","CardScketch","FilterSketch","filter","onEdit","onDelete","inputRef","commitName","handleKeyDown","Tooltip","Switch","checked","TitleSketch","editingText","setEditingText","setText","fontSize","commit","TextSketh","TitleSkath","widthConfig","sizeConfig","DEFAULT_H","useContainerWidth","renderId","initialWidth","width","setWidth","observer","makeNameUnique","timeSuffix","DashboardPadSketch","forwardRef","EMPTY_CARDS","EMPTY_FILTERS","dashboardName","dashboardId","turnOpen","todosByCardKey","nativeConfig","setNativeConfig","containerRef","containerWidth","sizeType","setSizeType","defaultWidth","setDefaultWidth","countersRef","filterCounterRef","prevDashboardIdRef","useTheme","effectiveZoomLevel","handleLayoutTypeChange","useCallback","loadedCards","getNextName","handleLayoutChange","layout","_responsive","commitUserLayoutEdit","oldItem","newItem","currentCards","synced","layoutItem","l","touchedCard","label","sizeChanged","moveChanged","layoutKey","handleRemoveCard","cardKey","getSketchCell","handleNameChange","paramName","handleEditData","data","nativeItem","n","prevCard","updatedCards","diffs","computeNewPosition","currentMaxWidth","last","x","y","appendCard","cell","note","handleDrop","addGenericCell","newCell","pos","addTypedCell","_label","type","handleAddFilter","filterType","filterName","mandatory","newFilter","currentFilters","handleEditFilter","updated","f","handleDeleteFilter","filterId","useImperativeHandle","toggleSx","selected","toggleLabelSx","ToggleButtonGroup","ToggleButton","ViewQuiltOutlined","BorderClearOutlined","GridLayout","GridCardPlaceHolder","HoverButton","calcMaxWidth","createDragPreview","iconSvgHtml","ToolBox","onAddGeneric","onAddTyped","onAddFilter","menuOpen","setMenuOpen","filterMenuOpen","setFilterMenuOpen","anchorRef","filterAnchorRef","dragPreviewRef","cleanupDragPreview","handleDragStart","iconEl","iconHtml","preview","handleMenuItemClick","DragIndicatorOutlined","Button","AddOutlined","ArrowDropDownOutlined","CategoryIcon","Fragment","FilterListOutlined","ft","FIcon","DashboardPad","definition","published","viewType","renderGeneration","llmCounter","createError","setCreateError","composerError","setComposerError","saving","setSaving","loadOpen","setLoadOpen","hierarchy","setHierarchy","hierarchyLoading","setHierarchyLoading","loadAnchorRef","padHandleRef","inflightRef","lastLoadedDashboardId","compose","applyDashboardOnPad","loaded","handleSave","handleNew","handleRefresh","handleLoadToggle","willOpen","handleLoadDashboard","renderDashboardPicker","envIcon","node","viewToggleSx","viewLabelSx","max","ArrowBack","PreviewRounded","cat","spec","NoteAddOutlined","SaveOutlined","RefreshOutlined","FolderOpenOutlined","StartRounded","ScriptDashboardViewer","TAB_HEIGHT","TAB_MIN_WIDTH","TAB_MAX_WIDTH","DashboardPadEditor","defaultType","untitledCounter","nextUntitledName","tabs","setTabs","activeTabName","setActiveTabName","editingTabName","setEditingTabName","editValue","setEditValue","addMenuAnchor","setAddMenuAnchor","editInputRef","activeTab","resolveUniqueName","desired","exclude","candidate","suffix","focusTab","tabName","createTab","contentType","resolvedName","newTab","closeTab","idx","closing","fallback","startRename","tab","commitRename","uniqueName","previousName","renamed","handleRenameKeyDown","handleAddMenuOpen","defaultTabIcon","FileIcon","isActive","isEditing","CloseIcon","AddIcon","Menu","i","DatasetParameterizationControls","orientation","datasets","defaultTemplateDataset","agents","agentId","recommendedAgentId","onAgentChange","handleToggle","visualAgentId","isColumn","Select","picked","ExamplePad","backgroundColor","zoom","title","config","Grid","ExampleCardSketch","ExampleCardSketh","ExampleCardSkath","PrototypePad","nameOrNode","descriptionOrNode","dateRange","datePicker","autoComplete","multiple","useDashboardPad","env","useEnvironment","ambientVariants","activityPanelVariants","composerLayoutTransition","ambientVariantsReduced","activityPanelVariantsReduced","composerLayoutTransitionReduced","TEMPLATE_KIND_TO_SKETCH","templateKinds","seedFromTemplate","template","idPrefix","mapped","defaultComposerTemplates","STARTER_TEMPLATES","resolveComposerSurfaces","mono","useWindowSize","read","setSize","onResize","pad2","isoDate","DashboardSidePanelInner","surfaces","jsFileName","llmRenderCount","cardCount","refreshTick","setRefreshTick","fullscreen","setFullscreen","collapsed","setCollapsed","dashboardParameters","setDashboardParameters","params","now","begin","changeCollapse","panelWidth","ww","wh","factorW","factorH","expandedWidth","expandedHeight","visible","headerButtonSx","AnimatePresence","motion","DashboardIcon","PanelIcon","Fullscreen","ScriptDashboardViewerVertical","Dialog","DashboardSidePanel","RailSectionLabel","diffById","liveById","it","pubById","added","removed","modified","railActionPill","disabled","LeftRail","locked","onNameChange","onLayoutTypeChange","onAddGenericCard","onAddTypedCard","cardsOpened","onEditFilter","onDeleteFilter","datasetControls","cardAnchor","setCardAnchor","filterAnchor","setFilterAnchor","cardRef","railCollapsed","setRailCollapsed","sectionSx","menuItemSx","popoverPaperSx","PlusIcon","SearchIcon","Popover","usePulseTooltip","pulseTick","tooltipOpen","setTooltipOpen","firstPulseRef","chipMotionProps","ChipHead","SketchChip","expanded","onToggle","EditIcon","AddSketchChip","onCreate","DrawablePromptInner","onCreateSketch","onBeforeSend","sketchExpandedProp","_bottomSlot","zoomLevel","onSketchExpandedChange","seedDraft","compact","iSeedDraft","setISeedDraft","agentPulseTick","filterCount","clientSideChanges","liveDashboard","lastSentDashboard","setCardOpened","queuedDiff","fl","nameChanged","layoutChanged","parts","hasUnsentChanges","queuedChangesText","hasSketch","handleOnBefore","sketchExpanded","setSketchExpanded","handleForceOpenCard","finalName","handleAddGenericCard","handleAddTypedCard","topSlot","submitTooltipTitle","header","body","PromptV2","DrawablePrompt","defaultComposerSuggestions","TemplatePreview","kinds","accent","stroke","k","j","formatRelativeTime","ts","diff","min","hr","day","EntryEmptyState","onDraftPromptChange","onApplyTemplate","composerSlot","ambientWrapper","recentSessions","onSelectSession","onSearchAllSessions","suggestions","templates","wrap","linkButtonSx","eyebrowSx","SPOTLIGHT_PADDING","TOOLTIP_GAP","TOOLTIP_MAX_WIDTH","TOOLTIP_MIN_WIDTH","RETRY_INTERVAL_MS","MAX_WAIT_MS","computePlacement","placement","targetRect","tooltipWidth","tooltipHeight","vw","vh","candidates","side","top","left","SpotlightOverlay","overlayOpacity","allowInteraction","onComplete","onDismiss","resolveElement","currentIndex","setCurrentIndex","setTargetRect","tooltipSize","setTooltipSize","tooltipRef","animFrameRef","step","isFirst","isLast","updateTargetRect","cancelled","elapsed","timeoutId","giveUpOnStep","attempt","onScroll","offsetWidth","offsetHeight","handleNext","handlePrev","onKey","spotlightClip","tooltipPos","buttonBase","createPortal","COMPOSER_LAYOUT_ID","RECENT_SESSIONS_LIMIT","ComposerInner","routeSessionId","composerMode","onForceExecutionMode","recentSessionsResolved","composerDashboardName","draftPrompt","setDraftPrompt","prevJsFileName","setPrevJsFileName","dashboardCollapseState","setDashboardCollapseState","jsFileNameChange","setJsFileNameChange","hasDashboard","dashboardLoadedSessionRef","dashSid","full","ensureDraft","sid","inheritedSeed","seedToSend","created","seeded","_d","handleCreateSketch","handleBeforeSend","handleApplyTemplate","reduce","useReducedMotion","activityVariants","layoutTransition","renderPromptForBranch","ComposerView","publish","fetchedRecent","setFetchedRecent","list","hasCompletedOnce","producedDashboardId","hasJsFile","cardsLen","filtersLen","prevAutoExpand","idAppeared","cardsAppeared","filtersAppeared","wasFirst","guideSteps","dismissGuide","handleForceExecutionMode","GRID_ROW_HEIGHT_PX","RAIL_WIDTH","detectProducedDashboardId","interaction","useComposerChatBridge","environment","onRenderPrompt","prompt","roundedHeight","dashPreviewBoxWidth","chatBoxWidth","dashFullViewBoxWidth","gridColumnWidth","descFromPrompt","parsed","typed","cardsCount","cardsDesc","filterDesc","wrapped","onTurnOpen","onTurnComplete","ingestToolEvent","setSessionId","ComposerChatBinding","bridge","useAiChatSessionStore","eventBusService","useAiChatServices","bus","handler","PIN_HEIGHT_FR","DashboardPinInner","state","setState","showReadyToast","setShowReadyToast","counter","ChevronIcon","DashboardPin"],"mappings":"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"}