@actionexec/dashboards 0.1.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/api/fetcher.ts","../src/hooks/useDashboardData.ts","../src/palettes/index.ts","../src/widgets/KPIWidget.tsx","../src/widgets/GaugeWidget.tsx","../src/widgets/ChartWidget.tsx","../src/utils/date.ts","../src/components/DashboardDatePicker.tsx","../src/widgets/FilterWidget.tsx","../src/widgets/VariableWidget.tsx","../src/components/ColorPaletteSelector.tsx","../src/widgets/ColorPaletteWidget.tsx","../src/widgets/WidgetRenderer.tsx","../src/types/index.ts","../src/Dashboard.tsx"],"sourcesContent":["// Purpose: Abstracao do fetch de dashboards. Consumer pode usar o fetcher padrao\n// (token + apiUrl) ou injetar um customizado para auth proprio.\n// Public API: DashboardFetcher (interface), createTokenFetcher, ApiError\n\nimport type { LayoutResponse, RenderResponse } from '../types';\n\nexport interface DashboardFetcher {\n /** Retorna estrutura do dashboard (widgets, paleta, grid, date bounds). */\n layout(): Promise<LayoutResponse>;\n /** Retorna dados computados aplicando filtros/variaveis via query params. */\n render(params?: Record<string, string>): Promise<RenderResponse>;\n}\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status?: number,\n public payload?: unknown,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\ninterface TokenFetcherOptions {\n /** URL base da API (ex: \"https://action.example.com/api\"). */\n apiUrl: string;\n /** Token de acesso do dashboard (Bearer). */\n token: string;\n /** Fetch customizado (default: globalThis.fetch). */\n fetch?: typeof fetch;\n /** Prefixo dos endpoints (default: \"/external/dashboards\"). */\n endpointPrefix?: string;\n}\n\n/** Cria um fetcher baseado em token Bearer, consumindo /external/dashboards. */\nexport function createTokenFetcher(options: TokenFetcherOptions): DashboardFetcher {\n const { apiUrl, token, fetch: fetchImpl = globalThis.fetch } = options;\n const prefix = options.endpointPrefix ?? '/external/dashboards';\n const base = apiUrl.replace(/\\/$/, '');\n\n async function get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${base}${prefix}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);\n }\n\n const res = await fetchImpl(url.toString(), {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!res.ok) {\n let payload: unknown;\n try { payload = await res.json(); } catch { /* non-json */ }\n throw new ApiError(\n `Requisicao falhou (${res.status}) em ${path}`,\n res.status,\n payload,\n );\n }\n return (await res.json()) as T;\n }\n\n return {\n layout: () => get<LayoutResponse>('/layout'),\n render: (params) => get<RenderResponse>('/render', params),\n };\n}\n","// Purpose: Hook que gerencia estado + fetch de um dashboard inteiro.\n// Scope: Carrega layout uma vez + render com debounce quando filtros/variaveis mudam.\n// Sincroniza estado local com os defaults aplicados pelo backend na 1a carga.\n// Public API: useDashboardData\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { DashboardFetcher } from '../api/fetcher';\nimport type { LayoutResponse, RenderResponse } from '../types';\n\nexport interface UseDashboardDataResult {\n layout: LayoutResponse | null;\n renderData: RenderResponse | null;\n loading: boolean;\n error: string | null;\n /** Filtros selecionados (formato string por widget — date_range como \"start|end\"). */\n filters: Record<string, string>;\n /** Overrides de variaveis por widget. */\n variables: Record<string, number>;\n /** Paleta efetiva (override local substitui a do layout). */\n palette: string[];\n setFilter(widgetId: string, value: string): void;\n setVariable(widgetId: string, value: number): void;\n setPalette(colors: string[]): void;\n}\n\nconst DEBOUNCE_MS = 300;\n\nexport function useDashboardData(fetcher: DashboardFetcher): UseDashboardDataResult {\n const [layout, setLayout] = useState<LayoutResponse | null>(null);\n const [renderData, setRenderData] = useState<RenderResponse | null>(null);\n const [filters, setFilters] = useState<Record<string, string>>({});\n const [variables, setVariables] = useState<Record<string, number>>({});\n const [localPalette, setLocalPalette] = useState<string[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\n const appliedSyncedRef = useRef(false);\n\n // -------Carrega layout uma unica vez-------\n useEffect(() => {\n let cancelled = false;\n fetcher.layout()\n .then((res) => {\n if (!cancelled) setLayout(res);\n })\n .catch((err: Error) => {\n if (!cancelled) setError(err.message);\n });\n return () => { cancelled = true; };\n // Intencional: fetcher e estavel por chamador (memoize antes de passar)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // -------Render com debounce quando filtros/variaveis mudam-------\n useEffect(() => {\n if (!layout) return;\n if (debounceRef.current) clearTimeout(debounceRef.current);\n\n debounceRef.current = setTimeout(() => {\n const params = buildQueryParams(filters, variables);\n setLoading(true);\n fetcher.render(params)\n .then((res) => {\n setRenderData(res);\n if (!appliedSyncedRef.current && res.applied) {\n appliedSyncedRef.current = true;\n setFilters((prev) => ({ ...syncFiltersFromApplied(res.applied), ...prev }));\n }\n setError(null);\n })\n .catch((err: Error) => setError(err.message))\n .finally(() => setLoading(false));\n }, DEBOUNCE_MS);\n\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [layout, filters, variables, fetcher]);\n\n const setFilter = useCallback((widgetId: string, value: string) => {\n setFilters((prev) => ({ ...prev, [widgetId]: value }));\n }, []);\n\n const setVariable = useCallback((widgetId: string, value: number) => {\n setVariables((prev) => ({ ...prev, [widgetId]: value }));\n }, []);\n\n const setPalette = useCallback((colors: string[]) => {\n setLocalPalette(colors);\n }, []);\n\n const palette = useMemo(\n () => localPalette ?? layout?.palette ?? [],\n [localPalette, layout],\n );\n\n return {\n layout, renderData, loading, error,\n filters, variables, palette,\n setFilter, setVariable, setPalette,\n };\n}\n\n// -------Helpers-------\n\n/** Constroi query params no formato esperado pela API (/render). */\nfunction buildQueryParams(\n filters: Record<string, string>,\n variables: Record<string, number>,\n): Record<string, string> {\n const params: Record<string, string> = {};\n\n for (const [key, val] of Object.entries(filters)) {\n // date_range: split \"start|end\" into f_date_start, f_date_end\n if (val.includes('|')) {\n const [start, end] = val.split('|');\n if (start) params['f_date_start'] = start;\n if (end) params['f_date_end'] = end;\n } else {\n // Envia mesmo vazio (\"Todos\") para evitar fallback ao default do backend\n params[`f_${key}`] = val;\n }\n }\n\n for (const [key, val] of Object.entries(variables)) {\n params[`v_${key}`] = String(val);\n }\n\n return params;\n}\n\n/** Converte `applied` do backend para o formato local de filtros. */\nfunction syncFiltersFromApplied(applied: Record<string, unknown>): Record<string, string> {\n const synced: Record<string, string> = {};\n for (const [id, val] of Object.entries(applied)) {\n if (val && typeof val === 'object' && 'start' in val) {\n const d = val as { start?: string; end?: string };\n synced[id] = `${d.start || ''}|${d.end || ''}`;\n } else if (Array.isArray(val)) {\n synced[id] = val.join(',');\n } else if (typeof val === 'string') {\n synced[id] = val;\n }\n }\n return synced;\n}\n","// Purpose: Paletas de cores completas para dashboards (series de dados + cores de UI).\n// Scope: Define paletas com 13 slots semanticos (5 series + 8 cores de UI) e helpers\n// para extrair series e gerar CSS variables aplicaveis ao escopo do dashboard.\n// Public API: PALETTES, PaletteKey, Palette, getSeries, getPaletteCssVars,\n// SLOT_INDEX, SLOT_LABELS, DEFAULT_PALETTE_COLORS, ensurePaletteShape\n\nexport interface Palette {\n label: string;\n colors: string[]; // 13 cores ordenadas pelos slots semanticos\n}\n\nexport type PaletteKey = 'action' | 'westCoast' | 'mono' | 'ocean' | 'princess';\n\n// -------Slots semanticos (indices fixos no array de cores)-------\n//\n// Convencao posicional para manter o storage como string[] (compativel com schemas\n// Pydantic e o tipo `PaletteConfig.paletteColors`). Cada paleta deve ter 13 cores.\n\nexport const SLOT_INDEX = {\n series0: 0,\n series1: 1,\n series2: 2,\n series3: 3,\n series4: 4,\n bgDark: 5,\n bgPaper: 6,\n bgElevated: 7,\n textPrimary: 8,\n textMuted: 9,\n accent: 10,\n success: 11,\n error: 12,\n} as const;\n\nexport const SERIES_COUNT = 5;\nexport const TOTAL_SLOTS = 13;\n\nexport const SLOT_LABELS: Record<keyof typeof SLOT_INDEX, string> = {\n series0: 'Série 1',\n series1: 'Série 2',\n series2: 'Série 3',\n series3: 'Série 4',\n series4: 'Série 5',\n bgDark: 'Fundo Escuro',\n bgPaper: 'Fundo Cartão',\n bgElevated: 'Fundo Elevado',\n textPrimary: 'Texto Primário',\n textMuted: 'Texto Secundário',\n accent: 'Destaque',\n success: 'Sucesso',\n error: 'Erro',\n};\n\n// -------Presets-------\n\nexport const PALETTES: Record<PaletteKey, Palette> = {\n action: {\n label: 'Action',\n colors: [\n '#ff6b00', '#a3e635', '#e3f544', '#65ffd1', '#ff0404',\n '#1a1a1a',\n '#262626',\n '#333333',\n '#f5f5f5',\n '#999999',\n '#ff6b00',\n '#a3e635',\n '#ef4444',\n ],\n },\n westCoast: {\n label: 'West Coast',\n colors: [\n '#a3b86c', '#c89b3c', '#8b6f47', '#6b8e23', '#d2691e',\n '#1f1a14',\n '#2a241b',\n '#3a3225',\n '#e8dcc4',\n '#a89878',\n '#c89b3c',\n '#a3b86c',\n '#c44536',\n ],\n },\n mono: {\n label: 'Monocromático',\n colors: [\n '#f8fafc', '#cbd5e1', '#94a3b8', '#64748b', '#475569',\n '#0a0a0a',\n '#171717',\n '#262626',\n '#fafafa',\n '#a3a3a3',\n '#e5e5e5',\n '#cbd5e1',\n '#ef4444',\n ],\n },\n ocean: {\n label: 'Ocean',\n colors: [\n '#0ea5e9', '#06b6d4', '#0891b2', '#3b82f6', '#22d3ee',\n '#0a1929',\n '#0f2740',\n '#173554',\n '#e0f2fe',\n '#7dd3fc',\n '#22d3ee',\n '#10b981',\n '#f43f5e',\n ],\n },\n princess: {\n label: 'Cute Pink',\n colors: [\n '#ff79bc', '#a855f7', '#f472b6', '#d946ef', '#fb7185',\n '#fff0f6',\n '#ffe4ec',\n '#ffffff',\n '#ff4099',\n '#ffadd5',\n '#ec4899',\n '#10b981',\n '#e11d48',\n ],\n },\n};\n\nexport const DEFAULT_PALETTE: PaletteKey = 'action';\n\n// Array de cores default expandido (13 slots)\nexport const DEFAULT_PALETTE_COLORS: string[] = PALETTES.action.colors;\n\n// -------Helpers-------\n\n/** Garante que a paleta tem TOTAL_SLOTS cores. Preenche faltantes com fallback do default. */\nexport function ensurePaletteShape(colors?: string[]): string[] {\n const fallback = DEFAULT_PALETTE_COLORS;\n if (!colors || colors.length === 0) return [...fallback];\n if (colors.length >= TOTAL_SLOTS) return colors.slice(0, TOTAL_SLOTS);\n const result = [...colors];\n for (let i = colors.length; i < TOTAL_SLOTS; i++) result.push(fallback[i]);\n return result;\n}\n\n/** Extrai apenas as cores de series (uso em charts/gauge). */\nexport function getSeries(colors?: string[]): string[] {\n const full = ensurePaletteShape(colors);\n return full.slice(0, SERIES_COUNT);\n}\n\n/** Gera objeto de CSS variables para aplicar inline no escopo do dashboard. */\nexport function getPaletteCssVars(colors?: string[]): Record<string, string> {\n const c = ensurePaletteShape(colors);\n return {\n '--bg-dark': c[SLOT_INDEX.bgDark],\n '--bg-paper': c[SLOT_INDEX.bgPaper],\n '--bg-elevated': c[SLOT_INDEX.bgElevated],\n '--text-primary': c[SLOT_INDEX.textPrimary],\n '--text-secondary': c[SLOT_INDEX.textMuted],\n '--text-muted': c[SLOT_INDEX.textMuted],\n '--action-orange': c[SLOT_INDEX.accent],\n '--action-green': c[SLOT_INDEX.success],\n '--color-success': c[SLOT_INDEX.success],\n '--color-error': c[SLOT_INDEX.error],\n '--color-info': c[SLOT_INDEX.series2],\n '--color-warning': c[SLOT_INDEX.series3],\n };\n}\n","// Purpose: KPI card com valor computado + comparacao.\n// Scope: Renderiza label, valor formatado, seta de trend, variance.\n// Public API: KPIWidget\n\ninterface Props {\n data: Record<string, unknown>;\n label?: string;\n}\n\nexport function KPIWidget({ data, label }: Props) {\n const displayLabel = label || String(data.label || '');\n const formatted = String(data.formatted || '-');\n const comparison = data.comparison as {\n previous_value?: number | null;\n variance_pct?: number | null;\n trend?: string | null;\n label?: string | null;\n } | null;\n\n const trendClass = comparison?.trend === 'up'\n ? 'widget-kpi__trend--up'\n : comparison?.trend === 'down'\n ? 'widget-kpi__trend--down'\n : '';\n\n const arrow = comparison?.trend === 'up' ? '↑' : comparison?.trend === 'down' ? '↓' : '';\n\n return (\n <div className=\"widget widget-kpi\">\n <span className=\"widget-kpi__label\">{displayLabel}</span>\n <span className=\"widget-kpi__value\">{formatted}</span>\n {comparison && comparison.variance_pct != null && (\n <div className={`widget-kpi__trend ${trendClass}`}>\n <span className=\"widget-kpi__variance\">\n {arrow} {comparison.variance_pct > 0 ? '+' : ''}{comparison.variance_pct.toFixed(1)}%\n </span>\n {comparison.label && (\n <span className=\"widget-kpi__trend-label\">{comparison.label}</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","// Purpose: Gauge widget (progresso vs meta).\n// Scope: Semicirculo SVG com percentual, valores brutos e indicador de meta batida.\n// Public API: GaugeWidget\n\ninterface Props {\n data: Record<string, unknown>;\n palette: string[];\n label?: string;\n}\n\nconst COLOR_EMPTY = 'var(--bg-elevated)';\n\n/** Gera path SVG de um arco semicircular (de esquerda para direita, no topo). */\nfunction arcPath(cx: number, cy: number, r: number, fraction: number): string {\n if (fraction <= 0) return '';\n if (fraction >= 1) {\n // Semicirculo completo: dois arcos de 90° (SVG nao desenha arco de exatamente 180°)\n return `M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${cx} ${cy - r} A ${r} ${r} 0 0 1 ${cx + r} ${cy}`;\n }\n const angle = fraction * Math.PI;\n const endX = cx - r * Math.cos(angle);\n const endY = cy - r * Math.sin(angle);\n return `M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${endX} ${endY}`;\n}\n\nfunction formatCompact(value: number): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n return value.toLocaleString('pt-BR');\n}\n\nexport function GaugeWidget({ data, palette, label: propLabel }: Props) {\n const label = propLabel || String(data.label || '');\n const rawValue = typeof data.value === 'number' ? data.value : null;\n const valueFormatted = rawValue != null ? formatCompact(rawValue) : '-';\n const formatted = String(data.formatted || '-');\n const ratio = typeof data.ratio === 'number' ? data.ratio : 0;\n const targetValue = data.target_value as number | null;\n\n const comparisonLabel = data.comparison_label as string | null;\n const exceeded = ratio >= 1;\n const clamped = Math.min(Math.max(ratio, 0), 1);\n\n const fillColor = exceeded\n ? 'var(--action-green)'\n : ratio >= 0.7\n ? (palette[0] || 'var(--color-info)')\n : ratio >= 0.4\n ? 'var(--color-warning)'\n : 'var(--color-error)';\n\n const targetFormatted = targetValue != null ? formatCompact(targetValue) : '-';\n\n const cx = 50, cy = 50, r = 44, stroke = 10;\n\n return (\n <div className=\"widget widget-gauge\">\n <span className=\"widget-gauge__label\">{label}</span>\n <div className=\"widget-gauge__chart\">\n <svg viewBox=\"0 0 100 56\" preserveAspectRatio=\"xMidYMax meet\">\n <path d={arcPath(cx, cy, r, 1)} fill=\"none\" stroke={COLOR_EMPTY} strokeWidth={stroke} strokeLinecap=\"butt\" />\n {clamped > 0 && (\n <path d={arcPath(cx, cy, r, clamped)} fill=\"none\" stroke={fillColor} strokeWidth={stroke} strokeLinecap=\"butt\" />\n )}\n </svg>\n <div className=\"widget-gauge__center\">\n <span className=\"widget-gauge__percent\">{formatted}</span>\n <span className=\"widget-gauge__comparison\">{valueFormatted} / {targetFormatted}</span>\n {exceeded && <span className=\"widget-gauge__badge\">{comparisonLabel || 'Meta batida'}</span>}\n {!exceeded && comparisonLabel && <span className=\"widget-gauge__comparison\">{comparisonLabel}</span>}\n </div>\n </div>\n </div>\n );\n}\n","// Purpose: Chart widget (bar/line/area/pie via Recharts).\n// Scope: Renderiza com dados pre-calculados pelo backend + tooltip tematizado.\n// Public API: ChartWidget\n\nimport { useRef, useState, useEffect, type ComponentType, type ReactElement } from 'react';\nimport {\n BarChart, Bar,\n LineChart, Line,\n AreaChart, Area,\n PieChart, Pie, Cell,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n} from 'recharts';\n\nconst AXIS_STYLE = { fontSize: 10, fill: 'var(--text-muted)' };\nconst GRID_STROKE = 'var(--bg-elevated)';\n\n// Tooltip segue a paleta do dashboard via CSS variables (getPaletteCssVars)\nconst TOOLTIP_CONTENT_STYLE = {\n backgroundColor: 'var(--bg-elevated)',\n border: '1px solid var(--bg-paper)',\n borderRadius: '6px',\n color: 'var(--text-primary)',\n};\nconst TOOLTIP_LABEL_STYLE = {\n color: 'var(--text-primary)',\n fontWeight: 600,\n};\n\n// Usa `tooltipLabel` (versao verbose) do data point quando presente,\n// fallback para o label do eixo X (compacto).\nfunction tooltipLabelFormatter(label: unknown, payload: readonly unknown[]): string {\n const first = (Array.isArray(payload) ? payload[0] : undefined) as { payload?: Record<string, unknown> } | undefined;\n const verbose = first?.payload?.tooltipLabel;\n if (typeof verbose === 'string' && verbose) return verbose;\n return String(label ?? '');\n}\n\ninterface SeriesInfo { key: string; label: string }\n\n// Hook para medir dimensoes do container via ResizeObserver\nfunction useContainerSize(ref: React.RefObject<HTMLDivElement | null>) {\n const [size, setSize] = useState({ width: 0, height: 0 });\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n setSize((prev) =>\n prev.width !== Math.floor(width) || prev.height !== Math.floor(height)\n ? { width: Math.floor(width), height: Math.floor(height) }\n : prev\n );\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref]);\n\n return size;\n}\n\n// Componente generico para charts cartesianos (bar/line/area)\nfunction CartesianChart({ Chart, chartData, xKey, series, palette, renderSeries, width, height }: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Chart: ComponentType<any>;\n chartData: Record<string, unknown>[];\n xKey: string;\n series: SeriesInfo[];\n palette: string[];\n renderSeries: (s: SeriesInfo, color: string, idx: number) => ReactElement;\n width: number;\n height: number;\n}) {\n return (\n <Chart data={chartData} width={width} height={height}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis dataKey={xKey} tick={AXIS_STYLE} />\n <YAxis tick={AXIS_STYLE} />\n <Tooltip\n contentStyle={TOOLTIP_CONTENT_STYLE}\n labelStyle={TOOLTIP_LABEL_STYLE}\n labelFormatter={tooltipLabelFormatter}\n cursor={{ fill: 'var(--bg-paper)', opacity: 0.3 }}\n />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => renderSeries(s, palette[i % palette.length], i))}\n </Chart>\n );\n}\n\ninterface Props {\n data: Record<string, unknown>;\n palette: string[];\n label?: string;\n}\n\nexport function ChartWidget({ data, palette, label: propLabel }: Props) {\n const chartType = String(data.chartType || 'bar');\n const title = propLabel || String(data.label || '');\n const xKey = String(data.xKey || 'label');\n const series = (data.series || []) as SeriesInfo[];\n const chartData = (data.data || []) as Record<string, unknown>[];\n\n const containerRef = useRef<HTMLDivElement>(null);\n const { width, height } = useContainerSize(containerRef);\n\n if (!chartData.length) {\n return <div className=\"widget widget-chart widget-chart--empty\">Sem dados</div>;\n }\n\n const renderChart = () => {\n if (width <= 0 || height <= 0) return null;\n\n if (chartType === 'pie') {\n return (\n <PieChart width={width} height={height}>\n <Pie\n data={chartData}\n dataKey={series[0]?.key || 's0'}\n nameKey={xKey}\n cx=\"50%\" cy=\"50%\" outerRadius=\"75%\"\n label={({ name, percent }: { name: string; percent: number }) =>\n `${name}: ${(percent * 100).toFixed(0)}%`\n }\n labelLine={false}\n >\n {chartData.map((_, i) => (\n <Cell key={i} fill={palette[i % palette.length]} />\n ))}\n </Pie>\n <Tooltip\n contentStyle={TOOLTIP_CONTENT_STYLE}\n labelStyle={TOOLTIP_LABEL_STYLE}\n labelFormatter={tooltipLabelFormatter}\n />\n </PieChart>\n );\n }\n\n const common = { chartData, xKey, series, palette, width, height };\n\n if (chartType === 'line') {\n return (\n <CartesianChart {...common} Chart={LineChart} renderSeries={(s, color) => (\n <Line key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\n stroke={color} strokeWidth={2} dot={chartData.length <= 31} />\n )} />\n );\n }\n\n if (chartType === 'area') {\n return (\n <CartesianChart {...common} Chart={AreaChart} renderSeries={(s, color) => (\n <Area key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\n fill={color} stroke={color} fillOpacity={0.3} />\n )} />\n );\n }\n\n return (\n <CartesianChart {...common} Chart={BarChart} renderSeries={(s, color) => (\n <Bar key={s.key} dataKey={s.key} name={s.label}\n fill={color} radius={[3, 3, 0, 0]} />\n )} />\n );\n };\n\n return (\n <div className=\"widget widget-chart\">\n {title && <h4 className=\"widget-chart__title\">{title}</h4>}\n <div ref={containerRef} className=\"widget-chart__container\">\n {renderChart()}\n </div>\n </div>\n );\n}\n","// Purpose: Utilitarios de data para filtros temporais de dashboards.\n// Scope: Calculo de intervalos anuais/mensais/semanais, parse de ranges, ISO week.\n// Public API: MONTH_NAMES_*, getFullYearRange, getMonthRange, getWeekRange, getISOWeek,\n// getWeeksInMonth, parseYearFromRange, parseMonthFromRange, parseWeekFromRange,\n// getYearRange, getMonthWeeks, MonthWeek\n\nexport const MONTH_NAMES_SHORT = [\n 'Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun',\n 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez',\n];\n\nexport const MONTH_NAMES_FULL = [\n 'Janeiro', 'Fevereiro', 'Marco', 'Abril', 'Maio', 'Junho',\n 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro',\n];\n\nexport function getFullYearRange(year: number): { start: string; end: string } {\n return { start: `${year}-01-01`, end: `${year}-12-31` };\n}\n\nexport function parseYearFromRange(start: string): { year: number } | null {\n if (!start) return null;\n const m = start.match(/^(\\d{4})/);\n return m ? { year: parseInt(m[1]) } : null;\n}\n\nexport function getMonthRange(year: number, month: number): { start: string; end: string } {\n const lastDay = new Date(year, month, 0).getDate();\n const pad = (n: number) => String(n).padStart(2, '0');\n return {\n start: `${year}-${pad(month)}-01`,\n end: `${year}-${pad(month)}-${pad(lastDay)}`,\n };\n}\n\nexport function getISOWeek(dt: Date): number {\n const d = new Date(Date.UTC(dt.getFullYear(), dt.getMonth(), dt.getDate()));\n d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n\nexport function getWeekRange(year: number, week: number): { start: string; end: string } {\n const jan4 = new Date(year, 0, 4);\n const dayOfWeek = (jan4.getDay() + 6) % 7;\n const firstMonday = new Date(jan4.getTime() - dayOfWeek * 86400000);\n const start = new Date(firstMonday.getTime() + (week - 1) * 7 * 86400000);\n const end = new Date(start.getTime() + 6 * 86400000);\n const pad = (n: number) => String(n).padStart(2, '0');\n const fmt = (d: Date) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n return { start: fmt(start), end: fmt(end) };\n}\n\nexport function getWeeksInMonth(year: number, month: number): number[] {\n const weeks: Set<number> = new Set();\n const daysInMonth = new Date(year, month, 0).getDate();\n for (let d = 1; d <= daysInMonth; d++) {\n weeks.add(getISOWeek(new Date(year, month - 1, d)));\n }\n return Array.from(weeks).sort((a, b) => a - b);\n}\n\nexport interface MonthWeek {\n index: number;\n startDay: number;\n endDay: number;\n start: string;\n end: string;\n label: string;\n}\n\nexport function getMonthWeeks(year: number, month: number): MonthWeek[] {\n const daysInMonth = new Date(year, month, 0).getDate();\n const pad = (n: number) => String(n).padStart(2, '0');\n const weeks: MonthWeek[] = [];\n let day = 1;\n let index = 1;\n\n while (day <= daysInMonth) {\n const startDay = day;\n const endDay = Math.min(day + 6, daysInMonth);\n const start = `${year}-${pad(month)}-${pad(startDay)}`;\n const end = `${year}-${pad(month)}-${pad(endDay)}`;\n const label = `${index}° Semana (${pad(startDay)}/${pad(month)} - ${pad(endDay)}/${pad(month)})`;\n weeks.push({ index, startDay, endDay, start, end, label });\n day = endDay + 1;\n index++;\n }\n\n return weeks;\n}\n\nexport function parseMonthWeekFromRange(start: string, year: number, month: number): number {\n if (!start) return 1;\n const pad = (n: number) => String(n).padStart(2, '0');\n const dayMatch = start.match(new RegExp(`^${year}-${pad(month)}-(\\\\d{2})`));\n if (!dayMatch) return 1;\n const day = parseInt(dayMatch[1]);\n return Math.ceil(day / 7);\n}\n\nexport function parseMonthFromRange(start: string): { year: number; month: number } | null {\n if (!start) return null;\n const m = start.match(/^(\\d{4})-(\\d{2})/);\n return m ? { year: parseInt(m[1]), month: parseInt(m[2]) } : null;\n}\n\nexport function parseWeekFromRange(start: string): { year: number; week: number } | null {\n if (!start) return null;\n const d = new Date(start + 'T00:00:00');\n if (isNaN(d.getTime())) return null;\n return { year: d.getFullYear(), week: getISOWeek(d) };\n}\n\nexport function getYearRange(dateBounds?: { min: string | null; max: string | null } | null): number[] {\n const now = new Date();\n const minYear = dateBounds?.min ? parseInt(dateBounds.min.slice(0, 4)) : now.getFullYear() - 2;\n const maxYear = dateBounds?.max ? parseInt(dateBounds.max.slice(0, 4)) : now.getFullYear();\n const years: number[] = [];\n for (let y = maxYear; y >= minYear; y--) years.push(y);\n return years;\n}\n","// Purpose: Wrapper react-datepicker para dashboards.\n// Scope: Converte YYYY-MM-DD <-> Date, aplica estilos escopados via .ddp-field.\n// Public API: DashboardDatePicker, isoToDate, dateToIso\n\nimport DatePicker from 'react-datepicker';\nimport 'react-datepicker/dist/react-datepicker.css';\n\n// -------Helpers ISO <-> Date-------\n// Usam local-time para evitar timezone shift (toISOString() converte para UTC).\n\nexport function isoToDate(iso?: string | null): Date | null {\n if (!iso) return null;\n const [y, m, d] = iso.split('-').map(Number);\n if (!y || !m || !d) return null;\n return new Date(y, m - 1, d);\n}\n\nexport function dateToIso(date?: Date | null): string {\n if (!date) return '';\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\n// -------Componente-------\n\ninterface Props {\n value: string; // 'YYYY-MM-DD' ou ''\n onChange: (iso: string) => void; // emite '' quando limpo\n minIso?: string | null;\n maxIso?: string | null;\n placeholder?: string;\n selectsStart?: boolean;\n selectsEnd?: boolean;\n startIso?: string | null;\n endIso?: string | null;\n className?: string;\n disabled?: boolean;\n}\n\nexport function DashboardDatePicker({\n value, onChange, minIso, maxIso, placeholder,\n selectsStart, selectsEnd, startIso, endIso, className, disabled,\n}: Props) {\n return (\n <div className={`ddp-field ${className ?? ''}`}>\n <DatePicker\n selected={isoToDate(value)}\n onChange={(d: Date | null) => onChange(dateToIso(d))}\n selectsStart={selectsStart}\n selectsEnd={selectsEnd}\n startDate={isoToDate(startIso) ?? undefined}\n endDate={isoToDate(endIso) ?? undefined}\n minDate={isoToDate(minIso) ?? undefined}\n maxDate={isoToDate(maxIso) ?? undefined}\n dateFormat=\"dd/MM/yyyy\"\n placeholderText={placeholder ?? 'Selecione...'}\n disabled={disabled}\n portalId=\"ddp-portal\"\n popperPlacement=\"bottom-start\"\n popperModifiers={[\n {\n name: 'flip',\n options: { fallbackPlacements: ['bottom-end', 'top-start', 'top-end'] },\n fn: (state) => state,\n },\n ]}\n />\n </div>\n );\n}\n","// Purpose: Widget de filtro interativo no grid (date_range, select, multi_select).\n// Scope: Modos temporais (range, monthly, weekly, yearly), select unico, multi-select.\n// Public API: FilterWidget\n\nimport type { FilterConfig, DateFilterMode } from '../types';\nimport {\n MONTH_NAMES_SHORT, getFullYearRange, getMonthRange,\n getMonthWeeks, parseMonthWeekFromRange,\n parseYearFromRange, parseMonthFromRange, getYearRange,\n} from '../utils/date';\nimport { DashboardDatePicker } from '../components/DashboardDatePicker';\n\ninterface Props {\n config: FilterConfig;\n value: string;\n options?: string[];\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}\n\n// -------Componente principal-------\n\nexport function FilterWidget({ config, value, options = [], dateBounds, onChange }: Props) {\n const filterType = config.filterType || 'select';\n const label = config.label || 'Filtro';\n const dateMode: DateFilterMode = config.dateFilterMode || 'range';\n\n return (\n <div className=\"widget-filter\">\n <label className=\"widget-filter__label\">{label}</label>\n {filterType === 'date_range' ? (\n dateMode === 'yearly' ? (\n <YearlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : dateMode === 'monthly' ? (\n <MonthlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : dateMode === 'weekly' ? (\n <WeeklyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : (\n <DateRangeFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n )\n ) : (\n <SelectFilter\n value={value}\n options={options}\n multi={filterType === 'multi_select'}\n onChange={onChange}\n />\n )}\n </div>\n );\n}\n\n// -------DateRangeFilter (modo range puro)-------\n\nfunction DateRangeFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start, end] = value ? value.split('|') : ['', ''];\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--stacked\">\n <DashboardDatePicker\n value={start}\n minIso={dateBounds?.min}\n maxIso={end || dateBounds?.max}\n selectsStart\n startIso={start}\n endIso={end}\n placeholder=\"Data inicial\"\n onChange={(iso) => onChange(`${iso}|${end}`)}\n />\n <DashboardDatePicker\n value={end}\n minIso={start || dateBounds?.min}\n maxIso={dateBounds?.max}\n selectsEnd\n startIso={start}\n endIso={end}\n placeholder=\"Data final\"\n onChange={(iso) => onChange(`${start}|${iso}`)}\n />\n </div>\n );\n}\n\n// -------YearlyFilter (modo anual)-------\n\nfunction YearlyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseYearFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const years = getYearRange(dateBounds);\n\n const handleYearChange = (year: number) => {\n const yr = getFullYearRange(year);\n onChange(`${yr.start}|${yr.end}`);\n };\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--year\">\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => handleYearChange(parseInt(e.target.value))}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n </div>\n );\n}\n\n// -------MonthlyFilter (modo mensal)-------\n\nfunction MonthlyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseMonthFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\n const years = getYearRange(dateBounds);\n\n const handleMonthChange = (year: number, month: number) => {\n const range = getMonthRange(year, month);\n onChange(`${range.start}|${range.end}`);\n };\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--month\">\n <select\n className=\"widget-filter__select\"\n value={selectedMonth}\n onChange={(e) => handleMonthChange(selectedYear, parseInt(e.target.value))}\n >\n {MONTH_NAMES_SHORT.map((name, i) => (\n <option key={i + 1} value={i + 1}>{name}</option>\n ))}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => handleMonthChange(parseInt(e.target.value), selectedMonth)}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n </div>\n );\n}\n\n// -------WeeklyFilter (modo semanal)-------\n\nfunction WeeklyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseMonthFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\n const years = getYearRange(dateBounds);\n\n const monthWeeks = getMonthWeeks(selectedYear, selectedMonth);\n const selectedWeekIdx = parseMonthWeekFromRange(start, selectedYear, selectedMonth) || 1;\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--week\">\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => {\n const y = parseInt(e.target.value);\n const weeks = getMonthWeeks(y, selectedMonth);\n const w = weeks[0];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedMonth}\n onChange={(e) => {\n const m = parseInt(e.target.value);\n const weeks = getMonthWeeks(selectedYear, m);\n const w = weeks[0];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {MONTH_NAMES_SHORT.map((name, i) => (\n <option key={i + 1} value={i + 1}>{name}</option>\n ))}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedWeekIdx}\n onChange={(e) => {\n const w = monthWeeks[parseInt(e.target.value) - 1];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {monthWeeks.map((w) => (\n <option key={w.index} value={w.index}>{w.label}</option>\n ))}\n </select>\n </div>\n );\n}\n\n// -------SelectFilter (categorico)-------\n\nfunction SelectFilter({ value, options, multi, onChange }: {\n value: string;\n options: string[];\n multi: boolean;\n onChange: (value: string) => void;\n}) {\n if (multi) {\n const selected = value ? value.split(',') : [];\n const toggle = (opt: string) => {\n const next = selected.includes(opt)\n ? selected.filter((s) => s !== opt)\n : [...selected, opt];\n onChange(next.join(','));\n };\n\n return (\n <div className=\"widget-filter__multi\">\n {options.map((opt) => (\n <label key={opt} className=\"widget-filter__multi-option\">\n <input\n type=\"checkbox\"\n checked={selected.includes(opt)}\n onChange={() => toggle(opt)}\n />\n {opt}\n </label>\n ))}\n </div>\n );\n }\n\n return (\n <select\n className=\"widget-filter__select\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Todos</option>\n {options.map((opt) => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n );\n}\n","// Purpose: Widget de variavel editavel no grid (what-if scenarios).\n// Scope: Input numerico com label, formato e opcao de bloqueio.\n// Public API: VariableWidget\n\nimport type { VariableConfig } from '../types';\n\ninterface Props {\n config: VariableConfig;\n value: number;\n onChange: (value: number) => void;\n}\n\nconst FORMAT_SUFFIX: Record<string, string> = {\n currency: 'R$',\n percentage: '%',\n};\n\nexport function VariableWidget({ config, value, onChange }: Props) {\n const label = config.label || 'Variavel';\n const locked = config.locked || false;\n const fmt = config.variableFormat || 'number';\n const suffix = FORMAT_SUFFIX[fmt] || '';\n\n return (\n <div className={`widget-variable ${locked ? 'widget-variable--locked' : ''}`}>\n <label className=\"widget-variable__label\">{label}</label>\n <div className=\"widget-variable__input-wrapper\">\n <input\n className=\"widget-variable__input\"\n type=\"number\"\n value={value}\n onChange={(e) => onChange(parseFloat(e.target.value) || 0)}\n disabled={locked}\n step={fmt === 'integer' ? 1 : 0.01}\n />\n {suffix && <span className=\"widget-variable__suffix\">{suffix}</span>}\n </div>\n {locked && <span className=\"widget-variable__lock-icon\" title=\"Bloqueado\">🔒</span>}\n </div>\n );\n}\n","// Purpose: Seletor de paleta de cores (13 slots semanticos).\n// Scope: Presets pre-definidos + modo customizado com color pickers nomeados por slot.\n// Public API: ColorPaletteSelector\n\nimport {\n PALETTES, ensurePaletteShape, getSeries, SLOT_INDEX, SLOT_LABELS, TOTAL_SLOTS,\n type PaletteKey,\n} from '../palettes';\n\n// Slots de tema usados para a segunda barra de preview do preset\nconst THEME_PREVIEW_SLOTS = [\n SLOT_INDEX.bgDark,\n SLOT_INDEX.bgPaper,\n SLOT_INDEX.bgElevated,\n SLOT_INDEX.accent,\n SLOT_INDEX.success,\n];\n\ninterface Props {\n selected?: string[];\n onSelect: (colors: string[]) => void;\n customMode?: boolean;\n onCustomModeChange?: (custom: boolean) => void;\n disabled?: boolean;\n}\n\nfunction isPreset(colors?: string[]): boolean {\n if (!colors) return true;\n const normalized = ensurePaletteShape(colors);\n return Object.values(PALETTES).some(\n (p) => JSON.stringify(p.colors) === JSON.stringify(normalized)\n );\n}\n\n// Slots agrupados por categoria para a UI customizada\nconst SLOT_ROWS: { label: string; slots: (keyof typeof SLOT_INDEX)[] }[] = [\n { label: 'Series', slots: ['series0', 'series1', 'series2', 'series3', 'series4'] },\n { label: 'Tema', slots: ['bgDark', 'bgPaper', 'bgElevated', 'textPrimary', 'textMuted'] },\n { label: 'Estados', slots: ['accent', 'success', 'error'] },\n];\n\nexport function ColorPaletteSelector({\n selected, onSelect, customMode, onCustomModeChange, disabled,\n}: Props) {\n const isCustom = customMode ?? !isPreset(selected);\n const colors = ensurePaletteShape(selected);\n\n const selectedKey = !isCustom\n ? (Object.entries(PALETTES).find(\n ([, p]) => JSON.stringify(p.colors) === JSON.stringify(colors)\n )?.[0] as PaletteKey | undefined)\n : undefined;\n\n const handleSlotChange = (slotIdx: number, color: string) => {\n const updated = [...colors];\n while (updated.length < TOTAL_SLOTS) updated.push('#000000');\n updated[slotIdx] = color;\n onSelect(updated);\n };\n\n return (\n <div className={`palette-selector ${disabled ? 'palette-selector--disabled' : ''}`}>\n {onCustomModeChange && (\n <label className=\"config-panel__checkbox\">\n <input\n type=\"checkbox\"\n checked={isCustom}\n onChange={(e) => onCustomModeChange(e.target.checked)}\n disabled={disabled}\n />\n Customizar\n </label>\n )}\n\n {isCustom ? (\n <div className=\"palette-selector__custom\">\n {SLOT_ROWS.map((row) => (\n <div key={row.label} className=\"palette-selector__row\">\n <span className=\"palette-selector__row-label\">{row.label}</span>\n <div className=\"palette-selector__row-slots\">\n {row.slots.map((slotName) => {\n const slotIdx = SLOT_INDEX[slotName];\n return (\n <input\n key={slotName}\n type=\"color\"\n className=\"palette-selector__color-input\"\n value={colors[slotIdx] || '#000000'}\n onChange={(e) => handleSlotChange(slotIdx, e.target.value)}\n disabled={disabled}\n title={SLOT_LABELS[slotName]}\n />\n );\n })}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"palette-selector__options\">\n {(Object.entries(PALETTES) as [PaletteKey, typeof PALETTES[PaletteKey]][]).map(([key, palette]) => {\n const fullColors = ensurePaletteShape(palette.colors);\n return (\n <button\n key={key}\n className={`palette-selector__option ${selectedKey === key ? 'palette-selector__option--active' : ''}`}\n onClick={() => onSelect(palette.colors)}\n disabled={disabled}\n >\n <div className=\"palette-selector__bar\">\n {getSeries(palette.colors).map((color, i) => (\n <span\n key={i}\n className=\"palette-selector__swatch\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n <div className=\"palette-selector__bar palette-selector__bar--theme\">\n {THEME_PREVIEW_SLOTS.map((slotIdx, i) => (\n <span\n key={i}\n className=\"palette-selector__swatch\"\n style={{ backgroundColor: fullColors[slotIdx] }}\n />\n ))}\n </div>\n <span className=\"palette-selector__label\">{palette.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","// Purpose: Widget de paleta de cores editavel no grid.\n// Scope: Permite ao usuario do dashboard trocar a paleta em runtime. Respeita bloqueio.\n// Public API: ColorPaletteWidget\n\nimport type { PaletteConfig } from '../types';\nimport { ColorPaletteSelector } from '../components/ColorPaletteSelector';\n\ninterface Props {\n config: PaletteConfig;\n palette: string[];\n onChange: (colors: string[]) => void;\n}\n\nexport function ColorPaletteWidget({ config, palette, onChange }: Props) {\n const label = config.label || 'Cores';\n const locked = config.locked || false;\n\n return (\n <div className={`widget-palette ${locked ? 'widget-palette--locked' : ''}`}>\n <label className=\"widget-palette__label\">{label}</label>\n <ColorPaletteSelector selected={palette} onSelect={onChange} customMode disabled={locked} />\n {locked && <span className=\"widget-palette__lock-icon\" title=\"Bloqueado\">🔒</span>}\n </div>\n );\n}\n","// Purpose: Dispatch de rendering por tipo de widget (dados + controle).\n// Scope: Recebe computed data e/ou config, renderiza widget correto.\n// Public API: WidgetRenderer\n\nimport type { WidgetType, AnyWidgetConfig, FilterConfig, VariableConfig, PaletteConfig } from '../types';\nimport { getSeries } from '../palettes';\nimport { KPIWidget } from './KPIWidget';\nimport { GaugeWidget } from './GaugeWidget';\nimport { ChartWidget } from './ChartWidget';\nimport { FilterWidget } from './FilterWidget';\nimport { VariableWidget } from './VariableWidget';\nimport { ColorPaletteWidget } from './ColorPaletteWidget';\n\ninterface Props {\n type: WidgetType;\n computed: Record<string, unknown>;\n palette: string[];\n // Control widget props (opcionais)\n config?: AnyWidgetConfig;\n filterValue?: string;\n filterOptions?: string[];\n dateBounds?: { min: string; max: string } | null;\n onFilterChange?: (value: string) => void;\n variableValue?: number;\n onVariableChange?: (value: number) => void;\n onPaletteChange?: (colors: string[]) => void;\n}\n\nexport function WidgetRenderer({\n type, computed, palette, config,\n filterValue, filterOptions, dateBounds, onFilterChange,\n variableValue, onVariableChange,\n onPaletteChange,\n}: Props) {\n if (computed.error) {\n return (\n <div className=\"widget widget--error\">\n <span className=\"widget__error-text\">{String(computed.error)}</span>\n </div>\n );\n }\n\n // Widgets de dados usam apenas as cores de series (5 primeiras).\n // UI colors sao aplicadas via CSS vars no grid container.\n const seriesColors = getSeries(palette);\n\n switch (type) {\n case 'kpi_card':\n return <KPIWidget data={computed} label={config?.label} />;\n case 'gauge':\n return <GaugeWidget data={computed} palette={seriesColors} label={config?.label} />;\n case 'chart':\n return <ChartWidget data={computed} palette={seriesColors} label={config?.label} />;\n case 'filter':\n return config && onFilterChange ? (\n <FilterWidget\n config={config as FilterConfig}\n value={filterValue || ''}\n options={filterOptions}\n dateBounds={dateBounds}\n onChange={onFilterChange}\n />\n ) : null;\n case 'variable': {\n const vc = config as VariableConfig | undefined;\n return vc && onVariableChange ? (\n <VariableWidget\n config={vc}\n value={variableValue ?? vc.variableValue ?? 0}\n onChange={onVariableChange}\n />\n ) : null;\n }\n case 'color_palette':\n return config && onPaletteChange ? (\n <ColorPaletteWidget\n config={config as PaletteConfig}\n palette={palette}\n onChange={onPaletteChange}\n />\n ) : null;\n default:\n return <div className=\"widget\">Widget: {type}</div>;\n }\n}\n","// Purpose: Tipos compartilhados entre backend Python (schemas Pydantic) e frontend.\n// Scope: Union discriminada de WidgetDefinition, configs por tipo, respostas da API.\n// Public API: Todos os tipos e interfaces exportados + defaults + labels.\n\nimport { DEFAULT_PALETTE_COLORS } from '../palettes';\n\n// -------Enums como string literals-------\n\nexport type AggregationType = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'count_distinct';\nexport type ComparisonType = 'yoy' | 'mom' | 'target' | 'none';\nexport type FilterType = 'date_range' | 'select' | 'multi_select';\nexport type WidgetType = 'kpi_card' | 'gauge' | 'chart' | 'filter' | 'variable' | 'color_palette';\nexport type DataWidgetType = 'kpi_card' | 'gauge' | 'chart';\nexport type ControlWidgetType = 'filter' | 'variable' | 'color_palette';\nexport type ChartType = 'bar' | 'line' | 'area' | 'pie';\nexport type FormatType = 'currency' | 'number' | 'integer' | 'percentage' | 'date' | 'text';\nexport type DateFilterMode = 'range' | 'monthly' | 'weekly' | 'yearly';\nexport type Granularity = 'day' | 'week' | 'month' | 'year' | 'weekday';\n\n// -------Pedacos compartilhados pelos configs-------\n\nexport interface FilterDefinition {\n id: string;\n type: FilterType;\n label: string;\n column?: string | null;\n defaultValue?: unknown;\n}\n\nexport interface TargetDefinition {\n id: string;\n label: string;\n value: number;\n format: FormatType;\n}\n\nexport interface GridPosition {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface ComparisonConfig {\n type: ComparisonType;\n targetId?: string;\n}\n\nexport interface AggregationStep {\n aggregation: AggregationType;\n groupBy: string;\n groupGranularity?: Granularity;\n}\n\nexport interface ColumnExpressionTerm {\n column: string;\n operator?: '+' | '-' | '*' | '/';\n}\n\nexport interface KpiOperand {\n column?: string;\n columnExpression?: ColumnExpressionTerm[];\n intermediateSteps?: AggregationStep[];\n finalAggregation?: AggregationType;\n constant?: number;\n}\n\nexport interface KpiTerm {\n operand: KpiOperand;\n operator?: '+' | '-' | '*' | '/'; // undefined apenas no primeiro termo\n}\n\nexport interface ChartSeriesConfig {\n label: string;\n // Formula simples\n column?: string;\n aggregation?: AggregationType;\n // Formula composta (pipeline identico ao KPI card, avaliado por grupo do eixo X)\n kpiTerms?: KpiTerm[];\n}\n\nexport interface ChartAxisConfig {\n column: string;\n granularity: Granularity;\n}\n\n// -------Config por tipo de widget-------\n\nexport interface KpiCardConfig {\n label: string;\n format?: FormatType;\n column?: string;\n aggregation?: AggregationType;\n groupBy?: string;\n groupGranularity?: Granularity;\n outerAggregation?: AggregationType;\n kpiTerms?: KpiTerm[];\n comparison?: ComparisonConfig;\n filterExpression?: Record<string, unknown>;\n}\n\nexport interface GaugeConfig {\n label: string;\n format?: FormatType;\n column?: string;\n aggregation?: AggregationType;\n targetId?: string;\n comparison?: ComparisonConfig;\n kpiTerms?: KpiTerm[];\n groupBy?: string;\n groupGranularity?: Granularity;\n outerAggregation?: AggregationType;\n filterExpression?: Record<string, unknown>;\n}\n\nexport interface ChartConfig {\n label: string;\n chartType?: ChartType;\n xAxis?: ChartAxisConfig;\n series?: ChartSeriesConfig[];\n categoryColumn?: string;\n format?: FormatType;\n filterExpression?: Record<string, unknown>;\n}\n\nexport interface FilterConfig {\n label: string;\n filterType: FilterType;\n filterColumn?: string;\n defaultValue?: unknown;\n dateFilterMode?: DateFilterMode;\n}\n\nexport interface VariableConfig {\n label: string;\n variableValue?: number;\n variableFormat?: FormatType;\n locked?: boolean;\n}\n\nexport interface PaletteConfig {\n paletteColors: string[];\n label?: string;\n locked?: boolean;\n}\n\nexport type AnyWidgetConfig =\n | KpiCardConfig | GaugeConfig | ChartConfig\n | FilterConfig | VariableConfig | PaletteConfig;\n\n// -------Union discriminada de WidgetDefinition-------\n\nexport type WidgetDefinition =\n | { id: string; type: 'kpi_card'; grid: GridPosition; config: KpiCardConfig }\n | { id: string; type: 'gauge'; grid: GridPosition; config: GaugeConfig }\n | { id: string; type: 'chart'; grid: GridPosition; config: ChartConfig }\n | { id: string; type: 'filter'; grid: GridPosition; config: FilterConfig }\n | { id: string; type: 'variable'; grid: GridPosition; config: VariableConfig }\n | { id: string; type: 'color_palette'; grid: GridPosition; config: PaletteConfig };\n\nexport type WidgetConfigOf<T extends WidgetType> = Extract<WidgetDefinition, { type: T }>['config'];\n\n// -------Layout completo-------\n\nexport interface DashboardLayout {\n gridColumns: number;\n gridRows: number;\n widgets: WidgetDefinition[];\n}\n\n// -------Respostas da API-------\n\nexport interface FilterValuesResponse {\n date_bounds: { min: string | null; max: string | null };\n filter_options: Record<string, string[]>;\n headers: string[];\n column_types: Record<string, string>;\n}\n\nexport interface RenderResponse {\n date_bounds: { min: string; max: string };\n applied: Record<string, unknown>;\n widgets: Record<string, Record<string, unknown>>;\n}\n\nexport interface LayoutResponse {\n name: string;\n palette: string[];\n gridColumns: number;\n gridRows: number;\n dateBounds: { min: string; max: string };\n widgets: WidgetDefinition[];\n}\n\n// -------Defaults-------\n\n// Re-export para compatibilidade com codigo existente que importa de dashboardLayout\nexport const DEFAULT_PALETTE = DEFAULT_PALETTE_COLORS;\n\nexport const DEFAULT_GRID_COLUMNS = 30;\nexport const DEFAULT_GRID_ROWS = 10;\n\nexport const EMPTY_LAYOUT: DashboardLayout = {\n gridColumns: DEFAULT_GRID_COLUMNS,\n gridRows: DEFAULT_GRID_ROWS,\n widgets: [],\n};\n\nexport const WIDGET_TYPE_LABELS: Record<WidgetType, string> = {\n kpi_card: 'KPI Card',\n gauge: 'Gauge',\n chart: 'Gráfico',\n filter: 'Filtro',\n variable: 'Variável',\n color_palette: 'Paleta de Cores',\n};\n\nexport const DATA_WIDGET_TYPES: DataWidgetType[] = ['kpi_card', 'gauge', 'chart'];\nexport const CONTROL_WIDGET_TYPES: ControlWidgetType[] = ['filter', 'variable', 'color_palette'];\nexport const CONTROL_WIDGET_SET = new Set<WidgetType>(['filter', 'variable', 'color_palette']);\n\nexport const AGGREGATION_LABELS: Record<AggregationType, string> = {\n sum: 'Soma',\n avg: 'Média',\n count: 'Contagem',\n min: 'Mínimo',\n max: 'Máximo',\n count_distinct: 'Contagem Distinta',\n};\n\nexport const FORMAT_LABELS: Record<FormatType, string> = {\n currency: 'Moeda (R$)',\n number: 'Número',\n integer: 'Inteiro',\n percentage: 'Porcentagem',\n date: 'Data',\n text: 'Texto',\n};\n\n// Subset de formatos numericos — usado nos configs de KPI, Gauge, Variable\nexport const NUMERIC_FORMAT_OPTIONS = Object.entries(FORMAT_LABELS)\n .filter(([k]) => k !== 'date' && k !== 'text') as [FormatType, string][];\n\nexport const COMPARISON_LABELS: Record<ComparisonType, string> = {\n yoy: 'vs Ano Anterior',\n mom: 'vs Mês Anterior',\n target: 'vs Meta',\n none: 'Nenhuma',\n};\n\nexport const CHART_TYPE_LABELS: Record<ChartType, string> = {\n bar: 'Barras',\n line: 'Linhas',\n area: 'Área',\n pie: 'Pizza',\n};\n\nexport const FILTER_TYPE_LABELS: Record<FilterType, string> = {\n date_range: 'Periodo',\n select: 'Seleção Única',\n multi_select: 'Seleção Múltipla',\n};\n\n// -------Default grid sizes por tipo de widget-------\n\nexport const DEFAULT_GRID: Record<WidgetType, GridPosition> = {\n kpi_card: { x: 0, y: 0, w: 6, h: 3 },\n gauge: { x: 0, y: 0, w: 6, h: 5 },\n chart: { x: 0, y: 0, w: 6, h: 6 },\n filter: { x: 0, y: 0, w: 4, h: 2 },\n variable: { x: 0, y: 0, w: 4, h: 2 },\n color_palette: { x: 0, y: 0, w: 4, h: 2 },\n};\n\nexport const DEFAULT_CONFIG: { [K in WidgetType]: Partial<WidgetConfigOf<K>> } = {\n kpi_card: { label: 'Novo KPI', aggregation: 'sum', format: 'number' },\n gauge: { label: 'Novo Gauge', aggregation: 'sum' },\n chart: { label: 'Novo Grafico', chartType: 'bar', xAxis: { column: '', granularity: 'day' }, series: [] },\n filter: { label: 'Novo Filtro', filterType: 'select' },\n variable: { label: 'Nova Variavel', variableValue: 0, variableFormat: 'number', locked: false },\n color_palette: { label: 'Paleta de Cores', paletteColors: DEFAULT_PALETTE, locked: false },\n};\n","// Purpose: Componente top-level que renderiza um dashboard completo.\n// Scope: Busca layout + render via fetcher, aplica paleta como CSS vars, renderiza\n// grid com widgets interativos (filtros + variaveis + paleta). Autocontido.\n// Public API: Dashboard\n\nimport { useMemo, type CSSProperties } from 'react';\nimport type { DashboardFetcher } from './api/fetcher';\nimport { createTokenFetcher } from './api/fetcher';\nimport { useDashboardData } from './hooks/useDashboardData';\nimport { WidgetRenderer } from './widgets/WidgetRenderer';\nimport { getPaletteCssVars } from './palettes';\nimport { CONTROL_WIDGET_SET } from './types';\n\nconst GRID_ROW_HEIGHT_PX = 40;\nconst GRID_GAP_PX = 6;\n\n// Duas formas mutuamente exclusivas de autenticar: token ou fetcher customizado.\ntype AuthProps =\n | { apiUrl: string; token: string; fetcher?: never }\n | { fetcher: DashboardFetcher; apiUrl?: never; token?: never };\n\ntype DashboardProps = AuthProps & {\n /** Altura de cada linha do grid em pixels. Default 40. */\n rowHeight?: number;\n /** Gap entre widgets em pixels. Default 6. */\n gridGap?: number;\n /** Renderer customizado para cada widget (avancado). */\n className?: string;\n};\n\nexport function Dashboard(props: DashboardProps) {\n const { rowHeight = GRID_ROW_HEIGHT_PX, gridGap = GRID_GAP_PX, className } = props;\n\n // Memoiza o fetcher p/ manter referencial estavel entre renders\n const fetcher = useMemo<DashboardFetcher>(() => {\n if ('fetcher' in props && props.fetcher) return props.fetcher;\n return createTokenFetcher({ apiUrl: props.apiUrl!, token: props.token! });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n 'fetcher' in props ? props.fetcher : null,\n 'apiUrl' in props ? props.apiUrl : null,\n 'token' in props ? props.token : null,\n ]);\n\n const {\n layout, renderData, loading, error,\n filters, variables, palette,\n setFilter, setVariable, setPalette,\n } = useDashboardData(fetcher);\n\n if (error && !layout) {\n return <div className={`preview-tab ${className ?? ''}`}><div className=\"preview-tab__error\">{error}</div></div>;\n }\n\n if (!layout) {\n return <div className={`preview-tab ${className ?? ''}`}><div className=\"preview-tab__loading\">Carregando dashboard...</div></div>;\n }\n\n if (layout.widgets.length === 0) {\n return (\n <div className={`preview-tab ${className ?? ''}`}>\n <div className=\"preview-tab__empty\">Este dashboard nao possui widgets.</div>\n </div>\n );\n }\n\n const widgetsData = renderData?.widgets ?? {};\n const dateBounds = renderData?.date_bounds ?? null;\n\n const gridStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${layout.gridColumns}, 1fr)`,\n gridTemplateRows: `repeat(${layout.gridRows}, ${rowHeight}px)`,\n gap: `${gridGap}px`,\n // Aplica CSS vars da paleta no container — widgets descendentes usam var(--bg-*, --text-*, etc)\n ...getPaletteCssVars(palette),\n } as CSSProperties;\n\n return (\n <div className={`preview-tab ${className ?? ''}`}>\n {error && !renderData && <div className=\"preview-tab__error\">{error}</div>}\n\n {renderData && (\n <div className=\"preview-tab__grid\" style={gridStyle}>\n {layout.widgets.map((widget) => {\n const isControl = CONTROL_WIDGET_SET.has(widget.type);\n const computed = widgetsData[widget.id];\n const widgetStyle: CSSProperties = {\n gridColumn: `${widget.grid.x + 1} / span ${widget.grid.w}`,\n gridRow: `${widget.grid.y + 1} / span ${widget.grid.h}`,\n };\n\n const variableValue = widget.type === 'variable'\n ? variables[widget.id] ?? (computed?.value as number) ?? widget.config.variableValue ?? 0\n : undefined;\n\n return (\n <div\n key={widget.id}\n className={`preview-tab__widget ${isControl ? 'preview-tab__widget--control' : ''}`}\n style={widgetStyle}\n >\n {isControl || computed ? (\n <WidgetRenderer\n type={widget.type}\n computed={computed || {}}\n palette={palette}\n config={widget.config}\n filterValue={filters[widget.id] || ''}\n filterOptions={(computed?.available_values as string[]) || []}\n dateBounds={dateBounds}\n onFilterChange={(val) => setFilter(widget.id, val)}\n variableValue={variableValue}\n onVariableChange={(val) => setVariable(widget.id, val)}\n onPaletteChange={setPalette}\n />\n ) : (\n <div className=\"preview-tab__widget-loading\">\n {loading ? 'Carregando...' : 'Sem dados'}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {loading && renderData && (\n <div className=\"preview-tab__recalculating\">Atualizando...</div>\n )}\n </div>\n );\n}\n"],"names":["ApiError","message","status","payload","createTokenFetcher","options","apiUrl","token","fetchImpl","prefix","base","get","path","params","url","k","v","res","DEBOUNCE_MS","useDashboardData","fetcher","layout","setLayout","useState","renderData","setRenderData","filters","setFilters","variables","setVariables","localPalette","setLocalPalette","loading","setLoading","error","setError","debounceRef","useRef","appliedSyncedRef","useEffect","cancelled","err","buildQueryParams","prev","syncFiltersFromApplied","setFilter","useCallback","widgetId","value","setVariable","setPalette","colors","palette","useMemo","key","val","start","end","applied","synced","id","d","SLOT_INDEX","SERIES_COUNT","TOTAL_SLOTS","SLOT_LABELS","PALETTES","DEFAULT_PALETTE","DEFAULT_PALETTE_COLORS","ensurePaletteShape","fallback","result","i","getSeries","getPaletteCssVars","c","KPIWidget","data","label","displayLabel","formatted","comparison","trendClass","arrow","jsxs","jsx","COLOR_EMPTY","arcPath","cx","cy","r","fraction","angle","endX","endY","formatCompact","abs","GaugeWidget","propLabel","rawValue","valueFormatted","ratio","targetValue","comparisonLabel","exceeded","clamped","fillColor","targetFormatted","stroke","AXIS_STYLE","GRID_STROKE","TOOLTIP_CONTENT_STYLE","TOOLTIP_LABEL_STYLE","tooltipLabelFormatter","first","verbose","_a","useContainerSize","ref","size","setSize","el","observer","entry","width","height","CartesianChart","Chart","chartData","xKey","series","renderSeries","CartesianGrid","XAxis","YAxis","Tooltip","Legend","s","ChartWidget","chartType","title","containerRef","PieChart","Pie","name","percent","_","Cell","common","LineChart","color","Line","AreaChart","Area","BarChart","Bar","MONTH_NAMES_SHORT","MONTH_NAMES_FULL","getFullYearRange","year","parseYearFromRange","m","getMonthRange","month","lastDay","pad","n","getISOWeek","dt","yearStart","getWeekRange","week","jan4","dayOfWeek","firstMonday","fmt","getWeeksInMonth","weeks","daysInMonth","b","getMonthWeeks","day","index","startDay","endDay","parseMonthWeekFromRange","dayMatch","parseMonthFromRange","parseWeekFromRange","getYearRange","dateBounds","now","minYear","maxYear","years","y","isoToDate","iso","dateToIso","date","DashboardDatePicker","onChange","minIso","maxIso","placeholder","selectsStart","selectsEnd","startIso","endIso","className","disabled","DatePicker","state","FilterWidget","config","filterType","dateMode","YearlyFilter","MonthlyFilter","WeeklyFilter","DateRangeFilter","SelectFilter","parsed","selectedYear","handleYearChange","yr","e","selectedMonth","handleMonthChange","range","monthWeeks","selectedWeekIdx","w","multi","selected","toggle","opt","next","FORMAT_SUFFIX","VariableWidget","locked","suffix","THEME_PREVIEW_SLOTS","isPreset","normalized","p","SLOT_ROWS","ColorPaletteSelector","onSelect","customMode","onCustomModeChange","isCustom","selectedKey","handleSlotChange","slotIdx","updated","row","slotName","fullColors","ColorPaletteWidget","WidgetRenderer","type","computed","filterValue","filterOptions","onFilterChange","variableValue","onVariableChange","onPaletteChange","seriesColors","vc","DEFAULT_GRID_COLUMNS","DEFAULT_GRID_ROWS","EMPTY_LAYOUT","WIDGET_TYPE_LABELS","DATA_WIDGET_TYPES","CONTROL_WIDGET_TYPES","CONTROL_WIDGET_SET","AGGREGATION_LABELS","FORMAT_LABELS","NUMERIC_FORMAT_OPTIONS","COMPARISON_LABELS","CHART_TYPE_LABELS","FILTER_TYPE_LABELS","DEFAULT_GRID","DEFAULT_CONFIG","GRID_ROW_HEIGHT_PX","GRID_GAP_PX","Dashboard","props","rowHeight","gridGap","widgetsData","gridStyle","widget","isControl","widgetStyle"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/api/fetcher.ts","../src/hooks/useDashboardData.ts","../src/widgets/KPIWidget.tsx","../src/widgets/GaugeWidget.tsx","../src/widgets/ChartWidget.tsx","../src/widgets/FilterWidget.tsx","../src/widgets/VariableWidget.tsx","../src/widgets/ColorPaletteWidget.tsx","../src/widgets/WidgetRenderer.tsx","../src/Dashboard.tsx"],"sourcesContent":["// Purpose: Client HTTP interno da API Action (endpoints /external/dashboards).\n// Scope: Infraestrutura da lib — nao exportado no index publico. Consumidor\n// externo usa <Dashboard token /> que encapsula tudo.\n// Public API (interno): fetchLayout, fetchRender, ApiError\n\nimport type { LayoutResponse, RenderResponse } from '../types';\n\nconst API_URL = 'https://action-data-api.fly.dev/api';\nconst ENDPOINT_PREFIX = '/external/dashboards';\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status?: number,\n public payload?: unknown,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\nasync function get<T>(path: string, token: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${API_URL}${ENDPOINT_PREFIX}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) url.searchParams.set(k, v);\n }\n\n const res = await fetch(url.toString(), {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!res.ok) {\n let payload: unknown;\n try { payload = await res.json(); } catch { /* non-json */ }\n throw new ApiError(\n `Requisicao falhou (${res.status}) em ${path}`,\n res.status,\n payload,\n );\n }\n return (await res.json()) as T;\n}\n\nexport const fetchLayout = (token: string) =>\n get<LayoutResponse>('/layout', token);\n\nexport const fetchRender = (token: string, params?: Record<string, string>) =>\n get<RenderResponse>('/render', token, params);\n","// Purpose: Hook que gerencia estado + fetch de um dashboard inteiro.\n// Scope: Carrega layout uma vez + render com debounce quando filtros/variaveis mudam.\n// Sincroniza estado local com os defaults aplicados pelo backend na 1a carga.\n// Public API: useDashboardData\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { fetchLayout, fetchRender } from '../api/fetcher';\nimport type { LayoutResponse, RenderResponse } from '../types';\n\nexport interface UseDashboardDataResult {\n layout: LayoutResponse | null;\n renderData: RenderResponse | null;\n loading: boolean;\n error: string | null;\n /** Filtros selecionados (formato string por widget — date_range como \"start|end\"). */\n filters: Record<string, string>;\n /** Overrides de variaveis por widget. */\n variables: Record<string, number>;\n /** Paleta efetiva (override local substitui a do layout). */\n palette: string[];\n setFilter(widgetId: string, value: string): void;\n setVariable(widgetId: string, value: number): void;\n setPalette(colors: string[]): void;\n}\n\nconst DEBOUNCE_MS = 300;\n\nexport function useDashboardData(token: string): UseDashboardDataResult {\n const [layout, setLayout] = useState<LayoutResponse | null>(null);\n const [renderData, setRenderData] = useState<RenderResponse | null>(null);\n const [filters, setFilters] = useState<Record<string, string>>({});\n const [variables, setVariables] = useState<Record<string, number>>({});\n const [localPalette, setLocalPalette] = useState<string[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\n const appliedSyncedRef = useRef(false);\n\n // -------Carrega layout uma unica vez (por token)-------\n useEffect(() => {\n let cancelled = false;\n fetchLayout(token)\n .then((res) => { if (!cancelled) setLayout(res); })\n .catch((err: Error) => { if (!cancelled) setError(err.message); });\n return () => { cancelled = true; };\n }, [token]);\n\n // -------Render com debounce quando filtros/variaveis mudam-------\n useEffect(() => {\n if (!layout) return;\n if (debounceRef.current) clearTimeout(debounceRef.current);\n\n debounceRef.current = setTimeout(() => {\n const params = buildQueryParams(filters, variables);\n setLoading(true);\n fetchRender(token, params)\n .then((res) => {\n setRenderData(res);\n if (!appliedSyncedRef.current && res.applied) {\n appliedSyncedRef.current = true;\n setFilters((prev) => ({ ...syncFiltersFromApplied(res.applied), ...prev }));\n }\n setError(null);\n })\n .catch((err: Error) => setError(err.message))\n .finally(() => setLoading(false));\n }, DEBOUNCE_MS);\n\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [token, layout, filters, variables]);\n\n const setFilter = useCallback((widgetId: string, value: string) => {\n setFilters((prev) => ({ ...prev, [widgetId]: value }));\n }, []);\n\n const setVariable = useCallback((widgetId: string, value: number) => {\n setVariables((prev) => ({ ...prev, [widgetId]: value }));\n }, []);\n\n const setPalette = useCallback((colors: string[]) => {\n setLocalPalette(colors);\n }, []);\n\n const palette = useMemo(\n () => localPalette ?? layout?.palette ?? [],\n [localPalette, layout],\n );\n\n return {\n layout, renderData, loading, error,\n filters, variables, palette,\n setFilter, setVariable, setPalette,\n };\n}\n\n// -------Helpers-------\n\n/** Constroi query params no formato esperado pela API (/render). */\nfunction buildQueryParams(\n filters: Record<string, string>,\n variables: Record<string, number>,\n): Record<string, string> {\n const params: Record<string, string> = {};\n\n for (const [key, val] of Object.entries(filters)) {\n if (val.includes('|')) {\n const [start, end] = val.split('|');\n if (start) params['f_date_start'] = start;\n if (end) params['f_date_end'] = end;\n } else {\n params[`f_${key}`] = val;\n }\n }\n\n for (const [key, val] of Object.entries(variables)) {\n params[`v_${key}`] = String(val);\n }\n\n return params;\n}\n\n/** Converte `applied` do backend para o formato local de filtros. */\nfunction syncFiltersFromApplied(applied: Record<string, unknown>): Record<string, string> {\n const synced: Record<string, string> = {};\n for (const [id, val] of Object.entries(applied)) {\n if (val && typeof val === 'object' && 'start' in val) {\n const d = val as { start?: string; end?: string };\n synced[id] = `${d.start || ''}|${d.end || ''}`;\n } else if (Array.isArray(val)) {\n synced[id] = val.join(',');\n } else if (typeof val === 'string') {\n synced[id] = val;\n }\n }\n return synced;\n}\n","// Purpose: KPI card com valor computado + comparacao.\n// Scope: Renderiza label, valor formatado, seta de trend, variance.\n// Public API: KPIWidget\n\ninterface Props {\n data: Record<string, unknown>;\n label?: string;\n}\n\nexport function KPIWidget({ data, label }: Props) {\n const displayLabel = label || String(data.label || '');\n const formatted = String(data.formatted || '-');\n const comparison = data.comparison as {\n previous_value?: number | null;\n variance_pct?: number | null;\n trend?: string | null;\n label?: string | null;\n } | null;\n\n const trendClass = comparison?.trend === 'up'\n ? 'widget-kpi__trend--up'\n : comparison?.trend === 'down'\n ? 'widget-kpi__trend--down'\n : '';\n\n const arrow = comparison?.trend === 'up' ? '↑' : comparison?.trend === 'down' ? '↓' : '';\n\n return (\n <div className=\"widget widget-kpi\">\n <span className=\"widget-kpi__label\">{displayLabel}</span>\n <span className=\"widget-kpi__value\">{formatted}</span>\n {comparison && comparison.variance_pct != null && (\n <div className={`widget-kpi__trend ${trendClass}`}>\n <span className=\"widget-kpi__variance\">\n {arrow} {comparison.variance_pct > 0 ? '+' : ''}{comparison.variance_pct.toFixed(1)}%\n </span>\n {comparison.label && (\n <span className=\"widget-kpi__trend-label\">{comparison.label}</span>\n )}\n </div>\n )}\n </div>\n );\n}\n","// Purpose: Gauge widget (progresso vs meta).\n// Scope: Semicirculo SVG com percentual, valores brutos e indicador de meta batida.\n// Public API: GaugeWidget\n\ninterface Props {\n data: Record<string, unknown>;\n palette: string[];\n label?: string;\n}\n\nconst COLOR_EMPTY = 'var(--bg-elevated)';\n\n/** Gera path SVG de um arco semicircular (de esquerda para direita, no topo). */\nfunction arcPath(cx: number, cy: number, r: number, fraction: number): string {\n if (fraction <= 0) return '';\n if (fraction >= 1) {\n // Semicirculo completo: dois arcos de 90° (SVG nao desenha arco de exatamente 180°)\n return `M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${cx} ${cy - r} A ${r} ${r} 0 0 1 ${cx + r} ${cy}`;\n }\n const angle = fraction * Math.PI;\n const endX = cx - r * Math.cos(angle);\n const endY = cy - r * Math.sin(angle);\n return `M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${endX} ${endY}`;\n}\n\nfunction formatCompact(value: number): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n return value.toLocaleString('pt-BR');\n}\n\nexport function GaugeWidget({ data, palette, label: propLabel }: Props) {\n const label = propLabel || String(data.label || '');\n const rawValue = typeof data.value === 'number' ? data.value : null;\n const valueFormatted = rawValue != null ? formatCompact(rawValue) : '-';\n const formatted = String(data.formatted || '-');\n const ratio = typeof data.ratio === 'number' ? data.ratio : 0;\n const targetValue = data.target_value as number | null;\n\n const comparisonLabel = data.comparison_label as string | null;\n const exceeded = ratio >= 1;\n const clamped = Math.min(Math.max(ratio, 0), 1);\n\n const fillColor = exceeded\n ? 'var(--action-green)'\n : ratio >= 0.7\n ? (palette[0] || 'var(--color-info)')\n : ratio >= 0.4\n ? 'var(--color-warning)'\n : 'var(--color-error)';\n\n const targetFormatted = targetValue != null ? formatCompact(targetValue) : '-';\n\n const cx = 50, cy = 50, r = 44, stroke = 10;\n\n return (\n <div className=\"widget widget-gauge\">\n <span className=\"widget-gauge__label\">{label}</span>\n <div className=\"widget-gauge__chart\">\n <svg viewBox=\"0 0 100 56\" preserveAspectRatio=\"xMidYMax meet\">\n <path d={arcPath(cx, cy, r, 1)} fill=\"none\" stroke={COLOR_EMPTY} strokeWidth={stroke} strokeLinecap=\"butt\" />\n {clamped > 0 && (\n <path d={arcPath(cx, cy, r, clamped)} fill=\"none\" stroke={fillColor} strokeWidth={stroke} strokeLinecap=\"butt\" />\n )}\n </svg>\n <div className=\"widget-gauge__center\">\n <span className=\"widget-gauge__percent\">{formatted}</span>\n <span className=\"widget-gauge__comparison\">{valueFormatted} / {targetFormatted}</span>\n {exceeded && <span className=\"widget-gauge__badge\">{comparisonLabel || 'Meta batida'}</span>}\n {!exceeded && comparisonLabel && <span className=\"widget-gauge__comparison\">{comparisonLabel}</span>}\n </div>\n </div>\n </div>\n );\n}\n","// Purpose: Chart widget (bar/line/area/pie via Recharts).\n// Scope: Renderiza com dados pre-calculados pelo backend + tooltip tematizado.\n// Public API: ChartWidget\n\nimport { useRef, useState, useEffect, type ComponentType, type ReactElement } from 'react';\nimport {\n BarChart, Bar,\n LineChart, Line,\n AreaChart, Area,\n PieChart, Pie, Cell,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n} from 'recharts';\n\nconst AXIS_STYLE = { fontSize: 10, fill: 'var(--text-muted)' };\nconst GRID_STROKE = 'var(--bg-elevated)';\n\n// Tooltip segue a paleta do dashboard via CSS variables (getPaletteCssVars)\nconst TOOLTIP_CONTENT_STYLE = {\n backgroundColor: 'var(--bg-elevated)',\n border: '1px solid var(--bg-paper)',\n borderRadius: '6px',\n color: 'var(--text-primary)',\n};\nconst TOOLTIP_LABEL_STYLE = {\n color: 'var(--text-primary)',\n fontWeight: 600,\n};\n\n// Usa `tooltipLabel` (versao verbose) do data point quando presente,\n// fallback para o label do eixo X (compacto).\nfunction tooltipLabelFormatter(label: unknown, payload: readonly unknown[]): string {\n const first = (Array.isArray(payload) ? payload[0] : undefined) as { payload?: Record<string, unknown> } | undefined;\n const verbose = first?.payload?.tooltipLabel;\n if (typeof verbose === 'string' && verbose) return verbose;\n return String(label ?? '');\n}\n\ninterface SeriesInfo { key: string; label: string }\n\n// Hook para medir dimensoes do container via ResizeObserver\nfunction useContainerSize(ref: React.RefObject<HTMLDivElement | null>) {\n const [size, setSize] = useState({ width: 0, height: 0 });\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n setSize((prev) =>\n prev.width !== Math.floor(width) || prev.height !== Math.floor(height)\n ? { width: Math.floor(width), height: Math.floor(height) }\n : prev\n );\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref]);\n\n return size;\n}\n\n// Componente generico para charts cartesianos (bar/line/area)\nfunction CartesianChart({ Chart, chartData, xKey, series, palette, renderSeries, width, height }: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Chart: ComponentType<any>;\n chartData: Record<string, unknown>[];\n xKey: string;\n series: SeriesInfo[];\n palette: string[];\n renderSeries: (s: SeriesInfo, color: string, idx: number) => ReactElement;\n width: number;\n height: number;\n}) {\n return (\n <Chart data={chartData} width={width} height={height}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis dataKey={xKey} tick={AXIS_STYLE} />\n <YAxis tick={AXIS_STYLE} />\n <Tooltip\n contentStyle={TOOLTIP_CONTENT_STYLE}\n labelStyle={TOOLTIP_LABEL_STYLE}\n labelFormatter={tooltipLabelFormatter}\n cursor={{ fill: 'var(--bg-paper)', opacity: 0.3 }}\n />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => renderSeries(s, palette[i % palette.length], i))}\n </Chart>\n );\n}\n\ninterface Props {\n data: Record<string, unknown>;\n palette: string[];\n label?: string;\n}\n\nexport function ChartWidget({ data, palette, label: propLabel }: Props) {\n const chartType = String(data.chartType || 'bar');\n const title = propLabel || String(data.label || '');\n const xKey = String(data.xKey || 'label');\n const series = (data.series || []) as SeriesInfo[];\n const chartData = (data.data || []) as Record<string, unknown>[];\n\n const containerRef = useRef<HTMLDivElement>(null);\n const { width, height } = useContainerSize(containerRef);\n\n if (!chartData.length) {\n return <div className=\"widget widget-chart widget-chart--empty\">Sem dados</div>;\n }\n\n const renderChart = () => {\n if (width <= 0 || height <= 0) return null;\n\n if (chartType === 'pie') {\n return (\n <PieChart width={width} height={height}>\n <Pie\n data={chartData}\n dataKey={series[0]?.key || 's0'}\n nameKey={xKey}\n cx=\"50%\" cy=\"50%\" outerRadius=\"75%\"\n label={({ name, percent }: { name: string; percent: number }) =>\n `${name}: ${(percent * 100).toFixed(0)}%`\n }\n labelLine={false}\n >\n {chartData.map((_, i) => (\n <Cell key={i} fill={palette[i % palette.length]} />\n ))}\n </Pie>\n <Tooltip\n contentStyle={TOOLTIP_CONTENT_STYLE}\n labelStyle={TOOLTIP_LABEL_STYLE}\n labelFormatter={tooltipLabelFormatter}\n />\n </PieChart>\n );\n }\n\n const common = { chartData, xKey, series, palette, width, height };\n\n if (chartType === 'line') {\n return (\n <CartesianChart {...common} Chart={LineChart} renderSeries={(s, color) => (\n <Line key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\n stroke={color} strokeWidth={2} dot={chartData.length <= 31} />\n )} />\n );\n }\n\n if (chartType === 'area') {\n return (\n <CartesianChart {...common} Chart={AreaChart} renderSeries={(s, color) => (\n <Area key={s.key} type=\"monotone\" dataKey={s.key} name={s.label}\n fill={color} stroke={color} fillOpacity={0.3} />\n )} />\n );\n }\n\n return (\n <CartesianChart {...common} Chart={BarChart} renderSeries={(s, color) => (\n <Bar key={s.key} dataKey={s.key} name={s.label}\n fill={color} radius={[3, 3, 0, 0]} />\n )} />\n );\n };\n\n return (\n <div className=\"widget widget-chart\">\n {title && <h4 className=\"widget-chart__title\">{title}</h4>}\n <div ref={containerRef} className=\"widget-chart__container\">\n {renderChart()}\n </div>\n </div>\n );\n}\n","// Purpose: Widget de filtro interativo no grid (date_range, select, multi_select).\n// Scope: Modos temporais (range, monthly, weekly, yearly), select unico, multi-select.\n// Public API: FilterWidget\n\nimport type { FilterConfig, DateFilterMode } from '../types';\nimport {\n MONTH_NAMES_SHORT, getFullYearRange, getMonthRange,\n getMonthWeeks, parseMonthWeekFromRange,\n parseYearFromRange, parseMonthFromRange, getYearRange,\n} from '../utils/date';\nimport { DashboardDatePicker } from '../components/DashboardDatePicker';\n\ninterface Props {\n config: FilterConfig;\n value: string;\n options?: string[];\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}\n\n// -------Componente principal-------\n\nexport function FilterWidget({ config, value, options = [], dateBounds, onChange }: Props) {\n const filterType = config.filterType || 'select';\n const label = config.label || 'Filtro';\n const dateMode: DateFilterMode = config.dateFilterMode || 'range';\n\n return (\n <div className=\"widget-filter\">\n <label className=\"widget-filter__label\">{label}</label>\n {filterType === 'date_range' ? (\n dateMode === 'yearly' ? (\n <YearlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : dateMode === 'monthly' ? (\n <MonthlyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : dateMode === 'weekly' ? (\n <WeeklyFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n ) : (\n <DateRangeFilter value={value} dateBounds={dateBounds} onChange={onChange} />\n )\n ) : (\n <SelectFilter\n value={value}\n options={options}\n multi={filterType === 'multi_select'}\n onChange={onChange}\n />\n )}\n </div>\n );\n}\n\n// -------DateRangeFilter (modo range puro)-------\n\nfunction DateRangeFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start, end] = value ? value.split('|') : ['', ''];\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--stacked\">\n <DashboardDatePicker\n value={start}\n minIso={dateBounds?.min}\n maxIso={end || dateBounds?.max}\n selectsStart\n startIso={start}\n endIso={end}\n placeholder=\"Data inicial\"\n onChange={(iso) => onChange(`${iso}|${end}`)}\n />\n <DashboardDatePicker\n value={end}\n minIso={start || dateBounds?.min}\n maxIso={dateBounds?.max}\n selectsEnd\n startIso={start}\n endIso={end}\n placeholder=\"Data final\"\n onChange={(iso) => onChange(`${start}|${iso}`)}\n />\n </div>\n );\n}\n\n// -------YearlyFilter (modo anual)-------\n\nfunction YearlyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseYearFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const years = getYearRange(dateBounds);\n\n const handleYearChange = (year: number) => {\n const yr = getFullYearRange(year);\n onChange(`${yr.start}|${yr.end}`);\n };\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--year\">\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => handleYearChange(parseInt(e.target.value))}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n </div>\n );\n}\n\n// -------MonthlyFilter (modo mensal)-------\n\nfunction MonthlyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseMonthFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\n const years = getYearRange(dateBounds);\n\n const handleMonthChange = (year: number, month: number) => {\n const range = getMonthRange(year, month);\n onChange(`${range.start}|${range.end}`);\n };\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--month\">\n <select\n className=\"widget-filter__select\"\n value={selectedMonth}\n onChange={(e) => handleMonthChange(selectedYear, parseInt(e.target.value))}\n >\n {MONTH_NAMES_SHORT.map((name, i) => (\n <option key={i + 1} value={i + 1}>{name}</option>\n ))}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => handleMonthChange(parseInt(e.target.value), selectedMonth)}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n </div>\n );\n}\n\n// -------WeeklyFilter (modo semanal)-------\n\nfunction WeeklyFilter({ value, dateBounds, onChange }: {\n value: string;\n dateBounds?: { min: string | null; max: string | null } | null;\n onChange: (value: string) => void;\n}) {\n const [start] = value ? value.split('|') : [''];\n const parsed = parseMonthFromRange(start);\n const now = new Date();\n const selectedYear = parsed?.year ?? now.getFullYear();\n const selectedMonth = parsed?.month ?? (now.getMonth() + 1);\n const years = getYearRange(dateBounds);\n\n const monthWeeks = getMonthWeeks(selectedYear, selectedMonth);\n const selectedWeekIdx = parseMonthWeekFromRange(start, selectedYear, selectedMonth) || 1;\n\n return (\n <div className=\"widget-filter__date-range widget-filter__date-range--week\">\n <select\n className=\"widget-filter__select\"\n value={selectedYear}\n onChange={(e) => {\n const y = parseInt(e.target.value);\n const weeks = getMonthWeeks(y, selectedMonth);\n const w = weeks[0];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {years.map((y) => <option key={y} value={y}>{y}</option>)}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedMonth}\n onChange={(e) => {\n const m = parseInt(e.target.value);\n const weeks = getMonthWeeks(selectedYear, m);\n const w = weeks[0];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {MONTH_NAMES_SHORT.map((name, i) => (\n <option key={i + 1} value={i + 1}>{name}</option>\n ))}\n </select>\n <select\n className=\"widget-filter__select\"\n value={selectedWeekIdx}\n onChange={(e) => {\n const w = monthWeeks[parseInt(e.target.value) - 1];\n if (w) onChange(`${w.start}|${w.end}`);\n }}\n >\n {monthWeeks.map((w) => (\n <option key={w.index} value={w.index}>{w.label}</option>\n ))}\n </select>\n </div>\n );\n}\n\n// -------SelectFilter (categorico)-------\n\nfunction SelectFilter({ value, options, multi, onChange }: {\n value: string;\n options: string[];\n multi: boolean;\n onChange: (value: string) => void;\n}) {\n if (multi) {\n const selected = value ? value.split(',') : [];\n const toggle = (opt: string) => {\n const next = selected.includes(opt)\n ? selected.filter((s) => s !== opt)\n : [...selected, opt];\n onChange(next.join(','));\n };\n\n return (\n <div className=\"widget-filter__multi\">\n {options.map((opt) => (\n <label key={opt} className=\"widget-filter__multi-option\">\n <input\n type=\"checkbox\"\n checked={selected.includes(opt)}\n onChange={() => toggle(opt)}\n />\n {opt}\n </label>\n ))}\n </div>\n );\n }\n\n return (\n <select\n className=\"widget-filter__select\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">Todos</option>\n {options.map((opt) => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n );\n}\n","// Purpose: Widget de variavel editavel no grid (what-if scenarios).\n// Scope: Input numerico com label, formato e opcao de bloqueio.\n// Public API: VariableWidget\n\nimport type { VariableConfig } from '../types';\n\ninterface Props {\n config: VariableConfig;\n value: number;\n onChange: (value: number) => void;\n}\n\nconst FORMAT_SUFFIX: Record<string, string> = {\n currency: 'R$',\n percentage: '%',\n};\n\nexport function VariableWidget({ config, value, onChange }: Props) {\n const label = config.label || 'Variavel';\n const locked = config.locked || false;\n const fmt = config.variableFormat || 'number';\n const suffix = FORMAT_SUFFIX[fmt] || '';\n\n return (\n <div className={`widget-variable ${locked ? 'widget-variable--locked' : ''}`}>\n <label className=\"widget-variable__label\">{label}</label>\n <div className=\"widget-variable__input-wrapper\">\n <input\n className=\"widget-variable__input\"\n type=\"number\"\n value={value}\n onChange={(e) => onChange(parseFloat(e.target.value) || 0)}\n disabled={locked}\n step={fmt === 'integer' ? 1 : 0.01}\n />\n {suffix && <span className=\"widget-variable__suffix\">{suffix}</span>}\n </div>\n {locked && <span className=\"widget-variable__lock-icon\" title=\"Bloqueado\">🔒</span>}\n </div>\n );\n}\n","// Purpose: Widget de paleta de cores editavel no grid.\n// Scope: Permite ao usuario do dashboard trocar a paleta em runtime. Respeita bloqueio.\n// Public API: ColorPaletteWidget\n\nimport type { PaletteConfig } from '../types';\nimport { ColorPaletteSelector } from '../components/ColorPaletteSelector';\n\ninterface Props {\n config: PaletteConfig;\n palette: string[];\n onChange: (colors: string[]) => void;\n}\n\nexport function ColorPaletteWidget({ config, palette, onChange }: Props) {\n const label = config.label || 'Cores';\n const locked = config.locked || false;\n\n return (\n <div className={`widget-palette ${locked ? 'widget-palette--locked' : ''}`}>\n <label className=\"widget-palette__label\">{label}</label>\n <ColorPaletteSelector selected={palette} onSelect={onChange} customMode disabled={locked} />\n {locked && <span className=\"widget-palette__lock-icon\" title=\"Bloqueado\">🔒</span>}\n </div>\n );\n}\n","// Purpose: Dispatch de rendering por tipo de widget (dados + controle).\n// Scope: Recebe computed data e/ou config, renderiza widget correto.\n// Public API: WidgetRenderer\n\nimport type { WidgetType, AnyWidgetConfig, FilterConfig, VariableConfig, PaletteConfig } from '../types';\nimport { getSeries } from '../palettes';\nimport { KPIWidget } from './KPIWidget';\nimport { GaugeWidget } from './GaugeWidget';\nimport { ChartWidget } from './ChartWidget';\nimport { FilterWidget } from './FilterWidget';\nimport { VariableWidget } from './VariableWidget';\nimport { ColorPaletteWidget } from './ColorPaletteWidget';\n\ninterface Props {\n type: WidgetType;\n computed: Record<string, unknown>;\n palette: string[];\n // Control widget props (opcionais)\n config?: AnyWidgetConfig;\n filterValue?: string;\n filterOptions?: string[];\n dateBounds?: { min: string; max: string } | null;\n onFilterChange?: (value: string) => void;\n variableValue?: number;\n onVariableChange?: (value: number) => void;\n onPaletteChange?: (colors: string[]) => void;\n}\n\nexport function WidgetRenderer({\n type, computed, palette, config,\n filterValue, filterOptions, dateBounds, onFilterChange,\n variableValue, onVariableChange,\n onPaletteChange,\n}: Props) {\n if (computed.error) {\n return (\n <div className=\"widget widget--error\">\n <span className=\"widget__error-text\">{String(computed.error)}</span>\n </div>\n );\n }\n\n // Widgets de dados usam apenas as cores de series (5 primeiras).\n // UI colors sao aplicadas via CSS vars no grid container.\n const seriesColors = getSeries(palette);\n\n switch (type) {\n case 'kpi_card':\n return <KPIWidget data={computed} label={config?.label} />;\n case 'gauge':\n return <GaugeWidget data={computed} palette={seriesColors} label={config?.label} />;\n case 'chart':\n return <ChartWidget data={computed} palette={seriesColors} label={config?.label} />;\n case 'filter':\n return config && onFilterChange ? (\n <FilterWidget\n config={config as FilterConfig}\n value={filterValue || ''}\n options={filterOptions}\n dateBounds={dateBounds}\n onChange={onFilterChange}\n />\n ) : null;\n case 'variable': {\n const vc = config as VariableConfig | undefined;\n return vc && onVariableChange ? (\n <VariableWidget\n config={vc}\n value={variableValue ?? vc.variableValue ?? 0}\n onChange={onVariableChange}\n />\n ) : null;\n }\n case 'color_palette':\n return config && onPaletteChange ? (\n <ColorPaletteWidget\n config={config as PaletteConfig}\n palette={palette}\n onChange={onPaletteChange}\n />\n ) : null;\n default:\n return <div className=\"widget\">Widget: {type}</div>;\n }\n}\n","// Purpose: Componente top-level que renderiza um dashboard completo.\n// Scope: Busca layout + render da API Action com o token, aplica paleta como CSS vars,\n// renderiza grid com widgets interativos (filtros + variaveis + paleta).\n// Public API: Dashboard\n\nimport type { CSSProperties } from 'react';\nimport { useDashboardData } from './hooks/useDashboardData';\nimport { WidgetRenderer } from './widgets/WidgetRenderer';\nimport { getPaletteCssVars } from './palettes';\nimport { CONTROL_WIDGET_SET } from './types';\n\nconst GRID_ROW_HEIGHT_PX = 40;\nconst GRID_GAP_PX = 6;\n\ninterface DashboardProps {\n /** Token Bearer de acesso ao dashboard. */\n token: string;\n /** Altura de cada linha do grid em pixels. Default 40. */\n rowHeight?: number;\n /** Gap entre widgets em pixels. Default 6. */\n gridGap?: number;\n /** Classe CSS adicional no container raiz. */\n className?: string;\n}\n\nexport function Dashboard({\n token,\n rowHeight = GRID_ROW_HEIGHT_PX,\n gridGap = GRID_GAP_PX,\n className,\n}: DashboardProps) {\n const {\n layout, renderData, loading, error,\n filters, variables, palette,\n setFilter, setVariable, setPalette,\n } = useDashboardData(token);\n\n if (error && !layout) {\n return <div className={`preview-tab ${className ?? ''}`}><div className=\"preview-tab__error\">{error}</div></div>;\n }\n\n if (!layout) {\n return <div className={`preview-tab ${className ?? ''}`}><div className=\"preview-tab__loading\">Carregando dashboard...</div></div>;\n }\n\n if (layout.widgets.length === 0) {\n return (\n <div className={`preview-tab ${className ?? ''}`}>\n <div className=\"preview-tab__empty\">Este dashboard nao possui widgets.</div>\n </div>\n );\n }\n\n const widgetsData = renderData?.widgets ?? {};\n const dateBounds = renderData?.date_bounds ?? null;\n\n const gridStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${layout.gridColumns}, 1fr)`,\n gridTemplateRows: `repeat(${layout.gridRows}, ${rowHeight}px)`,\n gap: `${gridGap}px`,\n ...getPaletteCssVars(palette),\n } as CSSProperties;\n\n return (\n <div className={`preview-tab ${className ?? ''}`}>\n {error && !renderData && <div className=\"preview-tab__error\">{error}</div>}\n\n {renderData && (\n <div className=\"preview-tab__grid\" style={gridStyle}>\n {layout.widgets.map((widget) => {\n const isControl = CONTROL_WIDGET_SET.has(widget.type);\n const computed = widgetsData[widget.id];\n const widgetStyle: CSSProperties = {\n gridColumn: `${widget.grid.x + 1} / span ${widget.grid.w}`,\n gridRow: `${widget.grid.y + 1} / span ${widget.grid.h}`,\n };\n\n const variableValue = widget.type === 'variable'\n ? variables[widget.id] ?? (computed?.value as number) ?? widget.config.variableValue ?? 0\n : undefined;\n\n return (\n <div\n key={widget.id}\n className={`preview-tab__widget ${isControl ? 'preview-tab__widget--control' : ''}`}\n style={widgetStyle}\n >\n {isControl || computed ? (\n <WidgetRenderer\n type={widget.type}\n computed={computed || {}}\n palette={palette}\n config={widget.config}\n filterValue={filters[widget.id] || ''}\n filterOptions={(computed?.available_values as string[]) || []}\n dateBounds={dateBounds}\n onFilterChange={(val) => setFilter(widget.id, val)}\n variableValue={variableValue}\n onVariableChange={(val) => setVariable(widget.id, val)}\n onPaletteChange={setPalette}\n />\n ) : (\n <div className=\"preview-tab__widget-loading\">\n {loading ? 'Carregando...' : 'Sem dados'}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {loading && renderData && (\n <div className=\"preview-tab__recalculating\">Atualizando...</div>\n )}\n </div>\n );\n}\n"],"names":["API_URL","ENDPOINT_PREFIX","ApiError","message","status","payload","get","path","token","params","url","k","v","res","fetchLayout","fetchRender","DEBOUNCE_MS","useDashboardData","layout","setLayout","useState","renderData","setRenderData","filters","setFilters","variables","setVariables","localPalette","setLocalPalette","loading","setLoading","error","setError","debounceRef","useRef","appliedSyncedRef","useEffect","cancelled","err","buildQueryParams","prev","syncFiltersFromApplied","setFilter","useCallback","widgetId","value","setVariable","setPalette","colors","palette","useMemo","key","val","start","end","applied","synced","id","d","KPIWidget","data","label","displayLabel","formatted","comparison","trendClass","arrow","jsxs","jsx","COLOR_EMPTY","arcPath","cx","cy","r","fraction","angle","endX","endY","formatCompact","abs","GaugeWidget","propLabel","rawValue","valueFormatted","ratio","targetValue","comparisonLabel","exceeded","clamped","fillColor","targetFormatted","stroke","AXIS_STYLE","GRID_STROKE","TOOLTIP_CONTENT_STYLE","TOOLTIP_LABEL_STYLE","tooltipLabelFormatter","first","verbose","_a","useContainerSize","ref","size","setSize","el","observer","entry","width","height","CartesianChart","Chart","chartData","xKey","series","renderSeries","CartesianGrid","XAxis","YAxis","Tooltip","Legend","s","i","ChartWidget","chartType","title","containerRef","PieChart","Pie","name","percent","_","Cell","common","LineChart","color","Line","AreaChart","Area","BarChart","Bar","FilterWidget","config","options","dateBounds","onChange","filterType","dateMode","YearlyFilter","MonthlyFilter","WeeklyFilter","DateRangeFilter","SelectFilter","DashboardDatePicker","iso","parsed","parseYearFromRange","now","selectedYear","years","getYearRange","handleYearChange","year","yr","getFullYearRange","e","y","parseMonthFromRange","selectedMonth","handleMonthChange","month","range","getMonthRange","MONTH_NAMES_SHORT","monthWeeks","getMonthWeeks","selectedWeekIdx","parseMonthWeekFromRange","w","m","multi","selected","toggle","opt","next","FORMAT_SUFFIX","VariableWidget","locked","fmt","suffix","ColorPaletteWidget","ColorPaletteSelector","WidgetRenderer","type","computed","filterValue","filterOptions","onFilterChange","variableValue","onVariableChange","onPaletteChange","seriesColors","getSeries","vc","GRID_ROW_HEIGHT_PX","GRID_GAP_PX","Dashboard","rowHeight","gridGap","className","widgetsData","gridStyle","getPaletteCssVars","widget","isControl","CONTROL_WIDGET_SET","widgetStyle"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type { AggregationType, ComparisonType, FilterType, WidgetType, DataWidgetType, ControlWidgetType, ChartType, FormatType, DateFilterMode, Granularity, FilterDefinition, TargetDefinition, GridPosition, ComparisonConfig, AggregationStep, ColumnExpressionTerm, KpiOperand, KpiTerm, ChartSeriesConfig, ChartAxisConfig, KpiCardConfig, GaugeConfig, ChartConfig, FilterConfig, VariableConfig, PaletteConfig, AnyWidgetConfig, WidgetDefinition, WidgetConfigOf, DashboardLayout, FilterValuesResponse, RenderResponse, LayoutResponse, } from './types';
2
+ export { DEFAULT_PALETTE, DEFAULT_GRID_COLUMNS, DEFAULT_GRID_ROWS, EMPTY_LAYOUT, WIDGET_TYPE_LABELS, DATA_WIDGET_TYPES, CONTROL_WIDGET_TYPES, CONTROL_WIDGET_SET, AGGREGATION_LABELS, FORMAT_LABELS, NUMERIC_FORMAT_OPTIONS, COMPARISON_LABELS, CHART_TYPE_LABELS, FILTER_TYPE_LABELS, DEFAULT_GRID, DEFAULT_CONFIG, } from './types';
3
+ export { PALETTES, DEFAULT_PALETTE_COLORS, SLOT_INDEX, SLOT_LABELS, SERIES_COUNT, TOTAL_SLOTS, ensurePaletteShape, getSeries, getPaletteCssVars, } from './palettes';
4
+ export type { Palette, PaletteKey } from './palettes';
5
+ export { MONTH_NAMES_SHORT, MONTH_NAMES_FULL, getFullYearRange, getMonthRange, getWeekRange, getISOWeek, getWeeksInMonth, getMonthWeeks, parseYearFromRange, parseMonthFromRange, parseWeekFromRange, parseMonthWeekFromRange, getYearRange, } from './utils/date';
6
+ export type { MonthWeek } from './utils/date';
7
+ export { ColorPaletteSelector } from './components/ColorPaletteSelector';
8
+ export { DashboardDatePicker, isoToDate, dateToIso } from './components/DashboardDatePicker';
@@ -0,0 +1,46 @@
1
+ import { A as e, C as T, a as E, b as L, c as _, d as S, D as A, e as t, f as O, g as R, h as r, i as o, j as D, k as I, E as g, F, l as n, M, m as P, N, P as C, S as G, n as W, o as U, T as Y, W as h, p as k, q as l, r as B, s as p, t as m, u as H, v as i, w as c, x as d, y as u, z as b, B as f, G as x, H as j, I as q, J as v } from "./index-BHv7_r-h.js";
2
+ export {
3
+ e as AGGREGATION_LABELS,
4
+ T as CHART_TYPE_LABELS,
5
+ E as COMPARISON_LABELS,
6
+ L as CONTROL_WIDGET_SET,
7
+ _ as CONTROL_WIDGET_TYPES,
8
+ S as ColorPaletteSelector,
9
+ A as DATA_WIDGET_TYPES,
10
+ t as DEFAULT_CONFIG,
11
+ O as DEFAULT_GRID,
12
+ R as DEFAULT_GRID_COLUMNS,
13
+ r as DEFAULT_GRID_ROWS,
14
+ o as DEFAULT_PALETTE,
15
+ D as DEFAULT_PALETTE_COLORS,
16
+ I as DashboardDatePicker,
17
+ g as EMPTY_LAYOUT,
18
+ F as FILTER_TYPE_LABELS,
19
+ n as FORMAT_LABELS,
20
+ M as MONTH_NAMES_FULL,
21
+ P as MONTH_NAMES_SHORT,
22
+ N as NUMERIC_FORMAT_OPTIONS,
23
+ C as PALETTES,
24
+ G as SERIES_COUNT,
25
+ W as SLOT_INDEX,
26
+ U as SLOT_LABELS,
27
+ Y as TOTAL_SLOTS,
28
+ h as WIDGET_TYPE_LABELS,
29
+ k as dateToIso,
30
+ l as ensurePaletteShape,
31
+ B as getFullYearRange,
32
+ p as getISOWeek,
33
+ m as getMonthRange,
34
+ H as getMonthWeeks,
35
+ i as getPaletteCssVars,
36
+ c as getSeries,
37
+ d as getWeekRange,
38
+ u as getWeeksInMonth,
39
+ b as getYearRange,
40
+ f as isoToDate,
41
+ x as parseMonthFromRange,
42
+ j as parseMonthWeekFromRange,
43
+ q as parseWeekFromRange,
44
+ v as parseYearFromRange
45
+ };
46
+ //# sourceMappingURL=internals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internals.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}