+
{r.nome_motorista || 'Motorista padrão'}
-
+
Veículo: {formatTransporte(r.tipo_transporte)} | Peso:{' '}
-
+
{(r.peso_total_romaneio || 0).toLocaleString('pt-BR')} kg
@@ -880,7 +883,7 @@ export const SmartEmbarqueFlow: React.FC
= ({ obra, onVo
{/* Botões de Ação Direta no Card */}
-
+
@@ -915,7 +918,7 @@ export const SmartEmbarqueFlow: React.FC
= ({ obra, onVo
smartAudio.playClick();
setSubTela('menu');
}}
- className="w-full h-14 bg-slate-800 border-slate-700 text-slate-200 text-sm font-bold rounded-2xl mt-2 active:scale-98"
+ className="w-full h-14 bg-white dark:bg-slate-800 border-slate-300 dark:border-slate-700 text-slate-700 dark:text-slate-200 text-sm font-bold rounded-2xl mt-2 active:scale-98 shadow-sm"
>
⬅️ Voltar ao Menu
@@ -930,23 +933,23 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
return (
{/* Banner do Romaneio Ativo com Atalho para Conferência */}
-
+
-
+
CAMINHÃO ATIVO
-
+
{romaneioAtivo.numero_romaneio}
-
- Motorista:
{romaneioAtivo.nome_motorista} | Peso:{' '}
-
+
+ Motorista:
{romaneioAtivo.nome_motorista} | Peso:{' '}
+
{(romaneioAtivo.peso_total_romaneio || 0).toLocaleString('pt-BR')} kg
{itensRomaneio.length > 0 && (
-
+
({itensRomaneio.length} marcas na carga)
)}
@@ -960,7 +963,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
carregarItensDoRomaneio(romaneioAtivo.id);
setSubTela('conferencia_romaneio');
}}
- className="h-8 px-2.5 rounded-lg bg-amber-500/20 hover:bg-amber-500/30 border border-amber-500/40 text-amber-300 text-xs font-black flex items-center gap-1 active:scale-95"
+ className="h-8 px-2.5 rounded-lg bg-amber-100 hover:bg-amber-200 border border-amber-300 text-amber-900 dark:bg-amber-500/20 dark:hover:bg-amber-500/30 dark:border-amber-500/40 dark:text-amber-300 text-xs font-black flex items-center gap-1 active:scale-95 shadow-sm"
title="Abrir conferência do que já foi colocado no romaneio"
>
@@ -973,7 +976,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
setRomaneioAtivo(null);
setSubTela('menu');
}}
- className="text-xs font-bold text-slate-400 hover:text-slate-200 underline px-1 py-1"
+ className="text-xs font-bold text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-200 underline px-1 py-1"
>
Trocar
@@ -982,26 +985,26 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
{/* Modal/Seção de Quantidade para o Item Selecionado */}
{pecaEmbarque ? (
-
+
-
+
{pecaEmbarque.marca}
{pecaEmbarque.tem_componentes === false && (
-
+
S/M
)}
-
+
Saldo Disponível: {pecaEmbarque.saldoDisponivel} un
-
-
{qtdEmbarcar}
+
+ {qtdEmbarcar}
= ({ obra, onVo
smartAudio.playClick();
setQtdEmbarcar((p) => Math.min(pecaEmbarque.saldoDisponivel, p + 1));
}}
- className="h-12 px-3 rounded-xl bg-slate-700 font-bold text-white active:scale-95"
+ className="h-12 px-3 rounded-xl bg-slate-100 hover:bg-slate-200 text-slate-800 dark:bg-slate-700 dark:hover:bg-slate-600 dark:text-white font-bold active:scale-95 border border-slate-200 dark:border-transparent"
>
+1
@@ -1020,7 +1023,7 @@ export const SmartEmbarqueFlow: React.FC
= ({ obra, onVo
smartAudio.playClick();
setQtdEmbarcar((p) => Math.min(pecaEmbarque.saldoDisponivel, p + 2));
}}
- className="h-12 px-3 rounded-xl bg-slate-700 font-bold text-white active:scale-95"
+ className="h-12 px-3 rounded-xl bg-slate-100 hover:bg-slate-200 text-slate-800 dark:bg-slate-700 dark:hover:bg-slate-600 dark:text-white font-bold active:scale-95 border border-slate-200 dark:border-transparent"
>
+2
@@ -1030,7 +1033,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
smartAudio.playClick();
setQtdEmbarcar(pecaEmbarque.saldoDisponivel);
}}
- className="h-12 px-2.5 rounded-xl bg-blue-500/20 text-blue-300 font-black text-xs active:scale-95"
+ className="h-12 px-2.5 rounded-xl bg-blue-100 text-blue-800 hover:bg-blue-200 dark:bg-blue-500/20 dark:text-blue-300 font-black text-xs active:scale-95 border border-blue-200 dark:border-transparent"
>
TODAS
@@ -1042,7 +1045,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
type="button"
disabled={salvandoItem}
onClick={handleIncluirPeca}
- className="h-13 bg-blue-600 hover:bg-blue-500 text-white font-black rounded-xl text-xs uppercase"
+ className="h-13 bg-blue-600 hover:bg-blue-500 text-white font-black rounded-xl text-xs uppercase shadow-sm"
>
{salvandoItem ? 'Gravando...' : 'INCLUIR NO CAMINHÃO'}
@@ -1050,7 +1053,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
type="button"
variant="outline"
onClick={() => setPecaEmbarque(null)}
- className="h-13 bg-slate-700 text-slate-300 text-xs font-bold rounded-xl"
+ className="h-13 bg-slate-100 hover:bg-slate-200 text-slate-700 dark:bg-slate-700 dark:text-slate-300 text-xs font-bold rounded-xl border border-slate-200 dark:border-transparent"
>
Cancelar
@@ -1060,22 +1063,22 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
{/* Lista de Peças Prontas para Embarcar */}
-
+
Peças com Saldo para Embarque
{loadingPecas ? (
-
+
Carregando peças prontas...
) : pecasProntas.filter((p) => p.saldoDisponivel > 0).length === 0 ? (
-
-
-
+
+
+
Nenhuma peça com saldo de embarque
-
+
Todas as peças prontas já foram embarcadas em romaneios anteriores
@@ -1085,23 +1088,23 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
.map((p) => (
- {p.marca}
+ {p.marca}
{p.tem_componentes === false && (
-
+
S/M
)}
-
+
{p.etapa_fase || 'Estrutural'}
-
+
Saldo p/ Embarque:{' '}
- {p.saldoDisponivel} un
+ {p.saldoDisponivel} un
@@ -1113,7 +1116,7 @@ export const SmartEmbarqueFlow: React.FC
= ({ obra, onVo
setPecaEmbarque(p);
setQtdEmbarcar(1);
}}
- className="h-11 px-3.5 bg-blue-600 hover:bg-blue-500 text-white font-bold rounded-xl active:scale-95 text-xs uppercase shrink-0"
+ className="h-11 px-3.5 bg-blue-600 hover:bg-blue-500 text-white font-bold rounded-xl active:scale-95 text-xs uppercase shrink-0 shadow-sm"
>
Embarcar
@@ -1131,7 +1134,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
carregarItensDoRomaneio(romaneioAtivo.id);
setSubTela('conferencia_romaneio');
}}
- className="w-full h-15 bg-emerald-600 hover:bg-emerald-500 text-white text-sm font-black rounded-2xl shadow-lg uppercase active:scale-98 gap-2"
+ className="w-full h-15 bg-emerald-600 hover:bg-emerald-500 text-white text-sm font-black rounded-2xl shadow-md uppercase active:scale-98 gap-2"
>
CONFERIR & FINALIZAR ROMANEIO
@@ -1144,7 +1147,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
smartAudio.playClick();
setSubTela('menu');
}}
- className="w-full h-12 bg-slate-800 border-slate-700 text-slate-300 text-xs font-bold rounded-2xl"
+ className="w-full h-12 bg-white dark:bg-slate-800 border-slate-300 dark:border-slate-700 text-slate-700 dark:text-slate-300 text-xs font-bold rounded-2xl shadow-sm"
>
⬅️ Voltar ao Menu
@@ -1170,17 +1173,17 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
{/* Cabeçalho da Conferência */}
-
+
CONFERÊNCIA DE EMBARQUE
-
+
{romaneioAtivo.numero_romaneio}
-
+
OF {obra.of_number} — {obra.cliente || 'Industrial'}
-
+
{romaneioAtivo.status || 'Em conferência'}
@@ -1188,49 +1191,49 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
{/* KPIs em Grid Rápido */}
-
-
+
+
Marcas
-
+
{itensRomaneio.length}
-
-
+
+
Peças
-
+
{totalPecasCarregadas} un
-
-
+
+
Peso Carga
-
+
{pesoTotalCarregado.toLocaleString('pt-BR', { maximumFractionDigits: 1 })} kg
{/* Card de Dados do Transporte */}
-
+
- Motorista:
-
+ Motorista:
+
{romaneioAtivo.nome_motorista || 'Não informado'}
- Veículo:
-
+ Veículo:
+
{formatTransporte(romaneioAtivo.tipo_transporte)}
- Tipo de Frete:
-
+ Tipo de Frete:
+
{formatFrete(romaneioAtivo.frete_tipo)}
@@ -1238,29 +1241,29 @@ export const SmartEmbarqueFlow: React.FC
= ({ obra, onVo
{/* Lista de Peças Colocadas no Romaneio para Conferência */}
-
+
Peças Colocadas no Caminhão ({itensRomaneio.length})
- Toque na lixeira para estornar
+ Toque na lixeira para estornar
{loadingItensRomaneio ? (
-
+
Carregando itens do romaneio...
) : itensRomaneio.length === 0 ? (
-
-
-
+
+
+
Nenhuma peça colocada neste romaneio ainda
-
+
Adicione peças prontas no caminhão para gerar o romaneio
setSubTela('carregando_pecas')}
- className="h-11 px-4 bg-blue-600 hover:bg-blue-500 text-white font-black text-xs rounded-xl"
+ className="h-11 px-4 bg-blue-600 hover:bg-blue-500 text-white font-black text-xs rounded-xl shadow-sm"
>
+ Adicionar Peças ao Caminhão
@@ -1269,43 +1272,43 @@ export const SmartEmbarqueFlow: React.FC
= ({ obra, onVo
itensRomaneio.map((item, idx) => (
-
+
#{idx + 1}
-
+
{item.marca}
{(item.tem_componentes === false || pecasProntas.some(p => p.id === item.peca_id && p.tem_componentes === false)) && (
-
+
S/M
)}
-
+
{item.fase || '1'}
{item.descricao && (
-
+
{item.descricao}
)}
-
- Peso Total:
{item.peso_total.toFixed(1)} kg ({item.peso_unitario.toFixed(1)} kg/un)
+
+ Peso Total: {item.peso_total.toFixed(1)} kg ({item.peso_unitario.toFixed(1)} kg/un)
-
+
{item.quantidade_expedida}
- un
+ un
{/* Botão de Excluir / Estornar Item */}
@@ -1313,7 +1316,7 @@ export const SmartEmbarqueFlow: React.FC
= ({ obra, onVo
type="button"
disabled={removendoItemId === item.id}
onClick={() => handleRemoverItemRomaneio(item)}
- className="h-9 w-9 rounded-xl bg-rose-950/40 hover:bg-rose-900/60 border border-rose-800/50 text-rose-400 flex items-center justify-center active:scale-95 transition-all"
+ className="h-9 w-9 rounded-xl bg-rose-50 hover:bg-rose-100 border border-rose-200 text-rose-600 dark:bg-rose-950/40 dark:hover:bg-rose-900/60 dark:border-rose-800/50 dark:text-rose-400 flex items-center justify-center active:scale-95 transition-all shadow-sm"
title="Remover peça deste romaneio"
>
@@ -1325,13 +1328,13 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
{/* Botões de Ação na Base: Imprimir PDF, Compartilhar e Concluir */}
-
+
{/* Botão Principal: Imprimir / Baixar PDF Oficial */}
gerarRomaneioPDF('download')}
- className="w-full h-14 bg-amber-500 hover:bg-amber-400 text-slate-950 text-sm font-black rounded-2xl shadow-lg shadow-amber-950/30 uppercase active:scale-98 gap-2"
+ className="w-full h-14 bg-amber-500 hover:bg-amber-400 text-slate-950 text-sm font-black rounded-2xl shadow-md uppercase active:scale-98 gap-2"
>
{gerandoPDF ? 'Gerando Romaneio...' : 'BAIXAR / IMPRIMIR PDF DO ROMANEIO'}
@@ -1343,7 +1346,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
type="button"
disabled={itensRomaneio.length === 0}
onClick={() => gerarRomaneioPDF('whatsapp')}
- className="h-12 px-3 rounded-xl bg-emerald-600 hover:bg-emerald-500 text-white text-xs font-black flex items-center justify-center gap-1.5 active:scale-95 transition-all disabled:opacity-50"
+ className="h-12 px-3 rounded-xl bg-emerald-600 hover:bg-emerald-500 text-white text-xs font-black flex items-center justify-center gap-1.5 active:scale-95 transition-all disabled:opacity-50 shadow-sm"
>
Enviar WhatsApp
@@ -1355,9 +1358,9 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
smartAudio.playClick();
setSubTela('carregando_pecas');
}}
- className="h-12 px-3 rounded-xl bg-slate-800 hover:bg-slate-700 border border-slate-700 text-slate-200 text-xs font-bold flex items-center justify-center gap-1.5 active:scale-95 transition-all"
+ className="h-12 px-3 rounded-xl bg-white hover:bg-slate-100 border border-slate-200 text-slate-800 dark:bg-slate-800 dark:hover:bg-slate-700 dark:border-slate-700 dark:text-slate-200 text-xs font-bold flex items-center justify-center gap-1.5 active:scale-95 transition-all shadow-sm"
>
-
+
+ Adicionar Peças
@@ -1366,7 +1369,7 @@ export const SmartEmbarqueFlow: React.FC
= ({ obra, onVo
handleConcluirRomaneioOficial('Expedido')}
- className="w-full h-12 bg-blue-600 hover:bg-blue-500 text-white text-xs font-black rounded-xl uppercase active:scale-98 gap-1.5"
+ className="w-full h-12 bg-blue-600 hover:bg-blue-500 text-white text-xs font-black rounded-xl uppercase active:scale-98 gap-1.5 shadow-sm"
>
CONCLUIR & MARCAR COMO EXPEDIDO
@@ -1381,7 +1384,7 @@ export const SmartEmbarqueFlow: React.FC = ({ obra, onVo
setSubTela('menu');
setRomaneioAtivo(null);
}}
- className="w-full h-10 text-slate-400 hover:text-slate-200 text-xs font-bold"
+ className="w-full h-10 text-slate-500 hover:text-slate-800 dark:text-slate-400 dark:hover:text-slate-200 text-xs font-bold"
>
⬅️ Voltar ao Menu Principal
diff --git a/src/pages/smart/components/SmartHeader.tsx b/src/pages/smart/components/SmartHeader.tsx
index 616dc17..a62b6a7 100644
--- a/src/pages/smart/components/SmartHeader.tsx
+++ b/src/pages/smart/components/SmartHeader.tsx
@@ -1,7 +1,8 @@
import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
-import { Building2, Volume2, VolumeX, LogOut, ArrowLeft } from 'lucide-react';
+import { Building2, Volume2, VolumeX, LogOut, ArrowLeft, Sun, Moon } from 'lucide-react';
import { useAuth } from '@/hooks/useAuth';
+import { useTheme } from '@/hooks/useTheme';
import { smartAudio } from '@/utils/smartAudio';
import { Button } from '@/components/ui/button';
@@ -20,13 +21,27 @@ export const SmartHeader: React.FC = ({
}) => {
const navigate = useNavigate();
const { user, signOut } = useAuth();
+ const { theme, setTheme } = useTheme();
const [soundOn, setSoundOn] = useState(() => smartAudio.isSoundEnabled());
+ // Detecta se está efetivamente em modo escuro
+ const isDark =
+ theme === 'dark' ||
+ (theme === 'system' &&
+ typeof window !== 'undefined' &&
+ window.matchMedia('(prefers-color-scheme: dark)').matches);
+
const handleToggleSound = () => {
const novoEstado = smartAudio.toggleSound();
setSoundOn(novoEstado);
};
+ const handleToggleTheme = () => {
+ smartAudio.playClick();
+ const novoTema = isDark ? 'light' : 'dark';
+ setTheme(novoTema);
+ };
+
const handleVoltarAoModoCompleto = () => {
smartAudio.playClick();
try {
@@ -46,7 +61,7 @@ export const SmartHeader: React.FC = ({
};
return (
-