Semiotic

Visualização de dados para gráficos estáticos e em streaming, mapas e visualização de redes.

Documentação

MCP Toplist

Semiotic

CI npm version TypeScript MseeP.ai Security Assessment Badge

Uma biblioteca de visualização de dados para React, projetada para desenvolvimento assistido por IA.

Gráficos simples em 5 linhas. Grafos de rede, dados em streaming e dashboards coordenados quando você precisar. Schemas estruturados e um servidor MCP para que assistentes de codificação com IA gerem código de gráfico correto na primeira tentativa.

Semiotic release dashboard showing chart count, bundle sizes, capability coverage, chart families, and documentation growth

Novidades na versão 3.9.0

A versão 3.9.0 fecha lacunas de renderização e de API, tornando a interação com gráficos mais fácil de expressar:

  • Estilos de marca retidos aceitam cursores CSS específicos de dados em canvas, SVG e renderização estática; HOCs de gráficos em tempo real também aceitam um padrão de cursor de nível superior, incluindo TemporalHistogram. A apresentação do cursor permanece separada do comportamento de clique e teclado, para que os aplicativos mantenham o controle da semântica de interação.
  • Gráficos em tempo real agora compartilham a tipagem genérica, metadados de acessibilidade, estados de carregamento/vazio, legendas, seleção, hover vinculado e contratos de observação das famílias de gráficos de alto nível; o RealtimeLineChart também suporta reordenação de tempo de evento limitada, agregação por janela e descarga explícita no fim do fluxo.
  • A renderização estática ganha o OrbitDiagram, além de amplas correções de paridade com o cliente para dados XY agrupados, layouts personalizados, fluxos geográficos, gradientes, camadas de fundo, cenas vazias e arestas de rede com valor zero.
  • Novos helpers públicos de observação, tooltip, fluxo de snapshot, alvo de clique em rede, responsividade e CSS de tema, enquanto portões mais rígidos de pacote, API, desempenho, documentação, npm, Cloud Run e MCP Registry protegem o artefato de lançamento de ponta a ponta.
import { ForceDirectedGraph } from "semiotic/network"

<ForceDirectedGraph
  nodes={nodes}
  edges={edges}
  styleRules={[
    { when: node => Boolean(node.url), style: { cursor: "pointer" } }
  ]}
  onClick={node => node?.url && openNode(node.url)}
/>

Gráficos simples continuam com cinco linhas:

import { LineChart } from "semiotic/xy"

<LineChart
  data={salesData}
  xAccessor="month"
  yAccessor="revenue"
/>

Por que Semiotic

Semiotic é uma biblioteca de visualização de dados para React que combina ampla cobertura de gráficos com ferramentas de IA de primeira linha. Ela lida com os tipos de gráfico que a maioria das bibliotecas ignora — grafos de rede, dados em streaming, distribuições estatísticas, visualizações coordenadas — e acompanha schemas legíveis por máquina para que LLMs possam gerar código correto sem exemplos.

Feito para desenvolvimento assistido por IA

Semiotic acompanha tudo o que um assistente de codificação com IA precisa para gerar visualizações corretas sem tentativa e erro:

  • semiotic/ai — uma única importação com o catálogo de capacidades de gráficos baseado em schema (XY, ordinal, rede, tempo real, geo, valor), otimizado para geração de código por LLM. Veja ai/surface-manifest.json para o inventário atual gerado. Observação: os arquivos de entrada publicados são pré-empacotados, então importar um gráfico de semiotic/ai ainda envia a maior parte do bundle — trate-o como uma superfície de codegen/ferramentas e use subcaminhos de família (semiotic/xy, semiotic/geo, semiotic/value, …) em código de produção, com aproximadamente metade do custo de um gráfico único.
  • ai/schema.json — schemas de props legíveis por máquina para cada componente
  • npx semiotic-mcp — um servidor MCP para renderização de gráficos baseada em ferramentas em qualquer cliente MCP
  • npx semiotic-ai --doctor — valide JSON de componente + props pela linha de comando, com sugestões de erros de digitação e detecção de anti-padrões
  • diagnoseConfig(component, props) — detector programático de anti-padrões com correções acionáveis, abrangendo validação, codificação, acessibilidade e verificações de design enganoso (decepção)
  • auditData(component, props, data?) — pré-verificação numérica ciente de gráficos para entradas que passam na validação de schema, mas quebram a matemática: valores não finitos, domínios de intervalo zero, entradas de log inválidas, geometria de tamanho negativo, totais normalizados inseguros e outliers que dominam a escala. Retorna evidências de linhas limitadas e flui para diagnoseConfig, Chart Clinic, CLI doctor e notificações opcionais de ChartContainer
  • AGENTS.md — fluxo de trabalho de repositório conciso compartilhado por agentes de codificação modernos; CLAUDE.md o importa e o Copilot recebe uma ponte de compatibilidade curta
  • ai/reference.md — referência completa do produto sob demanda, mantida fora do contexto de agente de codificação sempre carregado
  • llms.txt — documentação legível por máquina seguindo o padrão emergente

