diff --git a/new-frontend/src/components/layout/AppShell.tsx b/new-frontend/src/components/layout/AppShell.tsx index 482dc1a..435db8f 100644 --- a/new-frontend/src/components/layout/AppShell.tsx +++ b/new-frontend/src/components/layout/AppShell.tsx @@ -7,7 +7,11 @@ export const AppShell = () => { const [isMobileOpen, setIsMobileOpen] = useState(false) return ( -
+ {formatSecondsToTimer(kpis.totalSecondsTracked)} +
+ Equivalente a {formatSecondsToHuman(kpis.totalSecondsTracked)} +
- {formatSecondsToTimer(kpis.totalSecondsTracked)} -
- Equivalente a {formatSecondsToHuman(kpis.totalSecondsTracked)} -
+ {kpis.completionRate}% +
+ {kpis.completedTasks} de {kpis.totalTasks} demandas finalizadas +
- {kpis.completionRate}% -
- {kpis.completedTasks} de {kpis.totalTasks} demandas finalizadas -
+ {kpis.inProgressTasks} tarefas +
+ {kpis.notStartedTasks} no backlog aguardando início +
- {kpis.inProgressTasks} tarefas -
- {kpis.notStartedTasks} no backlog aguardando início -
+ {formatSecondsToHuman(kpis.avgSecondsPerCompletedTask)} +
+ Tempo médio gasto em cada entrega concluída +
- {formatSecondsToHuman(kpis.avgSecondsPerCompletedTask)} -
- Tempo médio gasto em cada entrega concluída -
{searchQuery @@ -254,7 +255,7 @@ export const CategoriesPage: React.FC = () => { Criar Primeira Categoria @@ -271,7 +272,7 @@ export const CategoriesPage: React.FC = () => { return ( @@ -307,7 +308,7 @@ export const CategoriesPage: React.FC = () => { {/* Metrics Bar */} - + @@ -330,7 +331,7 @@ export const CategoriesPage: React.FC = () => { {/* Footer Link */} - + { return tasks.find((t) => t.status === 'IN_PROGRESS') || tasks.find((t) => t.status === 'NOT_STARTED') || tasks[0] }, [tasks]) + const firstName = user?.name ? user.name.split(' ')[0] : 'Desenvolvedor' + return ( - - {/* Header */} - - - - - Olá, {user?.name?.split(' ')[0] || 'Desenvolvedor'}! 👋 - - - {activeOrg?.name || 'Workspace'} - + + {/* Top Banner with Landing Page aesthetic */} + + + {/* Top pill badge */} + + + Workspace: {activeOrg?.name || 'BeeTask'} + - - Visão geral da sua produtividade, metas e atividades recentes no workspace. + + + Olá, {firstName}!{' '} + + Bom trabalho hoje. + + + + Acompanhe o ritmo de entregas da sua equipe, audite suas horas e mantenha o foco na próxima entrega. - + - navigate('/tasks')} - className="px-3.5 py-2 rounded-xl border border-border bg-surface text-xs font-semibold text-foreground hover:bg-surface-raised transition-colors shadow-xs" - > - Quadro Kanban - + + + Quadro Kanban + + setIsModalOpen(true)} - className="flex items-center gap-1.5 px-4 py-2 rounded-xl bg-brand text-white font-semibold text-xs hover:bg-brand-hover shadow-md shadow-brand/20 transition-all" + className="flex items-center gap-2 px-5 py-2.5 rounded-xl bg-brand hover:bg-brand-strong text-white font-bold text-xs shadow-lg shadow-brand/25 transition-all duration-200 hover:scale-[1.02] active:scale-[0.98]" > Nova Tarefa @@ -184,8 +193,8 @@ export const DashboardPage: React.FC = () => { {error && ( - - + + {error} @@ -199,183 +208,189 @@ export const DashboardPage: React.FC = () => { )} - {/* KPI Cards */} + {/* 4 Premium KPI Cards with shadow-panel & backdrop-blur */} {loading ? ( - + {[1, 2, 3, 4].map((i) => ( ))} ) : ( - + {/* In Progress */} - + - Tarefas em Andamento - + Tarefas em Andamento + - + {stats.inProgress} - - {stats.notStarted} no backlog para iniciar + + {stats.notStarted} tarefas aguardando no backlog {/* Completed */} - + - Entregas Concluídas - + Entregas Concluídas + - + {stats.completed} - - de {tasks.length} tarefas cadastradas + + de {tasks.length} demandas cadastradas {/* Time Tracked */} - + - Tempo Total Dedicado - + Tempo Total Dedicado + - + {formatSecondsToTimer(stats.totalSeconds)} - - {formatSecondsToHuman(stats.totalSeconds)} acumuladas + + {formatSecondsToHuman(stats.totalSeconds)} auditadas no time {/* Projects */} - + - Projetos Ativos - - + Projetos Ativos + + - + {stats.projectsCount} - - Iniciativas no workspace + + Iniciativas ativas no workspace )} - {/* Main Content: Focus Session (Left) + Recent Tasks (Right) */} - - {/* Focus Session Card (Left 5 cols) */} - - - - - - - - - Sessão em Foco - Cronômetro em tempo real - + {/* Main Grid: Focus Session (5 cols) + Recent Sprint Tasks (7 cols) */} + + {/* Focus Session Hero Card (Left 5 cols) */} + + + {/* Header with macOS style dots */} + + + + + + + + Sessão em Foco + - - {activeTask ? 'ATIVO' : 'EM ESPERA'} - + + + + {activeTask ? 'CRONOMETRANDO' : 'EM ESPERA'} + + - {/* Active or Suggested Task Info */} + {/* Active or Suggested Task Info Box */} {activeTask ? ( - - + + {activeTask.project && ( {activeTask.project.name} )} {activeTask.category && ( - + {activeTask.category.name} )} - + {activeTask.title} ) : suggestedTask ? ( - + - - Próxima da fila + + Sugerida para Focar {suggestedTask.project && ( - + {suggestedTask.project.name} )} - + {suggestedTask.title} ) : ( - - Nenhuma tarefa pendente. Crie uma nova tarefa para iniciar o foco! + + Nenhuma tarefa ativa. Crie uma demanda para iniciar sua sessão produtiva! )} - {/* Big Timer Display */} - - - {activeTask ? 'Tempo Decorrido na Tarefa' : 'Pronto para Cronometrar'} + {/* Big Bold Timer Display */} + + + {activeTask ? 'Tempo Decorrido na Tarefa' : 'Pronto para Iniciar'} - + {activeTask ? formatSecondsToTimer(activeSeconds) : '00:00:00'} - {/* Controls */} + {/* Timer Actions */} {activeTask ? ( stopTimer(activeTask)} - className="w-full py-2.5 rounded-xl bg-rose-500/20 border border-rose-500/30 text-rose-300 hover:bg-rose-500/30 text-xs font-bold transition-all flex items-center justify-center gap-2" + className="w-full py-3.5 rounded-xl bg-rose-500/15 border border-rose-500/30 text-rose-300 hover:bg-rose-500/25 text-xs font-bold transition-all flex items-center justify-center gap-2 shadow-xs" > Pausar Cronômetro @@ -384,60 +399,60 @@ export const DashboardPage: React.FC = () => { handleToggleTimer(suggestedTask)} - className="w-full py-2.5 rounded-xl bg-brand text-white hover:bg-brand-hover shadow-md shadow-brand/20 text-xs font-bold transition-all flex items-center justify-center gap-2" + className="w-full py-3.5 rounded-xl bg-brand hover:bg-brand-strong text-white text-xs font-bold shadow-lg shadow-brand/25 transition-all flex items-center justify-center gap-2 duration-200 hover:scale-[1.01] active:scale-[0.99]" > - Iniciar Foco Nesta Tarefa + Iniciar Tempo nesta Tarefa ) : ( setIsModalOpen(true)} - className="w-full py-2.5 rounded-xl bg-brand text-white hover:bg-brand-hover text-xs font-bold transition-all flex items-center justify-center gap-2" + className="w-full py-3.5 rounded-xl bg-brand hover:bg-brand-strong text-white text-xs font-bold shadow-lg shadow-brand/25 transition-all flex items-center justify-center gap-2" > - Criar Tarefa para Iniciar + Criar Tarefa para Focar )} - - Usuário ativo: - + + Usuário conectado + {user?.name || user?.email} - {/* Quick Shortcuts */} - + {/* Quick Shortcuts Card */} + - Atalhos de Gestão + Acesso Rápido ao Workspace - Projetos + Ver Projetos - - Analytics + + Analytics da Org - {/* Recent Tasks List (Right 7 cols) */} + {/* Recent Sprint Tasks (Right 7 cols) */} - - - Tarefas Recentes + + + Tarefas Recentes da Equipe { {[1, 2, 3].map((i) => ( ))} ) : recentTasks.length === 0 ? ( - + - + Nenhuma tarefa encontrada neste workspace. setIsModalOpen(true)} - className="inline-flex items-center gap-1.5 px-4 py-2 rounded-xl bg-brand text-white text-xs font-semibold hover:bg-brand-hover shadow-xs" + className="inline-flex items-center gap-2 px-5 py-2.5 rounded-xl bg-brand text-white text-xs font-bold hover:bg-brand-strong shadow-md shadow-brand/20 transition-all" > - + Criar Primeira Tarefa @@ -481,45 +496,62 @@ export const DashboardPage: React.FC = () => { return ( - + {task.project && ( - + {task.project.name} )} {task.category && ( - + {task.category.name} )} + + {task.status === 'COMPLETED' + ? 'Concluído' + : task.status === 'IN_PROGRESS' + ? 'Em Andamento' + : task.status === 'CANCELED' + ? 'Cancelado' + : 'A Fazer'} + navigate('/tasks')} - className="text-xs font-bold text-foreground hover:text-brand cursor-pointer truncate" + className="text-sm font-bold text-foreground hover:text-brand cursor-pointer truncate transition-colors" > {task.title} @@ -527,13 +559,13 @@ export const DashboardPage: React.FC = () => { - + {formatSecondsToTimer(taskSec)} @@ -541,10 +573,10 @@ export const DashboardPage: React.FC = () => { type="button" onClick={() => handleToggleTimer(task)} title={isTracking ? 'Pausar cronômetro' : 'Iniciar cronômetro'} - className={`p-1.5 rounded-lg transition-colors ${ + className={`p-2 rounded-xl transition-all shadow-xs ${ isTracking - ? 'bg-rose-500/20 text-rose-300 hover:bg-rose-500/30' - : 'bg-brand/15 text-teal-300 hover:bg-brand/25' + ? 'bg-rose-500/20 text-rose-300 hover:bg-rose-500/30 ring-1 ring-rose-500/40' + : 'bg-brand/15 text-teal-300 hover:bg-brand/25 ring-1 ring-brand/30' }`} > {isTracking ? ( diff --git a/new-frontend/src/pages/MembersPage.tsx b/new-frontend/src/pages/MembersPage.tsx index 7785b68..a4051d5 100644 --- a/new-frontend/src/pages/MembersPage.tsx +++ b/new-frontend/src/pages/MembersPage.tsx @@ -153,11 +153,12 @@ export const MembersPage: React.FC = () => { {/* Header */} - - + + Membros & Equipe - + + {activeOrg?.name || 'Workspace'} @@ -171,7 +172,7 @@ export const MembersPage: React.FC = () => { onClick={loadData} disabled={refreshing} title="Recarregar dados" - className="self-start sm:self-auto p-2 rounded-xl border border-border bg-surface text-muted hover:text-foreground hover:bg-surface-raised transition-colors disabled:opacity-50" + className="self-start sm:self-auto p-2.5 rounded-xl border border-border-soft bg-surface/90 backdrop-blur-md text-muted hover:text-foreground hover:bg-surface-raised transition-all shadow-panel disabled:opacity-50" > @@ -180,7 +181,7 @@ export const MembersPage: React.FC = () => { {/* Feedback Alert */} {feedbackMsg && ( { )} {/* Tabs Switcher */} - + setActiveTab('members')} className={`flex items-center gap-2 px-4 py-2.5 rounded-xl text-xs font-semibold transition-all whitespace-nowrap ${ activeTab === 'members' - ? 'bg-brand text-white shadow-xs' - : 'text-muted hover:text-foreground hover:bg-surface-raised' + ? 'bg-brand text-white shadow-md shadow-brand/20' + : 'text-muted hover:text-foreground hover:bg-surface-raised/80' }`} > Membros Ativos - + {members.length} @@ -228,14 +229,14 @@ export const MembersPage: React.FC = () => { onClick={() => setActiveTab('pending')} className={`flex items-center gap-2 px-4 py-2.5 rounded-xl text-xs font-semibold transition-all whitespace-nowrap ${ activeTab === 'pending' - ? 'bg-amber-600 text-white shadow-xs' - : 'text-muted hover:text-foreground hover:bg-surface-raised' + ? 'bg-amber-600 text-white shadow-md shadow-amber-600/20' + : 'text-muted hover:text-foreground hover:bg-surface-raised/80' }`} > Solicitações Pendentes {pendingRequests.length > 0 && ( - + {pendingRequests.length} )} @@ -247,8 +248,8 @@ export const MembersPage: React.FC = () => { onClick={() => setActiveTab('discover')} className={`flex items-center gap-2 px-4 py-2.5 rounded-xl text-xs font-semibold transition-all whitespace-nowrap ${ activeTab === 'discover' - ? 'bg-brand text-white shadow-xs' - : 'text-muted hover:text-foreground hover:bg-surface-raised' + ? 'bg-brand text-white shadow-md shadow-brand/20' + : 'text-muted hover:text-foreground hover:bg-surface-raised/80' }`} > @@ -260,15 +261,15 @@ export const MembersPage: React.FC = () => { {activeTab === 'members' && ( {/* Member Search Bar */} - + - + setMemberSearchTerm(e.target.value)} placeholder="Filtrar por nome ou e-mail..." - className="w-full pl-9 pr-3 py-2 rounded-xl border border-border bg-surface-raised text-xs text-foreground placeholder-muted/60 focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand" + className="w-full pl-9 pr-3.5 py-2 rounded-xl border border-border-soft bg-surface-raised/80 text-xs text-foreground placeholder-muted focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand transition-all" /> @@ -281,12 +282,12 @@ export const MembersPage: React.FC = () => { {[1, 2, 3].map((i) => ( ))} ) : filteredMembers.length === 0 ? ( - + Nenhum membro encontrado com este termo. @@ -297,7 +298,7 @@ export const MembersPage: React.FC = () => { return ( @@ -322,7 +323,7 @@ export const MembersPage: React.FC = () => { - + Ativo @@ -349,7 +350,7 @@ export const MembersPage: React.FC = () => { {pendingRequests.length === 0 ? ( - + Tudo limpo! Não há solicitações pendentes de aprovação no momento. @@ -359,7 +360,7 @@ export const MembersPage: React.FC = () => { {pendingRequests.map((req) => ( @@ -376,7 +377,7 @@ export const MembersPage: React.FC = () => { type="button" disabled={actionLoadingId === req.userId} onClick={() => handleReject(req.userId)} - className="p-2 rounded-xl border border-rose-500/30 text-rose-400 hover:bg-rose-500/15 transition-colors" + className="p-2.5 rounded-xl border border-rose-500/30 text-rose-400 hover:bg-rose-500/15 transition-colors" title="Rejeitar" > @@ -385,7 +386,7 @@ export const MembersPage: React.FC = () => { type="button" disabled={actionLoadingId === req.userId} onClick={() => handleApprove(req.userId)} - className="flex items-center gap-1.5 px-3 py-1.5 rounded-xl bg-brand text-white text-xs font-bold hover:bg-brand-hover shadow-xs transition-colors" + className="flex items-center gap-1.5 px-4 py-2 rounded-xl bg-brand text-white text-xs font-bold hover:bg-brand-hover shadow-md shadow-brand/20 transition-all" > {actionLoadingId === req.userId ? ( @@ -406,7 +407,7 @@ export const MembersPage: React.FC = () => { {activeTab === 'discover' && ( {/* Search other organizations */} - + @@ -423,19 +424,19 @@ export const MembersPage: React.FC = () => { - + setSearchOrgTerm(e.target.value)} placeholder="Digite o nome da organização (ex: BeeTech, Squad Core...)" - className="w-full pl-9 pr-3 py-2.5 rounded-xl border border-border bg-surface-raised text-xs text-foreground placeholder-muted/60 focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand" + className="w-full pl-9 pr-3.5 py-2.5 rounded-xl border border-border-soft bg-surface-raised/80 text-xs text-foreground placeholder-muted focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand transition-all" /> {searching ? : } Buscar @@ -444,7 +445,7 @@ export const MembersPage: React.FC = () => { {/* Results */} {searchResults.length > 0 && ( - + Resultados da Busca @@ -456,7 +457,7 @@ export const MembersPage: React.FC = () => { return ( {org.name} @@ -491,7 +492,7 @@ export const MembersPage: React.FC = () => { {/* Minhas solicitações enviadas */} - + Minhas Solicitações de Ingresso diff --git a/new-frontend/src/pages/OrganizationSettingsPage.tsx b/new-frontend/src/pages/OrganizationSettingsPage.tsx index 8a45f8d..17e47d7 100644 --- a/new-frontend/src/pages/OrganizationSettingsPage.tsx +++ b/new-frontend/src/pages/OrganizationSettingsPage.tsx @@ -29,11 +29,12 @@ export const OrganizationSettingsPage: React.FC = () => { {/* Header */} - - + + Configurações do Workspace - + + {activeOrg.name} @@ -43,8 +44,8 @@ export const OrganizationSettingsPage: React.FC = () => { {/* Main Settings Card */} - - + + {activeOrg.name.slice(0, 2).toUpperCase()} @@ -56,7 +57,7 @@ export const OrganizationSettingsPage: React.FC = () => { { {/* Workspace Details List */} - + Nome da Organização {activeOrg.name} - + Seu Perfil Conectado @@ -85,7 +86,7 @@ export const OrganizationSettingsPage: React.FC = () => { - + Permissões Ativas @@ -101,7 +102,7 @@ export const OrganizationSettingsPage: React.FC = () => { - + Status da Conexão @@ -121,7 +122,7 @@ export const OrganizationSettingsPage: React.FC = () => { navigate('/members')} - className="p-3.5 rounded-xl border border-border bg-surface-raised hover:border-brand transition-colors text-left flex items-center justify-between" + className="p-4 rounded-2xl border border-border-soft bg-surface-raised/80 hover:border-brand/40 hover:-translate-y-0.5 hover:shadow-md transition-all text-left flex items-center justify-between" > @@ -133,7 +134,7 @@ export const OrganizationSettingsPage: React.FC = () => { navigate('/projects')} - className="p-3.5 rounded-xl border border-border bg-surface-raised hover:border-brand transition-colors text-left flex items-center justify-between" + className="p-4 rounded-2xl border border-border-soft bg-surface-raised/80 hover:border-brand/40 hover:-translate-y-0.5 hover:shadow-md transition-all text-left flex items-center justify-between" > @@ -145,7 +146,7 @@ export const OrganizationSettingsPage: React.FC = () => { navigate('/organizations')} - className="p-3.5 rounded-xl border border-border bg-surface-raised hover:border-brand transition-colors text-left flex items-center justify-between" + className="p-4 rounded-2xl border border-border-soft bg-surface-raised/80 hover:border-brand/40 hover:-translate-y-0.5 hover:shadow-md transition-all text-left flex items-center justify-between" > @@ -157,7 +158,7 @@ export const OrganizationSettingsPage: React.FC = () => { {/* Security Note */} - + As alterações nos dados cadastrais da organização respeitam a política de isolamento multi-tenant do BeeTask. Apenas os usuários autenticados e aprovados têm acesso aos dados deste workspace. diff --git a/new-frontend/src/pages/ProfilePage.tsx b/new-frontend/src/pages/ProfilePage.tsx index bfe5b1e..e0e2e82 100644 --- a/new-frontend/src/pages/ProfilePage.tsx +++ b/new-frontend/src/pages/ProfilePage.tsx @@ -50,7 +50,7 @@ export const ProfilePage: React.FC = () => { {/* Header */} - + Meu Perfil & Conta @@ -59,8 +59,8 @@ export const ProfilePage: React.FC = () => { {/* Main Profile Info Card */} - - + + {user.photo ? ( @@ -87,7 +87,7 @@ export const ProfilePage: React.FC = () => { Encerrar Sessão @@ -100,13 +100,13 @@ export const ProfilePage: React.FC = () => { Meu Desempenho no Workspace Atual ({activeOrg?.name}) {loading ? ( - + Carregando estatísticas pessoais... ) : ( - + Tempo Registrado @@ -118,7 +118,7 @@ export const ProfilePage: React.FC = () => { - + Tarefas Concluídas @@ -130,7 +130,7 @@ export const ProfilePage: React.FC = () => { - + Workspace Ativo @@ -168,18 +168,18 @@ export const ProfilePage: React.FC = () => { setActiveOrg(org.id)} - className={`p-3.5 rounded-xl border cursor-pointer transition-all flex items-center justify-between gap-3 ${ + className={`p-4 rounded-2xl border cursor-pointer transition-all flex items-center justify-between gap-3 ${ isCurrent - ? 'border-brand bg-brand/5 ring-1 ring-brand/30' - : 'border-border bg-surface-raised hover:border-zinc-700' + ? 'border-brand bg-brand/10 ring-1 ring-brand/40 shadow-xs' + : 'border-border-soft bg-surface-raised/80 hover:border-brand/40 hover:-translate-y-0.5' }`} > {org.name.slice(0, 2).toUpperCase()} @@ -191,7 +191,7 @@ export const ProfilePage: React.FC = () => { {isCurrent && ( - + Ativo )} diff --git a/new-frontend/src/pages/ProjectsPage.tsx b/new-frontend/src/pages/ProjectsPage.tsx index ff935f0..03a656e 100644 --- a/new-frontend/src/pages/ProjectsPage.tsx +++ b/new-frontend/src/pages/ProjectsPage.tsx @@ -138,11 +138,12 @@ export const ProjectsPage: React.FC = () => { {/* Header */} - - + + Projetos - + + {activeOrg?.name || 'Workspace'} @@ -157,7 +158,7 @@ export const ProjectsPage: React.FC = () => { onClick={loadData} disabled={refreshing} title="Recarregar projetos" - className="p-2 rounded-xl border border-border bg-surface text-muted hover:text-foreground hover:bg-surface-raised transition-colors disabled:opacity-50" + className="p-2.5 rounded-xl border border-border-soft bg-surface/90 backdrop-blur-md text-muted hover:text-foreground hover:bg-surface-raised transition-all shadow-panel disabled:opacity-50" > @@ -165,7 +166,7 @@ export const ProjectsPage: React.FC = () => { setIsModalOpen(true)} - className="flex items-center gap-1.5 px-4 py-2 rounded-xl bg-brand text-white font-semibold text-xs hover:bg-brand-hover shadow-md shadow-brand/20 transition-all" + className="flex items-center gap-1.5 px-4 py-2.5 rounded-xl bg-brand text-white font-semibold text-xs hover:bg-brand-hover shadow-md shadow-brand/25 transition-all hover:-translate-y-0.5 active:translate-y-0" > Novo Projeto @@ -174,7 +175,7 @@ export const ProjectsPage: React.FC = () => { {error && ( - + {error} @@ -190,15 +191,15 @@ export const ProjectsPage: React.FC = () => { )} {/* Search Bar */} - + - + setSearchQuery(e.target.value)} placeholder="Buscar projeto por nome..." - className="w-full pl-9 pr-3 py-2 rounded-xl border border-border bg-surface-raised text-xs text-foreground placeholder-muted/60 focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand transition-all" + className="w-full pl-9 pr-3.5 py-2 rounded-xl border border-border-soft bg-surface-raised/80 text-xs text-foreground placeholder-muted focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand transition-all" /> @@ -208,11 +209,11 @@ export const ProjectsPage: React.FC = () => { {/* Grid of Projects */} {loading ? ( - + {[1, 2, 3].map((i) => ( @@ -221,7 +222,7 @@ export const ProjectsPage: React.FC = () => { ))} ) : filteredProjects.length === 0 ? ( - + @@ -236,7 +237,7 @@ export const ProjectsPage: React.FC = () => { setIsModalOpen(true)} - className="flex items-center gap-2 px-5 py-2.5 rounded-xl bg-brand text-white text-xs font-semibold hover:bg-brand-hover shadow-md shadow-brand/20 transition-all" + className="flex items-center gap-2 px-5 py-2.5 rounded-xl bg-brand text-white text-xs font-semibold hover:bg-brand-hover shadow-md shadow-brand/25 transition-all hover:-translate-y-0.5" > Criar Primeiro Projeto @@ -258,7 +259,7 @@ export const ProjectsPage: React.FC = () => { return ( {/* Top Bar with Icon & Color badge */} @@ -286,7 +287,7 @@ export const ProjectsPage: React.FC = () => { {/* Metrics Bar */} - + @@ -326,7 +327,7 @@ export const ProjectsPage: React.FC = () => { {/* Footer Link */} - + {stats.completedTasks} entregues diff --git a/new-frontend/src/pages/TasksPage.tsx b/new-frontend/src/pages/TasksPage.tsx index d8baa42..fa7bae3 100644 --- a/new-frontend/src/pages/TasksPage.tsx +++ b/new-frontend/src/pages/TasksPage.tsx @@ -199,11 +199,12 @@ export const TasksPage: React.FC = () => { {/* Page Header */} - - + + Quadro de Tarefas - + + {activeOrg?.name || 'Workspace'} @@ -220,19 +221,19 @@ export const TasksPage: React.FC = () => { onClick={loadData} disabled={refreshing} title="Recarregar tarefas" - className="p-2 rounded-xl border border-border bg-surface text-muted hover:text-foreground hover:bg-surface-raised transition-colors disabled:opacity-50" + className="p-2.5 rounded-xl border border-border-soft bg-surface/90 backdrop-blur-md text-muted hover:text-foreground hover:bg-surface-raised transition-all shadow-panel disabled:opacity-50" > {/* Kanban / List Toggle */} - + setViewMode('kanban')} - className={`flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-semibold transition-all ${ + className={`flex items-center gap-1.5 px-3.5 py-1.5 rounded-lg text-xs font-semibold transition-all ${ viewMode === 'kanban' - ? 'bg-brand text-white shadow-xs' + ? 'bg-brand text-white shadow-md shadow-brand/20' : 'text-muted hover:text-foreground' }`} > @@ -242,9 +243,9 @@ export const TasksPage: React.FC = () => { setViewMode('list')} - className={`flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-semibold transition-all ${ + className={`flex items-center gap-1.5 px-3.5 py-1.5 rounded-lg text-xs font-semibold transition-all ${ viewMode === 'list' - ? 'bg-brand text-white shadow-xs' + ? 'bg-brand text-white shadow-md shadow-brand/20' : 'text-muted hover:text-foreground' }`} > @@ -257,7 +258,7 @@ export const TasksPage: React.FC = () => { handleOpenCreateModal('NOT_STARTED')} - className="flex items-center gap-1.5 px-4 py-2 rounded-xl bg-brand text-white font-semibold text-xs hover:bg-brand-hover shadow-md shadow-brand/20 transition-all" + className="flex items-center gap-1.5 px-4 py-2.5 rounded-xl bg-brand text-white font-semibold text-xs hover:bg-brand-hover shadow-md shadow-brand/25 transition-all hover:-translate-y-0.5 active:translate-y-0" > Nova Tarefa @@ -267,7 +268,7 @@ export const TasksPage: React.FC = () => { {/* Error alert if any */} {actionError && ( - + {actionError} @@ -283,65 +284,65 @@ export const TasksPage: React.FC = () => { )} {/* Quick KPI Bar */} - - - + + + - Total de Tarefas - {tasks.length} + Total de Tarefas + {tasks.length} - - + + - Em Andamento - {inProgressCount} + Em Andamento + {inProgressCount} - - + + - A Fazer - {notStartedCount} + A Fazer + {notStartedCount} - - + + - Concluídas - {completedCount} + Concluídas + {completedCount} {/* Filter and Search Bar */} - + {/* Search Input */} - + setSearchQuery(e.target.value)} placeholder="Buscar por título, projeto, categoria..." - className="w-full pl-9 pr-3 py-2 rounded-xl border border-border bg-surface-raised text-xs text-foreground placeholder-muted/60 focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand transition-all" + className="w-full pl-9 pr-3.5 py-2 rounded-xl border border-border-soft bg-surface-raised/80 text-xs text-foreground placeholder-muted focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand transition-all" /> {searchQuery && ( setSearchQuery('')} - className="absolute right-2.5 top-1/2 -translate-y-1/2 text-muted hover:text-foreground text-xs" + className="absolute right-3 top-1/2 -translate-y-1/2 text-muted hover:text-foreground text-xs" > × @@ -354,10 +355,10 @@ export const TasksPage: React.FC = () => { setOnlyMyTasks(!onlyMyTasks)} - className={`flex items-center gap-1.5 px-3 py-1.5 rounded-xl text-xs font-medium border transition-colors ${ + className={`flex items-center gap-1.5 px-3.5 py-2 rounded-xl text-xs font-medium border transition-all ${ onlyMyTasks - ? 'bg-brand/15 text-brand border-brand/40 font-semibold' - : 'bg-surface-raised border-border text-muted hover:text-foreground' + ? 'bg-brand/15 text-brand border-brand/40 font-semibold shadow-xs' + : 'bg-surface-raised/80 border-border-soft text-muted hover:text-foreground' }`} > {onlyMyTasks ? : } @@ -374,7 +375,7 @@ export const TasksPage: React.FC = () => { e.target.value === 'ALL' ? 'ALL' : Number(e.target.value) ) } - className="pl-7 pr-3 py-1.5 rounded-xl border border-border bg-surface-raised text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-brand" + className="pl-7 pr-3.5 py-2 rounded-xl border border-border-soft bg-surface-raised/80 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-brand cursor-pointer" > Todos os Projetos {projects.map((p) => ( @@ -391,7 +392,7 @@ export const TasksPage: React.FC = () => { setSelectedStatus(e.target.value as TaskStatus | 'ALL')} - className="px-3 py-1.5 rounded-xl border border-border bg-surface-raised text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-brand" + className="px-3.5 py-2 rounded-xl border border-border-soft bg-surface-raised/80 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-brand cursor-pointer" > Todos os Status A Fazer
- Visão geral da sua produtividade, metas e atividades recentes no workspace. + +
+ Acompanhe o ritmo de entregas da sua equipe, audite suas horas e mantenha o foco na próxima entrega.
+
{stats.inProgress}
- {stats.notStarted} no backlog para iniciar +
+ {stats.notStarted} tarefas aguardando no backlog
{stats.completed}
- de {tasks.length} tarefas cadastradas +
+ de {tasks.length} demandas cadastradas
{formatSecondsToTimer(stats.totalSeconds)}
- {formatSecondsToHuman(stats.totalSeconds)} acumuladas +
+ {formatSecondsToHuman(stats.totalSeconds)} auditadas no time
{stats.projectsCount}
- Iniciativas no workspace +
+ Iniciativas ativas no workspace
Cronômetro em tempo real
{activeTask ? formatSecondsToTimer(activeSeconds) : '00:00:00'}
Nenhuma tarefa encontrada neste workspace.
Nenhum membro encontrado com este termo.
Não há solicitações pendentes de aprovação no momento.
Resultados da Busca
{org.name}
As alterações nos dados cadastrais da organização respeitam a política de isolamento multi-tenant do BeeTask. Apenas os usuários autenticados e aprovados têm acesso aos dados deste workspace. diff --git a/new-frontend/src/pages/ProfilePage.tsx b/new-frontend/src/pages/ProfilePage.tsx index bfe5b1e..e0e2e82 100644 --- a/new-frontend/src/pages/ProfilePage.tsx +++ b/new-frontend/src/pages/ProfilePage.tsx @@ -50,7 +50,7 @@ export const ProfilePage: React.FC = () => {
@@ -59,8 +59,8 @@ export const ProfilePage: React.FC = () => {
Total de Tarefas
{tasks.length}
Em Andamento
{inProgressCount}
A Fazer
{notStartedCount}
Concluídas
{completedCount}