Skip to content

Commit c68c5e5

Browse files
committed
feat: add the news for the Team Section and the Cta refactor for the sistem and the footer
1 parent 6dc7974 commit c68c5e5

15 files changed

Lines changed: 326 additions & 45 deletions

frontend/index.html

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,37 @@
55
<!--C:\Users\benev\projetos\Node\vagas-full\frontend\src\assets\logo-painel-vagas.svg-->
66
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
77
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
8+
89
<script>
910
(function () {
10-
const storageKey = "jobs-theme-preference";
1111
const root = document.documentElement;
12+
13+
14+
const storedPreference =
15+
localStorage.getItem("jobs-theme-preference") ||
16+
localStorage.getItem("theme") ||
17+
localStorage.getItem("vite-ui-theme");
18+
1219
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
13-
const storedPreference = localStorage.getItem(storageKey);
20+
1421
const themePreference = storedPreference === "light" || storedPreference === "dark" || storedPreference === "system"
1522
? storedPreference
1623
: "system";
17-
const resolvedTheme = themePreference === "system" ? (prefersDark ? "dark" : "light") : themePreference;
1824

19-
root.classList.toggle("dark", resolvedTheme === "dark");
25+
const resolvedTheme = themePreference === "system"
26+
? (prefersDark ? "dark" : "light")
27+
: themePreference;
28+
29+
if (resolvedTheme === "dark") {
30+
root.classList.add("dark");
31+
} else {
32+
root.classList.remove("dark");
33+
}
34+
2035
root.setAttribute("data-theme", resolvedTheme);
2136
})();
2237
</script>
38+
2339
<title>Painel de Vagas</title>
2440
</head>
2541
<body>

frontend/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
"test:watch": "vitest --watch"
1414
},
1515
"dependencies": {
16+
"@lottiefiles/dotlottie-react": "^0.19.4",
1617
"class-variance-authority": "^0.7.1",
1718
"clsx": "^2.1.1",
1819
"framer-motion": "^12.40.0",
20+
"lottie-react": "^2.4.1",
1921
"lucide-react": "^0.577.0",
2022
"react": "^19.2.4",
2123
"react-dom": "^19.2.4",

frontend/src/App.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,30 @@
1+
import { useState, useEffect } from "react";
12
import { Route, Routes } from "react-router-dom";
23
import LandingPage from "./pages/LandingPage";
34
import Dashboard from "./pages/Dashboard";
5+
import NotFound from "./not_found";
6+
import Loading from "./Loading";
47

58
function App() {
9+
const [appCarregando, setAppCarregando] = useState(true);
10+
11+
useEffect(() => {
12+
const timer = setTimeout(() => {
13+
setAppCarregando(false);
14+
}, 2000);
15+
16+
return () => clearTimeout(timer);
17+
}, []);
18+
19+
if (appCarregando) {
20+
return <Loading />;
21+
}
22+
623
return (
724
<Routes>
825
<Route path="/" element={<LandingPage />} />
926
<Route path="/app" element={<Dashboard />} />
27+
<Route path="*" element={<NotFound />} />
1028
</Routes>
1129
);
1230
}

frontend/src/Loading.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { DotLottieReact } from "@lottiefiles/dotlottie-react";
2+
import loadingAnimation from "./assets/teste.json";
3+
4+
export default function Loading() {
5+
return (
6+
<div className="fixed inset-0 z-50 flex flex-col items-center justify-center bg-background px-6">
7+
<div className="w-64 h-64 flex items-center justify-center select-none pointer-events-none">
8+
<DotLottieReact
9+
data={loadingAnimation}
10+
loop
11+
autoplay
12+
className="w-full h-full object-contain"
13+
/>
14+
</div>
15+
<p className="mt-4 text-lg font-medium text-muted-foreground animate-pulse">
16+
Carregando...
17+
</p>
18+
</div>
19+
);
20+
}

frontend/src/assets/black.svg

Lines changed: 126 additions & 0 deletions
Loading

frontend/src/assets/loading.lottie

588 KB
Binary file not shown.

frontend/src/assets/lottie.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

frontend/src/assets/teste.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

frontend/src/components/landing/CTASection.tsx

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ArrowRight, Sparkles } from "lucide-react";
44

