Compare commits

..

No commits in common. "ccbd343127f675432e41dcace17f32b660524de2" and "80a4731cd0fdddcf9a08c23eeb1ba9650fbcc8eb" have entirely different histories.

5 changed files with 263 additions and 254 deletions

View File

@ -3,7 +3,6 @@ APP_ENV=local
APP_KEY= APP_KEY=
APP_DEBUG=true APP_DEBUG=true
APP_URL=http://localhost APP_URL=http://localhost
APP_TIMEZONE=America/Sao_Paulo
APP_LOCALE=en APP_LOCALE=en
APP_FALLBACK_LOCALE=en APP_FALLBACK_LOCALE=en
@ -43,7 +42,7 @@ SESSION_DOMAIN=null
BROADCAST_CONNECTION=log BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local FILESYSTEM_DISK=local
QUEUE_CONNECTION=redis QUEUE_CONNECTION=database
CACHE_STORE=database CACHE_STORE=database
# CACHE_PREFIX= # CACHE_PREFIX=

View File

@ -23,5 +23,11 @@ public function run(): void
'email' => 'admin@omniboard.com', 'email' => 'admin@omniboard.com',
'password' => bcrypt('password'), // A senha será 'password' 'password' => bcrypt('password'), // A senha será 'password'
]); ]);
User::factory()->create([
'name' => 'Test User',
'email' => 'test@example.com',
]);
$this->call([OmniBoardSeeder::class]);
} }
} }

View File

@ -1,53 +1,3 @@
@tailwind base; @tailwind base;
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
/* Animações para a página de welcome */
@keyframes float {
0% {
transform: translateY(0px);
}
50% {
transform: translateY(-15px);
}
100% {
transform: translateY(0px);
}
}
@keyframes slide-up {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-float {
animation: float 6s ease-in-out infinite;
}
.animate-slide-up {
animation: slide-up 0.8s ease-out forwards;
opacity: 0;
}
.delay-100 {
animation-delay: 0.1s;
}
.delay-200 {
animation-delay: 0.2s;
}
.delay-300 {
animation-delay: 0.3s;
}
/* Fim das animações */

View File

@ -10,13 +10,17 @@ const props = defineProps({
const page = usePage(); const page = usePage();
const userTenantId = page.props.auth.user.tenant_id; const userTenantId = page.props.auth.user.tenant_id;
// Variável para guardar a inscrição do canal
let channel = null; let channel = null;
onMounted(() => { onMounted(() => {
if (userTenantId) { if (userTenantId) {
// Verifica se o Echo já está carregado
if (window.Echo) { if (window.Echo) {
connectToChannel(); connectToChannel();
} else { } else {
// Se não, espera um pouco e tenta de novo (Fallback simples)
// Ou melhor: escuta o evento de carregamento, mas o setInterval é mais prático aqui
const checkEcho = setInterval(() => { const checkEcho = setInterval(() => {
if (window.Echo) { if (window.Echo) {
clearInterval(checkEcho); clearInterval(checkEcho);
@ -37,6 +41,7 @@ const connectToChannel = () => {
}) })
.error((err) => { .error((err) => {
console.error("❌ Erro de Conexão/Auth:", err); console.error("❌ Erro de Conexão/Auth:", err);
// Dica: Se o erro for detalhado, ele vai aparecer aqui.
}); });
}; };

View File

@ -1,7 +1,7 @@
<script setup> <script setup>
import { Head, Link } from '@inertiajs/vue3'; import { Head, Link } from '@inertiajs/vue3';
defineProps({ defineProps({
canLogin: { canLogin: {
type: Boolean, type: Boolean,
}, },
@ -16,19 +16,68 @@
type: String, type: String,
required: true, required: true,
}, },
}); });
</script> </script>
<template> <style>
/* Animações Suaves */
@keyframes float {
0% {
transform: translateY(0px);
}
50% {
transform: translateY(-15px);
}
100% {
transform: translateY(0px);
}
}
@keyframes slide-up {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-float {
animation: float 6s ease-in-out infinite;
}
.animate-slide-up {
animation: slide-up 0.8s ease-out forwards;
opacity: 0;
}
.delay-100 {
animation-delay: 0.1s;
}
.delay-200 {
animation-delay: 0.2s;
}
.delay-300 {
animation-delay: 0.3s;
}
</style>
<template>
<Head title="OmniBoard - Dashboard Inteligente" /> <Head title="OmniBoard - Dashboard Inteligente" />
<div <div
class="min-h-screen flex flex-col bg-gray-50 text-slate-800 selection:bg-blue-100 selection:text-blue-900 overflow-hidden relative font-sans"> class="min-h-screen bg-gray-50 text-slate-800 selection:bg-blue-100 selection:text-blue-900 overflow-hidden relative font-sans">
<div class="absolute top-0 left-0 w-full h-full overflow-hidden z-0 pointer-events-none"> <div class="absolute top-0 left-0 w-full h-full overflow-hidden z-0 pointer-events-none">
<div class="absolute -top-[10%] -right-[5%] w-[40%] h-[40%] bg-blue-200/40 rounded-full blur-[100px]"> <div class="absolute -top-[10%] -right-[5%] w-[40%] h-[40%] bg-blue-200/40 rounded-full blur-[100px]"></div>
</div>
<div class="absolute top-[30%] -left-[10%] w-[30%] h-[30%] bg-purple-200/40 rounded-full blur-[100px]"> <div class="absolute top-[30%] -left-[10%] w-[30%] h-[30%] bg-purple-200/40 rounded-full blur-[100px]">
</div> </div>
</div> </div>
@ -217,8 +266,8 @@
</div> </div>
</section> </section>
<footer class="relative z-10 mt-auto border-t border-gray-100 py-8 text-center text-slate-400 text-sm bg-white"> <footer class="relative z-10 border-t border-gray-100 py-8 text-center text-slate-400 text-sm bg-white">
<p>Ingline Systems &copy; 2025. Monitoramento Profissional.</p> <p>Ingline Systems &copy; 2025. Monitoramento Profissional.</p>
</footer> </footer>
</div> </div>
</template> </template>