1
resposta
import { Card, CardContent } from "@/components/ui/card";
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
import { ResponsiveContainer, Tooltip, XAxis, YAxis, Legend, CartesianGrid, BarChart, Bar } from "recharts";

const dataTrimestrePagamento = [
  { trimestre: "2023Q1", PIX: 12000, Credito: 18000, Debito: 7000, Dinheiro: 5000 },
  { trimestre: "2023Q2", PIX: 15000, Credito: 21000, Debito: 8000, Dinheiro: 6000 },
  { trimestre: "2023Q3", PIX: 17000, Credito: 25000, Debito: 10000, Dinheiro: 7000 },
  { trimestre: "2023Q4", PIX: 20000, Credito: 23000, Debito: 11000, Dinheiro: 9000 },
];

const dataFaturamentoRegiao = [
  { regiao: "Norte", faturamento: 15000 },
  { regiao: "Nordeste", faturamento: 18000 },
  { regiao: "Centro-Oeste", faturamento: 12000 },
  { regiao: "Sudeste", faturamento: 32000 },
  { regiao: "Sul", faturamento: 21000 },
];

const dataComposicaoSexo = [
  { uf: "SP", Masculino: 3000, Feminino: 2500 },
  { uf: "RJ", Masculino: 2200, Feminino: 2800 },
];

const cores = {
  aqua1: "#addcd4",
  azul1: "#203f75",
  cinza5: "#231f20",
};

export default function DashboardStorytellingZoop() {
  return (
    <div className="p-6 bg-white min-h-screen">
      <h1 className="text-3xl font-bold text-[#231f20] mb-2">Storytelling – Faturamento e Público Zoop 2023</h1>
      <p className="text-[#203f75] mb-6">Painel interativo com visuais estratégicos: pagamentos, regiões e público</p>

      <Tabs defaultValue="trimestre">
        <TabsList className="bg-[#ebebeb]">
          <TabsTrigger value="trimestre">Faturamento por Trimestre</TabsTrigger>
          <TabsTrigger value="regiao">Faturamento por Região</TabsTrigger>
          <TabsTrigger value="publico">Público SP x RJ</TabsTrigger>
        </TabsList>

        <TabsContent value="trimestre">
          <Card className="mt-4">
            <CardContent>
              <ResponsiveContainer width="100%" height={400}>
                <BarChart data={dataTrimestrePagamento}>
                  <CartesianGrid strokeDasharray="3 3" />
                  <XAxis dataKey="trimestre" stroke="#203f75" />
                  <YAxis stroke="#203f75" tickFormatter={(v) => `R$${v / 1000}k`} />
                  <Tooltip formatter={(v) => `R$ ${v.toLocaleString()}`} />
                  <Legend />
                  <Bar dataKey="PIX" stackId="a" fill={cores.aqua1} />
                  <Bar dataKey="Credito" stackId="a" fill={cores.azul1} />
                  <Bar dataKey="Debito" stackId="a" fill="#96bfb9" />
                  <Bar dataKey="Dinheiro" stackId="a" fill="#ebebeb" />
                </BarChart>
              </ResponsiveContainer>
            </CardContent>
          </Card>
        </TabsContent>

        <TabsContent value="regiao">
          <Card className="mt-4">
            <CardContent>
              <ResponsiveContainer width="100%" height={300}>
                <BarChart data={dataFaturamentoRegiao} layout="vertical">
                  <CartesianGrid strokeDasharray="3 3" />
                  <XAxis type="number" stroke={cores.azul1} tickFormatter={(v) => `R$${v / 1000}k`} />
                  <YAxis type="category" dataKey="regiao" stroke={cores.azul1} />
                  <Tooltip formatter={(v) => `R$ ${v.toLocaleString()}`} />
                  <Legend />
                  <Bar dataKey="faturamento" fill={cores.aqua1} />
                </BarChart>
              </ResponsiveContainer>
            </CardContent>
          </Card>
        </TabsContent>

        <TabsContent value="publico">
          <Card className="mt-4">
            <CardContent>
              <ResponsiveContainer width="100%" height={300}>
                <BarChart data={dataComposicaoSexo}>
                  <CartesianGrid strokeDasharray="3 3" />
                  <XAxis dataKey="uf" stroke={cores.azul1} />
                  <YAxis stroke={cores.azul1} />
                  <Tooltip />
                  <Legend />
                  <Bar dataKey="Masculino" stackId="a" fill={cores.azul1} />
                  <Bar dataKey="Feminino" stackId="a" fill={cores.aqua1} />
                </BarChart>
              </ResponsiveContainer>
            </CardContent>
          </Card>
        </TabsContent>
      </Tabs>
    </div>
  );
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Oi, Mauro! Como vai?Agradeço por compartilhar seu código com a comunidade Alura.

Gostei muito de como organizou os dados e estruturou os gráficos com Tabs e BarChart. Sua abordagem torna o painel interativo e fácil de entender.

Uma dica interessante para o futuro é usar ResponsiveContainer também para ajustar automaticamente a largura e altura de outros tipos de gráfico. Veja este exemplo para um LineChart:


import { ResponsiveContainer, LineChart, Line } from "recharts";

<ResponsiveContainer width="100%" height={300}>
  <LineChart data={dataTrimestrePagamento}>
    <Line type="monotone" dataKey="PIX" stroke="#8884d8" />
  </LineChart>
</ResponsiveContainer>

Assim, o gráfico ocupa todo o espaço disponível na tela.

Alura

Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!