Cada gráfico inclui um error boundary integrado, avisos de validação em modo de desenvolvimento com sugestões de erros de digitação e recursos de acessibilidade (canvas aria-label, legendas navegáveis por teclado, tooltips aria-live, SVG <title>/<desc>) para que o código gerado por IA falhe graciosamente com diagnósticos acionáveis em vez de uma tela em branco.

Acessibilidade é uma superfície de lançamento

O European Accessibility Act aplica-se a produtos e serviços cobertos desde 28 de junho de 2025. Uma biblioteca de gráficos não pode certificar a conformidade legal de um aplicativo: escopo, conteúdo, controles ao redor, testes e aplicação nacional permanecem de responsabilidade do proprietário do aplicativo. Semiotic fornece infraestrutura testável para esse trabalho: interação por teclado, tabelas de dados acessíveis, descrições em camadas, navegação estruturada, caminhos de movimento reduzido e cores forçadas, e testes de contraste derivados de WCAG para presets de tema enviados. Veja a documentação de Acessibilidade e execute os próprios testes de tecnologia assistiva e de usuário do aplicativo.

Além dos gráficos padrão

Visualização de rede. Grafos de força direcionada, diagramas de Sankey, diagramas de cordas, layouts de árvore, treemaps, empacotamento de círculos e diagramas de órbita — todos como componentes React com a mesma API de props do LineChart.

Dados em streaming. Gráficos em tempo real renderizam em canvas a 60fps com uma API de push baseada em ref. Pushes rápidos de arestas de rede coalescem em um layout por frame de animação, enquanto métodos de leitura/mutação preservam semânticas síncronas de leitura-após-escrita. Codificação integrada de decaimento, pulso e obsolescência para dashboards de monitoramento.

Visualizações coordenadas. LinkedCharts fornece destaque cruzado por hover, filtragem cruzada por brush, crosshairs vinculados baseados em coordenadas e sincronização de seleção em qualquer combinação de tipos de gráfico por meio de estado de seleção compartilhado.

Visualização geográfica. Mapas coropléticos, mapas de símbolos proporcionais, mapas de fluxo com partículas animadas e cartogramas de distância — todos renderizados em canvas com projeções d3-geo, zoom/pan, mapas de base em tiles e rotação de globo por arrastar.

Resumos estatísticos. Box plots, violin plots, swarm plots, histogramas, suavização LOESS, previsão com envelopes de confiança e detecção de anomalias. Gráficos de distribuição marginal nos eixos de scatterplots com uma única prop.

Anotações de primeira classe. Anotações são objetos vinculados a dados, não arte posterior. Rótulos, callouts, limites, cercas, sobreposições estatísticas e widgets React movem-se com o gráfico e renderizam pelos caminhos de navegador, SSR e exportação. Opte por posicionamento, hierarquia, densidade, divulgação progressiva, quantidade ciente do público, proveniência e ciclo de vida editorial quando o gráfico precisar comunicar mais do que apenas sua codificação.

Escolha a camada de API

CamadaParaExemplo
ChartsFormas de gráfico comuns com props de nível de gráfico<LineChart data={d} xAccessor="x" yAccessor="y" />
FramesControle total sobre renderização, interação e layout<StreamXYFrame chartType="line" lineStyle={...} />

Todo componente Chart aceita uma prop frameProps para acessar a API Frame subjacente sem sair da interface mais simples.

Serialização e interoperabilidade

Gráficos serializam para JSON e de volta: toConfig, fromConfig, toURL, copyConfig, configToJSX. Tem especificações Vega-Lite? fromVegaLite(spec) as traduz para configs Semiotic — funciona com configToJSX() para round-trip completo de notebooks e especificações geradas por IA.

Precisa de uma revisão externa de armadilhas? O experimental unstable_toDataPitfallsChain() constrói uma entrada de cadeia sem dependências para datapitfalls, combinando o config Semiotic, JSX, fundamentação do leitor, diagnósticos, auditoria de acessibilidade e evidência opcional de SVG/imagem renderizada:

import { unstable_toDataPitfallsChain } from "semiotic/experimental"
import { detectPitfalls } from "datapitfalls"

const input = unstable_toDataPitfallsChain("LineChart", props, {
  narrative: "Monthly sales are accelerating.",
  rendered: { svg, evidence },
})

const report = await detectPitfalls(input, { apiKey: process.env.ANTHROPIC_API_KEY })

O caminho de retorno também permanece sem dependências. Use descobertas de gráfico inteiro como notificações ChartContainer, e transforme descobertas em anotações somente depois que seu aplicativo puder ancorá-las a marcas ou posições semânticas:

