const demoTabs = [
{ id: 'dashboard', label: 'Dashboard', sheet: 'WEB-01', path: '/', active: ['dashboard'] },
{ id: 'comercial', label: 'Clientes e propostas', sheet: 'WEB-02', path: '/clients', active: ['clients', 'proposals', 'contracts'] },
{ id: 'financeiro', label: 'Financeiro', sheet: 'WEB-03', path: '/financial/cash-flow', active: ['financial'] },
{ id: 'operacao', label: 'Tarefas e anexos', sheet: 'WEB-04', path: '/tasks', active: ['tasks', 'attachments'] },
{ id: 'gestao', label: 'Relatórios e admin', sheet: 'WEB-05', path: '/reports', active: ['reports', 'settings', 'appearance'] },
];
const demoSidebar = [
{ id: 'dashboard', label: 'Dashboard', route: '/' },
{ id: 'clients', label: 'Clientes', route: '/clients' },
{ id: 'proposals', label: 'Propostas', route: '/proposals' },
{ id: 'contracts', label: 'Contratos', route: '/contracts' },
{ id: 'financial', label: 'Financeiro', route: '/financial/cash-flow' },
{ id: 'tasks', label: 'Tarefas', route: '/tasks' },
{ id: 'attachments', label: 'Anexos', route: '/attachments' },
{ id: 'reports', label: 'Relatórios', route: '/reports' },
{ id: 'appearance', label: 'Aparência', route: '/appearance' },
{ id: 'settings', label: 'Admin', route: '/settings' },
];
const money = (value) => `R$ ${value.toLocaleString('pt-BR')}`;
const Demo = () => {
const [tab, setTab] = React.useState('dashboard');
const [ref, inView] = useReveal({ threshold: 0.1 });
const current = demoTabs.find((item) => item.id === tab) || demoTabs[0];
return (
Veja o sistema por dentro.>}
kicker="A prévia abaixo foi montada a partir das rotas e módulos ativos: clientes, propostas, contratos, financeiro, tarefas, anexos, relatórios, aparência e administração."
/>
{demoTabs.map((item) => (
setTab(item.id)}
className="px-5 py-3 font-mono text-[11px] uppercase tracking-wider2 transition-all"
style={{
background: tab === item.id ? 'var(--ink)' : 'var(--bg)',
color: tab === item.id ? 'var(--bg)' : 'var(--ash)',
}}
>
/ {item.label}
))}
Sheet {current.sheet} / ROTA {current.path}
/ Simulação baseada nos módulos implementados
/ Sem telas fictícias de timesheet ou equipe
/ Rotas web reais do ArchPlan
);
};
const DemoWindow = ({ tab, inView }) => {
const current = demoTabs.find((item) => item.id === tab) || demoTabs[0];
return (
archplan.app{current.path}
WORKSPACE / ADMIN
{tab === 'dashboard' && }
{tab === 'comercial' && }
{tab === 'financeiro' && }
{tab === 'operacao' && }
{tab === 'gestao' && }
);
};
const RouteChips = ({ routes }) => (
{routes.map((route) => (
{route}
))}
);
const StatCard = ({ label, value, caption, delay = 0 }) => (
{label}
{value}
{caption}
);
const ProgressLine = ({ value, delay = 0, tone = 'ink' }) => (
);
const ScreenDashboard = ({ inView }) => {
const months = ['JAN', 'FEV', 'MAR', 'ABR', 'MAI', 'JUN'];
const entries = [42, 58, 71, 66, 88, 94];
const expenses = [32, 38, 47, 44, 53, 61];
return (
DASHBOARD / CENTRO DE COMANDO
Leitura operacional do escritório
A mesma visão consolida caixa, vencimentos, propostas, clientes ativos e tarefas pendentes.
} caption="Recebido no período" />
} caption="Pago no período" delay={80} />
} caption="Entradas menos saídas" delay={160} />
} caption="Pendentes e vencidas" delay={240} />
Entradas x saídas
R$ MIL
{months.map((month, index) => (
))}
{months.map((month) => {month} )}
{[
['Despesas fixas', money(18400), '/financial/fixed-expenses'],
['Parcelas vencidas', '3', '/contracts'],
['Clientes ativos', '42', '/clients'],
['Tarefas pendentes', '18', '/tasks'],
].map(([label, value, route], index) => (
))}
);
};
const ScreenComercial = ({ inView }) => {
const rows = [
{ client: 'Studio Almeida', route: '/clients', item: 'Histórico e contatos', value: '12 interações', status: 'ativo' },
{ client: 'Loja Aurora', route: '/proposals', item: 'Proposta comercial', value: money(48200), status: 'enviada' },
{ client: 'Grupo Horizonte', route: '/contracts', item: 'Contrato e parcelas', value: money(186000), status: 'assinado' },
{ client: 'Residencial Norte', route: '/propostas', item: 'PDF de proposta', value: 'versão 3', status: 'revisão' },
];
return (
COMERCIAL / CLIENTES / PROPOSTAS / CONTRATOS
Do relacionamento ao contrato
A demo mostra as telas reais de cadastro de clientes, registro de contatos, propostas com PDF e contratos com parcelas.
Cliente
Modulo
Rota
Valor
Status
{rows.map((row, index) => (
{row.client}
{row.item}
{row.route}
{row.value}
{row.status}
))}
);
};
const ScreenFinanceiro = ({ inView }) => {
const items = [
{ name: 'Recebíveis', route: '/financial/receivables', amount: 238900, pct: 78, tone: 'ink' },
{ name: 'Contas a pagar', route: '/financial/payables', amount: 86400, pct: 44, tone: 'sepia' },
{ name: 'Entradas', route: '/financial/entries', amount: 186400, pct: 64, tone: 'ink' },
{ name: 'Saídas', route: '/financial/expenses', amount: 72400, pct: 35, tone: 'sepia' },
{ name: 'Despesas fixas', route: '/financial/fixed-expenses', amount: 18400, pct: 18, tone: 'sepia' },
];
return (
FINANCEIRO / CAIXA / CONTAS
Financeiro separado por operação real
Recebíveis, contas a pagar, entradas, saídas, despesas fixas e fluxo de caixa usam rotas próprias no sistema.
{items.map((item, index) => (
))}
);
};
const ScreenOperacao = ({ inView }) => {
const tasks = [
{ name: 'Revisar proposta comercial', owner: 'César', status: 'pendente', priority: 78 },
{ name: 'Cobrar parcela vencida', owner: 'Financeiro', status: 'urgente', priority: 92 },
{ name: 'Anexar contrato assinado', owner: 'Admin', status: 'em aberto', priority: 64 },
{ name: 'Atualizar contato do cliente', owner: 'Comercial', status: 'hoje', priority: 48 },
];
return (
OPERAÇÃO / TAREFAS / ANEXOS
Rotina operacional do escritório
A operação aparece como lista de tarefas, responsáveis, prioridades e anexos vinculados às entidades do sistema.
{tasks.map((task, index) => (
{task.name}
{task.owner}
{task.status}
))}
Anexos por entidade
Documentos operacionais
{[
['Contrato assinado', '/attachments/download'],
['PDF de proposta', '/proposals/{id}/pdf'],
['Comprovante financeiro', '/financial/entries'],
['Histórico de cliente', '/clients/{id}'],
].map(([label, route], index) => (
{label}
{route}
))}
);
};
const ScreenGestao = ({ inView }) => {
const rows = [
{ module: 'Relatórios', route: '/reports', action: 'Exportação CSV e PDF', state: '3 relatórios' },
{ module: 'Admin', route: '/settings', action: 'Usuários, papéis e permissões', state: 'RBAC' },
{ module: 'Aparência', route: '/appearance', action: 'Tema, layout e densidade', state: 'local' },
{ module: 'Histórico', route: '/system-logs', action: 'Auditoria das ações do sistema', state: 'ativo' },
{ module: 'Assinatura', route: '/assinatura/planos', action: 'Escolha e ativação de plano', state: 'ativo' },
];
return (
GESTÃO / RELATÓRIOS / ADMIN
Camada administrativa e operacional
A landing também mostra gestão de relatórios, usuários, permissões, aparência, histórico e assinatura.
{rows.map((row, index) => (
{row.module}
{row.route}
{row.action}
{row.state}
))}
Permissões reais
Acesso por papel
{[
['dashboard', 100],
['clients:read', 92],
['financial:read', 84],
['reports:read', 70],
['settings', 42],
].map(([permission, value], index) => (
))}
);
};
window.Demo = Demo;