Preview v0.3c. Sub-bloco DI da Fase 5 do SEED Design System v2.
Este preview não traz gráfico novo nem tipo novo: o DI não cria gráfico, cria
comportamento — como a dataviz que já existe se comporta no papel, e como ela
se liga à stack do produto. Spec completa no §4c do seed-dataviz.md v0.10.
print-color-adjust: exact num seletor universal e protegia os dois braços do próprio
teste · as quatro células agora têm área idêntica (o SVG preservava a proporção do
viewBox e deixava faixas brancas laterais) · break-inside: avoid passou a cobrir
.nota e .card, porque uma nota partiu entre as páginas 1 e 2. Nenhum dos
três o jsdom pegaria: ele confirma que a regra existe, não que ela cobre os elementos certos.| Destino | O que sai por ele | Escopo |
|---|---|---|
| Laser colorida de escritório | Laudo, relatório de O&M, proposta impressa, qualquer PDF que o ERP mande para a impressora | DI |
| Offset da gráfica | Colateral físico da marca | Fase 7 |
O fornecedor real da SEED trabalha em CTP (computer-to-plate) e exige PDF/X-1a com tudo convertido em CMYK; arquivos em RGB podem ter a cor alterada ou não impressa. Ele também declara variação de ±10% na cor dentro do mesmo lote — tolerância incompatível com informação codificada por diferença fina de cor, e irrelevante para o laudo, que nunca passa pelo CTP dele. Daí os dois destinos serem tratados como problemas diferentes, em vez de um pipeline único. DI7: o Design System não converte para CMYK — os hex canônicos permanecem RGB e a conversão é do fluxo da gráfica, na F7.
background-colorFato, não inferência: print-color-adjust: exact é
uma dica ao navegador. A preferência do usuário no diálogo de impressão
("Gráficos de plano de fundo") tem precedência, e nenhuma folha de estilo a sobrepõe. Um laudo
impresso por quem nunca abriu "Mais configurações" sai com todo background ausente.
background · exactfill · exactbackground · economyfill · economyMatriz do gate de impressão — o que sobreviveu em cada célula
| Célula | O que é | Opção MARCADA | Opção DESMARCADA |
|---|---|---|---|
| A | CSS background · exact | sobreviveu | sobreviveu |
| B | SVG fill · exact | sobreviveu | sobreviveu |
| C | CSS background · economy | sobreviveu | SUMIU |
| D | SVG fill · economy | sobreviveu | sobreviveu |
fill de SVG é conteúdo
desenhado e sobrevive por natureza; background-color é plano de
fundo e depende de proteção. A inferência declarada na v0.1 deixa de ser inferência.
print-color-adjust: exact mesmo com a preferência do usuário desmarcada. Existem
portanto duas camadas de proteção, e elas não têm o mesmo valor: a dica de CSS
(que funcionou aqui) e a natureza estrutural do SVG (que não depende de navegador). A regra dura
do DS continua sendo a segunda — a primeira é documentadamente uma dica, e a
documentação é explícita em que a preferência do usuário pode vencê-la.
<figure> nunca se parte entre páginasO gráfico abaixo é o mesmo do preview do DG, aqui só para exercer as regras de impressão. Na pré-visualização, ele e suas cinco partes viajam juntos para a página seguinte em vez de se dividirem.
Três postos, em MWh. Barra agrupada, eixo a partir do zero (DG4).
| Mês | Fora de ponta | Ponta | Reservado |
|---|---|---|---|
| Maio | 86 | 61 | 32 |
| Junho | 102 | 67 | 38 |
No papel o <details> do fallback é forçado a aberto e o
"Ver os dados em tabela" some: um acordeão fechado imprime como uma linha inútil, e o fallback
textual é a alternativa acessível exigida pelo DG1, não um detalhe opcional.
A escala já está resolvida por vector-effect: non-scaling-stroke,
obrigatório em todo SVG de gráfico — sem ele o mesmo stroke-width=1 renderizaria
entre meio pixel e doze, porque os viewBox do sistema escalam de 0,66× a 12,4×. O que não está
resolvido é o piso físico. Imprima e diga qual das linhas some ou engorda.
O candidato a falhar é o apoio de 0,5px. Referência de ordem de grandeza levantada na pesquisa: uma impressora laser não deposita linha abaixo de cerca de três a quatro vezes o seu ponto nominal. Isso é referência de literatura, não medição da SEED — o número nosso sai desta régua impressa.
Consumidor real e imediato: o ERP em Lovable (Vite + React + TypeScript +
Tailwind + shadcn/ui + Supabase). O seed-dataviz.md permanece agnóstico de
biblioteca (DF2); este guia é a ponte, nunca a lei.
--seed-chart-cat-N token SEED, dono do valor
↓
--chart-N alias que o shadcn Chart espera encontrar no CSS
↓
chartConfig[chave].color = "var(--chart-N)"
↓
fill="var(--color-chave)" ← o que o componente Recharts realmente consome
O fill não referencia --chart-N. Ele
referencia var(--color-CHAVE), uma variável que o ChartContainer gera
em tempo de execução a partir do chartConfig. Pular o terceiro salto produz gráfico
sem cor e sem erro no console — que é o modo de falha mais caro de todos.
globals.css (Tailwind v4)/* SEED DS v2 · aliases de dataviz para o shadcn Chart.
DI12: Recharts v3 usa var(--chart-1) DIRETO. NUNCA hsl(var(--chart-1)),
que era a forma do v2 e pressupunha tokens gravados como triplas de canal —
os tokens SEED são hex, e o embrulho produziria valor inválido, o que em CSS
significa cor ausente e não erro.
DI16: seis aliases. O shadcn distribui cinco por padrão; o teto SEED é seis.
Acima disso o gráfico se reestrutura (agregação em "Outros", facetas, ou o
par destaque × contexto do DG17) e nunca ganha uma sétima cor. */
:root {
--chart-1: var(--seed-chart-cat-1);
--chart-2: var(--seed-chart-cat-2);
--chart-3: var(--seed-chart-cat-3);
--chart-4: var(--seed-chart-cat-4);
--chart-5: var(--seed-chart-cat-5);
--chart-6: var(--seed-chart-cat-6);
}
/* DI13: o tema vem do [data-theme], não do objeto theme do chartConfig.
Descartado usar theme:{light,dark} no TS — duplicaria a cor dentro do
produto, criando uma segunda fonte de verdade e furando o DF7 e o GI1.
Como os tokens SEED já trocam de valor no [data-theme="dark"], os aliases
acompanham sozinhos e não precisam ser redeclarados. */
chartConfig e o componenteconst chartConfig = {
foraPonta: { label: "Fora de ponta", color: "var(--chart-1)" },
ponta: { label: "Ponta", color: "var(--chart-2)" },
reservado: { label: "Reservado", color: "var(--chart-3)" },
} satisfies ChartConfig
// DI15: ChartContainer SEMPRE com altura, min-h-* ou aspect-*. Sem uma delas o
// ResponsiveContainer não mede no primeiro render e o gráfico não aparece.
<ChartContainer config={chartConfig} className="min-h-[240px] w-full">
<BarChart accessibilityLayer data={dados}>
{/* DI14: accessibilityLayer é OBRIGATÓRIO e INSUFICIENTE. Ele entrega
acesso por teclado e suporte a leitor de tela. NÃO entrega alternativa
textual (WCAG 1.1.1) nem relação codificada entre legenda e dado
(1.3.1) — as duas reprovações da auditoria pública do shadcn Charts.
Por isso o invólucro <figure> do DG1 permanece por cima. */}
<Bar dataKey="foraPonta" fill="var(--color-foraPonta)" radius={3} />
<Bar dataKey="ponta" fill="var(--color-ponta)" radius={3} />
<Bar dataKey="reservado" fill="var(--color-reservado)" radius={3} />
</BarChart>
</ChartContainer>
// src/components/seed/SeedChart.tsx
// As CINCO partes do DG1: título em figcaption · descrição curta ·
// fallback textual SEMPRE presente · legenda · área com role="img"
// amarrada por aria-labelledby. Sem as cinco, não é gráfico SEED.
export function SeedChart({ titulo, descricao, children, dados, colunas }) {
const idT = useId(), idD = useId()
return (
<figure className="seed-chart" aria-labelledby={`${idT} ${idD}`}>
<figcaption id={idT}>{titulo}</figcaption>
<p id={idD} className="seed-chart__desc">{descricao}</p>
<div className="seed-chart__plot" role="img" aria-labelledby={`${idT} ${idD}`}>
{children}
</div>
<details className="seed-chart__fallback">
<summary>Ver os dados em tabela</summary>
<TabelaDados dados={dados} colunas={colunas} />
</details>
</figure>
)
}
| Assunto | De quem é |
|---|---|
| Painel e composição de dashboard | Fase 6 |
| Tempo real, websocket, consulta de dados | Produto (Lovable/Supabase) |
| Mapas MG-ES-BA | Sub-bloco DP |
| Formato, gramatura, acabamento, capa, papelaria, conversão CMYK da marca | Fase 7 |
| Veredito do gatilho da textura no papel | DI-b, aberto |
DI8 — PDF/A não é adotado. Nada no arcabouço CONFEA/CREA exige formato de arquivo para laudo; o PDF/A é recomendação do CONARQ dirigida aos órgãos do Sistema Nacional de Arquivos, e a SEED não integra o SINAR. E há conflito técnico: o PDF/A-1 admite apenas assinatura digital simples, o que colidiria com o PAdES da ICP-Brasil — que é justamente o que dá validade jurídica ao laudo assinado. O laudo sai em PDF comum, assinável em PAdES. Gatilho de revisão: se um contrato ou órgão exigir PDF/A por escrito, avaliar PDF/A-2 ou A-3, nunca A-1.