import { ChartContainer } from "semiotic"
import { LineChart } from "semiotic/xy"
import {
  unstable_toDataPitfallsAnnotations,
  unstable_toDataPitfallsNotifications,
} from "semiotic/experimental"

const notifications = unstable_toDataPitfallsNotifications(report)
const annotations = unstable_toDataPitfallsAnnotations(report, {
  anchorFor: (finding) =>
    finding.ruleId === "truncated-axis" ? { x: 9, y: 9000 } : null,
})

<ChartContainer notifications={notifications}>
  <LineChart {...props} annotations={annotations} />
</ChartContainer>

Quando usar outra coisa

Precisa de um gráfico de barras ou linhas padrão para um dashboard que você nunca precisará personalizar além de cores e rótulos? Recharts tem um ecossistema maior e mais exemplos da comunidade. Precisa de renderização acelerada por GPU para milhões de pontos de dados? Apache ECharts lida com essa escala.

Semiotic é para projetos que superam essas bibliotecas — quando você precisa de grafos de rede ao lado de séries temporais, dados em streaming ao lado de snapshots estáticos ou visualizações coordenadas entre tipos de gráfico.

Instalação

npm install semiotic

Requer React 18.1+ ou React 19.

Exemplos Rápidos

Dashboard Coordenado

Passe o mouse sobre um gráfico e destaque os mesmos dados em outro por meio de uma seleção compartilhada:

import { LinkedCharts, Scatterplot, BarChart } from "semiotic"

<LinkedCharts>
  <Scatterplot
    data={data} xAccessor="age" yAccessor="income" colorBy="region"
    linkedHover={{ name: "hl", fields: ["region"] }}
    selection={{ name: "hl" }}
  />
  <BarChart
    data={summary} categoryAccessor="region" valueAccessor="total"
    selection={{ name: "hl" }}
  />
</LinkedCharts>

Métricas em Streaming com Decaimento

Dados ao vivo desbotam pontos antigos, piscam novos e sinalizam feeds obsoletos:

import { RealtimeLineChart } from "semiotic"

const chartRef = useRef()
chartRef.current.push({ time: Date.now(), value: cpuLoad })

<RealtimeLineChart
  ref={chartRef}
  timeAccessor="time"
  valueAccessor="value"
  decay={{ type: "exponential", halfLife: 100 }}
  staleness={{ threshold: 5000, showBadge: true }}
/>

Grafos de Rede

Grafos de força direcionada e diagramas de Sankey — mesma API do LineChart:

import { ForceDirectedGraph, SankeyDiagram } from "semiotic"

<ForceDirectedGraph
  nodes={people} edges={friendships}
  colorBy="team" nodeSize={8} showLabels
/>

<SankeyDiagram
  edges={budgetFlows}
  sourceAccessor="from" targetAccessor="to" valueAccessor="amount"
/>

Visualização Geográfica

Mapas coropléticos, mapas de fluxo e cartogramas de distância com renderização em canvas, zoom/pan, mapas de base em tiles e partículas animadas:

import { ChoroplethMap, FlowMap, DistanceCartogram } from "semiotic/geo"

<ChoroplethMap
  areas={geoJsonFeatures} valueAccessor="gdp"
  colorScheme="viridis" projection="equalEarth" zoomable tooltip
/>

<FlowMap
  nodes={airports} flows={routes} valueAccessor="passengers"
  showParticles particleStyle={{ color: "source", speedMultiplier: 1.5 }}
/>

<DistanceCartogram
  points={cities} center="rome" costAccessor="travelDays"
  showRings costLabel="days" lines={routes}
/>

Monitor de Sistema em Streaming

Topologia de serviço ao vivo com alertas de limite e clique para inspecionar:

import { StreamNetworkFrame, ChartContainer, DetailsPanel, LinkedCharts } from "semiotic"

const chartRef = useRef()
chartRef.current.push({ source: "API", target: "Orders", value: 15 })

<LinkedCharts>
  <ChartContainer title="System Monitor" status="live"
    detailsPanel={
      <DetailsPanel position="right" trigger="click">
        {(datum) => <div>{datum.id}: {datum.value} req/s</div>}
      </DetailsPanel>
    }>
    <StreamNetworkFrame ref={chartRef} chartType="sankey"
      showParticles particleStyle={{ proportionalSpeed: true }}
      thresholds={{ metric: n => n.value, warning: 100, critical: 250 }}
    />
  </ChartContainer>
</LinkedCharts>

Gráficos Padrão

Gráficos de linha, barra, dispersão e área compartilham a mesma API orientada por acessores:

import { LineChart, BarChart } from "semiotic"

<LineChart
  data={salesData}
  xAccessor="month" yAccessor="revenue"
  curve="monotoneX" showPoints
/>

<BarChart
  data={categoryData}
  categoryAccessor="department" valueAccessor="sales"
  orientation="horizontal" colorBy="region"
/>

Todos os Componentes de Gráfico

