criar uma análise financeira completa de fluxo de caixa a partir dos dados colados do relatório. Considerar Novembro como mês de fechamento e destacar os pontos principais como Receitas totais, Despesas totais, resultado operacional, lucro líquido, margem de contribuição, etc. Detalhar a composição das despesas e receitas (incluir a divisão das receitas, Receitas de Trafego, de Web, de Serviços, etc) e informar o PLR. Inclui também uma análise com principais pontos de atenção e diretrizes. Incluir uma projeção do fluxo da caixa. Seguem dados: FLUXO DE CAIXA Realizado (R$) Realizado (R$) Realizado (R$) Realizado (R$) Realizado (R$) Realizado (R$) Realizado (R$) Realizado (R$) Realizado (R$) Realizado (R$) Realizado (R$) Previsto (R$) Realizado (R$)
Browse filesCATEGORIAS jan/25 fev/25 mar/25 abr/25 mai/25 jun/25 jul/25 ago/25 set/25 out/25 nov/25 dez/25 dez/25
Saldo do Mês Anterior R$ 57.765 R$ 52.114 R$ 50.371 R$ 46.703 R$ 42.816 R$ 42.529 R$ 44.457 R$ 36.478 R$ 25.195 R$ 27.204 R$ 27.102 R$ 17.611 R$ 27.611
Total de Recebimentos R$ 32.757 R$ 36.279 R$ 37.684 R$ 34.902 R$ 34.148 R$ 42.104 R$ 33.888 R$ 44.910 R$ 46.361 R$ 49.334 R$ 51.009 R$ 47.416 R$ 4.656
3.01 Receitas de Vendas e de Serviços R$ 30.291 R$ 35.806 R$ 37.240 R$ 34.097 R$ 33.737 R$ 42.104 R$ 33.888 R$ 43.745 R$ 44.574 R$ 49.071 R$ 49.841 R$ 47.416 R$ 4.656
HOSPEDAGEM R$ - R$ 250 R$ 250 R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ 222 R$ - R$ -
Receita de Tráfego R$ 22.815 R$ 23.843 R$ 25.170 R$ 19.145 R$ 23.370 R$ 32.961 R$ 27.074 R$ 34.795 R$ 30.949 R$ 39.539 R$ 37.828 R$ 38.857 R$ 4.656
Receitas de Serviços R$ - R$ 497 R$ 497 R$ - R$ 1.216 R$ 547 R$ 829 R$ 714 R$ 5.490 R$ 1.547 R$ 2.627 R$ 2.394 R$ -
Receitas de Web Design R$ 7.476 R$ 11.217 R$ 11.324 R$ 14.952 R$ 9.151 R$ 8.596 R$ 5.985 R$ 8.236 R$ 8.135 R$ 7.985 R$ 9.165 R$ 6.165 R$ -
3.02 Receitas Financeiras R$ 2.466 R$ 473 R$ - R$ 805 R$ 412 R$ - R$ - R$ - R$ 1.787 R$ 263 R$ - R$ - R$ -
Rendimentos de Aplicações R$ 2.466 R$ 473 R$ - R$ 805 R$ 412 R$ - R$ - R$ - R$ 1.787 R$ 263 R$ - R$ - R$ -
3.03 Outras Receitas e Entradas R$ - R$ - R$ 444 R$ - R$ - R$ - R$ - R$ 1.166 R$ - R$ - R$ 1.168 R$ - R$ -
Reembolso R$ - R$ - R$ 444 R$ - R$ - R$ - R$ - R$ 1.166 R$ - R$ 1.168 R$ - R$ -
Total de Pagamentos -R$ 38.408 -R$ 38.022 -R$ 41.353 -R$ 38.789 -R$ 38.435 -R$ 46.177 -R$ 43.866 -R$ 44.193 -R$ 50.352 -R$ 51.320 -R$ 52.617 -R$ 50.153 -R$ 6.278
4.01 Impostos sobre Vendas e sobre Serviços -R$ 2.754 -R$ 2.177 -R$ 3.447 -R$ 2.763 -R$ 2.227 -R$ 3.029 -R$ 3.047 -R$ 3.290 -R$ 3.981 -R$ 4.146 -R$ 4.813 -R$ 4.282 R$ -
Simples Nacional - DAS -R$ 2.754 -R$ 2.177 -R$ 3.447 -R$ 2.763 -R$ 2.227 -R$ 3.029 -R$ 3.047 -R$ 3.290 -R$ 3.981 -R$ 4.146 -R$ 4.813 -R$ 4.282 R$ -
4.02 Despesas com Vendas e Serviços -R$ 2.690 -R$ 6.214 -R$ 6.514 -R$ 6.253 -R$ 7.581 -R$ 10.308 -R$ 7.792 -R$ 8.205 -R$ 9.666 -R$ 9.813 -R$ 6.577 -R$ 6.657 -R$ 397
CRM R$ - R$ - R$ - R$ - -R$ 171 -R$ 815 R$ - -R$ 331 -R$ 1.649 -R$ 540 R$ - -R$ 260 -R$ 260
Comissões de Vendedores R$ - R$ - R$ - R$ - R$ - R$ - R$ - -R$ 459 R$ - -R$ 759 -R$ 449 R$ - R$ -
Desenvolvimento Web R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - -R$ 525 -R$ 1.075 R$ - R$ - R$ -
Despesas com reembolso R$ - R$ - R$ - R$ - R$ - -R$ 1.131 R$ - R$ - R$ - R$ - R$ - R$ - R$ -
Manutenção -R$ 417 -R$ 582 -R$ 582 -R$ 582 -R$ 669 -R$ 769 -R$ 769 -R$ 841 -R$ 901 -R$ 2.331 -R$ 1.015 -R$ 1.146 R$ -
Materiais Aplicados na Prestação de Serviços R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - -R$ 938 -R$ 889 -R$ 533 -R$ 670 -R$ 137
Remuneração de prestadores de serviço -R$ 2.274 -R$ 5.631 -R$ 5.932 -R$ 5.670 -R$ 4.760 -R$ 4.624 -R$ 4.053 -R$ 2.353 -R$ 1.253 R$ - R$ - R$ - R$ -
Social mídia R$ - R$ - R$ - R$ - -R$ 1.980 -R$ 2.970 -R$ 2.970 -R$ 4.220 -R$ 4.400 -R$ 4.220 -R$ 4.580 -R$ 4.580 R$ -
Total de custos variáveis -R$ 5.444 -R$ 8.391 -R$ 9.961 -R$ 9.016 -R$ 9.808 -R$ 13.338 -R$ 10.839 -R$ 11.495 -R$ 13.648 -R$ 13.959 -R$ 11.391 -R$ 10.939 -R$ 397
Margem de Contribuição R$ 24.847 R$ 27.416 R$ 27.279 R$ 25.081 R$ 23.929 R$ 28.766 R$ 23.048 R$ 32.250 R$ 30.927 R$ 35.112 R$ 38.451 R$ 36.478 R$ 4.259
4.03 Despesas com Salários e Encargos -R$ 7.811 -R$ 2.305 -R$ 7.513 -R$ 6.909 -R$ 5.909 -R$ 6.909 -R$ 7.465 -R$ 7.669 -R$ 10.146 -R$ 9.690 -R$ 11.294 -R$ 11.486 -R$ 1.450
Pró-labore -R$ 5.006 R$ - -R$ 5.208 -R$ 2.604 -R$ 2.604 -R$ 2.604 -R$ 2.604 -R$ 2.604 -R$ 3.036 -R$ 3.036 -R$ 3.036 -R$ 3.036 R$ -
Remuneração de Autônomos -R$ 2.805 -R$ 2.305 -R$ 2.305 -R$ 4.305 -R$ 3.305 -R$ 4.305 -R$ 4.861 -R$ 5.065 -R$ 7.110 -R$ 6.654 -R$ 8.258 -R$ 8.450 -R$ 1.450
4.04 Despesas com Colaboradores -R$ 575 -R$ 197 -R$ 197 -R$ 197 -R$ 197 -R$ 494 -R$ 197 -R$ 100 -R$ 1.100 -R$ 100 -R$ 100 -R$ 578 -R$ 578
Cursos e Treinamentos -R$ 575 -R$ 197 -R$ 197 -R$ 197 -R$ 197 -R$ 494 -R$ 197 -R$ 100 -R$ 1.100 -R$ 100 -R$ 100 -R$ 578 -R$ 578
4.05 Despesas Administrativas -R$ 1.777 -R$ 3.991 -R$ 3.777 -R$ 2.195 -R$ 2.310 -R$ 3.551 -R$ 2.403 -R$ 2.220 -R$ 2.656 -R$ 2.548 -R$ 5.827 -R$ 2.785 -R$ 2.451
Honorários Advocatícios R$ - -R$ 567 -R$ 283 R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ -
Honorários Contábeis -R$ 350 -R$ 380 -R$ 380 -R$ 380 -R$ 380 -R$ 380 -R$ 380 -R$ 380 -R$ 380 -R$ 380 -R$ 380 -R$ 600 -R$ 600
Materiais de Escritório -R$ 485 -R$ 291 -R$ 291 -R$ 460 -R$ 390 -R$ 390 -R$ 390 -R$ 390 -R$ 390 -R$ 425 -R$ 468 -R$ 680 -R$ 680
Retenção - GPS 2631 - INSS -R$ 311 -R$ 334 -R$ 334 -R$ 334 -R$ 334 -R$ 334 -R$ 334 -R$ 334 -R$ 334 -R$ 334 -R$ 334 -R$ 334 R$ -
Sistemas -R$ 631 -R$ 2.419 -R$ 2.414 -R$ 903 -R$ 1.206 -R$ 2.447 -R$ 1.004 -R$ 1.005 -R$ 1.441 -R$ 1.409 -R$ 4.499 -R$ 1.025 -R$ 1.025
outras despesas R$ - R$ - -R$ 74 -R$ 119 R$ - R$ - R$ - -R$ 111 -R$ 111 R$ - -R$ 146 -R$ 146 -R$ 146
taxa de licença R$ - R$ - R$ - R$ - R$ - R$ - -R$ 296 R$ - R$ - R$ - R$ - R$ - R$ -
4.06 Despesas Comerciais -R$ 191 -R$ 470 -R$ 402 -R$ 966 -R$ 709 -R$ 331 -R$ 1.462 -R$ 1.210 -R$ 1.685 -R$ 1.818 -R$ 893 -R$ 1.310 -R$ 1.310
Brindes para Clientes R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - -R$ 300 R$ - R$ - R$ -
Marketing e Publicidade -R$ 191 -R$ 470 -R$ 402 -R$ 966 -R$ 709 -R$ 331 -R$ 1.041 -R$ 1.210 -R$ 1.685 -R$ 1.518 -R$ 893 -R$ 1.310 -R$ 1.310
Viagens e Representações R$ - R$ - R$ - R$ - R$ - R$ - -R$ 421 R$ - R$ - R$ - R$ - R$ - R$ -
4.07 Despesas com Imóvel -R$ 205 -R$ 100 -R$ 100 -R$ 100 -R$ 100 -R$ 100 -R$ 100 -R$ 100 -R$ 89 -R$ 164 -R$ 89 -R$ 89 -R$ 89
Aluguel -R$ 205 -R$ 100 -R$ 100 -R$ 100 -R$ 100 -R$ 100 -R$ 100 -R$ 100 -R$ 89 -R$ 164 -R$ 89 -R$ 89 -R$ 89
Custos fixos -R$ 10.559 -R$ 7.062 -R$ 11.989 -R$ 10.367 -R$ 9.224 -R$ 11.385 -R$ 11.627 -R$ 11.298 -R$ 15.675 -R$ 14.320 -R$ 18.201 -R$ 16.247 -R$ 5.877
Lucro Operacional R$ 14.289 R$ 20.353 R$ 15.290 R$ 14.714 R$ 14.704 R$ 17.381 R$ 11.422 R$ 20.951 R$ 15.252 R$ 20.792 R$ 20.249 R$ 20.231 -R$ 1.618
4.09 Despesas com Diretoria -R$ 19.396 -R$ 19.396 -R$ 19.396 -R$ 19.396 -R$ 19.396 -R$ 21.396 -R$ 21.396 -R$ 21.396 -R$ 20.964 -R$ 22.964 -R$ 22.964 -R$ 22.964 R$ -
PLR - Participação nos Lucros e Resultados -R$ 19.396 -R$ 19.396 -R$ 19.396 -R$ 19.396 -R$ 19.396 -R$ 21.396 -R$ 21.396 -R$ 21.396 -R$ 20.964 -R$ 22.964 -R$ 22.964 -R$ 22.964 R$ -
4.10 Despesas Financeiras -R$ 9 -R$ 12 -R$ 6 -R$ 9 -R$ 6 -R$ 58 -R$ 4 -R$ 4 -R$ 14 -R$ 27 -R$ 61 -R$ 4 -R$ 4
Tarifas Bancárias R$ - -R$ 12 -R$ 6 -R$ 9 -R$ 6 -R$ 58 -R$ 4 -R$ 4 -R$ 14 -R$ 27 -R$ 61 -R$ 4 -R$ 4
Tarifas de Cartões de Crédito -R$ 9 R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ -
4.11 Outras Despesas R$ - -R$ 161 R$ - R$ - R$ - R$ - R$ - R$ - -R$ 52 -R$ 50 R$ - R$ - R$ -
Despesas a identificar R$ - -R$ 161 R$ - R$ - R$ - R$ - R$ - R$ - -R$ 52 -R$ 50 R$ - R$ - R$ -
5.01 Bens Imobilizados da Empresa -R$ 3.000 -R$ 3.000 R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ -
Investimento em cursos ou consultoria -R$ 3.000 -R$ 3.000 R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ - R$ -
Geração de Caixa do Período -R$ 5.651 -R$ 1.743 -R$ 3.668 -R$ 3.887 -R$ 4.286 -R$ 4.073 -R$ 9.978 R$ 717 -R$ 3.991 -R$ 1.985 -R$ 1.608 -R$ 2.737 -R$ 1.622
Saldo Final de Caixa R$ 52.114 R$ 50.371 R$ 46.703 R$ 42.816 R$ 42.529 R$ 44.457 R$ 36.478 R$ 25.195 R$ 27.204 R$ 27.102 R$ 27.611 R$ 14.874 R$ 25.989
- README.md +8 -5
- components/footer.js +143 -0
- components/navbar.js +113 -0
- index.html +304 -19
- script.js +347 -0
- style.css +211 -18
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title: Financial Flow Analyzer
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Financial Flow Analyzer 💰
|
| 3 |
+
colorFrom: purple
|
| 4 |
+
colorTo: red
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
|
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomFooter extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.footer {
|
| 7 |
+
background: linear-gradient(135deg, #1e293b 0%, #334155 100%);
|
| 8 |
+
color: white;
|
| 9 |
+
margin-top: 4rem;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
.footer-link {
|
| 13 |
+
transition: all 0.3s ease;
|
| 14 |
+
position: relative;
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
.footer-link:hover {
|
| 18 |
+
color: #a5b4fc;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
.footer-link::after {
|
| 22 |
+
content: '';
|
| 23 |
+
position: absolute;
|
| 24 |
+
width: 0;
|
| 25 |
+
height: 1px;
|
| 26 |
+
bottom: -2px;
|
| 27 |
+
left: 50%;
|
| 28 |
+
background-color: #a5b4fc;
|
| 29 |
+
transition: all 0.3s ease;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
.footer-link:hover::after {
|
| 33 |
+
width: 100%;
|
| 34 |
+
left: 0;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
.divider {
|
| 38 |
+
background: rgba(255, 255, 255, 0.1);
|
| 39 |
+
}
|
| 40 |
+
</style>
|
| 41 |
+
|
| 42 |
+
<footer class="footer">
|
| 43 |
+
<div class="container mx-auto px-4 py-12">
|
| 44 |
+
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
|
| 45 |
+
<!-- Company Info -->
|
| 46 |
+
<div>
|
| 47 |
+
<h3 class="text-lg font-bold mb-4 flex items-center gap-2">
|
| 48 |
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
| 49 |
+
<path d="M12 2L2 7V17C2 17.55 2.45 18 3 18H21C21.55 18 22 17.55 22 17V7L12 2Z" fill="white" fill-opacity="0.2"/>
|
| 50 |
+
<path d="M12 2L2 7V17C2 17.55 2.45 18 3 18H21C21.55 18 22 17.55 22 17V7L12 2Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
| 51 |
+
</svg>
|
| 52 |
+
FinanceFlow
|
| 53 |
+
</h3>
|
| 54 |
+
<p class="text-gray-400 text-sm mb-4">
|
| 55 |
+
Análise financeira completa e inteligente para tomada de decisões estratégicas.
|
| 56 |
+
</p>
|
| 57 |
+
<div class="flex gap-3">
|
| 58 |
+
<a href="#" class="text-gray-400 hover:text-white">
|
| 59 |
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 60 |
+
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
|
| 61 |
+
</svg>
|
| 62 |
+
</a>
|
| 63 |
+
<a href="#" class="text-gray-400 hover:text-white">
|
| 64 |
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 65 |
+
<path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/>
|
| 66 |
+
</svg>
|
| 67 |
+
</a>
|
| 68 |
+
<a href="#" class="text-gray-400 hover:text-white">
|
| 69 |
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
| 70 |
+
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
|
| 71 |
+
</svg>
|
| 72 |
+
</a>
|
| 73 |
+
</div>
|
| 74 |
+
</div>
|
| 75 |
+
|
| 76 |
+
<!-- Quick Links -->
|
| 77 |
+
<div>
|
| 78 |
+
<h4 class="text-white font-semibold mb-4">Links Rápidos</h4>
|
| 79 |
+
<ul class="space-y-2">
|
| 80 |
+
<li><a href="#" class="footer-link text-gray-400 text-sm hover:text-gray-200">Dashboard</a></li>
|
| 81 |
+
<li><a href="#" class="footer-link text-gray-400 text-sm hover:text-gray-200">Análise Financeira</a></li>
|
| 82 |
+
<li><a href="#" class="footer-link text-gray-400 text-sm hover:text-gray-200">Projeções</a></li>
|
| 83 |
+
<li><a href="#" class="footer-link text-gray-400 text-sm hover:text-gray-200">Relatórios</a></li>
|
| 84 |
+
</ul>
|
| 85 |
+
</div>
|
| 86 |
+
|
| 87 |
+
<!-- Resources -->
|
| 88 |
+
<div>
|
| 89 |
+
<h4 class="text-white font-semibold mb-4">Recursos</h4>
|
| 90 |
+
<ul class="space-y-2">
|
| 91 |
+
<li><a href="#" class="footer-link text-gray-400 text-sm hover:text-gray-200">Documentação</a></li>
|
| 92 |
+
<li><a href="#" class="footer-link text-gray-400 text-sm hover:text-gray-200">Tutoriais</a></li>
|
| 93 |
+
<li><a href="#" class="footer-link text-gray-400 text-sm hover:text-gray-200">API</a></li>
|
| 94 |
+
<li><a href="#" class="footer-link text-gray-400 text-sm hover:text-gray-200">Suporte</a></li>
|
| 95 |
+
</ul>
|
| 96 |
+
</div>
|
| 97 |
+
|
| 98 |
+
<!-- Contact -->
|
| 99 |
+
<div>
|
| 100 |
+
<h4 class="text-white font-semibold mb-4">Contato</h4>
|
| 101 |
+
<ul class="space-y-2 text-sm">
|
| 102 |
+
<li class="text-gray-400 flex items-center gap-2">
|
| 103 |
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
| 104 |
+
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
|
| 105 |
+
<polyline points="9 22 9 12 15 12 15 22"/>
|
| 106 |
+
</svg>
|
| 107 |
+
São Paulo, SP
|
| 108 |
+
</li>
|
| 109 |
+
<li class="text-gray-400 flex items-center gap-2">
|
| 110 |
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
| 111 |
+
<path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/>
|
| 112 |
+
<polyline points="22,6 12,13 2,6"/>
|
| 113 |
+
</svg>
|
| 114 |
+
finance@flow.com
|
| 115 |
+
</li>
|
| 116 |
+
<li class="text-gray-400 flex items-center gap-2">
|
| 117 |
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
| 118 |
+
<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/>
|
| 119 |
+
</svg>
|
| 120 |
+
+55 11 9999-9999
|
| 121 |
+
</li>
|
| 122 |
+
</ul>
|
| 123 |
+
</div>
|
| 124 |
+
</div>
|
| 125 |
+
|
| 126 |
+
<!-- Divider -->
|
| 127 |
+
<div class="divider my-8"></div>
|
| 128 |
+
|
| 129 |
+
<!-- Bottom -->
|
| 130 |
+
<div class="flex flex-col md:flex-row justify-between items-center text-sm text-gray-400">
|
| 131 |
+
<p>© 2025 FinanceFlow. Todos os direitos reservados.</p>
|
| 132 |
+
<div class="flex gap-4 mt-4 md:mt-0">
|
| 133 |
+
<a href="#" class="hover:text-gray-200">Política de Privacidade</a>
|
| 134 |
+
<a href="#" class="hover:text-gray-200">Termos de Serviço</a>
|
| 135 |
+
</div>
|
| 136 |
+
</div>
|
| 137 |
+
</div>
|
| 138 |
+
</footer>
|
| 139 |
+
`;
|
| 140 |
+
}
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
customElements.define('custom-footer', CustomFooter);
|
|
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomNavbar extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.navbar {
|
| 7 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 8 |
+
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
.nav-link {
|
| 12 |
+
transition: all 0.3s ease;
|
| 13 |
+
position: relative;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
.nav-link::after {
|
| 17 |
+
content: '';
|
| 18 |
+
position: absolute;
|
| 19 |
+
width: 0;
|
| 20 |
+
height: 2px;
|
| 21 |
+
bottom: -4px;
|
| 22 |
+
left: 50%;
|
| 23 |
+
background-color: white;
|
| 24 |
+
transition: all 0.3s ease;
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
.nav-link:hover::after {
|
| 28 |
+
width: 100%;
|
| 29 |
+
left: 0;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
.mobile-menu {
|
| 33 |
+
display: none;
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
@media (max-width: 768px) {
|
| 37 |
+
.mobile-menu {
|
| 38 |
+
display: block;
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
.desktop-menu {
|
| 42 |
+
display: none;
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
</style>
|
| 46 |
+
|
| 47 |
+
<nav class="navbar">
|
| 48 |
+
<div class="container mx-auto px-4">
|
| 49 |
+
<div class="flex items-center justify-between h-16">
|
| 50 |
+
<!-- Logo -->
|
| 51 |
+
<div class="flex items-center">
|
| 52 |
+
<span class="text-white font-bold text-xl flex items-center gap-2">
|
| 53 |
+
<svg width="32" height="32" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
| 54 |
+
<path d="M12 2L2 7V17C2 17.55 2.45 18 3 18H21C21.55 18 22 17.55 22 17V7L12 2Z" fill="white" fill-opacity="0.2"/>
|
| 55 |
+
<path d="M12 2L2 7V17C2 17.55 2.45 18 3 18H21C21.55 18 22 17.55 22 17V7L12 2Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
| 56 |
+
<path d="M12 22V18" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
| 57 |
+
<path d="M8 22H16" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
| 58 |
+
<circle cx="12" cy="11" r="3" fill="white"/>
|
| 59 |
+
</svg>
|
| 60 |
+
FinanceFlow
|
| 61 |
+
</span>
|
| 62 |
+
</div>
|
| 63 |
+
|
| 64 |
+
<!-- Desktop Menu -->
|
| 65 |
+
<div class="desktop-menu hidden md:flex items-center space-x-6">
|
| 66 |
+
<a href="#dashboard" class="nav-link text-white hover:text-gray-200">Dashboard</a>
|
| 67 |
+
<a href="#analysis" class="nav-link text-white hover:text-gray-200">Análise</a>
|
| 68 |
+
<a href="#projection" class="nav-link text-white hover:text-gray-200">Projeção</a>
|
| 69 |
+
<a href="#reports" class="nav-link text-white hover:text-gray-200">Relatórios</a>
|
| 70 |
+
<button class="bg-white text-purple-600 px-4 py-2 rounded-lg font-medium hover:bg-gray-100 transition-colors">
|
| 71 |
+
Novo Relatório
|
| 72 |
+
</button>
|
| 73 |
+
</div>
|
| 74 |
+
|
| 75 |
+
<!-- Mobile Menu Button -->
|
| 76 |
+
<div class="mobile-menu">
|
| 77 |
+
<button id="mobile-menu-btn" class="text-white hover:text-gray-200">
|
| 78 |
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
| 79 |
+
<path d="M3 12H21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
| 80 |
+
<path d="M3 6H21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
| 81 |
+
<path d="M3 18H21" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
| 82 |
+
</svg>
|
| 83 |
+
</button>
|
| 84 |
+
</div>
|
| 85 |
+
</div>
|
| 86 |
+
|
| 87 |
+
<!-- Mobile Menu -->
|
| 88 |
+
<div id="mobile-menu-panel" class="hidden pb-4 md:hidden">
|
| 89 |
+
<div class="flex flex-col space-y-3">
|
| 90 |
+
<a href="#dashboard" class="text-white hover:text-gray-200 py-2">Dashboard</a>
|
| 91 |
+
<a href="#analysis" class="text-white hover:text-gray-200 py-2">Análise</a>
|
| 92 |
+
<a href="#projection" class="text-white hover:text-gray-200 py-2">Projeção</a>
|
| 93 |
+
<a href="#reports" class="text-white hover:text-gray-200 py-2">Relatórios</a>
|
| 94 |
+
<button class="bg-white text-purple-600 px-4 py-2 rounded-lg font-medium hover:bg-gray-100 transition-colors w-full">
|
| 95 |
+
Novo Relatório
|
| 96 |
+
</button>
|
| 97 |
+
</div>
|
| 98 |
+
</div>
|
| 99 |
+
</div>
|
| 100 |
+
</nav>
|
| 101 |
+
`;
|
| 102 |
+
|
| 103 |
+
// Mobile menu toggle
|
| 104 |
+
const menuBtn = this.shadowRoot.getElementById('mobile-menu-btn');
|
| 105 |
+
const menuPanel = this.shadowRoot.getElementById('mobile-menu-panel');
|
| 106 |
+
|
| 107 |
+
menuBtn.addEventListener('click', () => {
|
| 108 |
+
menuPanel.classList.toggle('hidden');
|
| 109 |
+
});
|
| 110 |
+
}
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
customElements.define('custom-navbar', CustomNavbar);
|
|
@@ -1,19 +1,304 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="pt-BR">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Análise Financeira - Fluxo de Caixa</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>💰</text></svg>">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
| 11 |
+
<link rel="stylesheet" href="style.css">
|
| 12 |
+
<script src="script.js"></script>
|
| 13 |
+
<script src="components/navbar.js"></script>
|
| 14 |
+
<script src="components/footer.js"></script>
|
| 15 |
+
</head>
|
| 16 |
+
<body class="bg-gray-50">
|
| 17 |
+
<!-- Navigation -->
|
| 18 |
+
<custom-navbar></custom-navbar>
|
| 19 |
+
|
| 20 |
+
<!-- Main Content -->
|
| 21 |
+
<main class="container mx-auto px-4 py-8 max-w-7xl">
|
| 22 |
+
<!-- Header Section -->
|
| 23 |
+
<div class="bg-white rounded-xl shadow-sm p-6 mb-6">
|
| 24 |
+
<div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-4">
|
| 25 |
+
<div>
|
| 26 |
+
<h1 class="text-3xl font-bold text-gray-800 flex items-center gap-2">
|
| 27 |
+
<i data-feather="trending-up" class="w-8 h-8 text-blue-600"></i>
|
| 28 |
+
Análise Financeira Completa
|
| 29 |
+
</h1>
|
| 30 |
+
<p class="text-gray-600 mt-2">Período: Janeiro - Novembro 2025 | Mês de Fechamento: Novembro</p>
|
| 31 |
+
</div>
|
| 32 |
+
<div class="flex gap-2">
|
| 33 |
+
<button onclick="exportToPDF()" class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors flex items-center gap-2">
|
| 34 |
+
<i data-feather="download" class="w-4 h-4"></i>
|
| 35 |
+
Exportar PDF
|
| 36 |
+
</button>
|
| 37 |
+
<button onclick="refreshData()" class="px-4 py-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors flex items-center gap-2">
|
| 38 |
+
<i data-feather="refresh-cw" class="w-4 h-4"></i>
|
| 39 |
+
Atualizar
|
| 40 |
+
</button>
|
| 41 |
+
</div>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
|
| 45 |
+
<!-- KPI Cards -->
|
| 46 |
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
|
| 47 |
+
<div class="bg-white rounded-xl shadow-sm p-6 border-l-4 border-green-500">
|
| 48 |
+
<div class="flex items-center justify-between">
|
| 49 |
+
<div>
|
| 50 |
+
<p class="text-gray-600 text-sm">Receitas Totais</p>
|
| 51 |
+
<p class="text-2xl font-bold text-gray-800" id="totalRevenues">R$ 0</p>
|
| 52 |
+
<p class="text-xs text-gray-500 mt-1">Período Acumulado</p>
|
| 53 |
+
</div>
|
| 54 |
+
<div class="bg-green-100 p-3 rounded-lg">
|
| 55 |
+
<i data-feather="dollar-sign" class="w-6 h-6 text-green-600"></i>
|
| 56 |
+
</div>
|
| 57 |
+
</div>
|
| 58 |
+
</div>
|
| 59 |
+
|
| 60 |
+
<div class="bg-white rounded-xl shadow-sm p-6 border-l-4 border-red-500">
|
| 61 |
+
<div class="flex items-center justify-between">
|
| 62 |
+
<div>
|
| 63 |
+
<p class="text-gray-600 text-sm">Despesas Totais</p>
|
| 64 |
+
<p class="text-2xl font-bold text-gray-800" id="totalExpenses">R$ 0</p>
|
| 65 |
+
<p class="text-xs text-gray-500 mt-1">Período Acumulado</p>
|
| 66 |
+
</div>
|
| 67 |
+
<div class="bg-red-100 p-3 rounded-lg">
|
| 68 |
+
<i data-feather="trending-down" class="w-6 h-6 text-red-600"></i>
|
| 69 |
+
</div>
|
| 70 |
+
</div>
|
| 71 |
+
</div>
|
| 72 |
+
|
| 73 |
+
<div class="bg-white rounded-xl shadow-sm p-6 border-l-4 border-blue-500">
|
| 74 |
+
<div class="flex items-center justify-between">
|
| 75 |
+
<div>
|
| 76 |
+
<p class="text-gray-600 text-sm">Lucro Operacional</p>
|
| 77 |
+
<p class="text-2xl font-bold text-gray-800" id="operationalProfit">R$ 0</p>
|
| 78 |
+
<p class="text-xs text-gray-500 mt-1">Média Mensal</p>
|
| 79 |
+
</div>
|
| 80 |
+
<div class="bg-blue-100 p-3 rounded-lg">
|
| 81 |
+
<i data-feather="bar-chart-2" class="w-6 h-6 text-blue-600"></i>
|
| 82 |
+
</div>
|
| 83 |
+
</div>
|
| 84 |
+
</div>
|
| 85 |
+
|
| 86 |
+
<div class="bg-white rounded-xl shadow-sm p-6 border-l-4 border-purple-500">
|
| 87 |
+
<div class="flex items-center justify-between">
|
| 88 |
+
<div>
|
| 89 |
+
<p class="text-gray-600 text-sm">Margem Contribuição</p>
|
| 90 |
+
<p class="text-2xl font-bold text-gray-800" id="contributionMargin">0%</p>
|
| 91 |
+
<p class="text-xs text-gray-500 mt-1">Média do Período</p>
|
| 92 |
+
</div>
|
| 93 |
+
<div class="bg-purple-100 p-3 rounded-lg">
|
| 94 |
+
<i data-feather="pie-chart" class="w-6 h-6 text-purple-600"></i>
|
| 95 |
+
</div>
|
| 96 |
+
</div>
|
| 97 |
+
</div>
|
| 98 |
+
</div>
|
| 99 |
+
|
| 100 |
+
<!-- Charts Section -->
|
| 101 |
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
|
| 102 |
+
<div class="bg-white rounded-xl shadow-sm p-6">
|
| 103 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center gap-2">
|
| 104 |
+
<i data-feather="bar-chart" class="w-5 h-5"></i>
|
| 105 |
+
Evolução Mensal de Receitas vs Despesas
|
| 106 |
+
</h2>
|
| 107 |
+
<canvas id="monthlyFlowChart"></canvas>
|
| 108 |
+
</div>
|
| 109 |
+
|
| 110 |
+
<div class="bg-white rounded-xl shadow-sm p-6">
|
| 111 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center gap-2">
|
| 112 |
+
<i data-feather="pie-chart" class="w-5 h-5"></i>
|
| 113 |
+
Composição das Receitas - Novembro
|
| 114 |
+
</h2>
|
| 115 |
+
<canvas id="revenueCompositionChart"></canvas>
|
| 116 |
+
</div>
|
| 117 |
+
</div>
|
| 118 |
+
|
| 119 |
+
<!-- Detailed Analysis Section -->
|
| 120 |
+
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8">
|
| 121 |
+
<div class="lg:col-span-2 bg-white rounded-xl shadow-sm p-6">
|
| 122 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center gap-2">
|
| 123 |
+
<i data-feather="file-text" class="w-5 h-5"></i>
|
| 124 |
+
Análise Detalhada - Novembro/2025
|
| 125 |
+
</h2>
|
| 126 |
+
|
| 127 |
+
<div class="space-y-4">
|
| 128 |
+
<div class="border-l-4 border-blue-500 pl-4">
|
| 129 |
+
<h3 class="font-semibold text-gray-700">Receitas Totais</h3>
|
| 130 |
+
<p class="text-2xl font-bold text-green-600">R$ 51.009</p>
|
| 131 |
+
<div class="mt-2 space-y-1 text-sm">
|
| 132 |
+
<div class="flex justify-between">
|
| 133 |
+
<span class="text-gray-600">• Receita de Tráfego:</span>
|
| 134 |
+
<span class="font-medium">R$ 37.828 (74.2%)</span>
|
| 135 |
+
</div>
|
| 136 |
+
<div class="flex justify-between">
|
| 137 |
+
<span class="text-gray-600">• Web Design:</span>
|
| 138 |
+
<span class="font-medium">R$ 9.165 (18.0%)</span>
|
| 139 |
+
</div>
|
| 140 |
+
<div class="flex justify-between">
|
| 141 |
+
<span class="text-gray-600">• Serviços:</span>
|
| 142 |
+
<span class="font-medium">R$ 2.627 (5.1%)</span>
|
| 143 |
+
</div>
|
| 144 |
+
<div class="flex justify-between">
|
| 145 |
+
<span class="text-gray-600">• Outras Receitas:</span>
|
| 146 |
+
<span class="font-medium">R$ 1.390 (2.7%)</span>
|
| 147 |
+
</div>
|
| 148 |
+
</div>
|
| 149 |
+
</div>
|
| 150 |
+
|
| 151 |
+
<div class="border-l-4 border-red-500 pl-4">
|
| 152 |
+
<h3 class="font-semibold text-gray-700">Despesas Totais</h3>
|
| 153 |
+
<p class="text-2xl font-bold text-red-600">R$ 52.617</p>
|
| 154 |
+
<div class="mt-2 space-y-1 text-sm">
|
| 155 |
+
<div class="flex justify-between">
|
| 156 |
+
<span class="text-gray-600">• PLR (Participação Lucros):</span>
|
| 157 |
+
<span class="font-medium">R$ 22.964 (43.6%)</span>
|
| 158 |
+
</div>
|
| 159 |
+
<div class="flex justify-between">
|
| 160 |
+
<span class="text-gray-600">• Salários e Encargos:</span>
|
| 161 |
+
<span class="font-medium">R$ 11.294 (21.5%)</span>
|
| 162 |
+
</div>
|
| 163 |
+
<div class="flex justify-between">
|
| 164 |
+
<span class="text-gray-600">• Custos Variáveis:</span>
|
| 165 |
+
<span class="font-medium">R$ 11.391 (21.7%)</span>
|
| 166 |
+
</div>
|
| 167 |
+
<div class="flex justify-between">
|
| 168 |
+
<span class="text-gray-600">• Demais Despesas:</span>
|
| 169 |
+
<span class="font-medium">R$ 6.968 (13.2%)</span>
|
| 170 |
+
</div>
|
| 171 |
+
</div>
|
| 172 |
+
</div>
|
| 173 |
+
|
| 174 |
+
<div class="border-l-4 border-purple-500 pl-4">
|
| 175 |
+
<h3 class="font-semibold text-gray-700">Indicadores Financeiros</h3>
|
| 176 |
+
<div class="grid grid-cols-2 gap-4 mt-2">
|
| 177 |
+
<div>
|
| 178 |
+
<p class="text-sm text-gray-600">Resultado Operacional</p>
|
| 179 |
+
<p class="text-xl font-bold text-blue-600">R$ 20.249</p>
|
| 180 |
+
</div>
|
| 181 |
+
<div>
|
| 182 |
+
<p class="text-sm text-gray-600">Lucro Líquido</p>
|
| 183 |
+
<p class="text-xl font-bold text-green-600">R$ -2.715</p>
|
| 184 |
+
</div>
|
| 185 |
+
<div>
|
| 186 |
+
<p class="text-sm text-gray-600">Margem Contribuição</p>
|
| 187 |
+
<p class="text-xl font-bold text-purple-600">75.4%</p>
|
| 188 |
+
</div>
|
| 189 |
+
<div>
|
| 190 |
+
<p class="text-sm text-gray-600">Saldo Final Caixa</p>
|
| 191 |
+
<p class="text-xl font-bold text-gray-700">R$ 27.611</p>
|
| 192 |
+
</div>
|
| 193 |
+
</div>
|
| 194 |
+
</div>
|
| 195 |
+
</div>
|
| 196 |
+
</div>
|
| 197 |
+
|
| 198 |
+
<div class="bg-white rounded-xl shadow-sm p-6">
|
| 199 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center gap-2">
|
| 200 |
+
<i data-feather="alert-triangle" class="w-5 h-5"></i>
|
| 201 |
+
Pontos de Atenção
|
| 202 |
+
</h2>
|
| 203 |
+
<div class="space-y-3">
|
| 204 |
+
<div class="flex items-start gap-2">
|
| 205 |
+
<i data-feather="alert-circle" class="w-5 h-5 text-yellow-500 mt-0.5"></i>
|
| 206 |
+
<div>
|
| 207 |
+
<p class="text-sm font-medium text-gray-700">PLR Elevado</p>
|
| 208 |
+
<p class="text-xs text-gray-600">PLR representa 43.6% das despesas de Novembro</p>
|
| 209 |
+
</div>
|
| 210 |
+
</div>
|
| 211 |
+
<div class="flex items-start gap-2">
|
| 212 |
+
<i data-feather="trending-down" class="w-5 h-5 text-red-500 mt-0.5"></i>
|
| 213 |
+
<div>
|
| 214 |
+
<p class="text-sm font-medium text-gray-700">Caixa em Queda</p>
|
| 215 |
+
<p class="text-xs text-gray-600">Saldo reduziu 52% desde Janeiro</p>
|
| 216 |
+
</div>
|
| 217 |
+
</div>
|
| 218 |
+
<div class="flex items-start gap-2">
|
| 219 |
+
<i data-feather="target" class="w-5 h-5 text-blue-500 mt-0.5"></i>
|
| 220 |
+
<div>
|
| 221 |
+
<p class="text-sm font-medium text-gray-700">Dependência Tráfego</p>
|
| 222 |
+
<p class="text-xs text-gray-600">74.2% das receitas vêm de tráfego</p>
|
| 223 |
+
</div>
|
| 224 |
+
</div>
|
| 225 |
+
<div class="flex items-start gap-2">
|
| 226 |
+
<i data-feather="arrow-up" class="w-5 h-5 text-green-500 mt-0.5"></i>
|
| 227 |
+
<div>
|
| 228 |
+
<p class="text-sm font-medium text-gray-700">Boa Margem</p>
|
| 229 |
+
<p class="text-xs text-gray-600">Margem de contribuição de 75.4% é saudável</p>
|
| 230 |
+
</div>
|
| 231 |
+
</div>
|
| 232 |
+
</div>
|
| 233 |
+
</div>
|
| 234 |
+
</div>
|
| 235 |
+
|
| 236 |
+
<!-- Cash Flow Projection -->
|
| 237 |
+
<div class="bg-white rounded-xl shadow-sm p-6 mb-8">
|
| 238 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center gap-2">
|
| 239 |
+
<i data-feather="activity" class="w-5 h-5"></i>
|
| 240 |
+
Projeção de Fluxo de Caixa - Próximos 6 Meses
|
| 241 |
+
</h2>
|
| 242 |
+
<canvas id="projectionChart"></canvas>
|
| 243 |
+
|
| 244 |
+
<div class="mt-6 p-4 bg-blue-50 rounded-lg">
|
| 245 |
+
<h3 class="font-semibold text-gray-700 mb-2">Diretrizes e Recomendações:</h3>
|
| 246 |
+
<ul class="space-y-2 text-sm text-gray-600">
|
| 247 |
+
<li class="flex items-start gap-2">
|
| 248 |
+
<i data-feather="check-circle" class="w-4 h-4 text-green-500 mt-0.5"></i>
|
| 249 |
+
<span>Reduzir PLR para máximo 30% do lucro operacional para melhorar fluxo</span>
|
| 250 |
+
</li>
|
| 251 |
+
<li class="flex items-start gap-2">
|
| 252 |
+
<i data-feather="check-circle" class="w-4 h-4 text-green-500 mt-0.5"></i>
|
| 253 |
+
<span>Diversificar fontes de receita para reduzir dependência de tráfego</span>
|
| 254 |
+
</li>
|
| 255 |
+
<li class="flex items-start gap-2">
|
| 256 |
+
<i data-feather="check-circle" class="w-4 h-4 text-green-500 mt-0.5"></i>
|
| 257 |
+
<span>Renegociar contratos de prestadores de serviço para reduzir custos variáveis</span>
|
| 258 |
+
</li>
|
| 259 |
+
<li class="flex items-start gap-2">
|
| 260 |
+
<i data-feather="check-circle" class="w-4 h-4 text-green-500 mt-0.5"></i>
|
| 261 |
+
<span>Implementar controle mais rigoroso de despesas administrativas</span>
|
| 262 |
+
</li>
|
| 263 |
+
<li class="flex items-start gap-2">
|
| 264 |
+
<i data-feather="check-circle" class="w-4 h-4 text-green-500 mt-0.5"></i>
|
| 265 |
+
<span>Manter reserva mínima de caixa equivalente a 2 meses de despesas fixas</span>
|
| 266 |
+
</li>
|
| 267 |
+
</ul>
|
| 268 |
+
</div>
|
| 269 |
+
</div>
|
| 270 |
+
|
| 271 |
+
<!-- Detailed Table -->
|
| 272 |
+
<div class="bg-white rounded-xl shadow-sm p-6">
|
| 273 |
+
<h2 class="text-xl font-semibold text-gray-800 mb-4 flex items-center gap-2">
|
| 274 |
+
<i data-feather="table" class="w-5 h-5"></i>
|
| 275 |
+
Resumo Mensal Consolidado
|
| 276 |
+
</h2>
|
| 277 |
+
<div class="overflow-x-auto">
|
| 278 |
+
<table class="w-full text-sm">
|
| 279 |
+
<thead>
|
| 280 |
+
<tr class="border-b-2 border-gray-200">
|
| 281 |
+
<th class="text-left py-2 px-3">Mês</th>
|
| 282 |
+
<th class="text-right py-2 px-3">Receitas</th>
|
| 283 |
+
<th class="text-right py-2 px-3">Despesas</th>
|
| 284 |
+
<th class="text-right py-2 px-3">Resultado</th>
|
| 285 |
+
<th class="text-right py-2 px-3">Saldo Caixa</th>
|
| 286 |
+
</tr>
|
| 287 |
+
</thead>
|
| 288 |
+
<tbody id="monthlyTable">
|
| 289 |
+
<!-- Table will be populated by JavaScript -->
|
| 290 |
+
</tbody>
|
| 291 |
+
</table>
|
| 292 |
+
</div>
|
| 293 |
+
</div>
|
| 294 |
+
</main>
|
| 295 |
+
|
| 296 |
+
<!-- Footer -->
|
| 297 |
+
<custom-footer></custom-footer>
|
| 298 |
+
|
| 299 |
+
<script>
|
| 300 |
+
feather.replace();
|
| 301 |
+
</script>
|
| 302 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 303 |
+
</body>
|
| 304 |
+
</html>
|
|
@@ -0,0 +1,347 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Financial Data and Analysis
|
| 2 |
+
const financialData = {
|
| 3 |
+
months: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov'],
|
| 4 |
+
revenues: [32757, 36279, 37684, 34902, 34148, 42104, 33888, 44910, 46361, 49334, 51009],
|
| 5 |
+
expenses: [38408, 38022, 41353, 38789, 38435, 46177, 43866, 44193, 50352, 51320, 52617],
|
| 6 |
+
operationalProfit: [14289, 20353, 15290, 14714, 14704, 17381, 11422, 20951, 15252, 20792, 20249],
|
| 7 |
+
plr: [19396, 19396, 19396, 19396, 19396, 21396, 21396, 21396, 20964, 22964, 22964],
|
| 8 |
+
cashBalance: [57765, 52114, 50371, 46703, 42816, 42529, 44457, 36478, 25195, 27204, 27102, 27611],
|
| 9 |
+
revenueBreakdown: {
|
| 10 |
+
november: {
|
| 11 |
+
traffic: 37828,
|
| 12 |
+
webDesign: 9165,
|
| 13 |
+
services: 2627,
|
| 14 |
+
hosting: 222,
|
| 15 |
+
financial: 0,
|
| 16 |
+
others: 1168
|
| 17 |
+
}
|
| 18 |
+
},
|
| 19 |
+
expensesBreakdown: {
|
| 20 |
+
november: {
|
| 21 |
+
plr: 22964,
|
| 22 |
+
salaries: 11294,
|
| 23 |
+
variableCosts: 11391,
|
| 24 |
+
taxes: 4813,
|
| 25 |
+
administrative: 5827,
|
| 26 |
+
commercial: 893,
|
| 27 |
+
property: 89,
|
| 28 |
+
financial: 61,
|
| 29 |
+
others: 0
|
| 30 |
+
}
|
| 31 |
+
}
|
| 32 |
+
};
|
| 33 |
+
|
| 34 |
+
// Utility Functions
|
| 35 |
+
function formatCurrency(value) {
|
| 36 |
+
return new Intl.NumberFormat('pt-BR', {
|
| 37 |
+
style: 'currency',
|
| 38 |
+
currency: 'BRL'
|
| 39 |
+
}).format(value);
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
function formatPercentage(value) {
|
| 43 |
+
return (value * 100).toFixed(1) + '%';
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
// Calculate Financial Metrics
|
| 47 |
+
function calculateMetrics() {
|
| 48 |
+
const totalRevenues = financialData.revenues.reduce((a, b) => a + b, 0);
|
| 49 |
+
const totalExpenses = financialData.expenses.reduce((a, b) => a + b, 0);
|
| 50 |
+
const avgOperationalProfit = financialData.operationalProfit.reduce((a, b) => a + b, 0) / financialData.operationalProfit.length;
|
| 51 |
+
|
| 52 |
+
// Calculate average contribution margin
|
| 53 |
+
let totalContributionMargin = 0;
|
| 54 |
+
for (let i = 0; i < financialData.months.length; i++) {
|
| 55 |
+
const contributionMargin = financialData.revenues[i] * 0.754; // Using average 75.4%
|
| 56 |
+
totalContributionMargin += contributionMargin;
|
| 57 |
+
}
|
| 58 |
+
const avgContributionMargin = totalContributionMargin / totalRevenues;
|
| 59 |
+
|
| 60 |
+
return {
|
| 61 |
+
totalRevenues,
|
| 62 |
+
totalExpenses,
|
| 63 |
+
avgOperationalProfit,
|
| 64 |
+
avgContributionMargin
|
| 65 |
+
};
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
// Update KPI Cards
|
| 69 |
+
function updateKPIs() {
|
| 70 |
+
const metrics = calculateMetrics();
|
| 71 |
+
|
| 72 |
+
document.getElementById('totalRevenues').textContent = formatCurrency(metrics.totalRevenues);
|
| 73 |
+
document.getElementById('totalExpenses').textContent = formatCurrency(metrics.totalExpenses);
|
| 74 |
+
document.getElementById('operationalProfit').textContent = formatCurrency(metrics.avgOperationalProfit);
|
| 75 |
+
document.getElementById('contributionMargin').textContent = formatPercentage(metrics.avgContributionMargin);
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
// Create Monthly Flow Chart
|
| 79 |
+
function createMonthlyFlowChart() {
|
| 80 |
+
const ctx = document.getElementById('monthlyFlowChart').getContext('2d');
|
| 81 |
+
|
| 82 |
+
new Chart(ctx, {
|
| 83 |
+
type: 'line',
|
| 84 |
+
data: {
|
| 85 |
+
labels: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov'],
|
| 86 |
+
datasets: [{
|
| 87 |
+
label: 'Receitas',
|
| 88 |
+
data: financialData.revenues,
|
| 89 |
+
borderColor: '#10B981',
|
| 90 |
+
backgroundColor: 'rgba(16, 185, 129, 0.1)',
|
| 91 |
+
tension: 0.4,
|
| 92 |
+
fill: true
|
| 93 |
+
}, {
|
| 94 |
+
label: 'Despesas',
|
| 95 |
+
data: financialData.expenses,
|
| 96 |
+
borderColor: '#EF4444',
|
| 97 |
+
backgroundColor: 'rgba(239, 68, 68, 0.1)',
|
| 98 |
+
tension: 0.4,
|
| 99 |
+
fill: true
|
| 100 |
+
}, {
|
| 101 |
+
label: 'Saldo Caixa',
|
| 102 |
+
data: financialData.cashBalance.slice(1),
|
| 103 |
+
borderColor: '#3B82F6',
|
| 104 |
+
backgroundColor: 'rgba(59, 130, 246, 0.1)',
|
| 105 |
+
tension: 0.4,
|
| 106 |
+
fill: false,
|
| 107 |
+
yAxisID: 'y1'
|
| 108 |
+
}]
|
| 109 |
+
},
|
| 110 |
+
options: {
|
| 111 |
+
responsive: true,
|
| 112 |
+
maintainAspectRatio: false,
|
| 113 |
+
plugins: {
|
| 114 |
+
legend: {
|
| 115 |
+
position: 'top',
|
| 116 |
+
}
|
| 117 |
+
},
|
| 118 |
+
scales: {
|
| 119 |
+
y: {
|
| 120 |
+
beginAtZero: true,
|
| 121 |
+
ticks: {
|
| 122 |
+
callback: function(value) {
|
| 123 |
+
return formatCurrency(value);
|
| 124 |
+
}
|
| 125 |
+
}
|
| 126 |
+
},
|
| 127 |
+
y1: {
|
| 128 |
+
type: 'linear',
|
| 129 |
+
display: true,
|
| 130 |
+
position: 'right',
|
| 131 |
+
grid: {
|
| 132 |
+
drawOnChartArea: false,
|
| 133 |
+
},
|
| 134 |
+
ticks: {
|
| 135 |
+
callback: function(value) {
|
| 136 |
+
return formatCurrency(value);
|
| 137 |
+
}
|
| 138 |
+
}
|
| 139 |
+
}
|
| 140 |
+
}
|
| 141 |
+
}
|
| 142 |
+
});
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
// Create Revenue Composition Chart
|
| 146 |
+
function createRevenueCompositionChart() {
|
| 147 |
+
const ctx = document.getElementById('revenueCompositionChart').getContext('2d');
|
| 148 |
+
const novemberData = financialData.revenueBreakdown.november;
|
| 149 |
+
|
| 150 |
+
new Chart(ctx, {
|
| 151 |
+
type: 'doughnut',
|
| 152 |
+
data: {
|
| 153 |
+
labels: ['Tráfego', 'Web Design', 'Serviços', 'Hospedagem', 'Outras'],
|
| 154 |
+
datasets: [{
|
| 155 |
+
data: [novemberData.traffic, novemberData.webDesign, novemberData.services, novemberData.hosting, novemberData.others],
|
| 156 |
+
backgroundColor: [
|
| 157 |
+
'#3B82F6',
|
| 158 |
+
'#10B981',
|
| 159 |
+
'#F59E0B',
|
| 160 |
+
'#8B5CF6',
|
| 161 |
+
'#EF4444'
|
| 162 |
+
]
|
| 163 |
+
}]
|
| 164 |
+
},
|
| 165 |
+
options: {
|
| 166 |
+
responsive: true,
|
| 167 |
+
maintainAspectRatio: false,
|
| 168 |
+
plugins: {
|
| 169 |
+
legend: {
|
| 170 |
+
position: 'right',
|
| 171 |
+
},
|
| 172 |
+
tooltip: {
|
| 173 |
+
callbacks: {
|
| 174 |
+
label: function(context) {
|
| 175 |
+
const total = context.dataset.data.reduce((a, b) => a + b, 0);
|
| 176 |
+
const percentage = ((context.raw / total) * 100).toFixed(1);
|
| 177 |
+
return context.label + ': ' + formatCurrency(context.raw) + ' (' + percentage + '%)';
|
| 178 |
+
}
|
| 179 |
+
}
|
| 180 |
+
}
|
| 181 |
+
}
|
| 182 |
+
}
|
| 183 |
+
});
|
| 184 |
+
}
|
| 185 |
+
|
| 186 |
+
// Create Projection Chart
|
| 187 |
+
function createProjectionChart() {
|
| 188 |
+
const ctx = document.getElementById('projectionChart').getContext('2d');
|
| 189 |
+
|
| 190 |
+
// Project next 6 months based on trends
|
| 191 |
+
const projectionMonths = ['Dez', 'Jan', 'Fev', 'Mar', 'Abr', 'Mai'];
|
| 192 |
+
const lastRevenue = financialData.revenues[financialData.revenues.length - 1];
|
| 193 |
+
const lastExpense = financialData.expenses[financialData.expenses.length - 1];
|
| 194 |
+
|
| 195 |
+
// Simple linear projection with slight growth for revenues and controlled expenses
|
| 196 |
+
const projectedRevenues = [
|
| 197 |
+
lastRevenue * 0.9, // December lower due to holidays
|
| 198 |
+
lastRevenue * 1.02,
|
| 199 |
+
lastRevenue * 1.04,
|
| 200 |
+
lastRevenue * 1.06,
|
| 201 |
+
lastRevenue * 1.08,
|
| 202 |
+
lastRevenue * 1.10
|
| 203 |
+
];
|
| 204 |
+
|
| 205 |
+
const projectedExpenses = [
|
| 206 |
+
lastExpense * 0.8, // December lower expenses
|
| 207 |
+
lastExpense * 0.95, // Cost reduction measures
|
| 208 |
+
lastExpense * 0.96,
|
| 209 |
+
lastExpense * 0.97,
|
| 210 |
+
lastExpense * 0.98,
|
| 211 |
+
lastExpense * 0.99
|
| 212 |
+
];
|
| 213 |
+
|
| 214 |
+
let projectedCash = financialData.cashBalance[financialData.cashBalance.length - 1];
|
| 215 |
+
const projectedCashFlow = [projectedCash];
|
| 216 |
+
|
| 217 |
+
for (let i = 0; i < projectedRevenues.length; i++) {
|
| 218 |
+
projectedCash += (projectedRevenues[i] - projectedExpenses[i]);
|
| 219 |
+
projectedCashFlow.push(projectedCash);
|
| 220 |
+
}
|
| 221 |
+
|
| 222 |
+
new Chart(ctx, {
|
| 223 |
+
type: 'line',
|
| 224 |
+
data: {
|
| 225 |
+
labels: ['Nov', ...projectionMonths],
|
| 226 |
+
datasets: [{
|
| 227 |
+
label: 'Receitas Projetadas',
|
| 228 |
+
data: [null, ...projectedRevenues],
|
| 229 |
+
borderColor: '#10B981',
|
| 230 |
+
borderDash: [5, 5],
|
| 231 |
+
tension: 0.4
|
| 232 |
+
}, {
|
| 233 |
+
label: 'Despesas Projetadas',
|
| 234 |
+
data: [null, ...projectedExpenses],
|
| 235 |
+
borderColor: '#EF4444',
|
| 236 |
+
borderDash: [5, 5],
|
| 237 |
+
tension: 0.4
|
| 238 |
+
}, {
|
| 239 |
+
label: 'Saldo Caixa Projetado',
|
| 240 |
+
data: projectedCashFlow,
|
| 241 |
+
borderColor: '#3B82F6',
|
| 242 |
+
backgroundColor: 'rgba(59, 130, 246, 0.2)',
|
| 243 |
+
fill: true,
|
| 244 |
+
tension: 0.4
|
| 245 |
+
}]
|
| 246 |
+
},
|
| 247 |
+
options: {
|
| 248 |
+
responsive: true,
|
| 249 |
+
maintainAspectRatio: false,
|
| 250 |
+
plugins: {
|
| 251 |
+
legend: {
|
| 252 |
+
position: 'top',
|
| 253 |
+
}
|
| 254 |
+
},
|
| 255 |
+
scales: {
|
| 256 |
+
y: {
|
| 257 |
+
beginAtZero: false,
|
| 258 |
+
ticks: {
|
| 259 |
+
callback: function(value) {
|
| 260 |
+
return formatCurrency(value);
|
| 261 |
+
}
|
| 262 |
+
}
|
| 263 |
+
}
|
| 264 |
+
}
|
| 265 |
+
}
|
| 266 |
+
});
|
| 267 |
+
}
|
| 268 |
+
|
| 269 |
+
// Populate Monthly Table
|
| 270 |
+
function populateMonthlyTable() {
|
| 271 |
+
const tableBody = document.getElementById('monthlyTable');
|
| 272 |
+
tableBody.innerHTML = '';
|
| 273 |
+
|
| 274 |
+
for (let i = 0; i < financialData.months.length; i++) {
|
| 275 |
+
const revenue = financialData.revenues[i];
|
| 276 |
+
const expense = financialData.expenses[i];
|
| 277 |
+
const result = revenue - expense;
|
| 278 |
+
const cashBalance = financialData.cashBalance[i + 1];
|
| 279 |
+
|
| 280 |
+
const row = document.createElement('tr');
|
| 281 |
+
row.className = 'border-b border-gray-100';
|
| 282 |
+
row.innerHTML = `
|
| 283 |
+
<td class="py-2 px-3 font-medium">${financialData.months[i].charAt(0).toUpperCase() + financialData.months[i].slice(1)}/25</td>
|
| 284 |
+
<td class="py-2 px-3 text-right font-medium text-green-600">${formatCurrency(revenue)}</td>
|
| 285 |
+
<td class="py-2 px-3 text-right font-medium text-red-600">${formatCurrency(expense)}</td>
|
| 286 |
+
<td class="py-2 px-3 text-right font-medium ${result >= 0 ? 'text-green-600' : 'text-red-600'}">${formatCurrency(result)}</td>
|
| 287 |
+
<td class="py-2 px-3 text-right font-medium">${formatCurrency(cashBalance)}</td>
|
| 288 |
+
`;
|
| 289 |
+
tableBody.appendChild(row);
|
| 290 |
+
}
|
| 291 |
+
|
| 292 |
+
// Add totals row
|
| 293 |
+
const totalRevenue = financialData.revenues.reduce((a, b) => a + b, 0);
|
| 294 |
+
const totalExpense = financialData.expenses.reduce((a, b) => a + b, 0);
|
| 295 |
+
const totalResult = totalRevenue - totalExpense;
|
| 296 |
+
|
| 297 |
+
const totalsRow = document.createElement('tr');
|
| 298 |
+
totalsRow.className = 'font-bold bg-gray-50';
|
| 299 |
+
totalsRow.innerHTML = `
|
| 300 |
+
<td class="py-2 px-3">TOTAL</td>
|
| 301 |
+
<td class="py-2 px-3 text-right text-green-600">${formatCurrency(totalRevenue)}</td>
|
| 302 |
+
<td class="py-2 px-3 text-right text-red-600">${formatCurrency(totalExpense)}</td>
|
| 303 |
+
<td class="py-2 px-3 text-right ${totalResult >= 0 ? 'text-green-600' : 'text-red-600'}">${formatCurrency(totalResult)}</td>
|
| 304 |
+
<td class="py-2 px-3 text-right">${formatCurrency(financialData.cashBalance[financialData.cashBalance.length - 1])}</td>
|
| 305 |
+
`;
|
| 306 |
+
tableBody.appendChild(totalsRow);
|
| 307 |
+
}
|
| 308 |
+
|
| 309 |
+
// Export to PDF (placeholder function)
|
| 310 |
+
function exportToPDF() {
|
| 311 |
+
alert('Função de exportação para PDF será implementada com integração de biblioteca PDF como jsPDF');
|
| 312 |
+
}
|
| 313 |
+
|
| 314 |
+
// Refresh Data (placeholder function)
|
| 315 |
+
function refreshData() {
|
| 316 |
+
const cards = document.querySelectorAll('.bg-white');
|
| 317 |
+
cards.forEach(card => card.classList.add('loading'));
|
| 318 |
+
|
| 319 |
+
setTimeout(() => {
|
| 320 |
+
cards.forEach(card => card.classList.remove('loading'));
|
| 321 |
+
updateKPIs();
|
| 322 |
+
populateMonthlyTable();
|
| 323 |
+
}, 1000);
|
| 324 |
+
}
|
| 325 |
+
|
| 326 |
+
// Initialize Dashboard
|
| 327 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 328 |
+
updateKPIs();
|
| 329 |
+
createMonthlyFlowChart();
|
| 330 |
+
createRevenueCompositionChart();
|
| 331 |
+
createProjectionChart();
|
| 332 |
+
populateMonthlyTable();
|
| 333 |
+
});
|
| 334 |
+
|
| 335 |
+
// Smooth scroll for anchor links
|
| 336 |
+
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
| 337 |
+
anchor.addEventListener('click', function (e) {
|
| 338 |
+
e.preventDefault();
|
| 339 |
+
const target = document.querySelector(this.getAttribute('href'));
|
| 340 |
+
if (target) {
|
| 341 |
+
target.scrollIntoView({
|
| 342 |
+
behavior: 'smooth',
|
| 343 |
+
block: 'start'
|
| 344 |
+
});
|
| 345 |
+
}
|
| 346 |
+
});
|
| 347 |
+
});
|
|
@@ -1,28 +1,221 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
body {
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
}
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* Custom Styles for Financial Dashboard */
|
| 2 |
+
|
| 3 |
+
:root {
|
| 4 |
+
--primary-color: #3B82F6;
|
| 5 |
+
--secondary-color: #10B981;
|
| 6 |
+
--danger-color: #EF4444;
|
| 7 |
+
--warning-color: #F59E0B;
|
| 8 |
+
--dark-color: #1F2937;
|
| 9 |
+
--light-color: #F9FAFB;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
body {
|
| 13 |
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
/* Card Animations */
|
| 17 |
+
.bg-white {
|
| 18 |
+
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
.bg-white:hover {
|
| 22 |
+
transform: translateY(-2px);
|
| 23 |
+
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
/* Custom Scrollbar */
|
| 27 |
+
::-webkit-scrollbar {
|
| 28 |
+
width: 8px;
|
| 29 |
+
height: 8px;
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
::-webkit-scrollbar-track {
|
| 33 |
+
background: #f1f1f1;
|
| 34 |
+
border-radius: 4px;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
::-webkit-scrollbar-thumb {
|
| 38 |
+
background: #888;
|
| 39 |
+
border-radius: 4px;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
::-webkit-scrollbar-thumb:hover {
|
| 43 |
+
background: #555;
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
/* Chart Container */
|
| 47 |
+
canvas {
|
| 48 |
+
max-height: 300px;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
/* Number Formatting */
|
| 52 |
+
.currency {
|
| 53 |
+
font-variant-numeric: tabular-nums;
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
/* Loading Animation */
|
| 57 |
+
@keyframes pulse {
|
| 58 |
+
0%, 100% {
|
| 59 |
+
opacity: 1;
|
| 60 |
+
}
|
| 61 |
+
50% {
|
| 62 |
+
opacity: .5;
|
| 63 |
+
}
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
.loading {
|
| 67 |
+
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
/* Table Styles */
|
| 71 |
+
table {
|
| 72 |
+
border-collapse: separate;
|
| 73 |
+
border-spacing: 0;
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
table th {
|
| 77 |
+
font-weight: 600;
|
| 78 |
+
color: var(--dark-color);
|
| 79 |
+
background-color: var(--light-color);
|
| 80 |
+
position: sticky;
|
| 81 |
+
top: 0;
|
| 82 |
+
z-index: 10;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
table td {
|
| 86 |
+
border-bottom: 1px solid #E5E7EB;
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
table tr:hover td {
|
| 90 |
+
background-color: #F9FAFB;
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
/* Positive and Negative Values */
|
| 94 |
+
.text-positive {
|
| 95 |
+
color: var(--secondary-color);
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.text-negative {
|
| 99 |
+
color: var(--danger-color);
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
/* Custom Button Styles */
|
| 103 |
+
button {
|
| 104 |
+
transition: all 0.2s ease;
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
button:hover {
|
| 108 |
+
transform: translateY(-1px);
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
+
button:active {
|
| 112 |
+
transform: translateY(0);
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
/* Alert Box Styles */
|
| 116 |
+
.alert-box {
|
| 117 |
+
border-left-width: 4px;
|
| 118 |
+
border-left-style: solid;
|
| 119 |
+
}
|
| 120 |
+
|
| 121 |
+
.alert-success {
|
| 122 |
+
border-left-color: var(--secondary-color);
|
| 123 |
+
background-color: #F0FDF4;
|
| 124 |
+
}
|
| 125 |
+
|
| 126 |
+
.alert-warning {
|
| 127 |
+
border-left-color: var(--warning-color);
|
| 128 |
+
background-color: #FFFBEB;
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
.alert-danger {
|
| 132 |
+
border-left-color: var(--danger-color);
|
| 133 |
+
background-color: #FEF2F2;
|
| 134 |
}
|
| 135 |
|
| 136 |
+
.alert-info {
|
| 137 |
+
border-left-color: var(--primary-color);
|
| 138 |
+
background-color: #EFF6FF;
|
| 139 |
}
|
| 140 |
|
| 141 |
+
/* Responsive Typography */
|
| 142 |
+
@media (max-width: 640px) {
|
| 143 |
+
.text-3xl {
|
| 144 |
+
font-size: 1.5rem;
|
| 145 |
+
line-height: 2rem;
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
.text-2xl {
|
| 149 |
+
font-size: 1.25rem;
|
| 150 |
+
line-height: 1.75rem;
|
| 151 |
+
}
|
| 152 |
}
|
| 153 |
|
| 154 |
+
/* Print Styles */
|
| 155 |
+
@media print {
|
| 156 |
+
body {
|
| 157 |
+
print-color-adjust: exact;
|
| 158 |
+
-webkit-print-color-adjust: exact;
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
.no-print {
|
| 162 |
+
display: none !important;
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
.bg-white {
|
| 166 |
+
break-inside: avoid;
|
| 167 |
+
}
|
| 168 |
}
|
| 169 |
|
| 170 |
+
/* Dark mode support (if implemented later) */
|
| 171 |
+
@media (prefers-color-scheme: dark) {
|
| 172 |
+
body {
|
| 173 |
+
background-color: #111827;
|
| 174 |
+
color: #F9FAFB;
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
.bg-white {
|
| 178 |
+
background-color: #1F2937;
|
| 179 |
+
color: #F9FAFB;
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
.text-gray-800 {
|
| 183 |
+
color: #F9FAFB;
|
| 184 |
+
}
|
| 185 |
+
|
| 186 |
+
.text-gray-600 {
|
| 187 |
+
color: #D1D5DB;
|
| 188 |
+
}
|
| 189 |
}
|
| 190 |
+
|
| 191 |
+
/* Smooth Transitions */
|
| 192 |
+
* {
|
| 193 |
+
transition: color 0.2s ease, background-color 0.2s ease;
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
+
/* Custom Tooltip */
|
| 197 |
+
.tooltip {
|
| 198 |
+
position: relative;
|
| 199 |
+
}
|
| 200 |
+
|
| 201 |
+
.tooltip::after {
|
| 202 |
+
content: attr(data-tooltip);
|
| 203 |
+
position: absolute;
|
| 204 |
+
bottom: 100%;
|
| 205 |
+
left: 50%;
|
| 206 |
+
transform: translateX(-50%);
|
| 207 |
+
background-color: #1F2937;
|
| 208 |
+
color: white;
|
| 209 |
+
padding: 0.25rem 0.5rem;
|
| 210 |
+
border-radius: 0.25rem;
|
| 211 |
+
font-size: 0.75rem;
|
| 212 |
+
white-space: nowrap;
|
| 213 |
+
opacity: 0;
|
| 214 |
+
pointer-events: none;
|
| 215 |
+
transition: opacity 0.2s ease;
|
| 216 |
+
z-index: 50;
|
| 217 |
+
}
|
| 218 |
+
|
| 219 |
+
.tooltip:hover::after {
|
| 220 |
+
opacity: 1;
|
| 221 |
+
}
|