Auto-deploy: 2026-01-13 13:02:51 | 1 arquivo(s) alterado(s)

This commit is contained in:
daivid.alves 2026-01-13 13:02:51 -03:00
parent 39369a1fdd
commit e3f371ad11
1 changed files with 74 additions and 83 deletions

View File

@ -1,106 +1,97 @@
import React, { useState } from 'react';
import {
Bell,
Search,
Maximize2,
HelpCircle,
User
} from 'lucide-react';
import { cn } from '@/lib/utils';
import { WorkspaceSidebar } from './WorkspaceSidebar';
import { IncomesView } from '../views/IncomesView';
import { ExpensesView } from '../views/ExpensesView';
import { ReconciliationView } from '../views/ReconciliationView';
import { LayoutDashboard, ArrowUpRight, ArrowDownRight, ArrowRightLeft, Settings, Menu, Bell, User } from 'lucide-react';
import { cn } from '@/lib/utils';
/**
* WorkspaceLayout - O container principal para o ambiente de teste/workspace.
* Apresenta uma estrutura premium isolada do restante da plataforma.
*/
export const WorkspaceLayout = () => {
const [activeScreen, setActiveScreen] = useState('dashboard');
const [sidebarOpen, setSidebarOpen] = useState(true);
const menuItems = [
{ id: 'dashboard', label: 'Dashboard', icon: <LayoutDashboard size={20} /> },
{ id: 'entradas', label: 'Entradas', icon: <ArrowUpRight size={20} /> },
{ id: 'saidas', label: 'Saídas', icon: <ArrowDownRight size={20} /> },
{ id: 'conciliacao', label: 'Conciliação', icon: <ArrowRightLeft size={20} /> },
{ id: 'config', label: 'Ajustes', icon: <Settings size={20} /> },
];
const [activeScreen, setActiveScreen] = useState('entradas');
const renderScreen = () => {
switch (activeScreen) {
case 'entradas': return <IncomesView />;
case 'saidas': return <ExpensesView />;
case 'conciliacao': return <ReconciliationView />;
default: return (
<div className="p-8 text-center text-slate-400 italic">
<h2 className="text-xl font-bold not-italic text-slate-700 dark:text-stone-200 mb-2">Painel de Controle Financeiro</h2>
O Dashboard consolidado será implementado nesta seção com o componente FineCard.
</div>
);
case 'dashboard':
return (
<div className="flex flex-col items-center justify-center min-h-[400px] text-slate-400 italic">
<h2 className="text-xl font-bold not-italic text-slate-700 dark:text-stone-200 mb-2 uppercase tracking-tighter">Dashboard Geral</h2>
Em desenvolvimento...
</div>
);
case 'entradas':
return <IncomesView />;
case 'saidas':
return <ExpensesView />;
case 'conciliacao':
return <ReconciliationView />;
case 'config':
return (
<div className="flex flex-col items-center justify-center min-h-[400px] text-slate-400 italic">
<h2 className="text-xl font-bold not-italic text-slate-700 dark:text-stone-200 mb-2 uppercase tracking-tighter">Configurações</h2>
Em desenvolvimento...
</div>
);
default:
return <IncomesView />;
}
};
return (
<div className="workspace-theme min-h-screen bg-[#f8fafc] dark:bg-[#121212] flex overflow-hidden">
{/* Sidebar Sidebar Component */}
<aside className={cn(
"bg-[var(--workspace-sec-5-light)] dark:bg-[#0d253a] text-white transition-all duration-300 flex flex-col z-50",
sidebarOpen ? "w-64" : "w-20"
)}>
<div className="p-6 flex items-center justify-between border-b border-white/5">
{sidebarOpen && <div className="text-xl font-black tracking-tighter italic">iTGUYS</div>}
<button onClick={() => setSidebarOpen(!sidebarOpen)} className="p-1 hover:bg-white/10 rounded">
<Menu size={20} />
</button>
</div>
<div className="workspace-theme flex h-screen w-full bg-[#f8fafc] dark:bg-[#121212] overflow-hidden font-lato">
{/* Sidebar Customizado (Reproduced Design) */}
<WorkspaceSidebar activeScreen={activeScreen} onScreenChange={setActiveScreen} />
<nav className="flex-1 py-6 px-3 space-y-1">
{menuItems.map((item) => (
<button
key={item.id}
onClick={() => setActiveScreen(item.id)}
className={cn(
"w-full flex items-center gap-4 px-3 py-3 rounded-xl transition-all font-bold text-sm",
activeScreen === item.id
? "bg-white/10 text-[var(--workspace-sec-2-light)] shadow-sm"
: "text-white/60 hover:text-white hover:bg-white/5"
)}
>
<span className={activeScreen === item.id ? "text-[var(--workspace-sec-2-light)]" : ""}>
{item.icon}
</span>
{sidebarOpen && <span>{item.label}</span>}
{activeScreen === item.id && sidebarOpen && (
<div className="ml-auto w-1.5 h-1.5 rounded-full bg-[var(--workspace-sec-2-light)] shadow-[0_0_8px_var(--workspace-sec-2-light)]" />
)}
</button>
))}
</nav>
{/* Main Content Area */}
<main className="flex-1 flex flex-col relative overflow-hidden">
{/* Header Header Premium */}
<header className="h-20 bg-white/80 dark:bg-[#1b1b1b]/80 backdrop-blur-md border-b border-slate-200 dark:border-white/5 flex items-center justify-between px-8 z-30">
<div className="flex items-center gap-4">
<div className="flex items-center gap-2 text-slate-400 group cursor-pointer hover:text-[var(--workspace-sec-5-light)] transition-colors">
<Maximize2 size={18} className="rotate-45" />
</div>
<div className="h-6 w-[1px] bg-slate-200 dark:bg-white/10" />
<h2 className="text-sm font-black text-slate-600 dark:text-stone-300 uppercase tracking-[0.2em]">
Workspace / <span className="text-[var(--workspace-sec-5-light)]">{activeScreen}</span>
</h2>
</div>
<div className="p-4 border-t border-white/5">
<div className={cn("flex items-center gap-3 p-2 rounded-xl bg-white/5", !sidebarOpen && "justify-center")}>
<div className="w-8 h-8 rounded-full bg-[var(--workspace-sec-2-light)] flex items-center justify-center text-xs font-black">DA</div>
{sidebarOpen && (
<div className="flex-1 min-w-0">
<p className="text-xs font-bold truncate">Daivid Alves</p>
<p className="text-[10px] text-white/40 truncate">Workspace Admin</p>
</div>
)}
</div>
</div>
</aside>
<div className="flex items-center gap-6">
<div className="hidden md:flex items-center bg-slate-100 dark:bg-white/5 px-4 py-2 rounded-xl border border-slate-200 dark:border-white/10 w-64 group focus-within:ring-2 focus-within:ring-[var(--workspace-sec-5-light)] transition-all">
<Search size={16} className="text-slate-400" />
<input
type="text"
placeholder="Busca global..."
className="bg-transparent border-none text-xs focus:ring-0 w-full text-slate-600 dark:text-stone-300 placeholder:text-slate-400"
/>
</div>
{/* Main Content */}
<main className="flex-1 flex flex-col overflow-hidden">
<header className="h-16 bg-white dark:bg-[#1b1b1b] border-b border-slate-200 dark:border-[#2a2a2a] flex items-center justify-between px-8 z-40">
<div className="text-[10px] font-black uppercase text-slate-400 tracking-[0.2em]">Workspace / Financeiro</div>
<div className="flex items-center gap-4">
<button className="p-2 text-slate-400 hover:text-slate-600 rounded-full hover:bg-slate-50 relative">
<Bell size={18} />
<div className="absolute top-2 right-2 w-2 h-2 bg-red-500 rounded-full border-2 border-white" />
<div className="flex items-center gap-3">
<button className="relative p-2.5 bg-slate-100 dark:bg-white/5 rounded-xl hover:bg-slate-200 dark:hover:bg-white/10 transition-colors">
<Bell size={20} className="text-slate-500 dark:text-stone-400" />
<span className="absolute top-2 right-2 w-2 h-2 bg-red-500 rounded-full border-2 border-white dark:border-[#1b1b1b]" />
</button>
<div className="w-[1px] h-6 bg-slate-200 dark:bg-[#333]" />
<button className="flex items-center gap-2 text-slate-600 dark:text-stone-300 font-bold text-xs p-1 hover:bg-slate-50 rounded-lg pr-3">
<User size={18} />
PLATAFORMA SISTEMAS
<button className="p-2.5 bg-slate-100 dark:bg-white/5 rounded-xl hover:bg-slate-200 dark:hover:bg-white/10 transition-colors">
<User size={20} className="text-slate-500 dark:text-stone-400" />
</button>
</div>
</div>
</div>
</header>
<div className="flex-1 overflow-y-auto scroll-smooth custom-scrollbar">
{renderScreen()}
{/* View Content */}
<div className="flex-1 overflow-y-auto custom-scrollbar bg-slate-50/50 dark:bg-[#121212]">
<div className="max-w-[1600px] mx-auto animate-in fade-in slide-in-from-bottom-4 duration-700">
{renderScreen()}
</div>
</div>
</main>
</div>