CategoriaComponentes
XYLineChart AreaChart DifferenceChart StackedAreaChart Scatterplot ConnectedScatterplot BubbleChart Heatmap QuadrantChart MultiAxisLineChart MinimapChart CandlestickChart ScatterplotMatrix
CategóricoBarChart StackedBarChart GroupedBarChart LikertChart SwimlaneChart FunnelChart SwarmPlot BoxPlot Histogram ViolinPlot RidgelinePlot DotPlot PieChart DonutChart GaugeChart
RedeForceDirectedGraph ChordDiagram SankeyDiagram ProcessSankey TreeDiagram Treemap CirclePack OrbitDiagram
GeoChoroplethMap ProportionalSymbolMap FlowMap DistanceCartogram
Tempo RealRealtimeLineChart RealtimeHistogram RealtimeSwarmChart RealtimeWaterfallChart RealtimeHeatmap
CoordenaçãoLinkedCharts
LayoutChartGrid ContextLayout CategoryColorProvider
FramesStreamXYFrame StreamOrdinalFrame StreamNetworkFrame StreamGeoFrame

Tradução Vega-Lite

Cole uma especificação Vega-Lite e obtenha um gráfico Semiotic:

import { fromVegaLite } from "semiotic/data"
import { configToJSX, fromConfig } from "semiotic"

const config = fromVegaLite({
  mark: "bar",
  data: { values: [{ a: "A", b: 28 }, { a: "B", b: 55 }] },
  encoding: {
    x: { field: "a", type: "nominal" },
    y: { field: "b", type: "quantitative" },
  },
})

// Render directly
const { componentName, props } = fromConfig(config)
// → componentName: "BarChart", props: { data, categoryAccessor: "a", valueAccessor: "b" }

// Or generate JSX code
configToJSX(config)
// → <BarChart data={[...]} categoryAccessor="a" valueAccessor="b" />

Suporta marcas de barra, linha, área, ponto, retângulo, arco e tick com tradução de codificação para cor, tamanho, agregação e binning.

Telemetria de Arco de Conversa

Capture e reproduza o caminho que uma sessão de gráfico assistida por IA percorreu:

import {
  createLocalStorageConversationArcSink,
  enableConversationArc,
  getConversationArcStore,
  loadConversationArc,
  registerConversationArcSink,
} from "semiotic/ai"

const sink = createLocalStorageConversationArcSink({ key: "my-app:arc" })
registerConversationArcSink(sink)
enableConversationArc({ sessionId: "session-abc" })

getConversationArcStore().record({ type: "chart-rendered", component: "LineChart" })
loadConversationArc(sink.load(), { enabled: false })

Tamanhos de Bundle

Semiotic envia 17 pontos de entrada de módulo estáveis. Não importe de "semiotic" a menos que precise de tudo — use o subcaminho que corresponde ao seu tipo de gráfico.

Os números abaixo são o custo de artefato de primeira parte: o tamanho gzip do código próprio do Semiotic para cada subcaminho. Eles excluem React e outras dependências de runtime, portanto não são uma previsão de um bundle de aplicativo frio. Não adicione linhas de artefato para estimar um aplicativo: a resolução de dependências e a deduplicação de importações cruzadas acontecem no bundler do consumidor e são medidas separadamente abaixo.

Ponto de EntradagzipO que contém
semiotic/xy151 KBLineChart, AreaChart, Scatterplot, Heatmap, + 8 gráficos XY
semiotic/ordinal127 KBBarChart, PieChart, BoxPlot, Histogram, + 11 gráficos categóricos
semiotic/network149 KBForceDirectedGraph, SankeyDiagram, ProcessSankey, Treemap, + 4
semiotic/geo108 KBChoroplethMap, FlowMap, DistanceCartogram, ProportionalSymbolMap
semiotic/realtime162 KBRealtimeLineChart, RealtimeHistogram, + 4 gráficos de streaming
semiotic/realtime/core161 KBTipos de gráficos de streaming, HOCs e helpers de buffer
semiotic/realtime/react1 KBStatus de stream e hooks de push sincronizados
semiotic/server242 KBrenderChart, renderDashboard, renderToImage, renderToAnimatedGif
semiotic/server/node242 KBrenderChart, renderDashboard, renderToImage, renderToAnimatedGif
semiotic/server/edge247 KBrenderChart, renderChartWithEvidence, renderToStaticSVG, renderDashboard
semiotic/utils94 KBThemeProvider, auditorias numéricas/de acessibilidade, serialização — sem componentes de gráfico
semiotic/utils/core87 KBHelpers puros de tema, auditorias numéricas/de acessibilidade e serialização
semiotic/utils/react7 KBThemeProvider, useTheme, useReducedMotion, useHighContrast, useStreamStatus
semiotic/recipes95 KBFunções puras de layout (waffle, marimekko, flextree, dagre, …)
semiotic/recipes/core87 KBFunções puras de layout (waffle, marimekko, flextree, dagre, …)
semiotic/recipes/react7 KBHelpers de seleção de layout Glyph e React
semiotic/themes7 KBApenas presets de tema (tufte, carbon, etc.)
semiotic/themes/core7 KBPresets de tema e helpers de token
semiotic/themes/react6 KBThemeProvider/useTheme e hooks
semiotic/data4 KBbin, rollup, groupBy, pivot, fromVegaLite
semiotic/value6 KBBigNumber — KPI de valor focal / scorecard (POC SingleValueFrame)
semiotic/physics163 KBGaltonBoardChart, EventDropChart, UnitPileChart, CollisionSwarmChart, PacketFlowChart, PhysicsCustomChart
semiotic/physics/matter1 KBHelpers de migração Matter.js + guard de peer opcional (sem componentes de gráfico)
semiotic/physics/rapier1 KBGuard de peer Rapier + metadados de decisão de adaptador (sem componentes de gráfico)
semiotic/ai519 KBTodos os gráficos com schema + validação — otimizado para geração de código por LLM
semiotic/ai/core87 KBsuggestCharts, auditData, describeChart, repairChartConfig, adaptadores de ferramenta — sem componentes de gráfico
semiotic/controls11 KBDirectManipulationControl, CircularBrush, MobileStandardControls, auditVisualizationControls — sem renderizador de frame
semiotic/rough4 KBBackend de pintura Rough.js determinístico opcional — a geometria exata do Semiotic permanece autoritativa
semiotic332 KBTudo abaixo (bundle completo)