55
export function CTASection() {
66
return (
7-
<section className="relative py-24 md:py-32 åoverflow-hidden">
7+
<section id="status" className="relative py-24 md:py-32 åoverflow-hidden">
88
<div className="absolute inset-0 pointer-events-none">
99
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[400px] bg-emerald-500/10 blur-[150px] rounded-full" />
1010
<div className="absolute top-0 left-0 w-[400px] h-[400px] bg-emerald-900/20 blur-[120px] rounded-full" />
@@ -21,16 +21,6 @@ export function CTASection() {
2121
/>
2222

2323
<div className="relative z-10 max-w-4xl mx-auto px-6 text-center">
24-
<motion.div
25-
initial={{ opacity: 0, y: 30 }}
26-
whileInView={{ opacity: 1, y: 0 }}
27-
viewport={{ once: true }}
28-
transition={{ duration: 0.7 }}
29-
className="inline-flex items-center gap-2 bg-emerald-500/10 border border-emerald-500/20 text-emerald-400 text-sm font-medium px-4 py-2 rounded-full mb-8"
30-
>
31-
<Sparkles className="w-4 h-4" />
32-
Comece agora, é gratuito
33-
</motion.div>
3424

3525
<motion.h2
3626
initial={{ opacity: 0, y: 30 }}
@@ -67,14 +57,14 @@ export function CTASection() {
6757
>
6858
<Link
6959
to="/app"
70-
className="group inline-flex items-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-gray-950 font-semibold text-base py-4 px-10 rounded-full transition-all duration-300 shadow-lg shadow-emerald-500/25 hover:shadow-xl hover:shadow-emerald-400/30 hover:scale-[1.02]"
60+
className="group inline-flex items-center gap-2 bg-emerald-500 hover:bg-emerald-400 text-gray-950 font-semibold text-base py-4 px-10 rounded-full transition-all duration-300 hover:scale-[1.02]"
7161
>
7262
Acessar o Dashboard
7363
<ArrowRight className="w-4 h-4 transition-transform group-hover:translate-x-1" />
7464
</Link>
7565
<a
7666
href="#features"
77-
className="inline-flex items-center gap-2 text-gray-400 hover:text-black dark:hover:text-white font-medium text-base py-4 px-8 rounded-full border border-gray-800 hover:border-gray-600 transition-all duration-300"
67+
className="inline-flex items-center gap-2 text-gray-400 hover:text-black dark:hover:text-white font-medium text-base py-4 px-8 rounded-full border border-gray-800 hover:border-gray-600 dark:border-gray-400 transition-all duration-300"
7868
>
7969
Explorar funcionalidades
8070
</a>

frontend/src/components/landing/Footer.tsx

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,35 @@
1-
import { Github, Twitter, Linkedin } from "lucide-react";
1+
import { Github } from "lucide-react";
2+
import LogoWhite from "../../assets/logo-painel-vagas.svg";
3+
import LogoBlack from "../../assets/black.svg";
24

35
export function Footer() {
46
return (
57
<footer className="bg-neutral-50 dark:bg-transparent text-neutral-900 dark:text-white pt-16 pb-8 border-t border-gray-200 dark:border-white/10">
68
<div className="max-w-7xl mx-auto px-6 md:px-12">
79
<div className="grid grid-cols-1 md:grid-cols-4 gap-12 mb-16">
8-
{/* Brand Column */}
910
<div className="md:col-span-2">
11+
1012
<div className="flex items-center gap-3 mb-6">
11-
<div className="w-8 h-8 rounded-full bg-[#0c6b35] flex items-center justify-center">
12-
<span className="text-white font-bold text-lg leading-none mt-0.5">J</span>
13-
</div>
14-
<span className="text-gray-900 dark:text-white font-bold text-xl" style={{ fontFamily: "'Space Grotesk', sans-serif" }}>
15-
Jobs Scraper
16-
</span>
13+
<img
14+
src={LogoBlack}
15+
alt="Painel de Vagas"
16+
className="h-16 w-auto block dark:hidden"
17+
/>
18+
<img
19+
src={LogoWhite}
20+
alt="Painel de Vagas"
21+
className="h-16 w-auto hidden dark:block"
22+
/>
1723
</div>
24+
1825
<p className="text-gray-500 dark:text-gray-400 max-w-sm mb-8 leading-relaxed">
1926
Automatizando a busca por vagas de TI para desenvolvedores do mundo inteiro. Encontre o emprego ideal sem perder horas pesquisando.
2027
</p>
2128
<div className="flex items-center gap-4 text-gray-400 dark:text-gray-500">
22-
<a href="#" className="hover:text-emerald-500 dark:hover:text-emerald-400 transition-colors"><Twitter size={20} /></a>
2329
<a href="#" className="hover:text-emerald-500 dark:hover:text-emerald-400 transition-colors"><Github size={20} /></a>
24-
<a href="#" className="hover:text-emerald-500 dark:hover:text-emerald-400 transition-colors"><Linkedin size={20} /></a>
2530
</div>
2631
</div>
2732

28-
{/* Product Links */}
2933
<div>
3034
<h4 className="text-gray-900 dark:text-white font-semibold mb-6">Produto</h4>
3135
<ul className="space-y-4 text-gray-500 dark:text-gray-400">
@@ -36,7 +40,6 @@ export function Footer() {
3640
</ul>
3741
</div>
3842

39-
{/* Legal Links */}
4043
<div>
4144
<h4 className="text-gray-900 dark:text-white font-semibold mb-6">Legal</h4>
4245
<ul className="space-y-4 text-gray-500 dark:text-gray-400">
@@ -47,14 +50,10 @@ export function Footer() {
4750
</div>
4851
</div>
4952

50-
{/* Bottom Bar */}
5153
<div className="pt-8 border-t border-gray-200 dark:border-white/10 flex flex-col md:flex-row items-center justify-between gap-4 text-sm text-gray-400 dark:text-gray-500">
52-
<p>&copy; {new Date().getFullYear()} Jobs Scraper. Todos os direitos reservados.</p>
54+
<p>&copy; {new Date().getFullYear()} Painel de Vagas. Todos os direitos reservados.</p>
5355
<div className="flex gap-6">
54-
<span className="flex items-center gap-2">
55-
<span className="w-2 h-2 rounded-full bg-emerald-500" />
56-
Sistemas Operacionais
57-
</span>
56+
5857
</div>
5958
</div>
6059
</div>

0 commit comments

Comments
 (0)