Imports nomeados para consumo a frio

A tabela acima é o custo de artefato de primeira parte, não um bundle de aplicação. A tabela gerada abaixo mede algo diferente: um consumidor novo empacota um import nomeado retido de um tarball semiotic empacotado pelo caminho de exportação pública. Ela inclui Semiotic e suas dependências de runtime resolvidas, mas externaliza React/React DOM e peers adaptadores opcionais que pertencem ao aplicativo host. Cada linha começa fria, então use-a para comparar uma escolha de import público — não para somar as linhas de um aplicativo. A linha de base verificável legível por máquina é benchmarks/setup/cold-consumer-imports.json; atualize-a após um build de produção com npm run docs:cold-consumer.

Método: tarball npm pack --ignore-scripts novo → consumidor temporário → bundle ESM esbuild minificado/com tree-shaking → gzip -9. React/React DOM e peers adaptadores opcionais são externos; Semiotic e suas dependências de runtime resolvidas são incluídos.

Import nomeado públicoRuntimeBundle gzip de consumo a frio
import { LineChart } from "semiotic"browser160.8 KiB
import { LineChart } from "semiotic/xy"browser160.5 KiB
import { BarChart } from "semiotic/ordinal"browser129.3 KiB
import { SankeyDiagram } from "semiotic/network"browser151.6 KiB
import { RealtimeLineChart } from "semiotic/realtime"browser133.9 KiB
import { RingBuffer } from "semiotic/realtime/core"browser0.7 KiB
import { useStreamStatus } from "semiotic/realtime/react"browser0.6 KiB
import { GaltonBoardChart } from "semiotic/physics"browser148.4 KiB
import { MATTER_PHYSICS_CAPABILITIES } from "semiotic/physics/matter"browser0.2 KiB
import { RAPIER_PHYSICS_CAPABILITIES } from "semiotic/physics/rapier"browser0.2 KiB
import { renderChart } from "semiotic/server"node304.7 KiB
import { generateFrameSVGs } from "semiotic/server/edge"node172.6 KiB
import { renderToImage } from "semiotic/server/node"node305.2 KiB
import { suggestCharts } from "semiotic/ai"browser237.4 KiB
import { suggestCharts } from "semiotic/ai/core"browser37.9 KiB
import { bin } from "semiotic/data"browser0.4 KiB
import { ChoroplethMap } from "semiotic/geo"browser113.7 KiB
import { createRoughRenderMode } from "semiotic/rough"browser3.2 KiB
import { resolveThemePreset } from "semiotic/themes"browser2.6 KiB
import { resolveThemePreset } from "semiotic/themes/core"browser2.6 KiB
import { ThemeProvider } from "semiotic/themes/react"browser5.1 KiB
import { validateProps } from "semiotic/utils"browser8.7 KiB
import { smartTickFormat } from "semiotic/utils/core"browser6.4 KiB
import { useReducedMotion } from "semiotic/utils/react"browser2.3 KiB
import { waffleLayout } from "semiotic/recipes"browser2.9 KiB
import { waffleLayout } from "semiotic/recipes/core"browser2.9 KiB
import { Glyph } from "semiotic/recipes/react"browser0.8 KiB
import { BigNumber } from "semiotic/value"browser5.9 KiB
import { DirectManipulationControl } from "semiotic/controls"browser1.3 KiB
// Import from the sub-path, not from "semiotic"
import { LineChart } from "semiotic/xy"
import { BarChart } from "semiotic/ordinal"
import { SankeyDiagram } from "semiotic/network"
import { ChoroplethMap } from "semiotic/geo"

Tree-shaking e imports de múltiplos subcaminhos: Entradas de família (semiotic/xy, semiotic/network, semiotic/ai, …) são construídas como um único grafo ESM com chunks compartilhados. Frames de stream, renderizadores e outros códigos comuns são enviados uma vez e importados por cada entrada que precisa deles — então combinar semiotic/ai + semiotic/xy + semiotic/network não significa pagar por três cópias completas do runtime. O pacote é marcado como "sideEffects": false, então bundlers modernos mantêm apenas os exports nomeados que você retém (ex.: LineChart + suggestCharts). Prefira subcaminhos de família para clareza; importe helpers de IA de semiotic/ai ou do mais leve semiotic/ai/core quando não precisar do catálogo de gráficos.

Quando usar "semiotic": Adequado quando você quer um único import para famílias mistas. Chunks compartilhados evitam código de runtime duplicado entre subcaminhos de família; a tabela de consumo a frio acima é o melhor guia para um único import nomeado.

TypeScript

Construído com strict: true. Definições de tipo completas acompanham o pacote. Genéricos para accessors type-safe:

interface Sale { month: number; revenue: number }

<LineChart<Sale>
  data={sales}
  xAccessor="month"    // TS validates this is keyof Sale
  yAccessor="revenue"
/>

Renderização no Lado do Servidor

Todos os componentes de gráfico renderizam SVG automaticamente em ambientes de servidor — sem imports ou configuração especiais. HOCs de gráfico não-streaming podem ser importados e renderizados diretamente de um Server Component do Next.js: a diretiva "use client" do Semiotic define o limite do pacote, então a página que importa não precisa de seu próprio wrapper ou diretiva. Props que cruzam esse limite devem permanecer serializáveis; adicione um wrapper de cliente de propriedade do app apenas quando introduzir hooks, props de callback, estado do navegador ou um gráfico de streaming orientado por push.

// app/dashboard/page.tsx — a Next.js Server Component
import { LineChart } from "semiotic/xy"

// Server: renders <svg> with path/circle/rect elements
// Client: renders <canvas> with SVG overlay for axes
export default async function DashboardPage() {
  const data = await fetchMetrics()
  return <LineChart data={data} xAccessor="date" yAccessor="value" />
}

Para geração standalone de SVG/PNG/GIF (e-mail, imagens OG, PDF, Slack), use o ponto de entrada do servidor:

import { renderChart, renderToImage, renderToAnimatedGif } from "semiotic/server"

// SVG — sync, no dependencies
const svg = renderChart("LineChart", {
  data, xAccessor: "date", yAccessor: "value",
  theme: "tufte", title: "Revenue Trend",
})

// PNG — async, requires sharp
const png = await renderToImage("BarChart", { data, ... }, { format: "png", scale: 2 })

// Animated GIF — async, requires sharp + gifenc
const gif = await renderToAnimatedGif("line", data, { ... }, { fps: 12 })

Servidor MCP

mcp-name: io.github.nteract/semiotic

Semiotic acompanha um servidor MCP que permite que assistentes de codificação de IA renderizem gráficos, diagnostiquem problemas de configuração, descubram schemas, leiam orientações de IA empacotadas e obtenham recomendações de gráficos por meio de chamadas de ferramentas.

Configuração

Adicione à sua configuração de cliente MCP (ex.: claude_desktop_config.json para Claude Desktop):

{
  "mcpServers": {
    "semiotic": {
      "command": "npx",
      "args": ["semiotic-mcp"]
    }
  }
}

Nenhuma chave de API ou autenticação necessária. O servidor roda localmente via stdio. O modo HTTP também está disponível para inspetores, clientes web e experimentos com o SDK de ChatGPT Apps: npx semiotic-mcp --http --port 3001. Ele vincula a 127.0.0.1 por padrão; exponha intencionalmente outra interface com --host 0.0.0.0 ou MCP_HOST=0.0.0.0. Desde a 3.7.2, o modo HTTP é stateless: cada requisição recebe um servidor MCP somente leitura novo + transporte, então ele pode escalar automaticamente em hosts serverless sem sessões sticky.

Para o modo desenvolvedor do ChatGPT, exponha o endpoint HTTP via HTTPS com um túnel e crie um conector que aponte para https://<your-tunnel>/mcp. A superfície experimental do Apps SDK é renderInteractiveChart, que retorna um template de widget text/html;profile=mcp-app mais um payload SVG oculto renderizado por Semiotic no servidor MCP.

Para uma implantação hospedada, veja deploy/cloud-run. O wrapper executa o binário semiotic-mcp publicado, expõe /mcp além de endpoints de health, e suporta MCP_ALLOWED_HOSTS para allowlisting de host-header em produção. Para verificação de domínio do ChatGPT Apps, defina OPENAI_APPS_CHALLENGE_TOKEN para que o modo HTTP sirva o token bruto de /.well-known/openai-apps-challenge.

Ferramentas

FerramentaDescrição
renderChartRenderiza um gráfico Semiotic em SVG estático. Suporta os componentes retornados por getSchema que são marcados como [renderable]. Passe { component: "LineChart", props: { data: [...], xAccessor: "x", yAccessor: "y" } }. Retorna string SVG mais um bloco JSON de "evidência de renderização" (contagens de marks por tipo de cena, domínios de eixo resolvidos, flag de vazio, contagem de anotações, nome acessível) para que agentes possam verificar se o gráfico desenhou marks de dados, ou erros de validação com sugestões de correção.
renderInteractiveChartRenderiza um gráfico de dados estáticos como widget de ChatGPT Apps. Usa o mesmo caminho de renderização do servidor Semiotic que renderChart, e então hidrata uma UI em iframe com controles de fit, zoom, dados, hover e evidência de renderização.
getSchemaRetorna o schema de props para um componente específico. Passe { component: "LineChart" } para obter suas props, ou omita component para listar o catálogo completo baseado em schema. Componentes marcados como [renderable] estão disponíveis por meio de renderChart; gráficos em tempo real exigem um ambiente de navegador/ao vivo.
suggestChartRecomendador por linhas de amostra. Passe { data: [{...}, ...] } com 1–5 objetos de amostra mais filtros opcionais amplos de intenção/capacidade.
suggestChartsRecomendador baseado em capacidade para dados de linhas limitados. Retorna sugestões de gráficos classificadas com pontuações, motivos, ressalvas, caminhos de import e props prontas para uso.
suggestStreamChartsRecomenda gráficos em tempo real a partir de um schema de stream, throughput e dicas de retenção.
suggestDashboardConstrói uma sugestão de dashboard multi-painel que cobre intenções analíticas distintas.
suggestStretchChartsRecomenda escolhas desafiadoras de alfabetização do público a partir de um AudienceProfile.
repairChartConfigVerifica se um gráfico solicitado se adequa a um dataset e retorna alternativas classificadas quando não se adequa.
interrogateChartRetorna um resumo estatístico e contexto ciente de gráficos para responder perguntas em linguagem natural com anotações opcionais.
diagnoseConfigVerifica uma configuração de gráfico para problemas comuns — dados vazios, dimensões ruins, accessors ausentes, formato de dados errado e mais. Retorna um relatório de diagnóstico legível por humanos com correções acionáveis.
reportIssueGera uma URL de issue do GitHub pré-preenchida para relatórios de bug ou solicitações de recursos. Passe { title: "...", body: "...", labels: ["bug"] }. Retorna uma URL que o usuário pode abrir para enviar.
applyThemeLista presets de tema nomeados ou retorna o uso de ThemeProvider/CSS/token para um preset como { name: "tufte" }.

Recursos

RecursoDescrição
semiotic://schemaJSON completo do schema de componentes legível por máquina.
semiotic://componentsÍndice de componentes mostrando status renderizável/somente navegador e categorias MCP.
semiotic://surface-manifestInventário gerado do schema de IA atual, exports, capacidade de renderização, ferramentas, recursos e prompts.
semiotic://behavior-contractsRegras semânticas visíveis para agentes sobre precedência de cores, combinações de props obrigatórias, push refs e capacidade de renderização.
semiotic://system-promptInstruções compactas de IA com regras de import, props de gráfico, orientação de SSR e armadilhas.
semiotic://examplesExemplos de gráficos copiáveis por formato de dados.
ui://semiotic/chart-widget.htmlTemplate de widget de ChatGPT Apps / MCP Apps usado por renderInteractiveChart.

Prompts

PromptDescrição
build-semiotic-chartFluxo de trabalho reutilizável para escolher um gráfico, ler o schema, diagnosticar props e renderizar uma prévia.
debug-semiotic-chartFluxo de trabalho reutilizável para depurar props inválidas, falhas de renderização e relatórios de problemas.

Exemplo: obter schema de um componente

Tool: getSchema
Args: { "component": "LineChart" }
→ Returns: { "name": "LineChart", "description": "...", "parameters": { "properties": { "data": ..., "xAccessor": ..., ... } } }

Exemplo: sugerir um gráfico para seus dados

Tool: suggestChart
Args: {
  "data": [
    { "month": "Jan", "revenue": 120, "region": "East" },
    { "month": "Feb", "revenue": 180, "region": "West" }
  ]
}
→ Returns:
  1. BarChart (high confidence) — categorical field (region) with values (revenue)
  2. StackedBarChart (medium confidence) — two categorical fields (month, region)
  3. DonutChart (medium confidence) — 2 categories — proportional composition

Exemplo: renderizar um gráfico

Tool: renderChart
Args: {
  "component": "BarChart",
  "props": {
    "data": [
      { "category": "Q1", "revenue": 120 },
      { "category": "Q2", "revenue": 180 },
      { "category": "Q3", "revenue": 150 }
    ],
    "categoryAccessor": "category",
    "valueAccessor": "revenue"
  }
}
→ Returns: <svg>...</svg>

Exemplo: renderizar um widget do ChatGPT Apps

Tool: renderInteractiveChart
Args: {
  "component": "BarChart",
  "props": {
    "title": "Revenue by Quarter",
    "data": [
      { "quarter": "Q1", "revenue": 120 },
      { "quarter": "Q2", "revenue": 180 }
    ],
    "categoryAccessor": "quarter",
    "valueAccessor": "revenue"
  }
}
→ Returns: structured chart summary for the model + hidden SVG/widget metadata for ChatGPT.

Exemplo: diagnosticar uma configuração quebrada

Tool: diagnoseConfig
Args: { "component": "LineChart", "props": { "data": [] } }
→ Returns: ✗ [EMPTY_DATA] data is an empty array — Fix: provide at least one data point

Exemplo: relatar um problema

Tool: reportIssue
Args: {
  "title": "Bug: BarChart tooltip shows undefined for custom accessor",
  "body": "When using valueAccessor='amount', tooltip displays 'undefined'.\n\ndiagnoseConfig output: ✓ no issues detected.",
  "labels": ["bug"]
}
→ Returns: Open this URL to submit the issue: https://github.com/nteract/semiotic/issues/new?...

Alternativa via CLI

Para validação rápida sem um cliente MCP:

npx semiotic-ai --list         # list components with import paths and renderability
npx semiotic-ai --list --json  # machine-readable component index
npx semiotic-ai --schema GaugeChart
npx semiotic-ai --suggest '{"data":[{"category":"A","value":10}],"intent":"comparison"}'
npx semiotic-ai --doctor       # validate component + props JSON
npx semiotic-ai --schema       # dump all chart schemas
npx semiotic-ai --compact      # compact schema (fewer tokens)

--doctor usa as verificações completas de diagnoseConfig quando dist está disponível e recorre à validação somente por schema em checkouts limpos do código-fonte.

Onde encontrar o Semiotic para assistentes de IA

O Semiotic é indexado por ferramentas de documentação de agentes de codificação de IA, para que seu assistente (Claude Code, Cursor, Cline, Copilot, etc.) possa acessar a documentação e as ferramentas atuais sem copiar e colar:

O Official MCP Registry é o registro canônico do diretório MCP; ele é distinto da aceitação no diretório de conectores curado de qualquer fornecedor de assistente. A atualização do diretório secundário e a propriedade de lançamentos são rastreadas em MCP_DISTRIBUTION.md.

Superfície de API voltada a agentes:

  • AGENTS.md é o contrato conciso de desenvolvimento do repositório e CLAUDE.md o importa para o Claude Code. Eles permanecem locais ao repositório, em vez de enviar instruções irrelevantes de contribuidores aos consumidores do pacote.
  • ai/reference.md, ai/schema.json, ai/surface-manifest.json, ai/behaviorContracts.cjs e agent-skill/semiotic-charts/SKILL.md são incluídos no tarball do npm (veja package.json#files). A referência é o guia de produto sob demanda impresso por npx semiotic-ai; o schema, o manifesto, os contratos e a habilidade portátil fornecem orientação estruturada de geração e validação.
  • semiotic.nteract.io/llms.txt + /llms-full.txt — implantados no site de documentação conforme o padrão llms.txt. Os agentes buscam o mapa de navegação (llms.txt) ou a documentação completa embutida (llms-full.txt) via HTTP; eles não fazem parte do pacote npm em si.

Documentação

Documentação interativa e exemplos

  • Getting Started
  • Charts — tipos de gráfico com exemplos ao vivo
  • Frames — referência completa da API de Frames
  • Features — eixos, tooltips, interação, comportamento responsivo e composição
  • Annotations — tipos de anotação de primeira classe, orientação de design, proveniência e ciclo de vida
  • Cookbook — padrões e receitas avançados
  • Playground — exploração interativa de props

Atualização

Contribuindo

Veja CONTRIBUTING.md. Nossa comunidade segue o nteract Código de Conduta.

Agradecimentos

O desenvolvimento desta biblioteca deve muito a Susie Lu, Jason Reid, James Womack, Matt Herman, Shelby Sturgis e Tristan Reid.

O mecanismo de layout Sankey é baseado em sankey-plus por Tom Shanley, que melhorou seu d3-sankey-circular anterior com melhor detecção de ciclos, empilhamento hierárquico de arcos e ajuste dinâmico de extensão.

Ícone do Semiotic baseado em um ícone de Andre Schauer.

Licença

Apache 2.0